pax_global_header00006660000000000000000000000064141430266150014514gustar00rootroot0000000000000052 comment=e1f329f22ae28ef9878e52ab6c90d53c9277e71e trace-cmd-v2.9.6/000077500000000000000000000000001414302661500135575ustar00rootroot00000000000000trace-cmd-v2.9.6/COPYING000066400000000000000000000004141414302661500146110ustar00rootroot00000000000000There are two main licenses that the tools in this directory are covered under. For the applications themselves, they are covered under GPL-2.0 (see LICENSES/GPL-2.0). As for the exported headers and libraries, they are covered under LPGL-2.1 (see LICENSES/LGPL-2.1). trace-cmd-v2.9.6/COPYING.LIB000066400000000000000000000636511414302661500152320ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. ^L Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. ^L GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. ^L Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. ^L 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. ^L 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. ^L 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. ^L 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS ^L How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! trace-cmd-v2.9.6/DCO000066400000000000000000000041041414302661500141060ustar00rootroot00000000000000 (Copied from the Linux Kernel's Documentation/process/submitting-patches.rst) Sign your work - the Developer's Certificate of Origin ------------------------------------------------------ The sign-off is a simple line at the end of the explanation for the patch, which certifies that you wrote it or otherwise have the right to pass it on as an open-source patch. The rules are pretty simple: if you can certify the below: Developer's Certificate of Origin 1.1 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ By making a contribution to this project, I certify that: (a) The contribution was created in whole or in part by me and I have the right to submit it under the open source license indicated in the file; or (b) The contribution is based upon previous work that, to the best of my knowledge, is covered under an appropriate open source license and I have the right under that license to submit that work with modifications, whether created in whole or in part by me, under the same open source license (unless I am permitted to submit under a different license), as indicated in the file; or (c) The contribution was provided directly to me by some other person who certified (a), (b) or (c) and I have not modified it. (d) I understand and agree that this project and the contribution are public and that a record of the contribution (including all personal information I submit with it, including my sign-off) is maintained indefinitely and may be redistributed consistent with this project or the open source license(s) involved. then you just add a line saying:: Signed-off-by: Random J Developer using your real name (sorry, no pseudonyms or anonymous contributions.) Some people also put extra tags at the end. They'll just be ignored for now, but you can do this to mark internal company procedures or just point out some special detail about the sign-off. trace-cmd-v2.9.6/Documentation/000077500000000000000000000000001414302661500163705ustar00rootroot00000000000000trace-cmd-v2.9.6/Documentation/Makefile000066400000000000000000000010511414302661500200250ustar00rootroot00000000000000# SPDX-License-Identifier: GPL-2.0 # Most likely a docbook.xsl is already installed on the users system # instead of creating a new wheel, lets reuse what's already there. # FIND_MANPAGE_DOCBOOK_XSL := $(shell find /usr -name docbook.xsl 2>/dev/null | grep manpages | head -1) MANPAGE_DOCBOOK_XSL ?= ${FIND_MANPAGE_DOCBOOK_XSL} doc_dir:=$(src)/Documentation export MANPAGE_DOCBOOK_XSL doc_dir SUBDIR += trace-cmd SUBDIR += libtracecmd .PHONY: $(SUBDIR) all: $(SUBDIR) clean: $(SUBDIR) install: $(SUBDIR) $(SUBDIR): make -C $@ $(MAKECMDGOALS) trace-cmd-v2.9.6/Documentation/README.PythonPlugin000066400000000000000000000067431414302661500217210ustar00rootroot00000000000000 PYTHON PLUGIN DOCUMENTATION ============================= With the python plugin (make python-plugin) you can now write plugins in python. The API exported by the python plugin itself (written in C) allows you to access most information about a record from python. To write a python plugin, put a new .py file into a new ~/.trace-cmd/python/ directory. The most basic python plugin is this: --- %< --- def register(pevent): pass --- >% --- which obviously does nothing at all. To register a callback, use the pevent.register_event_handler function: --- %< --- import tracecmd def my_event_handler(trace_seq, event): pass def register(pevent): pevent.register_event_handler("subsys", "event_name", my_event_handler) --- >% --- There are four object types that you get, described below. tracecmd.PEvent ----------------- This is the class of the 'pevent' object above, you get one of those via your register callback. It has one method and one property: * register_event_handler() - example above, to register an event handler function * file_endian - either '<' or '>' indicating which endianness the file has, to be used with struct.unpack() tracecmd.TraceSeq ------------------- This is the class of the 'trace_seq' parameter to your callback function. It has only one method, puts(), to put data into the buffer. Formatting must be done in python. tracecmd.Event ---------------------- This is the class of the 'event' parameter to your callback function. Note that it doesn't just contain the format, but also the event data. As such, you can do much with this, and this is what you'll usually use. Each instance of this allows access to record items via the dict protocol, and you can get the items via its keys() methods. So for example, your callback could be --- %< --- def my_callback(trace_seq, event): for fieldname in event.keys(): field = event[fieldname] --- >% --- Each field returned from the dict protocol is an instance of the next (and last) class: tracecmd.Field ---------------------- This is an instance of a field, including its data. It affords numerous use cases and is what you'll be using most. * If this is an integer field, i.e. 1, 2, 4 or 8 bytes long, you can convert it to the number contained, according to the file's endianness, by simply casting it to a long: field = event['myint'] value = long(field) * You can access the field's data, as field.data, and if the data is really a "__data_loc" type that will be resolved automatically. (If you don't know what this means, don't worry about it and just use field.data) This is it. It's pretty simple. A fully-featured plugin could look like this: --- %< --- def my_event_handler(trace_seq, event): trace_seq.puts("myev: %u", long(event['myfield'])) def register(pevent): pevent.register_event_handler("subsys", "event_name", my_event_handler) --- >% --- Tips and tricks ----------------- Be familiar with the struct module and use it, always checking endianness and potentially using pevent.file_endian. If you need access to pevent in your callbacks, simply pass it in yourself: --- %< --- def my_event_handler(pevent, trace_seq, event): pass def register(pevent): pevent.register_event_handler("subsys", "event_name", lambda *args: my_event_handler(pevent, *args) ) --- >% --- trace-cmd-v2.9.6/Documentation/libtracecmd/000077500000000000000000000000001414302661500206415ustar00rootroot00000000000000trace-cmd-v2.9.6/Documentation/libtracecmd/Makefile000066400000000000000000000114571414302661500223110ustar00rootroot00000000000000# SPDX-License-Identifier: GPL-2.0 # Include the utils include $(src)/scripts/utils.mk # This Makefile and manpage XSL files were taken from libtracefs # and modified for libtracecmd MAN3_TXT= \ $(wildcard libtracecmd-*.txt) \ libtracecmd.txt MAN_TXT = $(MAN3_TXT) _MAN_XML=$(patsubst %.txt,%.xml,$(MAN_TXT)) _MAN_HTML=$(patsubst %.txt,%.html,$(MAN_TXT)) _DOC_MAN3=$(patsubst %.txt,%.m,$(MAN3_TXT)) MAN_XML=$(addprefix $(OUTPUT),$(_MAN_XML)) MAN_HTML=$(addprefix $(OUTPUT),$(_MAN_HTML)) DOC_MAN3=$(addprefix $(OUTPUT),$(_DOC_MAN3)) # Make the path relative to DESTDIR, not prefix ifndef DESTDIR prefix?=$(HOME) endif bindir?=$(prefix)/bin htmldir?=$(prefix)/share/doc/libtracecmd-doc pdfdir?=$(prefix)/share/doc/libtracecmd-doc mandir?=$(prefix)/share/man man3dir=$(mandir)/man3 ASCIIDOC=asciidoc ASCIIDOC_EXTRA = --unsafe -f asciidoc.conf ASCIIDOC_HTML = xhtml11 MANPAGE_XSL = manpage-normal.xsl XMLTO_EXTRA = INSTALL?=install RM ?= rm -f ifdef USE_ASCIIDOCTOR ASCIIDOC = asciidoctor ASCIIDOC_EXTRA = -a compat-mode ASCIIDOC_EXTRA += -I. -rasciidoctor-extensions ASCIIDOC_EXTRA += -a mansource="libtracecmd" -a manmanual="libtracecmd Manual" ASCIIDOC_HTML = xhtml5 endif ASCIIDOC_INSTALLED := $(shell command -v $(ASCIIDOC) 2> /dev/null) ifndef ASCIIDOC_INSTALLED missing_tools += $(ASCIIDOC) endif XMLTO=xmlto XMLTO_INSTALLED := $(shell command -v $(XMLTO) 2> /dev/null) ifndef XMLTO_INSTALLED missing_tools += $(XMLTO) endif # # For asciidoc ... # -7.1.2, no extra settings are needed. # 8.0-, set ASCIIDOC8. # # # For docbook-xsl ... # -1.68.1, set ASCIIDOC_NO_ROFF? (based on changelog from 1.73.0) # 1.69.0, no extra settings are needed? # 1.69.1-1.71.0, set DOCBOOK_SUPPRESS_SP? # 1.71.1, no extra settings are needed? # 1.72.0, set DOCBOOK_XSL_172. # 1.73.0-, set ASCIIDOC_NO_ROFF # # # If you had been using DOCBOOK_XSL_172 in an attempt to get rid # of 'the ".ft C" problem' in your generated manpages, and you # instead ended up with weird characters around callouts, try # using ASCIIDOC_NO_ROFF instead (it works fine with ASCIIDOC8). # ifdef ASCIIDOC8 ASCIIDOC_EXTRA += -a asciidoc7compatible endif ifdef DOCBOOK_XSL_172 ASCIIDOC_EXTRA += -a libtracecmd-asciidoc-no-roff MANPAGE_XSL = manpage-1.72.xsl else ifdef ASCIIDOC_NO_ROFF # docbook-xsl after 1.72 needs the regular XSL, but will not # pass-thru raw roff codes from asciidoc.conf, so turn them off. ASCIIDOC_EXTRA += -a libtracecmd-asciidoc-no-roff endif endif ifdef MAN_BOLD_LITERAL XMLTO_EXTRA += -m manpage-bold-literal.xsl endif ifdef DOCBOOK_SUPPRESS_SP XMLTO_EXTRA += -m manpage-suppress-sp.xsl endif ifneq ($(findstring $(MAKEFLAGS),w),w) PRINT_DIR = --no-print-directory else # "make -w" NO_SUBDIR = : endif ifneq ($(findstring $(MAKEFLAGS),s),s) ifneq ($(V),1) QUIET_ASCIIDOC = @echo ' ASCIIDOC '$@; QUIET_XMLTO = @echo ' XMLTO '$@; QUIET_SUBDIR0 = +@subdir= QUIET_SUBDIR1 = ;$(NO_SUBDIR) \ echo ' SUBDIR ' $$subdir; \ $(MAKE) $(PRINT_DIR) -C $$subdir export V endif endif all: check-man-tools html man man: man3 man3: $(DOC_MAN3) html: $(MAN_HTML) $(MAN_HTML) $(DOC_MAN3): asciidoc.conf install: check-man-tools install-man install-html check-man-tools: ifdef missing_tools $(error "You need to install $(missing_tools) for man pages") endif install-%.3: $(OUTPUT)%.3 $(Q)$(call do_install_docs,$<,$(man3dir),644); do-install-man: man $(addprefix install-,$(wildcard $(OUTPUT)*.3)) install-man: man $(Q)$(MAKE) -C . do-install-man install-%.txt: $(OUTPUT)%.html $(Q)$(call do_install_docs,$<,$(htmldir),644); do-install-html: html $(addprefix install-,$(wildcard *.txt)) install-html: html do-install-html uninstall: uninstall-man uninstall-html uninstall-man: $(Q)$(RM) $(addprefix $(DESTDIR)$(man3dir)/,$(DOC_MAN3)) uninstall-html: $(Q)$(RM) $(addprefix $(DESTDIR)$(htmldir)/,$(MAN_HTML)) ifdef missing_tools DO_INSTALL_MAN = $(warning Please install $(missing_tools) to have the man pages installed) else DO_INSTALL_MAN = do-install-man endif CLEAN_FILES = \ $(MAN_XML) $(addsuffix +,$(MAN_XML)) \ $(MAN_HTML) $(addsuffix +,$(MAN_HTML)) \ $(DOC_MAN3) *.3 *.m clean: $(Q) $(RM) $(CLEAN_FILES) ifdef USE_ASCIIDOCTOR $(OUTPUT)%.m : $(OUTPUT)%.txt $(QUIET_ASCIIDOC)$(RM) $@+ $@ && \ $(ASCIIDOC) -b manpage -d manpage \ $(ASCIIDOC_EXTRA) -alibtracecmd_version=$(TRACEFS_VERSION) -o $@+ $< && \ mv $@+ $@ endif $(OUTPUT)%.m : $(OUTPUT)%.xml $(QUIET_XMLTO)$(RM) $@ && \ $(XMLTO) -o $(OUTPUT). -m $(MANPAGE_XSL) $(XMLTO_EXTRA) man $<; \ touch $@ $(OUTPUT)%.xml : %.txt $(QUIET_ASCIIDOC)$(RM) $@+ $@ && \ $(ASCIIDOC) -b docbook -d manpage \ $(ASCIIDOC_EXTRA) -alibtracecmd_version=$(TRACEFS_VERSION) -o $@+ $< && \ mv $@+ $@ $(MAN_HTML): $(OUTPUT)%.html : %.txt $(QUIET_ASCIIDOC)$(RM) $@+ $@ && \ $(ASCIIDOC) -b $(ASCIIDOC_HTML) -d manpage \ $(ASCIIDOC_EXTRA) -alibtracecmd_version=$(TRACEFS_VERSION) -o $@+ $< && \ mv $@+ $@ trace-cmd-v2.9.6/Documentation/libtracecmd/asciidoc.conf000066400000000000000000000061741414302661500232760ustar00rootroot00000000000000## linktep: macro # # Usage: linktep:command[manpage-section] # # Note, {0} is the manpage section, while {target} is the command. # # Show TEP link as: (
); if section is defined, else just show # the command. [macros] (?su)[\\]?(?Plinktep):(?P\S*?)\[(?P.*?)\]= [attributes] asterisk=* plus=+ caret=^ startsb=[ endsb=] tilde=~ ifdef::backend-docbook[] [linktep-inlinemacro] {0%{target}} {0#} {0#{target}{0}} {0#} endif::backend-docbook[] ifdef::backend-docbook[] ifndef::tep-asciidoc-no-roff[] # "unbreak" docbook-xsl v1.68 for manpages. v1.69 works with or without this. # v1.72 breaks with this because it replaces dots not in roff requests. [listingblock] {title} ifdef::doctype-manpage[] .ft C endif::doctype-manpage[] | ifdef::doctype-manpage[] .ft endif::doctype-manpage[] {title#} endif::tep-asciidoc-no-roff[] ifdef::tep-asciidoc-no-roff[] ifdef::doctype-manpage[] # The following two small workarounds insert a simple paragraph after screen [listingblock] {title} | {title#} [verseblock] {title} {title%} {title#} | {title#} {title%} endif::doctype-manpage[] endif::tep-asciidoc-no-roff[] endif::backend-docbook[] ifdef::doctype-manpage[] ifdef::backend-docbook[] [header] template::[header-declarations] {mantitle} {manvolnum} libtracefs {libtracefs_version} libtracefs Manual {manname1} {manname2} {manname3} {manname4} {manname5} {manname6} {manname7} {manname8} {manname9} {manname10} {manname11} {manname12} {manname13} {manname14} {manname15} {manname16} {manname17} {manname18} {manname19} {manname20} {manname21} {manname22} {manname23} {manname24} {manname25} {manname26} {manname27} {manname28} {manname29} {manname30} {manpurpose} endif::backend-docbook[] endif::doctype-manpage[] ifdef::backend-xhtml11[] [linktep-inlinemacro] {target}{0?({0})} endif::backend-xhtml11[] trace-cmd-v2.9.6/Documentation/libtracecmd/libtracecmd-files.txt000066400000000000000000000123341414302661500247560ustar00rootroot00000000000000libtracecmd(3) ============= NAME ---- tracecmd_open, tracecmd_open_fd, tracecmd_open_head, tracecmd_init_data, tracecmd_close - Open and close a trace file. SYNOPSIS -------- [verse] -- *#include * struct tracecmd_input pass:[*]*tracecmd_open*(const char pass:[*]_file_, int _flags_); struct tracecmd_input pass:[*]*tracecmd_open_fd*(int _fd_, int _flags_); struct tracecmd_input pass:[*]*tracecmd_open_head*(const char pass:[*]_file_, int _flags_); int *tracecmd_init_data*(struct tracecmd_input pass:[*]_handle_); void *tracecmd_close*(struct tracecmd_input pass:[*]_handle_); -- DESCRIPTION ----------- This set of APIs can be used to open and close a trace file recorded by _trace-cmd(1)_ and containing tracing information from ftrace, the official Linux kernel tracer. The opened file is represented by a _tracecmd_input_ structure, all other library APIs that work with the file require a pointer to the structure. The APIs for opening a trace file have a _flag_ input parameter, which controls how the file will be opened and parsed. The _flag_ is a combination of these options: TRACECMD_FL_LOAD_NO_PLUGINS - Do not load any plugins TRACECMD_FL_LOAD_NO_SYSTEM_PLUGINS - Do not load system wide plugins, load only "local only" plugins from user's home directory. The _tracecmd_open()_ function opens a given trace _file_, parses the metadata headers from the file, allocates and initializes а _tracecmd_input_ handler structure representing the file. It also initializes the handler for reading trace data from the file. The returned handler is ready to be used with _tracecmd_read__ APIs. The _tracecmd_open_fd()_ function does the same as _tracecmd_open()_, but works with a file descriptor to a trace file, opened for reading. The _tracecmd_open_head()_ function is the same as _tracecmd_open()_, but does not initialize the handler for reading trace data. It reads and parses the metadata headers only. The _tracecmd_init_data()_ should be used before using the _tracecmd_read__ APIs. The _tracecmd_init_data()_ function initializes a _handle_, allocated with _tracecmd_open_head()_, for reading trace data from the file associated with it. This API must be called before any of the _tracecmd_read__ APIs. The _tracecmd_close()_ function frees a _handle_, pointer to tracecmd_input structure, previously allocated with _tracecmd_open()_, _tracecmd_open_fd()_ or _tracecmd_open_head()_ APIs. RETURN VALUE ------------ The _tracecmd_open()_, _tracecmd_open_fd()_ and _tracecmd_open_head()_ functions return a pointer to tracecmd_input structure or NULL in case of an error. The returned structure must be free with _tracecmd_close()_. Note that if _tracecmd_open_fd()_ is used to allocate a tracecmd_input handler, when _tracecmd_close()_ is called to close it, that fd will be closed also. The _tracecmd_init_data()_ function returns -1 in case of an error or 0 otherwise. EXAMPLE ------- [source,c] -- The are two different use patterns for opening and reading trace data from a trace file, which can be used depending on the use case. 1. Open and initialise the trace file in а single step: #include ... struct tracecmd_input *handle = tracecmd_open("trace.dat"); if (!handle) { /* Failed to open trace.dat file */ } ... /* Read tracing data from the file, using the handle */ ... tracecmd_close(handle); ... int fd; fd = = open("trace.dat", O_RDONLY); if (fd < 0) { /* Failed to open trace file for reading */ } handle = tracecmd_open_fd(fd); if (!handle) { close(fd); /* Failed to initialise handler for reading the trace file */ } ... /* Read tracing data from the file, using the handle */ ... tracecmd_close(handle); ... 2. Open and initialise the trace file in two steps. This allows to perform some processing based on metadata, read from the file, before initialising the trace data for reading. Example for such use case is when opening multiple trace files recorded in a same trace session. In that case timestamps of all trace events must be adjusted based on the information from the file's metadata and before reading the trace data. #include ... struct tracecmd_input *handle = tracecmd_open_head("trace.dat"); if (!handle) { /* Failed to open trace.dat file */ } ... /* do some processing, before initialising the trace data for reading */ ... if (tracecmd_init_data(handle) < 0) { /* Failed to initialize hadle for reading the trace data */ } ... /* Read tracing data from the file, using the handle */ ... tracecmd_close(handle); ... -- FILES ----- [verse] -- *trace-cmd.h* Header file to include in order to have access to the library APIs. *-ltracecmd* Linker switch to add when building a program that uses the library. -- SEE ALSO -------- _libtracefs(3)_, _libtraceevent(3)_, _trace-cmd(1)_ _trace-cmd.dat(5)_ AUTHOR ------ [verse] -- *Steven Rostedt* *Tzvetomir Stoyanov* -- REPORTING BUGS -------------- Report bugs to LICENSE ------- libtracecmd is Free Software licensed under the GNU LGPL 2.1 RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2020 VMware, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/libtracecmd/libtracecmd-instances.txt000066400000000000000000000065741414302661500256540ustar00rootroot00000000000000libtracecmd(3) ============= NAME ---- tracecmd_buffer_instances, tracecmd_buffer_instance_name, tracecmd_buffer_instance_handle - Read tracing instances from a trace file. SYNOPSIS -------- [verse] -- *#include * int *tracecmd_buffer_instances*(struct tracecmd_input pass:[*]_handle_); const char pass:[*]*tracecmd_buffer_instance_name*(struct tracecmd_input pass:[*]_handle_, int _indx_); struct tracecmd_input pass:[*]*tracecmd_buffer_instance_handle*(struct tracecmd_input pass:[*]_handle_, int _indx_); -- DESCRIPTION ----------- This set of APIs can be used to get information and read tracing data from tracing instances stored in a trace file. The _tracecmd_buffer_instances()_ function gets the number of tracing instances recorded in a trace file. The top instance is not counted. The _handle_ is a tracecmd_input handler returned by _tracecmd_open_head()_. The _tracecmd_buffer_instance_name()_ function gets the name of the tracing instance with given index _indx_, recorded in a trace file. The _indx_ is a number in the interval [0 .. count-1], where count is the number returned by _tracecmd_buffer_instances()_. The _handle_ is a tracecmd_input handler returned by _tracecmd_open_head()_. The _tracecmd_buffer_instance_handle()_ allocates and initializes a tracecmd_input handle, associated with trace instance with index _indx_ from a trace file. The _handle_ is a tracecmd_input handler returned by _tracecmd_open_head()_. The _indx_ is a number in the interval [0 .. count-1], where count is the number returned by _tracecmd_buffer_instances()_. RETURN VALUE ------------ The _tracecmd_buffer_instances()_ function returns the number of tracing instances recorded in a trace file. The _tracecmd_buffer_instance_name()_ function returns a string, the name of a tracing instance, or NULL in case of an error The string must *not* be freed. The _tracecmd_buffer_instance_handle()_ function returns a pointer to newly allocated tracecmd_input handler or NULL in case if an error. The returned handler must be closed by _tracecmd_close()(3)_ EXAMPLE ------- [source,c] -- #include ... struct tracecmd_input *handle = tracecmd_open_head("trace.dat"); if (!handle) { /* Failed to open trace.dat file */ } ... int num = tracecmd_buffer_instances(handle); while(num) { struct tracecmd_input *h; char *name; name = tracecmd_buffer_instance_name(handle, num); if (!name) { /* Failed to get name of instance num */ } h = tracecmd_buffer_instance_handle(handle, num); if (!h) { /* Failed to initialize handler for instance num */ } ... tracecmd_close(h); num--; } ... tracecmd_close(handle); -- FILES ----- [verse] -- *trace-cmd.h* Header file to include in order to have access to the library APIs. *-ltracecmd* Linker switch to add when building a program that uses the library. -- SEE ALSO -------- _libtracefs(3)_, _libtraceevent(3)_, _trace-cmd(1)_ _trace-cmd.dat(5)_ AUTHOR ------ [verse] -- *Steven Rostedt* *Tzvetomir Stoyanov* -- REPORTING BUGS -------------- Report bugs to LICENSE ------- libtracecmd is Free Software licensed under the GNU LGPL 2.1 RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2020 VMware, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/libtracecmd/libtracecmd-peer.txt000066400000000000000000000104751414302661500246130ustar00rootroot00000000000000libtracecmd(3) ============= NAME ---- tracecmd_get_traceid, tracecmd_get_guest_cpumap - Manage trace session with multiple trace peers, recorded in multiple trace files. SYNOPSIS -------- [verse] -- *#include * unsigned long long *tracecmd_get_traceid*(struct tracecmd_input pass:[*]_handle_); int *tracecmd_get_guest_cpumap*(struct tracecmd_input pass:[*]_handle_, unsigned long long _trace_id_, const char pass:[*]pass:[*]_name_, int pass:[*]_vcpu_count_, const int pass:[*]pass:[*]_cpu_pid_); -- DESCRIPTION ----------- This set of APIs can be used to manage a trace session with multiple trace peers, for example, tracing both a host and one or more guest virtual machines. The trace data of each peer from the session is recorded in separate trace files. Information about peers from the session is stored in the metadata of each trace file. These APIs use that information to extract and synchronize the trace data. The _tracecmd_get_traceid()_ function returns the trace ID stored in the trace file metadata associated with _handle_. Each peer from a trace session has an ID unique for that peer and that trace session only. This ID is used to match multiple trace files recorded in a same trace session. The _tracecmd_get_guest_cpumap()_ function gets the mapping of guest virtual CPUs (VCPU) to the host process that represents those VCPUs and is stored in the metadata of the trace file associated with _handle_. This information is gathered during a host-guest trace session and is stored in the host trace file. The _trace_id_ parameter is the trace ID of the guest in this particular trace session. If a guest with that ID was part of that session, its VCPU to host process mapping is in the host trace file and the information is returned in _name_, _vcpu_count_ and _cpu_pid_ parameters. The _name_ parameter contains the name of the guest, the _vcpu_count_ contains the count of VCPUs of that guest and the _cpu_pid_ array contains the VCPU to host process mapping. The array is of size _vcpu_count_ where the index is VCPU and the value is the process ID (PID) of the host process, running that VCPU. The _name_, _vcpu_count_ and _cpu_pid_ values must *not* be freed. RETURN VALUE ------------ The _tracecmd_get_traceid()_ function returns a 64 bit trace ID. The _tracecmd_get_guest_cpumap()_ function returns -1 in case of an error or 0 otherwise. If 0 is returned, then the _name_, _vcpu_count_ and _cpu_pid_ parameters contain the requested information. EXAMPLE ------- [source,c] -- #include ... struct tracecmd_input *host = tracecmd_open("trace.dat"); if (!host) { /* Failed to open host trace file */ } struct tracecmd_input *guest1 = tracecmd_open_head("trace-Guest1.dat"); if (!guest1) { /* Failed to open guest1 trace file */ } struct tracecmd_input *guest2 = tracecmd_open_head("trace-Guest2.dat"); if (!guest2) { /* Failed to open guest2 trace file */ } unsigned long long guest_id_1 = tracecmd_get_traceid(guest1); unsigned long long guest_id_2 = tracecmd_get_traceid(guest2); int *cpu_pid_1, *cpu_pid_2; int vcount_1, vcount_2; char *name_1, *name_2; if (!tracecmd_get_guest_cpumap(host, guest_id_1, &name_1, &vcount_1, &cpu_pid_1)) { /* The Host and a guest1 with name_1 are part of the same trace session. * Got guest1 VCPU to host PID mapping. */ } if (!tracecmd_get_guest_cpumap(host, guest_id_2, &name_2, &vcount_2, &cpu_pid_2)) { /* The Host and a guest2 with name_2 are part of the same trace session. * Got guest2 VCPU to host PID mapping. */ } ... tracecmd_close(guest1); tracecmd_close(guest2); tracecmd_close(handle); -- FILES ----- [verse] -- *trace-cmd.h* Header file to include in order to have access to the library APIs. *-ltracecmd* Linker switch to add when building a program that uses the library. -- SEE ALSO -------- _libtracefs(3)_, _libtraceevent(3)_, _trace-cmd(1)_ _trace-cmd.dat(5)_ AUTHOR ------ [verse] -- *Steven Rostedt* *Tzvetomir Stoyanov* -- REPORTING BUGS -------------- Report bugs to LICENSE ------- libtracecmd is Free Software licensed under the GNU LGPL 2.1 RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2020 VMware, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/libtracecmd/libtracecmd-record.txt000066400000000000000000000074011414302661500251310ustar00rootroot00000000000000libtracecmd(3) ============= NAME ---- tracecmd_read_cpu_first, tracecmd_read_data, tracecmd_read_at, tracecmd_free_record, tracecmd_get_tep - Read recorded events from a trace file. SYNOPSIS -------- [verse] -- *#include * struct tep_record pass:[*]*tracecmd_read_cpu_first*(struct tracecmd_input pass:[*]_handle_, int _cpu_); struct tep_record pass:[*]*tracecmd_read_data*(struct tracecmd_input pass:[*]_handle_, int _cpu_); struct tep_record pass:[*]*tracecmd_read_at*(struct tracecmd_input pass:[*]_handle_, unsigned long long _offset_, int pass:[*]_cpu_); void *tracecmd_free_record*(struct tep_record pass:[*]_record_); struct tep_handle pass:[*]*tracecmd_get_tep*(struct tracecmd_input pass:[*]_handle_); -- DESCRIPTION ----------- This set of APIs can be used to read tracing data from a trace file opened with _tracecmd_open()(3)_, _tracecmd_open_fd()(3)_ or _tracecmd_open_head()(3)_. The _tracecmd_read_cpu_first()_ function reads the first trace record for a given _cpu_ from a trace file associated with _handle_. The returned record must be freed with _tracecmd_free_record()_. The _tracecmd_read_data()_ function reads the next trace record for a given _cpu_ from a trace file associated with _handle_ and increments the read location pointer, so that the next call to _tracecmd_read_data()_ will not read the same record again. The returned record must be freed with _tracecmd_free_record()_. The _tracecmd_read_at()_ function reads a trace record from a specific _offset_ within the file associated with _handle_. The CPU on which the recorded event occurred is stored in the _cpu_. The function does not change the current read location pointer. The returned record must be freed with _tracecmd_free_record()_. The _tracecmd_free_record()_ function frees a _record_ returned by any of the _tracecmd_read__ APIs. The _tracecmd_get_tep()_ function returns a tep context for a given _handle_. RETURN VALUE ------------ The _tracecmd_read_cpu_first()_, _tracecmd_read_data()_ and _tracecmd_read_at()_ functions return a pointer to struct tep_record or NULL in case of an error.The returned record must be freed with _tracecmd_free_record()_. The _tracecmd_get_tep()_ function returns a pointer to tep context or NULL if there is no tep context for the given _handle_. The returned tep pointer must *not* be freed. EXAMPLE ------- [source,c] -- #include ... struct tracecmd_input *handle = tracecmd_open("trace.dat"); if (!handle) { /* Failed to open trace.dat file */ } ... unsigned long long offset = 0; struct tep_record *rec; int cpu = 0; rec = tracecmd_read_cpu_first(handle, cpu); while (rec) { ... if ( /* some interesting record noticed */) { /* store the offset of the interesting record */ offset = rec->offset; } ... tracecmd_free_record(rec); rec = tracecmd_read_data(handle, cpu); } ... if (offset) { rec = tracecmd_read_at(handle, offset, &cpu); if (rec) { /* Got record at offset on cpu */ ... tracecmd_free_record(rec); } } ... tracecmd_close(hadle); -- FILES ----- [verse] -- *trace-cmd.h* Header file to include in order to have access to the library APIs. *-ltracecmd* Linker switch to add when building a program that uses the library. -- SEE ALSO -------- _libtracefs(3)_, _libtraceevent(3)_, _trace-cmd(1)_ _trace-cmd.dat(5)_ AUTHOR ------ [verse] -- *Steven Rostedt* *Tzvetomir Stoyanov* -- REPORTING BUGS -------------- Report bugs to LICENSE ------- libtracecmd is Free Software licensed under the GNU LGPL 2.1 RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2020 VMware, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/libtracecmd/libtracecmd.txt000066400000000000000000000053241414302661500236570ustar00rootroot00000000000000libtracecmd(3) ============= NAME ---- libtracecmd - trace-cmd library APIs SYNOPSIS -------- [verse] -- *#include * Open and close trace file: struct tracecmd_input pass:[*]*tracecmd_open*(const char pass:[*]_file_, int _flags_); struct tracecmd_input pass:[*]*tracecmd_open_fd*(int _fd_, int _flags_); struct tracecmd_input pass:[*]*tracecmd_open_head*(const char pass:[*]_file_, int _flags_); void *tracecmd_close*(struct tracecmd_input pass:[*]_handle_); Read tracing records from a trace file: int *tracecmd_init_data*(struct tracecmd_input pass:[*]_handle_); struct tep_record pass:[*]*tracecmd_read_cpu_first*(struct tracecmd_input pass:[*]_handle_, int _cpu_); struct tep_record pass:[*]*tracecmd_read_data*(struct tracecmd_input pass:[*]_handle_, int _cpu_); struct tep_record pass:[*]*tracecmd_read_at*(struct tracecmd_input pass:[*]_handle_, unsigned long long _offset_, int pass:[*]_cpu_); void *tracecmd_free_record*(struct tep_record pass:[*]_record_); struct tep_handle pass:[*]*tracecmd_get_tep*(struct tracecmd_input pass:[*]_handle_); Read tracing instances from a trace file: int *tracecmd_buffer_instances*(struct tracecmd_input pass:[*]_handle_); const char pass:[*]*tracecmd_buffer_instance_name*(struct tracecmd_input pass:[*]_handle_, int _indx_); struct tracecmd_input pass:[*]*tracecmd_buffer_instance_handle*(struct tracecmd_input pass:[*]_handle_, int _indx_); Get traceing peer information from a trace file: unsigned long long *tracecmd_get_traceid*(struct tracecmd_input pass:[*]_handle_); int *tracecmd_get_guest_cpumap*(struct tracecmd_input pass:[*]_handle_, unsigned long long _trace_id_, const char pass:[*]pass:[*]_name_, int pass:[*]_vcpu_count_, const int pass:[*]pass:[*]_cpu_pid_); -- DESCRIPTION ----------- The libtracecmd(3) library provides APIs to read, parse and write _trace-cmd.dat(5)_ files, recorded with _trace-cmd(1)_ application and containing tracing information from ftrace, the official Linux kernel tracer. FILES ----- [verse] -- *trace-cmd.h* Header file to include in order to have access to the library APIs. *-ltracecmd* Linker switch to add when building a program that uses the library. -- SEE ALSO -------- _libtraceevent(3)_ _libtracefs(3)_ _trace-cmd(1)_ _trace-cmd.dat(5)_ AUTHOR ------ [verse] -- *Steven Rostedt* *Tzvetomir Stoyanov* -- REPORTING BUGS -------------- Report bugs to LICENSE ------- libtracecmd is Free Software licensed under the GNU LGPL 2.1 RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2020 VMware, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/libtracecmd/manpage-1.72.xsl000066400000000000000000000007761414302661500234000ustar00rootroot00000000000000 trace-cmd-v2.9.6/Documentation/libtracecmd/manpage-base.xsl000066400000000000000000000022501414302661500237100ustar00rootroot00000000000000 sp br trace-cmd-v2.9.6/Documentation/libtracecmd/manpage-bold-literal.xsl000066400000000000000000000011021414302661500253430ustar00rootroot00000000000000 fB fR trace-cmd-v2.9.6/Documentation/libtracecmd/manpage-normal.xsl000066400000000000000000000007331414302661500242720ustar00rootroot00000000000000 \ . trace-cmd-v2.9.6/Documentation/libtracecmd/manpage-suppress-sp.xsl000066400000000000000000000013411414302661500253020ustar00rootroot00000000000000 trace-cmd-v2.9.6/Documentation/trace-cmd/000077500000000000000000000000001414302661500202275ustar00rootroot00000000000000trace-cmd-v2.9.6/Documentation/trace-cmd/Makefile000066400000000000000000000017261414302661500216750ustar00rootroot00000000000000# SPDX-License-Identifier: GPL-2.0 # Include the utils include $(src)/scripts/utils.mk bdir:=$(doc_dir)/trace-cmd $(bdir)/%.xsl: $(bdir)/%.txt $(Q)mkdir -p $(bdir) $(Q)$(do_asciidoc_build) $(bdir)/%.1: $(bdir)/%.1.xsl @$(call manpage.xsl) $(Q)$(do_xsltproc_build) $(bdir)/%.5: $(bdir)/%.5.xsl @$(call manpage.xsl) $(Q)$(do_xsltproc_build) $(Q)$(call remove_synopsis, $@) TEXT1 = $(wildcard $(bdir)/*.1.txt) MAN1 = $(patsubst $(bdir)/%.1.txt,$(bdir)/%.1, ${TEXT1}) TEXT5 = $(wildcard $(bdir)/*.5.txt) MAN5 = $(patsubst $(bdir)/%.5.txt,$(bdir)/%.5, ${TEXT5}) all: $(MAN1) $(MAN5) MAN1_INSTALL = $(MAN1:%.1=%.1.install) MAN5_INSTALL = $(MAN5:%.5=%.5.install) $(MAN1_INSTALL): %.1.install : %.1 force $(Q)$(call do_install_docs,$<,$(man_dir_SQ)/man1) $(MAN5_INSTALL): %.5.install : %.5 force $(Q)$(call do_install_docs,$<,$(man_dir_SQ)/man5) install: $(MAN1_INSTALL) $(MAN5_INSTALL) clean: $(Q)(cd $(bdir); \ $(RM) *.xml *.xsl *.1 *.5) .PHONE: force force: trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd-check-events.1.txt000066400000000000000000000023731414302661500253500ustar00rootroot00000000000000TRACE-CMD-CHECK_EVENTS(1) ========================= NAME ---- trace-cmd-check-events - parse the event formats on local system SYNOPSIS -------- *trace-cmd check-events* ['OPTIONS'] DESCRIPTION ----------- The trace-cmd(1) check-events parses format strings for all the events on the local system. It returns whether all the format strings can be parsed correctly. It will load plugins unless specified otherwise. This is useful to check for any trace event format strings which may contain some internal kernel function references which cannot be decoded outside of the kernel. This may mean that either the unparsed format strings of the trace events need to be changed or that a plugin needs to be created to parse them. OPTIONS ------- *-N* - Don't load plugins SEE ALSO -------- trace-cmd(1), trace-cmd-record(1), trace-cmd-report(1), trace-cmd-stop(1), trace-cmd-extract(1), trace-cmd-reset(1), trace-cmd-split(1), trace-cmd-list(1), trace-cmd-listen(1), trace-cmd-start(1) AUTHOR ------ Written by Vaibhav Nagarnaik, RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2011 Google, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd-clear.1.txt000066400000000000000000000023171414302661500240550ustar00rootroot00000000000000TRACE-CMD-CLEAR(1) ================= NAME ---- trace-cmd-clear - clear the Ftrace buffer. SYNOPSIS -------- *trace-cmd clear* ['OPTIONS'] DESCRIPTION ----------- The *trace-cmd(1) clear* clears the content of the Ftrace ring buffer. OPTIONS ------- *-B* 'buffer-name':: If the kernel supports multiple buffers, this will clear only the given buffer. It does not affect any other buffers. This may be used multiple times to specify different buffers. The top level buffer will not be clearded if this option is given. *-a*:: Clear all existing buffers, including the top level one. SEE ALSO -------- trace-cmd(1), trace-cmd-record(1), trace-cmd-report(1), trace-cmd-start(1), trace-cmd-extract(1), trace-cmd-reset(1), trace-cmd-split(1), trace-cmd-list(1), trace-cmd-listen(1) AUTHOR ------ [verse] -- *Steven Rostedt* , author of *trace-cmd*. *Tzvetomir Stoyanov* , author of this man page. -- REPORTING BUGS -------------- Report bugs to LICENSE ------- trace-cmd is Free Software licensed under the terms of the GNU Public License (GPL). RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd-dump.1.txt000066400000000000000000000072451414302661500237410ustar00rootroot00000000000000TRACE-CMD-DUMP(1) =================== NAME ---- trace-cmd-dump - show a meta data from a trace file, created by trace-cmd record SYNOPSIS -------- *trace-cmd dump* ['OPTIONS'] ['input-file'] DESCRIPTION ----------- The trace-cmd(1) dump command will display the meta data from a trace file created by trace-cmd record. OPTIONS ------- *-i* 'input-file':: By default, trace-cmd dump will read the file 'trace.dat'. But the *-i* option open up the given 'input-file' instead. Note, the input file may also be specified as the last item on the command line. *-v*, *--validate*:: Check if the input file is a valid trace file, created by trace-cmd. *--summary*:: Print a meta data summary - initial format and a short description of each file section. This is the default action, if no arguments are specified. *--head-page*:: Print the header page information, stored in the file. *--head-event*:: Print the event header information, stored in the file. *--ftrace-events*:: Print formats of ftrace specific events. *--systems*:: Print information of event systems, stored in the file - name and number of events for each system. *--events*:: Print formats of all events, stored in the file. *--kallsyms*:: Print information of the mapping of function addresses to the function names. *--printk*:: Print trace_printk() format strings, stored in the file. *--cmd-lines*:: Print mapping a PID to a process name. *--options*:: Print all options, stored in the file. *--flyrecord*:: Print the offset and the size of tracing data per each CPU. *--all*:: Print all meta data from the file. *--help*:: Print usage information. EXAMPLES -------- # trace-cmd dump --summary -i trace.dat Tracing meta data in file trace.dat: [Initial format] 6 [Version] 0 [Little endian] 8 [Bytes in a long] 4096 [Page size, bytes] [Header info, 205 bytes] [Header event, 205 bytes] [Ftrace format, 15 events] [Events format, 2 systems] [Kallsyms, 7144493 bytes] [Trace printk, 2131 bytes] [Saved command lines, 117 bytes] 8 [CPUs with tracing data] [12 options] [Flyrecord tracing data] ------------------------------------------ # trace-cmd dump --flyrecord -i trace.dat [Flyrecord tracing data] 7176192 0 [offset, size of cpu 0] 7176192 0 [offset, size of cpu 1] 7176192 0 [offset, size of cpu 2] 7176192 4096 [offset, size of cpu 3] 7180288 4096 [offset, size of cpu 4] 7184384 0 [offset, size of cpu 5] 7184384 0 [offset, size of cpu 6] 7184384 0 [offset, size of cpu 7] ------------------------------------------ # trace-cmd dump --summary --systems -i trace.dat Tracing meta data in file trace.dat: [Initial format] 6 [Version] 0 [Little endian] 8 [Bytes in a long] 4096 [Page size, bytes] [Header info, 205 bytes] [Header event, 205 bytes] [Ftrace format, 15 events] [Events format, 3 systems] sched 23 [system, events] irq 5 [system, events] kvm 70 [system, events] [Kallsyms, 7144493 bytes] [Trace printk, 2131 bytes] [Saved command lines, 157 bytes] 8 [CPUs with tracing data] [11 options] [Flyrecord tracing data] ------------------------------------------ # trace-cmd dump --summary --systems -i trace.dat File trace.dat is a valid trace-cmd file ------------------------------------------ SEE ALSO -------- trace-cmd(1), trace-cmd.dat(1) AUTHOR ------ *Steven Rostedt* , author of *trace-cmd*. *Tzvetomir Stoyanov* , author of this man page. RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2010 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd-extract.1.txt000066400000000000000000000061721414302661500244440ustar00rootroot00000000000000TRACE-CMD-EXTRACT(1) ==================== NAME ---- trace-cmd-extract - extract out the data from the Ftrace Linux tracer. SYNOPSIS -------- *trace-cmd extract ['OPTIONS']* DESCRIPTION ----------- The trace-cmd(1) extract is usually used after 'trace-cmd-start(1)' and 'trace-cmd-stop(1)'. It can be used after the Ftrace tracer has been started manually through the Ftrace pseudo file system. The extract command creates a trace.dat file that can be used by 'trace-cmd-report(1)' to read from. It reads the kernel internal ring buffer to produce the trace.dat file. OPTIONS ------- *-p* 'plugin':: Although *extract* does not start any traces, some of the plugins require just reading the output in ASCII format. These are the latency tracers, since the latency tracers have a separate internal buffer. The plugin option is therefore only necessary for the 'wakeup', 'wakeup-rt', 'irqsoff', 'preemptoff' and 'preemptirqsoff' plugins. With out this option, the extract command will extract from the internal Ftrace buffers. *-O* 'option':: If a latency tracer is being extracted, and the *-p* option is used, then there are some Ftrace options that can change the format. This will update those options before extracting. To see the list of options see 'trace-cmd-list'. To enable an option, write its name, to disable the option append the characters 'no' to it. For example: 'noprint-parent' will disable the 'print-parent' option that prints the parent function in printing a function event. *-o* 'outputfile':: By default, the extract command will create a 'trace.dat' file. This option will change where the file is written to. *-s*:: Extract from the snapshot buffer (if the kernel supports it). *--date*:: This is the same as the trace-cmd-record(1) --date option, but it does cause the extract routine to disable all tracing. That is, the end of the extract will perform something similar to trace-cmd-reset(1). *-B* 'buffer-name':: If the kernel supports multiple buffers, this will extract the trace for only the given buffer. It does not affect any other buffer. This may be used multiple times to specify different buffers. When this option is used, the top level instance will not be extracted unless *-t* is given. *-a*:: Extract all existing buffer instances. When this option is used, the top level instance will not be extracted unless *-t* is given. *-t*:: Extracts the top level instance buffer. Without the *-B* or *-a* option this is the same as the default. But if *-B* or *-a* is used, this is required if the top level instance buffer should also be extracted. SEE ALSO -------- trace-cmd(1), trace-cmd-record(1), trace-cmd-report(1), trace-cmd-start(1), trace-cmd-stop(1), trace-cmd-reset(1), trace-cmd-split(1), trace-cmd-list(1), trace-cmd-listen(1) AUTHOR ------ Written by Steven Rostedt, RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2010 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd-hist.1.txt000066400000000000000000000027231414302661500237370ustar00rootroot00000000000000TRACE-CMD-HIST(1) ================= NAME ---- trace-cmd-hist - show histogram of events in trace.dat file SYNOPSIS -------- *trace-cmd hist* ['OPTIONS']['input-file'] DESCRIPTION ----------- The trace-cmd(1) hist displays a histogram form from the trace.dat file. Instead of showing the events as they were ordered, it creates a histogram that can be displayed per task or for all tasks where the most common events appear first. It uses the function tracer and call stacks that it finds to try to put together a call graph of the events. OPTIONS ------- *-i* 'input-file':: By default, trace-cmd hist will read the file 'trace.dat'. But the *-i* option open up the given 'input-file' instead. Note, the input file may also be specified as the last item on the command line. *-P*:: To compact all events and show the call graphs by ignoring tasks and different PIDs, add the *-P* to do so. Instead of showing the task name, it will group all chains together and show "". SEE ALSO -------- trace-cmd(1), trace-cmd-record(1), trace-cmd-report(1), trace-cmd-start(1), trace-cmd-stop(1), trace-cmd-extract(1), trace-cmd-reset(1), trace-cmd-split(1), trace-cmd-listen(1) AUTHOR ------ Written by Steven Rostedt, RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2010 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd-list.1.txt000066400000000000000000000043361414302661500237450ustar00rootroot00000000000000TRACE-CMD-LIST(1) ================= NAME ---- trace-cmd-list - list available plugins, events or options for Ftrace. SYNOPSIS -------- *trace-cmd list* ['OPTIONS'] DESCRIPTION ----------- The trace-cmd(1) list displays the available plugins, events or Ftrace options that are configured on the current machine. If no option is given, then it lists all plugins, event systems, events and Ftrace options to standard output. OPTIONS ------- *-e* ['regex']:: This option will list the available events that are enabled on the local system. It takes an optional argument that uses 'regcomp(3)' expressions to seach. trace-cmd list -e '^sys.*' *-F*:: Used with *-e* 'regex' to show those events formats. *-l*:: Used with *-e* 'regex' to show those events filters. *-R*:: Used with *-e* 'regex' to show those events triggers. *-s*:: This option will list the available event systems. *-t*:: This option will list the available tracers that are enabled on the local system. *-p*:: Same as *-t* and only for legacy purposes. *-o*:: This option will list the available Ftrace options that are configured on the local system. *-f* ['regex']:: This option will list the available filter functions. These are the list of functions on the system that you can trace, or filter on. It takes an optional argument that uses 'regcomp(3)' expressions to seach. trace-cmd list -f '^sched.*' *-P*:: List the plugin files that get loaded on trace-cmd report. *-O*:: List plugin options that can be used by trace-cmd report *-O* option. *-B*:: List defined buffer instances (sub buffers). *-C*:: List defined clocks that can be used with trace-cmd record -C. The one in brackets ([]) is the active clock. SEE ALSO -------- trace-cmd(1), trace-cmd-record(1), trace-cmd-report(1), trace-cmd-start(1), trace-cmd-stop(1), trace-cmd-extract(1), trace-cmd-reset(1), trace-cmd-split(1), trace-cmd-listen(1) AUTHOR ------ Written by Steven Rostedt, RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2010 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd-listen.1.txt000066400000000000000000000030361414302661500242640ustar00rootroot00000000000000TRACE-CMD-LISTEN(1) =================== NAME ---- trace-cmd-listen - listen for incoming connection to record tracing. SYNOPSIS -------- *trace-cmd listen* -p 'port' ['OPTIONS'] DESCRIPTION ----------- The trace-cmd(1) listen sets up a port to listen to waiting for connections from other hosts that run 'trace-cmd-record(1)' with the *-N* option. When a connection is made, and the remote host sends data, it will create a file called 'trace.HOST:PORT.dat'. Where HOST is the name of the remote host, and PORT is the port that the remote host used to connect with. OPTIONS ------- *-p* 'port':: This option will specify the port to listen to. *-D*:: This options causes trace-cmd listen to go into a daemon mode and run in the background. *-d* 'dir':: This option specifies a directory to write the data files into. *-o* 'filename':: This option overrides the default 'trace' in the 'trace.HOST:PORT.dat' that is created when a remote host connects. *-l* 'filename':: This option writes the output messages to a log file instead of standard output. SEE ALSO -------- trace-cmd(1), trace-cmd-record(1), trace-cmd-report(1), trace-cmd-start(1), trace-cmd-stop(1), trace-cmd-extract(1), trace-cmd-reset(1), trace-cmd-split(1), trace-cmd-list(1) AUTHOR ------ Written by Steven Rostedt, RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2010 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd-mem.1.txt000066400000000000000000000071171414302661500235500ustar00rootroot00000000000000TRACE-CMD-MEM(1) ================ NAME ---- trace-cmd-mem - show memory usage of certain kmem events SYNOPSIS -------- *trace-cmd mem* ['OPTIONS']['input-file'] DESCRIPTION ----------- The trace-cmd(1) mem requires a trace-cmd record that enabled the following events: kmalloc kmalloc_node kfree kmem_cache_alloc kmem_cache_alloc_node kmem_cache_alloc_free It then reads the amount requested and the ammount freed as well as the functions that called the allocation. It then reports the final amount of bytes requested and allocated, along with the total amount allocated and requested, as well as the max allocation and requested during the run. It reports the amount of wasted bytes (allocated - requested) that was not freed, as well as the max wasted amount during the run. The list is sorted by descending order of wasted bytes after the run. Function Waste Alloc req TotAlloc TotReq MaxAlloc MaxReq MaxWaste -------- ----- ----- --- -------- ------ -------- ------ -------- rb_allocate_cpu_buffer 768 2304 1536 2304 1536 2304 1536 768 alloc_pipe_info 400 1152 752 1152 752 1152 752 400 instance_mkdir 252 544 292 544 292 544 292 252 __d_alloc 215 1086560 1086345 1087208 1086993 1086560 1086345 215 get_empty_filp 72 2304 2232 4864 4712 4864 4712 152 mm_alloc 40 960 920 960 920 960 920 40 prepare_creds 32 192 160 1728 1440 1728 1440 288 tracing_buffers_open 8 32 24 32 24 32 24 8 do_brk 0 0 0 368 368 368 368 0 journal_add_journal_head 0 6048 6048 6048 6048 6048 6048 0 journal_start 0 0 0 1224 1224 48 48 0 __rb_allocate_pages 0 3289856 3289856 3289856 3289856 3289856 3289856 0 anon_vma_alloc 0 0 0 936 936 864 864 0 [...] OPTIONS ------- *-i* 'input-file':: By default, trace-cmd hist will read the file 'trace.dat'. But the *-i* option open up the given 'input-file' instead. Note, the input file may also be specified as the last item on the command line. SEE ALSO -------- trace-cmd(1), trace-cmd-record(1), trace-cmd-report(1), trace-cmd-start(1), trace-cmd-stop(1), trace-cmd-extract(1), trace-cmd-reset(1), trace-cmd-hist(1), trace-cmd-split(1), trace-cmd-listen(1) AUTHOR ------ Written by Steven Rostedt, RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2013 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd-options.1.txt000066400000000000000000000014241414302661500244600ustar00rootroot00000000000000TRACE-CMD-OPTIONS(1) ==================== NAME ---- trace-cmd-options - list available options from trace-cmd plugins SYNOPSIS -------- *trace-cmd options* DESCRIPTION ----------- The trace-cmd(1) options command will examine all the trace-cmd plugins that are used by *trace-cmd report(1)* and list them. SEE ALSO -------- trace-cmd(1), trace-cmd-record(1), trace-cmd-start(1), trace-cmd-stop(1), trace-cmd-extract(1), trace-cmd-reset(1), trace-cmd-split(1), trace-cmd-list(1), trace-cmd-listen(1) AUTHOR ------ Written by Steven Rostedt, RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2011 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd-profile.1.txt000066400000000000000000000761541414302661500244410ustar00rootroot00000000000000TRACE-CMD-PROFILE(1) ==================== NAME ---- trace-cmd-profile - profile tasks running live SYNOPSIS -------- *trace-cmd profile ['OPTIONS']* ['command'] DESCRIPTION ----------- The trace-cmd(1) profile will start tracing just like trace-cmd-record(1), with the *--profile* option, except that it does not write to a file, but instead, it will read the events as they happen and will update the accounting of the events. When the trace is finished, it will report the results just like trace-cmd-report(1) would do with its *--profile* option. In other words, the profile command does the work of trace-cmd record --profile, and trace-cmd report --profile without having to record the data to disk, in between. The advantage of using the profile command is that the profiling can be done over a long period of time where recording all events would take up too much disk space. This will enable several events as well as the function graph tracer with a depth of one (if the kernel supports it). This is to show where tasks enter and exit the kernel and how long they were in the kernel. To disable calling function graph, use the *-p* option to enable another tracer. To not enable any tracer, use *-p nop*. All timings are currently in nanoseconds. OPTIONS ------- These are the same as trace-cmd-record(1) with the *--profile* option. *-p* 'tracer':: Set a tracer plugin to run instead of function graph tracing set to depth of 1. To not run any tracer, use *-p nop*. *-S*:: Only enable the tracer or events speficied on the command line. With this option, the function_graph tracer is not enabled, nor are any events (like sched_switch), unless they are specifically specified on the command line (i.e. -p function -e sched_switch -e sched_wakeup) *-G*:: Set interrupt (soft and hard) events as global (associated to CPU instead of tasks). *-o* 'file':: Write the output of the profile to 'file'. This supersedes *--stderr* *-H* 'event-hooks':: Add custom event matching to connect any two events together. Format is: [:],[,]/ [:],[,] The start_system:start_event (start_system is optional), is the event that starts the timing. start_match is the field in the start event that is to match with the end_match in the end event. start_pid is optional, as matches are attached to the tasks that run the events, if another field should be used to find that task, then it is specified with start_pid. end_system:end_event is the event that ends the timing (end_system is optional). end_match is the field in end_match that wil match the start event field start_match. flags are optional and can be the following (case insensitive): p : The two events are pinned to the same CPU (start and end happen on the same CPU always). s : The event should have a stack traced with it (enable stack tracing for the start event). g : The event is global (not associated to a task). start_pid is not applicable with this flag. *--stderr*:: Redirect the output to stderr. The output of the command being executed is not changed. This allows watching the command execute and saving the output of the profile to another file. EXAMPLES -------- --- # trace-cmd profile -F sleep 1 [..] task: sleep-1121 Event: sched_switch:R (2) Total: 234559 Avg: 117279 Max: 129886 Min:104673 | + ftrace_raw_event_sched_switch (0xffffffff8109f310) 100% (2) time:234559 max:129886 min:104673 avg:117279 __schedule (0xffffffff816c1e81) preempt_schedule (0xffffffff816c236e) ___preempt_schedule (0xffffffff81351a59) | + unmap_single_vma (0xffffffff81198c05) | 55% (1) time:129886 max:129886 min:0 avg:129886 | stop_one_cpu (0xffffffff8110909a) | sched_exec (0xffffffff810a119b) | do_execveat_common.isra.31 (0xffffffff811de528) | do_execve (0xffffffff811dea8c) | SyS_execve (0xffffffff811ded1e) | return_to_handler (0xffffffff816c8458) | stub_execve (0xffffffff816c6929) | + unmap_single_vma (0xffffffff81198c05) 45% (1) time:104673 max:104673 min:0 avg:104673 unmap_vmas (0xffffffff81199174) exit_mmap (0xffffffff811a1f5b) mmput (0xffffffff8107699a) flush_old_exec (0xffffffff811ddb75) load_elf_binary (0xffffffff812287df) search_binary_handler (0xffffffff811dd3e0) do_execveat_common.isra.31 (0xffffffff811de8bd) do_execve (0xffffffff811dea8c) SyS_execve (0xffffffff811ded1e) return_to_handler (0xffffffff816c8458) stub_execve (0xffffffff816c6929) Event: sched_switch:S (1) Total: 1000513242 Avg: 1000513242 Max: 1000513242 Min:1000513242 | + ftrace_raw_event_sched_switch (0xffffffff8109f310) 100% (1) time:1000513242 max:1000513242 min:0 avg:1000513242 __schedule (0xffffffff816c1e81) schedule (0xffffffff816c23b9) do_nanosleep (0xffffffff816c4f1c) hrtimer_nanosleep (0xffffffff810dcd86) SyS_nanosleep (0xffffffff810dcea6) return_to_handler (0xffffffff816c8458) tracesys_phase2 (0xffffffff816c65b0) Event: sched_wakeup:1121 (1) Total: 43405 Avg: 43405 Max: 43405 Min:43405 | + ftrace_raw_event_sched_wakeup_template (0xffffffff8109d960) 100% (1) time:43405 max:43405 min:0 avg:43405 ttwu_do_wakeup (0xffffffff810a01a2) ttwu_do_activate.constprop.122 (0xffffffff810a0236) try_to_wake_up (0xffffffff810a3ec3) wake_up_process (0xffffffff810a4057) hrtimer_wakeup (0xffffffff810db772) __run_hrtimer (0xffffffff810dbd91) hrtimer_interrupt (0xffffffff810dc6b7) local_apic_timer_interrupt (0xffffffff810363e7) smp_trace_apic_timer_interrupt (0xffffffff816c8c6a) trace_apic_timer_interrupt (0xffffffff816c725a) finish_task_switch (0xffffffff8109c3a4) __schedule (0xffffffff816c1e01) schedule (0xffffffff816c23b9) ring_buffer_wait (0xffffffff811323a3) wait_on_pipe (0xffffffff81133d93) tracing_buffers_splice_read (0xffffffff811350b0) do_splice_to (0xffffffff8120476f) SyS_splice (0xffffffff81206c1f) tracesys_phase2 (0xffffffff816c65b0) Event: func: sys_nanosleep() (1) Total: 1000598016 Avg: 1000598016 Max: 1000598016 Min:1000598016 Event: func: sys_munmap() (1) Total: 14300 Avg: 14300 Max: 14300 Min:14300 Event: func: sys_arch_prctl() (1) Total: 571 Avg: 571 Max: 571 Min:571 Event: func: sys_mprotect() (4) Total: 14382 Avg: 3595 Max: 7196 Min:2190 Event: func: SyS_read() (1) Total: 2640 Avg: 2640 Max: 2640 Min:2640 Event: func: sys_close() (5) Total: 4001 Avg: 800 Max: 1252 Min:414 Event: func: sys_newfstat() (3) Total: 11684 Avg: 3894 Max: 10206 Min:636 Event: func: SyS_open() (3) Total: 23615 Avg: 7871 Max: 10535 Min:4743 Event: func: sys_access() (1) Total: 5924 Avg: 5924 Max: 5924 Min:5924 Event: func: SyS_mmap() (8) Total: 39153 Avg: 4894 Max: 12354 Min:1518 Event: func: smp_trace_apic_timer_interrupt() (1) Total: 10298 Avg: 10298 Max: 10298 Min:10298 Event: func: SyS_brk() (4) Total: 2407 Avg: 601 Max: 1564 Min:206 Event: func: do_notify_resume() (2) Total: 4095 Avg: 2047 Max: 2521 Min:1574 Event: func: sys_execve() (5) Total: 1625251 Avg: 325050 Max: 1605698 Min:3570 | + ftrace_raw_event_sched_wakeup_template (0xffffffff8109d960) 100% (1) time:1605698 max:1605698 min:0 avg:1605698 ttwu_do_wakeup (0xffffffff810a01a2) ttwu_do_activate.constprop.122 (0xffffffff810a0236) try_to_wake_up (0xffffffff810a3ec3) wake_up_process (0xffffffff810a4057) cpu_stop_queue_work (0xffffffff81108df8) stop_one_cpu (0xffffffff8110909a) sched_exec (0xffffffff810a119b) do_execveat_common.isra.31 (0xffffffff811de528) do_execve (0xffffffff811dea8c) SyS_execve (0xffffffff811ded1e) return_to_handler (0xffffffff816c8458) stub_execve (0xffffffff816c6929) stub_execve (0xffffffff816c6929) Event: func: syscall_trace_enter_phase2() (38) Total: 21544 Avg: 566 Max: 1066 Min:329 Event: func: syscall_trace_enter_phase1() (38) Total: 9202 Avg: 242 Max: 376 Min:150 Event: func: __do_page_fault() (53) Total: 257672 Avg: 4861 Max: 27745 Min:458 | + ftrace_raw_event_sched_wakeup_template (0xffffffff8109d960) 100% (1) time:27745 max:27745 min:0 avg:27745 ttwu_do_wakeup (0xffffffff810a01a2) ttwu_do_activate.constprop.122 (0xffffffff810a0236) try_to_wake_up (0xffffffff810a3ec3) default_wake_function (0xffffffff810a4002) autoremove_wake_function (0xffffffff810b50fd) __wake_up_common (0xffffffff810b4958) __wake_up (0xffffffff810b4cb8) rb_wake_up_waiters (0xffffffff8112f126) irq_work_run_list (0xffffffff81157d0f) irq_work_run (0xffffffff81157d5e) smp_trace_irq_work_interrupt (0xffffffff810082fc) trace_irq_work_interrupt (0xffffffff816c7aaa) return_to_handler (0xffffffff816c8458) trace_do_page_fault (0xffffffff810478b2) trace_page_fault (0xffffffff816c7dd2) Event: func: syscall_trace_leave() (38) Total: 26145 Avg: 688 Max: 1264 Min:381 Event: func: __sb_end_write() (1) Total: 373 Avg: 373 Max: 373 Min:373 Event: func: fsnotify() (1) Total: 598 Avg: 598 Max: 598 Min:598 Event: func: __fsnotify_parent() (1) Total: 286 Avg: 286 Max: 286 Min:286 Event: func: mutex_unlock() (2) Total: 39636 Avg: 19818 Max: 39413 Min:223 Event: func: smp_trace_irq_work_interrupt() (6) Total: 236459 Avg: 39409 Max: 100671 Min:634 | + ftrace_raw_event_sched_wakeup_template (0xffffffff8109d960) 100% (4) time:234348 max:100671 min:38745 avg:58587 ttwu_do_wakeup (0xffffffff810a01a2) ttwu_do_activate.constprop.122 (0xffffffff810a0236) try_to_wake_up (0xffffffff810a3ec3) default_wake_function (0xffffffff810a4002) autoremove_wake_function (0xffffffff810b50fd) __wake_up_common (0xffffffff810b4958) __wake_up (0xffffffff810b4cb8) rb_wake_up_waiters (0xffffffff8112f126) irq_work_run_list (0xffffffff81157d0f) irq_work_run (0xffffffff81157d5e) smp_trace_irq_work_interrupt (0xffffffff810082fc) return_to_handler (0xffffffff816c8458) trace_irq_work_interrupt (0xffffffff816c7aaa) | + ftrace_return_to_handler (0xffffffff81140840) | 84% (3) time:197396 max:100671 min:38745 avg:65798 | return_to_handler (0xffffffff816c846d) | trace_page_fault (0xffffffff816c7dd2) | + ftrace_return_to_handler (0xffffffff81140840) 16% (1) time:36952 max:36952 min:0 avg:36952 ftrace_graph_caller (0xffffffff816c8428) mutex_unlock (0xffffffff816c3f75) rb_simple_write (0xffffffff81133142) vfs_write (0xffffffff811d7727) SyS_write (0xffffffff811d7acf) tracesys_phase2 (0xffffffff816c65b0) Event: sys_enter:35 (1) Total: 1000599765 Avg: 1000599765 Max: 1000599765 Min:1000599765 Event: sys_enter:11 (1) Total: 55025 Avg: 55025 Max: 55025 Min:55025 Event: sys_enter:158 (1) Total: 1584 Avg: 1584 Max: 1584 Min:1584 Event: sys_enter:10 (4) Total: 18359 Avg: 4589 Max: 8764 Min:2933 Event: sys_enter:0 (1) Total: 4223 Avg: 4223 Max: 4223 Min:4223 Event: sys_enter:3 (5) Total: 9948 Avg: 1989 Max: 2606 Min:1203 Event: sys_enter:5 (3) Total: 15530 Avg: 5176 Max: 11840 Min:1405 Event: sys_enter:2 (3) Total: 28002 Avg: 9334 Max: 12035 Min:5656 Event: sys_enter:21 (1) Total: 7814 Avg: 7814 Max: 7814 Min:7814 Event: sys_enter:9 (8) Total: 49583 Avg: 6197 Max: 14137 Min:2362 Event: sys_enter:12 (4) Total: 108493 Avg: 27123 Max: 104079 Min:922 Event: sys_enter:59 (5) Total: 1631608 Avg: 326321 Max: 1607529 Min:4563 Event: page_fault_user:0x398d86b630 (1) Event: page_fault_user:0x398d844de0 (1) Event: page_fault_user:0x398d8d9020 (1) Event: page_fault_user:0x1d37008 (1) Event: page_fault_user:0x7f0b89e91074 (1) Event: page_fault_user:0x7f0b89d98ed0 (1) Event: page_fault_user:0x7f0b89ec8950 (1) Event: page_fault_user:0x7f0b89d83644 (1) Event: page_fault_user:0x7f0b89d622a8 (1) Event: page_fault_user:0x7f0b89d5a560 (1) Event: page_fault_user:0x7f0b89d34010 (1) Event: page_fault_user:0x1d36008 (1) Event: page_fault_user:0x398d900510 (1) Event: page_fault_user:0x398dbb3ae8 (1) Event: page_fault_user:0x398d87f490 (1) Event: page_fault_user:0x398d8eb660 (1) Event: page_fault_user:0x398d8bd730 (1) Event: page_fault_user:0x398d9625d9 (1) Event: page_fault_user:0x398d931810 (1) Event: page_fault_user:0x398dbb7114 (1) Event: page_fault_user:0x398d837610 (1) Event: page_fault_user:0x398d89e860 (1) Event: page_fault_user:0x398d8f23b0 (1) Event: page_fault_user:0x398dbb4510 (1) Event: page_fault_user:0x398dbad6f0 (1) Event: page_fault_user:0x398dbb1018 (1) Event: page_fault_user:0x398d977b37 (1) Event: page_fault_user:0x398d92eb60 (1) Event: page_fault_user:0x398d8abff0 (1) Event: page_fault_user:0x398dbb0d30 (1) Event: page_fault_user:0x398dbb6c24 (1) Event: page_fault_user:0x398d821c50 (1) Event: page_fault_user:0x398dbb6c20 (1) Event: page_fault_user:0x398d886350 (1) Event: page_fault_user:0x7f0b90125000 (1) Event: page_fault_user:0x7f0b90124740 (1) Event: page_fault_user:0x7f0b90126000 (1) Event: page_fault_user:0x398d816230 (1) Event: page_fault_user:0x398d8002b8 (1) Event: page_fault_user:0x398dbb0b40 (1) Event: page_fault_user:0x398dbb2880 (1) Event: page_fault_user:0x7f0b90141cc6 (1) Event: page_fault_user:0x7f0b9013b85c (1) Event: page_fault_user:0x7f0b90127000 (1) Event: page_fault_user:0x606e70 (1) Event: page_fault_user:0x7f0b90144010 (1) Event: page_fault_user:0x7fffcb31b038 (1) Event: page_fault_user:0x606da8 (1) Event: page_fault_user:0x400040 (1) Event: page_fault_user:0x398d222218 (1) Event: page_fault_user:0x398d015120 (1) Event: page_fault_user:0x398d220ce8 (1) Event: page_fault_user:0x398d220b80 (1) Event: page_fault_user:0x7fffcb2fcff8 (1) Event: page_fault_user:0x398d001590 (1) Event: page_fault_user:0x398d838490 (1) Event: softirq_raise:RCU (3) Total: 252931 Avg: 84310 Max: 243288 Min:4639 Event: softirq_raise:SCHED (2) Total: 241249 Avg: 120624 Max: 239076 Min:2173 | + ftrace_raw_event_sched_wakeup_template (0xffffffff8109d960) 100% (1) time:239076 max:239076 min:0 avg:239076 ttwu_do_wakeup (0xffffffff810a01a2) ttwu_do_activate.constprop.122 (0xffffffff810a0236) try_to_wake_up (0xffffffff810a3ec3) default_wake_function (0xffffffff810a4002) autoremove_wake_function (0xffffffff810b50fd) __wake_up_common (0xffffffff810b4958) __wake_up (0xffffffff810b4cb8) rb_wake_up_waiters (0xffffffff8112f126) irq_work_run_list (0xffffffff81157d0f) irq_work_run (0xffffffff81157d5e) smp_trace_irq_work_interrupt (0xffffffff810082fc) trace_irq_work_interrupt (0xffffffff816c7aaa) irq_exit (0xffffffff8107dd66) smp_trace_apic_timer_interrupt (0xffffffff816c8c7a) trace_apic_timer_interrupt (0xffffffff816c725a) prepare_ftrace_return (0xffffffff8103d4fd) ftrace_graph_caller (0xffffffff816c8428) mem_cgroup_begin_page_stat (0xffffffff811cfd25) page_remove_rmap (0xffffffff811a4fc5) stub_execve (0xffffffff816c6929) unmap_single_vma (0xffffffff81198b1c) unmap_vmas (0xffffffff81199174) exit_mmap (0xffffffff811a1f5b) mmput (0xffffffff8107699a) flush_old_exec (0xffffffff811ddb75) load_elf_binary (0xffffffff812287df) search_binary_handler (0xffffffff811dd3e0) do_execveat_common.isra.31 (0xffffffff811de8bd) do_execve (0xffffffff811dea8c) SyS_execve (0xffffffff811ded1e) return_to_handler (0xffffffff816c8458) Event: softirq_raise:HI (3) Total: 72472 Avg: 24157 Max: 64186 Min:3430 Event: softirq_entry:RCU (2) Total: 3191 Avg: 1595 Max: 1788 Min:1403 | + ftrace_raw_event_sched_wakeup_template (0xffffffff8109d960) 100% (1) time:1788 max:1788 min:0 avg:1788 ttwu_do_wakeup (0xffffffff810a01a2) ttwu_do_activate.constprop.122 (0xffffffff810a0236) try_to_wake_up (0xffffffff810a3ec3) default_wake_function (0xffffffff810a4002) autoremove_wake_function (0xffffffff810b50fd) __wake_up_common (0xffffffff810b4958) __wake_up (0xffffffff810b4cb8) rb_wake_up_waiters (0xffffffff8112f126) irq_work_run_list (0xffffffff81157d0f) irq_work_run (0xffffffff81157d5e) smp_trace_irq_work_interrupt (0xffffffff810082fc) trace_irq_work_interrupt (0xffffffff816c7aaa) irq_work_queue (0xffffffff81157e95) ring_buffer_unlock_commit (0xffffffff8113039f) __buffer_unlock_commit (0xffffffff811367d5) trace_buffer_unlock_commit (0xffffffff811376a2) ftrace_event_buffer_commit (0xffffffff81146d5f) ftrace_raw_event_sched_process_exec (0xffffffff8109c511) do_execveat_common.isra.31 (0xffffffff811de9a3) do_execve (0xffffffff811dea8c) SyS_execve (0xffffffff811ded1e) return_to_handler (0xffffffff816c8458) stub_execve (0xffffffff816c6929) Event: softirq_entry:SCHED (2) Total: 2289 Avg: 1144 Max: 1350 Min:939 Event: softirq_entry:HI (3) Total: 180146 Avg: 60048 Max: 178969 Min:499 | + ftrace_raw_event_sched_wakeup_template (0xffffffff8109d960) 100% (1) time:178969 max:178969 min:0 avg:178969 ttwu_do_wakeup (0xffffffff810a01a2) ttwu_do_activate.constprop.122 (0xffffffff810a0236) try_to_wake_up (0xffffffff810a3ec3) wake_up_process (0xffffffff810a4057) wake_up_worker (0xffffffff8108de74) insert_work (0xffffffff8108fca6) __queue_work (0xffffffff8108fe12) delayed_work_timer_fn (0xffffffff81090088) call_timer_fn (0xffffffff810d8f89) run_timer_softirq (0xffffffff810da8a1) __do_softirq (0xffffffff8107d8fa) irq_exit (0xffffffff8107dd66) smp_trace_apic_timer_interrupt (0xffffffff816c8c7a) trace_apic_timer_interrupt (0xffffffff816c725a) prepare_ftrace_return (0xffffffff8103d4fd) ftrace_graph_caller (0xffffffff816c8428) mem_cgroup_begin_page_stat (0xffffffff811cfd25) page_remove_rmap (0xffffffff811a4fc5) stub_execve (0xffffffff816c6929) unmap_single_vma (0xffffffff81198b1c) unmap_vmas (0xffffffff81199174) exit_mmap (0xffffffff811a1f5b) mmput (0xffffffff8107699a) flush_old_exec (0xffffffff811ddb75) load_elf_binary (0xffffffff812287df) search_binary_handler (0xffffffff811dd3e0) do_execveat_common.isra.31 (0xffffffff811de8bd) do_execve (0xffffffff811dea8c) SyS_execve (0xffffffff811ded1e) return_to_handler (0xffffffff816c8458) --- The above uses *-F* to follow the sleep task. It filters only on events that pertain to sleep. Note, in order to follow forks, you need to also include the *-c* flag. Other tasks will appear in the profile as well if events reference more than one task (like sched_switch and sched_wakeup do. The "prev_pid" and "next_pid" of sched_switch, and the "common_pid" and "pid" of sched_wakeup). Stack traces are attached to events that are related to them. Taking a look at the above output: Event: sched_switch:R (2) Total: 234559 Avg: 117279 Max: 129886 Min:104673 This shows that task was preempted (it's in the running 'R' state). It was preempted twice '(2)' for a total of 234,559 nanoseconds, with a average preempt time of 117,279 ns, and maximum of 128,886 ns and minimum of 104,673 ns. The tree shows where it was preempted: | + ftrace_raw_event_sched_switch (0xffffffff8109f310) 100% (2) time:234559 max:129886 min:104673 avg:117279 __schedule (0xffffffff816c1e81) preempt_schedule (0xffffffff816c236e) ___preempt_schedule (0xffffffff81351a59) | + unmap_single_vma (0xffffffff81198c05) | 55% (1) time:129886 max:129886 min:0 avg:129886 | stop_one_cpu (0xffffffff8110909a) | sched_exec (0xffffffff810a119b) | do_execveat_common.isra.31 (0xffffffff811de528) | do_execve (0xffffffff811dea8c) | SyS_execve (0xffffffff811ded1e) | return_to_handler (0xffffffff816c8458) | stub_execve (0xffffffff816c6929) | + unmap_single_vma (0xffffffff81198c05) 45% (1) time:104673 max:104673 min:0 avg:104673 unmap_vmas (0xffffffff81199174) exit_mmap (0xffffffff811a1f5b) mmput (0xffffffff8107699a) flush_old_exec (0xffffffff811ddb75) load_elf_binary (0xffffffff812287df) search_binary_handler (0xffffffff811dd3e0) do_execveat_common.isra.31 (0xffffffff811de8bd) do_execve (0xffffffff811dea8c) SyS_execve (0xffffffff811ded1e) return_to_handler (0xffffffff816c8458) stub_execve (0xffffffff816c6929) Event: sched_switch:S (1) Total: 1000513242 Avg: 1000513242 Max: 1000513242 Min:10005132 This shows that the task was scheduled out in the INTERRUPTIBLE state once for a total of 1,000,513,242 ns (~1s), which makes sense as the task was a "sleep 1". After the schedule events, the function events are shown. By default the profiler will use the function graph tracer if the depth setting is supported by the kernel. It will set the depth to one which will only trace the first function that enters the kernel. It will also record the amount of time it was in the kernel. Event: func: sys_nanosleep() (1) Total: 1000598016 Avg: 1000598016 Max: 1000598016 Min:1000598016 Event: func: sys_munmap() (1) Total: 14300 Avg: 14300 Max: 14300 Min:14300 Event: func: sys_arch_prctl() (1) Total: 571 Avg: 571 Max: 571 Min:571 Event: func: sys_mprotect() (4) Total: 14382 Avg: 3595 Max: 7196 Min:2190 Event: func: SyS_read() (1) Total: 2640 Avg: 2640 Max: 2640 Min:2640 Event: func: sys_close() (5) Total: 4001 Avg: 800 Max: 1252 Min:414 Event: func: sys_newfstat() (3) Total: 11684 Avg: 3894 Max: 10206 Min:636 Event: func: SyS_open() (3) Total: 23615 Avg: 7871 Max: 10535 Min:4743 Event: func: sys_access() (1) Total: 5924 Avg: 5924 Max: 5924 Min:5924 Event: func: SyS_mmap() (8) Total: 39153 Avg: 4894 Max: 12354 Min:1518 Event: func: smp_trace_apic_timer_interrupt() (1) Total: 10298 Avg: 10298 Max: 10298 Min:10298 Event: func: SyS_brk() (4) Total: 2407 Avg: 601 Max: 1564 Min:206 Event: func: do_notify_resume() (2) Total: 4095 Avg: 2047 Max: 2521 Min:1574 Event: func: sys_execve() (5) Total: 1625251 Avg: 325050 Max: 1605698 Min:3570 Count of times the event was hit is always in parenthesis '(5)'. The function graph trace may produce too much overhead as it is still triggering (just not tracing) on all functions. To limit functions just to system calls (not interrupts), add the following option: -l 'sys_*' -l 'SyS_*' To disable function graph tracing totally, use: -p nop To use function tracing instead (note, this will not record timings, but just the count of times a function is hit): -p function Following the functions are the events that are recorded. Event: sys_enter:35 (1) Total: 1000599765 Avg: 1000599765 Max: 1000599765 Min:1000599765 Event: sys_enter:11 (1) Total: 55025 Avg: 55025 Max: 55025 Min:55025 Event: sys_enter:158 (1) Total: 1584 Avg: 1584 Max: 1584 Min:1584 Event: sys_enter:10 (4) Total: 18359 Avg: 4589 Max: 8764 Min:2933 Event: sys_enter:0 (1) Total: 4223 Avg: 4223 Max: 4223 Min:4223 Event: sys_enter:3 (5) Total: 9948 Avg: 1989 Max: 2606 Min:1203 Event: sys_enter:5 (3) Total: 15530 Avg: 5176 Max: 11840 Min:1405 Event: sys_enter:2 (3) Total: 28002 Avg: 9334 Max: 12035 Min:5656 Event: sys_enter:21 (1) Total: 7814 Avg: 7814 Max: 7814 Min:7814 Event: sys_enter:9 (8) Total: 49583 Avg: 6197 Max: 14137 Min:2362 Event: sys_enter:12 (4) Total: 108493 Avg: 27123 Max: 104079 Min:922 Event: sys_enter:59 (5) Total: 1631608 Avg: 326321 Max: 1607529 Min:4563 These are the raw system call events, with the raw system call ID after the "sys_enter:" For example, "59" is execve(2). Why did it execute 5 times? Looking at a strace of this run, we can see: execve("/usr/lib64/ccache/sleep", ["sleep", "1"], [/* 27 vars */] <... execve resumed> ) = -1 ENOENT (No such file or directory) execve("/usr/local/sbin/sleep", ["sleep", "1"], [/* 27 vars */] <... execve resumed> ) = -1 ENOENT (No such file or directory) execve("/usr/local/bin/sleep", ["sleep", "1"], [/* 27 vars */] <... execve resumed> ) = -1 ENOENT (No such file or directory) execve("/usr/sbin/sleep", ["sleep", "1"], [/* 27 vars */] <... execve resumed> ) = -1 ENOENT (No such file or directory) execve("/usr/bin/sleep", ["sleep", "1"], [/* 27 vars */] <... execve resumed> ) = 0 It attempted to execve the "sleep" command for each path in $PATH until it found one. The page_fault_user events show what userspace address took a page fault. Event: softirq_raise:RCU (3) Total: 252931 Avg: 84310 Max: 243288 Min:4639 Event: softirq_raise:SCHED (2) Total: 241249 Avg: 120624 Max: 239076 Min:2173 | + ftrace_raw_event_sched_wakeup_template (0xffffffff8109d960) 100% (1) time:239076 max:239076 min:0 avg:239076 ttwu_do_wakeup (0xffffffff810a01a2) ttwu_do_activate.constprop.122 (0xffffffff810a0236) try_to_wake_up (0xffffffff810a3ec3) default_wake_function (0xffffffff810a4002) autoremove_wake_function (0xffffffff810b50fd) __wake_up_common (0xffffffff810b4958) __wake_up (0xffffffff810b4cb8) rb_wake_up_waiters (0xffffffff8112f126) irq_work_run_list (0xffffffff81157d0f) irq_work_run (0xffffffff81157d5e) smp_trace_irq_work_interrupt (0xffffffff810082fc) trace_irq_work_interrupt (0xffffffff816c7aaa) irq_exit (0xffffffff8107dd66) The timings for the softirq_raise events measure the time it took from the raised softirq to the time it executed. The timings for the softirq_entry events measure the time the softirq took to execute. The stack traces for the softirqs (and possibly other events) are used when an event has a stack attached to it. This can happen if the profile ran more stacks than just the sched events, or when events are dropped and stacks To have full control of what gets traced, use the *-S* option that will have trace-cmd not enable any events or the function_graph tracer. Only the events listed on the command line are shown. If only the time of kmalloc is needed to be seen, and where it was recorded, using the *-S* option and enabling function_graph and stack tracing for just the function needed will give the profile of only that function. --- # trace-cmd profile -S -p function_graph -l '*kmalloc*' -l '*kmalloc*:stacktrace' sleep 1 task: sshd-11786 Event: func: __kmalloc_reserve.isra.59() (2) Total: 149684 Avg: 74842 Max: 75598 Min:74086 | + __alloc_skb (0xffffffff815a8917) | 67% (2) time:149684 max:75598 min:74086 avg:74842 | __kmalloc_node_track_caller (0xffffffff811c6635) | __kmalloc_reserve.isra.59 (0xffffffff815a84ac) | return_to_handler (0xffffffff816c8458) | sk_stream_alloc_skb (0xffffffff81604ea1) | tcp_sendmsg (0xffffffff8160592c) | inet_sendmsg (0xffffffff8162fed1) | sock_aio_write (0xffffffff8159f9fc) | do_sync_write (0xffffffff811d694a) | vfs_write (0xffffffff811d7825) | SyS_write (0xffffffff811d7adf) | system_call_fastpath (0xffffffff816c63d2) | + __alloc_skb (0xffffffff815a8917) 33% (1) time:74086 max:74086 min:74086 avg:74086 __alloc_skb (0xffffffff815a8917) sk_stream_alloc_skb (0xffffffff81604ea1) tcp_sendmsg (0xffffffff8160592c) inet_sendmsg (0xffffffff8162fed1) sock_aio_write (0xffffffff8159f9fc) do_sync_write (0xffffffff811d694a) vfs_write (0xffffffff811d7825) SyS_write (0xffffffff811d7adf) system_call_fastpath (0xffffffff816c63d2) [..] --- To watch the command run but save the output of the profile to a file use --stderr, and redirect stderr to a file # trace-cmd profile --stderr cyclictest -p 80 -n -t1 2> profile.out Or simple use *-o* # trace-cmd profile -o profile.out cyclictest -p 80 -n -t1 SEE ALSO -------- trace-cmd(1), trace-cmd-record(1), trace-cmd-report(1), trace-cmd-start(1), trace-cmd-stop(1), trace-cmd-reset(1), trace-cmd-split(1), trace-cmd-list(1), trace-cmd-listen(1) AUTHOR ------ Written by Steven Rostedt, RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2014 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd-record.1.txt000066400000000000000000000521751414302661500242540ustar00rootroot00000000000000TRACE-CMD-RECORD(1) =================== NAME ---- trace-cmd-record - record a trace from the Ftrace Linux internal tracer SYNOPSIS -------- *trace-cmd record* ['OPTIONS'] ['command'] DESCRIPTION ----------- The trace-cmd(1) record command will set up the Ftrace Linux kernel tracer to record the specified plugins or events that happen while the 'command' executes. If no command is given, then it will record until the user hits Ctrl-C. The record command of trace-cmd will set up the Ftrace tracer to start tracing the various events or plugins that are given on the command line. It will then create a number of tracing processes (one per CPU) that will start recording from the kernel ring buffer straight into temporary files. When the command is complete (or Ctrl-C is hit) all the files will be combined into a trace.dat file that can later be read (see trace-cmd-report(1)). OPTIONS ------- *-p* 'tracer':: Specify a tracer. Tracers usually do more than just trace an event. Common tracers are: *function*, *function_graph*, *preemptirqsoff*, *irqsoff*, *preemptoff* and *wakeup*. A tracer must be supported by the running kernel. To see a list of available tracers, see trace-cmd-list(1). *-e* 'event':: Specify an event to trace. Various static trace points have been added to the Linux kernel. They are grouped by subsystem where you can enable all events of a given subsystem or specify specific events to be enabled. The 'event' is of the format "subsystem:event-name". You can also just specify the subsystem without the ':event-name' or the event-name without the "subsystem:". Using "-e sched_switch" will enable the "sched_switch" event where as, "-e sched" will enable all events under the "sched" subsystem. The 'event' can also contain glob expressions. That is, "*stat*" will select all events (or subsystems) that have the characters "stat" in their names. The keyword 'all' can be used to enable all events. *-a*:: Every event that is being recorded has its output format file saved in the output file to be able to display it later. But if other events are enabled in the trace without trace-cmd's knowledge, the formats of those events will not be recorded and trace-cmd report will not be able to display them. If this is the case, then specify the *-a* option and the format for all events in the system will be saved. *-T*:: Enable a stacktrace on each event. For example: -0 [003] 58549.289091: sched_switch: kworker/0:1:0 [120] R ==> trace-cmd:2603 [120] -0 [003] 58549.289092: kernel_stack: => schedule (ffffffff814b260e) => cpu_idle (ffffffff8100a38c) => start_secondary (ffffffff814ab828) *--func-stack*:: Enable a stack trace on all functions. Note this is only applicable for the "function" plugin tracer, and will only take effect if the -l option is used and succeeds in limiting functions. If the function tracer is not filtered, and the stack trace is enabled, you can live lock the machine. *-f* 'filter':: Specify a filter for the previous event. This must come after a *-e*. This will filter what events get recorded based on the content of the event. Filtering is passed to the kernel directly so what filtering is allowed may depend on what version of the kernel you have. Basically, it will let you use C notation to check if an event should be processed or not. ---------------------------------------- ==, >=, <=, >, <, &, |, && and || ---------------------------------------- The above are usually safe to use to compare fields. *--no-filter*:: Do not filter out the trace-cmd threads. By default, the threads are filtered out to not be traced by events. This option will have the trace-cmd threads also be traced. *-R* 'trigger':: Specify a trigger for the previous event. This must come after a *-e*. This will add a given trigger to the given event. To only enable the trigger and not the event itself, then place the event after the *-v* option. See Documentation/trace/events.txt in the Linux kernel source for more information on triggers. *-v*:: This will cause all events specified after it on the command line to not be traced. This is useful for selecting a subsystem to be traced but to leave out various events. For Example: "-e sched -v -e "\*stat\*"" will enable all events in the sched subsystem except those that have "stat" in their names. Note: the *-v* option was taken from the way grep(1) inverts the following matches. *-F*:: This will filter only the executable that is given on the command line. If no command is given, then it will filter itself (pretty pointless). Using *-F* will let you trace only events that are caused by the given command. *-P* 'pid':: Similar to *-F* but lets you specify a process ID to trace. *-c*:: Used with either *-F* (or *-P* if kernel supports it) to trace the process' children too. *--user*:: Execute the specified *command* as given user. *-C* 'clock':: Set the trace clock to "clock". Use trace-cmd(1) list -C to see what clocks are available. *-o* 'output-file':: By default, trace-cmd report will create a 'trace.dat' file. You can specify a different file to write to with the *-o* option. *-l* 'function-name':: This will limit the 'function' and 'function_graph' tracers to only trace the given function name. More than one *-l* may be specified on the command line to trace more than one function. The limited use of glob expressions are also allowed. These are 'match\*' to only filter functions that start with 'match'. '\*match' to only filter functions that end with 'match'. '\*match\*' to only filter on functions that contain 'match'. *-g* 'function-name':: This option is for the function_graph plugin. It will graph the given function. That is, it will only trace the function and all functions that it calls. You can have more than one *-g* on the command line. *-n* 'function-name':: This has the opposite effect of *-l*. The function given with the *-n* option will not be traced. This takes precedence, that is, if you include the same function for both *-n* and *-l*, it will not be traced. *-d*:: Some tracer plugins enable the function tracer by default. Like the latency tracers. This option prevents the function tracer from being enabled at start up. *-D*:: The option *-d* will try to use the function-trace option to disable the function tracer (if available), otherwise it defaults to the proc file: /proc/sys/kernel/ftrace_enabled, but will not touch it if the function-trace option is available. The *-D* option will disable both the ftrace_enabled proc file as well as the function-trace option if it exists. Note, this disable function tracing for all users, which includes users outside of ftrace tracers (stack_tracer, perf, etc). *-O* 'option':: Ftrace has various options that can be enabled or disabled. This allows you to set them. Appending the text 'no' to an option disables it. For example: "-O nograph-time" will disable the "graph-time" Ftrace option. *-s* 'interval':: The processes that trace-cmd creates to record from the ring buffer need to wake up to do the recording. Setting the 'interval' to zero will cause the processes to wakeup every time new data is written into the buffer. But since Ftrace is recording kernel activity, the act of this processes going back to sleep may cause new events into the ring buffer which will wake the process back up. This will needlessly add extra data into the ring buffer. The 'interval' metric is microseconds. The default is set to 1000 (1 ms). This is the time each recording process will sleep before waking up to record any new data that was written to the ring buffer. *-r* 'priority':: The priority to run the capture threads at. In a busy system the trace capturing threads may be staved and events can be lost. This increases the priority of those threads to the real time (FIFO) priority. But use this option with care, it can also change the behaviour of the system being traced. *-b* 'size':: This sets the ring buffer size to 'size' kilobytes. Because the Ftrace ring buffer is per CPU, this size is the size of each per CPU ring buffer inside the kernel. Using "-b 10000" on a machine with 4 CPUs will make Ftrace have a total buffer size of 40 Megs. *-B* 'buffer-name':: If the kernel supports multiple buffers, this will add a buffer with the given name. If the buffer name already exists, that buffer is just reset and will not be deleted at the end of record execution. If the buffer is created, it will be removed at the end of execution (unless the *-k* is set, or 'start' command was used). After a buffer name is stated, all events added after that will be associated with that buffer. If no buffer is specified, or an event is specified before a buffer name, it will be associated with the main (toplevel) buffer. trace-cmd record -e sched -B block -e block -B time -e timer sleep 1 The above is will enable all sched events in the main buffer. It will then create a 'block' buffer instance and enable all block events within that buffer. A 'time' buffer instance is created and all timer events will be enabled for that event. *-m* 'size':: The max size in kilobytes that a per cpu buffer should be. Note, due to rounding to page size, the number may not be totally correct. Also, this is performed by switching between two buffers that are half the given size thus the output may not be of the given size even if much more was written. Use this to prevent running out of diskspace for long runs. *-M* 'cpumask':: Set the cpumask for to trace. It only affects the last buffer instance given. If supplied before any buffer instance, then it affects the main buffer. The value supplied must be a hex number. trace-cmd record -p function -M c -B events13 -e all -M 5 If the -M is left out, then the mask stays the same. To enable all CPUs, pass in a value of '-1'. *-k*:: By default, when trace-cmd is finished tracing, it will reset the buffers and disable all the tracing that it enabled. This option keeps trace-cmd from disabling the tracer and reseting the buffer. This option is useful for debugging trace-cmd. Note: usually trace-cmd will set the "tracing_on" file back to what it was before it was called. This option will leave that file set to zero. *-i*:: By default, if an event is listed that trace-cmd does not find, it will exit with an error. This option will just ignore events that are listed on the command line but are not found on the system. *-N* 'host:port':: If another machine is running "trace-cmd listen", this option is used to have the data sent to that machine with UDP packets. Instead of writing to an output file, the data is sent off to a remote box. This is ideal for embedded machines with little storage, or having a single machine that will keep all the data in a single repository. Note: This option is not supported with latency tracer plugins: wakeup, wakeup_rt, irqsoff, preemptoff and preemptirqsoff *-t*:: This option is used with *-N*, when there's a need to send the live data with TCP packets instead of UDP. Although TCP is not nearly as fast as sending the UDP packets, but it may be needed if the network is not that reliable, the amount of data is not that intensive, and a guarantee is needed that all traced information is transfered successfully. *-q* | *--quiet*:: For use with recording an application. Suppresses normal output (except for errors) to allow only the application's output to be displayed. *--date*:: With the *--date* option, "trace-cmd" will write timestamps into the trace buffer after it has finished recording. It will then map the timestamp to gettimeofday which will allow wall time output from the timestamps reading the created 'trace.dat' file. *--max-graph-depth* 'depth':: Set the maximum depth the function_graph tracer will trace into a function. A value of one will only show where userspace enters the kernel but not any functions called in the kernel. The default is zero, which means no limit. *--cmdlines-size* 'size':: Set the number of entries the kernel tracing file "saved_cmdlines" can contain. This file is a circular buffer which stores the mapping between cmdlines and PIDs. If full, it leads to unresolved cmdlines ("<...>") within the trace. The kernel default value is 128. *--module* 'module':: Filter a module's name in function tracing. It is equivalent to adding ':mod:module' after all other functions being filtered. If no other function filter is listed, then all modules functions will be filtered in the filter. '--module snd' is equivalent to '-l :mod:snd' '--module snd -l "*jack*"' is equivalent to '-l "*jack*:mod:snd"' '--module snd -n "*"' is equivalent to '-n :mod:snd' *--proc-map*:: Save the traced process address map into the trace.dat file. The traced processes can be specified using the option *-P*, or as a given 'command'. *--profile*:: With the *--profile* option, "trace-cmd" will enable tracing that can be used with trace-cmd-report(1) --profile option. If a tracer *-p* is not set, and function graph depth is supported by the kernel, then the function_graph tracer will be enabled with a depth of one (only show where userspace enters into the kernel). It will also enable various tracepoints with stack tracing such that the report can show where tasks have been blocked for the longest time. See trace-cmd-profile(1) for more details and examples. *-G*:: Set interrupt (soft and hard) events as global (associated to CPU instead of tasks). Only works for --profile. *-H* 'event-hooks':: Add custom event matching to connect any two events together. When not used with *--profile*, it will save the parameter and this will be used by trace-cmd report --profile, too. That is: trace-cmd record -H hrtimer_expire_entry,hrtimer/hrtimer_expire_exit,hrtimer,sp trace-cmd report --profile Will profile hrtimer_expire_entry and hrtimer_expire_ext times. See trace-cmd-profile(1) for format. *-S*:: (for --profile only) Only enable the tracer or events speficied on the command line. With this option, the function_graph tracer is not enabled, nor are any events (like sched_switch), unless they are specifically specified on the command line (i.e. -p function -e sched_switch -e sched_wakeup) *--ts-offset offset*:: Add an offset for the timestamp in the trace.dat file. This will add a offset option into the trace.dat file such that a trace-cmd report will offset all the timestamps of the events by the given offset. The offset is in raw units. That is, if the event timestamps are in nanoseconds the offset will also be in nanoseconds even if the displayed units are in microseconds. *--tsync-interval*:: Set the loop interval, in ms, for timestamps synchronization with guests: If a negative number is specified, timestamps synchronization is disabled If 0 is specified, no loop is performed - timestamps offset is calculated only twice," at the beginning and at the end of the trace. Timestamps synchronization with guests works only if there is support for VSOCK.\n" *--stderr*:: Have output go to stderr instead of stdout, but the output of the command executed will not be changed. This is useful if you want to monitor the output of the command being executed, but not see the output from trace-cmd. EXAMPLES -------- The basic way to trace all events: ------------------------------ # trace-cmd record -e all ls > /dev/null # trace-cmd report trace-cmd-13541 [003] 106260.693809: filemap_fault: address=0x128122 offset=0xce trace-cmd-13543 [001] 106260.693809: kmalloc: call_site=81128dd4 ptr=0xffff88003dd83800 bytes_req=768 bytes_alloc=1024 gfp_flags=GFP_KERNEL|GFP_ZERO ls-13545 [002] 106260.693809: kfree: call_site=810a7abb ptr=0x0 ls-13545 [002] 106260.693818: sys_exit_write: 0x1 ------------------------------ To use the function tracer with sched switch tracing: ------------------------------ # trace-cmd record -p function -e sched_switch ls > /dev/null # trace-cmd report ls-13587 [002] 106467.860310: function: hrtick_start_fair <-- pick_next_task_fair ls-13587 [002] 106467.860313: sched_switch: prev_comm=trace-cmd prev_pid=13587 prev_prio=120 prev_state=R ==> next_comm=trace-cmd next_pid=13583 next_prio=120 trace-cmd-13585 [001] 106467.860314: function: native_set_pte_at <-- __do_fault trace-cmd-13586 [003] 106467.860314: function: up_read <-- do_page_fault ls-13587 [002] 106467.860317: function: __phys_addr <-- schedule trace-cmd-13585 [001] 106467.860318: function: _raw_spin_unlock <-- __do_fault ls-13587 [002] 106467.860320: function: native_load_sp0 <-- __switch_to trace-cmd-13586 [003] 106467.860322: function: down_read_trylock <-- do_page_fault ------------------------------ Here is a nice way to find what interrupts have the highest latency: ------------------------------------------ # trace-cmd record -p function_graph -e irq_handler_entry -l do_IRQ sleep 10 # trace-cmd report -0 [000] 157412.933969: funcgraph_entry: | do_IRQ() { -0 [000] 157412.933974: irq_handler_entry: irq=48 name=eth0 -0 [000] 157412.934004: funcgraph_exit: + 36.358 us | } -0 [000] 157413.895004: funcgraph_entry: | do_IRQ() { -0 [000] 157413.895011: irq_handler_entry: irq=48 name=eth0 -0 [000] 157413.895026: funcgraph_exit: + 24.014 us | } -0 [000] 157415.891762: funcgraph_entry: | do_IRQ() { -0 [000] 157415.891769: irq_handler_entry: irq=48 name=eth0 -0 [000] 157415.891784: funcgraph_exit: + 22.928 us | } -0 [000] 157415.934869: funcgraph_entry: | do_IRQ() { -0 [000] 157415.934874: irq_handler_entry: irq=48 name=eth0 -0 [000] 157415.934906: funcgraph_exit: + 37.512 us | } -0 [000] 157417.888373: funcgraph_entry: | do_IRQ() { -0 [000] 157417.888381: irq_handler_entry: irq=48 name=eth0 -0 [000] 157417.888398: funcgraph_exit: + 25.943 us | } ------------------------------------------ An example of the profile: ------------------------------------------ # trace-cmd record --profile sleep 1 # trace-cmd report --profile --comm sleep task: sleep-21611 Event: sched_switch:R (1) Total: 99442 Avg: 99442 Max: 99442 Min:99442 1 total:99442 min:99442 max:99442 avg=99442 => ftrace_raw_event_sched_switch (0xffffffff8105f812) => __schedule (0xffffffff8150810a) => preempt_schedule (0xffffffff8150842e) => ___preempt_schedule (0xffffffff81273354) => cpu_stop_queue_work (0xffffffff810b03c5) => stop_one_cpu (0xffffffff810b063b) => sched_exec (0xffffffff8106136d) => do_execve_common.isra.27 (0xffffffff81148c89) => do_execve (0xffffffff811490b0) => SyS_execve (0xffffffff811492c4) => return_to_handler (0xffffffff8150e3c8) => stub_execve (0xffffffff8150c699) Event: sched_switch:S (1) Total: 1000506680 Avg: 1000506680 Max: 1000506680 Min:1000506680 1 total:1000506680 min:1000506680 max:1000506680 avg=1000506680 => ftrace_raw_event_sched_switch (0xffffffff8105f812) => __schedule (0xffffffff8150810a) => schedule (0xffffffff815084b8) => do_nanosleep (0xffffffff8150b22c) => hrtimer_nanosleep (0xffffffff8108d647) => SyS_nanosleep (0xffffffff8108d72c) => return_to_handler (0xffffffff8150e3c8) => tracesys_phase2 (0xffffffff8150c304) Event: sched_wakeup:21611 (1) Total: 30326 Avg: 30326 Max: 30326 Min:30326 1 total:30326 min:30326 max:30326 avg=30326 => ftrace_raw_event_sched_wakeup_template (0xffffffff8105f653) => ttwu_do_wakeup (0xffffffff810606eb) => ttwu_do_activate.constprop.124 (0xffffffff810607c8) => try_to_wake_up (0xffffffff8106340a) ------------------------------------------ SEE ALSO -------- trace-cmd(1), trace-cmd-report(1), trace-cmd-start(1), trace-cmd-stop(1), trace-cmd-extract(1), trace-cmd-reset(1), trace-cmd-split(1), trace-cmd-list(1), trace-cmd-listen(1), trace-cmd-profile(1) AUTHOR ------ Written by Steven Rostedt, RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2010 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd-report.1.txt000066400000000000000000000555771414302661500243220ustar00rootroot00000000000000TRACE-CMD-REPORT(1) =================== NAME ---- trace-cmd-report - show in ASCII a trace created by trace-cmd record SYNOPSIS -------- *trace-cmd report* ['OPTIONS'] ['input-file'] DESCRIPTION ----------- The trace-cmd(1) report command will output a human readable report of a trace created by trace-cmd record. OPTIONS ------- *-i* 'input-file':: By default, trace-cmd report will read the file 'trace.dat'. But the *-i* option open up the given 'input-file' instead. Note, the input file may also be specified as the last item on the command line. *-e*:: This outputs the endianess of the file. trace-cmd report is smart enough to be able to read big endian files on little endian machines, and vise versa. *-f*:: This outputs the list of all functions that have been mapped in the trace.dat file. Note, this list may contain functions that may not appear in the trace, as it is the list of mappings to translate function addresses into function names. *-P*:: This outputs the list of "trace_printk()" data. The raw trace data points to static pointers in the kernel. This must be stored in the trace.dat file. *-E*:: This lists the possible events in the file (but this list is not necessarily the list of events in the file). *--events*:: This will list the event formats that are stored in the trace.dat file. *--event* regex:: This will print events that match the given regex. If a colon is specified, then the characters before the colon will be used to match the system and the characters after the colon will match the event. trace-cmd report --event sys:read The above will only match events where the system name contains "sys" and the event name contains "read". trace-cmd report --event read The above will match all events that contain "read" in its name. Also it may list all events of a system that contains "read" as well. *--check-events*:: This will parse the event format strings that are stored in the trace.dat file and return whether the formats can be parsed correctly. It will load plugins unless *-N* is specified. *-t*:: Print the full timestamp. The timestamps in the data file are usually recorded to the nanosecond. But the default display of the timestamp is only to the microsecond. To see the full timestamp, add the *-t* option. *-F* 'filter':: Add a filter to limit what events are displayed. The format of the filter is: ------------------------------------------ ':' = SYSTEM'/'EVENT | SYSTEM | EVENT | ',' = EVENT_FIELD | '&&' | '||' | '(' ')' | '!' = '==' | '!=' | '>=' | '<=' | '>' | '<' | '&' | '|' | '^' | '+' | '-' | '*' | '/' | '%' = NUM | STRING | EVENT_FIELD ------------------------------------------ SYSTEM is the name of the system to filter on. If the EVENT is left out, then it applies to all events under the SYSTEM. If only one string is used without the '/' to deliminate between SYSTEM and EVENT, then the filter will be applied to all systems and events that match the given string. Whitespace is ignored, such that "sched:next_pid==123" is equivalent to "sched : next_pid == 123". STRING is defined with single or double quotes (single quote must end with single quote, and double with double). Whitespace within quotes are not ignored. The representation of a SYSTEM or EVENT may also be a regular expression as defined by 'regcomp(3)'. The EVENT_FIELD is the name of the field of an event that is being filtered. If the event does not contain the EVENT_FIELD, that part of the equation will be considered false. ------------------------------------------ -F 'sched : bogus == 1 || common_pid == 2' ------------------------------------------ The "bogus == 1" will always evaluate to FALSE because no event has a field called "bogus", but the "common_pid == 2" will still be evaluated since all events have the field "common_pid". Any "sched" event that was traced by the process with the PID of 2 will be shown. Note, the EVENT_FIELD is the field name as shown by an events format (as displayed with *--events*), and not what is found in the output. If the output shows "ID:foo" but the field that "foo" belongs to was called "name" in the event format, then "name" must be used in the filter. The same is true about values. If the value that is displayed is converted by to a string symbol, the filter checks the original value and not the value displayed. For example, to filter on all tasks that were in the running state at a context switch: ------------------------------------------ -F 'sched/sched_switch : prev_state==0' ------------------------------------------ Although the output displays 'R', having 'prev_stat=="R"' will not work. Note: You can also specify 'COMM' as an EVENT_FIELD. This will use the task name (or comm) of the record to compare. For example, to filter out all of the "trace-cmd" tasks: ------------------------------------------ -F '.*:COMM != "trace-cmd"' ------------------------------------------ *-I*:: Do not print events where the HARDIRQ latency flag is set. This will filter out most events that are from interrupt context. Note, it may not filter out function traced functions that are in interrupt context but were called before the kernel "in interrupt" flag was set. *-S*:: Do not print events where the SOFTIRQ latency flag is set. This will filter out most events that are from soft interrupt context. *-v*:: This causes the following filters of *-F* to filter out the matching events. ------------------------------------------ -v -F 'sched/sched_switch : prev_state == 0' ------------------------------------------ Will not display any sched_switch events that have a prev_state of 0. Removing the *-v* will only print out those events. *-T*:: Test the filters of -F. After processing a filter string, the resulting filter will be displayed for each event. This is useful for using a filter for more than one event where a field may not exist in all events. Also it can be used to make sure there are no misspelled event field names, as they will simply be ignored. *-T* is ignored if *-F* is not specified. *-V*:: Show the plugins that are loaded. *-L*:: This will not load system wide plugins. It loads "local only". That is what it finds in the ~/.trace-cmd/plugins directory. *-N*:: This will not load any plugins. *-n* 'event-re':: This will cause all events that match the option to ignore any registered handler (by the plugins) to print the event. The normal event will be printed instead. The 'event-re' is a regular expression as defined by 'regcomp(3)'. *--profile*:: With the *--profile* option, "trace-cmd report" will process all the events first, and then output a format showing where tasks have spent their time in the kernel, as well as where they are blocked the most, and where wake up latencies are. See trace-cmd-profile(1) for more details and examples. *-G*:: Set interrupt (soft and hard) events as global (associated to CPU instead of tasks). Only works for --profile. *-H* 'event-hooks':: Add custom event matching to connect any two events together. See trace-cmd-profile(1) for format. *-R*:: This will show the events in "raw" format. That is, it will ignore the event's print formatting and just print the contents of each field. *-r* 'event-re':: This will cause all events that match the option to print its raw fields. The 'event-re' is a regular expression as defined by 'regcomp(3)'. *-l*:: This adds a "latency output" format. Information about interrupts being disabled, soft irq being disabled, the "need_resched" flag being set, preempt count, and big kernel lock are all being recorded with every event. But the default display does not show this information. This option will set display this information with 6 characters. When one of the fields is zero or N/A a \'.\' is shown. ------------------------------------------ -0 0d.h1. 106467.859747: function: ktime_get <-- tick_check_idle ------------------------------------------ The 0d.h1. denotes this information. The first character is never a '.' and represents what CPU the trace was recorded on (CPU 0). The 'd' denotes that interrupts were disabled. The 'h' means that this was called inside an interrupt handler. The '1' is the preemption disabled (preempt_count) was set to one. The two '.'s are "need_resched" flag and kernel lock counter. If the "need_resched" flag is set, then that character would be a 'N'. *-w*:: If both the 'sched_switch' and 'sched_wakeup' events are enabled, then this option will report the latency between the time the task was first woken, and the time it was scheduled in. *-q*:: Quiet non critical warnings. *-O*:: Pass options to the trace-cmd plugins that are loaded. -O plugin:var=value The 'plugin:' and '=value' are optional. Value may be left off for options that are boolean. If the 'plugin:' is left off, then any variable that matches in all plugins will be set. Example: -O fgraph:tailprint *--cpu* :: List of CPUs, separated by "," or ":", used for filtering the events. A range of CPUs can be specified using "cpuX-cpuY" notation, where all CPUs in the range between cpuX and cpuY will be included in the list. The order of CPUs in the list must be from lower to greater. Example: "--cpu 0,3" - show events from CPUs 0 and 3 "--cpu 2-4" - show events from CPUs 2, 3 and 4 *--stat*:: If the trace.dat file recorded the final stats (outputed at the end of record) the *--stat* option can be used to retrieve them. *--uname*:: If the trace.dat file recorded uname during the run, this will retrieve that information. *--version*:: If the trace.dat file recorded the version of the executable used to create it, report that version. *--ts-offset* offset:: Add (or subtract if negative) an offset for all timestamps of the previous data file specified with *-i*. This is useful to merge sort multiple trace.dat files where the difference in the timestamp is known. For example if a trace is done on a virtual guest, and another trace is done on the host. If the host timestamp is 1000 units ahead of the guest, the following can be done: trace-cmd report -i host.dat --ts-offset -1000 -i guest.dat This will subtract 1000 timestamp units from all the host events as it merges with the guest.dat events. Note, the units is for the raw units recorded in the trace. If the units are nanoseconds, the addition (or subtraction) from the offset will be nanoseconds even if the displayed units are microseconds. *--ts2secs* HZ:: Convert the current clock source into a second (nanosecond resolution) output. When using clocks like x86-tsc, if the frequency is known, by passing in the clock frequency, this will convert the time to seconds. This option affects any trace.dat file given with *-i* proceeding it. If this option comes before any *-i* option, then that value becomes the default conversion for all other trace.dat files. If another --ts2secs option appears after a *-i* trace.dat file, than that option will override the default value. Example: On a 3.4 GHz machine trace-cmd record -p function -C x86-tsc trace-cmd report --ts2ns 3400000000 The report will convert the cycles timestamps into a readable second display. The default display resolution is microseconds, unless *-t* is used. The value of --ts-offset must still be in the raw timestamp units, even with this option. The offset will be converted as well. *--ts-diff*:: Show the time differences between events. The difference will appear in parenthesis just after the timestamp. *--ts-check*:: Make sure no timestamp goes backwards, and if it does, print out a warning message of the fact. EXAMPLES -------- Using a trace.dat file that was created with: ------------------------------------------ # trace-cmd record -p function -e all sleep 5 ------------------------------------------ The default report shows: ------------------------------------------ # trace-cmd report trace-cmd-16129 [002] 158126.498411: function: __mutex_unlock_slowpath <-- mutex_unlock trace-cmd-16131 [000] 158126.498411: kmem_cache_alloc: call_site=811223c5 ptr=0xffff88003ecf2b40 bytes_req=272 bytes_alloc=320 gfp_flags=GFP_KERNEL|GFP_ZERO trace-cmd-16130 [003] 158126.498411: function: do_splice_to <-- sys_splice sleep-16133 [001] 158126.498412: function: inotify_inode_queue_event <-- vfs_write trace-cmd-16129 [002] 158126.498420: lock_release: 0xffff88003f1fa4f8 &sb->s_type->i_mutex_key trace-cmd-16131 [000] 158126.498421: function: security_file_alloc <-- get_empty_filp sleep-16133 [001] 158126.498422: function: __fsnotify_parent <-- vfs_write trace-cmd-16130 [003] 158126.498422: function: rw_verify_area <-- do_splice_to trace-cmd-16131 [000] 158126.498424: function: cap_file_alloc_security <-- security_file_alloc trace-cmd-16129 [002] 158126.498425: function: syscall_trace_leave <-- int_check_syscall_exit_work sleep-16133 [001] 158126.498426: function: inotify_dentry_parent_queue_event <-- vfs_write trace-cmd-16130 [003] 158126.498426: function: security_file_permission <-- rw_verify_area trace-cmd-16129 [002] 158126.498428: function: audit_syscall_exit <-- syscall_trace_leave [...] ------------------------------------------ To see everything but the function traces: ------------------------------------------ # trace-cmd report -v -F 'function' trace-cmd-16131 [000] 158126.498411: kmem_cache_alloc: call_site=811223c5 ptr=0xffff88003ecf2b40 bytes_req=272 bytes_alloc=320 gfp_flags=GFP_KERNEL|GFP_ZERO trace-cmd-16129 [002] 158126.498420: lock_release: 0xffff88003f1fa4f8 &sb->s_type->i_mutex_key trace-cmd-16130 [003] 158126.498436: lock_acquire: 0xffffffff8166bf78 read all_cpu_access_lock trace-cmd-16131 [000] 158126.498438: lock_acquire: 0xffff88003df5b520 read &fs->lock trace-cmd-16129 [002] 158126.498446: kfree: call_site=810a7abb ptr=0x0 trace-cmd-16130 [003] 158126.498448: lock_acquire: 0xffff880002250a80 &per_cpu(cpu_access_lock, cpu) trace-cmd-16129 [002] 158126.498450: sys_exit_splice: 0xfffffff5 trace-cmd-16131 [000] 158126.498454: lock_release: 0xffff88003df5b520 &fs->lock sleep-16133 [001] 158126.498456: kfree: call_site=810a7abb ptr=0x0 sleep-16133 [001] 158126.498460: sys_exit_write: 0x1 trace-cmd-16130 [003] 158126.498462: kmalloc: call_site=810bf95b ptr=0xffff88003dedc040 bytes_req=24 bytes_alloc=32 gfp_flags=GFP_KERNEL|GFP_ZERO ------------------------------------------ To see only the kmalloc calls that were greater than 1000 bytes: ------------------------------------------ #trace-cmd report -F 'kmalloc: bytes_req > 1000' -0 [000] 158128.126641: kmalloc: call_site=81330635 ptr=0xffff88003c2fd000 bytes_req=2096 bytes_alloc=4096 gfp_flags=GFP_ATOMIC ------------------------------------------ To see wakeups and sched switches that left the previous task in the running state: ------------------------------------------ # trace-cmd report -F 'sched: prev_state == 0 || (success == 1)' trace-cmd-16132 [002] 158126.499951: sched_wakeup: comm=trace-cmd pid=16129 prio=120 success=1 target_cpu=002 trace-cmd-16132 [002] 158126.500401: sched_switch: prev_comm=trace-cmd prev_pid=16132 prev_prio=120 prev_state=R ==> next_comm=trace-cmd next_pid=16129 next_prio=120 -0 [003] 158126.500585: sched_wakeup: comm=trace-cmd pid=16130 prio=120 success=1 target_cpu=003 -0 [003] 158126.501241: sched_switch: prev_comm=swapper prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=trace-cmd next_pid=16130 next_prio=120 trace-cmd-16132 [000] 158126.502475: sched_wakeup: comm=trace-cmd pid=16131 prio=120 success=1 target_cpu=000 trace-cmd-16131 [002] 158126.506516: sched_wakeup: comm=trace-cmd pid=16129 prio=120 success=1 target_cpu=002 -0 [003] 158126.550110: sched_switch: prev_comm=swapper prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=trace-cmd next_pid=16130 next_prio=120 trace-cmd-16131 [003] 158126.570243: sched_wakeup: comm=trace-cmd pid=16129 prio=120 success=1 target_cpu=003 trace-cmd-16130 [002] 158126.618202: sched_switch: prev_comm=trace-cmd prev_pid=16130 prev_prio=120 prev_state=R ==> next_comm=yum-updatesd next_pid=3088 next_prio=1 20 trace-cmd-16129 [003] 158126.622379: sched_wakeup: comm=trace-cmd pid=16131 prio=120 success=1 target_cpu=003 trace-cmd-16129 [000] 158126.649287: sched_wakeup: comm=trace-cmd pid=16131 prio=120 success=1 target_cpu=000 ------------------------------------------ The above needs a little explanation. The filter specifies the "sched" subsystem, which includes both sched_switch and sched_wakeup events. Any event that does not have the format field "prev_state" or "success", will evaluate those expressions as FALSE, and will not produce a match. Using "||" will have the "prev_state" test happen for the "sched_switch" event and the "success" test happen for the "sched_wakeup" event. ------------------------------------------ # trace-cmd report -w -F 'sched_switch, sched_wakeup.*' [...] trace-cmd-16130 [003] 158131.580616: sched_wakeup: comm=trace-cmd pid=16131 prio=120 success=1 target_cpu=003 trace-cmd-16129 [000] 158131.581502: sched_switch: prev_comm=trace-cmd prev_pid=16129 prev_prio=120 prev_state=S ==> next_comm=trace-cmd next_pid=16131 next_prio=120 Latency: 885.901 usecs trace-cmd-16131 [000] 158131.582414: sched_wakeup: comm=trace-cmd pid=16129 prio=120 success=1 target_cpu=000 trace-cmd-16132 [001] 158131.583219: sched_switch: prev_comm=trace-cmd prev_pid=16132 prev_prio=120 prev_state=S ==> next_comm=trace-cmd next_pid=16129 next_prio=120 Latency: 804.809 usecs sleep-16133 [002] 158131.584121: sched_wakeup: comm=trace-cmd pid=16120 prio=120 success=1 target_cpu=002 trace-cmd-16129 [001] 158131.584128: sched_wakeup: comm=trace-cmd pid=16132 prio=120 success=1 target_cpu=001 sleep-16133 [002] 158131.584275: sched_switch: prev_comm=sleep prev_pid=16133 prev_prio=120 prev_state=R ==> next_comm=trace-cmd next_pid=16120 next_prio=120 Latency: 153.915 usecs trace-cmd-16130 [003] 158131.585284: sched_switch: prev_comm=trace-cmd prev_pid=16130 prev_prio=120 prev_state=S ==> next_comm=trace-cmd next_pid=16132 next_prio=120 Latency: 1155.677 usecs Average wakeup latency: 26626.656 usecs ------------------------------------------ The above trace produces the wakeup latencies of the tasks. The "sched_switch" event reports each individual latency after writing the event information. At the end of the report, the average wakeup latency is reported. ------------------------------------------ # trace-cmd report -w -F 'sched_switch, sched_wakeup.*: prio < 100 || next_prio < 100' -0 [003] 158131.516753: sched_wakeup: comm=ksoftirqd/3 pid=13 prio=49 success=1 target_cpu=003 -0 [003] 158131.516855: sched_switch: prev_comm=swapper prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/3 next_pid=13 next_prio=49 Latency: 101.244 usecs -0 [003] 158131.533781: sched_wakeup: comm=ksoftirqd/3 pid=13 prio=49 success=1 target_cpu=003 -0 [003] 158131.533897: sched_switch: prev_comm=swapper prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/3 next_pid=13 next_prio=49 Latency: 115.608 usecs -0 [003] 158131.569730: sched_wakeup: comm=ksoftirqd/3 pid=13 prio=49 success=1 target_cpu=003 -0 [003] 158131.569851: sched_switch: prev_comm=swapper prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/3 next_pid=13 next_prio=49 Latency: 121.024 usecs Average wakeup latency: 110.021 usecs ------------------------------------------ The above version will only show the wakeups and context switches of Real Time tasks. The 'prio' used inside the kernel starts at 0 for highest priority. That is 'prio' 0 is equivalent to user space real time priority 99, and priority 98 is equivalent to user space real time priority 1. Prios less than 100 represent Real Time tasks. An example of the profile: ------------------------------------------ # trace-cmd record --profile sleep 1 # trace-cmd report --profile --comm sleep task: sleep-21611 Event: sched_switch:R (1) Total: 99442 Avg: 99442 Max: 99442 Min:99442 1 total:99442 min:99442 max:99442 avg=99442 => ftrace_raw_event_sched_switch (0xffffffff8105f812) => __schedule (0xffffffff8150810a) => preempt_schedule (0xffffffff8150842e) => ___preempt_schedule (0xffffffff81273354) => cpu_stop_queue_work (0xffffffff810b03c5) => stop_one_cpu (0xffffffff810b063b) => sched_exec (0xffffffff8106136d) => do_execve_common.isra.27 (0xffffffff81148c89) => do_execve (0xffffffff811490b0) => SyS_execve (0xffffffff811492c4) => return_to_handler (0xffffffff8150e3c8) => stub_execve (0xffffffff8150c699) Event: sched_switch:S (1) Total: 1000506680 Avg: 1000506680 Max: 1000506680 Min:1000506680 1 total:1000506680 min:1000506680 max:1000506680 avg=1000506680 => ftrace_raw_event_sched_switch (0xffffffff8105f812) => __schedule (0xffffffff8150810a) => schedule (0xffffffff815084b8) => do_nanosleep (0xffffffff8150b22c) => hrtimer_nanosleep (0xffffffff8108d647) => SyS_nanosleep (0xffffffff8108d72c) => return_to_handler (0xffffffff8150e3c8) => tracesys_phase2 (0xffffffff8150c304) Event: sched_wakeup:21611 (1) Total: 30326 Avg: 30326 Max: 30326 Min:30326 1 total:30326 min:30326 max:30326 avg=30326 => ftrace_raw_event_sched_wakeup_template (0xffffffff8105f653) => ttwu_do_wakeup (0xffffffff810606eb) => ttwu_do_activate.constprop.124 (0xffffffff810607c8) => try_to_wake_up (0xffffffff8106340a) ------------------------------------------ SEE ALSO -------- trace-cmd(1), trace-cmd-record(1), trace-cmd-start(1), trace-cmd-stop(1), trace-cmd-extract(1), trace-cmd-reset(1), trace-cmd-split(1), trace-cmd-list(1), trace-cmd-listen(1), trace-cmd-profile(1) AUTHOR ------ Written by Steven Rostedt, RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2010 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd-reset.1.txt000066400000000000000000000074401414302661500241130ustar00rootroot00000000000000TRACE-CMD-RESET(1) ================== NAME ---- trace-cmd-reset - turn off all Ftrace tracing to bring back full performance SYNOPSIS -------- *trace-cmd reset* ['OPTIONS'] DESCRIPTION ----------- The trace-cmd(1) reset command turns off all tracing of Ftrace. This will bring back the performance of the system before tracing was enabled. This is necessary since 'trace-cmd-record(1)', 'trace-cmd-stop(1)' and 'trace-cmd-extract(1)' do not disable the tracer, event after the data has been pulled from the buffers. The rational is that the user may want to manually enable the tracer with the Ftrace pseudo file system, or examine other parts of Ftrace to see what trace-cmd did. After the reset command happens, the data in the ring buffer, and the options that were used are all lost. OPTIONS ------- Please note that the order that options are specified on the command line is significant. See EXAMPLES. *-b* 'buffer_size':: When the kernel boots, the Ftrace ring buffer is of a minimal size (3 pages per CPU). The first time the tracer is used, the ring buffer size expands to what it was set for (default 1.4 Megs per CPU). If no more tracing is to be done, this option allows you to shrink the ring buffer down to free up available memory. trace-cmd reset -b 1 The buffer instance affected is the one (or ones) specified by the most recently preceding *-B*, *-t*, or *-a* option: When used after *-B*, resizes the buffer instance that precedes it on the command line. When used after *-a*, resizes all buffer instances except the top one. When used after *-t* or before any *-B* or *-a*, resizes the top instance. *-B* 'buffer-name':: If the kernel supports multiple buffers, this will reset the trace for only the given buffer. It does not affect any other buffer. This may be used multiple times to specify different buffers. The top level buffer will not be reset if this option is given (unless the *-t* option is also supplied). *-a*:: Reset the trace for all existing buffer instances. When this option is used, the top level instance will not be reset unless *-t* is given. *-d*:: This option deletes the instance buffer(s) specified by the most recently preceding *-B* or *-a* option. Because the top-level instance buffer cannot be deleted, it is invalid to use this immediatly following *-t* or prior to any *-B* or *-a* option on the command line. *-t*:: Resets the top level instance buffer. Without the *-B* or *-a* option this is the same as the default. But if *-B* or *-a* is used, this is required if the top level instance buffer should also be reset. EXAMPLES -------- Reset tracing for instance-one and set its per-cpu buffer size to 4096kb. Also deletes instance-two. The top level instance and any other instances remain unaffected: trace-cmd reset -B instance-one -b 4096 -B instance-two -d Delete all instance buffers. Top level instance remains unaffected: trace-cmd reset -a -d Delete all instance buffers and also reset the top instance: trace-cmd reset -t -a -d Invalid. This command implies an attempt to delete the top instance: trace-cmd reset -a -t -d Reset the top instance and set its per-cpu buffer size to 1024kb. If any instance buffers exist, they will be unaffected: trace-cmd reset -b 1024 SEE ALSO -------- trace-cmd(1), trace-cmd-record(1), trace-cmd-report(1), trace-cmd-start(1), trace-cmd-stop(1), trace-cmd-extract(1), trace-cmd-split(1), trace-cmd-list(1), trace-cmd-listen(1) AUTHOR ------ Written by Steven Rostedt, RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2010 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd-restore.1.txt000066400000000000000000000077411414302661500244600ustar00rootroot00000000000000TRACE-CMD-RESTORE(1) ==================== NAME ---- trace-cmd-restore - restore a failed trace record SYNOPSIS -------- *trace-cmd restore* ['OPTIONS'] ['command'] cpu-file [cpu-file ...] DESCRIPTION ----------- The trace-cmd(1) restore command will restore a crashed trace-cmd-record(1) file. If for some reason a trace-cmd record fails, it will leave a the per-cpu data files and not create the final trace.dat file. The trace-cmd restore will append the files to create a working trace.dat file that can be read with trace-cmd-report(1). When trace-cmd record runs, it spawns off a process per CPU and writes to a per cpu file usually called 'trace.dat.cpuX', where X represents the CPU number that it is tracing. If the -o option was used in the trace-cmd record, then the CPU data files will have that name instead of the 'trace.dat' name. If a unexpected crash occurs before the tracing is finished, then the per CPU files will still exist but there will not be any trace.dat file to read from. trace-cmd restore will allow you to create a trace.dat file with the existing data files. OPTIONS ------- *-c*:: Create a partial trace.dat file from the machine, to be used with a full trace-cmd restore at another time. This option is useful for embedded devices. If a server contains the cpu files of a crashed trace-cmd record (or trace-cmd listen), trace-cmd restore can be executed on the embedded device with the -c option to get all the stored information of that embedded device. Then the file created could be copied to the server to run the trace-cmd restore there with the cpu files. If *-o* is not specified, then the file created will be called 'trace-partial.dat'. This is because the file is not a full version of something that trace-cmd-report(1) could use. *-t* tracing_dir:: Used with *-c*, it overrides the location to read the events from. By default, tracing information is read from the debugfs/tracing directory. *-t* will use that location instead. This can be useful if the trace.dat file to create is from another machine. Just tar -cvf events.tar debugfs/tracing and copy and untar that file locally, and use that directory instead. *-k* kallsyms:: Used with *-c*, it overrides where to read the kallsyms file from. By default, /proc/kallsyms is used. *-k* will override the file to read the kallsyms from. This can be useful if the trace.dat file to create is from another machine. Just copy the /proc/kallsyms file locally, and use *-k* to point to that file. *-o* output':: By default, trace-cmd restore will create a 'trace.dat' file (or 'trace-partial.dat' if *-c* is specified). You can specify a different file to write to with the *-o* option. *-i* input:: By default, trace-cmd restore will read the information of the current system to create the initial data stored in the 'trace.dat' file. If the crash was on another machine, then that machine should have the trace-cmd restore run with the *-c* option to create the trace.dat partial file. Then that file can be copied to the current machine where trace-cmd restore will use *-i* to load that file instead of reading from the current system. EXAMPLES -------- If a crash happened on another box, you could run: $ trace-cmd restore -c -o box-partial.dat Then on the server that has the cpu files: $ trace-cmd restore -i box-partial.dat trace.dat.cpu0 trace.dat.cpu1 This would create a trace.dat file for the embedded box. SEE ALSO -------- trace-cmd(1), trace-cmd-record(1), trace-cmd-report(1), trace-cmd-start(1), trace-cmd-stop(1), trace-cmd-extract(1), trace-cmd-reset(1), trace-cmd-split(1), trace-cmd-list(1), trace-cmd-listen(1) AUTHOR ------ Written by Steven Rostedt, RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2010 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd-set.1.txt000066400000000000000000000246141414302661500235660ustar00rootroot00000000000000TRACE-CMD-SET(1) ================ NAME ---- trace-cmd-set - set a configuration parameter of the Ftrace Linux internal tracer SYNOPSIS -------- *trace-cmd set* ['OPTIONS'] ['command'] DESCRIPTION ----------- The trace-cmd(1) set command will set a configuration parameter of the Ftrace Linux kernel tracer. The specified *command* will be run after the ftrace state is set. The configured ftrace state can be restored to default using the trace-cmd-reset(1) command. OPTIONS ------- *-p* 'tracer':: Specify a tracer. Tracers usually do more than just trace an event. Common tracers are: *function*, *function_graph*, *preemptirqsoff*, *irqsoff*, *preemptoff* and *wakeup*. A tracer must be supported by the running kernel. To see a list of available tracers, see trace-cmd-list(1). *-e* 'event':: Specify an event to trace. Various static trace points have been added to the Linux kernel. They are grouped by subsystem where you can enable all events of a given subsystem or specify specific events to be enabled. The 'event' is of the format "subsystem:event-name". You can also just specify the subsystem without the ':event-name' or the event-name without the "subsystem:". Using "-e sched_switch" will enable the "sched_switch" event where as, "-e sched" will enable all events under the "sched" subsystem. The 'event' can also contain glob expressions. That is, "*stat*" will select all events (or subsystems) that have the characters "stat" in their names. The keyword 'all' can be used to enable all events. *-T*:: Enable a stacktrace on each event. For example: -0 [003] 58549.289091: sched_switch: kworker/0:1:0 [120] R ==> trace-cmd:2603 [120] -0 [003] 58549.289092: kernel_stack: => schedule (ffffffff814b260e) => cpu_idle (ffffffff8100a38c) => start_secondary (ffffffff814ab828) *--func-stack*:: Enable a stack trace on all functions. Note this is only applicable for the "function" plugin tracer, and will only take effect if the -l option is used and succeeds in limiting functions. If the function tracer is not filtered, and the stack trace is enabled, you can live lock the machine. *-f* 'filter':: Specify a filter for the previous event. This must come after a *-e*. This will filter what events get recorded based on the content of the event. Filtering is passed to the kernel directly so what filtering is allowed may depend on what version of the kernel you have. Basically, it will let you use C notation to check if an event should be processed or not. ---------------------------------------- ==, >=, <=, >, <, &, |, && and || ---------------------------------------- The above are usually safe to use to compare fields. *-R* 'trigger':: Specify a trigger for the previous event. This must come after a *-e*. This will add a given trigger to the given event. To only enable the trigger and not the event itself, then place the event after the *-v* option. See Documentation/trace/events.txt in the Linux kernel source for more information on triggers. *-v*:: This will negate options specified after it on the command line. It affects: [verse] -- *-e*: Causes all specified events to not be traced. This is useful for selecting a subsystem to be traced but to leave out various events. For example: "-e sched -v -e "\*stat\*"" will enable all events in the sched subsystem except those that have "stat" in their names. *-B*: Deletes the specified ftrace instance. There must be no configuration options related to this instance in the command line. For example: "-v -B bar -B foo" will delete instance bar and create a new instance foo. Note: the *-v* option was taken from the way grep(1) inverts the following matches. -- *-P* 'pid':: This will filter only the specified process IDs. Using *-P* will let you trace only events that are caused by the process. *-c*:: Used *-P* to trace the process' children too (if kernel supports it). *--user*:: Execute the specified *command* as given user. *-C* 'clock':: Set the trace clock to "clock". Use trace-cmd(1) list -C to see what clocks are available. *-l* 'function-name':: This will limit the 'function' and 'function_graph' tracers to only trace the given function name. More than one *-l* may be specified on the command line to trace more than one function. The limited use of glob expressions are also allowed. These are 'match\*' to only filter functions that start with 'match'. '\*match' to only filter functions that end with 'match'. '\*match\*' to only filter on functions that contain 'match'. *-g* 'function-name':: This option is for the function_graph plugin. It will graph the given function. That is, it will only trace the function and all functions that it calls. You can have more than one *-g* on the command line. *-n* 'function-name':: This has the opposite effect of *-l*. The function given with the *-n* option will not be traced. This takes precedence, that is, if you include the same function for both *-n* and *-l*, it will not be traced. *-d*:: Some tracer plugins enable the function tracer by default. Like the latency tracers. This option prevents the function tracer from being enabled at start up. *-D*:: The option *-d* will try to use the function-trace option to disable the function tracer (if available), otherwise it defaults to the proc file: /proc/sys/kernel/ftrace_enabled, but will not touch it if the function-trace option is available. The *-D* option will disable both the ftrace_enabled proc file as well as the function-trace option if it exists. Note, this disable function tracing for all users, which includes users outside of ftrace tracers (stack_tracer, perf, etc). *-O* 'option':: Ftrace has various options that can be enabled or disabled. This allows you to set them. Appending the text 'no' to an option disables it. For example: "-O nograph-time" will disable the "graph-time" Ftrace option. *-b* 'size':: This sets the ring buffer size to 'size' kilobytes. Because the Ftrace ring buffer is per CPU, this size is the size of each per CPU ring buffer inside the kernel. Using "-b 10000" on a machine with 4 CPUs will make Ftrace have a total buffer size of 40 Megs. *-B* 'buffer-name':: If the kernel supports multiple buffers, this will add a buffer with the given name. If the buffer name already exists, that buffer is just reset. After a buffer name is stated, all events added after that will be associated with that buffer. If no buffer is specified, or an event is specified before a buffer name, it will be associated with the main (toplevel) buffer. trace-cmd set -e sched -B block -e block -B time -e timer sleep 1 The above is will enable all sched events in the main buffer. It will then create a 'block' buffer instance and enable all block events within that buffer. A 'time' buffer instance is created and all timer events will be enabled for that event. *-m* 'size':: The max size in kilobytes that a per cpu buffer should be. Note, due to rounding to page size, the number may not be totally correct. Also, this is performed by switching between two buffers that are half the given size thus the output may not be of the given size even if much more was written. Use this to prevent running out of diskspace for long runs. *-M* 'cpumask':: Set the cpumask for to trace. It only affects the last buffer instance given. If supplied before any buffer instance, then it affects the main buffer. The value supplied must be a hex number. trace-cmd set -p function -M c -B events13 -e all -M 5 If the -M is left out, then the mask stays the same. To enable all CPUs, pass in a value of '-1'. *-i*:: By default, if an event is listed that trace-cmd does not find, it will exit with an error. This option will just ignore events that are listed on the command line but are not found on the system. *-q* | *--quiet*:: Suppresses normal output, except for errors. *--max-graph-depth* 'depth':: Set the maximum depth the function_graph tracer will trace into a function. A value of one will only show where userspace enters the kernel but not any functions called in the kernel. The default is zero, which means no limit. *--cmdlines-size* 'size':: Set the number of entries the kernel tracing file "saved_cmdlines" can contain. This file is a circular buffer which stores the mapping between cmdlines and PIDs. If full, it leads to unresolved cmdlines ("<...>") within the trace. The kernel default value is 128. *--module* 'module':: Filter a module's name in function tracing. It is equivalent to adding ':mod:module' after all other functions being filtered. If no other function filter is listed, then all modules functions will be filtered in the filter. '--module snd' is equivalent to '-l :mod:snd' '--module snd -l "*jack*"' is equivalent to '-l "*jack*:mod:snd"' '--module snd -n "*"' is equivalent to '-n :mod:snd' *--stderr*:: Have output go to stderr instead of stdout, but the output of the command executed will not be changed. This is useful if you want to monitor the output of the command being executed, but not see the output from trace-cmd. *--fork*:: If a command is listed, then trace-cmd will wait for that command to finish, unless the *--fork* option is specified. Then it will fork the command and return immediately. EXAMPLES -------- Enable all events for tracing: ------------------------------ # trace-cmd set -e all ------------------------------ Set the function tracer: ------------------------------ # trace-cmd set -p function ------------------------------ SEE ALSO -------- trace-cmd(1), trace-cmd-report(1), trace-cmd-start(1), trace-cmd-stop(1), trace-cmd-extract(1), trace-cmd-reset(1), trace-cmd-split(1), trace-cmd-list(1), trace-cmd-listen(1), trace-cmd-profile(1) AUTHOR ------ Written by Tzvetomir Stoyanov (VMware) RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2010 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd-show.1.txt000066400000000000000000000053141414302661500237470ustar00rootroot00000000000000TRACE-CMD-SHOW(1) ================= NAME ---- trace-cmd-show - show the contents of the Ftrace Linux kernel tracing buffer. SYNOPSIS -------- *trace-cmd show* ['OPTIONS'] DESCRIPTION ----------- The trace-cmd(1) show displays the contents of one of the Ftrace Linux kernel tracing files: trace, snapshot, or trace_pipe. It is basically the equivalent of doing: cat /sys/kernel/debug/tracing/trace OPTIONS ------- *-p*:: Instead of displaying the contents of the "trace" file, use the "trace_pipe" file. The difference between the two is that the "trace" file is static. That is, if tracing is stopped, the "trace" file will show the same contents each time. The "trace_pipe" file is a consuming read, where a read of the file will consume the output of what was read and it will not read the same thing a second time even if tracing is stopped. This file als will block. If no data is available, trace-cmd show will stop and wait for data to appear. *-s*:: Instead of reading the "trace" file, read the snapshot file. The snapshot is made by an application writing into it and the kernel will perform as swap between the currently active buffer and the current snapshot buffer. If no more swaps are made, the snapshot will remain static. This is not a consuming read. *-c* 'cpu':: Read only the trace file for a specified CPU. *-f*:: Display the full path name of the file that is being displayed. *-B* 'buf':: If a buffer instance was created, then the *-B* option will access the files associated with the given buffer. *--tracing_on*:: Show if tracing is on for the given instance. *--current_tracer*:: Show what the current tracer is. *--buffer_size*:: Show the current buffer size (per-cpu) *--buffer_total_size*:: Show the total size of all buffers. *--ftrace_filter*:: Show what function filters are set. *--ftrace_notrace*:: Show what function disabled filters are set. *--ftrace_pid*:: Show the PIDs the function tracer is limited to (if any). *--graph_function*:: Show the functions that will be graphed. *--graph_notrace*:: Show the functions that will not be graphed. *--cpumask*:: Show the mask of CPUs that tracing will trace. SEE ALSO -------- trace-cmd(1), trace-cmd-record(1), trace-cmd-report(1), trace-cmd-start(1), trace-cmd-extract(1), trace-cmd-reset(1), trace-cmd-split(1), trace-cmd-list(1), trace-cmd-listen(1) AUTHOR ------ Written by Steven Rostedt, RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2010 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd-snapshot.1.txt000066400000000000000000000032111414302661500246200ustar00rootroot00000000000000TRACE-CMD-SNAPSHOT(1) ===================== NAME ---- trace-cmd-snapshot - take, reset, free, or show a Ftrace kernel snapshot SYNOPSIS -------- *trace-cmd snapshot* ['OPTIONS'] DESCRIPTION ----------- The trace-cmd(1) snapshot controls or displays the Ftrace Linux kernel snapshot feature (if the kernel supports it). This is useful to "freeze" an instance of a live trace but without stopping the trace. trace-cmd start -p function trace-cmd snapshot -s trace-cmd snapshot [ dumps the content of buffer at 'trace-cmd snapshot -s' ] trace-cmd snapshot -s trace-cmd snapshot [ dumps the new content of the buffer at the last -s operation ] OPTIONS ------- *-s*:: Take a snapshot of the currently running buffer. *-r*:: Clear out the buffer. *-f*:: Free the snapshot buffer. The buffer takes up memory inside the kernel. It is best to free it when not in use. The first -s operation will allocate it if it is not already allocated. *-c* 'cpu':: Operate on a per cpu snapshot (may not be fully supported by all kernels) *-B* 'buf':: If a buffer instance was created, then the *-B* option will operate on the snapshot within the buffer. SEE ALSO -------- trace-cmd(1), trace-cmd-record(1), trace-cmd-report(1), trace-cmd-start(1), trace-cmd-extract(1), trace-cmd-reset(1), trace-cmd-split(1), trace-cmd-list(1), trace-cmd-listen(1) AUTHOR ------ Written by Steven Rostedt, RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2010 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd-split.1.txt000066400000000000000000000062501414302661500241220ustar00rootroot00000000000000TRACE-CMD-SPLIT(1) ================== NAME ---- trace-cmd-split - split a trace.dat file into smaller files SYNOPSIS -------- *trace-cmd split* ['OPTIONS'] ['start-time' ['end-time']] DESCRIPTION ----------- The trace-cmd(1) split is used to break up a trace.dat into small files. The 'start-time' specifies where the new file will start at. Using 'trace-cmd-report(1)' and copying the time stamp given at a particular event, can be used as input for either 'start-time' or 'end-time'. The split will stop creating files when it reaches an event after 'end-time'. If only the end-time is needed, use 0.0 as the start-time. If start-time is left out, then the split will start at the beginning of the file. If end-time is left out, then split will continue to the end unless it meets one of the requirements specified by the options. OPTIONS ------- *-i* 'file':: If this option is not specified, then the split command will look for the file named 'trace.dat'. This options will allow the reading of another file other than 'trace.dat'. *-o* 'file':: By default, the split command will use the input file name as a basis of where to write the split files. The output file will be the input file with an attached \'.#\' to the end: trace.dat.1, trace.dat.2, etc. This option will change the name of the base file used. -o file will create file.1, file.2, etc. *-s* 'seconds':: This specifies how many seconds should be recorded before the new file should stop. *-m* 'milliseconds':: This specifies how many milliseconds should be recorded before the new file should stop. *-u* 'microseconds':: This specifies how many microseconds should be recorded before the new file should stop. *-e* 'events':: This specifies how many events should be recorded before the new file should stop. *-p* 'pages':: This specifies the number of pages that should be recorded before the new file should stop. Note: only one of *-p*, *-e*, *-u*, *-m*, *-s* may be specified at a time. If *-p* is specified, then *-c* is automatically set. *-r*:: This option causes the break up to repeat until end-time is reached (or end of the input if end-time is not specified). trace-cmd split -r -e 10000 This will break up trace.dat into several smaller files, each with at most 10,000 events in it. *-c*:: This option causes the above break up to be per CPU. trace-cmd split -c -p 10 This will create a file that has 10 pages per each CPU from the input. *-C* 'cpu':: This option will split for a single CPU. Only the cpu named will be extracted from the file. trace-cmd split -C 1 This will split out all the events for cpu 1 in the file. SEE ALSO -------- trace-cmd(1), trace-cmd-record(1), trace-cmd-report(1), trace-cmd-start(1), trace-cmd-stop(1), trace-cmd-extract(1), trace-cmd-reset(1), trace-cmd-list(1), trace-cmd-listen(1) AUTHOR ------ Written by Steven Rostedt, RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2010 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd-stack.1.txt000066400000000000000000000022721414302661500240740ustar00rootroot00000000000000TRACE-CMD-STACK(1) ================== NAME ---- trace-cmd-stack - read, enable or disable Ftrace Linux kernel stack tracing. SYNOPSIS -------- *trace-cmd stack* DESCRIPTION ----------- The trace-cmd(1) stack enables the Ftrace stack tracer within the kernel. The stack tracer enables the function tracer and at each function call within the kernel, the stack is checked. When a new maximum usage stack is discovered, it is recorded. When no option is used, the current stack is displayed. To enable the stack tracer, use the option *--start*, and to disable the stack tracer, use the option *--stop*. The output will be the maximum stack found since the start was enabled. Use *--reset* to reset the stack counter to zero. SEE ALSO -------- trace-cmd(1), trace-cmd-record(1), trace-cmd-report(1), trace-cmd-start(1), trace-cmd-extract(1), trace-cmd-reset(1), trace-cmd-split(1), trace-cmd-list(1), trace-cmd-listen(1) AUTHOR ------ Written by Steven Rostedt, RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2010 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd-start.1.txt000066400000000000000000000030561414302661500241250ustar00rootroot00000000000000TRACE-CMD-START(1) ================== NAME ---- trace-cmd-start - start the Ftrace Linux kernel tracer without recording SYNOPSIS -------- *trace-cmd start* ['OPTIONS'] DESCRIPTION ----------- The trace-cmd(1) start enables all the Ftrace tracing the same way trace-cmd-record(1) does. The difference is that it does not run threads to create a trace.dat file. This is useful just to enable Ftrace and you are only interested in the trace after some event has occurred and the trace is stopped. Then the trace can be read straight from the Ftrace pseudo file system or can be extracted with trace-cmd-extract(1). OPTIONS ------- The options are the same as 'trace-cmd-record(1)', except that it does not take options specific to recording (*-s*, *-o*, *-N*, and *-t*). *--fork* :: This option is only available for trace-cmd start. It tells trace-cmd to not wait for the process to finish before returning. With this option, trace-cmd start will return right after it forks the process on the command line. This option only has an effect if trace-cmd start also executes a command. SEE ALSO -------- trace-cmd(1), trace-cmd-record(1), trace-cmd-report(1), trace-cmd-stop(1), trace-cmd-extract(1), trace-cmd-reset(1), trace-cmd-split(1), trace-cmd-list(1), trace-cmd-listen(1) AUTHOR ------ Written by Steven Rostedt, RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2010 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd-stat.1.txt000066400000000000000000000035261414302661500237450ustar00rootroot00000000000000TRACE-CMD-STAT(1) ================= NAME ---- trace-cmd-stat - show the status of the tracing (ftrace) system SYNOPSIS -------- *trace-cmd stat* DESCRIPTION ----------- The trace-cmd(1) stat displays the various status of the tracing (ftrace) system. The status that it shows is: *Instances:* List all configured ftrace instances. *Tracer:* if one of the tracers (like function_graph) is active. Otherwise nothing is displayed. *Events:* Lists the events that are enable. *Event filters:* Shows any filters that are set for any events *Function filters:* Shows any filters for the function tracers *Graph functions:* Shows any functions that the function graph tracer should graph *Buffers:* Shows the trace buffer size if they have been expanded. By default, tracing buffers are in a compressed format until they are used. If they are compressed, the buffer display will not be shown. *Trace clock:* If the tracing clock is anything other than the default "local" it will be displayed. *Trace CPU mask:* If not all available CPUs are in the tracing CPU mask, then the tracing CPU mask will be displayed. *Trace max latency:* Shows the value of the trace max latency if it is other than zero. *Kprobes:* Shows any kprobes that are defined for tracing. *Uprobes:* Shows any uprobes that are defined for tracing. *Error log:* Dump the content of ftrace error_log file. SEE ALSO -------- trace-cmd(1), trace-cmd-record(1), trace-cmd-report(1), trace-cmd-start(1), trace-cmd-stop(1), trace-cmd-extract(1), trace-cmd-reset(1), trace-cmd-split(1), trace-cmd-listen(1) AUTHOR ------ Written by Steven Rostedt, RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2014 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd-stop.1.txt000066400000000000000000000037631414302661500237620ustar00rootroot00000000000000TRACE-CMD-STOP(1) ================= NAME ---- trace-cmd-stop - stop the Ftrace Linux kernel tracer from writing to the ring buffer. SYNOPSIS -------- *trace-cmd stop* ['OPTIONS'] DESCRIPTION ----------- The trace-cmd(1) stop is a complement to 'trace-cmd-start(1)'. This will disable Ftrace from writing to the ring buffer. This does not stop the overhead that the tracing may incur. Only the updating of the ring buffer is disabled, the Ftrace tracing may still be inducing overhead. After stopping the trace, the 'trace-cmd-extract(1)' may strip out the data from the ring buffer and create a trace.dat file. The Ftrace pseudo file system may also be examined. To disable the tracing completely to remove the overhead it causes, use 'trace-cmd-reset(1)'. But after a reset is performed, the data that has been recorded is lost. OPTIONS ------- *-B* 'buffer-name':: If the kernel supports multiple buffers, this will stop the trace for only the given buffer. It does not affect any other buffer. This may be used multiple times to specify different buffers. When this option is used, the top level instance will not be stopped unless *-t* is given. *-a*:: Stop the trace for all existing buffer instances. When this option is used, the top level instance will not be stopped unless *-t* is given. *-t*:: Stops the top level instance buffer. Without the *-B* or *-a* option this is the same as the default. But if *-B* or *-a* is used, this is required if the top level instance buffer should also be stopped. SEE ALSO -------- trace-cmd(1), trace-cmd-record(1), trace-cmd-report(1), trace-cmd-start(1), trace-cmd-extract(1), trace-cmd-reset(1), trace-cmd-split(1), trace-cmd-list(1), trace-cmd-listen(1) AUTHOR ------ Written by Steven Rostedt, RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2010 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd-stream.1.txt000066400000000000000000000026751414302661500242710ustar00rootroot00000000000000TRACE-CMD-STREAM(1) =================== NAME ---- trace-cmd-stream - stream a trace to stdout as it is happening SYNOPSIS -------- *trace-cmd stream ['OPTIONS']* ['command'] DESCRIPTION ----------- The trace-cmd(1) stream will start tracing just like trace-cmd-record(1), except it will not record to a file and instead it will read the binary buffer as it is happening, convert it to a human readable format and write it to stdout. This is basically the same as trace-cmd-start(1) and then doing a trace-cmd-show(1) with the *-p* option. trace-cmd-stream is not as efficient as reading from the pipe file as most of the stream work is done in userspace. This is useful if it is needed to do the work mostly in userspace instead of the kernel, and stream also helps to debug trace-cmd-profile(1) which uses the stream code to perform the live data analysis for the profile. OPTIONS ------- These are the same as trace-cmd-record(1), except that it does not take the *-o* option. SEE ALSO -------- trace-cmd(1), trace-cmd-record(1), trace-cmd-report(1), trace-cmd-start(1), trace-cmd-stop(1), trace-cmd-reset(1), trace-cmd-split(1), trace-cmd-list(1), trace-cmd-listen(1) AUTHOR ------ Written by Steven Rostedt, RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2014 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd.1.txt000066400000000000000000000047041414302661500227730ustar00rootroot00000000000000TRACE-CMD(1) ============ NAME ---- trace-cmd - interacts with Ftrace Linux kernel internal tracer SYNOPSIS -------- *trace-cmd* 'COMMAND' ['OPTIONS'] DESCRIPTION ----------- The trace-cmd(1) command interacts with the Ftrace tracer that is built inside the Linux kernel. It interfaces with the Ftrace specific files found in the debugfs file system under the tracing directory. A 'COMMAND' must be specified to tell trace-cmd what to do. COMMANDS -------- record - record a live trace and write a trace.dat file to the local disk or to the network. report - reads a trace.dat file and converts the binary data to a ASCII text readable format. hist - show a histogram of the events. stat - show tracing (ftrace) status of the running system options - list the plugin options that are available to *report* start - start the tracing without recording to a trace.dat file. stop - stop tracing (only disables recording, overhead of tracer is still in effect) restart - restart tracing from a previous stop (only effects recording) extract - extract the data from the kernel buffer and create a trace.dat file. reset - disables all tracing and gives back the system performance. (clears all data from the kernel buffers) split - splits a trace.dat file into smaller files. list - list the available plugins or events that can be recorded. listen - open up a port to listen for remote tracing connections. restore - restore the data files of a crashed run of trace-cmd record stack - run and display the stack tracer check-events - parse format strings for all trace events and return whether all formats are parseable OPTIONS ------- *-h*, --help:: Display the help text. Other options see the man page for the corresponding command. SEE ALSO -------- trace-cmd-record(1), trace-cmd-report(1), trace-cmd-hist(1), trace-cmd-start(1), trace-cmd-stop(1), trace-cmd-extract(1), trace-cmd-reset(1), trace-cmd-restore(1), trace-cmd-stack(1), trace-cmd-split(1), trace-cmd-list(1), trace-cmd-listen(1), trace-cmd.dat(5), trace-cmd-check-events(1) trace-cmd-stat(1) AUTHOR ------ Written by Steven Rostedt, RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2010 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/Documentation/trace-cmd/trace-cmd.dat.5.txt000066400000000000000000000167711414302661500235550ustar00rootroot00000000000000TRACE-CMD.DAT(5) ================ NAME ---- trace-cmd.dat - trace-cmd file format SYNOPSIS -------- *trace-cmd.dat* ignore DESCRIPTION ----------- The trace-cmd(1) utility produces a "trace.dat" file. The file may also be named anything depending if the user specifies a different output name, but it must have a certain binary format. The file is used by trace-cmd to save kernel traces into it and be able to extract the trace from it at a later point (see *trace-cmd-report(1)*). INITIAL FORMAT -------------- The first three bytes contain the magic value: 0x17 0x08 0x44 The next 7 bytes contain the characters: "tracing" The next set of characters contain a null '\0' terminated string that contains the version of the file (for example): "6\0" The next 1 byte contains the flags for the file endianess: 0 = little endian 1 = big endian The next byte contains the number of bytes per "long" value: 4 - 32-bit long values 8 - 64-bit long values Note: This is the long size of the target's userspace. Not the kernel space size. [ Now all numbers are written in file defined endianess. ] The next 4 bytes are a 32-bit word that defines what the traced host machine page size was. HEADER INFO FORMAT ------------------ Directly after the initial format comes information about the trace headers recorded from the target box. The next 12 bytes contain the string: "header_page\0" The next 8 bytes are a 64-bit word containing the size of the page header information stored next. The next set of data is of the size read from the previous 8 bytes, and contains the data retrieved from debugfs/tracing/events/header_page. Note: The size of the second field \fBcommit\fR contains the target kernel long size. For example: field: local_t commit; offset:8; \fBsize:8;\fR signed:1; shows the kernel has a 64-bit long. The next 13 bytes contain the string: "header_event\0" The next 8 bytes are a 64-bit word containing the size of the event header information stored next. The next set of data is of the size read from the previous 8 bytes and contains the data retrieved from debugfs/tracing/events/header_event. This data allows the trace-cmd tool to know if the ring buffer format of the kernel made any changes. FTRACE EVENT FORMATS -------------------- Directly after the header information comes the information about the Ftrace specific events. These are the events used by the Ftrace plugins and are not enabled by the event tracing. The next 4 bytes contain a 32-bit word of the number of Ftrace event format files that are stored in the file. For the number of times defined by the previous 4 bytes is the following: 8 bytes for the size of the Ftrace event format file. The Ftrace event format file copied from the target machine: debugfs/tracing/events/ftrace//format EVENT FORMATS ------------- Directly after the Ftrace formats comes the information about the event layout. The next 4 bytes are a 32-bit word containing the number of event systems that are stored in the file. These are the directories in debugfs/tracing/events excluding the \fBftrace\fR directory. For the number of times defined by the previous 4 bytes is the following: A null-terminated string containing the system name. 4 bytes containing a 32-bit word containing the number of events within the system. For the number of times defined in the previous 4 bytes is the following: 8 bytes for the size of the event format file. The event format file copied from the target machine: debugfs/tracing/events///format KALLSYMS INFORMATION -------------------- Directly after the event formats comes the information of the mapping of function addresses to the function names. The next 4 bytes are a 32-bit word containing the size of the data holding the function mappings. The next set of data is of the size defined by the previous 4 bytes and contains the information from the target machine's file: /proc/kallsyms TRACE_PRINTK INFORMATION ------------------------ If a developer used trace_printk() within the kernel, it may store the format string outside the ring buffer. This information can be found in: debugfs/tracing/printk_formats The next 4 bytes are a 32-bit word containing the size of the data holding the printk formats. The next set of data is of the size defined by the previous 4 bytes and contains the information from debugfs/tracing/printk_formats. PROCESS INFORMATION ------------------- Directly after the trace_printk formats comes the information mapping a PID to a process name. The next 8 bytes contain a 64-bit word that holds the size of the data mapping the PID to a process name. The next set of data is of the size defined by the previous 8 bytes and contains the information from debugfs/tracing/saved_cmdlines. REST OF TRACE-CMD HEADER ------------------------ Directly after the process information comes the last bit of the trace.dat file header. The next 4 bytes are a 32-bit word defining the number of CPUs that were discovered on the target machine (and has matching trace data for it). The next 10 bytes are one of the following: "options \0" "latency \0" "flyrecord\0" If it is "options \0" then: The next 2 bytes are a 16-bit word defining the current option. If the the value is zero then there are no more options. Otherwise, the next 4 bytes contain a 32-bit word containing the option size. If the reader does not know how to handle the option it can simply skip it. Currently there are no options defined, but this is here to extend the data. The next option will be directly after the previous option, and the options ends with a zero in the option type field. The next 10 bytes after the options are one of the following: "latency \0" "flyrecord\0" which would follow the same as if options were not present. If the value is "latency \0", then the rest of the file is simply ASCII text that was taken from the target's: debugfs/tracing/trace If the value is "flyrecord\0", the following is present: For the number of CPUs that were read earlier, the following is present: 8 bytes that are a 64-bit word containing the offset into the file that holds the data for the CPU. 8 bytes that are a 64-bit word containing the size of the CPU data at that offset. CPU DATA -------- The CPU data is located in the part of the file that is specified in the end of the header. Padding is placed between the header and the CPU data, placing the CPU data at a page aligned (target page) position in the file. This data is copied directly from the Ftrace ring buffer and is of the same format as the ring buffer specified by the event header files loaded in the header format file. The trace-cmd tool will try to \fBmmap(2)\fR the data page by page with the target's page size if possible. If it fails to mmap, it will just read the data instead. SEE ALSO -------- trace-cmd(1), trace-cmd-record(1), trace-cmd-report(1), trace-cmd-start(1), trace-cmd-stop(1), trace-cmd-extract(1), trace-cmd-reset(1), trace-cmd-split(1), trace-cmd-list(1), trace-cmd-listen(1), trace-cmd.dat(5) AUTHOR ------ Written by Steven Rostedt, RESOURCES --------- https://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git/ COPYING ------- Copyright \(C) 2010 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/LICENSES/000077500000000000000000000000001414302661500147645ustar00rootroot00000000000000trace-cmd-v2.9.6/LICENSES/GPL-2.0000066400000000000000000000444511414302661500156360ustar00rootroot00000000000000Valid-License-Identifier: GPL-2.0 Valid-License-Identifier: GPL-2.0-only Valid-License-Identifier: GPL-2.0+ Valid-License-Identifier: GPL-2.0-or-later SPDX-URL: https://spdx.org/licenses/GPL-2.0.html Usage-Guide: To use this license in source code, put one of the following SPDX tag/value pairs into a comment according to the placement guidelines in the licensing rules documentation. For 'GNU General Public License (GPL) version 2 only' use: SPDX-License-Identifier: GPL-2.0 or SPDX-License-Identifier: GPL-2.0-only For 'GNU General Public License (GPL) version 2 or any later version' use: SPDX-License-Identifier: GPL-2.0+ or SPDX-License-Identifier: GPL-2.0-or-later License-Text: GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. trace-cmd-v2.9.6/LICENSES/LGPL-2.1000066400000000000000000000654251414302661500157570ustar00rootroot00000000000000Valid-License-Identifier: LGPL-2.1 Valid-License-Identifier: LGPL-2.1+ SPDX-URL: https://spdx.org/licenses/LGPL-2.1.html Usage-Guide: To use this license in source code, put one of the following SPDX tag/value pairs into a comment according to the placement guidelines in the licensing rules documentation. For 'GNU Lesser General Public License (LGPL) version 2.1 only' use: SPDX-License-Identifier: LGPL-2.1 For 'GNU Lesser General Public License (LGPL) version 2.1 or any later version' use: SPDX-License-Identifier: LGPL-2.1+ License-Text: GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. one line to give the library's name and an idea of what it does. Copyright (C) year name of author This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. signature of Ty Coon, 1 April 1990 Ty Coon, President of Vice That's all there is to it! trace-cmd-v2.9.6/Makefile000066400000000000000000000446651414302661500152360ustar00rootroot00000000000000# SPDX-License-Identifier: GPL-2.0 # trace-cmd version TC_VERSION = 2 TC_PATCHLEVEL = 9 TC_EXTRAVERSION = 6 TRACECMD_VERSION = $(TC_VERSION).$(TC_PATCHLEVEL).$(TC_EXTRAVERSION) export TC_VERSION export TC_PATCHLEVEL export TC_EXTRAVERSION export TRACECMD_VERSION LIBTC_VERSION = 0 LIBTC_PATCHLEVEL = 0 LIBTC_EXTRAVERSION = 1 LIBTRACECMD_VERSION = $(LIBTC_VERSION).$(LIBTC_PATCHLEVEL).$(LIBTC_EXTRAVERSION) export LIBTC_VERSION export LIBTC_PATCHLEVEL export LIBTC_EXTRAVERSION export LIBTRACECMD_VERSION VERSION_FILE = ltc_version.h MAKEFLAGS += --no-print-directory # Makefiles suck: This macro sets a default value of $(2) for the # variable named by $(1), unless the variable has been set by # environment or command line. This is necessary for CC and AR # because make sets default values, so the simpler ?= approach # won't work as expected. define allow-override $(if $(or $(findstring environment,$(origin $(1))),\ $(findstring command line,$(origin $(1)))),,\ $(eval $(1) = $(2))) endef # Allow setting CC and AR, or setting CROSS_COMPILE as a prefix. $(call allow-override,CC,$(CROSS_COMPILE)gcc) $(call allow-override,AR,$(CROSS_COMPILE)ar) $(call allow-override,PKG_CONFIG,pkg-config) $(call allow-override,LD_SO_CONF_PATH,/etc/ld.so.conf.d/) $(call allow-override,LDCONFIG,ldconfig) export LD_SO_CONF_PATH LDCONFIG EXT = -std=gnu99 INSTALL = install # Use DESTDIR for installing into a different root directory. # This is useful for building a package. The program will be # installed in this directory as if it was the root directory. # Then the build tool can move it later. DESTDIR ?= DESTDIR_SQ = '$(subst ','\'',$(DESTDIR))' LP64 := $(shell echo __LP64__ | ${CC} ${CFLAGS} -E -x c - | tail -n 1) ifeq ($(LP64), 1) libdir_relative_temp = lib64 else libdir_relative_temp = lib endif libdir_relative ?= $(libdir_relative_temp) prefix ?= /usr/local bindir_relative = bin bindir = $(prefix)/$(bindir_relative) man_dir = $(prefix)/share/man man_dir_SQ = '$(subst ','\'',$(man_dir))' html_install = $(prefix)/share/kernelshark/html html_install_SQ = '$(subst ','\'',$(html_install))' img_install = $(prefix)/share/kernelshark/html/images img_install_SQ = '$(subst ','\'',$(img_install))' libdir = $(prefix)/$(libdir_relative) libdir_SQ = '$(subst ','\'',$(libdir))' includedir = $(prefix)/include includedir_SQ = '$(subst ','\'',$(includedir))' pkgconfig_dir ?= $(word 1,$(shell $(PKG_CONFIG) \ --variable pc_path pkg-config | tr ":" " ")) etcdir ?= /etc etcdir_SQ = '$(subst ','\'',$(etcdir))' export man_dir man_dir_SQ html_install html_install_SQ INSTALL export img_install img_install_SQ libdir libdir_SQ includedir_SQ export DESTDIR DESTDIR_SQ ifeq ($(prefix),$(HOME)) plugin_traceevent_dir = $(HOME)/.local/lib/traceevent/plugins plugin_tracecmd_dir = $(libdir)/trace-cmd/plugins python_dir ?= $(libdir)/traceevent/python var_dir = $(HOME)/.trace-cmd/ else plugin_traceevent_dir = $(libdir)/traceevent/plugins python_dir ?= $(libdir)/trace-cmd/python PLUGIN_DIR_TRACEEVENT = -DPLUGIN_TRACEEVENT_DIR="$(plugin_traceevent_dir)" PLUGIN_DIR_TRACECMD = -DPLUGIN_TRACECMD_DIR="$(plugin_tracecmd_dir)" PYTHON_DIR = -DPYTHON_DIR="$(python_dir)" PLUGIN_DIR_TRACEEVENT_SQ = '$(subst ','\'',$(PLUGIN_DIR_TRACEEVENT))' PLUGIN_DIR_TRACECMD_SQ = '$(subst ','\'',$(PLUGIN_DIR_TRACECMD))' PYTHON_DIR_SQ = '$(subst ','\'',$(PYTHON_DIR))' var_dir = /var endif # Shell quotes bindir_SQ = $(subst ','\'',$(bindir)) bindir_relative_SQ = $(subst ','\'',$(bindir_relative)) plugin_traceevent_dir_SQ = $(subst ','\'',$(plugin_traceevent_dir)) plugin_tracecmd_dir_SQ = $(subst ','\'',$(plugin_tracecmd_dir)) python_dir_SQ = $(subst ','\'',$(python_dir)) pound := \# VAR_DIR = -DVAR_DIR="$(var_dir)" VAR_DIR_SQ = '$(subst ','\'',$(VAR_DIR))' var_dir_SQ = '$(subst ','\'',$(var_dir))' HELP_DIR = -DHELP_DIR=$(html_install) HELP_DIR_SQ = '$(subst ','\'',$(HELP_DIR))' #' emacs highlighting gets confused by the above escaped quote. BASH_COMPLETE_DIR ?= $(etcdir)/bash_completion.d export PLUGIN_DIR_TRACEEVENT export PLUGIN_DIR_TRACECMD export PYTHON_DIR export PYTHON_DIR_SQ export plugin_traceevent_dir_SQ export plugin_tracecmd_dir_SQ export python_dir_SQ export var_dir # copy a bit from Linux kbuild ifeq ("$(origin V)", "command line") VERBOSE = $(V) endif ifndef VERBOSE VERBOSE = 0 endif SILENT := $(if $(findstring s,$(filter-out --%,$(MAKEFLAGS))),1) SWIG_DEFINED := $(shell if command -v swig; then echo 1; else echo 0; fi) ifeq ($(SWIG_DEFINED), 0) BUILD_PYTHON := report_noswig NO_PYTHON = 1 endif ifndef NO_PYTHON PYTHON := ctracecmd.so PYTHON_VERS ?= python PYTHON_PKGCONFIG_VERS ?= $(PYTHON_VERS) # Can build python? ifeq ($(shell sh -c "$(PKG_CONFIG) --cflags $(PYTHON_PKGCONFIG_VERS) > /dev/null 2>&1 && echo y"), y) BUILD_PYTHON := $(PYTHON) BUILD_PYTHON_WORKS := 1 else BUILD_PYTHON := report_nopythondev NO_PYTHON = 1 endif endif # NO_PYTHON export BUILD_PYTHON_WORKS export NO_PYTHON # $(call test-build, snippet, ret) -> ret if snippet compiles # -> empty otherwise test-build = $(if $(shell sh -c 'echo "$(1)" | \ $(CC) -o /dev/null -c -x c - > /dev/null 2>&1 && echo y'), $2) UDIS86_AVAILABLE := $(call test-build,\#include , y) ifneq ($(strip $(UDIS86_AVAILABLE)), y) NO_UDIS86 := 1 endif ifndef NO_UDIS86 # have udis86 disassembler library? udis86-flags := -DHAVE_UDIS86 -ludis86 udis86-ldflags := -ludis86 endif # NO_UDIS86 define BLK_TC_FLUSH_SOURCE #include int main(void) { return BLK_TC_FLUSH; } endef # have flush/fua block layer instead of barriers? blk-flags := $(call test-build,$(BLK_TC_FLUSH_SOURCE),-DHAVE_BLK_TC_FLUSH) ifeq ("$(origin O)", "command line") saved-output := $(O) BUILD_OUTPUT := $(shell cd $(O) && /bin/pwd) $(if $(BUILD_OUTPUT),, \ $(error output directory "$(saved-output)" does not exist)) else BUILD_OUTPUT = $(CURDIR) endif srctree := $(if $(BUILD_SRC),$(BUILD_SRC),$(CURDIR)) objtree := $(BUILD_OUTPUT) src := $(srctree) obj := $(objtree) PKG_CONFIG_SOURCE_FILE = libtracecmd.pc PKG_CONFIG_FILE := $(addprefix $(BUILD_OUTPUT)/,$(PKG_CONFIG_SOURCE_FILE)) export pkgconfig_dir PKG_CONFIG_FILE kshark-dir = $(src)/kernel-shark export prefix bindir src obj kshark-dir LIBS = -ldl LIBTRACECMD_DIR = $(obj)/lib/trace-cmd LIBTRACECMD_STATIC = $(LIBTRACECMD_DIR)/libtracecmd.a LIBTRACECMD_SHARED = $(LIBTRACECMD_DIR)/libtracecmd.so.$(LIBTRACECMD_VERSION) LIBTRACECMD_SHARED_VERSION = $(shell echo $(LIBTRACECMD_SHARED) | sed -e 's/\(\.so\.[0-9]*\).*/\1/') LIBTRACECMD_SHARED_SO = $(shell echo $(LIBTRACECMD_SHARED) | sed -e 's/\(\.so\).*/\1/') export LIBTRACECMD_STATIC LIBTRACECMD_SHARED export LIBTRACECMD_SHARED_VERSION LIBTRACECMD_SHARED_SO LIBTRACEEVENT=libtraceevent LIBTRACEEVENT_DIR = $(obj)/lib/traceevent LIBTRACEEVENT_STATIC = $(LIBTRACEEVENT_DIR)/libtraceevent.a LIBTRACEFS=libtracefs LIBTRACEFS_DIR = $(obj)/lib/tracefs LIBTRACEFS_STATIC = $(LIBTRACEFS_DIR)/libtracefs.a # In the special case (debugging), that the local versions of the # libraries need to be built, adding "LOCAL_LIBS=1" to the make # command line will skip the check if they are installed. ifneq ("$(origin LOCAL_LIBS)", "command line") TEST_LIBTRACEEVENT = $(shell sh -c "$(PKG_CONFIG) --cflags $(LIBTRACEEVENT) > /dev/null 2>&1 && echo y") TEST_LIBTRACEFS = $(shell sh -c "$(PKG_CONFIG) --cflags $(LIBTRACEFS) > /dev/null 2>&1 && echo y") endif # My get overwritten if libtraceveent is 1.3 or greater. TEP_WARNING = -Dpr_info=pr_stat ifeq ("$(TEST_LIBTRACEEVENT)", "y") TRACEEVENT_V13 = $(shell sh -c "$(PKG_CONFIG) --atleast-version 1.3 $(LIBTRACEEVENT) > /dev/null 2>&1 && echo y") ifeq ("$(TRACEEVENT_V13)", "y") TEP_WARNING = -Dwarning=tep_warning -Dpr_info=tep_info endif LIBTRACEEVENT_CFLAGS = $(shell sh -c "$(PKG_CONFIG) --cflags $(LIBTRACEEVENT)") $(TEP_WARNING) LIBTRACEEVENT_LDLAGS = $(shell sh -c "$(PKG_CONFIG) --libs $(LIBTRACEEVENT)") TRACEEVENT_PLUGINS = TRACEEVENT_PLUGINS_INSTALL = else LIBTRACEEVENT_CFLAGS = -I$(src)/include/traceevent -I$(src)/lib/traceevent/include LIBTRACEEVENT_LDLAGS = -L$(LIBTRACEEVENT_DIR) -ltraceevent LIBTRACEEVENT_STATIC_BUILD = $(LIBTRACEEVENT_STATIC) TRACEEVENT_PLUGINS = plugins_traceevent TRACEEVENT_PLUGINS_INSTALL = install_plugins_traceevent endif export LIBTRACEEVENT_CFLAGS LIBTRACEEVENT_LDLAGS LIBTRACEFS_MIN_VERSION = 1.0 ifeq ("$(TEST_LIBTRACEFS)", "y") LIBTRACEFS_CFLAGS = $(shell sh -c "$(PKG_CONFIG) --cflags $(LIBTRACEFS)") LIBTRACEFS_LDLAGS = $(shell sh -c "$(PKG_CONFIG) --libs $(LIBTRACEFS)") else LIBTRACEFS_CFLAGS = -I$(src)/include/tracefs LIBTRACEFS_LDLAGS = -L$(LIBTRACEFS_DIR) -ltracefs LIBTRACEFS_STATIC_BUILD = $(LIBTRACEFS_STATIC) endif export LIBTRACEFS_CFLAGS LIBTRACEFS_LDLAGS TRACE_LIBS = -L$(LIBTRACECMD_DIR) -ltracecmd \ $(LIBTRACEEVENT_LDLAGS) $(LIBTRACEFS_LDLAGS) export LIBS TRACE_LIBS export LIBTRACEEVENT_DIR LIBTRACECMD_DIR LIBTRACEFS_DIR export Q SILENT VERBOSE EXT # Include the utils include scripts/utils.mk INCLUDES = -I$(src)/include -I$(src)/../../include INCLUDES += -I$(src)/include/trace-cmd INCLUDES += -I$(src)/lib/trace-cmd/include INCLUDES += -I$(src)/lib/trace-cmd/include/private INCLUDES += -I$(src)/tracecmd/include INCLUDES += $(LIBTRACEEVENT_CFLAGS) INCLUDES += $(LIBTRACEFS_CFLAGS) include $(src)/features.mk # Set compile option CFLAGS if not set elsewhere CFLAGS ?= -g -Wall CPPFLAGS ?= LDFLAGS ?= VSOCK_DEFINED := $(shell if (echo "$(pound)include " | $(CC) -E - >/dev/null 2>&1) ; then echo 1; else echo 0 ; fi) export VSOCK_DEFINED ifeq ($(VSOCK_DEFINED), 1) CFLAGS += -DVSOCK endif CUNIT_INSTALLED := $(shell if (printf "$(pound)include \n void main(){CU_initialize_registry();}" | $(CC) -o /dev/null -x c - -lcunit >/dev/null 2>&1) ; then echo 1; else echo 0 ; fi) export CUNIT_INSTALLED export CFLAGS export INCLUDES # Required CFLAGS override CFLAGS += -D_GNU_SOURCE ifndef NO_PTRACE ifneq ($(call try-cc,$(SOURCE_PTRACE),),y) NO_PTRACE = 1 override CFLAGS += -DWARN_NO_PTRACE endif endif ifdef NO_PTRACE override CFLAGS += -DNO_PTRACE endif ifndef NO_AUDIT ifneq ($(call try-cc,$(SOURCE_AUDIT),-laudit),y) NO_AUDIT = 1 override CFLAGS += -DWARN_NO_AUDIT endif endif ifdef NO_AUDIT override CFLAGS += -DNO_AUDIT else LIBS += -laudit endif # Append required CFLAGS override CFLAGS += $(INCLUDES) $(VAR_DIR) override CFLAGS += $(PLUGIN_DIR_TRACEEVENT_SQ) $(PLUGIN_DIR_TRACECMD_SQ) override CFLAGS += $(udis86-flags) $(blk-flags) override LDFLAGS += $(udis86-ldflags) CMD_TARGETS = trace-cmd $(BUILD_PYTHON) ### # Default we just build trace-cmd # # If you want kernelshark, then do: make gui # If you want all libraries, then do: make libs ### all: all_cmd plugins show_gui_make all_cmd: $(CMD_TARGETS) CMAKE_COMMAND = /usr/bin/cmake # Build with "BUILD_TYPE=Release" to remove cmake debug info BUILD_TYPE ?= RelWithDebInfo BUILD_PREFIX := $(BUILD_OUTPUT)/build_prefix $(BUILD_PREFIX): force $(Q)$(call build_prefix,$(prefix)) $(PKG_CONFIG_FILE) : ${PKG_CONFIG_SOURCE_FILE}.template $(BUILD_PREFIX) $(VERSION_FILE) $(Q) $(call do_make_pkgconfig_file,$(prefix)) $(kshark-dir)/build/Makefile: $(kshark-dir)/CMakeLists.txt $(Q) cd $(kshark-dir)/build && $(CMAKE_COMMAND) -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) -D_INSTALL_PREFIX=$(prefix) -D_LIBDIR=$(libdir) .. trace-cmd: force $(LIBTRACEEVENT_STATIC_BUILD) $(LIBTRACECMD_STATIC) $(LIBTRACEFS_STATIC_BUILD) \ force $(obj)/lib/trace-cmd/plugins/tracecmd_plugin_dir $(Q)$(MAKE) -C $(src)/tracecmd $(obj)/tracecmd/$@ LIBTRACEEVENT_DEPENDS = $(obj)/lib/traceevent/plugins/trace_python_dir \ $(obj)/lib/traceevent/plugins/traceevent_plugin_dir $(LIBTRACEEVENT_STATIC): force $(LIBTRACEEVENT_DEPENDS) $(Q)$(MAKE) -C $(src)/lib/traceevent libtraceevent $(LIBTRACECMD_STATIC): force $(Q)$(MAKE) -C $(src)/lib/trace-cmd $@ $(LIBTRACECMD_SHARED): force $(LIBTRACEEVENT_SHARED_BUILD) $(Q)$(MAKE) -C $(src)/lib/trace-cmd libtracecmd.so $(LIBTRACEFS_STATIC): force $(Q)$(MAKE) -C $(src)/lib/tracefs libtracefs libtraceevent.a: $(LIBTRACEEVENT_STATIC) libtracecmd.a: $(LIBTRACECMD_STATIC) libtracecmd.so: $(LIBTRACECMD_SHARED) libtracefs.a: $(LIBTRACEFS_STATIC) libs: $(LIBTRACECMD_SHARED) $(LIBTRACEEVENT_STATIC_BUILD) $(LIBTRACEFS_STATIC_BUILD) $(PKG_CONFIG_FILE) libtraceevent_nowarn: $(LIBTRACEEVENT_DEPENDS) $(Q)$(MAKE) -C $(src)/lib/traceevent $@ libtracefs_nowarn: force $(Q)$(MAKE) -C $(src)/lib/tracefs $@ VERSION = $(LIBTC_VERSION) PATCHLEVEL = $(LIBTC_PATCHLEVEL) EXTRAVERSION = $(LIBTC_EXTRAVERSION) define make_version.h (echo '/* This file is automatically generated. Do not modify. */'; \ echo \#define VERSION_CODE $(shell \ expr $(VERSION) \* 256 + $(PATCHLEVEL)); \ echo '#define EXTRAVERSION ' $(EXTRAVERSION); \ echo '#define VERSION_STRING "'$(VERSION).$(PATCHLEVEL).$(EXTRAVERSION)'"'; \ ) > $1 endef define update_version.h ($(call make_version.h, $@.tmp); \ if [ -r $@ ] && cmp -s $@ $@.tmp; then \ rm -f $@.tmp; \ else \ echo ' UPDATE $@'; \ mv -f $@.tmp $@; \ fi); endef $(VERSION_FILE): force $(Q)$(call update_version.h) gui: force $(CMD_TARGETS) libtraceevent_nowarn libtracefs_nowarn $(MAKE) $(kshark-dir)/build/Makefile $(Q)$(MAKE) $(S) -C $(kshark-dir)/build @echo "gui build complete" @echo " kernelshark located at $(kshark-dir)/bin" test: force $(LIBTRACEEVENT_STATIC_BUILD) $(LIBTRACEFS_STATIC_BUILD) $(LIBTRACECMD_STATIC) ifneq ($(CUNIT_INSTALLED),1) $(error CUnit framework not installed, cannot build unit tests)) endif $(Q)$(MAKE) -C $(src)/utest $@ plugins_traceevent: force $(obj)/lib/traceevent/plugins/traceevent_plugin_dir \ $(obj)/lib/traceevent/plugins/trace_python_dir $(Q)$(MAKE) -C $(src)/lib/traceevent/plugins plugins_tracecmd: force $(obj)/lib/trace-cmd/plugins/tracecmd_plugin_dir $(Q)$(MAKE) -C $(src)/lib/trace-cmd/plugins plugins: $(TRACEEVENT_PLUGINS) plugins_tracecmd $(obj)/lib/traceevent/plugins/traceevent_plugin_dir: force $(Q)$(MAKE) -C $(src)/lib/traceevent/plugins $@ $(obj)/lib/trace-cmd/plugins/tracecmd_plugin_dir: force $(Q)$(MAKE) -C $(src)/lib/trace-cmd/plugins $@ $(obj)/lib/traceevent/plugins/trace_python_dir: force $(Q)$(MAKE) -C $(src)/lib/traceevent/plugins $@ show_gui_make: @echo "Note: to build the gui, type \"make gui\"" @echo " to build man pages, type \"make doc\"" @echo " to build unit tests, type \"make test\"" PHONY += show_gui_make define find_tag_files find . -name '\.pc' -prune -o -name '*\.[ch]' -print -o -name '*\.[ch]pp' \ ! -name '\.#' -print endef tags: force $(RM) tags $(call find_tag_files) | xargs ctags --extra=+f --c-kinds=+px TAGS: force $(RM) TAGS $(call find_tag_files) | xargs etags cscope: force $(RM) cscope* $(call find_tag_files) | cscope -b -q install_plugins_traceevent: force $(Q)$(MAKE) -C $(src)/lib/traceevent/plugins install_plugins install_plugins_tracecmd: force $(Q)$(MAKE) -C $(src)/lib/trace-cmd/plugins install_plugins install_plugins: $(TRACEEVENT_PLUGINS_INSTALL) install_plugins_tracecmd install_python: force $(Q)$(MAKE) -C $(src)/python $@ install_bash_completion: force $(Q)$(call do_install_data,$(src)/tracecmd/trace-cmd.bash,$(BASH_COMPLETE_DIR)) install_cmd: all_cmd install_plugins install_python install_bash_completion $(Q)$(call do_install,$(obj)/tracecmd/trace-cmd,$(bindir_SQ)) install: install_cmd @echo "Note: to install the gui, type \"make install_gui\"" @echo " to install man pages, type \"make install_doc\"" install_gui: install_cmd gui $(Q)$(MAKE) $(S) -C $(kshark-dir)/build install install_libs: libs $(Q)$(MAKE) -C $(src)/lib/trace-cmd/ $@ doc: $(MAKE) -C $(src)/Documentation all doc_gui: $(MAKE) -C $(kshark-dir)/Documentation all doc_clean: $(MAKE) -C $(src)/Documentation clean doc_gui_clean: $(MAKE) -C $(kshark-dir)/Documentation clean install_doc: $(MAKE) -C $(src)/Documentation install install_doc_gui: $(MAKE) -C $(kshark-dir)/Documentation install clean: $(RM) *.o *~ *.a *.so .*.d $(RM) tags TAGS cscope* $(PKG_CONFIG_SOURCE_FILE) $(VERSION_FILE) $(MAKE) -C $(src)/lib/traceevent clean $(MAKE) -C $(src)/lib/trace-cmd clean $(MAKE) -C $(src)/lib/tracefs clean $(MAKE) -C $(src)/lib/traceevent/plugins clean $(MAKE) -C $(src)/lib/trace-cmd/plugins clean $(MAKE) -C $(src)/utest clean $(MAKE) -C $(src)/python clean $(MAKE) -C $(src)/tracecmd clean if [ -f $(kshark-dir)/build/Makefile ]; then $(MAKE) -C $(kshark-dir)/build clean; fi cd $(kshark-dir)/build; ./cmake_clean.sh define build_uninstall_script $(Q)mkdir $(BUILD_OUTPUT)/tmp_build $(Q)$(MAKE) -C $(src) DESTDIR=$(BUILD_OUTPUT)/tmp_build O=$(BUILD_OUTPUT) $1 > /dev/null $(Q)find $(BUILD_OUTPUT)/tmp_build ! -type d -printf "%P\n" > $(BUILD_OUTPUT)/build_$2 $(Q)$(RM) -rf $(BUILD_OUTPUT)/tmp_build endef build_uninstall: $(BUILD_PREFIX) $(call build_uninstall_script,install,uninstall) $(BUILD_OUTPUT)/build_uninstall: build_uninstall build_libs_uninstall: $(BUILD_PREFIX) $(call build_uninstall_script,install_libs,libs_uninstall) $(BUILD_OUTPUT)/build_libs_uninstall: build_libs_uninstall define uninstall_file if [ -f $(DESTDIR)/$1 -o -h $(DESTDIR)/$1 ]; then \ $(call print_uninstall,$(DESTDIR)/$1)$(RM) $(DESTDIR)/$1; \ fi; endef uninstall: $(BUILD_OUTPUT)/build_uninstall @$(foreach file,$(shell cat $(BUILD_OUTPUT)/build_uninstall),$(call uninstall_file,$(file))) uninstall_libs: $(BUILD_OUTPUT)/build_libs_uninstall @$(foreach file,$(shell cat $(BUILD_OUTPUT)/build_libs_uninstall),$(call uninstall_file,$(file))) ##### PYTHON STUFF ##### report_noswig: force $(Q)echo $(Q)echo " NO_PYTHON forced: swig not installed, not compiling python plugins" $(Q)echo report_nopythondev: force $(Q)echo $(Q)echo " python-dev is not installed, not compiling python plugins" $(Q)echo ifndef NO_PYTHON PYTHON_INCLUDES = `$(PKG_CONFIG) --cflags $(PYTHON_PKGCONFIG_VERS)` PYTHON_LDFLAGS = `$(PKG_CONFIG) --libs $(PYTHON_PKGCONFIG_VERS)` \ $(shell $(PYTHON_VERS)-config --ldflags) PYGTK_CFLAGS = `$(PKG_CONFIG) --cflags pygtk-2.0` else PYTHON_INCLUDES = PYTHON_LDFLAGS = PYGTK_CFLAGS = endif export PYTHON_INCLUDES export PYTHON_LDFLAGS export PYGTK_CFLAGS ctracecmd.so: force $(LIBTRACECMD_STATIC) $(Q)$(MAKE) -C $(src)/python $@ PHONY += python python: $(PYTHON) dist: git archive --format=tar --prefix=trace-cmd-$(TRACECMD_VERSION)/ HEAD \ > ../trace-cmd-$(TRACECMD_VERSION).tar cat ../trace-cmd-$(TRACECMD_VERSION).tar | \ bzip2 -c9 > ../trace-cmd-$(TRACECMD_VERSION).tar.bz2 cat ../trace-cmd-$(TRACECMD_VERSION).tar | \ xz -e -c8 > ../trace-cmd-$(TRACECMD_VERSION).tar.xz PHONY += force force: # Declare the contents of the .PHONY variable as phony. We keep that # information in a variable so we can use it in if_changed and friends. .PHONY: $(PHONY) trace-cmd-v2.9.6/PACKAGING000066400000000000000000000020621414302661500147660ustar00rootroot00000000000000The libtracefs and libtraceevent packages are required for trace-cmd and libtracecmd.so In order to create a package directory with libtraceevent, libtracefs and libtracecmd and trace-cmd, you can follow these steps: git clone git://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git git clone git://git.kernel.org/pub/scm/libs/libtrace/libtracefs.git git clone git://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git cd libtraceevent INSTALL_PATH=/tmp/install ../trace-cmd/make-trace-cmd.sh install cd ../libtracefs INSTALL_PATH=/tmp/install ../trace-cmd/make-trace-cmd.sh install cd ../trace-cmd INSTALL_PATH=/tmp/install ./make-trace-cmd.sh install install_libs cd /tmp/install tar cvjf /tmp/trace-cmd-files.tar.bz2 . And then the tarball of /tmp/trace-cmd-files.tar.bz2 will can be extracted on another machine at the root directory, and trace-cmd will be installed there. Note, to define a prefix, add a PREFIX variable before calling make-trace-cmd.sh For example: PREFIX=/usr/local INSTALL_PATH=/tmp/install ./make-trace-cmd.sh install trace-cmd-v2.9.6/README000066400000000000000000000023721414302661500144430ustar00rootroot00000000000000 For more information on contributing please see: https://www.trace-cmd.org Note: The official repositiory for trace-cmd and KernelShark is here: git://git.kernel.org/pub/scm/utils/trace-cmd/trace-cmd.git For bug reports and issues, please file it here: https://bugzilla.kernel.org/buglist.cgi?component=Trace-cmd%2FKernelshark&product=Tools&resolution=--- These files make up the code that create the trace-cmd programs. This includes the GUI interface application kernelshark as well as trace-graph and trace-view. These files also make up the code to create the libraries libtracecmd and libparsevent The applications are licensed under the GNU General Public License 2.0 (see COPYING) and the libraries are licensed under the GNU Lesser General Public License 2.1 (See COPYING.LIB). BUILDING: To make trace-cmd make To make the gui make gui INSTALL: To install trace-cmd make install To install the gui make install_gui Note: The default install is relative to /usr/local The default install directory is /usr/local/bin The default plugin directory is /usr/local/lib/trace-cmd/plugins To change the default, you can set 'prefix', eg mkdir $HOME/test-trace make prefix=$HOME/test-trace make prefix=$HOME/test-trace install trace-cmd-v2.9.6/features.mk000066400000000000000000000023461414302661500157330ustar00rootroot00000000000000# SPDX-License-Identifier: GPL-2.0 # taken from perf which was based on Linux Kbuild # try-cc # Usage: option = $(call try-cc, source-to-build, cc-options) try-cc = $(shell sh -c \ 'TMP="$(BUILD_OUTPUT)$(TMPOUT).$$$$"; \ echo "$(1)" | \ $(CC) -x c - $(2) -o "$$TMP" > /dev/null 2>&1 && echo y; \ rm -f "$$TMP"') define SOURCE_PTRACE #include #include int main (void) { int ret; ret = ptrace(PTRACE_ATTACH, 0, NULL, 0); ptrace(PTRACE_TRACEME, 0, NULL, 0); ptrace(PTRACE_GETSIGINFO, 0, NULL, NULL); ptrace(PTRACE_GETEVENTMSG, 0, NULL, NULL); ptrace(PTRACE_SETOPTIONS, NULL, NULL, PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE | PTRACE_O_TRACEEXIT); ptrace(PTRACE_CONT, NULL, NULL, 0); ptrace(PTRACE_DETACH, 0, NULL, NULL); ptrace(PTRACE_SETOPTIONS, 0, NULL, PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE | PTRACE_O_TRACEEXIT); return ret; } endef define SOURCE_AUDIT #include #include int main (void) { char *name; int ret; ret = audit_detect_machine(); if (ret < 0) return ret; name = audit_syscall_to_name(1, ret); if (!name) return -1; return ret; } endef trace-cmd-v2.9.6/include/000077500000000000000000000000001414302661500152025ustar00rootroot00000000000000trace-cmd-v2.9.6/include/linux/000077500000000000000000000000001414302661500163415ustar00rootroot00000000000000trace-cmd-v2.9.6/include/linux/time64.h000066400000000000000000000005341414302661500176240ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0 */ #ifndef _TOOLS_LINUX_TIME64_H #define _TOOLS_LINUX_TIME64_H #define MSEC_PER_SEC 1000L #define USEC_PER_MSEC 1000L #define NSEC_PER_USEC 1000L #define NSEC_PER_MSEC 1000000L #define USEC_PER_SEC 1000000L #define NSEC_PER_SEC 1000000000L #define FSEC_PER_SEC 1000000000000000LL #endif /* _LINUX_TIME64_H */ trace-cmd-v2.9.6/include/trace-cmd/000077500000000000000000000000001414302661500170415ustar00rootroot00000000000000trace-cmd-v2.9.6/include/trace-cmd/trace-cmd.h000066400000000000000000000031551414302661500210550ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2008, 2009, 2010 Red Hat Inc, Steven Rostedt * */ #ifndef _TRACE_CMD_H #define _TRACE_CMD_H #include "event-parse.h" #include "tracefs.h" struct tracecmd_input; enum tracecmd_open_flags { TRACECMD_FL_LOAD_NO_PLUGINS = 1 << 0, /* Do not load plugins */ TRACECMD_FL_LOAD_NO_SYSTEM_PLUGINS = 1 << 1, /* Do not load system plugins */ }; struct tracecmd_input *tracecmd_open_head(const char *file, int flags); struct tracecmd_input *tracecmd_open(const char *file, int flags); struct tracecmd_input *tracecmd_open_fd(int fd, int flags); void tracecmd_close(struct tracecmd_input *handle); int tracecmd_init_data(struct tracecmd_input *handle); struct tep_record * tracecmd_read_cpu_first(struct tracecmd_input *handle, int cpu); struct tep_record * tracecmd_read_data(struct tracecmd_input *handle, int cpu); struct tep_record * tracecmd_read_at(struct tracecmd_input *handle, unsigned long long offset, int *cpu); void tracecmd_free_record(struct tep_record *record); struct tep_handle *tracecmd_get_tep(struct tracecmd_input *handle); unsigned long long tracecmd_get_traceid(struct tracecmd_input *handle); int tracecmd_get_guest_cpumap(struct tracecmd_input *handle, unsigned long long trace_id, const char **name, int *vcpu_count, const int **cpu_pid); int tracecmd_buffer_instances(struct tracecmd_input *handle); const char *tracecmd_buffer_instance_name(struct tracecmd_input *handle, int indx); struct tracecmd_input *tracecmd_buffer_instance_handle(struct tracecmd_input *handle, int indx); #endif /* _TRACE_CMD_H */ trace-cmd-v2.9.6/include/traceevent/000077500000000000000000000000001414302661500173425ustar00rootroot00000000000000trace-cmd-v2.9.6/include/traceevent/event-parse.h000066400000000000000000000515151414302661500217530ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt * */ #ifndef _PARSE_EVENTS_H #define _PARSE_EVENTS_H #include #include #include #include #include #include #include "trace-seq.h" #ifndef __maybe_unused #define __maybe_unused __attribute__((unused)) #endif #ifndef DEBUG_RECORD #define DEBUG_RECORD 0 #endif struct tep_record { unsigned long long ts; unsigned long long offset; long long missed_events; /* buffer dropped events before */ int record_size; /* size of binary record */ int size; /* size of data */ void *data; int cpu; int ref_count; int locked; /* Do not free, even if ref_count is zero */ void *priv; #if DEBUG_RECORD struct tep_record *prev; struct tep_record *next; long alloc_addr; #endif }; /* ----------------------- tep ----------------------- */ struct tep_handle; struct tep_event; typedef int (*tep_event_handler_func)(struct trace_seq *s, struct tep_record *record, struct tep_event *event, void *context); typedef int (*tep_plugin_load_func)(struct tep_handle *tep); typedef int (*tep_plugin_unload_func)(struct tep_handle *tep); struct tep_plugin_option { struct tep_plugin_option *next; void *handle; char *file; char *name; char *plugin_alias; char *description; const char *value; void *priv; int set; }; /* * Plugin hooks that can be called: * * TEP_PLUGIN_LOADER: (required) * The function name to initialized the plugin. * * int TEP_PLUGIN_LOADER(struct tep_handle *tep) * * TEP_PLUGIN_UNLOADER: (optional) * The function called just before unloading * * int TEP_PLUGIN_UNLOADER(struct tep_handle *tep) * * TEP_PLUGIN_OPTIONS: (optional) * Plugin options that can be set before loading * * struct tep_plugin_option TEP_PLUGIN_OPTIONS[] = { * { * .name = "option-name", * .plugin_alias = "override-file-name", (optional) * .description = "description of option to show users", * }, * { * .name = NULL, * }, * }; * * Array must end with .name = NULL; * * * .plugin_alias is used to give a shorter name to access * the vairable. Useful if a plugin handles more than one event. * * If .value is not set, then it is considered a boolean and only * .set will be processed. If .value is defined, then it is considered * a string option and .set will be ignored. * * TEP_PLUGIN_ALIAS: (optional) * The name to use for finding options (uses filename if not defined) */ #define TEP_PLUGIN_LOADER tep_plugin_loader #define TEP_PLUGIN_UNLOADER tep_plugin_unloader #define TEP_PLUGIN_OPTIONS tep_plugin_options #define TEP_PLUGIN_ALIAS tep_plugin_alias #define _MAKE_STR(x) #x #define MAKE_STR(x) _MAKE_STR(x) #define TEP_PLUGIN_LOADER_NAME MAKE_STR(TEP_PLUGIN_LOADER) #define TEP_PLUGIN_UNLOADER_NAME MAKE_STR(TEP_PLUGIN_UNLOADER) #define TEP_PLUGIN_OPTIONS_NAME MAKE_STR(TEP_PLUGIN_OPTIONS) #define TEP_PLUGIN_ALIAS_NAME MAKE_STR(TEP_PLUGIN_ALIAS) enum tep_format_flags { TEP_FIELD_IS_ARRAY = 1, TEP_FIELD_IS_POINTER = 2, TEP_FIELD_IS_SIGNED = 4, TEP_FIELD_IS_STRING = 8, TEP_FIELD_IS_DYNAMIC = 16, TEP_FIELD_IS_LONG = 32, TEP_FIELD_IS_FLAG = 64, TEP_FIELD_IS_SYMBOLIC = 128, }; struct tep_format_field { struct tep_format_field *next; struct tep_event *event; char *type; char *name; char *alias; int offset; int size; unsigned int arraylen; unsigned int elementsize; unsigned long flags; }; struct tep_format { int nr_common; int nr_fields; struct tep_format_field *common_fields; struct tep_format_field *fields; }; struct tep_print_arg_atom { char *atom; }; struct tep_print_arg_string { char *string; int offset; }; struct tep_print_arg_bitmask { char *bitmask; int offset; }; struct tep_print_arg_field { char *name; struct tep_format_field *field; }; struct tep_print_flag_sym { struct tep_print_flag_sym *next; char *value; char *str; }; struct tep_print_arg_typecast { char *type; struct tep_print_arg *item; }; struct tep_print_arg_flags { struct tep_print_arg *field; char *delim; struct tep_print_flag_sym *flags; }; struct tep_print_arg_symbol { struct tep_print_arg *field; struct tep_print_flag_sym *symbols; }; struct tep_print_arg_hex { struct tep_print_arg *field; struct tep_print_arg *size; }; struct tep_print_arg_int_array { struct tep_print_arg *field; struct tep_print_arg *count; struct tep_print_arg *el_size; }; struct tep_print_arg_dynarray { struct tep_format_field *field; struct tep_print_arg *index; }; struct tep_print_arg; struct tep_print_arg_op { char *op; int prio; struct tep_print_arg *left; struct tep_print_arg *right; }; struct tep_function_handler; struct tep_print_arg_func { struct tep_function_handler *func; struct tep_print_arg *args; }; enum tep_print_arg_type { TEP_PRINT_NULL, TEP_PRINT_ATOM, TEP_PRINT_FIELD, TEP_PRINT_FLAGS, TEP_PRINT_SYMBOL, TEP_PRINT_HEX, TEP_PRINT_INT_ARRAY, TEP_PRINT_TYPE, TEP_PRINT_STRING, TEP_PRINT_BSTRING, TEP_PRINT_DYNAMIC_ARRAY, TEP_PRINT_OP, TEP_PRINT_FUNC, TEP_PRINT_BITMASK, TEP_PRINT_DYNAMIC_ARRAY_LEN, TEP_PRINT_HEX_STR, }; struct tep_print_arg { struct tep_print_arg *next; enum tep_print_arg_type type; union { struct tep_print_arg_atom atom; struct tep_print_arg_field field; struct tep_print_arg_typecast typecast; struct tep_print_arg_flags flags; struct tep_print_arg_symbol symbol; struct tep_print_arg_hex hex; struct tep_print_arg_int_array int_array; struct tep_print_arg_func func; struct tep_print_arg_string string; struct tep_print_arg_bitmask bitmask; struct tep_print_arg_op op; struct tep_print_arg_dynarray dynarray; }; }; struct tep_print_parse; struct tep_print_fmt { char *format; struct tep_print_arg *args; struct tep_print_parse *print_cache; }; struct tep_event { struct tep_handle *tep; char *name; int id; int flags; struct tep_format format; struct tep_print_fmt print_fmt; char *system; tep_event_handler_func handler; void *context; }; enum { TEP_EVENT_FL_ISFTRACE = 0x01, TEP_EVENT_FL_ISPRINT = 0x02, TEP_EVENT_FL_ISBPRINT = 0x04, TEP_EVENT_FL_ISFUNCENT = 0x10, TEP_EVENT_FL_ISFUNCRET = 0x20, TEP_EVENT_FL_NOHANDLE = 0x40, TEP_EVENT_FL_PRINTRAW = 0x80, TEP_EVENT_FL_FAILED = 0x80000000 }; enum tep_event_sort_type { TEP_EVENT_SORT_ID, TEP_EVENT_SORT_NAME, TEP_EVENT_SORT_SYSTEM, }; enum tep_event_type { TEP_EVENT_ERROR, TEP_EVENT_NONE, TEP_EVENT_SPACE, TEP_EVENT_NEWLINE, TEP_EVENT_OP, TEP_EVENT_DELIM, TEP_EVENT_ITEM, TEP_EVENT_DQUOTE, TEP_EVENT_SQUOTE, }; typedef unsigned long long (*tep_func_handler)(struct trace_seq *s, unsigned long long *args); enum tep_func_arg_type { TEP_FUNC_ARG_VOID, TEP_FUNC_ARG_INT, TEP_FUNC_ARG_LONG, TEP_FUNC_ARG_STRING, TEP_FUNC_ARG_PTR, TEP_FUNC_ARG_MAX_TYPES }; enum tep_flag { TEP_NSEC_OUTPUT = 1, /* output in NSECS */ TEP_DISABLE_SYS_PLUGINS = 1 << 1, TEP_DISABLE_PLUGINS = 1 << 2, }; #define TEP_ERRORS \ _PE(MEM_ALLOC_FAILED, "failed to allocate memory"), \ _PE(PARSE_EVENT_FAILED, "failed to parse event"), \ _PE(READ_ID_FAILED, "failed to read event id"), \ _PE(READ_FORMAT_FAILED, "failed to read event format"), \ _PE(READ_PRINT_FAILED, "failed to read event print fmt"), \ _PE(OLD_FTRACE_ARG_FAILED,"failed to allocate field name for ftrace"),\ _PE(INVALID_ARG_TYPE, "invalid argument type"), \ _PE(INVALID_EXP_TYPE, "invalid expression type"), \ _PE(INVALID_OP_TYPE, "invalid operator type"), \ _PE(INVALID_EVENT_NAME, "invalid event name"), \ _PE(EVENT_NOT_FOUND, "no event found"), \ _PE(SYNTAX_ERROR, "syntax error"), \ _PE(ILLEGAL_RVALUE, "illegal rvalue"), \ _PE(ILLEGAL_LVALUE, "illegal lvalue for string comparison"), \ _PE(INVALID_REGEX, "regex did not compute"), \ _PE(ILLEGAL_STRING_CMP, "illegal comparison for string"), \ _PE(ILLEGAL_INTEGER_CMP,"illegal comparison for integer"), \ _PE(REPARENT_NOT_OP, "cannot reparent other than OP"), \ _PE(REPARENT_FAILED, "failed to reparent filter OP"), \ _PE(BAD_FILTER_ARG, "bad arg in filter tree"), \ _PE(UNEXPECTED_TYPE, "unexpected type (not a value)"), \ _PE(ILLEGAL_TOKEN, "illegal token"), \ _PE(INVALID_PAREN, "open parenthesis cannot come here"), \ _PE(UNBALANCED_PAREN, "unbalanced number of parenthesis"), \ _PE(UNKNOWN_TOKEN, "unknown token"), \ _PE(FILTER_NOT_FOUND, "no filter found"), \ _PE(NOT_A_NUMBER, "must have number field"), \ _PE(NO_FILTER, "no filters exists"), \ _PE(FILTER_MISS, "record does not match to filter") #undef _PE #define _PE(__code, __str) TEP_ERRNO__ ## __code enum tep_errno { TEP_ERRNO__SUCCESS = 0, TEP_ERRNO__FILTER_MATCH = TEP_ERRNO__SUCCESS, /* * Choose an arbitrary negative big number not to clash with standard * errno since SUS requires the errno has distinct positive values. * See 'Issue 6' in the link below. * * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html */ __TEP_ERRNO__START = -100000, TEP_ERRORS, __TEP_ERRNO__END, }; #undef _PE struct tep_plugin_list; #define INVALID_PLUGIN_LIST_OPTION ((char **)((unsigned long)-1)) enum tep_plugin_load_priority { TEP_PLUGIN_FIRST, TEP_PLUGIN_LAST, }; int tep_add_plugin_path(struct tep_handle *tep, char *path, enum tep_plugin_load_priority prio); struct tep_plugin_list *tep_load_plugins(struct tep_handle *tep); void tep_unload_plugins(struct tep_plugin_list *plugin_list, struct tep_handle *tep); void tep_load_plugins_hook(struct tep_handle *tep, const char *suffix, void (*load_plugin)(struct tep_handle *tep, const char *path, const char *name, void *data), void *data); char **tep_plugin_list_options(void); void tep_plugin_free_options_list(char **list); int tep_plugin_add_options(const char *name, struct tep_plugin_option *options); int tep_plugin_add_option(const char *name, const char *val); void tep_plugin_remove_options(struct tep_plugin_option *options); void tep_plugin_print_options(struct trace_seq *s); void tep_print_plugins(struct trace_seq *s, const char *prefix, const char *suffix, const struct tep_plugin_list *list); /* tep_handle */ typedef char *(tep_func_resolver_t)(void *priv, unsigned long long *addrp, char **modp); void tep_set_flag(struct tep_handle *tep, int flag); void tep_clear_flag(struct tep_handle *tep, enum tep_flag flag); bool tep_test_flag(struct tep_handle *tep, enum tep_flag flags); static inline int tep_is_bigendian(void) { unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 }; unsigned int val; memcpy(&val, str, 4); return val == 0x01020304; } /* taken from kernel/trace/trace.h */ enum trace_flag_type { TRACE_FLAG_IRQS_OFF = 0x01, TRACE_FLAG_IRQS_NOSUPPORT = 0x02, TRACE_FLAG_NEED_RESCHED = 0x04, TRACE_FLAG_HARDIRQ = 0x08, TRACE_FLAG_SOFTIRQ = 0x10, }; int tep_set_function_resolver(struct tep_handle *tep, tep_func_resolver_t *func, void *priv); void tep_reset_function_resolver(struct tep_handle *tep); int tep_register_comm(struct tep_handle *tep, const char *comm, int pid); int tep_override_comm(struct tep_handle *tep, const char *comm, int pid); int tep_register_function(struct tep_handle *tep, char *name, unsigned long long addr, char *mod); int tep_register_print_string(struct tep_handle *tep, const char *fmt, unsigned long long addr); bool tep_is_pid_registered(struct tep_handle *tep, int pid); #define TEP_PRINT_INFO "INFO" #define TEP_PRINT_INFO_RAW "INFO_RAW" #define TEP_PRINT_COMM "COMM" #define TEP_PRINT_LATENCY "LATENCY" #define TEP_PRINT_NAME "NAME" #define TEP_PRINT_PID 1U #define TEP_PRINT_TIME 2U #define TEP_PRINT_CPU 3U void tep_print_event(struct tep_handle *tep, struct trace_seq *s, struct tep_record *record, const char *fmt, ...) __attribute__ ((format (printf, 4, 5))); int tep_parse_header_page(struct tep_handle *tep, char *buf, unsigned long size, int long_size); enum tep_errno tep_parse_event(struct tep_handle *tep, const char *buf, unsigned long size, const char *sys); enum tep_errno tep_parse_format(struct tep_handle *tep, struct tep_event **eventp, const char *buf, unsigned long size, const char *sys); void *tep_get_field_raw(struct trace_seq *s, struct tep_event *event, const char *name, struct tep_record *record, int *len, int err); int tep_get_field_val(struct trace_seq *s, struct tep_event *event, const char *name, struct tep_record *record, unsigned long long *val, int err); int tep_get_common_field_val(struct trace_seq *s, struct tep_event *event, const char *name, struct tep_record *record, unsigned long long *val, int err); int tep_get_any_field_val(struct trace_seq *s, struct tep_event *event, const char *name, struct tep_record *record, unsigned long long *val, int err); int tep_print_num_field(struct trace_seq *s, const char *fmt, struct tep_event *event, const char *name, struct tep_record *record, int err); int tep_print_func_field(struct trace_seq *s, const char *fmt, struct tep_event *event, const char *name, struct tep_record *record, int err); enum tep_reg_handler { TEP_REGISTER_SUCCESS = 0, TEP_REGISTER_SUCCESS_OVERWRITE, }; int tep_register_event_handler(struct tep_handle *tep, int id, const char *sys_name, const char *event_name, tep_event_handler_func func, void *context); int tep_unregister_event_handler(struct tep_handle *tep, int id, const char *sys_name, const char *event_name, tep_event_handler_func func, void *context); int tep_register_print_function(struct tep_handle *tep, tep_func_handler func, enum tep_func_arg_type ret_type, char *name, ...); int tep_unregister_print_function(struct tep_handle *tep, tep_func_handler func, char *name); struct tep_format_field *tep_find_common_field(struct tep_event *event, const char *name); struct tep_format_field *tep_find_field(struct tep_event *event, const char *name); struct tep_format_field *tep_find_any_field(struct tep_event *event, const char *name); const char *tep_find_function(struct tep_handle *tep, unsigned long long addr); unsigned long long tep_find_function_address(struct tep_handle *tep, unsigned long long addr); unsigned long long tep_read_number(struct tep_handle *tep, const void *ptr, int size); int tep_read_number_field(struct tep_format_field *field, const void *data, unsigned long long *value); struct tep_event *tep_get_first_event(struct tep_handle *tep); struct tep_event *tep_get_event(struct tep_handle *tep, int index); int tep_get_events_count(struct tep_handle *tep); struct tep_event *tep_find_event(struct tep_handle *tep, int id); struct tep_event * tep_find_event_by_name(struct tep_handle *tep, const char *sys, const char *name); struct tep_event * tep_find_event_by_record(struct tep_handle *tep, struct tep_record *record); int tep_data_type(struct tep_handle *tep, struct tep_record *rec); int tep_data_pid(struct tep_handle *tep, struct tep_record *rec); int tep_data_preempt_count(struct tep_handle *tep, struct tep_record *rec); int tep_data_flags(struct tep_handle *tep, struct tep_record *rec); const char *tep_data_comm_from_pid(struct tep_handle *tep, int pid); struct tep_cmdline; struct tep_cmdline *tep_data_pid_from_comm(struct tep_handle *tep, const char *comm, struct tep_cmdline *next); int tep_cmdline_pid(struct tep_handle *tep, struct tep_cmdline *cmdline); void tep_print_field(struct trace_seq *s, void *data, struct tep_format_field *field); void tep_print_fields(struct trace_seq *s, void *data, int size __maybe_unused, struct tep_event *event); int tep_strerror(struct tep_handle *tep, enum tep_errno errnum, char *buf, size_t buflen); struct tep_event **tep_list_events(struct tep_handle *tep, enum tep_event_sort_type); struct tep_event **tep_list_events_copy(struct tep_handle *tep, enum tep_event_sort_type); struct tep_format_field **tep_event_common_fields(struct tep_event *event); struct tep_format_field **tep_event_fields(struct tep_event *event); enum tep_endian { TEP_LITTLE_ENDIAN = 0, TEP_BIG_ENDIAN }; int tep_get_cpus(struct tep_handle *tep); void tep_set_cpus(struct tep_handle *tep, int cpus); int tep_get_long_size(struct tep_handle *tep); void tep_set_long_size(struct tep_handle *tep, int long_size); int tep_get_page_size(struct tep_handle *tep); void tep_set_page_size(struct tep_handle *tep, int _page_size); bool tep_is_file_bigendian(struct tep_handle *tep); void tep_set_file_bigendian(struct tep_handle *tep, enum tep_endian endian); bool tep_is_local_bigendian(struct tep_handle *tep); void tep_set_local_bigendian(struct tep_handle *tep, enum tep_endian endian); int tep_get_header_page_size(struct tep_handle *tep); int tep_get_header_timestamp_size(struct tep_handle *tep); bool tep_is_old_format(struct tep_handle *tep); void tep_set_test_filters(struct tep_handle *tep, int test_filters); struct tep_handle *tep_alloc(void); void tep_free(struct tep_handle *tep); void tep_ref(struct tep_handle *tep); void tep_unref(struct tep_handle *tep); int tep_get_ref(struct tep_handle *tep); /* for debugging */ void tep_print_funcs(struct tep_handle *tep); void tep_print_printk(struct tep_handle *tep); /* ----------------------- filtering ----------------------- */ enum tep_filter_boolean_type { TEP_FILTER_FALSE, TEP_FILTER_TRUE, }; enum tep_filter_op_type { TEP_FILTER_OP_AND = 1, TEP_FILTER_OP_OR, TEP_FILTER_OP_NOT, }; enum tep_filter_cmp_type { TEP_FILTER_CMP_NONE, TEP_FILTER_CMP_EQ, TEP_FILTER_CMP_NE, TEP_FILTER_CMP_GT, TEP_FILTER_CMP_LT, TEP_FILTER_CMP_GE, TEP_FILTER_CMP_LE, TEP_FILTER_CMP_MATCH, TEP_FILTER_CMP_NOT_MATCH, TEP_FILTER_CMP_REGEX, TEP_FILTER_CMP_NOT_REGEX, }; enum tep_filter_exp_type { TEP_FILTER_EXP_NONE, TEP_FILTER_EXP_ADD, TEP_FILTER_EXP_SUB, TEP_FILTER_EXP_MUL, TEP_FILTER_EXP_DIV, TEP_FILTER_EXP_MOD, TEP_FILTER_EXP_RSHIFT, TEP_FILTER_EXP_LSHIFT, TEP_FILTER_EXP_AND, TEP_FILTER_EXP_OR, TEP_FILTER_EXP_XOR, TEP_FILTER_EXP_NOT, }; enum tep_filter_arg_type { TEP_FILTER_ARG_NONE, TEP_FILTER_ARG_BOOLEAN, TEP_FILTER_ARG_VALUE, TEP_FILTER_ARG_FIELD, TEP_FILTER_ARG_EXP, TEP_FILTER_ARG_OP, TEP_FILTER_ARG_NUM, TEP_FILTER_ARG_STR, }; enum tep_filter_value_type { TEP_FILTER_NUMBER, TEP_FILTER_STRING, TEP_FILTER_CHAR }; struct tep_filter_arg; struct tep_filter_arg_boolean { enum tep_filter_boolean_type value; }; struct tep_filter_arg_field { struct tep_format_field *field; }; struct tep_filter_arg_value { enum tep_filter_value_type type; union { char *str; unsigned long long val; }; }; struct tep_filter_arg_op { enum tep_filter_op_type type; struct tep_filter_arg *left; struct tep_filter_arg *right; }; struct tep_filter_arg_exp { enum tep_filter_exp_type type; struct tep_filter_arg *left; struct tep_filter_arg *right; }; struct tep_filter_arg_num { enum tep_filter_cmp_type type; struct tep_filter_arg *left; struct tep_filter_arg *right; }; struct tep_filter_arg_str { enum tep_filter_cmp_type type; struct tep_format_field *field; char *val; char *buffer; regex_t reg; }; struct tep_filter_arg { enum tep_filter_arg_type type; union { struct tep_filter_arg_boolean boolean; struct tep_filter_arg_field field; struct tep_filter_arg_value value; struct tep_filter_arg_op op; struct tep_filter_arg_exp exp; struct tep_filter_arg_num num; struct tep_filter_arg_str str; }; }; struct tep_filter_type { int event_id; struct tep_event *event; struct tep_filter_arg *filter; }; #define TEP_FILTER_ERROR_BUFSZ 1024 struct tep_event_filter { struct tep_handle *tep; int filters; struct tep_filter_type *event_filters; char error_buffer[TEP_FILTER_ERROR_BUFSZ]; }; struct tep_event_filter *tep_filter_alloc(struct tep_handle *tep); /* for backward compatibility */ #define FILTER_NONE TEP_ERRNO__NO_FILTER #define FILTER_NOEXIST TEP_ERRNO__FILTER_NOT_FOUND #define FILTER_MISS TEP_ERRNO__FILTER_MISS #define FILTER_MATCH TEP_ERRNO__FILTER_MATCH enum tep_errno tep_filter_add_filter_str(struct tep_event_filter *filter, const char *filter_str); enum tep_errno tep_filter_match(struct tep_event_filter *filter, struct tep_record *record); int tep_filter_strerror(struct tep_event_filter *filter, enum tep_errno err, char *buf, size_t buflen); int tep_event_filtered(struct tep_event_filter *filter, int event_id); void tep_filter_reset(struct tep_event_filter *filter); void tep_filter_free(struct tep_event_filter *filter); char *tep_filter_make_string(struct tep_event_filter *filter, int event_id); int tep_filter_remove_event(struct tep_event_filter *filter, int event_id); int tep_filter_copy(struct tep_event_filter *dest, struct tep_event_filter *source); int tep_filter_compare(struct tep_event_filter *filter1, struct tep_event_filter *filter2); #endif /* _PARSE_EVENTS_H */ trace-cmd-v2.9.6/include/traceevent/kbuffer.h000066400000000000000000000034551414302661500211460ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2012 Red Hat Inc, Steven Rostedt * */ #ifndef _KBUFFER_H #define _KBUFFER_H #ifndef TS_SHIFT #define TS_SHIFT 27 #endif enum kbuffer_endian { KBUFFER_ENDIAN_BIG, KBUFFER_ENDIAN_LITTLE, }; enum kbuffer_long_size { KBUFFER_LSIZE_4, KBUFFER_LSIZE_8, }; enum { KBUFFER_TYPE_PADDING = 29, KBUFFER_TYPE_TIME_EXTEND = 30, KBUFFER_TYPE_TIME_STAMP = 31, }; struct kbuffer; struct kbuffer *kbuffer_alloc(enum kbuffer_long_size size, enum kbuffer_endian endian); void kbuffer_free(struct kbuffer *kbuf); int kbuffer_load_subbuffer(struct kbuffer *kbuf, void *subbuffer); void *kbuffer_read_event(struct kbuffer *kbuf, unsigned long long *ts); void *kbuffer_next_event(struct kbuffer *kbuf, unsigned long long *ts); unsigned long long kbuffer_timestamp(struct kbuffer *kbuf); unsigned long long kbuffer_subbuf_timestamp(struct kbuffer *kbuf, void *subbuf); unsigned int kbuffer_ptr_delta(struct kbuffer *kbuf, void *ptr); void *kbuffer_translate_data(int swap, void *data, unsigned int *size); void *kbuffer_read_at_offset(struct kbuffer *kbuf, int offset, unsigned long long *ts); int kbuffer_curr_index(struct kbuffer *kbuf); int kbuffer_curr_offset(struct kbuffer *kbuf); int kbuffer_curr_size(struct kbuffer *kbuf); int kbuffer_event_size(struct kbuffer *kbuf); int kbuffer_missed_events(struct kbuffer *kbuf); int kbuffer_subbuffer_size(struct kbuffer *kbuf); void kbuffer_set_old_format(struct kbuffer *kbuf); int kbuffer_start_of_data(struct kbuffer *kbuf); /* Debugging */ struct kbuffer_raw_info { int type; int length; unsigned long long delta; void *next; }; /* Read raw data */ struct kbuffer_raw_info *kbuffer_raw_get(struct kbuffer *kbuf, void *subbuf, struct kbuffer_raw_info *info); #endif /* _K_BUFFER_H */ trace-cmd-v2.9.6/include/traceevent/trace-seq.h000066400000000000000000000026331414302661500214030ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt * */ #ifndef _TRACE_SEQ_H #define _TRACE_SEQ_H #include #include /* ----------------------- trace_seq ----------------------- */ #ifndef TRACE_SEQ_BUF_SIZE #define TRACE_SEQ_BUF_SIZE 4096 #endif enum trace_seq_fail { TRACE_SEQ__GOOD, TRACE_SEQ__BUFFER_POISONED, TRACE_SEQ__MEM_ALLOC_FAILED, }; /* * Trace sequences are used to allow a function to call several other functions * to create a string of data to use (up to a max of PAGE_SIZE). */ struct trace_seq { char *buffer; unsigned int buffer_size; unsigned int len; unsigned int readpos; enum trace_seq_fail state; }; void trace_seq_init(struct trace_seq *s); void trace_seq_reset(struct trace_seq *s); void trace_seq_destroy(struct trace_seq *s); extern int trace_seq_printf(struct trace_seq *s, const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); extern int trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args) __attribute__ ((format (printf, 2, 0))); extern int trace_seq_puts(struct trace_seq *s, const char *str); extern int trace_seq_putc(struct trace_seq *s, unsigned char c); extern void trace_seq_terminate(struct trace_seq *s); extern int trace_seq_do_fprintf(struct trace_seq *s, FILE *fp); extern int trace_seq_do_printf(struct trace_seq *s); #endif /* _TRACE_SEQ_H */ trace-cmd-v2.9.6/include/tracefs/000077500000000000000000000000001414302661500166315ustar00rootroot00000000000000trace-cmd-v2.9.6/include/tracefs/tracefs.h000066400000000000000000000043341414302661500204350ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2019, VMware, Tzvetomir Stoyanov * */ #ifndef _TRACE_FS_H #define _TRACE_FS_H #include #include "event-parse.h" char *tracefs_get_tracing_file(const char *name); void tracefs_put_tracing_file(char *name); /* The returned string must *not* be freed */ const char *tracefs_tracing_dir(void); /* ftarce instances */ struct tracefs_instance; void tracefs_instance_free(struct tracefs_instance *instance); struct tracefs_instance *tracefs_instance_create(const char *name); int tracefs_instance_destroy(struct tracefs_instance *instance); bool tracefs_instance_is_new(struct tracefs_instance *instance); const char *tracefs_instance_get_name(struct tracefs_instance *instance); char * tracefs_instance_get_file(struct tracefs_instance *instance, const char *file); char *tracefs_instance_get_dir(struct tracefs_instance *instance); int tracefs_instance_file_write(struct tracefs_instance *instance, const char *file, const char *str); char *tracefs_instance_file_read(struct tracefs_instance *instance, char *file, int *psize); int tracefs_instances_walk(int (*callback)(const char *, void *), void *context); bool tracefs_instance_exists(const char *name); bool tracefs_file_exists(struct tracefs_instance *instance, char *name); bool tracefs_dir_exists(struct tracefs_instance *instance, char *name); /* events */ void tracefs_list_free(char **list); char **tracefs_event_systems(const char *tracing_dir); char **tracefs_system_events(const char *tracing_dir, const char *system); int tracefs_iterate_raw_events(struct tep_handle *tep, struct tracefs_instance *instance, cpu_set_t *cpus, int cpu_size, int (*callback)(struct tep_event *, struct tep_record *, int, void *), void *callback_context); char **tracefs_tracers(const char *tracing_dir); struct tep_handle *tracefs_local_events(const char *tracing_dir); struct tep_handle *tracefs_local_events_system(const char *tracing_dir, const char * const *sys_names); int tracefs_fill_local_events(const char *tracing_dir, struct tep_handle *tep, int *parsing_failures); char *tracefs_get_clock(struct tracefs_instance *instance); #endif /* _TRACE_FS_H */ trace-cmd-v2.9.6/include/version.h000066400000000000000000000002671414302661500170450ustar00rootroot00000000000000#ifndef _VERSION_H #define _VERSION_H #define VERSION(a, b) (((a) << 8) + (b)) #ifdef BUILDGUI #include "ks_version.h" #else #include "tc_version.h" #endif #endif /* _VERSION_H */ trace-cmd-v2.9.6/kernel-shark/000077500000000000000000000000001414302661500161455ustar00rootroot00000000000000trace-cmd-v2.9.6/kernel-shark/CMakeLists.txt000066400000000000000000000065211414302661500207110ustar00rootroot00000000000000# Check if cmake has the required version cmake_minimum_required(VERSION 2.8.11 FATAL_ERROR) # Set the name and version of the project project(kernel-shark) set(KS_APP_NAME "kernelshark") set(KS_VERSION_MAJOR 1) set(KS_VERSION_MINOR 3) set(KS_VERSION_PATCH 0) set(KS_VERSION_STRING ${KS_VERSION_MAJOR}.${KS_VERSION_MINOR}.${KS_VERSION_PATCH}) message("\n project: Kernel Shark: (version: ${KS_VERSION_STRING})\n") set(KS_DIR ${CMAKE_SOURCE_DIR}) if (NOT _INSTALL_PREFIX) set(_INSTALL_PREFIX "/usr/local") endif (NOT _INSTALL_PREFIX) if (NOT _LIBDIR) set(_LIBDIR "${_INSTALL_PREFIX}/lib") endif (NOT _LIBDIR) include(${KS_DIR}/build/FindTraceCmd.cmake) include(${KS_DIR}/build/FindJSONC.cmake) find_package(Doxygen) set(OpenGL_GL_PREFERENCE LEGACY) find_package(OpenGL) find_package(GLUT) find_package(Qt5Widgets 5.7.1) find_package(Qt5Network) if (Qt5Widgets_FOUND) message(STATUS "Found Qt5Widgets: (version ${Qt5Widgets_VERSION})") endif (Qt5Widgets_FOUND) set(LIBRARY_OUTPUT_PATH "${KS_DIR}/lib") set(EXECUTABLE_OUTPUT_PATH "${KS_DIR}/bin") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -pthread -fPIC") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11 -pthread -fPIC") if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE RelWithDebInfo) endif (NOT CMAKE_BUILD_TYPE) message("\n Build type: ${CMAKE_BUILD_TYPE}") if (NOT CMAKE_C_FLAGS_PACKAGE) set(CMAKE_C_FLAGS_PACKAGE "-O3") endif (NOT CMAKE_C_FLAGS_PACKAGE) if (NOT CMAKE_CXX_FLAGS_PACKAGE) set(CMAKE_CXX_FLAGS_PACKAGE "-O3") endif (NOT CMAKE_CXX_FLAGS_PACKAGE) set(KS_PLUGIN_INSTALL_PREFIX ${_LIBDIR}/${KS_APP_NAME}/plugins/) set(KS_ICON KS_icon_shark.svg) set(KS_ICON_FIN KS_icon_fin.svg) set(KS_LOGO KS_logo_symbol.svg) set(KS_LOGO_LABEL KS_logo_horizontal.svg) set(CMAKE_INSTALL_RPATH "${_LIBDIR}/${KS_APP_NAME}/") if (CMAKE_BUILD_TYPE MATCHES Package) set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) else (CMAKE_BUILD_TYPE MATCHES Package) set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) endif (CMAKE_BUILD_TYPE MATCHES Package) include_directories(${KS_DIR}/src/ ${KS_DIR}/build/src/ ${JSONC_INCLUDE_DIR} ${TRACECMD_INCLUDE_DIR} ${TRACECMD_PRIVATE_INCLUDE_DIR} ${TRACEFS_INCLUDE_DIR}) message("") message(STATUS "C flags : " ${CMAKE_C_FLAGS}) message(STATUS "CXX flags : " ${CMAKE_CXX_FLAGS}) message(STATUS "Linker flags : " ${CMAKE_EXE_LINKER_FLAGS}) add_subdirectory(${KS_DIR}/src) add_subdirectory(${KS_DIR}/examples) if (_DOXYGEN_DOC AND DOXYGEN_FOUND) message("\n doxygen documentation ...") add_custom_target(doc ALL) add_custom_command(TARGET doc COMMAND doxygen dox_config > dox_build.log WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/Documentation/doxygen) set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "${KS_DIR}/Documentation/doxygen/dox_build.log" "${KS_DIR}/Documentation/doxygen/html" "${KS_DIR}/Documentation/doxygen/latex") endif () configure_file( ${KS_DIR}/build/ks.desktop.cmake ${KS_DIR}/${KS_APP_NAME}.desktop) configure_file( ${KS_DIR}/build/org.freedesktop.kshark-record.policy.cmake ${KS_DIR}/org.freedesktop.kshark-record.policy) message("") trace-cmd-v2.9.6/kernel-shark/Documentation/000077500000000000000000000000001414302661500207565ustar00rootroot00000000000000trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/000077500000000000000000000000001414302661500215225ustar00rootroot00000000000000trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/000077500000000000000000000000001414302661500227675ustar00rootroot00000000000000trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kernelshark-logo.svg000066400000000000000000000120171414302661500267600ustar00rootroot00000000000000logo_proposalsKERNELSHARKtrace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kernelshark.jpg000066400000000000000000001527271414302661500260200ustar00rootroot00000000000000,Photoshop 3.08BIMHHhttp://ns.adobe.com/xap/1.0/ image/jpeg Print 2017-12-05T11:33:42-05:00 2017-12-05T16:33:51Z 2017-12-05T11:33:42-05:00 Adobe Illustrator CC 2017 (Macintosh) 256 208 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA0AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXzP8A85Q2 djeeffL1tfXo0+2ksJOd0Y2lCkSOVHBPiPI7ZjagkchbZEkDZ5jp35bW1xLdpdawLQQam2kQMbZ5 PVmAquyt8HLwOYcs9ch0tBy+XS0DZ+SrS4h15TqoS/0P6yzWYgZvVittvUD8gqhm2oemSOUittik 5OW3NbJ5R0tdB03WRrIa2vLqO0vP9HcC2do/UkqeX7z0/wDJG+HxDxEUnjNkUin8haanmCy0mTWw seo2sNzZXX1WQ+o1xJwjjEYaoqPiqTkfFPCTXJHiGrpQtvJNlPFrqjVgL7RPrTtafV2JkitSAJOf LivNjSm9MJynbbmpyctua/UfIltZaD+kDqyyX4soNQbThA4IhuHRAfVrx2Z6e+Mctmq2ulGSzVIh fy6tLi80SLT9ZF3ba01wsd19XdAn1ZeTfAzVbeo7YPGIBsckeLzscnf8q4t5tR0a3stXW5tdYS5e O6+runD6qtXHBmq24p1GPjbGxyXxdjY5LIfIFhPqaw2+tLLpx0+TU/0gLaQD04ZDE49JiG2KnfE5 jXLe6XxDXJp/IWnx+ZbPR5NbVYdRtYrmxvfq0hEjTvxjj9PlyHIb1OPjHhJrknxDV0qab+XNrc+v 9a1gWgXU5NItv9HeQyzIQF+y3w8q9O3jjLMRyHS0HL5dLRFj+V1vcNbwz60sF3d3F3bWkH1Z39Q2 cjI55BqDZeVMic9dPwUHL5JJB5UtLjypda3DqQe6snjS60/0WHAyzekn70nieQ+LYe2WHIRKqZ8f qqky8wfl3a6TYalcR6wLq50poFvbYW7x8PrDAJ8ZYg7HlkYZrI25sY5bI25oC98raLbatp9udcVt M1CBp11P6tKFWjyRhfSrzNXjpXJCZIO24ZCZrk6DyjZPqGt6fLqgivNK9f6vF6DsbkWyyO5BBpHQ R/teOJyGga5rx7A1zTBPy6tm0lbr9MKL99MOrLYfV3/uQpP97y49Rx6ZHxt+W10x8Xfl1pz/AJdW y6S11+mFN+mmDVmsPq7/ANyVB/veXHqePTHxt+W10vi78utIfT/ItpqM2hx2WrCYau0sczfV3X6v LBCsrp8RHqEc6fDhllIuxySclXY5NX/kvSLRtJn/AE6r6VqjTp9f+rSKI2gAB/d8izVc8fb5YjKT e24UZCb23CJtfy6s5fNV/wCXJdYEN1ahDbMbZ2M9YvVkoof4OA/mO+ROY8IlSDl9N0+lP+cZv/JT WP8AzE3X/J05scXJZ83qmWMHYq7FXYq7FXYq7FXYq7FXy7/zlmwXzloDNsBZEk+wnbMfNzbYcmJ6 b5n8nSz3hvNSa1RfMB1a1It3k9WFR8IoF+Hl7/dmvlCXQfw01GEu7pTH9O8waRHq/m25lmKRapa3 0dgeDHm88nKMGgJWo8aZZKBqPlTYYmh5IF9V08+QI9JEv+5FdUNy0PE/3Jg4BuVKfa7VyXCeO+lJ o8V+SZXvmHRZPM/lW9Scm0021sIr5+DVR4HJlHEr8VPYGuREDwyHfbERNELNP1/SItY83XEk9IdU tb6Kwfgx5vPLyjFONV5L4098TA1HypJiaCP1rXfKt15dMkGoO2qNpFppv1AwOAHhmjldvVpx/ZYb ffkYxkJctrJYxjK/K3eW/NWgWUfk8XNwVOlyX51ACNm9NbjkI/2TyrXtXGeOR4vOllAm/NH2/mXy lpmpeV0h1B7my0yO/Fzdm3kj+K5B4UQqWI5GlRXImEiJbc6Y8JIKFsda8n2WoJZLqry6cNEuNOOo G2dT6087SD91Rm2Vuv45IxkRdb8VsjGRHLqg9X17y8fOXly5tLtp9M0qGygnujEyEi3kJdvTIr03 6H6cMYS4TfM2mMTwnvKaaZ5k8oS+r9e1JrX0PMEmrwEW8kgliqOA2X4eQJ+108MhKEug/hpiYS6D pSM0/wA3eS2utOv7rU3gl0y81KcW/wBXkf1UvZXKfEFoPgau9fDBLHOiAOYH2IMJbiu5hej6zptv 5V8wWU0hW8vpbN7WLiTyWKYvJ8QBAoPE5fKJMgfe2yieIMl83eY/KNzpvmKTTtRa5vNbezaO1Nu8 fpi2IB+MgA1UV7ZVjhIEWOVtcIysX0YdqeoWc9toSRPyeztfSuhxI4v9Zlkp03+B1OXxBstoHNHn WdL/AMY6zqPqn6ldrqItpOBqxuIpFi+Gm3JnHbbI8J4QPcx4Twge5kkfmXygNJjuW1F/0inl86Qb D6u+8pUnl6lOP2qD+OVcEr5bcVsOCV/G3SeZfKB0mS5XUX/SL+XxpAsPq77ShQeXqU4/aqP448Er 5bcVrwSv42k/k3zHoumy6A17MYxZXl7Ld0Qtxjnt444zsp5VZTtvk8sCbruDKcSbUvNmpeXjo2h6 XpV81/8Ao+S5eecwvCKTurgUcV2PIYcYlZJFWmANklMl80+Xx+a0uu/WT+iWDBbj03rvaekPg48v t7fZyHhy8Ouv7WPAeCur6J/5xm/8lNY/8xN1/wAnTmyxckz5vVMsYOxV2KuxV2KuxV2KuxV2Kvmb /nKPSNR1fz35fsNOhNxdy2EhjiBVSeMjs27FR0GY2okI7lsjIAWXi0XknzPLBfXCWJMWmSSxXzep EPTeBecgILVPFd9sx/FjtvzZeIF3+BfNf6I/S/6Pb9HCH6yZ+cf90Ry58eXKlPbHxY3V7r4kbpZJ 5M8zR2lhdvYt9X1R4orBw8Z9V5hyjAAYkVHiPnj4sbIvkvGPkq3XkLzda3tnZT6cyXOoFxZx84j6 npryahDECgNdziM0SCb5IGSPe1ceQ/Ntve2tlNp7Lc3vM2yc4yG9JQ7/ABBiooprucRliRdqMkW5 /IPm6DUbXTpdPZb29EhtYvUiPMQism4fiOI8TgGaNXa+JGrtqz8iea7w3f1ewLixle3uyZIlCSxi rqasK8R4YTliOvNZZYjmU81byR5i1RbUaPZG4tbWMQlw8afECNvjZa9R9+Q8WMeZcHRZgRInrJJ7 P8vPOV5C01tprSRq8kRPqRA84nMbihcHZxTJHNEdXOOSI6qem+Q/NupWCX9lp7S2knIpJzjWvAkN RWYN1Q9u2GWWINEpOSINKdr5K8z3ejtrFvYNJpqo8rXHKMfBGSHbiWDUHA9sTliDV7qcgBpf/gXz X+iP0v8Ao9v0cIfrJn5x/wB0Ry58eXKlPbHxY3V7r4kbpbL5J8zxQWNw9iRFqckUVi3qRH1HnXnG AA1RyXffHxY778l8QKg8g+bTqf6LGnk34gFz6PqRf3LPwDcufHdtqVrg8aNXeyPEjVqUfkzzNJZ3 14lkTbac80d7J6kVEa3FZRTlU8a/s19sPixsC+aeMNy+SfM8UFjcPYkRanJFFYt6kR9R515xgANU cl33x8WO+/JfEDcPkfzVNrE+jRWDNqdtGJZ7fnHVUbjQ8i3H9sdDicsau9l8SNWhYvLetzaNca1H bFtMtX9Ke55JRXqopxJ5ftr0GEzF11TxC6RJ8k+aA+nR/UW56upfThzj/eqEEhI+Lb4WB+KmDxY7 78keIN/JUuPIXm23v7Swm09lur/n9Uj9SI8zGvN6MH4iimu5xGaJF3yQMkat1v5C823N/eWENgXu 9P4G8i9SIen6q8kqS9DUeBwHNEAG+anJGrfVX/OM3/kprH/mJuv+TpzOxcmM+b1TLGDsVdirsVdi rsVdirsVdir5e/5ywJHnTy/T/liP/J9sx83NthyYRpx/53PzwtRx+paoRuONeY6bU+W2YMvpj7w1 n6Y/BPPqFz/hw6p8H1H/AAl9V9TmlfXpy48ftVp/t9sr4vVXXjY3vX9JIvKbL/hfQC7KAPM8IJYg UHpDrUGgyzJ9R/qs58z/AFU/ttOutP8AOGii9CRm71XV7mGro1YZoU9MtTlxr4N92VGVwNdwaybi fcF2j6fc6Xd+TbDUOEd5GdVLxl0Y0dC6bjl1DCm/XbY4ylYkR5LI3ZHkxTznp15peheUrC9AS9g+ t+siurkcp1IqyVG49zl2KQMpEeTbjNklkE1lLd2OteiVP1XzPJcS0ZQRGqUBGwqORA2+7K4miP6r jZ58MD/VTO10681Cx0oWoVvqetQ3NyC6KVhSMcmPLru3Tf5dcjOQBN/zXH0W0D5q2mWFzdalol/B wa0sdR1k3khdBxWWeRUqDuQSffxyMjQI7wHLJoEeQQHk/T7m4svKWoQ8GsrGPU/rknNBxMrOI6g7 n7Pv9G2SyyoyHfSZnmPclumaddXHkzRb+EI1pY6drAu3LoOLSrIsY4n4iSR2B+jJmQEyO8xZE+oj zCP+oXP+HDqnwfUf8JfVfU5pX16cuPH7Vaf7fbI8Xqrrxovev6TC5Cf+VVwmu41o033FLXbL/wDK f5v6W3+P4JxqJ/53TyRuKGx0upqKbyGtdqfPbID6Ze8sB9MvipaUf9z/AJ9FdhZamQD4+t2xl9Mf eEnlH4JZIT/yquE13GtGm+4pa7ZP/Kf5v6WX8fwRKU/5WNoIqKFdKruKf7zw9dqfhgP0H4o/gPxS jRP+OZ5lBPSzUgHx+uQdMnLmPf8AoLKXMMl8lGW1ttDvXSv1G6vZpIm+FmSeCOKOlVOxIP3ffXkF 2Pc4ep1UY2OZX3zadZaRZW97SaKwaT6pzA5l535sNqV38egwgbkjq4cM2XLKo7IyzR4PzmNq0vqi JGBlalXP1LlVmpVtz8NcrJvFf45uwhDhxd73b/nGb/yU1j/zE3X/ACdObTFybp83qmWMHYq7FXYq 7FXYq7FXYq7FXzD/AM5W2N7e+cdDhs7eW5m/R7t6cKNI1BM1TRQTTMbOQDu2wNB4b+gtb+t/U/0f c/W+HqfV/Rk9ThWnLhTlxr3ynjFXbLiDY0HXTdG0GnXRulT1Gt/Rk9QJWnIpxrSvfHjHO14gorpu ovaPeJazNZxHjLciNjGrbCjPTiD8Qw2LpNhc+kaqn1fnZTr9bp9U5ROPVrSnp1Hx15Dpg4gvEFWP y/r0k8sEem3TzwcfWiWCQunMVXkoWq8h0rjxjvRxDvW2+ha3cwfWLbT7maDf99HDI6fDsfiAI2xM wOqmQTfydpl79eS/e3lWz4OI7kowiZvs8Q9OJPXbIzkOThdoTAx13ld5y0+/k1GO4jtpXgdUhSVU YoZSWpGGApyP8vXGBCOzpDw/ik1zoWt23p/WdPuYPVcRxepDInN26KvICrHwGSEwernCQbn0HXbd oln066haZxHCJIZFLueirVdyfAYiYPVeILU0TWnu3s0sLlruJQ8lsIZDIqmlCyU5AbjHiFXa8QU1 03UXtHvEtZms4jxluRGxjVthRnpxB+IYbF0mwqDRNaLW6iwuS12C1qvoyVlAXkTHt8QC77dsHEO9 HEFyaDrslxJbJp109xCAZoVhkLoGFVLKFqK9q48Y714g1FoWtzTy28Wn3MlxBT14VhkZ05bjmoFV r748Y714g0NF1gm4UWFxytBW6HpPWIU5Vk2+HYV3x4h3rxBfH5f12SBLhNOuWt5ACk/ov6ZDdDzp xp71x4x3olkiOZZRoflOC1Cz3oE1x1EfVE/qchKbp9TrzLaGwT65uIbaB55m4RRirN7ZABwYQMjQ 5lg+u23mS+1KNZ9Nuonm5CytWhkDMqCrcFIqxA3amWxlEDm9Dp8UccaB96Aj0DXZJ5bePTbp57fj 68SwyF05iq81C1XkNxXDxjvbuId767/5xm/8lNY/8xN1/wAnTmXi5Nc+b1TLGDsVdirsVdirsVdi rsVdirwz86hdHz6gtOf1r/DN76Hp158/WHHjQg1r0zA1tbX3hZch73nlNb+uf8fH6Z/wnX9v6x9Z 9b58/U9X6eXbvmHtXlxsdvhxJVqF3q9r5/8AKSGeeG6uLDT4b0c3V3DSEuknxAmrDcE5MAGEveWQ A4T8WJaJeXp0HzLZevIbNbZZvq3JvTEhu4F58KheVNq0y6YHED+ORbZDcN3+qao3lPQrlrqZp7S9 uktZjIxaJYo7bgsZr8IXtTERHEfd+tQBxFlWgajqX/K0dPj+szEX1paNdqXb98w04Opk+L4jy3FT 18MpnEeGfK/vapAcB/HVN/I41b9GeVja+t9Qrqv170+XpU5N6fq0IX7XSvfxyGWrlfPZjkqz8Ev0 r1h5M8uDkwiMV0SlTxJ+sHiaVpt8VPpyz+OXwcLtA9PP9DcxmMdgCzGAazphVKniHJm5ECtKkAV2 7Yn/AHpXQH0ke9MrxdY9aIah6/8AylsQsvWLf3HxcPT5N9ivKlDTrvlQrp/Mc0V0/mpJ54n1228s y3F1JcRTxeYpX0+WQurLCsTGExEmoUD7NMsxAGW381ljq/ggIdR1NPzL0l0uZllvI9MS6cSMGlWS CBmVzyqwY7mpyRiPDPx/SyocB+KSaJeXp0HzLZevIbNbZZvq3JvTEhu4F58KheVNq0yyYHED+ORZ yG4VLrWdYTyrod4t7OLm1u7yK1n9R+caLDbqERuVVABpQYiI4iK7v0oERxF6DqMOrNcebbzSGke4 uF01bQ2pYy1hKpJx4mvtt92Ywr0g+bi48sZEDuUtXGr/AF/zz+ivX+v+tpgT6vy9WnAc6cSW+xyr 12rvjGqjfLdsjVRvzSjWru+T8yvMFlHPJHb3drJHPEGYRu5seEXqAHejv3rlkADjB/HNZTjHGJFH Lc3RsLKzkkJjs7eK3VAW4H0l48uJNKmpxEQCS6XPnOQ+SzJNCnrVpdp5W8xNc2jxRxwWjW1w6kK/ qzKz8DsDQcK/PIiQ4hR73baLCI1I8ykvmLV9W/w75M1I3k31/je0u/Ub1f75U+3Un7O2ShEcUhW2 zsIxFyDIoLu9i/Oy+to5pEhuF/0mFWIV/TsuS8xy+Lid9ycqoeEPx1a6/dvbP+cZv/JTWP8AzE3X /J05tsXJsnzeqZYwdirsVdirsVdirsVdirsVfMP/ADlbfXtl5x0OazuJbab9HuvqQu0bUMzVFVIN Mxs4BO7bAWHhv6d1v639c/SFz9b4en9Y9aT1OFa8edeXGvbKeAVVMuEKc2qanNdpeTXc8l3HT07h 5HaReJqOLk8hTthERVJoKKXE6LIqSMqzDjMqsQHWoajU6jkAd8aWnGedoVgaRjCjFkiJPFWagYhe gJ4iuNKqx6jqEd0l3HdTJdRqFjuFkYSKoXgAHBqAF+H5bY0OS0Fe01rXoY1tLO/uo42JC28UsiqS 53oqmm5OAxHMhBA5lmnlvT7+x08Q3c7OCeUdvyJSKu7BamgLHrTK5EEui1uojkkK6IvUdPW+SJHm lhWKQSj0m4ksoPE/MV2PbADTTg1Bx3XV0unLP6f1q6u7r0WEkXrXM7cXHR1+PZh4jANuTYdbk6UP gvu7CG9iWK9ea6jQ8lSeeaUA+I5u2+I25MRrMg6/YFL9Daf9YS59NvrEXH05vUk5r6YATi3Ko4gA Dww2n85l7/uWJoOlIsipBxWYcZlV3AdahqNRtxyAO+PEV/O5e/7nJoOlJ6QWE8IXMkUZkkKK5pVg hYrU8R27Y8RQdZlIq/uRdxDNKoEV3cWbD/dlrK0TEeBI6jAww5zj5V8UHa6O9tcy3KajfGeenryf WHVn47DmycWanucJIPQORLXzIqh8kcsSK7yUJlkoZJWJZ3IFAWdqs30nA4k8kpcyvxYJT5l1Y6fp 5MZpcTVSE+Hi30ZKIsuXo8HiT35BhNzrut3Vuba51C5ntzSsMk0jp8O4+FiRtlggB0d+IgIeS8u5 IYYJJ5Hht+X1eJmYrHyNW4KTRanrTDQTSr+ldU+vfX/rk/149bv1H9X7PH+8ry+zt16YOEVS0OT6 /wD+cZv/ACU1j/zE3X/J05l4uTVPm9Uyxg7FXYq7FXYq7FXYq7FXYq8G/PiKy/xml1dWkF79R8u3 NzDDcoJI/UjuARVSR8tt8wdZe3vSboe95rfRaLZ6ffa0mjafJKulaXdLbPApgElzLIslEDbVHga7 ZiCyQLPMsRZNX1Ky+stF0vVPNt3HpVlOLFNNNtbTRK0KmcAScUBFOVe2MSSIizvaQSQN+91/Z6Lp Oo+b7uLSbK4FjLpy2ttPCrwoLhQr8UDCleVfh+/xYkyERZ3tQSQN+9dpllolpNeV0qyuRP5mOmgT wq4jt3HSP4hx49t6YyJPU/TaCSev8K3SbPRbMSBtJsrr615ll00m4iD+nbnoI/iXjx47dv4MiT1P 02mRJ69Es8uQKuj26y2NrHLG7vFdLEPrDIzEjnIanvtTtlsufN1uu1Fy4Qduqa4HXOxV2KuxV2Ku xV2Ku6/qxTSpDBJNNaQpQvemUW1SAGNuKy79uNO+RMgPg3R005CwNkDp+p2WoRNJayeoqHi+xBB9 wcmRSMuCWM+oIrA0pJ5smjt7G1uTBHO8F3FIElXkjKquWRh3ViByGSiLdl2afUR5JzJbaKNXl1Ea TY8U8srqS2Xor9X9cvyJ4V/2Na1p+FNmqs/VTsbNVf8AEvvotFs9PvtaTRtPklXStLultngUwCS5 lkWSiBtqjwNdsRZIFnmUCyavqVO1tdGg/NG80X9E2UtjdxRsFkhVvSaO19T90K8V5t9r9WJJOO7N /tSSeC7e5/8AOM3/AJKax/5ibr/k6c2uLkznzeqZYwdirsVdirsVdirsVdirsVfOH/OS3mW+0Dzt pU9rFDOLnSpLeeG5T1I2ja45EFQVruuYmpgJVbMQEg8g/wCVn62bieV7KwkinggtXtHgLQCK2Zmj AQv2L5jeAO8p8IKcX5ka2mo6jfSW1ncNqiwLcwTRF4aWwAjopbtTuTh8AUBvsvhCqdF+ZOtpqGp3 sttZXJ1ZoXuoJ4TJDygUrGVQt2r3rj4AoDfZfCFDyb078y9csZLqRbazna7vW1JvXiLhLhtuUfxD jTt4YywA9/KlOIFGeUvOuuNfSWiwWkqT3cupPJNDzaGZ6cniq1FOw4mhpgniH6GjVEQgZfBkIAAo NgOgwPPuxV2KuxV2Ku6Yqkep+bdNs6pCfrUw/ZQ/CPm39MkIFzsOgnLc+kJbYfmPq9lK0iWdnMxb knrxu/CnSnxgfhhliB6l2UNDjioW3n3VoLe6gMFtKl1dS3jM6PySWanPgVdaD4Rsa4+ELbMumjMU UXp/5n65YW6QQWtm4hed7eWaJnlj+ssWkCPyFOtOnTBLACeqRgAAH42SfRvM+oaRZXVpbJE0V48T ytIpLAwkkcDUUqHIO2TlAE2nNhjkFFmuk6tbalbCaE0YbSxHqp/z6HKyKdBnwSxyoofzPb+volyA PijAkH+wNT/wtcMTu2aKfDlHmkNt+YOswXkV16FrKY9PTSmhljZ43t4yCOaltztv2PhhOEEfG3en GET/AMrP1s3E8r2VhJFPBBavaPAWgEVszNGAhfsXyPgDvKPCCAHnjWB5pPmUpAb/AI8PTKt6XH0f QpxDcvsf5WS8IcPD0T4Yqn1T/wA4zf8AkprH/mJuv+TpzOxcmM+b1TLGDsVdirsVdirsVdirsVdi r55/5yH0PTdX882C6lJNHaWWh3F45tygkPoz/ZHMFdw2YeqmRVMuIgbd7yn/AAL5W/SPqfWb39Ef of8ATH+6frFOdOPTh9jenj3pvmL4sq6XdL4hrzulB/KXlGLzRpunSz3/ANR1ezt57R19AyrNcPxU SEgIECjem+HxJcJO1hPHKie5W8t+RvLF/Y6P9euL1L7WXukgEJh9JfqrGvLmOQqo+/BPLIE1VBEs hF10b8v+RPLF7Y6OL25vF1HWFumh9H0RCv1UtXlyBbcAfPGeWQJqqCyyEX5KPlCy05NMju4BL9bl DJdGTjwBVjT0qb8eNK175OZNut7SyHiEU+yLrHYq7FXYqp3NxFbW8lxMeMUQ5O1K0Fadvc4hnjxm Zoc0t8xPoktt5eu5rm9Gkaqtx9cSERLKDEQi8VJYfbO/Jtx2GMTKyNrDudNphjvrJTtfJHlY+eL/ AMtXM96OAQ2EkbQ70g9aT1WK0/1eIwHLLgEtnJOQ8NpLaaFoF15Jv9Wjkuhq+nNEs8TGMW59ebgv Hbmfg6++WGchMDoWZkeKuidw+RvK99feXhp9xeiw1lLt5TOYRKv1VdgvEcRVgetdu2VnLIA3VimH iEA30QOpeX/Jdr+g79JtRbR9VFz6gPoG5UwsETiBRBVjvU9MlGczY2sJEpGxtYR1l5G8rhrz6/cX vBNZbR7P0DDUkj4Hk5Dx6lcicstqrlaDkPTutF6B5V0LTrqaae7vA51iTRrUQ+iVYbFGmDdutSD8 sEskjy7rasw8SNEdLautS09jq1q5Y/o31Y7sEUqqv6NV7HkxAHzyY6HvdaNHkjIEbsXu9M8rR6do uoQyXpt7mV4dVD+jzUxLE0htwO3708eeSEpWRt5O6BlZCOg8ueUz5xTSJpr4afeRWxsJE9D1vUuU jdfVJ+AKA5rTImcuG9rRxS4bTDy35G8sX9jo/wBeuL1L7WXukgEJh9JfqrGvLmOQqo+/IzyyBNVQ YyyEXXR9Ff8AONK8fypsl60uroV+UxzZYuSZ83qeWMHYq7FXYq7FXYq7FXYq7FXz1/zkLrum6P56 sH1KOaS0vdDuLJxb8fUHrTdRyKjoMw9VAyqmXCSNu95T/jvyt+kPT+rX36H/AEN+husf1inqV5fa 4fY2+e9MxfClXS7tfDNed2lupebtHm82aFqdpDcLp2jxWsBSXj6zLbMSSOLcakHxyUcZ4SDzNshA 8JHemPlrz35Y0+x0YX1vevfaLJdPAYDGIm+tMa8uTBtlPbvkcmKRJqqLGWMkmurfl7z75YsbHRze 2162o6Ol0kPomP0W+ts1eXJg3Rh09+uM8UiTVUVljJvzROhW31fSLSKlD6YZh7v8R/E5KR3dFqp8 WSR80dgcd2KuxV2KrJoo54JLeUcoZl4ypUgMKg0NPcA4s4TMTY5pV5g0ia70nSbGyAVNJM3BXY1d Z3ElKnYUIww2JPe7LBrxZ4+qlc+a7S0/MyXzHc2l1FZuGAhYL629t6P8/Fvi/wArpgGM+HwufCpQ oEFj2l67aWnlbW9JkSQ3GpNatA604L6EhdudSDuDtQHLJQJkD3NpjcgU80Tz1pdh/hj1IJ3/AELH fR3fHj8X1uvAx1beldwaZXPETxedMJYyb80B5o8waDeWWi6fo8V0lppPrVN3wLt60gk24Gm1D4ZP HAgknqyhEiyeqc2fnvyuWvv0hb3pWTWjrNn6Hp1BA+BZObb+9Pvys4pbVX00wOM9O6l9h5/8sF5n 1G1vfh1qTWbQQGM7mnBZObDtWtPvxOGXSvppTjPTupjEmv2r3HmSX05ANZD/AFcbfAWu0n+Pf+VC Nq75bwcvL9TZw8vJB3GpwSeXrLTVVxPbXNxO7mnArMkSqBv1HpGu2SEfVaQN7TFfMlkPNmmax6cv 1ayFkJY9vUP1WKON+PxU3MZ475DgPCR72PD6SE/8tee/LGn2OjC+t7177RZLp4DAYxE31pjXlyYN sp7d8ryYpEmqosJYySa6von/AJxpbl+VNk3St1dGnzmObLFyTPm9Tyxg7FXYq7FXYq7FXYq7FXYq +b/+coPLtxq3mOxmgubaE2OmPM0E8nCWRVeR29FKHmQsZrmJqJ0QzjKnja/l1rDaSNRF3ZUNn+kB aesfrHocS3Lhx9vHrmP4wut+dJ8UXTm/LrWF0k6ibuyoLP8ASBtPWP1j0OIblw4+/j1x8YXW/Ol8 UXSlB5E1O4l0mO3u7KZtYD+gY5iwjMcYldZqL8DBW6YTlAvnsnxBv5Ks35d6vHeWFul3ZXCaiJjB cQTGSIC3XnJyPEdttq77YBmFHnsjxRRPcy9VCqFGwAoB7DIvMk2bbxQ7FXYq7FXYq7FVO4toJ0MU 8ayJ3VwCPxxBZxnKJsGkju/JWmSlmgaS3NK0B5KPeh3/AByYmXOx9o5BsRaXSfl7qgsru8ju7Vo7 SFrpoWdkneFRUukZU1G3WtMfFF07LFqRMciFK98h6pZ6INXlurMp6EV0bRZq3IimKqrenx6VcAmu Iygmt20ZATStrP5daxpOnXF9Pd2Ui2hiFzBDMWlj9YgJyTiKfawRzAmt0Rygmm5fy51hb/TrOK8s rk6oJzbTwTF4qWwrJycJ91K4+MKJ32XxRRWj8vdVbVBp6X1hIDaNffXEn5WwhRzG1ZAvUMPDHxhV 0U+IKtx/L3VF12LRWvrBbie3W6t5zORBIrtwVUfj8TE9BTHxhV0V8QVa7Tvy41i++scbuxg+r3km nj6xMY/UnjpVY6rvWvw9z4YyzAd/eg5QGtG/LrWNWsba7hu7KH64ZRbQTzFJXMLFX4rxNaU+7GWY RNbrLKAX1D/zjQCPyosgeouboH/kacz8XJE+b1PLGDsVdirsVdirsVdirsVdir5z/wCcjriCDz9p bzyrCjaFfoGc8QWeOZVXqN2YgDMTUjl8PvZgbfFgsV5ow0mHUTq9mCnlhtMaz9b/AEj6wVLcfTr7 U+Z6dcwaN1R+q2FG6r+J0t5ox0mbURq9mS/lhdMWz9b/AEj6wFDcfTr70+Y6dMaN1R+q1o3VfxJL 5E1TTLSby011eRQCC+1B5y78fTWS2iVHbcUDMCAdumWZok3XcGWQE2nNo9lYJ5dsob+31CWxj1Q3 D2b+qifWk/dVIK0qXp9B6jIUTZqrpx9ROoSJ2tfk3ROxV2KuxV2KuxV2Kqd5E9xYanbg/v8AVDat NPIzHe1cFTTf9kU/z3AG4Pc52DWGJAluAlNreWlv5v8AOE1zOsEV5Zaj9VklJj9UyuDGE5EEl+wx IPDH3h2sZCUIkb8k3+u6N/h767+l7Pn/AIY/Rn1L1f8ASPrH2uPCv+Z7d8hR4qr+K1o3y/iQWvz6 VN5ba+i1W0kkbQ7HTxYrLW59aOeOR/3fgoB6nt0yUL4qr+IlMQbquqN863ujNo/mW5t9Xs7p9W/R 31a1hl5zf6NxD8lr2/zpkcQNxFcrRjBsbcrQ3lnWdIg/wT619BH9Vi1NbrlIB6Rl5emJPi+Dn2rQ YckSeLbuTOJ9Xwb0w6TZXyaVJrNi/wDzr91ZfXUmrbiaa4d1TmeP7LVO30Yysi6P1KbIuuqC1m90 yLzz5V9PULe4t9Ot9Pgub2KTlCrQyHmedRsBv2+jJRB4Jbc7TEHhKb6Td6LdGTnrFla/U/M02pH1 5uPOBdg0VD8XKu1PDrkJAjofppjIHu/ha8n3mjfUPK93Pq9nanSJdQa6t5puEtLhmVCq1969tsco NyFHelmDZ25vdP8AnGog/lVZkdDdXZH/ACOObXF9LOfN6lljB2KuxV2KuxV2KuxV2KuxV8w/85W2 F9e+cdEhs7eW5mGnuxjhRpG4iZgTRQTTfMbOQDu2QNB4cNB103RtBp10bpU9Rrf0ZPUCVpyKca0r 3ynjHO2fEGrbQtcuoPXttOuZ4Nx6scMjp8Ox+JQRtiZgdVMgustB1e8WKWG0l+rStxW6KMIdtj8d OO1PHEyDDJljAWSz7StLt9NtRBDueskhG7N4n+GVE28/nznJKyjMDQ7FXYq7FXYq7FXYq7FUNf6d Z38PpXMYdf2W6Mp8VPbCDTbizSxm4lhep+UdTt5gLSN7yNzRBEpaT5FFqfuywTDu9PrY5NjsUBFo WtzTy28Wn3MlxBT14VhkZ05bjmoFVr74eMd7lcQXR+XtfleRItMu3eFuEqrBISjUBowC7Ghrvjxx 714h3qaaNq7wzzJY3DQ2xZbmVYnKxtGKuHYCilR1r0x4h3rxBd+gtb+qfXP0fc/VOHqfWPRk9PhS vLnTjT3x4xdWvEGjousA26mwuOV2K2o9J6yinKse3xbGu2PEO9eILpNB1yO4itpNOukuJ+XoQtDI HfgKtwUirUHWmPGO9eIOj0DXZJ5bePTbp57fj68SwyF05iq81C1XkNxXHjHevEO99d/84zf+Smsf +Ym6/wCTpzLxcmufN6pljB2KuxV2KuxV2KuxV2KuxV4d+dgvf8ZP9R9T65/hq5+rejX1PV+sjhw4 kHlypSnfMDW16b71lVC+95LqF3q9r5/8pIZ54bq4sNPhvRzdXcNIS6SfECasNwTmMADCXvKgDhPx R3lK41C20nylcRtMmlpLqZ1Fo+XpUDt6fqcSB9unGvfI5ACZDrswyyiOInyQtkJ4NMtbB5C8dqrB B2q7s7bfNjlpAu3TajOckr6L+mLQpw3EM9lHd27iWGXUI9MUr/v6VeQNT+zv1GAmjXlbmR0UyN9t rRNzbT207wToUljJV1PiNsQb3DiyiQaKlhYuxV2KuxVGT6NqUHl3TfMMj2p0/VLqeyghjm5XCvAZ Ks6cQKH0TUKxK1FfbIlgqN25+TRiMOK90HmO4DsVcCQajrirp59RjsNaksJLltX1M2hV4SxkPoOE anH4t4ia+wOR4RYvkHZ6TUcREZJ7qY1f9IXn6P8AX5DzFZ/XPQ5f7z/UofV9TiT8FPtVqMpjVb/z f0uaKrfuYpaXd7+nPzBsvWk+qC21GZrfkeHqeoF5leVOVNq75cQKgfc2EbR+CdTjV/0RPX1/0SPK S0+16H1jgK9+PPhT3ple1+fGwFX58ST+Q7y+u7nyibmaScxXmowwGR2biiWcQVFq2wHYCmTzAAS9 w+9nkAF/BC+arvzDZeX/ACrc3c1zb6tHNfVmkZ1nAMiBdyeX92RT/JyWMRMpVy2TAAk9ydQXd7F+ dl9bRzSJDcL/AKTCrEK/p2XJeY5fFxO+5OV0PCH46sK/dvbP+cZv/JTWP/MTdf8AJ05tsXJsnzeq ZYwdirsVdirsVdirsVdirsVfMP8Azlbf31l5x0SazuJbaY6e6mSF2jbiZmJFVINNsxs4BO7ZAWHh M2qanNdpeTXc8l3HT07h5HaReJqOLk8hTtlQiKpsoPQNBsLiw01LeW4klqebRl2MSsd/gUniOu57 5TLcvP6vUeJLbkFW/wBUsbCPncyhDSqp1ZvkuIFtWLBPIfSGGaz5qvb4mKAtb2xqCqmjMCKHkR2I 7ZYIU7nT6KOPc7ySqO/vooFgjuJUgWQTrErsEEoFBIFBpyA/a65Kg5lMg0HzZdi6KardS3EctAs8 ztIyEe7EnjkDAdHA1mk4xcfqDMwQQCDUHocrdG7FXYq7FVJbS1W4a4WGMXDijTBQHI8C1K9slxGq tmcsiKvZVyLB2KuxVj/mDzNDaQvBZTn66dhJCxBj8TzU9flk4wvm7LRaSRkJHYMVj8w6/E8jxand o8zc5WWeQF2oBViG3NBTfJ8Ee53HCO5Dpf30bzyJcyo9yrJcursDIr7urkH4g3evXDQTQVv07rf1 T6n+kLn6pw9P6v60np8KU48K8ae2DgF3SOEKMGoX9v6XoXMsXoMzw8HZeDOAGZaH4SwABIwkApoL r3VNTvmRr28numjr6ZmkeQrXrx5E06YiIHJQAG/0rqn176/9cn+vHrd+o/q/Z4/3leX2duvTBwiq WhyfX/8AzjN/5Kax/wCYm6/5OnMvFyap83qmWMHYq7FXYq7FXYq7FXYq7FXhf52TSwefY7mHae38 tXssLUDcXSYFTQhv1Zg60XXvCy5fF5z+kLz65+mPh/SX+E/rfq+mv996nPlx4cftdunb2zC4RVdO NjXT+kt1e6uYtGvdTRF+vR6TpV2rGNSvrXErrK5jKcPjAFaj+0x5gdLLWMEDLcdS6zv7mz/N2706 24x2d7DGbiIIu/o2ZdCPhqtCa7ff3xIvFZ/G7Zwjw2/Jd9dwad5PsIqCzv4tSa8T01PMxFylWKkj c9j9Pg5QLke6kzG5PuYKurX9z+X0tpM4a30+/thaKEUFfUS4dqsF5NVv5mzI4QJ33j9TbQ4kbrPm jWxqHlvXfWUanJZNym9KLieVzPEf3fAJ9jbpkY4xRj0v9SIwFEIwandHzrrlhI1baOa+uACCWUQc 5SF2HUJSlPuwAegH3OJn0kZxBG0kxs721vIRNbSCSM9x1B8COxxIp1GTFKBqQV8Wt2KuxVEWFo15 eR2ytxaStDSv2VLHb5DIylQtnjhxGmPWmuy3vljWtWjiEM2mm2WJCS6n15Cjctl6AbZMipAd7tB2 fESAJtPPLcr3F15NuXH7y+j1KS5ArxdoQwjPGhHw02/XlWT+L4NwwQhdDuSjX/Mutpp3k/XTKq6r IL0POYo6EGUR/YKcPsnwycIC5R6bORGIsjopQ6pfW/nHzZp0ThbS8GpNcx8FJJhhnZKEpyWhPamP CDGJ936FocIPuUfK2p3t5oenWNwwe1sdb05LZOCDiJWmZwWC1ap/mOHJEAk98T+hMxRvyKc+e9Y1 M6HJduwFxpvmOWKyk9NVKJCjPGPsLyofHIYoi674sMcRfwTCTUbz9Ly6sCDqC+Uku1k4LQTF+fIJ x4/a7Up8+8OEVXTjY1tX9JU1HVtStNL1HWLchdU/Q2kTGb00J5yTShyVKcd6+GMYgkDpZUAE10sq VrqN3a/m/eWEBCWt/DG11HwU8jFZ80NStRQmtR9/fExBxX3frSR6Lez/APOM3/kprH/mJuv+Tpzb 4uTZPm9Uyxg7FXYq7FXYq7FXYq7FXYq+af8AnKDXdV0Xzvot3plwbe4bTZImcKrVRpyStHDDtmLq ICWxbIxBG7xf/H3m79KfpX9It9f9H6v63CP+65+px48eP29+mY/gxqq2T4caql6fmJ5yS9kvU1Jh cyxxxSP6cW6REsg48OI4lz2x8GFVS+FHuQQ81a+NbOuC7P6UI4/WSqHb0/SpxK8KcNumS8ONV0Tw Cq6InTfPfmzTNPTT7HUGhtIwwji4RtQMSTRmUt1Y98EsUSbIU44k2k6X10llJYrJS1mkSaSOg3eM MqNWldhI2Tre2VdW5tQvJ0tUlk5LZp6VsKAcE5tJTYb/ABuTviAtK36a1P8ASFxqPrn67diYXE3F asLhSsu1KDkHPQYOEVSOEVTVlrGpWULQ2s5ijeRJXUBd3jDBa1HSjnbocTEFE8cZcxaZW/nTWI/7 305x35LxP/CcR+GDgDiT7PxnlYR8fnwU/eWe/isn8CuDw3HPZndL7G5PPkdD6dmSe3JwP1A4+Ggd md8vsSw+cteXUIr62nFtLBy9EIqlRzUo1Q4YElWI3wnGCKLnYtLCAoJdb6tqFvp93p0MvGzvjGbq Lip5mJuSbkVFD4HCYgm28gXaLtfNWv2v6P8Aq92Y/wBFiVbCiofTE/8AejdfiDV/argOOJvzQYD5 ta15p17W5IJNUuzcvbcvQJVF48yC2yKvUjvjDGI8ljADkofprU/0hcaj65+u3YmFxNxWrC4UrLtS g5Bz0GHhFUnhFUts9W1GziEVtMY0E8V0AAp/fQcvTepB+zzOJiCpAKO1vzl5l1y2S21W9a5gjf1U jKRoA9COXwKv8xyMMUY8giMAOTdt508z2t5DeQXzR3MFsllFIEj2t4yGRKFaGhHU74nFEiqU4wiE /MTzkl7JepqTC5ljjikf04t0iJZBx4cRxLntg8GFVSPCj3IIeatfGtnXBdn9KEcfrJVDt6fpU4le FOG3TJeHGq6J4BVdH1p/zjN/5Kax/wCYm6/5OnMzFyYT5vVMsYOxV2KuxV2KuxV2KuxV2KvBvzzs dA1P8xdD0vVdPN21zp8jQTCaSMRCJpXb4Y/tcqDvtmDrDIbgpJIFh41p+g+WP8K6c9xpzTalqdlq Nwt768qCN7IOyn0wOLdAP15jmcuI77Aj7UmRs/BF/wCGPKn6BMf6Nb9I/wCH/wBMC+9eWnq0pT0v sfa38MHHK+e3FSOOV8+tNy+WfKa6TJbDTW/SEfl8ax9f9eX+8KgU9L7P2t/D+LxyvntxUvHK+fWm NXq+XF0fQtTi0po19eSDUovrEjfWfQSFmIYj93z9Rvs9MtHFZFtguyLT7SNH8oXHnhdHl0dmtdRg tprRPrM3+j8rX6xICRRpOVae3bK5SkIXfL9bCUpcN2lOn2Hl+88la1ONPKarpIiP171pCH9e4Kj9 19heKDj7/PJyMhMb7FkSRIdxT2w8t+UtWu/Kk9vpbWlrq8l6t1bevNIWFsvwjmdx8S1+HxyszlES 35UwMpC9+Tdr5X8p6lqXliSDTWtbTVY75rq19eWSptQQvxmjAchXb78TOQEt+VKZyAO/JD2OieUr 2/W9TSWi086Jcal+jzcSsTLBO8f97QNuqfLCZSAq9+KkmUgOfVbcaP5Rg85aLanSXbTtasrV1tPr EoMU11JQP6n224qKU74iUuE77grxS4TvyRWmeWvKUfq/XNMa7+seYJNItwJ5oxFFUcD8NeXEV9z+ sSnLof4bQZy7+lozT/KHk1brTbC50t55dTvNSt0uPrEyemtlK4QcV2b4Fp498jLJKib5Afagzlub 5UhPLXlfylPZaBb3umvcXmspes1368qcPqrPT4F+E1AH8faWScgTR5UmU5b78mJGHRJvJZuorAxa nZ3cMNxeGZ2EyzLM9BHTglBGoy7fi57Nm/EjdTHlWDU9Fvo9GZdLvrVpZtN+tSkl/WlhB9Yjl+wD sMjHioi90Dioi91WHTPLqeYfMmjzac0phF62mzetKv1cWscriqgVkrxX7WDilwg33Is0DacxeWfK baTHbHTW/SEnl86x9f8AXl/vApFPS+z9rfw/hDjlfPbipjxyvn1p0vlnymukyWw01v0hH5fGsfX/ AF5f7wqBT0vs/a38P4vHK+e3FS8cr59aQfl7Q/LGs3HllRprQJdS3VtqA9eV/Xe2tkk5jYcKu32V wzlKPFumUiL3UdXtPKNvaeXtai0Zlsr6S7ju7D6zKefokRqRKd1ox5bfI4YmRJFpiZbi0ytfLnlJ PzH1Dy5PpZltnCGzPrzL6PC29Z60PJ+Z8TtkTOXhiVsTKXADb37/AJxm/wDJTWP/ADE3X/J05s8X JlPm9Uyxg7FXYq7FXYq7FXYq7FXYq+cP+cj9e/QP5j+XNU+ri59HTpl9Etwr6jSJXlRqU5V6Ziam HEKZiPFGnj1l57tbfy9Bpc2kJPdWlvdW1rfmZlKC85B29MLxY0em57dsxziPFd/gJOPe7V/+Vi23 6E+o/odPr36M/RP6Q9Zq+jSlfT48a136/Tg8He72u0eFvd9bbf8AMW1bSWtf0Mgv30waSb8Tt/ch QKiLjxrX4uvfrj4Jvntdr4W/PrbGJtU9XRbXTPSA+rTzz+tXdvXWNeNKfs+l498t4d7bK3tNbDzh 9U802WvfUw/1OGOH6rzoH9K2FvUtxP2qcjtkJY7iQxMLFIPTvMH1PRtZ036uJP0uIR6xanpejIZN loeXKtOoyUoWQe5JjZB7kz0fz2dNTy+osVlOhPdPUyU9YXVag/CePGvvkJYrvfmxlju/NF/8rHto tR0a4stGS2tdHS5RLX1mfn9aFGPNlqCDv0ODwdjZ5o8LY781kPn/AE+DU1ng0NI9OGnyaYdPE7kF JZDIzeqylq1bE4TXPe7XwzXNB6n50iu/MulaxDpy20GlJbxw2IkLqUtnLAFytd606ZKOKokXzZDH QIvmmGm/mNaW3r/WtFS8DanJq1tWdkMUrkcQaIefHfrtv0yEsJPI9KYnF59KV7H80baAwSz6Glxd 2lxd3NrOZ2XgbyRndSoQhhRuO+A4L6oOLzUND/Me202x06GbRkurzTFnW0u/XZKfWSxeqBWB+1Tf w7ZKeEknfmmWKzzYvFqnp6Jc6Z6QP1i4huPWruvopIvGlP2vV8e2W8O9tlb2uvdW+sw6ZH6IT9HQ +hyBr6n755uR22/vKfRiI1fmojzRR8yV8w6jrH1Uf6eLsfV+WyfW0dNm478PUqNu2R4PSB3Ujg2p O0/MW1XSVtf0Mhv00w6SL8zt/clSKmLjxrX4uvbrkPBN89rth4W/Prbn/MW1bSWtf0Mgv30waSb8 Tt/chQKiLjxrX4uvfrj4Jvntdr4W/PraWeXvOB0Z9KcWaznTLi5uKF+PqC5iSIofhNOPCvfrkp4+ K/NlKF27zJ5rtNVs9OsrLTF06005pXSMStMWMzKzfEwB+0pP04wxkEkm7WMKvdEjz3Tzy/mr6gPj BH1L1NhWD0Nn4dvtD4cHhejhtHh+nhfT3/OM3/kprH/mJuv+TpzPxckT5vVMsYOxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K vIvzd/P7/lXfmS20X9A/pT6xZpe/WPrf1fjzlli4cPRmrT0a1r3xSy7zL+Y+n6B5Ai823cNXuLWO 4tNO9SjSTSQ+sIRJx7KDVuPQE07YoS78ofzR1H8w9OvdTk0L9EafbSCCCY3JuDNJSrhR6MNAgI3q dzirFvPf/OSH+FPP915R/wAO/Xfq0ltH9d+uely+swxy19P0JKcfVp9remKsag/5zC9WK4f/AAlT 0IxJT9I1rWREp/vLt9uuKaelfk5+bv8Aysez1O4/RP6K/R0kUfH6x9Y5+qrGtfSh404++KGNee/+ ckP8Kef7ryj/AId+u/VpLaP679c9Ll9Zhjlr6foSU4+rT7W9MVY1B/zmF6sVw/8AhKnoRiSn6RrW siJT/eXb7dcU09R/KL82bL8xtJvLyGwfTbmwlWK5tmkEy0cFkZJAsda0P7IpihhF5/zlFa2Xnm+8 tXfl/wBO10++ubO41P65WkdrI6vN6PofyxluPP2rirO/zb/M5fy+8sWuupp41Zbq8jtFhE/oACSK WUSB/Tmr/dUpTv1xVX/Kn8xP8f8AlY69+j/0bS4ktvq3rev/AHYU8ufCLry6ccVeRwf85herFcP/ AISp6EYkp+ka1rIiU/3l2+3XFNOb/nMLjZxXH+Eq+pJJHx/SPT01Q1r9V7+pitPXNJ/MT9IflY/n z9H+lw0+61H9G+tyr9VWRvT9bgPtel9rhtXpihjX5P8A57f8rF1m+039B/ov6nb/AFn1frX1jl8a px4+jDT7Va1xV6viqD1nVbXSNHvtWu+X1TTreW7uOIq3pwIZHoO54rir5/b/AJzBjNvPcR+Uy0cU qRpyvwrMsgchiBbNxP7vpU/PFNNn/nMGGM2jTeVGWG4T1JGS/DMiiRozRTbqGPwV6jFaeved/wAw YPLf5eT+dLe0OoW8cVrPDatJ6BdLuWONavxl4kCav2T4YoSj8nPzd/5WPZ6ncfon9Ffo6SKPj9Y+ sc/VVjWvpQ8acffFWNee/wDnJD/Cnn+68o/4d+u/VpLaP679c9Ll9Zhjlr6foSU4+rT7W9MVe04q 8d/Nf/nIePyD5pXQU0L9KN9WjuJLj639X4tIzDhw9Gboqg1r36Yq9R8uazHrehWGrRx+kL2FJTDy DcGYfEnIUrxaorirBvzl/OX/AJVt+h/9w/6V/Sv1n/j5+ren9W9L/iqbly9b2pTFWAL/AM5dV1C2 s/8ACf8AvR6Hx/pDp66q3T6tvx54pZP+VX/ORdl578yjQJtEfSrmWJ5baRbgXKOYxyZW/dQlfh3H XFCcfnL+cv8Ayrb9D/7h/wBK/pX6z/x8/VvT+rel/wAVTcuXre1KYqneg/mPp9/+XNt531CH9HWs 8Jla29T1SG9UxJGr8Y+TO9APhG5xVjf5QfnVqP5jX97Enlz9GafYRhp743ZnBkc/BEqehECSASfi 2+nFXkH/ADlnYX1x+Y2nPb20syDR4VLRozCv1q5NKgHxxSEH591nXvOfmHyz5R02Cb6hp2nRafES jiJ764tBHI7EClEYiOp6UbxwofU/lDyxp3lfy1p+g6eoW2sIhGGpQu/WSRqftO5LH54FfJf55adq Ev586nNFayvCZ9PIkWNitBaW4O4FMUvoyw8lfkdeTm00/TdBuZ5lIMEH1eR2VaMfhQkkDjXFDKtA 8p+WvLyTR6FplvpqXBVp1to1jDlahS3HrSuKvkn88tO1CX8+dTmitZXhM+nkSLGxWgtLcHcCmKXq H5x+W/yoh/LPXG8q2mkfprjbCAad6D3BX65Dz4rES5HGtfbFCH/5xCtLq20nzKLiGSEtPbFRIpUk cJOlQMVLxTzvpept+Z/m2RbSZo31DWCjiNyCGaelDTvilmvmzzFqnmX/AJx10SxuYJ31bRdZhs7h DHJzaFLW59CTcEkcCFr4jFXrP/OLNvPB+WDRzxvFJ+kLg8HUqaFY+xxQ8C/IvQ9Pk/MG3j80WaDQ 3gnF1+kE4W1QlY+Zlon94FpXvikvqTT/AMvfya1SJl07RtGvooGq4t0glVGcd+HKhYL+GKEZ530i x078qvMmmaVapbWkWjagltaQLxVeVtIeKKPEnFXgv/OI9je23nDWmuLeSFW08BTIjKCfXTpUDFJf U+KGOfmUjv8Alz5qRFLO2j36qqipJNrIAABir5g/5x00Hy3Lr2rR+dLO2GmfVVaAaoqpD64kAXiZ uK8+Bb3pXFJegeffyO/LnzXrlncaD5p0ry/bpbLbR6ZaxwTCRxLI5kXjcQ7t6nGgXtii2XfnfpE1 l+Qeo6RCWupLO3062VkQ8n9G6t15BAWpXjWlcVYH/wA4p39hoek+YRrVzFpZuJ7cwC8dbcuER+XD 1SvLjyFaYqXn/wCc8Muo/njqF/p6NeWMs+ntFd24MsTBbW3BKyJVTQgjril9oYofDf50S6nrv5g6 nqMdrPLE8ssMUgjdgY7eeSGMggdCkYI9sUh9M/8AOPupz3XkJ7S4DrNpmoXltxkUq3BpTOh3pVaT UB+jtih55/zmFZ3lz/hL6vBJNw/SPL00Z6V+q0rQHwxSE/8Ayn8u/lPJ5D0GbzDa6OPMPoj6wb0w LdBlkYRcxIQ4PALxr2pih5H/AM406dqEH5tadJPayxRiC6Bd42UVMLdyMUlnv/OYVneXP+Evq8Ek 3D9I8vTRnpX6rStAfDFQwTzB5q1ebyP5D8l2VvcfV7IJeavwjk3la4cwxNQfsIeZH+UvhhQ+mPym 8hweSfJFho4VRfMv1jU5V/bupAC+/cJsi+wwK+fv+cs7aGX8xtOZ7qKAjR4RwkEpJ/0q53+BHH44 pCTflnPZ+TvzmtbzW2gMcpkcF1lDQxXsXqx3Clowu0bgnf7JPfCh9l4FfGn55WsD/nzqbtdxRt6+ n/umEvLa0t/5Y2Xf54pej/k7/wA49edPJXnq01/VL3TZrOCKeN47WWd5SZYyi0EkEa9Tv8WKvoTF D40/PK1gf8+dTdruKNvX0/8AdMJeW1pb/wAsbLv88Uu8z/8AOO/nHyd5W1XXdX1HSzYwxRRyehJc u9ZLqFV+E269zir1n/nE/ULeTylqunRRWoNlcozXNssqvL6yHeYygFmHDam1NqYoeL3nl6z1n899 V0uW+iVNS16/tZEUS+oouLiWNqVQLUcv5qYpYrf6Nc6Ta6tol5fQwzW1/DHeQUnoJrdbiPf9125t TFX1J/zizGkf5YMqSpMP0hcfGgYD7Mf86ofwxQ+ZvIXke882azJ5f0rULP6/fQN6Jm+sJGPSdJm5 N6J/ZjPbril9SfkJ+VPmL8vbHWLfWri0uH1CWGSE2byuAI1YHl6kcX83auKGZfmUob8ufNSlggOj 34LtWgraybmgJ+4Yq+e/+cR7eKLzhrRS5jnJ08VWMSAj9+nXmiYpL6nxQl/mLR49a8v6no0rmKPU 7SezeRdyqzxtGWHy5Yq+YH/5xL/MFLW4totU0l1eaN4naW5QlI1kHxKIGoTzG1T88U28+/Mf8uNS 8lalp+i61qFl9c+pCcGA3EicJLiYDcwr/Ke2KvpP83C1z/zjlO09wOctjpTSXMnMgsbi2JY0Vm+I +2KA+fPIH5N+YPP+kzjQdQ08DTJz9YNy9xGD9YReHGkD1/uTXFKW+ZvJ1z5Z8/R6HqV/aG/sHsUm EXrshJghYcWMK9mGKvuXXdSj0vRNQ1OQhY7G2muXZvsgQxlyT7fDih8EtDo0sIk1TUFeaWxlNrJG kxrdG6dlZ6ovwH4ge/til79/zi1qSR6x5v0b6xHMHnW9iVBICpDvHJy5qteqdMUIb/nMKCKX/CXO 4jgp+kaeoJDWv1XpwR+nvikMN8p/848ecvMtppHmjTtQ0wabOlu8ayyXKy0twsb/AAi3I3aI03xV W/5xbvbWy/MT6kos7uS/tplW5CT/AFiL019SkbOioFbjRu58cVLLP+cwoIpf8Jc7iOCn6Rp6gkNa /VenBH6e+Kh5H5dhi8ued/Kuu6h6FzZyfU7u3hZZv3scdIC6Vj48lkiYrU9QK4Vfctnd215aQXlr IJba5jWaCVfsvG6hlYexBrgQ+Uv+cs3sV/MbThcQyyP+h4aNHKqCn1q57GN/14pDJvzh8gWt15F8 u+dba2kklsNGjtdREbqjfV3sz6UjfA3Lg7ca/wCUOwwoeh/kF5+h83eQrYO7HUtIpZXqyMHkIQfu ZGIVK84x1p1BwK+ffzyfTx+fOpiWGVpvX0+rrKqrX6pb0+Exsf8AhsUskt/+cuPOEsVy50XTwYIx IorPuTIiU+3/AJeK09X/ACM/NjV/zEstWuNSs7ezbT5IY41t+dGEqsSW5s38uKHgn55Pp4/PnUxL DK03r6fV1lVVr9Ut6fCY2P8Aw2KX0J/zkSYR+TnmAzKzx/6HyVGCMf8AToOjFX/Vihgf/OITWraT 5l+rxyRj17bkJHEhJ4SdKJHipeb6W+n/APQyrgQyif8AxRcfGZVKcvrj78fTrT25YpZJ/wA5Q+UN P0jW/wDEAtpDb668JmMUixgXNvHIrbGN/tIVPua4oD0f/nFloD+WDGBHSP8ASFx8LsHNeMfcKn6s VfNP5eec4/J+vP5j0yyMt7YwP6cdzMHiImZYW5BEjb7MhI+LFL09/wDnLjzgtlFcfoXT+UkkkZWs 9AI1jIP2/wDizFaevv5puPNP5Bar5hvoEhlv9D1GSaCAkKAsMyUUtzI2XvXFD5f/AC0/MuXyDLqG s6Np6z3E6xWckd5KXTg5aSo9NYjyrEO+KXoNx/zlx5wiitnGi6eTPGZGFZ9iJHSn2/8AIxWnu/me 9m1b8oNWvZIS02oeX7iZ7eGtS01kzFEqGPVqDY4ofI/5afmXL5Bl1DWdG09Z7idYrOSO8lLpwctJ UemsR5ViHfFKl+Z35hv561bT9c1ewEF19RFuI7SXhHwjuJiNpElatWPfFX0f+bSxxf8AOOEyXETh UsNKV4gwRwRcWwoWKtuD1+HFAY1/ziE1q2k+Zfq8ckY9e25CRxISeEnSiR4qXm/55Pp4/PnUxLDK 03r6fV1lVVr9Ut6fCY2P/DYpfQ//ADkDrUOlflRrTyBmN4sdmiIwQn15FV/iIan7vl2xQ8T/ACb/ ACT8q/mFoEmo6nPf2cdpS3tltpodyZJXfnzgb+ZaUpilCfkZqlnov56y6eY5Yprx7/TpnaVXQsrN LTiI0O7wCm+Kst/5zCazX/CX1iKSSv6R4+nIsdP95a1qklcVD1L8ijEfyl8uGJWWP0H4qxDED1pO pAWv3YofOH/ONL6efza04QQypJ6F1RnlVxT0W7CNP14pLPf+cwms1/wl9Yikkr+kePpyLHT/AHlr WqSVxULn8gWvmT8iPKGs2ltI+oaADcRIrr6jWxuW9dS3D4uIXmBQdDTrhQn/APzi95+ttZ8rTeWZ GdbzQzW2SVw7taSGq0IVK+m5K9NgVwK9W1fyf5R1q5W61jRLDUrpEEST3lrDPIIwSwQNIrEKCxNP fFUfJpunS6e2myWsL6c0XoNZtGphMPHj6ZjI48OO3GlKYqg9G8q+V9Eklk0XR7HTJJgFmeztobcu F3AYxqtQPfFVG/8AJHkvUNQbUr/QNNvNQcqz3k9pBLMxQBUJkdCx4qoA32piqGX8tfy5UMF8q6OA 44uBYWoqKg0P7vxAOKplo3lvy7oiSpoul2mmJOQ0y2cEVuHK7AsI1WtK98VQ1/5I8l6hqDalf6Bp t5qDlWe8ntIJZmKAKhMjoWPFVAG+1MVTHUtM03VLKSx1O0hvrKbj6trcxpNE/Fgy8kcMpoygio64 qh9G8t+XdESVNF0u00xJyGmWzgitw5XYFhGq1pXviqGTyR5LTU/0smgaauqGU3BvxaQC49Zm5GX1 eHPmWNeVa1xVGaxoOha1bpbazp1rqdvG/qRw3kMc6K4BXkFkVgDRiK4qu0nRdH0e1+qaRYW+nWnI v9XtIkgj5NSrcIwq1NOuKpQv5a/lyoYL5V0cBxxcCwtRUVBof3fiAcVcfy1/LkoEPlXR+Cksq/UL WgJoCaen3oMVTeHRdHh0o6RDYW8ekmNoTp6RItuYpKh4/SA4cW5GopQ4qlA/LX8uQhQeVdH4MQzL 9QtaEioBp6fapxVzflr+XLBQ3lXRyEHFAbC1NBUmg/d+JJxVkEMEEECW8MaxQRKI44kAVFRRQKqj YADamKpDJ+XP5eyGQyeV9Jcyt6kpaxtjyff4mqm5+I74q3H+Xf5fxSRSxeWdJSSChhdbG2DIQSw4 kJ8PxGu2KpvqWmabqllJY6naQ31lNx9W1uY0mifiwZeSOGU0ZQRUdcVQ+jeW/LuiJKmi6XaaYk5D TLZwRW4crsCwjVa0r3xVDX/kjyXqGoNqV/oGm3moOVZ7ye0glmYoAqEyOhY8VUAb7UxVHatomjax ai01ewttRtAwkFvdxJPHzWoDcJAy1FTvirtJ0XR9HtfqmkWFvp1pyL/V7SJII+TUq3CMKtTTriqC j8leTYtUOrR6DpyaqZWnOoLaQC49VyS0nqhOfNiSS1a4qr6z5Y8t656P6a0mz1T6vy+r/XbeK49P nTnw9VW48uIrTrTFUXYafYadZxWWn20VnZwjjDbW6LFEgJrRUQBRuewxVLNL8keS9JvFvdL0DTbC 8QFUubW0ghlAYUYB40VhUdd8VRGs+WPLeuej+mtJs9U+r8vq/wBdt4rj0+dOfD1Vbjy4itOtMVRV jpunWFlHY2FrDaWMQKxWsEaxxKpJJCogCgVPhiqXaV5L8naPd/XNJ0LTtOu+JT6xaWkEEnFuq840 VqGmKv8A/9k= xmp.iid:2557c16f-d99f-4c6a-8f56-f102b8344ad6 xmp.did:2557c16f-d99f-4c6a-8f56-f102b8344ad6 uuid:5D20892493BFDB11914A8590D31508C8 proof:pdf xmp.iid:4890e57f-3f2e-430a-9ce5-de037da36c36 xmp.did:4890e57f-3f2e-430a-9ce5-de037da36c36 uuid:5D20892493BFDB11914A8590D31508C8 proof:pdf saved xmp.iid:3c82e37f-f75e-4c02-b3d7-a9c34b537019 2017-11-21T19:14:47-05:00 Adobe Illustrator CC 2017 (Macintosh) / saved xmp.iid:2557c16f-d99f-4c6a-8f56-f102b8344ad6 2017-12-05T11:33:42-05:00 Adobe Illustrator CC 2017 (Macintosh) / Print Adobe PDF library 10.01 Adobed      !!-,,,-2222222222    ## ##++)++2222222222"" !1A"Qa2#qBR36brs$t5CS4cT% !1AQ"aq2BR#t5ђs43CS$UEbrd?JW\5)JT/w$=$R4N:V /*b-SU޿9GPU鷪w5)A6T{d3ЃZzzl̊ r߸x,d,"W5Mkヹ`]ʓ'ih $rHtǕjGgemh[ 6^GKcn^u)6/X" :? }љR1ZEԭֶuxMqhPH5 F߭Z8DvؓiH}zx-X /[+ύJV{ S?g6݆/Tw_GqY r##h8!7<#M6xW./y0aʺowߒ,0dKE]/#'G\]qvhXM{,I^RC'r6B>_^F^CO!ŴUr 4WPs^@C+V+$+8ywIyg@{[zg6Mp`\PÇ,OBYjWx۷'\Տ~984GkV7wG}fQ I#?n+NXܥ8j?.,Gҕ/ڭ['s rŊs:zˉF!Su<FTR ڲz~Oj壗Vr)q (;Ob3׻6]nxx0T.\2LDc|%%u_ÈKE1Xr&59,)Nx5IV׻ A_2e9)N ½@vqX\3]b?5q[#/s:'i#[zש܋] l~F׭m0n|ګ'@VXiV&n\p!bTȔ-W{ v^ݹK룏~9;~JMTpo굽ղ.Rqe: fvYӹ :@A܋ X9*갏?3 `BkT{w>0w(v>&?ɪ"xC q#] ܸnpLO+fotN=-nȑG#(d:WȲ9U fFl[դIڅy{@Thg{ڨ]oHns]ǁ&v~@^=17kZ.] {. &< !_eՏj۷l}(ę[:nbvyEAܑŹY 2JW'G6NMb8kaeiOOoֽ5o Āqg宾4 Qk~"FTb!eӫߝIGE˗^˭46\sH]+dU,9n nޗk0홓EZw_|\1Y5ƕ`a:6ݸ6w㌡$f8Sy-֬]ٶD#vq|Sg%ȕf-թ7r$F #:bN:8:ݗ3r\9̪wj~5AOd]Z߈ӫV+*i${OOĚ-~^]7oidD]r1z󒟖%w| %*ND O֟8pav&/6/C԰?;ȓgnN3i4GM&dbI%IXgbKW&j#?ȩzR.)JR)JR!JRޖ̿/{mNz,AՌcY{R;T+ޟoT1T@׊Io'UY,Xi0796snUd7^%Ҿ տOFtj\7:YBm!\t=(gUHǞ`ܗw۰B<ߩ,YJXO՟},Eׯ@N_6·?nX3m.< Cid]v/>sȊ[鱸bSCiծDz1^Ե{[{Y)xW<+e:t:v ؋ߏ3 ͥIfƲuUaJDRjۑ2 ohFl]Q&H&3$]nb/vo&vF49 0$X<=~LJ Ttf1Xb2|8s[FFAŖIC o/]Nb׽ʾ1 .43q)ҿV7kVl`HQqMZZBi!M-TťHd7m'뾖w"kנEFUr|hs gh:uc̐ҷ1<7;cp8Cuӫ]empgݳlXa Vbbəf +O,WDJ1>R4.U&JI,-eHkK廙ߌN>c=ca&&8ِ#]Mq|(Gz,e26F,H0Uru?T.6Nᙁō[ @L{{ wSDEP>Ao]tvi`K EHJae  voe_sNْ@Ļ~]H XOWj |$8p%X)"iN9(Ӫs!qn퉗,E5gXz4G@ V|\w=`al#Ոx?_WO޽~_3H||=낓sdd͕q$m:XyH>uovRU۟;IWJзOWkrv?/QEKҔI)JR)JR! RNw-O"az:.$vaCS [H(3fmK>PN9 b^[&yqSuwCڹDetoc.DD8: q +t^HZ؞d _72-'"c a˗* -qSe53Teq粴n۸e|;'ndy(w,7^s,|w5bAַ6X6} ݷ ԞHafN9'v(f!cMּǼ˹&΍ I.U.{>$݃n'#"0CvZGNK귿z3YܷƖ6ECE@ aɹK~+kBQAO<;l:&rDy & 2!=kmR{^[z`a>FU*[vWe%9+m_{Vě&V^[|9oMl>ʶV8NbkG {fiUA[ 2i^j wE7VeilCOzĩ+p PT\)tbu eSfS(qvߟp;nl qēy1D~}zƥ;ofٗso"#< ,ǖpy#@I"hͮE:>޳>rpʪҴcDnTiU[gL|qr/]Cc֮kݦZC$ pMFRڀ[j?jQ6Q!pҦB* Rl`a +C>.|ru IT~eK!Ov(mG;}sfh+C>5ovN 1A؝9feErLGZ[_"XWd91˺dDaHLe]2#Cq<׋CD6PFXWG<μVUvBJy^+F<m,Lc(we^oKlbY#\ uq7ʜBo0-oi,[8rާ$fԚ"p7rJflI&\8׈)BDV>utqdt]Iw*Xߧs}u8F5izm"J󽫒&ܮS㺞S˷+:l[4J[ML()49HQG&iI;xdiR\|TΦ4d1],.ukK6Myđu~źb,2geytC]JFM@ڤvݯk1.I,@<+6M)f8@}v3c\FH_+K] v.:e)<|efӛnЕ*Im'f&ID ɔWFaڶ "O8,^r0 I*Y|/ HlMUoNv!a8ؐKȬA7<+v( FM'؛Vc=YSGx:[[h):+ZMEaV$_1Ku(QiUJ\JvT'mKdh.V7\^3uVFiO/ջ.ʻp=N'k"≍`]Ň̑!3GaVEmV&>5Ųe3^y8ҾAl<jf7?v#c;oo3ט"O孯4*^;Skk 슗)J!JR)R)JB)PEhAߝMTz;k4tGQ5%X]}z*ܱG."IVˀ RiI 2θB%pԷ^y%UI3Ei\PiV}:W&S"8( j+$sĞf\͒Vbc(y䕙[q+w$yT)JVh R*W aȜc<@3?`by/CkYDJHr[ zܑp\D_$q'`Ah8r.9±]2?[*_S5K4@ZAFfNF-QCJcb A 9p1!Q˙ tgfuhe71=K6yqtjT>)}73.TR y2q|ø<%F7H}r1sNGF^xmӹ\]23n5dz҉LX9r;heRZQzFMA.WQokח>N< x#F[J6 JWƆ,R)HBMvl9Qɐr5&@`\qk깋 WRWbxUs[X^' /P._]KaTCJ>_  *[NmxM8cs|B^YG!@mӝq͸+w 0`ln?c4NƬggl"?$I$1 q ^)5ݣQH[WsŎcoh/jShɎD_[Ze^΅;l qnJBjA$`[w7rIO&m 6b9 qƼvf^F'a*<0kkiUĺ}ܡbtɓ?ː~_)ܮq:}uH%Fq$ȗ[~:VrW>fA_sZF@mccʝ ڽ7cU q5hB@W 9LYc+{v هzA8W7?b~BQ6MwDrpJcބX2k!m~epʈYI)_#aaG&NAYΣss<+J]%6ZlCXvXad.&N%^(5,XdV\(uvlD[:%7W㷕TìZ˼w>tnL:^oFӺ$Y"YDO |zMJ)GFb ' Fck)R}U[ 4\N<% [`Ir]fcv'5tk})MEU,& '!;bd L1Ҝ61ʗj]rJ#:ȖI#/1ύu4<Ȳ6k>b3俫H@u&V[j9{mzֽ- ̕'0k6+T$%fŏ3#)\I ^YCXz_M :8w= [O42DYz}4'XS,KtC~kzC;ӏLa9!nO^qVu11-yǥ"R0 >'yGkcL8 _V{,SSEMYy˻K9Kkf>Րbƛ>9 $9tGͫn =6Ǝ@fI1<\qs*D1BWDL#43αlHlz%ה:jU*jӮiaʷE+n+:$RT )"{pi4e9^5L i?1gK7%VX_+-w\D/uiiB 'Iz~ⲻ_|X_'F$1,GJ5"qjݷ %eV+e:[ݹCaԕFRU~m-={>\EKGj-mR)Rbd)JR! R)HB*/oe16 В}hjKvbd:IRԖ)Ak5cj^qJCNDX;d!#I 1+'2RgǍ/]"QUŪ-/+1 AVc%Wב^V篓pE&݊ @o¹݃z2FeYVmjC-7pr.ZC-`!H5qW})4 + دwh9[Bsgɞ^ UhW@I?-a9fbf;}?+qw^g鲻 PHAnG! +R3ɥ%3<<x 6;,Hd4&QR2NYUխT4K<,ZFOݳh5դ&,kc,j:0+\ P`IH7(֜x=o6"%{rVk^˧;[w%"0I3n8'Xhӧp߸ڣ‡dL4Y$a0b}}+a땏|3v**'ʑ-`m~bE,=%Ou< f4fi7Js6^p.ɩAM M+f[ E'HET]"xWfB"USϢ3MrY~l"kjoegf8IF$,I Y;&dKrO!Cy% #G(x+Vܦ98>!Gy3eЪZ2nonUI Y$Y֒K3ck[Y2}L̤My2֑yLzA[I{kKY +q2NxÅQjtd ʴjυ' k$t%8Y&|y'Ma0"oywmLm͏MS趎qu'pY=^!DNM"mG^ܫ bg %|^7[CaԕFRU~m-={>[EKGj-mR)Rbd)JR! R)HB*/ne 'MNTy=_zSie2 ;MD: N k5cj^qJAw۹ HeƑ$.L,m*v;0h=Mlp}ZIy dfkz)^6f ݸdLтquվ.df11_r P|a do[ʴ ^}_q>^zNw!LǍ2&Ьz\귈6"EpC<{kbij`[ΣV lma6I+ K8 \1,wb3ȁACk^ RvZL[̭^~zΝDqr¶ׯF$ O9zq,#fZFۜ‚~eMbS.aXC2-2]_/uOܘ[ı,^J-uZ)~SG ŁcaEϕ'L mF_6Yfu$w>.JN13,yQk877lmStrAIպx]ow Yu ӍtuӘ׫kZD2$}C2>,UPh"܍{}ՍLjnnm洶ŰQ.K8Hc8Mft;~DA}#TPqn٥I\b&su+h˹`. LI=?Įu|X^61 .$ۦ)'k-{Eʃ#0},P{c!$3{|kB>YV{e:y^U *<Ѯ[>}fY=TР)[E1_Iۻlo^L>COIp@\>mfaÏ/eGŃ>,}Vv6\A$vՎ=š(so@fc *ç~unNJm瓕㌡G$f8Sy-C{YXxCit\T\{2yjkP'S.u{xU^UBe*KIoQe&tK8"q ۦA Ǜ*42>]+@P/0Z_ v+[[F];jutҩleډ761+)[XUJ.8K)RBqHRF%&px6yL2j~tH>$6Ua""?8=?5{:Tonx|VUT/M57xq쫲kܸ^XմPP$Kt?go<Ϗ֓^̈́cǏ`1[Z7WssυEɹ)`wyE"'L{'|*RfDjTnb3$XsKNJF;!$k{ >zF~yExytߕ]tVŗ%sO* x{$3qwp-44gb'Mtmk+9YO`2q }~VΕ۠oXVJ2S- D"Sl"ݦ'W)7T:(PWcGp*Z)JJR)R)JB)ȾbKX zȈ-kSxnݷ(`_,iǔZ>KmcYiLe"?Ǔ X2 /xmtc6)tߙ("4)HGmߍ˓"cX̬-5fU|jٶߺ{}+*()e]ES5[s Kl{vp(e|&s p1ŬR"3'2k %9 $2DfF;?7=i'$KFJHUu] U_7-?sM^&Nc"nܛJRqf|HM||M:E6sʯWRuaun/{'j,~s%+@t2eS7=#wX,p̰jWV![yvbu}d\īR!yٽe>uŞx $Kuyype7 3_Sd~|'N\U~û}+UUr ;v>WU~F_;`OV) |ܳv''%XW>U*2)>wP-ݫr h;;)`V F2uNʸ~;W{ܷ=e1I \,^x6P7|*4|⾁ӚHEy%)JRݰvrmL$h|}` V㵤^S<\Pn-WL#e7̞X/VZA KnmO)HD~x{叵MU\x3^%EYSu _v.s1$rcS4EC()JB'ٻf7mS?_,)p\(VOj5)JR}1;QeoQ/^9Z]qx+FfOdf6nSuO#Ll@rlOwwܽú02v#Y\o-g>l(~m&0U?X1fJRs?y7+l_mxK(! Kpw=.iyr: ] 3$^o+ qI3b].Y᡹`}ܢس68V`$&JJRs]'lh|XL!TP{7ƍ'zrmc#~󭟸Lʼn#\)F 齸qQ]勎4X-h|:1R!pnft7p1fl؜i$3Ȗ#U*O-n~qcdN#)'}5wdh$8ћ :*WZ?lؤwpv,.yW\iJR^g&L R$,Q .[+ćAG ~ZR!yOxPHVܯLece .7᭝YwN۝}>Xd6nǓS)[yV^odvvݢx'2b:@]#k/pvnwH8c(~IJRG,;w+'Hq&q>7ygɞ|%C ҁlL =qgln6ϙotX&wTPd GWp|PFv"zm`DR!`]}nYVyUC2)JRVyv]/_S]޶u)7@ȼa2pk#&<O t~.ZֆDnソwN q([P@:doJRSFg.=myS&PY2E{^&~ޒ\YA tݼ3Hwb}\<+ovnר&'Z:2Y5th󽭬)JB)mqrd0KxH:dп;ia`@]|5DuI'Euڎfdcacm2p%~AUMR R#{6Oy'c ll?w{Woٶݳ'IL* X3oo]pv܉{'LbK K_Ҽt_d:zvҔ!{_umn`c3cYB6TnqU*-0w& o\(_.*M{sf7ٱ.,=rIyU ^VsCL3dtlʪ8)HESu<,W:%HPŔԏG{n ἂ55emn;/l<^84Iܵ#-yڶ7~ɏ+yS(߫4vK3JRsz׳"݇ R[$,2 JIL.So07|SJ#ݿaڶݜl0tvY#XybKҥ)JB??[^|I#$Ȋ`(оn ᩏ.뇳h{?`uǿ`7h)c̶x4'Hw"AB:Ǥ~:R#Y٘M v~nLٛ^3"| ~.!/WGo; &մQmn>TZDk0~GW'll{nՊ Ia/$cbL犨)JB"2wwdr!ޕwnvNFVшqfp2Rtrace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-advance-filter-01.png000066400000000000000000000444051414302661500300670ustar00rootroot00000000000000PNG  IHDRsBITOtEXtSoftwaregnome-screenshot> IDATxwX "!B/"`(~ 6!-dy4ç8x+D>mlw(FQTOO3 0ٗxcrh@g#ZƸ+'`@DJ @D;`rNr9_lsG_W˖m-O 4H7ztX,*W\r݉Ґ0-.I!h^ رxiNee$zn<$p 6h z>6ahY99eeqN#lGRö>VꔟGʋ3434[4nII Fdd; o1ƮmbL~qÿ ۹16֮8a  @DJg#G&܍aǃ*8I!tTаԷr۲LS<|ɳs|y؎ap7N >.8+WMCի/}{64W\aCKEF\ [mF!:z|uuM[;xU5us!nj۴~meeGnڿ۶cq57ج?Ƙ9))/XI55:db)NC=y,|dfff8kV_xc\]]-++c6:L{%&[,UdA{yy :4!!b޾}-jqTTTxx8y{1WWWjU*:I:KKK333,X!''ghhdPzz:.(( a-,,Ξ=[WWr~Ꚛ/YYfZFUUU1s 6LMMӧO[lׯ_HHURRyۭ[79>'OZ[[S+))eee!,,,9Bf155ݳgy@@9'L@طoBv\ :tHUUU[[{ժU033KGGGUU޾|S~!CX,c^^rժU'NK?~驪:`7n4^uU\\|)ōgn^[[@VghhxYa 2B:I&ڵ ce˖3gbBNNN&&&w?L&sРAF͗QjƍnnnBݻw---UUUFU__V++u9::=zt&&&&&&wm}PZfX XnݢE D=YO>Ν[bB?~baaaYYsaBG7oLƓBW\~:N=z… SSSfϞ䤪6aÆ?!tyKK޽{N2...***>>Ԇ?̙3k֬irG]VVڵk>|hll\UUFNNNNnnn)))IIIt:,r%EEE__M6}zbbF\\ǫSKTTŊ"Qp8?z3gLMM͛6vMZYm"""nݺf/\@y6lr>}J[BW^s玆Boy/Z| 8""&&&&徾gΜ!ӧOO>>c7m4EEŗ/_>yN4ڨ/?gΜC.Zݻw߿oy vM!뫢1vuuZ@VVˣ閖!AT㣮οV*_VTT\nݺujjj._tR]]]}|ڵ Ayzzl޼۷[nmsrr Fx< rTSS# )ѣGJ_UQQ1djҶmƍugg̘cǎ"2 j5555Ţrrr>|hiC5}̙C-]xڵ...999dK$/zpBapBVVZNNjwwwwPDD;y-vSL)((X~۷oG}v###ׯ_ڵ8..NJJ7cQѣB#m5())iР +++2(hΗ޽{SRRdddO>=d###333?|x;w4zID #22Ņd2?#GٳgTTTllȑ>}c3BhΜ9aaaᵵ\.7--B%##d2өD!)###66ZZZZEEFtaÆǏWVV68P55'.Y$77c\VVvUk1bĞ={0\.ւqo߾gh~ϟs\yy^zKc{{_~ښN9IIIFj4| )lQ_軦ˠfuuugϞ%?fuFƕ~-Krrr?^pBBB~QFCϟ}aܹӣGCN4" [[[y!w;#>|A}c 7f=zȨo߾K.mlٲ|r==;v O{;v000޾}S###333y溺:I=t萱u'#Fxxx9u,\;o?Λ7OKK %%ޞc{ibbϿQ֭[.]m6A7n/mNqjM"/ LLL-,,bcc['{K.x$~G}ǿZ$66ٙI:.AJJ*::z̘1 kGQvո糠333/_ܢVb_(~5]dum-%c Є ҳg^|W֯_KEEEoo+Wv֭JKKkaaaeee>\fMҠaÆ7@%%%|߾};;?Ǐ .ܵkWQQ B_keй,gff>!f߿?ud'N/O߿۷g̘mmmPtt׭Im7ofX &&&!'N\pKrrrN*--b R#++|3gDL!!!ׯoQb0EU27u;p႟ߛ7oh4ڼy6lr>}JZ`IHH`2AAA=W޹sGCC!d``7߼zZ ]Aˆ BՋ[ooo6522~:Bk֬8p )G1ʾ!eee))){{c޻wq7oޔ_jeN:EM]lɾAer7~+!뫢1vuu}1ƲW^^ND}ʕ+g7nKII!󯢕A [zdÇ:::T!Ç䭪*5IUUݻw~a߾}䵺:*:ZTTDKKK;]]]UzMR=pwwGEDDG !*++BAAAVVVL&'000;;{ -(( | %`==ÇSW^'oI\[[{Æ &Mj\'}۷CzꚚclvv6&Ifhj{FFF'Oxxx!ָ6١ "j4F۽{ٳgwܙ_VVr˗ݛs'N… wxϟ?'&&iJyy9kt^%222L&3==urrܿmm۷o?k֬&NLLܻwi0yݻweI}>o}YAy]]ٳgɯcnݺt55'.Y|)++zjMMMJTUUKJJ3['tz-31cƄ?{_~پ};uS4BhΜ96m;qDhh(|qI[lY|ގ;\khh9uԀ&MNN9gϞ8qN4 4hСC...jjjVVV7nhooo --V ~b:;;3f U(mi)(KHUm+l# Ht86Om+l# 'xVtJn/-&6 dx<lxL&S *ڶl;@u0HMM566n UmvNCԱ}=d0}2O9t˙# IDAT HJփ H$`@  H@$0   H$`@  {DҁH2OWh%Qڹs4BҁHXrr2Bɩ]p0ƒDM:$0 +Q^RԹ^IZZZ : FнCF5(),,444,//JB+5nX޾}ܹstW^r(kިQ>k$.|fjqb8q"BiƌmIZVV6==],-]F,U Ѧw^sss٤޽{@!h??;wt:!4dqh4uRWW'!h:./iii!{Æ SNm\Ù3guuuϟ_]]M\tIzt6nfaaaaaq=R^YYj*CCCuu'fggc?~{)2… G]WWrrr211ٽ{w=7nw˖-s899[ZZȑ#d˗/2DEEeСW^ޙ+..ޔD? _{ڨQ뱀f'[ѣ ,(((011111{nCJ7a-Y***޽{#ek׮x񢕕յk-Z4sL2)**JIIiMq-6}??7oh p8&#62e /^ܸqѣGt:=**bEEEg* :)((ܹss۶m۷o'3'$$Ǚ8gΜPiӦݼyRPX,qDD;)Ͷ,Nd ϛ7oÆ \.ӧd&W޹sGCC!d``7߼zZ ڗO>m7oO*,,v޽{l-qɓ'HIIM4iذaԤ_Uzw|}}UTT0Ʈ޽{Ǐ\~6---qƼ+/_~Iuuuf;[222cii退'ZbLN:5iҤctGG & _ 6\fE8Jla_Gɷ !͎Zࢇ ԗ===7nH^X,I999!.laa!<߿޶JJJ䅜B>t̙+WHc55'.Y$77c\VVv՚̣G_ JKK37o4;Թnݺw͘1CP 3\r.sYf Y} A.q-_Q򺺺gϒ6ݭ[7:.TZRRBY8(E%0H+l#s =8 6Im+l#sH |IYtEv4йud2y<F w "%%LH+5u`0RSS/x4!h.JͶϐBo߾@d0}2OWh%QڹNCO@  H@$0   H$`@k׾B@g2qD34(JEEEt~|XZ"p H@$0   H@JOOp8%%%m С)))1 }}flARRRzzz ԲBgkpٱXfgk0<-"Jꄛ  H$`@$WVVh/[F}lmۗ.]222ś4bĈ~Mę[ـ&($6&&FQ4hׯ_K:KyѢE_'_~ 1z .ܱch+W"n޼%pcݺu3gKUFFF?XjŋΪ4ݻ---?NO2gϞ+VrM=`yy޽{9rtUUUg˗/;::~1:/7)SGJJ$h/xuֱ=zL0Awj&hooROmobcci4ϭpw…o~ ī$`'N(@ZeҤItmNKKK,_?|иPFFի +** gX2i̙噙ߺukj뽼ΝpMLL̰l2ׯ_ {߾}}3y|d42ŋTPP055tRj?| //vYHi÷lBtuuK^y!իn۶mĈV'|*E0nr4gΜYft]<@^?~\__`x{{-\qUoFQҼoVRRx_P-QXXX 8##CFF?WVV>~cptuu.]Z^^^WWp!;;ӧOޤ)S899}𡦦fӦMrc{{{//QF'իW^c|b?~H"INN=uϟy9""BZZ: ӧO$#VUU_oX~BYjjjx<ׯIC 9~8xӦM}2e ѣGz"uEGGkjjR5ܽ{.y(++KvDzzzɹ5%%E^^\.755UGG'44c\__?f̘ٳgܰagڵ3fI"񸹹1[l6l4x`==|?=ݽyܸq/,,|^AAaڴi555ۡAX9{u>y!y&W'|*Eϰgd*E =z{n}}祥EI+WTm,(yp4mA 8''GFFeee:Ξ=I(|}>}`ɸ" ƳgF@ B%`CCCrj8s挮n\\)`ӦMkݻwz˖-7ozzzlIIIL"$l"$ϛ7oܸq/^nݺӧc---/\T__}Ǔ%&Ԁ Rgř3g0 .fffvvv^1S9F/@޶m5'srrBC)/_tttիԩS\B$!'9sL4z{ éSX,U^zȑ{" _|1PWW?wŋ"g&_وMz~ vcxbApp6 ޮ]|N Ϗ7mڴ9sĹ~+++5o޼< X^EPttt!%''f8qb+V ݡCOϰ͛7ݺu{=8$$wނzBE|}}Ik2߻wNSo?})›Fh#$\ >|8rm``uV={O$rrr222222211c~~&O>T%ӧZb fKKK7_ӧOS~~>J_7?qEocƌSZZZrrrll1clƔݻw6ƍf8pjiӦxbƍ-ZN^3|qh4Z޽[LԼjhh 4TVVE!zz"c/[VVO?߿ʕ6m5jTRRRJJJQQ1Bh˖-k֬>}7Ǐ޼ys `2T;,KFFVWW/**!oFtP Ο?_SSs޽ɓ' ijaݺ5ټ<4;l٠Ax<23?A{&w?͛W__3`f6&gXӷoÇ>}!tI???&d`0 W^jMٳg7/"%$~&߾}tzzz"H--ϟ?S/ yKII!={{jkkSkMqq1_bXxIrrΝ;B#F短eddƎ{6Nd[(-_DffeeQ G;weee! N^S< ikk!n0ۈ#rrr9gee5dȐݻwSKŋmrr2̌妤P***r=z .\4f̘EZ|AaÆݺukڵnnn 4hPee%yJ***7 !ruxxxppԩSIP{wB$BctR--mm6ԛ$h/;9={F322***Er\\ϝ>|8gΜf6&gXu}.h]##Po.]ؔw oW^X,ڜCo߾!7Ȑ˽+VS]]݃kԨuɓ'JKKݺu0\.wԩ!!CDGGe޽rV^mee1~왬ٳgkjjSJ17ns8==7~^~Dd2ɊJJJ A_tUXQQagg~zR>f̘^zٳc٫W/ j)j)%%EVV#4ݻwKzce*Hս|jjj9r9991s?lii)dPciiÇYf : <ɓԜ:88xxx;VPD]]]ttٳ ̙3񪫫5QfUUU111ݻwrtttrr*..~m߾}j&L rkkk۶m[>}a.Zvm`ccCFDDN7o^uuu~~٪Up͛79gϞM^vĉ с?н{[nqܨ(YYY!W\\e``q&ojÆ ۸qcuu55-h/:::eee666{[ۋ/"FIHT~>㊊=z8;; 0 Yuǫ2Ϟ=t ͛7s1.--kʧO/+y׮]+d@˗/--- 433 'o߾?~2-.&Yf~Ϟ=uttf͚EԾ|̘1?|`0c… &&& JJJcƌIMM%n>|x^ϟ'`qVVz^=2 :׭[C*LJ?"^xA6SZZzRw?.X@YYYQQ͛M/܄d'$$ٱX,&iiiyqQz~7qqqd0MJ9|!7nXh.((>}*͞1cFaa&m:8<4l0YYY]]cǎQyzzуb-[{JKKgfffnnsÇ3&&c\__gϞ 8lѢE}¨޽[CCCIIi…7n* :(04Mȧ 6mٳutt$`ﯠ0`rQԽ""y Q5k(++˻˫ݸqҲfffǏ6l c@TaCM={6IB=zvvv3gΜ9sԼZZZ}頍=X΁~ .HdRYY? ,[[M69::FFFǙZ888+v~)_zIf̘ammmffvС=cǎRٲ榬zE&LfG#ȍ7 .\X[[K&effzyy訪ۗM:u޲e*++ 6@G$ѣGǎlnn~QI!!!> ?~|aa!)\dIbbbTTΝ;o޼ɿW^^ޣGۓ'Oݻ5A Ir7o޴ݻẇ1riiiSN"SsssӧOc9fJJJ^^ގ;tzUUc~Ҟ={~zH3DDD"̙s*jٳUUUBF266r )1bBHCCc̙!!!usڴi'N@xSN͝;q IrEEEMN?~UO2gϞ/ɍ=ӧ7npܠ :>|=zDFF"ݻ+**~wϟϯ5 'Od0nnnc// .PCMMSMM-??_H9Ο??,,TWWO0A`9TTT޿@sssCCCcccS\\L&X,τ*++B999t:AgL@$8qcǎ͙3Ƞf3fL嚚 j4hQXX͛7gΜ)##Peq-Y$33cLv[n)++#tuuy<wdeeKImmmMM?z\t2b&_?WdddRR ONJJ?|pvv)EHH{ӧg͚ոy߿ƍT:o !ɓ'[YYyxxDEE߸q c\VV1 !OfM ...4mÆ uuu?tqqٺukEEˣIx`]Guuu2dGqQ<,Xf6}ȑk׮lIfΜuVgghԩCׯ(4-"%%uҥӧo޼hРAxڵ666zzzBV18p͛壢233-,,455'NJ-e#jccce֬o={vkז;vLLL6l0sLHénJll3vBJJ*:::ƳCCC9Δ)SR[GSv'%4YI۝>,###0:\>p+؈ ^b9B0   H$`@  H@$0 CC<+]lIENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-advance-filter-02.png000066400000000000000000001072731414302661500300730ustar00rootroot00000000000000PNG  IHDR~zsBITOtEXtSoftwaregnome-screenshot> IDATxwX8I@ (қ4 "Ġ"E@AĆ QPBSQޡXN9= "v+"E99騀(E$>@Eby 3}fI>}B\d^7Ax0 ` <@xLEEEMMMuuu_5 III111uuu^7oAH$cci7(77!4b^7!覦9"y ?9:0~*p4*3mfO_ro砽?|g3`gsƍիW?3X[[oܸ%up* 6eN":66>zwss3]^^^IIiŊ?)ݕ@mڵnnn^^^f0 ` MXYYYV:ujbb"Nɓ ={V\\~^e W^ξvڶm`^+Y&{esرٳg[[[ٳgPdd/uV"68z(s->U VVVRyy9s_@p{ aX1bĈt"e8q"`t:. P__/&&RѬY"""gΜɹaaav,QlVVVF"8gzk oWPP aϣP]]M[]]gQQQQTTaaaZJ`͛7̟`_>}tee%Bӧ7oNNN6mjlld0*/:s oo/[t4bz˖-NNN'O!o޼YTT'--rY/憹effΙ3'""h4ZCCCggW}?|֭iӦ1~Gq֯__WWMf ׯ_ ݿʔ)_y~[ݢ!&/0 }qz,8ץ>}$!!A&! 0H?EرcGog)//wuutRMM D k^VVTWWc3_~ x ͛wĉ2,""("&&sAuvv~wĈMMM?A cHƏ?B---$iȐ!"""Æ 7n\tt4kJ%>*passm۶~zÆ  B&W(4m6--oWu?BD_ٽ{ȑ#߽{zztz{{;NOKKSUU%􊋋 »@把ԩS>믿޹sGJJO@@@^^^JJ 0^E܄9l0===>>'Odggkhh czFݻâ˗9>>^YYSXXXTTTHH/ނу;;;`,_\PPѣ߿hn`NtzNND3fl]]ݒ%K|8~D"%%%߿>|8 o1n!3]AAAeeeIII2,$$$ w}Ĉ/_DݻwVUUuĈ޽ÙgϞjbb(!!QSSb0G533SVVR7_UU̫߉D JJJJHHP(g %%%ǏBo߾ɓ'իW ._ nܸqY#G{yyUTT jjj>Fߚ` ݻB BdȐ![l:t/|966vݺud2ʕ+!##O>)++k)͛7ڵkΜ9MMM...6m+,,zykk+B˗/޽P(Ҹ%%%۷ݻg]]Y<Jqq1oCCC]]~'۟>}zhВ%KԲs! \kkkmm-.2cJJJ˗7uٴ4|"v#F"\CСCB:::C8p.DYY|ƍ---?~ܱcQҥK>}Ji4ZvvvII B۷oqO{(MMM*~Y zҘ1c׬Y޻wiLLLr?|3eʔiӦ!<- Xb~LLLGGB_cې߿?{lh1?Es|tuu-[v1U[[f͚z!!!{{vlې d ___YYYgINN>|[0vX555Fccc--3f222Lҷ|yjjj&M?22LJ=y7E`Y_s=}41e}܁vZǺ: 00JwtƲh4ћ7o ,뫷o0}ڵܾ}{ԨQe޼yϟ?JMJJJž*[[ǏsСC̻W.5'OfddHHH'B=b߿ĿIII EEEoڸqcozļ7oLle(**jii!SBϟwuuUkuT}H􌓓B˗/!!!f*//G=z‚\YY)))S[KKKGG'((/]ssğikkkjjRUUŋ[n5663gB744앬]v+JR|#$VxK.߿ydMٓ'OlllwvvVUU=z]W޽{'Lgݺu3g33gjjj*++>z􈽨>lT*555mmmC'.4p?֭[\.55c7o.YDKK &566aYkɓFFF***/nii!&Mt!n{B.]TRR"[l777 h^2U!111CCô4n2S onbb2w\>>ӧOoriiihh3gʞ={,Xp9b?~ۛD"nٲؙ^z|r̙+VxMRR/^믿@jiit>Eeee]paͅ?~L~~ǵ}||_}hK.y{{5ŋ3g}QCC,11ϛWW.!{[?CCC3f<}?}ZKKf^^^NNNii)Om?xڵk>TSSۼy3Bh֭ṹ'ODرȑ#_|quu577.--O={ Xyyy=^n+>}znnʕ+g a 3gΜ5kViio 1.{VO>իWɉ'zAJJJff&q@j:w1,I":;;ΝWTT8gHЫ5*//sĉ8fffjjjsY`0߿ceekںuknn9\]~m3ܿ())qppHNN&&ݹs'00&&&ӦM;~8(Zlٲ7.^ÇxJQQѴbyj䰗e̸EoGpJJʄ >}tϟoٲex*~ER^^^CCИ1cB222h͛7=kBVUU7Z[[#OǧtREzyyݹs]|YRRodݽ!4a555mmgϞut\SS={|O577/[L[[;>>~ĉϟ??w{ϟI:q℻P}qƸqDEEkjj.]-### \YY/**7zqi|zuƍ*!!^r!CB].D255ݹsgAAΝ;'Olkk{]݂'9P(|||x{T__O-;[)6!ڵk|||#&K[&$$DP/ïXW^F**$$7lOOOիOsIry'==?8xe.]}}}~?7440 [ݻ֬Y#''wƍ EEEves)wwwKKK2|B:uj||ׯ͛\===qWέ:u'O?e'''NI˗/KwZ=V͎ݻb===---1@EEcǎ>}zԨQ'O&ϟ&'N|80tPQQQ|5d4%11REE!ܼn:SSS]]]zM˛m߾= `ƌgΜYf͉'n߾8Oׯ_ߔ#HO>w nCKJJYέb.YMM؄(Bh>|`ͳo5v.,,?̙3jfM/a-Ydܹϟ 533sss:u*tppppphkkKJJ;wnaa֭[_~}阘SGG'>>`<~]WWի !_qӧO9t?$$͍ea/3^pgffg♙ϟmmm>}΀۸} FGGGDDxzz8qDGGа>}6J9%%) vڵ[n ĈKIIxӧOL8i$|N6P455ӹl``Vڝ7!yyy&5*νĹU w~ii) jII&AAA5"<==cbb޽{Dmcǎׯ__vMJJ !ho72 tnjs77//穏=⦢. hkkz>|}|}}]]]T*-}"V4B͛7/^p§O\]][|XZZʼ 5553b)))6ԈK/YJ:thС]n]fWPP7/},((_|9cƌϏ92!!!T\\|& --M"ŋlmmBIII$IZZÇ8Bh…gϞ|r[[[GGGAAlkeeePP5qk #++GǏzzz""".]^z5諠@\EijjnذѣGxxȨuFмyRRR9B fvهIYYiӦWVV"q!dG\\˗Ȧ&QUU EEEĿ͛7͛ի8{{{.ovvvP***?MSN02a+MO>1sKZeoo瘘˜ooobݻwԴf_#BH]]}ر?~tqqJJJ88q>l\ Ϛ5k߾}8`鹻߽{9<(ꏩSfddp %%щ&n-ٳ4//y<ֶrΝmVyzz^xݻnb>Ahw޽c@jD쥻|Y- nfٳ.뷠EDD~_n߾d2 ,ptt "bϹs&NlnnN9sf۶mWf0uaÆ$%%YhBYbEEEB122QFyxxvttǛ?~fÇ.#|;7I{G7[uهčiw\[[+!!aiiIoihh NII;v/_<<<8o~~~ǏOII]hQ ;v***8i&cM0AXX833Jrɾr&$..aÆ;wO[%..~…н{zxx0 5uԚ %F+V,X@PP]L%p•+W^xQUU5i$EEŗ/_۷oݺu8OeehZZZfffqq;XNHH9rHiiippWEEBǧp˖-$ !ٳ'Oy1|ĉLjkkBVVVs ?pyIIId[[[ !n:YYYiiigggŋ III<˗/shBllud+WB ܸq8\$`q{ xƌĿ7CCCbCΜ9S[[GUUUb, $$$//O '1>Ç|||D沲۷ݻg]]]ЩSvmmm-..j*.d`x1 __ɓ';vl{^rE[[!4o<ѫ6555 ( )))̨`0?~kkk۫tgg'Igg'BhϞ= aaax ^LLL]]!֭>4+,,F{n,S.]S:NѲKJJ:::I$4???>iΎC3G=z7&&FCC#::ƍfffAAA ,{kFFƔ)Sz&yyy ##iӦdXhBYbEEEB122B;w.,,]\\oĉ!|vf_ӧOnvZm )JGon0 ` <@x0 ` <@x8<<|}}ڵiMbbbg777pB"22LJl7ѣndddL2׭VFF6[s$$$jjj 4͛7PO?~Rkk+w^^^y. `S(v[n?~s:NԔdީ={XVVݕ3j(yydzg_vmҤI ;'IӝuttYTKKKcc#{zXX'K}Μ9sҥϟ3yXbӦMEEEuuuFEE_~*̦&.//O rӧOmmm\fpqq9y$KzSS̙3 wܹvڌ >>Dgl߾}񎎎rooo---/_ |||֭[G~}}}e666!!!&M8qbNNooEYXX1~aɒ%˖-#{YYYZZZ+Wn1--stvv9;;s۷oGDDHKKkii^85js2~|%$$@]]}֬YGZXXUVVJJJ.>PUU511IOOܟ}]W# R X)---,,ܲe ޡ,_x`ʔ)gΜ)++{왻;BE^^ѣGo޼ٲe ???1!!aÆ %%%3g\d C%$$9r488˫!}wu ]6J#J+PFFƄ gߺu~xxxnn.>'l?#Gإ:t('''00#Gܹsɓk֬coj*++EEE233wALw^zzz^^q~-ZyA]]ŋtqqs玊JppQ6lyKȈX;D޿2dW\,Y!??ׯ_ߺu3441cFIIӧO,O633SSSm]E |2--=6!T]] uu56jԨ%%eϞ=$iĈVhff6{lAAA*3P\\ӝ.]cS---d)Q7ƍ'**!!1c _3 ϟobb"((xo/pllud+WBk֬QTTP(7o&Tv]6Ҳ(;;ݻ999T*Cr.Ϣ}A988222˖-4i6g~~~N"&_8HKK P(ZZZ]^f޽{ޚ5knܸﯨ}ÚBDNljj2YGG۬Y$$$f̘37`pRT}}s9eee=<yϟ?/[z2c87ҥK222NNNxq8ׅUTTdeeEFF III_r( ,-- / ^TTӧOX[Nڽ{Uq`|#,,gPYYY^^_[[[Bo߾e>STWW'>ϊǎ?W^=rȠ {{r555>>> !h݋'}YWW!;" u ]6CXXx̘1eeeT*UCC#11Q__Сā|@sORRX!daac\nRQQ!vjjjo߾eVTT' ==^]y׌pK:QnݺU\\|5rܹ{H$SYg ÇgL\#&jkk/ Nhll_O:5}DKKKRM[;$()+_EEEOO(==a.'y4551 ܓH}}q}}}!!!''!C|AKKU£\Byyy-X **ǵӦM㰤Յ}ByBTTd2}Nw]566_eN||_kkk0nn RRR#(fmm=lذk׮ݺu۝[[[pUWWwWΝ;޿?nܸ.~$ 8@!莎zdeeNXYY`0޼yx…gϞ|2?!gc󼼼wڲ;wh4iii@"Û:::=z̡K.z)Nhٸ$ ]62peeѣ544Y.c5v [o M ,,F{n39&&0&&ۻ˜RRR>>>ׯ_щryi4ݚF7.\_nhhظqqϿui4>puue)s„ t:LJw555---xy*Sfff2MxԩSt:ÇOZ[[###`UUqرc?~¹O>ٙPVV!uhhhCCC}}}XX {ڻwǏ/]]e0JikkhMggg2k׮;w\re!eeI&m޼Ǐ111u &lܸ縸<~аǩYӦMD}BL&{xx]|su)))YZZqn@]vRZZ:Cu5Bٳgـ]>wʴis59r7sG3g9rDGGGSS_{ wwwwrr?իWN?n߾][[[MMm۶mǎrJIIш#6mEXBUUU__?&& եRnnn~f ƌC",--1&Jmjjzz*Y>|[Z>,\p۶m aaa vI^^^CCjر!!! ..~…[niii͘1c֬Y=z+((gff޸qˁӀ997jϘ1qȑN755ݿHHKΞ=K$%%SRRrss̬wTQQy*KQ&L$R\\\xOXXX!,,RRR2vX777| 7u֭3fp°0UUՄ3g8nGPLMMMMMEEEU ݻw͛K. 999<=c 99K.!DDDo߾jժ]vߗXaaa}}ɓ'P;vLAAaĉǏwvv߳gϼyܹTܬG쬨8~ׯȞ999tǺ_|9awwwWιs>#>{ĉUUU9/3wzN褦rxVzzڵk|40ضmۍ7Buuu kccxbwis f]E,,,𓇼nkO>A?*~x`nn.[^$1)"",]^L<%ɩˋ`u1?T6őo: |׾߂G ` <@x0 ` <@x`pdd@ƽ  ^^^,$00WڵKFFϕчyoܸARmmmܹCLJJJ233Սs x ND&tҥK/^hvRWWwww^gd>dnJuu}3Wzzz >3A{{{/Z",, !%%%;;hSSӁZ^LCC@JJJZZZCCΜ9S@@@WWw„ [5ڀw^zz:BAܹݻRRR[lz'O^x!+++..~͑#G/jjj>+!!ׯ_r!0s 6fW\Yv-{arr2{zuuuKKKSS1cB&MRUU={_~gϞZ8 G_PbbMB7n>>ᑑ_ BoZ IDAT?0D">6VWWw7@+//|O5oܸ?_xQ+=NӋBϟ?;v,J2dȈ#f͚uƍ/`۶Vn ymxxx}}=:88uvv}ct:_{{9r}ޣG>~<88!dff{sg0p``'L/&&ӿ|r*n >p@cc#'''o]]ݒ%Ktttlllߤ$]]]дiBCCW^`kk;jԨ;wrr?<7w6 ,ssk׺ r/_z ߂x0<<@x0 ` <@x0 ` u֮]8Ms_1|||v풑Un:~x'''-[XZZɍ9200߸qJ*+++**޹s/g`:x"h4ڮ]Ν;7|GH$ŋxuu0OOO>DEE%&&޿͚5D}>}ӳ˗/V277`2gϞ[ZZڵkWgee٩jhh|gggUUѣGڵ!n``y溺:///yyq=~h"EEő#G^p!//F^^~鵵8ۇ,Ylٲ?"%$$O[[[SSS<==]__˖-AAA4 As̅ zŋfBO>իWɉ߽{WYY{ڵXwww__bGGǀثWGFFǿz~y-Z?uꔻ%B-!!r:;;q{+ǎ̼y&"--U__yIII2勿ÇP fd%KBC522~cDz$VUUH$۷ogiii~BBB0hnnXVVhBag\DRQQ!8IJJtAAA;Dp>|Z[[ o߾0a/>`G؝3p/..~r ^jL&EDDL2d`OogQVV~ KByy91EAA`TTT(++*pbo˩kjjAKIIQ(|! &68~8=fRttt|||JJfwytzqq1BݻgΜA577#F<{ //^ŋ[r9;;avvvvΝsqq|䉕}hhhLLbbb٘uhh FXXBssso ۹sOv2c~~~ yyywޝ3g{!gϞeķ ;;;;;;t:F#4="""99ŋJJJ4D"Q(ѣG544:T[[kmmz*QiTTTUU1l0;apaa ǎcO޶m[`` BCC+**~ 655e0T*u۶m}(D^^^CCȨmڴi!!!,%%%iv=>4ܫN>?ijj>|Fݻ!4n8<Ç%K}VXXXWW7))IWWR!!!|EHOO_vy)JMX?ɓ'$:99'?9x ` <@x0 {)LRt&E*JVKw$D.E/mٵB(Q6BYJ4}IUـnCоCMLLTSS˻qF{,H?*((H).ZeСv+k^ÇYYY ,UPP011Yx1B(##b0666+W߿?Ͷ(((XxmlllllByyyg611155]zOBUUUL&ԩSÆ ͛FECeeeSSSG BG1b5AAzvv6B(99dXKK˟~:88|'NHٽ{7B())iǎ5Wjii^fee[KKɩ)߹sgȐ!jjj...dիWL4/-,,8pիWI\Dxuuudq&&&aÆddtv1Ɠ'Oޱcxͳf"\]]wXozyy1L++۷o%ӲM#Ǥ+۰a'ٽP-p-[[[---mmѣGx|N?^UU5 `ƍGE-X$&&2PwtMM͌Yf5Xt祦1,"卽6{xx;w˯3fHNNMHH</))iݺu%::ZMM-::G4CN >x͊tR||.B/|9 @>o߾#F8pMvǤItIPPh%% "ÅSSSk+_~Iyy1W^rt:}JJJ 7l```Cqaaŋbdee7lؐ+**_u0ӳ:rӧOkkk555MMM1NNN7o'$$L>]UUٳgߧVVVJ5x >s:T^^~…o޼ym\R-4M~LZ@P@@&Ãjyy'??N"۬E2HP4jHHHHHHmm .]fڵk)**ڴiׯl"sss F|99 &劊䀔PRRD?C &mݺu[[3gn߾Çd0977ӧԢkkk c555렠ݻ6T'OܿҥK֮]kddDִ===W^!'勊z7|BEEEyyyǒ >uԢuֽ~zԨQ۶m355˗/o޼cǎ*GGGqGƒį"ӚMNr@DDDhh_jUc<~Z=`yyy??]v8qbȐ! B,Ydɒ%E߿AUUUqwww5W^qqqފdl6{׮]ݢuuuNݻwvv6YЛKbbb"//` yzzHRi4ZpppppǏ7nܸ`DaÆ]p!33sȐ!%%%铯o!͊4"2HEc00`%Y!HwO8Qʊu!R񔔔 թÇrȟ~ cra$'~IIIO|8z12W^fHi ooP^__N~bуN7Y+*--%['jjjLLLo=L522:thAA)SHIQQт w^3 fhh=tP6=y/_J۷o333 ͛#\uuu#raCLMMt&q˗/744ܾ};B(%%رcb>{۷o766600ضm\eaaf7mT__vkkkQW9rŋ#G5j X셅766NMMݷo)wrrp8NNN^zkii ye˖Koݺٖۤ w{&ΝXd3n|6`nngcc8ƿtR>OgpСw>|,Y|dddbbbƎ P*e^@[ :++… @n%Ղ[q}6p`!h)5-_|qڵ` I1v@dtᑗ'Xn'-ۂb5%1p3#Isw !h;#h.Hd|.0.>d24{#iD&۫v$`0OOO'7ĀfP7Hd{5{j!A_noL&`ۗ}jdfeemҸWvv׮]zulll>}ڤ15;'$$xyy 4(999--mѢE!!!}]Co}%۰B Fn;=W_M>}ӦM䩯/N_p]zzzEExvvv!c8[##ovԨQM6˧988˖-///Y|̙3B'N$Ι3gϟ?_nݳgTUUV\٣G*}}m۶;w,&&&33^fuiJLLLNN^~}Qw.1bzj!aĈO>}-BhĐlfjj/##SUU7\| >|l6T ;v#~7GGV ][pFFFVV־} }||,Yr@Е+WX,VRRҴiRRR4559믿8qb7nܘ9s;w B111/_1bfӦMjjj~~~֑:::&&M :|nnideeWXAj믿bccB.\8y 8%%%,,lݺuj0QQQ^^^YU27~::sL``Wh4ڼy֯_r*tR}}yMM"ׯ}yN>9K:|AAA۷o1ϯINNӔr?GLfFFyZYYgϞׯ_ٳg"NNN޵kWc`3))iΝm2*R~ [ooP^__N~bуNkkkO4i䈧ҥK•hii{V>N5cFFF>z_ݶmuQ4Bhܹ7n444p@{/R[=V/SIB3gl=vmRҥKۤ*1ڵvemm&qۧO6oЮZ2wߑt:!4dȐ x4K;(Z2M%++;ӧ[ZZM6-//O'OZ[[WWWSaaaϟol :@vvv6l}6)\zΤIrrr0ƅl6d1c׻"\]]w)u~mڴfٲecg[[[sso:99>g֭۶m#3'&&޼yS^^^0sFDD8;;M>ڵk58**Jˋo&[/j[~}@@}yf'ҥK񺺺!cc/Z*tj-8q_׮]?s׮],KNNnݺuޖ2eɓ FM[p( @SSc͛o^xqϞ=,KVVvÆ c+V._ѣ:::T=Mv䂃1ƲTO!b 99U?~|ƍ...'NFu+###Lfc3tVj4 `u_b I+5u!!^~]QQщnsL&`W<ݡ$i:S H@0 ) H$`@ RЕL4I MߊRUU&i,I-h8 H$`@ R H@!!ƽxレԆi c~lM߈co܋>9]0nF!y'*-c.~{/}9Q]BEtM*k0:M~UTAK˓䤭Da0 ]Fv]I0 풀+++i4ZNNN^^RRB [+W [ϛ"9pV6`-(!66VQ4YIk%K,\Đjnn^WWy=ࠠ۷K;VYrBڵkQm&U {Fuऔ[[[##ÇS%%%SNիƊ+\Ț322 psqqi?=6l`ee%''7zhr>b&N(x޷o_!Cܽ{WdL&SUUIRwءdeeX%Ds۟h-NdZZZ0`-R'H˗/O4Iځɓ  (>z}}W;B999K.5(psssrrz/dj5k֬򬬬-[\ܲe455^|լv=|IW!P}}}o1!ӷom۶4(߱cɓ'rrr0SN%wܙ;wnhhhqqĉJJJݻwݻw_xݻut<ظqs***=*y{s|};w/RQG21{Ӈ`Xe˖ɓ'kii1 {{2:y򤅅S^^rl6[MM=;;{KUU_~GE{LsN~0uuu .$ bǏ'3$$$1BUUUCC/GEE]OO`̝;̜bttt-ZTYYIݻ7x`ee#F|wǍuuuUWWWUU0`@jjdddrss1Ƥ7vA1UUUs~:::t:8!!Adb0!!a˖-QU޶mې!C\xeeϟc?}daan: ~sssxqzzz=OƸo߾訨޽{[~-b駟lll {ٳʖϟYСCo6ڵkKl]W^!ț„ ݻW­[9%%%ٳ$|coݺE>$Qq\===V;wٳE.H̦lÇ1 ?? 7\;abӧO#jA@XfQ#Mf$L99/^`+++ݻ1p8l6{ҥ眝srr>~Gš:uwjkk7nhaar1NNN߿'cV櫯ꫯ0ƇƸD"//񚚚*/ cff&&pݺuUUU..._~%ƸLMMr?gϞX[[_|I2d!nܸ_~SN߽{WEE$G&2~1 sN6-UTTB&T1޲eYeeܹsGE6DD?xQQQʤhggsN2۷8Ew17nܚ5kjjjȜ{d\"'',\sMMͥK|}}:D>b4Hd8))*QQQ [YYmݺ*0a+>BhӦM"WQQ5~O>Lpjj \nZZZ޽#""0֭ TUU)++7v*fSퟘt-wiYYYIDqww~555=z(v>ɝ8qZLxxwS{]to߾c2Ezy<xڈݼyS0ɓ'lvBBBmm-O>GEEٓ.[l޼yӧOR=|%;F"$6o,&ϛ7oO>㐐3f`mmmϜ9mFu6EXիW/*+W_e1?~Ţ4&͛7SOo>U`ӧcxzzzٳg...***ӦMx"'NsΝ}/ VQdtj VWWTwذam HqwΝ >|89166np&իya@WWWSSSSSSsssyy‚===2߾}J***lmmB3f^zWZZ Dx,KVVV8ߛkƌrrr?~,((\ca?]p!9;vlBBǏӽSRRƎ+U_dN}gϞW!$##dɒ'Ơ7OGG ίSPP@ScccXFF 6<--MWWR^^Y!***d:UTTH9Iao޼y͚53f̸z_~yẺk׮ <ɩLfEEEB F޼y3?~\ZZɹ~UUչsΝ+䨅 /OmhiiieesIޜi6rA{챳 yfBB¼yx<^llB111_ =qvvv.))uV߾}E_BpvvիWͱw^Y7|'N =(mzB EQSSB1[QQ!U5" &ܸqÇ)//744f#n޼_EEE555F^ti„ 222!UV=z@GG\ahhk g_zURR`0*Pjjjw̼~JJw}9rdEE/2b99q]|Nd](͊[ePIIɢE.\/ 1cvC !srr 3r܃ 2dΝY]4hРOx<4%%eРAR>}RRRB 6k׮ir ++YJJJE6UPP@WQQуN;vrԨQvZf`$yljsdggS;v,;;;))_7 ?wgϪ2n8iLkkkڅCЯ_%tDFFɑӽ+Vc}};wsPP)S<<|8w+stt siӦ C^{֭.[__W_a=z$//^[[+xXD x 144ܰaǏ|~^^˗I$L&,Di GGu֑cǪ+WRRSSKJJH4[o.UsW绺aĄt'555߿r7%%%r.mժUuaoٲ^ݲe a111sa0fWWW6x?X*66gϞ93WWגׯ_OT[n۷/SrkJ2{{{j0lP[[wUUU͞={Сdrcοk߾}}t֭IDAT 2)>>^UUNE͛W]]]PP0hРիWc79Ȟ={^~FGG_5͟??!!uuuիWvppĿ޽{y{{ۓdyyO>7֭[ׯ_'OϞ=5jX[[{۶m$/_2L FASRRnٳgTTTT())7NL;T߼ySSSѣxUVz<¯Ӽ111:!6瀟={fkk`0LA"##ɒ^~=a PU"YfQ^z={lr۷cǎ%_N]~~>>gΜ177WVVVWW;vlZZ)~UTT444ȕe#qvvVc|ΝCٹ}7bpHHH޽7Aka~Ι3z ,PUUv4۶m߿? 绹Q'l_h:%&mܸf=Ǎ5o2{lӧɤ6L^^fK}||Ԗ-[&.O? 8bРA .r劆Ʒ~Ν;GeA8`bb`0ƏOAPPQQtww%5PFFZB$NعszPP"IL>}z$ KJJhRN!xk֬PTTɓFFF666"7:ի 4hЄ bcc NHKK8qbFdddDI'&&:::1L[[[rJ̙3G'M/0`Yf͚WAƛwԩM H=[.ŬlbR{믿Μ9 2dȒ%K pppظqKeervvvkn&+W,YF}-ٳiӦ=}\4@0|!-d{Kʕ+-$"==]Qt_:O2EK/,,$W_ 知"Yb[R B \Kg69sBߖ?*j.k>3ɬ9%Jh[p} ) H$`@ R ѽƽxYAfPc/E_pJKK?sT-`06א~{QCN<Mg(,cޠ<##FH%KIIAK;m?>҅e]Xrnyjmm ?C]I AVQKW[wvDc$9` %F56ӭ G1$- I07EuN=H.!>ވݻtiR}}˗/vI/O;TVv,LtӪXVVV C__-::MmtA%KcGL̜=aI6&M?#99nnn9]d=`GmoLG>}J;9د_fgGQ#$E79}cG ]zvݰT=yyY([2驡qYw&NbFu]W1,((LݻSYY8''gڴi˖-_DLz=1[:v0UuoLܼu߿'b-yb;~=1=ejA~{wI='G:fJLc#&]vmĈ}i0\.7 ===//cڴiUUUdj^^_Ç8qcp\]]RSSoNӫ\\\ѣuAn-/z_Tt-&olsΟ )$3gjhjbG:75adk7bc-mm3NSΝ%,5'KK7|>oxévs$1a[*++WZemmmbbbffpJJJ$555kB \###:.XInnnqqտ***Z+άnā1?p-\ncGfAaJL<++SGWZoe?^<wct4~ŋgeeGp~}/_^~]CC!fHz{dd(@OO risn&y%Fb;u“)O؈ӧRRsGE׋Nx={3~PϚp`k3f͖tc#fwʔ)vvvW^cȝE4mݫtwwݲeKEEϧ$>0HŴ9aGǹZYhjȟèvǏ%cN-6=rT&*^rko3vpB876}HLȜ?~ƌ6m2551k׮ʲwqq)**244P+W,,,lMlll&M&ZQӿ<|˥['-:/q΁_̛:ݯAo6~&kp>d٪SMpt.ݠ<..͍ߺdddbbbƎ+@ I1c$\ UyBe%s$Ðp g5$`odwEVVN0 Ե(y-亯,t * ɗoc H0tdM'`kϧhsp|k$&i4Z'KFF3Li4t%NC3,< Z Od0iiifff'|~zz:v L_CB IDATxw\S7𓀀 % .p @A*jUuIUZUUW-VPPѺZQ.dH@BP"|9{ɹ&rss />h@p 0@p 0PVdDX]׵ituuFWoA'&&x}{Ɏ_ޱcGYYY&L0777774iɓ' jjj 镔T:$jt{ʕ^z:::nݺ:0`@n/>}j_x144ڵk2cǎ%''7o|ٲet}#G !ƍקoooq0ԛOLݻw޽ !ӧO7nܵk"SSSEbؼ3<<<.]dbbұcG// ޼yot֭߿?}\^^@>x}tܼӍgff~J#Ԉ(rĉSL)//y"Ԕa4HDIII!Йv222D[lttttBĄ>.++c7gnnnaayJ_[TRRcOOOt|)ݻw9r$==(>>~׮];wxLc333ww༼`OOO:u***:p@^hoڴ>V/ѣ'N(...--nܸ!!СCw-++۵kWjjAP)ʪ={411󳴴ܷoLLٳGUUYKK_~5k֭[f͚mۖX,*+VӶm۰;vXZZΘ1#''&Od33ݻwH_?ਨ(oooDR?={ ;v"+gӧkMGm^(k5& 'k|Z\W&=VPS~PG`P(Hx<^#KA|>_"B+J,?~4/D"\W꿆DIHHWdG( +B K_Z` 8Pz@c'꿆]{h]"@0@p 0kHnݪz4&]tBLݻwmT=}ΎZ:t:4|ծSPh0L]#xzѣG={t; 0bĈ{YZZ.>>޽{III/fIׯ_zeYn]۶mWZѣG~\e7hРѣGxbӦM۷oՈNKW111.]711Z@H*t LM$B޼y#?#]]]BHppm> 5`ÇO~ƍ fggggg_M>BHyy) 43fΝ;ϱcҕW^/H222Ξ=+e^2dBBB9;==… ߿|5`L>B00򋞞H$6lXzzs颭[v̙3iӦѣGwigggcc3s\aFݩS'HUjB={I9x ?z7ntܙQWWHNNر?bY"##E"IPm }ڵ}2eʰa=E֬QfS|d+/77Wnݪr?}UV\WNE3-}ЀzSNF7p#`e(B.))z|%%҆YNB_u=>ګWTN f(["jMX@p 0@pS|w}] ;iM w)/:@VLΏkٲP( 4@\.//5jcqqqo㥦~߾}>O:eaaO?v옽G?Rݻw\EEEq]*ըmX?-Yo߾Do߾~(###kQC߿6lٲŋÆQVV}tojEEE<'b۶.,]}***z/H 444,yСC666jjj;vy&ٶm[''۷W 6ihhoߞ}Ktʕ+ǎ _֭« !]vUSSڽ{7;۷ÇoѢܹs+WW5ILL4446m>Bmmm*}E}uJJJ[l'(Ƕ/!W^^jժ͛/X޶^w9y򤟟$C qrr{}{2WQQ:t'dOIIxbRR?SU}rDR+mJg 0a 6'M?Vܹlٲ{jkk+TLg۷oɊ!JKK&NSrrr?P͛qƌQQQtѸq򒓓^rJ:uGtCg'O|}}eO7o^|xb%%*?ߊ괿x<ތ3jT':Νc>VTT0^#GBdVt?@ 000={64dCCC@Э[\XL9x`6m=<| \tgٳ3f̠\\\-Zԯ_?'''''˗/d펎ZZZ Ô{zzu8Aϑ[[[[FDD/^[nNNNӧO8Ezz:m[K[[rʕ[cǎԔD-rww#6nH?{#a ĶO?D'߿߬YV,ի͛7ϯtJcǎY[[AAA5jT.]ZnuV:/+Vh׮].]*#GΘ1-_577Ӥ̙3O>:uر+W:=u3gμpႡ!]TZZbaaAG6ԱcǴ'Mt…jl߻w.o3fذaUBbcc;wZtݻҥKիwHU[n}ׯ֭["{xx>|C/>>^YY}efݕnc{||<0%%%s766 urr:rHŢ.\@Ν6^# ޼ySVVмyW^ɬTTT[n1 #E"ѬYJKK]&陚ݻ32|p///_/[M6(9rdAA7o>vY` ٽ{w6mrrryIll꯿ZTTTXXHf͚͜9ݻwIII"&baaŋ W_1 ?ݿDN'N,..H$O<ر#ݹ-[֪UÇ3 sM---/!qYSSSJ/r1CCC555>~zE8>>^M"77tqq{[֭[---߿_^^I^266޽{w||&i伢B}.\m__ߢ"&۶999zzzV***zڵk+-\":;;oذ~~LӳW^ehii:taۯ^?hР)S{X~~~a~޿_ӥd:kɒ%dPPϿv0gΜam5kժ:L"##uttf\bEU5qqqDt?x񢦦ׯibbbjj*kk%'$$^h֬Y7oޔ&9sݛܸq#*++)bcc !t~DnbÆ 1+}6!dY\\ݻG'~C!!!;w\\\,,,222dU+;*r劆X,tUk78::͚5KYYY7oaeBCC巆"J3 CG_}U/SKr\vCLMMe>]}{:qℍ 0/_$r@p=z?]tI:mmm[E"ŋmM2eԨQ2Uh޼9;={ɓ9r䈅ݻw555ٷo!"''Oܯ_J=z40]vtuuCCCPU\ij@9>|ŋ7oN>2 ֭[ϙ3GNvb']\\أ:??8;;;ha˚˖-RٳgpDqݿH$bXU̜VZ39u` !qqqsssZ+++z?~ȑ#Ν;K$UZZ4z={{a888H$Ke鬯jرdPPXhƾiVulg&55UII)99sqq a'tBAAA'Ԕ=UG-]jӦMUVq4iҐ!C={::::d6~9s mƇӣ04={nzܹ˶o>qDr^~-}Pvaa!ǣyUz;wttt3'N8a„cM:-,, Ԉ"\O׀Ǐ}/^&off֥K)55ںҫF-Z;=eooooo訪ի 555SSS [ǏvJ=z̙3ϟcZ[[ۊ[700h֬Y y_GVQQy]FFFW:88tӦM>}\xݻwFFFQQQ}ߪUտCMMظK.}---RU۪!1ϧoiiٮ]ۿ|2))IΚ2#---zOkREBBBB.\8zӧOWw.))9w !dͮ'Ntŋ'O\^^ٺukry<^U.*mê#G޾}0,,lҤIrDαFeffo͛7711@ X---ʴhBNejQ=0ߴi!d޼yַ2hР .L2eСyyy nK$B.]__0`YQQ{s 'N4hϧ1((޽{ /Zlnٳgo߾fff (M6%%%ݾ};66vڵݻnnn***}=y7*0}-_ |!33SjiiiݻwׯO?T}\ZgD"ѷ~˶mFF{~߽{ΑideeG]ֹe˖LNNv32293 IDAT0a™3gjt3 ޽{t2)))??]vvڱyOCRRRdJ{Ҿ}ڶm۳gύ7.\ڥ2d:bIyȶt{VuB&Lp…_ڛٖ4333"HRSS[lYq?s;vzŏ?(2ڵkr:]YYY\\;___MGU;B544!;w>E|||ڶm,TOOŋ<<\EE^mٲܹs߽{WZZzu0{Y,ӰaH䄅 Ô1{ cǎgϞϽ|rlllYYYii \]]wCK_Yt)= (-,,.];D'OҚBl[[[9;F/^LGKK9uꔖ ,4i\\۷oJ/+jժǏ=xwU%ɇ'wtxi˖-.\_rgpႅ{Ņ=%}j˖-666w)//˗rJ->|ejjc\SNyQJJJ'OCFFFvϟ_q^]~}qq'OUy :t蠣sΝ+|a=z{nݺu?֭5UU߯_^[[;++.:{eYYYFFFwvuu TuI!!!z[l!Tz ٳgAAAlW^Iޒ͛ ?6X 0Eϟn:===...++6DݵkW@  ۵kN'$$ 4HOOO #߻+XpB++-ZJ/ءC>}Uxezz@ `~QSSSWWO>?ϟ?ߥK---===zKU0LJJȑ#=kl_~SN|677 `/f|zX,n֬gIߩ;uT===mmm_766VQQ1115j{]O1SҗdH$֭[PUD"ٵkW6m ɓ7oޘW%^ڢE0 sNSSSmmm° ډ}n`` }Ǘ ܻw][[POGbw 驫x}TUU=Jٵo߾{ /&Y |l5j7oeÄa={B巧ˊ+z衩ٶm[Z.))YlH$ի+,U3 sΝ;D_~}JVVСC544tttfϞ^h(//[nݦMvM6ԩSf@ӧvԮ]AEFFvylt;v찵c J=vgﰩTUǚ^\\9*gHrssoݺտT%66V [[&=y駟V+VHYN1cF9O1Ç앶:"YYYY;vw߾}o߾:ձc3fTgjlٲuhjj|ʏ)3="##t"-hXJKKƍ￿|3uh޼y\H>} kӦ P_d:K__?--۸φBCCgCMD3JJJJKK8K>/ ǰa8WNXUν{>P#QpR ku{ ZX,x-ZtvvޱcGFFF˖- YP47N:.))͟?No>[ZZZZZ%KotJˮ4}i ƮY<55 M̞.--uֆ ,,,?NUwASg%ɹs礿IfeekSSSX$ 8?1c_bffV^^F ?r󭬬l&bkWlllrr vmddTVV(@psW\}kaaYTTT ܻwOMMs-[|ԩSoܸ MD^VRRJIIiժP($Κ5)Jh"5UUU 7oN dXզM-Z )6eԬ |n~&^㩩g58op 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0Y)22Фrss@S@p 0kHg=1B_C֮4~yyyծSXRFp ` 8` 8`TSbqvv6ituuD72]S_4A38<ٙ4 kkk4{CvMKNoh0+bݝa+$t!&&k*tK~;@ӄ+Mm0 Miv:tY4MFu ǓD72]Cy捭m^^;)Wv@!aYb_|qMkkk׮qXƭ=$$$))uQx'_MGOA'&&7UVFFFӧOi ю5}|s !*** dgyyyWdd%Gfmu}Ϟ=jƧFIMmܸCRJo=Hx}U:w0۷ogmmpbZNrrȑ# =<|80!!!ƍ?|_~k֬)--_g㺦#HtRr:]v544422իWyy9SQܿvڵKPj6iݺuppiڷoM׮]>nllξ\EE͛aaaVVV Ç766={vAAO\\ݻw:uX, ׯ:t͛7tW?tttKW,9~"uˏ̛ף5k6}e˖ݻ2eʔsΙ'%%u]~}ĉ&L)-//oӧOOII2d 'LEDD?~8qgx<ɓ,Y2a„;wg9jN8mbbB>TPj| 8""s֭nnn;v'LpAw8p`ذaꪪb.))100Xٳg !+Vh޼P(\l.]pʔ)SﯧgΜ3fXo߾---CB9rȸq!򋟟m`` i iӦB<<<؏ 2fΜWU[U+gRMMmܹ줟VZ^taӧO_^SSSIIK.^:~͛ 5kt}6o||||||Hˬ =I3g20{.0/^߲e9!ښ^j+OXhݼy'Gt"IMt 8p`ff/QUU}izzR׮] !rBH@@&>U`vppppppqq1k,HDe-vZ֭#"""## !C}zrʊչsg:)HTTTGQ###:_]]~ 444 !O>ر#h/pر'N\fݻw䴴...nٲ%}~m@MM˗5mgkK9?@O^$ [YY mSSSɿ)UUUr@#K눮.}мysXLIKKx~oFFH$b++L9k62D%=~zWWWP$~;5$UU1clܸ1..KEEe̘1ر}v!|>ƌ3f̠oO-}-[ݾ}[BEqԩ(/ +?={lѢř3gE"ƍ|[Q^4Kҟy<;;bĈz{{;vг )))5Ξ=~X\ckkkkkȋEEEҷoVEIJJϯaLMM?.Hh&'')cۣQTG2Y"n߾Զm["afK/߿?55ADDDڵ+ ιvZ\\\yy@ `999999tooPX0Lffsӧ}||甕IG=z/N?B&M^RRRVV-9RQQ k׮'džpe;eeemڴx999b!0 xK,/--uVAA_sarssO8޴hjJ 4{۶m=OyϬYh&&&&''3 chhPq+b~(..~ƍǏ/AQ0;СC߾(+++))9jd 9T?jjjjEEE[޿mzEZYYu)##cذatׯNjaaaggO?BGݹsg h N:D!C9WN8fggg33(֬YۧOɓ'0WWW?uTrrr6mD"M۷owpp0`ӧ+nqS-,,V^߷o~ۛwT);vpppׯ1c޼y0ٳϝ;gffFݨ@ ?G5k,7zĕG_" ,,}1cEEjM Y$ zk׮7o޽~6W#QQQ4 |>ٳ}A74lװsWv͟LNN?jt|Oq|7LSVUMk/ϝ;7s6mVՒj", 2)WSxPS <0@ÄTG# uE(6L%P($hFk*Dv \WǏD"HwMHU4א@ZBBB~~>Z B@XJ5R Bp >` 8` 8` 8@b8;;]]]@`ee%gSۺH;4M&&&x>>??a5kָBٷoߎ;^xaeejժ={B/_=z|gώ3663gرc !5k6~9s1eNFDD?~8qgx<ɓ,Y2a„;wgM:U,:͛JJJ'NDGGBG45;M!xѷo+WTƹsϟjkk;{_]:{l3gUrd.=Ξ=;>>VbJjRjHB0a>0|0O>MOOWRRڵ+!իWǏ߼yAf͖.]G 066'VR[F˗/ٙ ü|ROON 333 !iii֭۴i_PPDKobGRRRɱXLH~_ҒJחKs=F)(( =ztB0 (((55{ RUU}5},Q W8zh.]ؙ'N(--)))d:e˖K,2dH2iӦ'OBxH 禦J'_$񖏏GokˎPeJ۷a۷o;99mۖrY##I?͎+jv }wZvmFFFnnnXXؼy̙ciiI9rHlllyy={/00p͚5ߗH$EEE׮]iV^^=zE竨D:UPPy撒͛7Vڵk7nȜzw}W+'Q+ժU++oOo/--=tXJJJFFF~~~_5ē{ĉ⊅fgg߬z4z5R>}ݻe˖PhBȤI-[faagϞG'O={3,,,ڴiy沲t{ǎc̙3b͚5Ǐ:t#fΜYimccc'H߻woϞ=u:^~U胰ۛ8pƌ l߾aFFFOGG1c8;;EEE}b=ZSL3fL-YGw|ٳgΑ)ʆVۺS%eCrU[Uۺ^#A75100O u)FR|ҥ-Qp j 4 5;|D" UРj[wmF@ xCC$>>^ TBmݩZ%!!!??!P(666ri8;@Ф+5%,t` 8` 8` 8NLL\W3J:Miw<ٙp,66bmm]ҦJlFbݝa+±:T鴒vh>n 9T+5}6Li:)J iL0#y捭m^^;)Rv844/޽{+_`y _zڱcԨ1E#\WVRRRSS{nBCCCO:UPPбc2%| BȦMzA NIIx|>o9yX,ҥ˦MD"-^ ܰaCVV#!d۶mXUT߄_⨨(mmnW\e-]]]iӦ7.:s挮$kjjFGG :tաꎎ03}}},s7""ĉ={&OwAM$6-Kѕ.jEA رV,Τwӻח[E-E^XlR;BxZ7byc,/)d9&|?y~4'w, _ K.'$$>$5~ŞBݻwkjj MgϞ-..l @O44^zuX/_ ">>+""rE֬Ywĉ$CSYYYuu' JG@@@PPPXX˳#5O.^o_RzIB#'gɒ%;v 򪮮fj\]]0j ʍ7_ĻdcƿŚ=ԇaKfv3gq6l#62l̝f[1l-܎p_~%U|0U 5lT*eF ̆3&# Ju%g5,H l;0---d]2>]><)l- `u<@ 0<@ 0_ t%;}=2 (0<@ 0<05$BHkkFWW`\\\$ٞ/* }}}-SMkoo'f~h"##-Ssvv11`y^D'N` x` x` x` xe\|K$K`%najА% Y...lON x` x0KnXr}j4+VZ﫛>J~-lf ~NÒ1[[[Ahh(/UM۷ !|a~0t#)a{N^\Ѭ[R+ۜ7n]XSY]\T3ͱ}`c -@0Ym nL)B 80c<b`zFLgܧׯ̟ 春߿o>tf_3y_2ʹF`&FFFJeppD"򊎎hNf; Ҽ3R4;wrY8ԂFGG;::UV͙33\ 6n3`{m?nho{װ<2"<%n].b5]^;'cc+lGzQ؊3ޮ0.袢ڲ8WWW'' .PJ넄///Lvڛ7o/)// T*WV(ӧO&J6|wwaJiGGGjj[ojՋ0l)0G#o=mXN RxկR˫*+~k._o޿v*C)C̀R=u&;NA^^>\lsL\UUի,X0&(z>33+66655lkWWX, (f͞GD?ZhQKKKCCC[[%O뫪.J]/](b# ;wQJD,Zri P*l+)rysg I,'oK=G)=_xvWF&z9͛c˖-btMMMlK/SJΝaÆ:Jiyy^W*"hʕ/+W!~>|yj9`E>;&%o_6Be2wCOa(T.n>[鮌=k4O$:&K1&N2ͭw&VP(4 lܹsZ-!O$900L{{{Z=ZYB‚>> ·1ϟ?}ttT(oooOO;wY^7]Ӯ+8wܹx=[t :>:;j³/nݼmO7\0+3pիU~@z17%%%,,,))b``ѣGiiiaoooJi^^{e wlZnݺjcbbFFF9V6|tafccy/Gm us+Wec?sHQ"WW76UbiI}{_Y{6nH [{{zBBBr)lbMPxҥŋ:ujϞ=wyGRGEEX)T,_rER-['''GӉ⊊ J陘<~{׶52?GJ>{o(3cߊyyWm1u8gx~+V)9Q$ŷ~4fyuuutt43͙yBrƍ|tL)CA(4咏ZMܖDeS9ܲ҄Pj^a IDATx{ѣSZYYIIIښTccc%%%kk뒒^YYl2MMMMM+Vלƌ3ݻWJJ˗Adddv%w3 ==#Gt3m4oo9s̘1c|J{=.+N>}…W^IKKofff>y򤪪ݝ SSӒW^p;w̘1C\\cD*玎7n,--pÇ/\ ![> ͻpBvv7|쌃(Z}݈#-[FDqqqRRRHHFSTT IHH())0aBbbb}}g϶n݊pbbEq͚5hiiM=v옓=J8w;!777UUUuuu/]'πBW^yxxݻw/>|8GR(2^jkkD $uuucccm۶566>x 88zkkk<>f<]XXiddg[[[555;d2>f'}oM/P[[{VjooZ;|p l6B!-,,N8d2g͚fuZ;NWWW<NSSSKKtȢg͚=]ނCϯ!)**\{<={S "@D0 5~vCɔ)SsFYZZDc^nn[Qp%99y֬Y|>!DAxi!_XZ0X0An0.sCPm|Du‰|` 0ꀅA`ڵkXW|()))))IѾ+wwG=,Snm#ݺu#dbb50GGǍ7vdzG?߂^fMhhhkkkQQӧͣ_c;ӇXQpUV(7ާ^AƂ mT{{{;BX&}1ΝBBPeddƌo>ww͛77nݪTTTq &QPIIɚ5k***;bbbRT'𡅕ʾz !TTTh"MMMmmM6566"=jjj:n8Rk.}} uz)--mjjjyyyQbذa~ҥy:=/us 6m7osS!}ݑkEEEvv6AWMNN.((022?>?k*--pÇ/\qqϟv .\իt<=}tmmFkkk;v׼ ~~~A{yڿW[[kooxׯ_>|8<<@Bㅇ;::Ν; vڳg:88 U6VQT\,ٶӧOƒ?~jggwiCCC bbbo𸵝;w"$$$v5gΜlذBx<[[;v*'B rU:vZ -[v…8q"ҢIHUjY%%% ?~\YY@DQQQee%Yϗ#WDIII544] >^TVV6rH26gݟ(tzO, N>(7[QQg2/ Gf>,TИHFFF]]](TNN} BCC#--M(3~)X`SWWgLpzuzyB s?Czmmm<ٳ'NP(L&aÆ ШMNNrrʕs177/_:u*VRRBuc.ZۛaÆQ(%KDDD<}ҥK8={6n(''gϞP_`|.rܾ}ʪ$N%t^I mMMM*]MF0AxėڤIn޼ill39rdvvvt:}ƌAAA6m"xyy1f̘ŋO4EFFZZZvV Efŋp&O\vm߿gX/&oذ_~100;|ɄXEF|||i4ڂ .^ucK9iNO>}~ RSS}"ARsssG-z&N`xB0 N *_ Wv=|>Du‰|`` | @Hpkk`>϶ꀅl*f4  ' 0 ?^  `ѽ{4`@ "@Dc{iiiuuu=fhƃ27o\C`F*/pCCB),,UUU c.>>^KK߫_pAWW߫wرc;KHH>}[ѥ>}/lvUU` |xY&00Pԭ([l9s&B͛n"Ȩ888O2 r]2ÇLɓ_覆l\f BnG"wIHH |555YYY>ƙ3g8p~xxxWhhhkr kTTTz1 8GGGQ78;;닺biiWVV%$$ϟefJLLwtttrrzE?s˝={n hoor<1g޽˖-J IHH(,,$Xb߾}dsŊaaaǏbcc\ɓ'{TЇrO:v/ ̟ؐ G9r"شiN|LImm-NwYJJJpbcc͛ΝKe-//_}U||`3o0aP~WW׍71 ___ѣ~{+++ g}||ǎ;vdNıci4ĉB|>Ғ^111eee!KKKo߾N덏gپ&&&cǎlnnF}jaaAGgֵnnnL&ɓ'3,_NIII(رc^^^믿MDD͂ ~WyIIɳg:"..>vX11 =5~  cȑxqSN5008z(𽄮N"Vӓ7o0ٺ/!! >|HD}}=ްaCmmm[[۽{Bf*,,;w%Kp!...666o޼iii300xAXXX,Z۷͛7o*[nݺu+A޽#$##CRR_~innnllLJJ"ڵkÆ [WWf#""hllڱcGcccuuuQRR:t{䉺NWaҥ˗/oii999ƑA=Ņ (((1cƌp nܸ1|pNO.\`0T}555!\G~T:}'N)//'"&&FCCqmm'O_vM^^w Y,Vdddvv<>C־|z]hii={mۈԼy󚛛qNx|ʞ={:-'''YFYYy„ !!!EEE4ffff,) gΜ!( L_j9{Ɏs\_K }X#gT{(++cX;aWl]Z᯿<㵵477644ܼy:tzZYYɓ'#x<i4pݻwlo_GƆ3L ݻw?}())^zr COO!tRIII򡋸F QRR U())mڴILLhժUIIɲDYYY%$$ |~BB9o]@jܹO<{ڵk;vy;M6?(((| !doo_ZZkPXXخ]TŋB ܹs6mrppظqu𥳐زe 9qIrѶm$%%_vMVVORRr̘1۷o;1|裏oݺUSS r\n阂»wJxnnn6668ӧO~PQBVn̙x7|CR))m۶N"7tfllӧ544L G%&&1?9HNN_ llltuuuuu$%%KKKs8,.;uTŋz{{+))͛7/++ 7૯Xڰa:6۷,^XBBTR鎂nj䤦vZ|akeeXWWd2322߫]@_IIIX)Sx{{;88TVVJEEW)N !!rD4B<ɓ'8NiiwVRR,ϒgA%%% QFv?{nܸqƍS%&̸'*((tq܎woܸ}EGGYfUUUݽ{P( %auX,4EW>女6t0B޽[jkkk^z{:F%%%|PQQ1g f˗/STJJOO/--eX)Vl0bFihhVPJJJQFFFPPBĄ内M>]BBbqqq~ |?SǓu/?_wfcii)Cpp0511YnN:pRYYIƏ7nBhܸqd:A8!Ԕ>%$$N:ehhhjjzA%~g'8)999??!{̙?3""!$!!c^^^eeeg7o^}}}HHHkkknnnppʕ+;ͩᑒ1Nd :>LȻvڃfggnݺuƌx$իoܸr-ZWINN044Ғ|*}NNK}Xg.//̓'OӧOwK:""""bccv܉߿cҙ^^!4a={lԩ4N7ի8˗***4m̙555%۶m9rҥK[[[ xܹsǏoeeG'y󦤤Fuϟ?'//lee)S((( ׮]cd˿E邂EX,1cAN4iڴi}7|||455 {}}=NO>ś9lذo\AիUTTG߱@zɉbIHHQAAΝ;Gۅ;v۷ĉaDט8q@AAAUUuΜ9999o߾UWW?qΟ"''IDDD[/ IDAT:WWWWVV^f $t@xLOO733STTdٻvg-++.ȓI{{my^~M3rHII &...,###3gάYfȑCRABA}ruuo555G.t%>ZZZ\Oh4<֋]r?ӭ۷of>2c!:~鯿:蛄]v~Jׯ_?dBٳg .|)T{}X***UUUNs玶6+>󳲲L}i]ư{L&hXYY8t 6؄>,UUUmc,X kANNNI{XW&HL搹Pͱiggi2ą e茂E "@D0  `@ "@D`p )--l4xP[|V7& j3͠0F*x o޼1` ޻wL:J$ʊBw%;|hjjhѢNkx. 4Nx1^BdffQ(PhhPQ>>>xzz %fggL6m@8~|`J[[[oVe6N_~}HHPzAAӧOҤqY^xjoo344|+++׬YiM8ï֖@Do6DOOI޽{SdH͛7kii)++ϝ;!Ԧ&CCC__+Vs8Ktқ7oV^-T+WT*Aǎקh'NLLLD|KKe˖111eeeޙ /-**  qs  gcc#BB{,,,,%%eҥ޽ ZdIjj*^HRR233D)))#FJɩ222B)))^ĉgϞ]pT~7:q :<666<>bbb1zhׯ_ZZZ"veddDRp`;wnӦM7nǏKHH9qqq %%rm$%%YsssSSS<}Ʌ ڊϝ;922/ڶm[UHOO񉈈S{eӦMǏ) .q㆜~~~qժUL&S^^>66իGY7rrrTmz4tn lllIII<J_חbu˗Μ9qѕ+WlllXPPo>|`ljji}}VWW| :|0|p̂%%%&&&Qm:GuvvLz#-?wܗ/_5Æ CDkk+p8 Ree>o-" 1F%%%u UUUk׮ [hTߺu+;;` Z[[UTTmmm/_b ={vl@pp0511Ynٳgq`-Z~}C6l#0KA !3#+݀}E"##XQQgϞe "--q &}}bX,VTTԜ9sl˗/'M剋kjjYqqN_{C VZk\p KΜ93<<ť!b ̴9sp 6ܹ3--755%''#RRRcccϜ9FDD,+77O;88z Wq]ٳg oiirA\v7aٲe۷oܸq%J{{{ss3Y677777+W̟??22 g̙88qxXXXkkk]]O?4b55i?BBfdd455={ɒ%d f襡B'O׷722P(AAA8"5 r600pwwեnRTT@IIBhhhHIIǛ}+Vt6*++]]]:dhhry///y֭ׯ_ǯJKKUnZW&''hmmr4**jt:}۶mˌ3d0BѾ}띝?GEE?BhĈW^=wvii?~O@@@LL >BCC.\`iiy2gVV˗d A>ÇRԣG &`++k׊!DΝ;|>?++kʔ)ݗ6π?۰{SN|3kt5y !XvDY(Cjo@D0  `@ "@D0 kHiiiuuu=fhƃ275--mP|ni4`W3x--,pرϟҗo޼1` ޻wL:J$ʊB|{6MLL)`zLL̙3첳qÇLɓ_Nfnn.//i<?kR(L<  *g@OOOCCC욚iӦ HǏ:ׯ J/((|iZZu{{;N5kVbbb~~Ӌ/B666fffn:uÇ;Q\\777rg_ڲ Bݻ;|ITnllܼyܹs B @mjj244-..^bEyy9p8IIIK.yfB%_rJq1}}}6qDϷ\lZVV흙pҢరmݺuL&SQQQKK+::\tq EEŕ+W! )Jss3pc":6m˖-jjjꁁ5*((7ŋ11bPrr2B9qBN߿!dllcmm=vرc&''_4kkkWWWmmm;wlmmݻwBWW׍71 ___#PRRRkkO?URPT111r/RL&͛7eee "%@\|րaH˗guppxݻgnݺINN~I{{b:TTTlkB޽#kjB8T-[oݾ}ƍ.]ZbBHRRrƌ8ZYYcƌg@gۛqϲr###mmmq:~?̜99 򊊊G 0 SSSBqww hjjz왿%K0Atc`ɓ'-,,卌(JPPPAAI>>>Fƒ uuut[ X%%% !%%obbB~WXAlvHHǫtuu=t萡罼[^~V(--MVuMannnt:d>y?ӧCBB&MfggG 6!khh8qį۷e|ɿyf:m۶_~eƌxٳ\.fffMMM"::ZZZ!$-----o۷Y ~TTTIIIHH?EK.) &&@pB%%%KK#G9,_k_JMMM9>|ՐeddX>B_mVVVk׮uC؝;w|~VV֔)S/mpWljM:Uh t5y !X,5*d AX`@ "@D0  `@ " !FjK຺DִAmh]π۷3 EEŷoߊ-ɱcD Ηo޼1` ޻wL:J$ʊB w^xqȑZ55e˖3gϟ711P(1113gTTTTVV酅檪Һaaa*UUU...rrr***7ox(]@i:naacVii)B$ˣP(999P|||t?! ]444Jή6mڀTqq3`(((`2ʃ]gY___ԭ=ׯ J/((|iZZu{{;BHAAaϞ=wYYѣGK.Ujkk_zrݻwwZx...nnn,믿egg;88ћ kw~RqZZZs-,,D%&&*((x!dhh[\\bŊrpp .]zիJr劃J%رc4mĉ!>oiil29&&FUU;33ח899EEE]ĉf̘f uԩUVs8u1LEEE--hP||VXXRPPؾ}{UUÇquwޝ:u*NWQQqvv.++ƛ7o={ɓ'MՆ444P(SN3FZZήv۶mL&ĉ8ۛ7o̙FѦMv}f}}}MLLƎLlbb2a[[R y oc``IFrʶw/d]]]wfw]RRR\\RRR255eXJJJGE޺u+$$DMMm̘1;v8~xWJ}@RYJ3L7oސݣP(R}l "jzrM0[\\\lll޼yg``ؽ{1cVXajjoܸ1|pիl?++++hҤIׯ_'ȑ#OqD6]^^NDbb|EEER__.++044=z_vMBBA\x%((`466v"~ ZZZfϞm6X;;V 'Ok1cFxx8CxADDD|b7n@u4<<\YYL:u2BꫯJKK r劸8222Beee׻h"wwwYYX 6l@ӛ ())A=yKPvv6AF*---..yfuTc' IDATcccÙLݻ>}1bI||:-cB_͵DڵȈJٙ]x!`0Ν;i&7Z[[wZ%$$zܜ8vZ11cǮY솤$lmme0zzz8}ذa퓓3222eʴiͥVZs411:uatݻq[l@YXX]p6ڵK]]]MMYRRr7#444eee%$$vsĖ-[ȉ'Ozyy 6 !m۶Ǐgee +''qFٳ=zt>k?~|ĉs***"\XLGVb2򱱱W^Z999*._܏h*)((@ؐ)!*~z{{{___/_;sLEW\bAA}𢆆򁱩NVVwU|G>@!@.2^~:=`|MJJbΜ9*k׆BJ~֭lbŊF|sˎd-dxQpp0511YnY`-ǏWQQAYYYu9Ç/**"gn6ShQT//RE>?.))!EyyydNG***UVV)999??!{̙?3""gXxBիWw"Ξ=uN7ǎkoo99KHrr2~n-''اA"555zzz222<N>N+b٪Ȫ*^^^eeed޽{߿e˖I&37uu{܌{Bʕ+ϏR,>>///:-BHKKǧ:///888ʾ055GQ(wwgϞ/Y,@ @7NF>Ą>/OO۷XN쐐WYYz!CCC{yy[n~:~PZZ8#~;%%ǏիW\uBu V^^FәL'O"##{W;?++KljM:Uh 'sm8--ȑ#I3*ؽ:IWCPbݿnnn---۷owuu|EDοq { zH - "@D0  `@ "@D`p0--l4xP[|V7_{wu?=5\-RTRJ.]ZUmjkjԖkm$JVTtMȐcw7;8^Gϼ?ysǏD֌>mmFu͛7˿^ͨ'HWM0ȑ#7=zSzY7C7'&&jhhOVQQ>|8WQZZZwk>~8W"D" ;W]/^8tPvvvmm-J`E_ @8Ο??aęikk+//斓CL4IYYyذaFFFdowߙO4GN N,S({{tb.'77D"|!w^l" YjWbNNNMM@8z('N_WUUUTTzcƌ#Gv+pP(+=??ժUO>ȐtttlkkCر#++۶m&6߹s?EEE5k֬_.\d2srr<<<0tĤΝ;5`Taڊġț7oʾx!hffTTThѢr}}}}}[n%DGG{. K.yxxd#GF)''7jԨ7o"X,֔)SoHeeҍ7fff{yyk w35jG###ԩSK.-**ן5k\bvDDB(>>^[[4MVVvUUU&&&< }5BQRR1cFii)>zO:u̘1VVVfff&--=yb"tgE999IIIt9t[":k_cI~ 8g9st۷!h4ˆ#^zElpB777.+La$֒dQQQUUՕ+W{D *րA+Kfrrrz]ss֭[MMM[[[1۷o766_hιyUUNuTT4*+++W`:ɓ8qyy9F ɑaرc;.R]]-//3MMMCCC+&&FOOX755/^`DEE7l`0j(:^^^1y󦌌LEEE}a0ɓ'|חX5~05j{ ţGfoo?yeee;#$$$ :[d2)֊$3͛'Ng>>>~~~)QQQc&f Ԅ1&/>y͛7={Fg`KJJzmO%%%EEE]3.// SUU߾}{QQӧOB[nԜ0aB||EDD:,aժU+W1bWzYY٫WL:xonnN&&NxEʹs֭[vZGG8z˗i4EDDe˖uM$$$233[ZZTTTLLLt11Ç;fҤIK.}ySSBh„ bbb eﯢ711yat:]VVvɒ%>䳿kkkII2L>=<<|ɒ%DJg{- ĉcPxx4ӣGlp)ӏ;*///.]*##+!!V/_T#Vj*G999S$$$Bd2900pAAA4cbbrssϜ9~եKb~~~HHHhh(}0;;{ƍVQTT?ܿtK2n0w7z~D R6iiiuuu2Ƹ^RRիW[n}Iss3BӧO DLVRR£ KކNLUomB7{n@3fY&%%/Evܽ{3fL'ŋBBB+J??GW!L&;[KK ;!^/ G[ڇت+W._>>>ć/krrr\KKKCCRDDsLL̢EصرcΜ9{ &XٳD"g-wޭ@./PWW/,,dd/&WVmذaÆ 6mo?̼yNzi))ϟUlSN:o\|yҥG!Ƥ&..>vXKKW ƍ>>>'s ||.111jmm_8W>}:==-,,,??ۛbtRoʚ?~kk+|!:tzY655<B.]wvv&҉|W^-//8q睝MLfSSS[[jjj"aooogg"H~~~vzqccgBBB|}}3`qι2  ƦMtuu`;w2 1rvv3g? @III^^aEDD8::WXcǎ*++|jjjK~RSS1wI8",sssm۶f8/:Cvv68..Nsuu駟eJGimmmgg"sԨQ٭[xP~~>ƍ***2",5jɓ'e⣍wE ~MMM5V'O#}Bk߽{1;v,Wzjj*866BZZZFF/Eqg_<y9ӧOAAAzzz:::ĥD={pv޼y/ ",RMM .)Ǐ,!DPѿ3g:88,_\رcGFF˗ NG ˞]d :qg 0%'' 6GbҷmX埵55 ͍7,,,222:~4Jsssϟ??|tvIM44޽{onnVVV޼ysW~7mT6gΜ7wkC轾= ==x@0 ! `@ Bpt `@ B?𥾾>//cL_>n8cbebB9.ɍ=O[;sc1ݾ ?~'fddi3Au͛7:uT*UXhmm122`񁁁,>LՕBmHӫUTTΕnddZ?Ε1vpp H=U׋/:][[+ @gΟ??aęikk+//斓CL4IYYyذaFFF$+**/^3l0{vVckk+Ç >==تD"eff%H/_Dݻ-[t@1}twwwwwn2tpgVZeffƕSSSccc#*=UUU"zB\VziFFc[[BHVVvǎYYY޶m[tt4BJQQ***ڳg϶mێ;a5k/ .\`2999jjj|RbbbaΝ=0ppD_4pCC뵵]]]7oޔ}B,((hѢEn"J~]@@Wɗ.] #G9RNNnԨQ7oDX)S###KKK7nܘE-,,ܽ{7;5jGUשS.]ZTT?k,&b UUUyyymm툈P||i4͛<==MLL񲭭MNNѣGiͩTjYY}ٽ{7Ƙ+oECCÓ'OW/۷edd nœ1]'O_ܹ<#GFF7o6773 66iҤ@b8ժ,)))byԨQ!!!==tP} .$-aΜ9-'&&alٲm6CCBuXl\\ַ~kddD<,[lD;,|f<pFFŋ9+++?~zUmmmϷ&ޭuUTT$%%i4ڝ;w."hz s$??!N(//Gӧ@8 IDATh7=sLU.]rrr j %V׳Ofggoܸ*~ӝR:~^MΝ[^^qW^޽!DRهˤzIIW^mݺɓ'!LZZ!94~O0ROOÇ!;;줤WVV޸qޞ-տ۾}؇1yϲeߟ>)wzxx>|xƌJJJJJJ/ a_r痟@[{`Ϟ=o޼{葭-BHLL !D|$BIIIp DuV[UUr˗'___)))?MLL8c|,,,/\W_9q㆏Oxx8Ic_`SSٳ ?yyyFN8EөT7olZZZKQQos̙3+B555wKK xaaaAAAfb0!VUUU]]Mlի̽{JIIeff޻wŅȶf͚ ؘ[Pjj]Μ9sΝ?OшDByyyDoF={o;ӧO/++;rH[[Ϗ=ʻ\uqIII![>\^^[ԘHII/N>ei׍7_ngkk+**joo޽888.:99y˖-;9>_5..nɒ%#mmmMMM̲Ht钷wxx3N|狏zjyyyEEʼn'Ο?jhhpuumhhevvv!!!!k׮Ǐ766>{,$$ח=7q}`6>C"|;v, ]`9 ! `@ B.] OOO I^^^p.t=t 0 ! `@ B@0 ]?Xnn.vC9EEE999]]]% {k:4?Lnn.DvCǏ#`p_ M0+ cĉca7dHHIIA0{th/&}z(|1L~!avdW`_`Ȃ!p߂oD| p jkk)Ca !1' X`҄ذ{HH۷o###Ak0tttnnGjiirlbbݭx[~/RWWWSSjijjP(yyy|Y[[[RR?\vMGGgUׄ N8~'nMk߾}igVG=񱲲JIIQPP(**qF_4[0W^%^?~ՕVRRRHVPP`hh("";>>?~ 544<}4U222FFFKQQQI'O7DQQ1??!設mii]fff/L7n܊+?NMHH(**>!J}ͬYh4ڵk띜ܲ222DDD0 #%%Bz{{߿O|8..3ݝHl+8.p{nRRʕ+nzIҥK?|[2O?ݽ{w…\ֺ\2666??ƌ| 28qׯS/\$iɒ%AAAV<5111jjj!===η*Q @>7yC7ѣDdd$1sL))) ٳ*jhhؾ?l0 uֿvӦMK.tttTRRb%^5uTۙ3gBs͟?!tqOOOwwwe˖^|9BHRRޞuի:y\~='Glٲ[na\*###""2vXiiPT118++[-77777^rgع2pD[NTTcꚑ1.++ߴBzzzjr労͛ SN(@m]\;_YYcZZZZVV1xUqq5Bǻ!G8e#9 [oٲe˖-/^\f N'e7oNKK/]~捭1c/Y,x]]UTUUH"B^=z4{?0mڴuO7o… wڕQYYIL.,,|)fMMMbYAA}ۀw;Pݥn-B+qXӧOt:h.Զ{x !!>0#݉>H, 6` I$-))]]Rtm='S… 666 oÆ 55߆$!!o߾,'''qqq__߈ѣG}!2H]rerr2p>*fǻ?P(?vvvÇzjRRQ5N߷o]欅\_{_ѿ7r~'H555gώtvv&G%.hii緵qҐYf`````Ox tSS{mUUJYZZZosVA&ׂ1VWW/**bXSWWQ~Oǣ֮P/g\~1FFFġzyy9 |װުP"JMM q2_\\ܱc6iii999Ç>| 8;;777ܹ``KKKoҕ+W8SZ[[82|IVVV%%%3g$R*** ~wܹsnj,--oeeEg̘K>SVV[[[[%K8W;#|}}ݻ@\}1###FYg Yn]B?>u}RZZZjhh$%%qeصkÒ%K\\\t))|ݾt:}q(wwwP\\;,tzЅ BCCmll(߆  п2W1^־pرcى111L&ޞx^Gkjj͘1}}^vm/_644D!2?3uuu"1mAAg$F9rss300000ql-{UԩSzyy9 !ھ4ba |!hgϞ3g%%%555QQQ_uttt<Ν{q[[ۉ' ߲evԔjkkٿF$"]\\B/8͛,X۷pLMMݳg@vhĈ377s33gEREEEEDDTUU===WZE|㩩innn_Juu5޷n߆#cc~mΝ싢B-ںu'.\@^dڵkMMM8ھp//QF?ѣӦMc Yn]壣 gϞz[SNGN8wQwX277WWWwuu ׬Y3~x| WFgaa!vvڵk:::)O… GbYDD!4zhA6?DvILٹsg~~~xx8BӧO;w=z޽{J_>|0m4 qqq"3g^yɓΝtҫW[nΜ9ǏmmmCCCZUWW߽{}qU@fD ƍ**..ߖ?m gΜ9sd3ƌ^u…ÇwVoSeqqիWcV^ ,KNN/YB_YYcZZZZVV1xUqq5B<::T*ULL+.." hUM'3`ooXVPP\UXXJHH3OYYG`I/^L;`nCSFY1sss FuugnU)** !ې~KzԆv̲< JWM1J%HBiU=~!'g}<‘5О}°k ĉs-,,RRR uNϫp᣻hw1s]0?D":[5`/c A  0kN8 10u0n&'ҵzYHNL˗/yN |`b={e>uM#MJ`uCCC444^*hi|2AC, dy qT<== vmmm-**[`poQ۷n9QFӧt{A7yNw.>}͘Qr eQ ܔ]]]/w<<<444TM\b``:n8cce˖|||TTTkjj0g^vm}} 3`J 'ÏO2e4/O gc.#ƭv̜{"=1ꒀeגoEEݳk,Y3`JqkkNNNQQٳEEERRROFFFFFFDDƘ`899geeڵKDD0''ѣGo߾o!$ȋWT$&\cs枍 HRRR޳fGycvL?>ӃTVVhWM>]JJJLLlƍL&ŋĪÇ\c,))9eʔt+WZ[[CCCeddDDDƎ+--ڶm۰amv9;"/]SFVv3g1"V!TvNjYi)1TO:tK䤤ƦFg7~",:\U__a cccQUUERPP`&$))Y__*,,,_uuu=i+L`8`0,L?OBc.$?/oD{e~[vz^[6_00ͤ}把3riӦZ*//OGG3?Dڵk˗/_,¿u򵴴z[[[y7 #so,*,p#%wOge=%N^8wG֓'8gD=|pgg͙~_ ;tZ ?!Ywx9sիW+++kkk\1TTT>}x2s...$)((d>x𠾾ťyuuu,}A`AF`#NdnaL%km穓Dj=--dΊśNq> y.+-aOcXmB&s9rd…͛7?ѱB[[Gc))C‚dr׾y󦮮 ENNN___  0|`_O`A0 ! `@ B@ƜAIENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-advance-filter-ext4.png000066400000000000000000000550551414302661500305360ustar00rootroot00000000000000PNG  IHDR;<+sBITOtEXtSoftwaregnome-screenshot> IDATxw\?wf ĭ*ֺ'NbSjպbUDETnEVT bJ@!xMB%H$rss(ԦyҥK||<۵kKku  иp4 =p8lWZFTD"eexn3116u7@kuVghh~&>.䡭2***qqqUjNGSе9rHhhCz]\\|%%F@ ۷{9`UUU]]]//}2ׯwU[[{@SSSSS)S_s:uTBCCUUU)JHH-//qHZʕ+300۶m[u\\\-Z4dȐ^z_vssxbhhk׊BǎKKKkӦʕ+&M***zsss(۷offfZZEQ/^'KQQz"6ѣGs:v͛;&!ԩS{z޾}OsرI&1Q:VXѮ]; wRŋK.mܸiiimܸ166633SCCŋ"^x1/^tww1LeffT_~6l˵9s#G !'Nӣ`dz ҿBfΜ9qk׮ыm۶D,䥹9=ҥKFFF]v\dIII͛7aÆӏ:t@?NOOAΝrSSO"/a3 477oddD?d6gjjjffe˖_STjjcti)={9r$334))iݻwp8T&&&nnntw֭СCxcy0/=zĉƍRB>|ݻw6LvHޟ- }߿_*&ݫ䤩믿󕔔zꥤ@H$-WsN+++ssYfWԩS/_nbbgϞz0>pllX,444ayVr hZ@ј׀?/򿨖u7"_;9|2UVUԚ_;4bÒ|>@RwxǏwСu_zXخ(u \TT$Ϛ-xVVVlWZ 0 ,@ӧϟ?ܹeeѣGIȬcǎm޼رc&&&;w400xѣG[jw`iiiݣ':jnn^RR2x`{.[']~=66+W(jÆ k׮}ѣG?2(,,6lظq^|y;vErWd.]JJJ222jZ@"Ou RM$B޾}?#BHppNk;;;Y>tvvW(++355e dm굒ʕ+Immm&N~;w >fbXYYݻw  !TM*l fsss"ZٝkZ}2o޼!>}Z H 9h׮P(ܼyT!RԶZԌf۷m۶gϞpˆ#Mܽ{WjeB`p3N#222wӫ8G@NL?Ó'OV^}С 6p8@0|9sdffRUPPpɲ2J_~Aϯx7(200˓l+gv:y 蕽֭[WTT$%_K+\g5@fw̼pEQ u Xj>S$1wLQԯ+ Gy9???zѶmlmm{}Yotѣv={vAAEQ:t7n\n݄Balllm %'+N7n܍7wNQSSJKKڵ}Y29sBoo֡ xǷ~;piӦ9Rؓg1w Or dq֭:!+\ӧO۷ovE?_Y':?߂ d_b"` #`yM]PQQ<֚5iŐ+믦G{5U4iШs#&&up ,@ 0 ,hݻ޽s5׵k& @Ҵ;yEhٚ6 !<7i׀9Nzz==774O>mffO?v옭G?F{_\ bcc]]]ٮEնlILL?-YB077qbcc۵>V\lٲO!yTVVr8'OT_ԱcWZc7׳]Y`A>}!Ν311i¿[555]]Ç>|e``p._̬֭Ç mv̙3uVoi r8 ĴmSXbEΝ'9_,뫫>\ÇTUUvzMz;jƍMLL;w^V^أGd̘1fbJ;x𠩩&y޼y ֭[׮]\oܸq;v={  E!!!fffHƆ:v옖֔)S.\PYYYgP5aǏ9~Մz]gXϯMŊU`ݺu{;vf̘o]gŋ/(jϞ=:uϧ(tMTTT>^M2׮]kiiTZZ_XXXu 9sܼySvT͛׿frӦMG'O***2)!. kƍUTTƬۄUVɮgYYùw=I!$${"ggg33,zC￧׹r劺H$qӵk7eddΙ3GQQQ^`AMBCCe|˛7oΜ9Rj ༼;Λ7OF:tؽ{73EEELHF7/_а^rd `eeeTPm{P/baaQkךۯ]ٳg2 /^B9t,,,̴I&3޽d@***\\\.\8nܸ}{tA,^*UTg}W&L`&.\(*.]JRRUUe4k;LڵkPV[9;;0=z . ?677ghUUUY=zhŊVVV7om)SFLݻiiiLPuYDEEotP5i$CFF޽{;v8|v1ydr޼y#yP9S풒C:%?vڵΎ9yښcM2޿ߦMʕ+ w^դ"Ok011ѣ)==Ҳƫ̭Fm۶w& ׯTUUB?~\TTԳgOBȸqfϞh"mmmǏu}}}%%xƍݻ,ɍJ>С}nƌ`h/^|]RR@ HHH0`V56 =zXhsrrdOy捻ۦMde0wiӆ´mHHӶˣW۷MVV֢Eꬕ$mmmeeeaNNs H477p8eVVV՞={hjjZ*455 !׌ 陚5ΧikkKv!Pᑛ{e+++#{TQRU %3ߙ0r&M߿\F+նeiiI?r四;::vիW2֔R[ijj߾&!$$$dɒ%ƍ;sW_}gϞs9;;Bl2yK.]xqԩUUU111;v*GKK_jjj<63fLzz۷KJJ"""L"Mdkl捱M6FFF5$)I۶meT& 6… ӦM/,,433KKK<](B.]_o޼2dIii)ss 'N6l%p܅ ޻w/++А/,99Y v1[Ynn.311ܨo@ikko޼955 ~-!wEEE?O:uƍLF/>|-{޽{4>.K.gلBw}ǴmVVsw}WTTԻwﯾ#aޏRRRTTTܮ];=V JOOի/Ϟ=[YݻGO9::BE=xOCjjj.]J{iӦ%KԹTTgU;;SRRlBH`` |?}WUUEQӧO۵kdɒq?˅ ̘.3T[nsNUU/_BQԕ+WڶmÜcc;w>}0u>dee9::.ZzPVVV fm^xq.]hkk߹s >|XhQ>}>|۰aǏ zEϿv횊Jdd´rrrEPw} DK,h۶_|A_}СCt2`G^z=0`Ǐϟѣ.}KmLQnjchh١C_ޭ[7//oFF `.f|wMH4i$YwN>]WWWKKo*++;Ɍ'1S;2PX,޽{wN455 ɓo1W%^ڶmPk.ccc---°{### _FSu=777---^>:=}9%H6cTUU-YDWWWMM˗S-,,TTT{iFkǏnccӹs޽{>|8((‚'{$΢(믿fRd…cǎ4i-[R UaBQ޽{ !AAAy}ppp`e+W B--~ݿziii]/[m?EQw޽P(_kkkϝ;.?:~TUU;vԩ3N>M Hp̙={;::6,&&{C angcdffjkk;|Ν<oРA}R\,233r65X<̙cgg7pUV5]֭cnڧoe{{C[n ӧOϚ5XߣG~!sHuVNNN׮]ݻhѢ7ih]v5kVOF5tOrV\YUUaÆb ϟ7Gk111=zN ,`@ Pd [NMM222>v[OOVC 6rHkkI~~~?#+ijkRY = s E} s`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X(J111M]VSPPvZ`` X`A_C:y'@K+{xh \<@0 ,@ 0 ,@ 0 ,(ᣥD<+x< z|HuMZC 㤤p8'''+*$$$B,-- 55.m=%uD"777خHХKxfo~Q/嵆>fod^nUղOG@7Ҭ?//hp4 0nZtip8I4{!5oZ[[2sZCUop(JE$}7o޴vk>}7E-T>2q ''3gַ8;;>Kccc6VJKK|~ZZS^XX_ĘSxiV޽L:4 oyuצMt(Q#-TGcƌ֭[||/.\ժΞ=IOCeT/i666 WPRR4Uj l֭[,` Вo6}t###UUUkk믿z5>\QQ`PpѬ۷NNNNNNW^%x/]h !%%%|>~޽@ 3f̻wBBB,,,lll8ݻBȾ}\]]ttt?Nv̜vE?xxxteq8|p͛ !W^ݸqcm%w;~]HH߼ycgggggw3gX[[]{EرsκK,)++IKK3f{AAEQŋ-644MOOo=U+?,5kּy(D۶mӧ333u/^lcctƍK&&&ZnԨQEL8^Ç 200]~}EE?S5u&A+Vx{{o/W\_|gϞ_~UUUTGKppw-u6;v>>v*--6mڪUɄǏ:uJAAϯAAA?4i!ӒC/_~.]B9ҳgOssǏ5jΝC IMM#dff]x[@@@ddadd$y@ 2sϟ1BQQq2L}\Ԩ$oQQQϟ'O33u˗VVV޹s~ĉqqqFFFKKKC9 ׀<<>>ӦMSUUL(ȑ#'N$믾>>> AAA̦g̘AQUUuwwg>.H={vbbbmmUIUU3t̷o>((ҥKE9s2,,LCCCAAG_>~-[VXX͖wmiv$' !STT(jСwޥ(˗[n555%XZZҗkʙ3g՗.]lcc`(]#aR_RGQСC_|IQӧO333zIqB %7JJVQkZZZeee9sB!=,[tk:vCͪUf͚ӽ{wzR,+++E=_MM@JSWW/..&<}k׮̢u 4^ &L? `…ɷ_CRQQ?~M===ǏС]:::B\Yf͚E_9sf\\ڵkgbbrmKJJӧ <ϯ~۷m۶gϞSSS7- 7m$K܊<>2ɿ_ pɂѣG{yyqܝ;wgLMM?^UU%YCCtt4aErs-L2eJDDDdddyyyeeeRRҭ[dlKYY秤0s]&#b?+AQH$ԩϧ/R5d|򢢢[n __߯ŋE8qih߾ivTo~ɧK=K x{{ϙ3Ք4 oK$eeeϞ=۴iӤId25&Av'VTT>|o 2B@RXUU4((ںcǎؾ}{~ݺu9r$=͛7ӧO733ILL !vvvƍ޽Y\\zTTϻu& G9>}HΜ:ungBoܸadd|bo޽{m̙S?g 7o ! ~mvvvǏwrr211Zd>>> :u!CjjjONKKԩP(\j};:t0d@r̙nlv33u 8"3UΝ;;t0h CCǿ}s;wĄf</22Ç;v9sdu_Q~m;w666:tY/s>T[OI̙#v}={|KllX,f"ˍ0`a#S@ceZZڟY ?'CU;be@R}J5FF /ܹsgԩScY'ɛV }/ZCh<4OoHM|o0np ^#|vq\X uB7:q75Xuj!䢢"pS<*4{!55j %O;@+`A4` X`` X`` X`A)))"(//gaa!cSۦ#O; p8'''+!5.mnm:hE"Q.]fK.EEEKmvh1Z)輼<خ8 ktZivZ `BiWm@{ EzLӰHyuaa!3ԶToU0}۵U[cNA߹sgȑȑ#^-)|>?--qe&_Y6mjcbbe|EGGk׮=~x̙~mëRQQBUUUb Zz^xرcWZEO3FAAaƌǏ733swwwqqIJJ***(j...߿sΗ/_ZXX]o߾UV<~O>}ܹs ͛7aBJJJ&M7oޣG-[kii?~%%%&&&ѩ7nXdIEjڵ˗׿kw]]]uttUT\]]=<<>|KB͛C~9ñr%%%|ͩSD"Q=6o, B߿렠7Bol m۶I5k֥K&OL9}tllիWGwޭ[:t… &L~zv!ѧNruuKsrrZjv||tihhIHaaaoPPбc222F4|+&&FEE XlYD6mmm$gUTXoTTɓ'?{L:u偁wܡ5}tHo޼@9qD\\!򫯾z*@kPS/$o chhCO?^__ҧO[[SNBvܹdɒN:qՋOݻ7]]].>p+WTƹsnIDAT-Zbmm=w܃2KΝK/!dىKsMJJjk$X B!zzzE :4;;˗E<}433SAAgϞׯ_?~|˖-JJJ+VLLL 044D+)YU~#`WLMMEzJWW400`dggB2226lذyfz~qq=Pr;v8zhNNB~~Yjdgg B* l|||!QQQ>>>c1'UUU !ńG /TTT޼yC?(_[ZZ=zG'NTTTӓϟ?g۵k|#FT/S{1117o>uꔍ !$ qx(I I?x2#T$G(~~~h@P4tc p8Ç۬ ̛7ܜ^ȑ# UUU{Ƞ|AAAׯX,.--vdN3 FѣXz2OII'===lR^^e˖/ _vmӦM3W^$jڷo/{ٍ ÇK___QQQAAA ~''NU/ //ūא y=:lݺ544)2eʔ+WݻѣSΝ;w֬Yfff:uڲeKeee{sA1BBB͛gff~z--ǏZ[[=z56!!a2^{hix-DDDtxСf(jǎ:t2d@ pqq9sLٍ?$66hO6mXfj>r `Hesmө-~ Imi  }K'Sۦ^#itR"a\[8Mk b4;\X,Ьjtl0{qIII<UmNb4א>/EEE͡|>dzNmӑZVl/a@!X`` X`` X``|N8%%E$]x< 봆Vp8'''+²BeK[O+nD"777خ˺t_Jl8//5 `xGÑ[kkBfNkhyiphh_~){OO}Ux ȳsNW+`3Vx̘1| OO &4ACwΜ9zb孟]jڴiS.]5177ozhRs z~-XAAҵkƬ|HEEUh.>&TUU%焆>|Ϟ=߇>}k׮LMMJ L?pȑ#kܮԸcܸqӦM;{yƎ_{O>aaaR5l_^}Nj!]Ç_|Iټys>}!ϟ?p8qqq\.o9uH$ѣ͛B!]_~qƜ;;;BXUT߄_DX--~ܸqW\ʴׯ/]?pqq9y3&NH/:{$dffjhhŕ[.44_Z֦(***Jr=^E50NFEE?^__?,,͛t8q"..ȈbiiW_=zGW17a:t_Ν\ۓ'OnڴI___YYyٲeYYY̻-#Gի1bDݙEGݾ}{mۭ~ y<{lfϞ}F)y{{{{{6)Iv4B(:thvv˗/)RQQyiffBϞ= !_>~-[VXH`hh(VRX~-(##"9UQQy:/_<(? 77LEE%J>>>(1)bBѣG\\\|~@@… !Çg1=Ijjjk׎e``PӍ$#͛7lWj#9-** *++$oookkkkk돮|GU4ɑ)}!$::Z T/MϱkW#@ >|9s!7.""";;K.1Ï?^[5d!;;;,,l„ r۷.hxS\j~EEÇ |}}/^PUPPpĉ=*+FtĦiCu`Q@GPI&dI앍clܙN "#>&43a/4#GlaU讻!@W!-E7s[[[[Rigg~ `?Ν;red2YXXXiiSfgg'%%-]>KLLXuRi!sRP(F`JǏeeeEDDPJryllSHHHqq̙3gʕ2LTNe2V*111 ^UVVaÆj ŋ,yr*JG >ŔnCyc N>yCttt|M PL>y3FGGw|W00Pp Zo"̛D"aF L;# H$m0AqL&bqmm\.obgN,9J`3ǐ!7o6N"boooL8sf09` x` xsA>}z 0' 7`x{n>  0<@ ǐ!*k[_R=jLZt9q|yȐUA}ZR#U`nLto͢I97f׷$mIvST!yaV_ /n~ OCbݧqh&,< 8 ` xL& ^)JLv 00# w}>..rSB>>Ʃdqz^cc#!$::z`ɓ[[[ !B0+++>>^P8;;SN544:tht!bpvttddd[;vHMMc%𺼼N*Bz{{ G4S...IIIoZ&tuu8qRP(5 !ٹSz"Zm`MXs ꫯG}ظ{nB|0c Mξk֬={D")//N d2kk&"*􊗣yU Pf̅8Ya0%<@S?ה`0'C} /dI?<eAf'[yIYdc(n*ЄXOQvW&aݘ1$Bsuw]R<%IևY`\ ` xB>UԷ޿tdC !"y;b4?{{{Xw!`4!IYPG~26Kh)̌@KUի3f]oG16VNRHz^fѢE&7u@@ =/L.􆜺DcBkY$[er}-)EhfL0BLpl`@st̝?w}ﷲ7! }FB_ͨZ`A=2,&&Ĩi;lnf)h[PJ K${V~S#t MMMy&MTYYwޘ10糶TWw+W.߸~}`yxMX0oV|jyk/=xGz]/4ЎZ`kب0|SGE)% `J)u $HjrRNw5k9 ioowvvrK||H$ܸqcMM~Ք)S222(֑.]k\ _|e˖^xv˖-Gyg"7aQ6S.ajrҁ-Nw~a(QrǟxikOB9T>x &v)b ܄eiܹ3䪞 6̜9S.k4*;;DŽ{zz!^^^O6kZYYuww?K`ʌ6PaF }&PJUFUE?6n ,Wn9 M/||f:}y)+&YZr\dɒLJ5}'۶m?{!Ã`u:Po9nnn׮]{jZpa`fv E__s׮޸q]9W^jQ77,[wAN>?|zvx-c4oRRRHHHbbbIII{{{SSS)]]]nnn҂C:+ EwwwUUUOOOllGrrr}3N C0].,)*? p4GgAy!cu9&q ߁GS%nY|e_L{Ul\dp ʫw~! g&bXk'NX";;{vJOO*jQQQmmmvJ)DEEE*#;;_$T@WWׄQ_887_1tM'/E+ZuKvWN‚ΆI)9B(ߟ0J2&&]wƞP(,--]x1߅qp<SP2J95/zz4K!<5q mHC6B)~9aKK+e 3TLIZrӿ IU5epOc پ#`8A0`a% P0WI$a ݇% H$|Fpcj PaXvnJX\[[+M Չb a g^wZsd~nvs\{n.'$X,0N i&,0.0<@ 0<@ 04pIENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-event-filter-dialog.png000066400000000000000000000757441414302661500306400ustar00rootroot00000000000000PNG  IHDRQsBITOtEXtSoftwaregnome-screenshot> IDATxi\?;A*XP@ZQ@=*j#9wZ_jVXjShEP*@KI20Q23seh/;3aD")u@ m@"@En -(t[Pm@"@En -(t[Pm@^+H:>j(m%ĉ;mBZZZ=5T9bĈ{[.77:=oxbuΝ,=::7AWm:De2=W L]&aРACPRRx)S%%%<!TTTbŊ#GZ[[TWW#>|bΝ;]ZZڵk׋/?a„˗#Ο??n83r;vGEE]~ϟwtt411 חegg㷱NNN555^^^#FxÇ wEѣ_~%33b޽ڵ++++&&/|pB/r-ŷn_ϝ;׫ x]鶗.]l\SS! bccibb"BhCeXW^%q#<<HR;;;%%%H{DWŋӵ!??Sjjj<oҤI'''oڴ_577򪫫;|Q,,,:ONNBr211ٿ?uyxx޾4D}]Coy[ܹC~d ߹)}n (@sȷEn -(t[Pm@"@En -(t[Pm@Jqoy't;wd2AA2 ?B˳A>)ɓ'޽pĉPȉM;/AJJ*۾{N6@jii)xJ~u_{MBEEEm߾}}]/uyvÇImhhPN;W_?㻶v۷o*N8q˖-G~:AgϞҲ{.V__cƌr B(22ɉZ`` ޽{NNN,KOOǧ!tڵoJ{`Xϟ?ǫ+&jp{E6ׯ_tK.=sLDD˗E"QXX|>Bمb877W+++8q,//!ZhѺu͛r\ÇcbbB;yE\\\``/N< hM[-ֵ3ߒ}۷ocÆ ïO<{q!<==g̘qƍ興"7o7ymm3VWWw͚5=!sV";!s8PEEf˿캺:PuuԚ +))į͋[VIݱc^7!Ap89())9x BO) B!~^[[KDzeˬ?^\\&&&<d-+Rw"[m36mڵkד'Od2YMMMjjj~~>BhŊ.--/Y*BhE=7fD"T*=v(???rH^^^}}뽼z3 }jBׯ2dȪU|ʤI? Dƍ|peDDyٳ7ooLҥK###r??7nd;v444/ƍoikk+gk,C$u8=Js77&Z]]ݴ &4?DϤb/jkk{2GX;w3;{)//3lp>l@CFFF폑d***^g 9lhhؼy3WVV4i?OKK2e=qD PiiiQQQ^^˝2eʝ;w=zʕ{]|(L\o{dSk&>})SBƟ~ŋ9rD]]}ܸq'O9s!C֮]˦=m$M!.f##@Yk!HP*4E4q%_( #㏋/dDEE\OuaE-\޽{K.=pܹsh_wIPdmyG x'6!!|f`P&L~iG@^&i&i&iNOIIgX:::SNd>l޼\WWwܹx]PbF`0Bjifff{YzT*}1 xGttt흝=h ???6]RRRSSf(&S\\rq555==})Thin*..?~#9xٳg[[[[[[ب’!ClJz`&mmm\BģG<<<Ǝ;n8PJJJg: |~mmP( jT*D PYYYYYx…k׮-**BDׯs83fTWW}v޽ (&;rHmmm77?!tE[[[ qXXlll|ظq-[O>퓪UTMG޻w钍7nܸQa M@ -("@8(LH$<ܼ WTT 6ӥ m@"tۦj!==k믿>|_חfkkkO6M,cǎUSSsuu-.. ?|yfsss]]ݹsBۛb92!!>>okmm}oߒKpBMOTՊl>!D:o޼\55Le.\bo~eP@@=z~ooATWW_ꥏرCWW00FbB(..N*?~\KKKYYyʔ)x|XX\fMff&BH(^v̙3l6d={秤;vLMMM__Ϟ=t֭y[* wڵkQQQ&&&BKKAobb_!Bg϶QQQ %%%C !sʭzSh2룣}}} d2YdVq8PJJQ|>V,kkk#Ba/&AOOOoL&`(++{{{3*TCD.\vڢ"H$~z}}=Ù1cFxx8B/!\V[[g6{k׮߽{7??ROOo۶mR\xECCcܸqqqq;/^0aٳ]]]4Dz'|ݹsͭ@s玅СC#d2٫W; "@8(emҠ"(:q @i鶐D4*$hɡH$ 묊 hrn<$$߿kȯR=Jvھ}%%%΂nKI }]sm[yaaMhhk׾۟ʪ!$J7lؠell|IJBB={ƍ7}vJmll444LMM;[jCCg}KVZ% q)))k׮;VSS>qY'ٹsiƌ~Z9 --N"OHH~~~$r܊fI@UUuxa@@@NNΣG B~~~%%%QQQԓ9mڴ,Zhݺur\.WUU!tuGG7oDGG|ѣvJ244JNNNHH8u^]R/]kXc{{{33 .l\KZZڊ++++:zQQfzzzVVV^^DB"9$%%}-99|>ɼtH$"^|yذaRH޼yʊ @xxyccӧOdII ^A?~а!ݶm۲eȷnnnۏ>(&& !C444ml'O Sp8wՑ  F Xbvɒ%Vu2LrD}}V@wJJJi;pSmmmCCCDNI555M"5kV)?M"k@'mJLL/ OzThҥKBaHHHnnKxxM1ӦM#ZZZgd tttL&~mddT^^^WWh1}veeڵk}}}b1D.dy?޼y3gDsAU\\܋/' TYY9o޼|>Ϟ=A :URppӧOKJJi455+((055ů˫k.Zt~Dn``p޽ϟ/_)WUD"JƍSRRNبO***~_zۍ?ӪU-֖߿ʕh H-b%'' B__ߺ:???}}}mm>Z-ѣf͚:u+* /_blvvv[r5_/\yfuSMLLFeiiG999۷O@4$rHHHذaCvxw@9(mD>sf'wFFF>rCR4t[jw^_ /ӳg @oQFn iJL H@m*Hϻ@&> ?$t[HT K 󳳳 FN:bYYYdVw !6??dAH$Ǐ{i&XА{mZXXݻs,Zh.44g㺸,^X"͜9uo?~tm߿/444$$$0̌ ÇQWWuֶ~_ JMMo?z T+33PϷE4q7֭[r%ѣ^^^-w @xW@8idICeeeY[[uuu8!]__[VVFMFw5]qD6;M|ڵϞ=w4f%4ׯ{zz*))>}:225IT&,n4qMMM$GxeaaqٖS-@!MQ$M>J/_hkı&>~ӧO]?D&z;b(m!M([n7/^ܳ;ߢL(R$[2sI4qQB8Ҩ4@4q9%''lM8 Q҄Ç{dS J9Tݶ111 >>dEn[PP  B$77""" 3pB||@ PUUݾ};^#@0aooo#秪ZRRa1W\s/..vpp033+))9 pdmSK,---}˗(...00ŋ'Olll\f +//^`Auuم l6r......<˗[liE[n޼yx]UUUee'N!ȕ+W~",""i,ӋА@FnhVVX,VSSspp@IǏkii)++O2E]] p8k֬BڵkgΜaL&3,,ٳg|>?%%رcjjj{鰘ݻwlذ<嗪{mә3g:;;&&&>>>jjjL&sǎ /_l븸8СCTUUutt<#16mY,VXXݻwrbeeS6''g;wg :EiQQQ&&&Q.]Kݝƌ 55Ajjj]ZZ:dYvu%ƍGmjjjnn^UUU^^r<K.e2\Ō]h9s,ĭ[Ǐ?bĈ#G###Lƍ8t@&.aÆ֖#iPncjj#ޛ#? IDATl2ww(UU՗/_]^r Gyxx;vΜ9%%%t0ܶ_|[l~mD"￯˛p{{{EVUUQ\\O[,\$بJcǎR4::Z$1 CCCeeer@YY9::~̙=GEoi򋍍-//766rf׮]\.wo޼>|8^,[]]=%%Z[[kkk'g[nq~ɓ'5 9r[PPL`9sftF 0HgUUU_-@xPdgg:Z ܹsҥ}](m&|5gDDD@1(m޽{=ٳgȦ2.&ߒ@̹-(2Fn~Xx$377qm@m)&vرc555?7n rrr4p`Ĉ.\h<8i$KKիW>2Z<ʕ+cƌ'N~WWסC;˗111ZZZdvڵk444FuEy~# --VX^YYy!??X[[O4MKK׿)U|>_MM.ϳ/\_VVVN8q޼yYYYYYY7o޼uwޝ>}z]%!))k]LKD"Æ JMGٴ4͛VVVA>F--Oɒ?F ZxFF~w1cƐ?5119 `Ŋ%KZ sj2 Zf A8/ů<_[6***˗o߾^|||[- INN]%%%EEEIII4RZR+MҒ\niig3/^\XXÇk׮Zڻ.;tPyִ`]]f#N8aooV9*]J755=+((055EijjDFF:::ӧSXG2!D)!!!<<Ν;666 bhqnK4qW޾}111~§o|z[ujzzzWVV;wSD"mm#F ={ԩ Zt[j;;;_pa,k֭SN?rqq~ʕ+;,S"""&M|rOONxb;;ӧ{CC y707ܶO6m„ %%%G$Z|ܬ98q͛&MW 󳳳 n: Jkaab\]]?޹c h -mJOOOOIIrttZmՃos%+yfLLLfffDDܹs򸸸/^( >Zt[FbB(..N*?~\KKKYYyʔ)8x!p455׬Y ׮];s f2aaaEEEϞ=)))ǎSSS߳gO<!uիW](zZ݂!Bx̙3[xΝ;UTTv=xุ?}*M UUU"':U|BěF{leTII gdnnNN.ߒ4q.;j(PEEX,&;{oVm^r붂MLLx<ތ3B2Ǚ*MB:((hҤIGBmd2uttrssn!**olld2/]$ȅ/_6l$ۛ7oZYY!B</ollz)>%dJJJ6%%O} 6,:: #F={f׭[rJѣGXfٳ-*$$ ;&Ao޼166裏f̘AQF]xyرRPNNNnKJ7n+ϛ9y} !>z y[n?~Ĉejk!%K<{/ ۳g9>;;۷ cĈJWuGOoV7sqqiVEˇH8qĉ<oŇr A=;v9sZn!~ܹիWoذӧ8۷oɒ%MGApܖ!!ZR.M<8pѣG2gTˌ Ѝ7|>BHOOOUUUYYY*FGGD"ahhL>Y^^dɒǏwÇoڴi׮]O}?~|BBӧ ֮][YYz䉳#w܉9r[PPjnS&-_|̙k׮e0.]JKKoBׯ߶m۪UX,É3**j̘1ӦM! Q& iS@1YtHW2ݖZݻr [Hlv ^BoQFn iJLE&ޏrܖ mAyjkk'OdݶihhGs[HPe-(J3 Zr.pLW2+** -KR7o>xdz Mi8==P~~>QNNBoY ,ϟ_]]. M+ MiM3 FN4-! Ѣ"o߾]YYvZ___XL˳:&7o̙3ar-[K}8M( O>psbӧOB/^3gNpppEEE||ѣG^ 522+++oܸZr."""ZMi?իWYYYw܉>}ݻӧO_גiii999q[dniiÇ/_, ě4q,>>~СA?YfMa>>>G8|p.7ov ww!M`͎Bĉ[yy9~1tP}ɓ'9/-//766k,|/FzzapjT*MMM5kB0..*999!!l$|ߝ;w\.y 3Zt[FbB(..N*?~\KKKYYyʔ)x|XX\fMff&BH(^v̙3l6d={秤;vLMMM__Ϟ=' n￿z /_z5q{ŝ;wZ[[޽{qqqSNڵkʔ)JJJ&MB}׋-4hѣ7mRQQ)--A5f999SNmv|rǏ+++pB+++1jԨ 6sS52d@?_q\oޡż-N?uT``mhhW18Mi8+;iYYYm]]N ߷o߂ |}}9}֭?b^Nggo߾z*99ĉo჋ NLL/ mئLg 09J!Zt[iL:tɓ]r+**j< SYY9o޼ׯ{zz*))>}|jI ݶi%Biw!M|֬YǏ>}Ç?~'m%T*7nReew}ru&&hm!M iUUUjjj3f6=zt֬YSN]bw[8rȺuX,֮]:<, x&8&ddd4m3 &e-0t[j4q@3 em!M@i鶐&4*$@xBBB[.ONN! 5qĖ7iÆ ][Jv@JJJ"o0@.ݶ?744|gxw.]***ZjP(JIIs100Қa.\^lYuuuݶ_t)##bfff.\`87ťq͚5<{-ׯ}666vΝ,]ׯ^!RUUuMCCCr3gkhhTWWX[[x/_oٲ!tM6]p g"9$%%} ?>k|>ɼtH$"^|yذaRH|޼yʊ @xxyccӧOnII ^:Ap8wՑ  yqð`GGGEqmCCC|Bx/***--E4۠mۆ~Arall9ɓ'AY\>cƌuֵ_0YzzL&JRÇ>|x}UUD"p IDATIJJR 'iK. !!!...8G)DcǎdD2hРr??xT\\`018O0 Ldd$ڸq#㕕2d{a@+趨+))[gff6޽{_~}}1}}} M]+,,lv)A|>'|4 .HMMussKJJ7ebb Bh1oOSSSյ4QEEmH$p8~xyamcbbd2YfffTTʕ+5((H,D`wwwSSSccWQVV9s&nuuuUUUA#V\ye|o_*tCnOąB!~"Bvvv+WfX]\㝝߼y3|pnamb…o]hQXXܹs 2d˗򨨨1cL6MSSǧ\`9sfEEE)))\.Z[[O>?B3g>>jjjL&sǎ /_獏WSS UQQ=zmL3_u &xxxܾ}!-- wiӦ999 }ZRRbddZĄiŅڝJLMM LHNNvwwwssKKKKLLtuuŭyٲeVVVϟ?/..4#7S_ Ds&yyy>"">777<Y|9~,.Bё`̘1OWUUٳ'Ovssk몯-[cX~Yh &0En i$H(m[2s94qQB8Ҩ4%nB"0f_pɯ`GL6ٳ}]ԃi,)<((h齽Sh23 S͍H1Ds[:GFF:99? ܰagԩSNNNglN$U"##G=tPOOOXuV]]]6w]qY[[[---{{{l)Zt[xɓKKK;L rʝ;w|~qqYII7l BgΜ|H$ ?>o ݖ>i3gtvvg-[T7ڽ{ʆ yB'Oܽ{q㔔<==g̘q ``EO8YIC!cccBMMȣgdgg [2oooooh__߲22M\xl2MȨr>ĵ|ix?334qqߩ4qy !uuZmEEnn&s8}O4Es[cǏ믿\.BY fRMvLVSS0Т-M6mZDDWt3)|۶m[jp8Rh&0En i$H(m[2s94qQB8Ҩ4i]TRJttHOIIgX:::SNŷ4:uTeeeuԩ'$$p8;wN6m̘1ׯoq,Zt[\?DeeeMB/^3gNpppEEE||ѣG^rPQQfzzzVVV^^^Ѣ$M\EE%''XYYyԩͺ_h"A=zӦM111,G1̠ ŋe&~ԩ@[[P//cpxMMMąBaHHHnnKxxxˆ+Hvؑ,H ԩ4[n߿,kY9񲲲ۺ:rįTTT--G+Wx葇رc̙#XXX*MMMׇV @b&iR4::Z$1 CCCeeer~\T*}eFFF;˱\ h--McccG7N>mddd``vv#LLLFeiiG999۷O#hA6l:Hx΢L4q@E2======{{/-%>Gs[HPe-(2!I$ gnnޅ+**zT*M\$ 482;kN$#(h"bVۊVZ/tꯞUvZkUTx[x !|… EEE#Gtrr*..޿eJKKͼEDQ;v^: dZZZR_XZQQqe+++5-}rmQ9βe˨\++ ^9B6Wu&cǎŋ4hժU]KWC755u*Mٳg= ڼy[PP0p'''֦q\nnnN}Ύzahh.-+$.$ T9BL'm ""111oFmm2M\ŕiYϕM2Jf$M<==֖KM'O^>yofĉo֤577+*#t5;/**755}1!"4JWt߼y 7,Yٽl8sLo/!NT[ο|+WΛ79==]ٳgݻ7,,z e˖1clٲ%<P(++ZZZ4 kt4q ϟׯۋD"$r+WB!m۶[xcǎ㏿-[BCCEMׯ_vZVVրƱc^k.\pժU.--U(ׯ汶>qX,D;vYtNT۾&. ;E"YG1c k^xQܹs ((\R__"""4;v̙3 ϟԴ`WWWTj3f2 wwe˖irk5B:K'mrq㪪>|(mVQQq *ѣGV}T*ƆCCCU6nkk[\\f .KmzXq&Xq8s?\$v!B:B'msQF=z4;;/88"FYffddQYsTF5,٤So-((/1V!5t4q _رc􂂂nܸ555^^^<O.oݺUTBk׮7x{f'O:ߩe%\.f2ʇ"ڤն/@ppX,ʫmllܨOw޽yQFM8U%KVX!vޝHv ٔ5''xP8zٳgGDDtvLÇ/[@ .h~-#P_Aji}yѦҋL;f9BSt,B:b8BhSm1M!DktIkⲺPJZj[oÇ?tPv!#hslé!f.i  m_UN# A4qHuĉ]]]d<ʕ+=B]ՖiJԭt.\k֬~w1 @'-ۣ-700XlYqqqIIIDPD{xxxxxxyyQiŝJ_|yllYxx884qPHD"ex{4?hzt,YDDDDDDKK˿7x\&Qi⪏K*M4K_bEmm'|2wUxeew}H wZ\mu:J4q%6mff#mu:Qmi&*..WlB B &lZ Bum-#h6Ֆ^0!ԊN%C^Gc[LGm-#h6!Dbll҅+++---KKKmllzWV>|p٦J #Geq[?>jfNJJR$ :, G+Ƕ}!M>Z`:((HuVV)SXYYQF)U޹s/puu|q왫K &&9CBB,,,ݻת8WWWe,Bt4qP(֭[zzzT" b…yyy-{{{oܸ1;;رc/666AAA0r;w.]:j*[[ے_~Rو\._hѱcǒݻBt4Ǐ_z7$$2ڵkTupp>}!e2111L&3888$$ŋp>}zb844VVV_;BնD"d. d垞...bm۶aÆQm;wjs͞VVV/V$''_reݺu8B+gB8<L۳gۂ >>tضj[XX8l0ڮ]555T+++_lV+[[ʪ*eTZݻwKAAXXXx<5,Y$>>>88899Y 4ն F0Ts`>>>ƍ+++߿-\ԩS:!CٳQQQ#G2dرco>ejqƙ|̞={޽aaai=Pa8B;M A΢M4V={jbdd7|ӃkAT[zBMt,B:b8BhSm1M!DktIkH$ 㡕 ;:+66vܹiA"֊jۛƌ{'&&v- r9B!#z6VTmQkiN$iB#""RUb1IEEEӤÝj=:>> Pߚ{zzUy{lѣ͛7S-,,TWWݻWN=Ν;$"999!!w|YL'+&mddtҥlSSI&=x@a;۲V655)HUZΝ;s挵Il2bĈ谰0"&2cƌ˗/ׯ d) đn@H Lx6-t!:65믿*PڼysTTTmg֞GCI@!m굑xt!= mFb=[l8N۶ ^PP@DYW3tmqS ٍV>tj{B}m [o%J{/!.WۣGfffΚ5)BimmU)#K W_}r;v=܎oע *y) t7氘ٕR$xop{V3[\:iͺWZIW"5SԥUŎw1֞}39 ^ߓۍrK!{ͤ^6l31rAFI}F捴>j&;Ί.I^|RjA3ᜊ6EN$*Z8,^.U,ڗ!Y4;-++ܺu+:},7X1ccw֙J*N;p{wۮPXpwZ`35qd~;-a[MnrbҞ?d)uN|1= ߜ :`1ؽ}KSTw?@,&cup nft?@/jP~uS[3u05(Х8履D޶+#=x=<ČjͪQJJʺu***4?$xZsdgtBAwKe jEbiCؽF`n<|ܪLAN.5[lM8#__o5M=7t#Hlav s0,k_ld؛@Y}˅'M2B }wi%b=߀zZX 1??lhQnka19zR9:(^)~N|{>g5dW6^XGuaqCsjdp &+_2.=FjzLpXLjV˗Q`kSuo/'| #&k| ;Fرc,Yr% l9z%xI><]]1+#E_&Čr7ˌ/n/gWgOzfkWn$^ҋ:/k?Fó6(kZKzX,Sl$qJA]̑su7WU.i9JN >~4ʯByNǁV%ueRc!-4&Zލi?t衇oxPAu4M\$M\}B}mz4A*Z~o!hSeȨe]@Hw#b8BhSm1M!DktI4q}ѩڶ B@ji!Z͸*Li<}o|1o1UТ~?w5[19|mxoǩn4{Z3UIB4b6}MyNqT~H-58 ٴMo"&4P^ɩVZ$~|>k%bg>9S0!Hk3M鏄f9~?4,sKZJp[/B:f0MWRP75 I͂ښ&YI4zE񤲱S@UE4^Moo?@Fi=[9u9)uz~Ƕi⽚&~)[6FYe pnp;/LGHs&lZ Bum-$4*BFE/4J]E*W[hQԋLFdz"Bgh`]MBma+TDݕ6HC]Hg0֭b!1znB8Wy&WjpXgb|[ݾ}1~+[Md1gb|m.khsl*M&??ےwج $wVX؂-bŊK- @v bٕ;l\ Bm_=նiϿS½,6d JN`kYgecf1 < H aᗯ3d7|}9Azw33zQ\:5kR]J6CwYۮЁ|N!~&یQ%O(i{8Ꮽxl&{S"&.Yâf?'2+Gq2J$;>ϙ4|SP{aD7{+KdEj[VVxѣGƂʁm4$s/_famY z̸01?5HwK `w5g%RiR>|ckDxIEfy38,~]"^6 R)S1bIYDu ^zyI4bю,Ϫm uVF Dz8,7=IbM2e@R9qXns4n~XAD~uj_sٱm%-Du*i:|:k#NXJTG2V\g1ևq4,LNT>OҢ_$'7zۛ<54ϩll9UMcikol"HsH12b3?8Hh[Zu CvJ|kz$77$RBC4Щ4qkn,g2&]2m-$Ie_-I~zqu_" ,>SҢS,ŵ>F6& Kҏ9Wy*lѾ6Nr82{(yk酵Y >$ުJPneoMW_$R$ ^=5if# й4? X-Q$#IRN7k sLxX 5Ur-qF$F~|=&I3^"dn?`daQ,5TL}㰞Kk2͌ X&fVK)0ӊ7 k<Os`EoQOw_mQ\M:&Nf2}mM]H,l8$Sg';b2֞Q*f ]m\)WOҬWZ3H2N8fܚqL\Ye @$ n>u?ĎwH"X\*nnqUsb/eHPn5IIk_h8nKԞWlsB$ 6OTvx%BitlB"ήL&cYYYj/:BH͛<-O*y{{|ӧOhimv8Bzڒ$y33{lڡP(MW_=y$##{_!HС;w(9?4iߵkר+W>}Y^{]v:ۿСC9Nnn&9r~;ydXXihh?LdiiԩSƍwMjSN 80... kii>͍rrr 6a̙...~D"Q.lBzv߾}!!!>>>S 7n܈(//'&&.]~;}ƍT***y&N'T~*s$IsfffΜ9]~=-----~ I~EEE6l`X &MrwwLOOϱ" zږ1c۷-O믿ZYYQ N>ʕ+666k׮ y̜9xĈt"L&ozjooݻwϛ7$O?477wѓ&M*++sqqQR$y<^bbbnn!CW^-x<ӧsss}}}MC]-to+fԨQK,3gN~iUU;l/p  %HBL&̙3/nB.葓pȑ7|GZ":jEioGٳfT7hWhaP+Z:MNNnsz\\\twBH^4q5}c[u\mhnffD@@щ2&I@ j322 4ɴ~7ܽ{)𡧧'-BDffflX\]]333>B |WWB4! Bڀ!-BiV[! XmBH"6`E!mjBڀ!r_H`,[IENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-event-filter.png000066400000000000000000010727341414302661500274000ustar00rootroot00000000000000PNG  IHDR"gAMA a cHRMz&u0`:pQ<bKGDtIME; SIDATxw|^uɶ 0`l0@Bړy!Ih!@(!1\-˖-[^;s?F֫$!\ݻ;;}Ξ=F#@ľτ4p !H~8H){;;K*H$D"|GV !B߈(U<m =j68"ϖRW:=67"ZigˤD"H$D79pF]ݻwoeeeuuU*t:"5k:::li8 وb>}͚ + O$dR$sLszL&7]C_~ غukCC'%D"H$3\ܲݻw0`mۋ/ӦMKR1˲\=e᧟~{|iF"'|2//W^>|S%N۶97M31*";wv޽o>x=\y. B|O:$]3뺪~l^xg}ݛ?bĈxo>,q'O.d~@ F/^\rɒ%KǏ?}[ouС]ts\TU2dw}EQXX?vvvs9icƌn߾K_R 8Vf?]n3SX>@ƓPJSԘ1csq\q+SOv-"p>"#"b֓d^^ލ7X[[{kvD:"]UFL&5MKR'|\C4ql68%D"H$@{.~6w)Seʕׯ3fLaaQ[3Ar3g?oO('ODN|>_.u=Hx<yy0(\4Ƙdq4)>Ź{'; D"H$3Cb_0#-p8QOps<۵PJ@_-K4*"n-E_ Oy,J UJQ4M***3>R%D"H$@H{{ÿ h۶82]"H$DGf:>|]$D"H$πu$D"H$@uD"H$D/|R"H$D" wD"H$ j $D"H$guy%D"H$/$Q eC2HSQlz0oϣɨo $N8먹="͏J.Sa|W"H$Dr]lj&c,J9 f}&pHfY;vX)|ԟN<*~蟱ǥXD"H$H;Eikk[bu]GD˲4Mm{͚5>Ou4)t:X9,0 ι(ay\XҖ͛7wvvBRԮ]([UUc/onnrG9ck׮UV566׭['ia[ݻwwww ;rƍ~DNG)r;vزePWWyD"q؇ u%D"H$# wι-Zk=PhVUU_;u}Νm;L8p@} ͛to[n`޽K/?VZuWرCvڹsvttر[omjjjmm7޽olooqMM/˧z ͛7nV{w_~9,]_wy'nڴi2̼yy_d.+t("Nr⳸a'D"H$pd0R)gqFggM͛f͚\.wWVVVyR)UUrܞ={vܜH$.•+Wn߾?aEEE8>D%?i\sMUUլY~ӟ.\~ 7:t7 K.ٽ{w:m۶qTRJ)UU 8{VŮN0ꫯ>tvi󟛛5M[~=|ڴio?V;<3O9?Ϯ뚦LUK.|c#EdI麮,l}hX7D"H$QBeR3455}{[dmvW["DUՋ//߶mې!CL2+))!^.䒙3gs9'tR"'#b{QF͚5 !iTя~g{u]8q{0ngu֬Y2LE҇~SNmjjz̙Fzyyy@II%\2j(Ƙ{[^^.v>ath{D"H$r BH:ws2IJիWoٲs;s|Ϟ====Lf֬Y_W8tPKKiCME{?+"@sszFw;ɓ'뛛 ??Æ +VF bOOOUUUAAAEEEssER z5k466[NMMȑ#{キ~$J:t( -_1_K_82E"H$DrQ q**--z1c,Yꪞ@ PVV&Hf͚uL&կ~u۶m CmTĥ;r\^^[Ph͚5cǎMR c4Mعs'TVVΘ1c…#F /0=555?C믿qsYlY~~~gger+**z6nxf: ri?~ʕ]]]?۟]v? BK, 7n.?nH$D"||~;H{W"H$D"HCD"H$ 4%D"H$/*g T߄!CD PϽ'Gqo+/:Qpn%Do w Dt]"' HUU?~boW#gˀЦOJӴvHo7}ĩY_ u4C?j 5v,ϡ?cB$XgD"H$ǞABbXOOOj'O4͂u䧋#E =J}Z!h4*VO]t]5Htuu}4M4-|R| ?梈{R"x'@>syO;I!|>q{QGr;::2?eK|>n!A :/Jiccc&XYNu$Dr9pW'J~ڥRJPU`y777sν^o(TVL&ҒO.撒o.koo8pgK C eill,+Ƚwき\M@A ! ߥP!S5;ofRD< "Y}XqEa1gY}[nQJY}⊪''?}@cq|oEvD@t:Q=Sl ~,"O&IEю]ׇ ff(N*]R_/#I}|۷oرRA;B"H$pDXSimLDKbf]]iPNxSJ[[[<' i8tX}}}qq}{~L uuu1(NE8TSSS:6lا[NCGUjM]M$H;ԂyQ=Մ#V8 ˞ >?#JhMs>j;dgz=^/v-"R9Jh& }|V²?Qc}&p].E2<d\.'(J0dٗ)' /EI}%ݞ[bH "c D"Kpw#<}kj_pF !@ƘiGOsX2n/ >hT K/ض5ٚeYj͓b)9_Qb)ThTjޔJUK@M TR-'"r Qv޽nݺvidr…gr+V3gΐ!Cݻv9s 4HT… 'O\\\`#F̝;gC 9a---ov*:3_~T*eg!⠖/_>w\˲DcXsۿҥKM6u\rΜ9UQq0***ÛNj.s]WuFoW\!lqEQTUL)]~}{{{aaԩS5M[ק?|[hѢaÆ <8ɨ_z饞ɓ'Ϙ1#^[[+2|N:)N۶mf.ۿ믿~W?>Lz^u_|V"H$#H߳0:97 4߿_40p$O4_z\.gROLp1?ŋ7m$ )@}"XOn4ͮ_|Ѳ4QIgr#nrCsOy *~37z~Yaߘ7# =))>՗&'&*xFތT657ln܉F0+enjjjx7x466>ޞ6… -[͛7_wuO=رc[oe++WCV\f͚ӧa4hPYY#<">u]'"! .\teYw_"~7mڴx4͕+W'aLL?㌱ݻwMMM={lڴVDTTTPwyRYYnݺfUU3ŋGgϞwy.e_)}~)?䓖e1Lܷo<̇zhͶm[jժ]v?~޼y>`8޶mۣ>**/qC=c:}/nJ$Drg"^xl~#)>ٱcNj/`^ziڵ0Ǝ8LRod?t{ollpDn_tEEK/x_~yÆ +Wo-Zi~LYJQ4!r$2O.ԢSpoRBs=xrr|>D"_~Y ˍ9xkkݻ1l.))Y|y]]]wwwkkwٳg]V-[ѡI' ̙3pu.,͊|^:͎12 ҳ>O>1,Z$:4 mݺ16iҤd2)诿zggs==c7lnnnoo?mۯZmms=N i& uEu}c?\i}sz,Xp#c%H٩z 8'N<餓M6\zwygWW˳m;Jk֬iooLӔD"# 裏.Ydʔ)W_}uQQQ6=f(dR xT903̭511͙3.u])aNfDPeqq]?۾}O~͛7 <7|D?\MU xnH k3}Opd뒃Kv 顯b3 fdl4dۢE:i%3ɹes}s~zeOPJ}k@)>NBH<H${b 7ouyjJއ뺧rc=vI'_+z*'~ꪫ߮z,knn/F'!&O׿uifNucXKKː!CN<]vٳϯmllٱXlذa3g Aɤi===ogM(l7|uuu7 ]r@q,kÆ eٶH$dӄ ƍFٶmԩSowY"H$~T1OٳgŊ .=qT*]ϾS>lwf2)SL6+/g WS*]wQ?#@D0xN8a'v+??N:i޽W]u4Ls9Æ c]z饩TJ~// !$Nwqw}7!DD^uU Yx#sW%۞|5z Txκu\ʠA >MGLVu]:ѾcR$ Ϡ11־t'0)2iKg*U{WU}}/_k׮-[9_3r\*d2k׮5 㢋.:󛛛W^=rȎիW '?۷ocǎT*D mmmz8^zi<?tP,B&NiӦs=7 btwwqE]DC/{XŊ/#FlܸsÆ {04l*JRF9r3Ν;wkuY˾͛7K_/*H$rEx5xl6[TTt 'L6 aRO̱\.N=?"RݝdGapBH6be|8>sǏaN3 =Aadl:D"~_bdYXAAA0쓮0.ǗHT|Ch֞=o׿m{D{ku[lwѶ*Ѷ1oʹx.aM{-hP%ђssh+veg[޾&Zu]AdiO ȑ#[[[;ƍiooo7n\}}@`cƌ2eٳ^oUUU6ꪫ~kjjN:3fDQxv9hР.LӴl6;cƌ|JQƏ?s?^]ݲeKqq_'Njժ:뤓Nڷo"Wpظ7W;(JWW D"QF@0,///,,bw\YYYAAA P%L6-͖^TT c ۶C駟.nbP/x(6<~Ve}59̞={ƌ D"SLqO<Ńp8f̙s9啔TWWC;0|+?DU]TTt@_`D"H?:zss3GxtD WWWk&G]EQ嚦E!C|ZsP%D"|X^QT Eٻwoyy>|UaFR*RUlvARFyIIQgao\ڼd7TLL)jvӔPC18r*RNҬ!@4EBF5(0ǣ{RI;mMR0(hg퇿ixcQ_ιT4m 0 CD!hrchd<O&QŲ,u3iP`۶87L 8PZZZ^^.䧭D= Ə߃I-q΅#u@ & 8Ј˲LtG6J~&ضb'C&M_pUD7{>#H$ m۝hw0t:xQVx&~"VP($=T@DUU{zz8]]]vW4o/!yDRGY}>#jRUU]Elz[NE8 BH͕EH#GHa (9ȉy R}RBiL+T8SB} .)PJБC57/O\opx2}ߋrg}Jk >`|I߫Ǻ$D"pΩ Vni?QPPn{{xUxmkk]r> #i3z^^}i"/6)M[I0L@ x˫oB"}rG/<݀IG7looo zHD}u }G}@wl W'XD"pDgH\?R2/9ߎ-}?)eg.߸ jɒ x&\4gnOoq,V"H$fp{{~2TY>S||B!,cIL"H$'H9ȿ^;S7\DsAgoH$Dϣw˩1D"H$Dr7ӅH$D"H$'𖠚 d3;݄O+sTą@J߶B/BO>OOUw[ఢG ~v/P(N%_3?j{ݚE"3g~XOKK$ɿ x~#F(((xwx׏;u];St]kze?_4x`ҥlvСbŋ|C )**ڻw~h4:qT*KtzUUU>ڵkL_eʔ)D{7og-_H$tժU-// KgώbP-[fv0d2X Z}AQ뮮_~sٷoz3 {n[[xU)KPUUW_-|"wޠAxιSN Aw͛78p;|c}WPPpyٶ]\\|I'ٳ4M;s:;;>\D/СC}QByW__/6>?._|ӦMƍ8q]***Lo~vz*ӚGydƌg;#wy@`РA_W.\y]vtM=P&ikk{7jjj"՟}o;8tϲ߄ƍKӱXlڴi0|p!YGiӦ!Ca˲(N\lY^^ޥ^Ng͚5o޼~!O8Ξ2eJII=ܳh"Ji(s=w駟x≹\N\ڶm1bꪫZZZiZAAH"H bC]~1cL 2zh˲jjjN>d9rd8s+reM0s>cƌkɒ%b ضmٳE&c˙9tP˲`ܸq\s5ӧOwg˖-'xb֭fưalvXיD"1 ;pϞ=<92 OzGs޽{ꮹaĞuY[f͚?,[L;wlnn|WUUE)}ꩧ6l zzzΝw)S{.^[րRL&oᆹs&Ic)xFFEQĂ(馛E_} 6̟?Ūg?wؑH$4455js܄ ~ ,l6aÆ.(J7o~W\ Բ׮]ǟxm۶KqD"… kjj~߈>Q./SN9E ^u+Vx뭷-[6eʔk.Zt) 4{ݽ{wccxeJ\_G|{OٳT<|Tގ/J$MĜ;g͚ugṴ/g曅) lܸ^xq&+~_ٶN:;syq;x|;Xlя~4~{=kW_D" 'cq…|… +** xa%ry H$'5~4QCs?'D/?4)QsfLܾؐTԷc~)|GQ D"B '$f r:H$_,3eZ(H$D"|D"H$D@D"H$b#u%D"H$cL->cf aD"H$DI86ֳ_={ĎǺ$?D4 vvvJMD"9&B)**{lVms=O_{r=D"[UUU5\ND >]wu7{*3fu]'cD"1(ʲe6oVw3%H$q8iڎ;'9X*+Ce$ss(8b*v]Wz%u]M3]xw4MwD"aA?UU]"H|&hQӴP(D}I&T&R9%H$d2cD"E|ƁrСBUUv0`Qoy߿D"1MSZDr 򼼼`0~pG@߸_D"8: D'5P]SJ$1FK$1)9J7D"H$DID"H$ 4%D"H$/pH$D"HH]"H$D" wD"H$ 4%D"H$/걺zEE %@z""'Ma D# A@9 prH'D H)% RR@N(9(sBCB)!  %HP!@9NBPΑ"G@9!@Q"ۄ0N A@@@Ad N( P"N %ADdBPD@H). (p @zkR #r9p G$H)G¨Bp n\fNED@ A@ p "*\!ޟ A WRFN8!@8pB紷SD B !HJQ2aB#'"H\'D+ ?eTl@D#A@)PNN "nH0& E^ ϑAK]) SrPEQJ8!6(9(RF8{ 2J #p(PB@o#%"AB'RNPah % !)g( ! 稈)H HbX#\ȀPQ{EP[G DJUqB9AJD@ˆHPWP@T (s wӐ8!D/SsP  'R1aH Pʀ !;@N( PʀQPNr@1;R9O"rw pJr}WF EDDÑRR$ 88\j@B Grx@B \! " Bp1R@D8"AzxD ar$(fJ@ EFS  "pD@SDBQH) wPSpĤ* bo D!wCDA'@(@BIw`%zʀR@@,( 'Bo RS4ySPsԄS'" P#' H8"$@#@ pBs"ѕ J&7f(! r(NňV@2 0137uC]Vu GtZVƌjdmI9%3;=EŃ6 -0c ,UllGXiex5oշML$m׮4<*2ԡuͣAOn/m<k4H-"kʎW]RP(ّQj0R ӎᩏ׷)L!ь6/Ѿwv;F&򍺒@ɅI?UVZ79[n,weZJPHzwIg5#"4|Մ [iN(]K܈[6-P청)ě7zv#zںZu6ks'5p)j]Yv5Zm5dE;AL|vv,l+lej&f8b{//;GmlSt ;=ti"5UVWZOiLtʆU"['4*X [7?4i+w{R征{&_vMQm-Ulä;Mm,{)Lk8{[E`=k@P$߻[YxJdubcsi ;!]V[k wpXd3R'iվ놦{J+_x-bfR5*~`䉕UdJ3'>hy9Y"Q5#{ʠ10iNQĻNvwU^9Uw\[ts[MV˜zen0`Oӈ!P5qb<vdpR 3Vt +mZiCcidpWvL&آd cey.{f8mu'vk'6WVN ]1:8{2 &;z!X{hﴇZeݝynܳ|Q03у&b@c|EЄ*ޔ`WXm*\r,А0y&-P̈́ZAkΕᡶj)#wtE]'wL{yvڱPx&y<|C,x:Z%њj`nd(`:3pn6qkWi]nhJiOZ3]ƇȆ+޽efE-#C{x`=3;sG-ռUrhlDG`eG \R0*<77G妿cC##I]#2wr"Z6J6흰=Y*HīCڣ7˳@m=4ҼIC5G:[` Hk*1u׵QEH0-O挏ՏY(*<⯫FR V2󴢸3-?TKVvmiHiҰ*ٚ!djL'6yN'0Ѷ1;NpI!_UQ~+P+dzS>(%CEcviD|G$R7tdgmEBmI"VŽFUG/]|`+x|ƲZE&q0d~.ROkIU̢J-?iW FL&atØdMCL~oP*,3#\52T3^_$^l9v~oȶ]aLk{iNeL4}^{wW^`*<=1^u vmrލ- Q[rr2!~ogD> -]ǺwFlٴEy LMTҩږLC?}ޱ\蓸̕믿$ ˲lۆO꧂#lJcm|$|+_oxrmO*Z:{vȧ4z`];TZχ՛>gLYlZꃹGRnvy[27?33X5 B2+~s=ybG"ǟq~˛+}w}gמsoY,xWk<ˮbNz~ſsCsyh_yn[zkڕkNܒD?2Ѿ+ sÏ:ڿBg끿/Y/a'vAӯ^tKSY^NͫtÃ~ͽv=z[)EڗBuF]ڪΓ^{yxaӬZֽ0k6}s/YoM~[a6y[Z}EϽKeaoHm{\蜑O6^k񽼋pؚ[U-,g7[_Վa7^\\x/sߧ-YVisǵM ﱺ;J CnدĮycMȾK^bm,8ee߭n;fSvKk׽m_ߙ~ho_ w ξ#޿q̈́K4eEGY]Ycw yXY 󶧞WucoMٻk׆{ l.g^z+W.{C<Ј\uխ] _k}lSTw^'unHXkFxgYϳiEpygs}k޾{ ۺv3~r_{zaKz~|Ũ:y۱~㌗P{ikofQxх;o}n_m-oʷuշ};:.yo?ܘ|gˣUnumS޹sO~PfNb%/m۔ĥoܼ? !ם}w#q[G~}qȈzzYkۺ@_rgDزoO`]-?8{W[Ȏmόc}X[Ƥ}~(U. |m3xwΛ5留޷nŸ.$gT7]IUςjaS?9_W7V޳-qۛ s<'tsߧlMKZ/WgVqƣe'`>?<Oю?x}տvu㿷t[]KSm.km老7oȾz^<}ϗV\ܰa]-0f/kw7dF^QWG_gcg>>7 <7,QJGkuK+FoiiXv2{ ވG횗8_O: ߻vԆQ|ݏq^kn'~'yw?xzmyS?3GPNx "X,z)pb`+kT2x|DW bSӤL1^0LU ي*( bfAM^b PJ|!ig= /x@ȧx=f^ /Ѩ BU "^Јya?jG|y61U/XMQ Q}:>3Qm{&lBUp@oH$D4 >&GvPBu#kmЃ9XSC iTQ>-jUG7LCTW^ ?y ߴ5шyԠj9^AjZ!`I;⋀aҠ+> ۊeAiQjanhCWI붭jED61(4ٚRM[STUU46,= ^ei~5Hk~,-A'L|,D|> i@B@kRtPlfy _Я[ U VS/Ѭ>*Xx 3HU3 ^U,0=x,O[^=A UUSm;ji/P&굈nJ,(OnZ04gfMSoHU x4+@2Uœ#g_CЃ4{,VV(>kPJ 5O(h=7h@CT#!QЁPBاjEQmn|c%襊JAK1G ct_\ WUuF*$.ۊ?@R~&^S˘UPk0eC7^TxB^~Ca%vX ]Elg{u7&b^ԧLW@*p"aPiTjBUo^SoP7ТAP&D4;YY*~j82 L=SUUmaGg)DAQl?QMR<>C (4H 6]7`[Q lKW|GD"Vw҈?P @G^ T-4#a_UjX(y գ jC:j&x̀nv~B7HLXѵFtiPkA5L͓o CUug Mi bWCQUMѼFLzETUQZs% 5uDHosůuTJī{-RŠJ)A'j屵?B|Cæ4Ok$i =a3t-O )T7y@ֲ5. zZ(yŢauG BZGUEըچщ e}$vBy _дM;+ լCШkpЂW7mSjzJ(QQGʨyͰ-UB |īuզx'tҬ<L6L%'*&!zVM|VR)>3g)!`X*RKc45UuEP4`Pãy>g^_(~]g1 d[nZ0S,Ԍ3( akcy S[Wy&TE VZĉ( zDx4˶#,ʳ_3xD04=_4T jPCT L#ߠ^Q!@/lK7T&{"(7e?c/u)cE!s\]!sˀ3:Cr02G1@+sd9g]`9. y﹌1]tcUdd829cD8C(\1`EDd] H]Ȑ31D8psC`!3!GƐsEq \@8q@D刜3 8(pEƀ1"RD]]%3d80Et].8C0؛<Ɓ s\b+2qp\s3䜻DtQT.G3瀌3@Q3t)3 Pd9gs 8"G]cA4r9rG#SpQs3"S8ȑ!Y'E." Cΐq q 9=Td,!c +:#sѩ HN\hΐ#w00 "s#.\ wn>Q{ ;#=] swX11M2[h$` x8Nb<+deDtSpx-FƘXQXmX+G 9㌋?l. %-999|޵ .gbEv9]\L-\,e)r}eb臌cbȹ bf rt9 Ī+."1rp 36'c51q-pSJp?#lta^oH$D"H:[&IqvYQQn:t:ŠWP֭[sܧډ"$-ꕃ$@(H)!ȡOMWRXu9EBp6Хe@ C~3 #6 5:{zUď'\2m] rDB#P9hEBZ9RB*8TH7 M\HrX!*Z Ez)zՙzԄ ʑrD ^9,^$"(;z RAh=D $0)p"%@tAB{B+o %8 9 ICP @P$8 ; Haȅ( Lԥ(sTPC '2A8H rD B)'P€)9 -ث@8FD P;Q DBK0э PDF#S8!)QBLaD]rBRD a 8ᔊKNY0&R\A /h p!!)J@Q0#S{?A$yQB%d(7Es{[iG)猁 .* =,m&֐` B89?!q9+DD*!@^J1A?Ԣ-dHŗ&z9Dba?$ȅ%dC@DV堀Ф@PBF90+dHp TJ@ *gp$LT! ȀBtS;|i{s*Bq9"&tD(6BTXo -H&nA&bW1?<5!-0JuU^1d! b"I,CQ9%m2b^$(€)0 8R@Kz徑'K!FP!xʡwMS#M8r*@0$ኣ9eδ'ȁ@ ff(2ԥ\%I)HNFM,*4!iS\WAեH R!s(,`FLs88zBnF5M)㮙rd; rI7ѩv+PXHTMn(6dtg͡2FM =щʝ蔙nֱr6Gg8s\IʁtP,a9 'M @R2F:aI0ÁҴx8`; z9$2,1H;^W:u؆ *cK@ SqpUk`a6 QȨ4 8J]@4ra9BTLPT`)a: DGCA)\сzLXT1i 4檖zu@iGqyiN4S A#)o=ɜWr_6 rUnQl1 !9T)IݵP%nu^$* 0i.:L 4`Ed*gR99gj W-RܶTIڮGb$ug&uPdΑ 0Ph(;ēN PPͤ ,1HEtpsV.2\hNwCɬ\A$m˙J{ɓ YYauIڮ?YZBDʭzhN~#nd 蠹@BEɺ&QEkQ7EWD!$HhEUr,AW҉lHs]eճ4H( I TOR,5Ͱ`̰,QRfN-,H;e1WO.r '@lUW1Zu0 'ADRK j,\ws:jބpsNup}7=B)z1rNe| C!.NxNL]T He9!ʳ3U $ͪt4bqŵ$%sKT/0Pr7eԅOiģ)e3Uxs0W&fY( ޔj QuQ@jRUͺ a @%cr8禫cg9W 劦iMC6N\ JThFS(RFPC0"\w\U8U` ]2ݥZ.h Dr,M )g9SA),Cs `*gjZw5#tե$aA"QU4*kA"AtN'iIBn-aLq\9%q pGaf=H,먀 WD TN 7Ҵ]"BPq 9TÁ)JOptU!SQQ[o=CӧO=z]LӼ+^|B9sBoW_-***--'Te5\'VeX4ngzx 5> Ӯ+s_(R[h+ ;]uWգ\V'kԪچfCFtn9y)38K 4}Kmn@[cv-l2:5!qRb ;Fqc|6VӖ^ fioβv$f2`OhJkUۊȜ9sݛ5ٙk#X7߭edװ? 5nQ='(\6t c_Lv7LI%"v\_]g]jƒ|EԸo꩙.ꈍ(gFF{g4m]吼Hΐ=Cse:hc8P8Pu=ܜܝ;dK6:4mEM(;?ؤMm86\:P9Q#1K;R=W6D=Q+F=#Oݪuyj.ʶ%};~Զt(kB<5vXsyvwAa,фNdgalk>8>@f(~j$YioM<4^fMʍl9cK̛N/yn:I3q 5&PX╩!U:~qgi.z >rNrL֌Mшr~͎C;zs,Yb5@lrEw l`h33c[lΠcX0Ѭ֩!wN?.G ;F4{-ԋnrf7i;wVXWhHէ޲eNrD===uj)]śNx=8h@ep!g\p8[ꬂ'Ժ&®Z xݮC_2hnh5)U-4Z]R1E]y׍ZTJ#S|M{q%Y{C;.O%0dK) OyzqQ;]|Z5Hm o7W/66>0[?arGc&/:9=٣6a`6RV5϶vzqM+ԡ~`qnV } oȒXUU֊N'M}d;VRR;|3l-*V}a;~GtBuj,;[(i>`[[N5]S=džNd?N( ឦC3ρ%BgFrwMn?mw͜%b[*/.[:ОBZ--j}]{mw9tls{SN-nXmcfY匡}h!vs9#7j~+C1:CMv3?>xS_T;GYe'%+VOUꢼRxjf̞o xdI4bou5+A.}p߆;q+WwNΊnu^יݫު ;wnn>M]2$ z{yu)iyv3mɮ]džJWO>+P㾉bw7Z)jzڿ:=#*ԣNӸ72J:ikw~XoԖ泲:뺃Ǒ}a{}9VWkmW_Wt ։vm+ۍbuf;!mg+J,]pYk^& XC7lʵNYX[}: Č@^k䶔5qs y[lo ;2K>nc͕VӮj{@eOz}H703bNƆan5;Z;]yBEKֳ#_2;7ɶMmv+/V6N{F4wQ09V;ʍEV۷MENWĒ5o}ٳpJ`ߺ0MtQ4| ͞fzw^pawjFY}Xػ㔭cJV+{ R9%\PX5lltAiCu/oFOUPs346-wEc?Ё5ߛ9O׏Lc262fWdkŚ57\ԓOı;*snczOvvے):L:2#]`ڞy]u H^Ik)/\< ~䚖7oF&k1 S຤ϲc8GvuOx(0Z2ꡦj[5'c|èǛ[ MZkmi=bFrĪ-A{k&[{OmT*%[:cf@tKY_u}X9&5Zzh`"6ax ߍ7ىeVQWyFgKq!;RemӳoNktmjVPOӲ^ZaߖȞ%09/ڒv=El&:xqaSilׄeh{bkOڲo^6z&J w2!1!d~]yŦA=We_jL lNv_Pd<]@JRsv[JE(B{dpm^k#ިy㴞ۜ,vfL.}ךtrnm ^pZplW"0ĻmؘwU9unro-Ntf'GuUO]ݒ%rc):$$IHBCHB $c $[{nSwYk}%;ޑ7s [瞳Zsͺ*W+/Myccc+V5~}{g۳1Rw+J>j syd{M)޴Е".+kX۲5N-_>-}r_o\G#سюĆ}{Gۿ zܲwI_Lt-o\پrݮ=u־uuNOo[k@ss!M{|N~>#| 4 |-[#+NhZY?k΋~}6u#byS[v5,}U {/ ܎IDATk}Ziwj+7W:sz;ϖg[ -;nXuETn[|t[N/lz3ɖC_P?;X<7#ZC+/[J{I_ oxZx`G,rx j ֚qnN&UVAJOCw'- ^|~s箞삙΅] Fuzi U_rd8nyvx"Yju@/=_9lzkgp)X:]^i|וKyMA$c`Kq DPh`ӗ{_+yϑmo[ש.}:wO޲uމwnX˫~5UE~?_kط蒙''6Cӡז.(-)ȡ*'f,qw.;mZ~0#/oM>v`u1벣rk:*{uo\9Dzlʛf7cZӰi?"fOfAy_W>psla+.:om ozat񐽩Թl#m9;\xΧ/޽63Km[`=S$t_pA]֦ VԻ.VQ=zmZCΔP?M=McKlޡAhTyOGv??[_=|Ҩ=Gҩ7y]⼧URYۗ틭5܎CIL nEPtET{{iqk͍LsR+VՑE֏}Χz?8TJ3[9_)]TטV[sؿw^sw]m}Q5vٍ޳z_فCKY _ݷ|j|^6>ѱi Ԇ'WXT/ݰ=}w?;~ݠɶ}5[pK_7?d鳹%=AێtvUso_hTݰuDGV;ݭ~Zw'83ڵ]ө+;;y?j[{rG&`kLeՎwB92OGV/+6#G_Tst?'[[,]ֻckmHL-7nx{ςr!Zv_q-CnUS-0tK[mmi>|UfV&gwƦKD] V49[Gt%0o_凕GwUٚtŸٛ7zjmz5S0wn;䩠XI׍ -G[7^63yc[DɆsg 6/_q=OΦUm}'l?<Ӂ[hRwmV5}퇅_ = m uI -L>|+| *71%Kv?MU4ݒ\Kk[Sd6}rѽ-g_pJ^S]S-X[^xh_ +s3ӎKr凎]g&bś-!sw^s|{Uڿ}d˵_F1WOٞ%guzozCg[u.7+-/NZȹ7RͲfG ㉖eSqN|uc SOח§\:ӶzGmA 7M"oV_BSJ糷/XP4 ẽ_}١C̼կ>f͚ ޽^[nɒ%U^xcz{{V\ sf};RR0cE\1*M)T G Q5)P GJ 9%J |r=iXl2>xs$&du,P@NԜ:2U<+MlY&3`KJRa+Luѐ6M%ծ}C0H@>ݨ"Z )I$(:*.3,(8iX$ NmD2\3X]&c1KC.Qr0Ҟtj)BNZbI{<ȓfb;6ERFVE @ DKS62 F"$OgMj1,chDq #'m B@-j R'd9:X U@بTRĚiE>VKҪ6((+SJr`JrG68!U1w"!B2=p ۲Qr1#wLjZӚo|]71#a!rY uI3>([Azb9ʕ5SP+hKYU&g}n"q8"qH]G!IRDD\X'L'mVs v:lʳ:cÙ\`TI Yj%pRZBb$reȄ&(i%d)Q-0$Qu&Ҏ)qpL]Z<@deGB1vJ'y$ú9X"Aޔdz1f]flY-yI)Kc6Vʍc\k iD/2 c#4 Pea Ӏv0J@&P"8;l.qj6nsnT| 8\r"ud\E( (ZRq-uI lAs.- EE[`-;q,jT2)@yJʒkpD+$*l ܪ.kuhEJh43 HOJ0ȕq4AqթX>S. ]4jMJ ,iqb.-BdHZ)BX`!Ă 3LdMa<.+ɺAKJ`$IAV@f$Ȝ/jҐZ4vgnLU1N-6 ːhZ"2b5(aEH4Jd*BO GSbXq3F.QŪKF#49U H=٪Tr5 )ƵX00JҊDxeť ʩoncmth)VڀA4hWT*EB[lP)D`a:۶!t0FqF%0Th FYdc5 "aW%kX]GTu@@Kmsv̅0L/T*ZAqux.b%mHg S!4&2Y"_!al)U^Uss]S=BW0DXUݼ>W3ԨMJR6d #JJ4ZgD@ƫ40E12)IdJUiEZm1(MF e%RR @q f hc2ic2_Z)ԀznyD@2h"Lj 2RT@ΐDT*ݑ1iʗa8If~` BHDk9]5XlNkڐ0,,%j'f4h3XaC1iB4XѠ@ ΐ8onQa~C4*̓6 K("Ai4h (q@RM (F"MZ{eҠ qDad`hM^c2*&d e,TM-(3dRgUV&E4iJR)M 2ěG2F&c4^3*Kv P3 dъ!J5he(CR6`LJd4 )*eKRJ#:2hA+ dhMZ&Plׄ2N$ȘZg AWMF^3Jp}R5ï*F+uM6F Rژ`&cTd(4 Vف"ThBqIe4tfER(3a: 1Y2&ÅBf(2ll52Fj04(0Zc2YhFIQ@KF\)0JiCZkm6VF[1shVʠ P!T*-ɐ{Y kNRdJ)j(5dJQPZ]]hm (:F2o6i)͹ iEtFƫV`RR3{ƪT$D(5dH2LghQcYH:.i53H:J!sl`"m4xͦ תaՌ2h@i Y!&kf^3G$ъ2(m2f{ ͱq(ݨdRoeA6QԘ3CdFm8댼UV!f3)QT5 qJuԤ2eJ@3v1³R¬g,HՠB2KEQ7ؚ>}$F%q!M ɀiDl# J>zf7WZ}\r H)[n[N;-oy[ҸD$8Hf--`I2% ͜ c6Za"2t;g_CJ 8] \۾\G^vs(넡 V`iv2'|*#*l]'(mZ9m)Cv,f΅2zR{<ْ-rʔ< BXad VPwVn-y?`n;Jݝn.oy20ϋ/A\xěB(4)G抮c|)b3'^7A-Kˉw\Ǘy\zyj C7N/ $r9 \7v=oT58s;~q䃪 2r9q7gWM"sa,9^rX%' ^Ȝ\A2ۮ-߄I\{Z ˇN.̶C_杼\d9g~A69 е9۾W~`@ľ\Z K<-7zgK(X u-lr&7p*; a;t>pܜv+YAW ٲ"2,Y$EX+ne˰ \+x%B[ry7H# ,,x\i BǓyO/:9p\hg ^2a΢E;d"CO'=+xn褭 Q1eY3+7r`7yBEWS/0rU]v * ;0kxsa8vh |h_C)r~' | |'0c?hBxdFIrV8, i9gM97_=N%":~7doa?c/&am1gU\\i5xP*Dr7y;EM唓_i컧R՛hfl?a݂xk|ڨ`՚&/vL+Hg'Fw ?y0ݺ~h9G L;g> {w Y=hzTi}o4?mrh PCݷ(m8V17vDF8˞hcH`t q%(T]ޱppn˗ lzpdϑjI? 7CkK?yLwNz}~oE ϷK[ʎɃ#]6G9Zjcve&gJ~)鑿3?9o+&qm1PAr>:9|HV5j`)Oua`rptS@/:1`K~7wMξtffv?4x 7Gλmևjѣ?{d<; Cw=3m{Ǔ\gCɽ멠(uyiW;[ֽixt}扝eW)9hsrG'};W|p[wO#[L)#gѴ8tdž"9vNvwO߳c{/lw&L>}n&Nxz9{kgCDv`|]> wt#P۶I+aw|퇐߼+'xun.WM ѦC=Gzh'j~>:ݵw ttо U=]Nv;g֯==P޽\4.&>eMlC}[NSc +3}]וwDM^*zҞ#_HJG{Gɓ;P]z4%Óu>݃mtO`GGgE?tA{Mݑ^.סm;ɽG{䔗;])L~ c{׎:cnbѧ&ַq3^!8b'&F׎ұQ9'1'_xc>'G3xljƣo5Oؑ9C}]:Q}vd6Ʀ/+j]=wkgL{>\5@GԎ|g3ޮ3=ꁧBS?jt(;1쁝EgU ڦ'D=S;p~ٷwx?2yS7Tޣvԡ£wxwmfܾ؁Gǻ.0=oT}{|ZiT9wGp=k=K5пo#֮a8VG,o;`de'dutcC}G竝`;-mS8*gRKvΰA ۦhwBom桉c^WoOt}_8|W(z¯; Nh;YĮٚV@?#j259F=闓]'>r{k`4ydx=gH|f!.+(͇jQ}MT6ugwmy FGz *3*жQkCY Dq>]݃=#wFcӏ5o>{ngU3O-Їo;<8-Ԇ;|vy@ Nv?Աѻ b{աuۣc1uqi]\û$ v֣&Ӿ 'j|nlm9`K] 8:_y&4 :'V/Llq::]c&a~Ҳ{ G 'ckbB'/&wq X ;VOH>ZL=ImHLmߴSNF*vk*=)?Ğ0=ҹf+CbfEj 682tkr jX9b龱pp[yzt}kwώTkz {zjЪ-l^9CpLΔ}ptJV;ⲫ_3kL#{=.{D#jރUhj:ĭ#;h r wJcQe#=n<RdǺ՞>폘gZ39{O7p}Gt{ϪF#kzJp7]z"Lb/8==R>I%~o>'J]<(&u*9xF39sB$NiESCfXچJ5"Ì0vpJ Rb&"3L$г!b qFTcND^2IfKAIU vE8xeD~ͺ3SHQ'b8#S1I>TEM O2;`RqJXk`y҈S+؀0A`)ns"ЍJ|$US2Jj)4DB*Y*:0#iGPE8Jn 2;&5Ä nf 됊,W%p1ue,D 4J\c"1$K102%1bL1 (h2a4D "Ž*N"i[X`t:} -& ̹ L :ܶUBb ge7JY 4,siLs{aYx@4g`s,ٶK,'Ez8n+< O/ 9g;ùNr РA@Ry6L LFf:nlsjNIj$񬄹'qƈ8,6҇dznٮ9u@h<bOzDI%0x6ƝFJcv8Qُ<XOXe2D n 'w<>Fk9xxrld!6̓Uk0sZh,dDDW3-Dt, >-H XV梮"srp"EáaޣiӨBq")eNtB<)kD;G0'ut8f9+'b#ӀeMgn \s'TosS/H x\ 5=<ǃcWr8C:,GN3f#If.UQ#On'VԨr |"D/;G݉A׏o Nshx5b~6w0i'@ dKDCYD(QAd4~Al*Q4d'L|a\MG ӞkxR\q5O^ O 4%Nj q|'Bd,K{Ng;)NZ-mxӜ ⤓v' OW$UONr N.xkxpc<էIsi6ȧɮ?E$7K']?y', Sipڮ)`3©as’xE'?btꢧ_䐓bTNkO$bS┤b$v 'vJY{RDbaS_)}9ݿǓNXzqw >UsJpyӂx1zɺR5ۓvvNSK)8R'z$'ԓ>h;xv'%)?Gvhx`<\C8('NI9xOD*SS%pg;"צ PvZ`ett›/mIRk2E%7W"JژR.xtV*hIgk,%qǯc:Q ܢǞT'xAjTGLp1p?O.jK22nm4s"ôYPƵvDŞqd)64\RVxjYFPv'eGZSh>rheuxZ~jbTwIuȡJxFV-ڮz嚶1mϻuSɇrujeG:#-:@Pm*WR T>`(7mKpʗځ /QJ 3:_OsQc-21< ұpa eSg@M-nv=4D83UNLgM#JL@h.Ze.d ;X+Zun#4 SbtNBT{hj=S( ۨZ^ A<^+虜X1>Sz`ZG 8EiĘ&B{9gk-㬽\Q(^TzkRکqկw}qbbU|+:<(%|ժ2'_GIGz('(=u.jE܊2E7*'pWAE HL&a=alW ڹt8amqʥ~2jFE,B!skt5VmcrˉqM5h9Tܭ2aZ3A |l0uk)aQNdƩ+BX+;rҊ(TVd)/IRoqU{L4Yxn-RƓzX$'XC٢/JIGs:JT/Z6:vk*NjStʴa5u)b쎹=L@bכ*.\6MH !4//G$SZez<+[zcgRSN $Ki׶1E˼*paƎZ0f>TS%e, ͫMqFj=SS3V 4@?SmYehJLlj yԤSK%EJ#uֆ3^P 9 F y!V&6貌bR\ ϵcʥ:N%\hf)JocFI_GZ[e"Ny&`x}\Z<61N"YZJaLU]hHO?;$RU345)܊cbr#vlɊQrRYi#)ZfJDya%5VrҙKySIǂ_WkHU*sR̥jT>XVl:. ĬS%#lluI*eW(m+IiOx՞NƂO93 ',iZZUis+OG86! ʂڤ1ϪȨmej~Xhk03#LKI#q!_sls Y~Ƞa*UYVUIVUbEzɒ gu;T)tMwfg; əE~=y{r3š=RN*%ǢxX:Vve@J6ipjhKfT{ۤ)4j9 A9P1mRbqK9!,_6FIma\u&kV^U/t{ڟ-0>T&L֖6Jq$e<i7ԩSiYf%;hl 4WNR@njM rq(C*VkO\Mjx qcvU*GS1I +!Gfb NwrS]H܀/#?nwqͻYh!}_~;veYl,m;>/_}GֿM[/o6w jt >h)?Ry՟y t͚?pdߟ?MO|z^;_W~p^>ٷn^7?_W?+~ӒVL`zus|ۇϒoWﯯZ\?Exeo[M_7 7OzokYeo.yϣ^^}c7-}Π_chc]c_~փտrЦ𷾟}k[ݯ'?1;ǽ .xӧ|ި}?}ɝ7}x~L|z?Wx]al|+[M7O﫯|u*zOٻhDawV]UXu7~kZsկ}5^Ll͍ᾫq-?7k͟tOM\Xs?yw+Wسw#<][Tm)o?x;d[6Ŀ{?w?)OTo~5F_Cӟ]{O/>Kn=xؾ7$ҞwnGK'״}~k~r[F>~_}\]//r>sh]mX=Ѝ~Kw{}Ǧ{.4\#:'>c8eWȶ={Hc+>o]tkOw~U_ Hk~{fi1Gwzǂ7Lɏu=;濺yDžXoƾ*y'?7nKcݸ%o] ZOԽu]<=>}եO-Kusnj}l}o_/睻/{W+3jOƵ[| s`|⺉]]қikmw]ٮ _K;YK;ӯi쟫xG~\:_Osb]O}Wqwsr;[o?z?r?ΦGM7ϭmx[. ?򎫾+p/@rM7v+x]n뮟Gp2oXه-׼ _26ֶOſ/=`zǞ\:o֧/,vcC~ߵβܯ,x3sbß _XȾk'ڿ*s+SޱT.墡;+m3̦n-[_y}n>w_{vx{RϿ}TqG\cvܭtrkK&}/@W_o̝Gk.|[}ϛr㕅yӛk_<=և7l/U.B#{틶dGo/o7m~l}]GO\s?±eLox߬௃UyUgc[DO;޿?\۴|?y~w|4X?~ӱ|^tbvIG/~7'%Wwype?G?lXY7_ه~|5{^s Es}h]-  W=?|fmQOG+_R>?k/˩+׍GnwX=އ*_ٳq+yͽ7ϿUgWhbI?v'Ցstg{%}KG(_߿ @_{ϻ7'+>doʻE ٱtO[~a5Qҋ^~6?hڬ?yx{ \r/MŸTus?\9a]]?nUMwY+ZsK mݝx3~ۖnϼuXtg*c={/1_Fӟ,r윮7|R\^:[cԅ>XVp>w~櫟d}]lMc ~\lB֡'3-=GĪ|O⃓k੿0uS3/x; ɋ&/|o~u忼8s3g:Wxn~cѯޗ?9x_+o=vouV=c^(y?8]c/mkΧo}E?2Td߿w_{svU__ݓ'9M xC02Pr3!2 Qp`!2C`Ap@Dd0DD` D Ɓq!C@1@p 8Cb瀈09g3@`8"2D#" @ds,SiL0Y; bC19΀2<C? "fvCC@0r G&cx`c(2\ DβML/-C@@@p3g˖@D@Ɛ#rD&2d0=B9CٿA& G2΀7q82l%#f9`ȉ#c821[S#p@. c1r Q `|2Ȑ#g&g! gL ,3g%2 9c cx ȑ!,9A8YLUd `X`f0΀59r#C1\pƐL%X@ 2k082@` (XYxp̞ lȀ# dJ,C@L`5B9,943" g  8C "GD"Z"KeB Dְ(sd#0 @ cE7#έ"G@Er8e ,MX3C"И0+\  !``CYy`Y@Vri.@ G P Zv`OA眣`!sdqYGDY:sdq8@䘕DƑ3dg^ G@ÀeEU 9 L2`!2 L f&gCVdq21ȒaVDx岔8g͕Ad030C8r!qhYM2"2Dc3Gpv&B#8CcGXVF `dN*1Ȁ1,3e!YV쁋9 d&f"ChYl`8at(QYF6se2!һGβɑAM"D9 B؀f!:10 r! AMj,:3LȚ;YF2C&eQ@D9ȼ MfJ8# 8pvYp|X,;e"p͝PRVh̹(2_+!fU8(`5X֛Xf+B"k"rg ÓrqThC&1"rQh\ ΀+>See~>?љ',Kwv}4ygٍ^k a/3AgtfiڗV>m,~gS#8襮:} >lKMv !oiCg@g#=/3Kkxev2'zqLNgx 8Q$PNيQC:&;Cb=^=GOTgK*^e\~pD8=,NYU3+l |D/佗tS^ªgg &:eEt|əNsQh g?$Etfiٕ<^v/SO8%N/V^Wl/sp7Ƽ';gzk܀/wf ,I/s+^(0+/Wigeb[ KF-8"3\x/ @/=%]x44l#_8{"K\@ZDEW++)m} ;w^lKUj=j/s1egTu/ghqŧDn+,A߭>䵳Vf{<Йf;[¾opg{ zK_j+_hg }/tznBy;1LvdV333gkJWximd%l!o4cN-D d !jL(2`I3 X "ido$ HL/C(&0`21@3:#ր:e`G2`0#΁ 5dX0JVfL9`` # )3.a,4U5s1b c5Z`=[3l-ód 8s7dkqd!eK㰹yzX\e\Gʰs B`#F`XE i6WK3\:Ĥ, 2:*e`Dh#À#,tҬ-2"d@@B4d4DQ~$bHaH xНx!, eXeX[DdlN$0Dd $C&I,u1Kb6D6"b&\6Ȁ:j"dI%(!c@!@$M  fi (ƀ #2@XF]r,M/aYZ!fzaM +lHIL2 Fe~F&z$ 9+5Yᡁ~%28hC\7b"f1"CYB7 F@' $Fp!UPX. Y1b v1 h*'~GeyB@YLQD33"!2= C4Y4H@5! ff@ 8˚,HcaHGa'2$R-h@}  #ǮIMf<  4`5؈, A$CF!42L32&&͡xfjxV`fQd4fe[j !eQf |a d{N6KF9Τmؔ $ :~ؗ؜4!Dn`r:eL0!۵iFG27<,YjF6*"]sJ@،@{[ ITޗ{ׯ_篻 o\r͚5ۿsm޼3Lv+_ݻo\.1g8yv38j@,FY N$HdH5F^#H@$ TىFDR  `d3GS2pSX$u-0˘sa]rnp2a 㤥PqTWORP2-8S&3c.b@ r5t8P&xɍm,3AvBfaMKd@]Dub x UC`0d ub'4I $"H{hr*i mƼ&%^Ў.R 48i%Ҷ˒5r84\2(`K0v"=@?ՎC}\ <%pʖJIuRXR.-Rhv@Fd{e䐁$(ֈJ 5L,cJ=+E 2F"pFttVRLSZ3eI-1!렑I,u]vɏXYP%ESI0K)1[ 1ECASkse /J%1h 9RRx̍u eh'$!RLKV1Lm'D(cbH`ZU.͔BZ2 b@ӺǬHD 8xXup0I[A"j#m 夊ohjXσ]G`-A`Tb]X5jd SK)P6ZF-*P(G0j,x)XiQiT@K\1``%P'&fh'We(PCā"Gۉvb%Q"K*9*S @( *U)UIJoRÄ!)n:ױ9^dLB[RٙB_BNTAe44È00!nhk=%lN() $ TNTG#ԀI- %8`b>+lP\q'8(l5e,ՄC \XRe34%Z,8g5QpEsSI$Yd7Ĩ &c80JP4p˩r" wk0h!Qq]cdB)H)$\ت2mGTL5bvXIiC1A ":%saA$R1#X:䠍PT".kN S BHpN,̂4M|&dd8!30Ց@J`iZAZbB <%\bd} ҩ zD! Qjd.8Q D 9J.LqS Ȉ@pviL8ʱmF+̩mzHLzl ]Ў+eYBh*R)7S2 )gA,U)ֹV|[&<$Q@ˀ1 z68P b::F%uT&YSJCj%%pn3NpR,Sdi,P i2FY٤eQ˨ `i!ꨚlM+0hp S,HhQ%5BDJ3 RY"a0@ RĵfhHOBH Bn00L0HUn.EDI l"$,QhCv21̭X&N)4`P84P(Ì)ɪIlKS%4c„`&b`"d4 k?zw}myoOӟ'(VOZrXI akq6@_`%-FyUiŅ#]|ܱ%rK|cW[ FƇ03ZOe |3H}z7O;L4.8wëpD ?j>V.ls^$F<2mMG׵4IgӂJ 3;/Kh/XCnvࢥm3]X }`ґ0 L81lߪޫ*%YYcfG MO®:&/mu l͞K-ڒ}|+\QDqx4-H4m(ܼ$ڗjea M׹Peӏ82,_7ƃ6̈㓭=/E)k`ᮢ0Tjyx-V \2]-y3 vo웹`ʾ974jƬSV͇[yuo}Ï,{hskѢ>6XȹG;.SҦmCUŞJsF %rRUw'㻊 84a:|V67Y?ަ0wa|aST>Ϝ_`0s<>|j.wyW5FW{h[צfgXKR6449qj=Pw0[mwW ]۫":V]o˟ťsgp.8fx ; 9].2-;:5E2t{æ ^߂>7ʎ̏-ju}V{=<oO[*+k:/qL`K5N/.bu/"!&pډ:KmKrXM9t! SxYh{ڑ%5ǽ#R΁7Oy7K̟/W[>ۜ}f(k{+:pyANEˣŕs+aGiaoyj Y={diVSjAmOazd~ufڍ#:&p4W]~$65;`U ͪCK/NTΆulՂ53[߱лW]w䂮swK*SbMt\Y޼| aN.R-o][\j鶰][@tu#m{s.]v'kWm N'[S=nWͤm'#ӝRrÅ2(Z} sqnl460rm==M &ZӎGEcZq/V+MmϚM X5$7Ӵ`pFٗm1v$t[~tJO]rPdh++KoXj^X]Y4PfԢxەKqYyQ֚ʏ'\I=ue}N]^|7 rx>LG#lNxm}htkE;*:ǩm 6s>;d)Joz0RG%Wo] vkI-,=lmIfldeuH*tnv\^m -ŮN8][T0%j_[v,|ϻ{ZV,7>6y#bKX/,8r#LoC[|VJf6ﹴމS=lnkZߓN*c~KRɇq0`2juw&&=< ]cMvpشvbǎbiPHg3Vٮ5rj/VnIўծ`i6}l9Bi>gݸ{rz2w)v?NL68w´w/jycslȶU7FO-/؊śB-X1=kxG}䫗̌3,^O_;Hu4wj`ӵ\2T+wAOZ{zpϐ D{ g6|-G"gdgTSi1{ۢfȱ3U ,+]=jT[P^|A[-| J~y9 8Rk4k[EmWow.MX@9vΚucsuqj}K^3t-AS(-9wqo@lMzojQΔ'TBgqyynBT-R#U{ުe֭*e==W+ HIJ0 {}s;::c`v}˲^4_̸0ŜvP_O{5\7~Υ.}d5r\:ƞ=O]&/cߴym }]K7-૳+c04Rjj|]`qϑ|>/\ٱGyWTr(M~7n^s7 5ɿYOFⵯZ-;ELb7=2_yWEU ^]t;V̎wYMVƭw$Ց6FxV8 !dE#Vf% Yd2{tL.Ҝig{wu~險c"0 +tW/_ŏ}Gz -=j[X WL7o~t_& rK`2Ro_pΰ8tF#N[N_>=w8?{|y˾dxˮ={@ /x w=sK!%Ou??gA ̣ʹW݆kN]k0k%y{*~liV8Yzj\Պ >~X;pz9CW|/ۯ_;Yjpjda/,sHTxyB?bC KK?t٭n°=w5ǏL:>iSW.+d7W.h?R̅'<| w软Z׸S 6-_O_ozG_ó[9gR9o不R{|slK?6k7EӺ_-~=z.:'\uyga*}R-?z±wdwEEk?]d oY-x΁_K/}xzO}COM,[|,?|[wػCuK~yTTO|c^Zܟg,~Kmozi?wvnTθkWoMUE86/s;Ȇ.]67,/ظG/;̜?)iEryV.AvZ. /R?yQcy7tW90N-M}Ս5˖(Xs_t Opǟ>XUZG7׮‘pzyӢrݻGzsYG(a}w^k3GKSC/e2-|>V>w޻+o>} _f8埯t/V-sKQMYDnX}@8|?7֥CxZN}<ޓ.89>s5>:oզ_o߰?5@MO.X:}|Q#Of_߹}i߾o}񭗬;bO>eg>bC#'ZMC޻ _}s>z6#>x`^`߼a}/QowIJ}ᢗxvS੖2gIvɅ+^t-g_߿"5IX G~rd\Ƨ} ~i> ӑ#y)5"=kj ~S~?C_3pX33KR3RSA6-b.}1{Y2gᜩ => r<'駟qƉ XPVo^q===;vDl6n ` У(jCB57EQ(#F*" a:P8ɨX8bNa,L@,RNܠQ)ı!CR-#nPB" zeB \27c@s04Z(K3r),m; -h+HjB )9jlcmr  bG Ҋ )k_EYX "7P5 }oChlƌugh+ +]OpQS F6BˁXb$MxA#lFmi" t ̎U8j AJp`C'6u&1 -BT5+ Cm TK0FN1]Rc "Hd ic1IhC`N Mcj ch"mhMɀ(6I'Ũd v刴 mCcHc2D1%5%6 1@ ccАFI#1Fc"2N*FA" &6Zdtj4! FS H iz&Lȇ4jc1$4h 6d$Ud IkcHm #ݕdWi` Qjc4 C(&D Aw ɠ& ҠdtMHZ#iԤ!!h4!!DMD4#OIѲ!'Ƅ@DjRK0@P CHdȠ@ ;& MRLi@h&ACD%2H gԡ$І%%BJÐT`("ҺSi()HDC U" 5&0ƐtHAc 0-" dL(itDf#XJJ &<"0`P'c && :&KF&2?l c hLbH H36Dj2`+Ԡi$ CК^M61cE!2:@h@)T$OZk5i00M&\hm@kfƘTtn dK %6Iy&CdA 2:)筍h0bBCh*HttGFQ CqRk jhȘARZ657`҄I&jB`*dcn~`X]Cd 1:gѩX u86DڠɐF @&i$thc(6X2h06$tlMdLgH0ZH4F$vo4aRcbdbBE11N:+Th!2S;4M& 8"HA0qRN}byLЦ[G F$'v>:Q0id&ѡc4`2h F褨I:1au7mt1w $!J& hFI`נ!d hBi$Fk0kJfm0 !$U wZ0ChֺVd.1 1Zkm>20/=C#Hq`:6h0YɀƤ-&0PZ6FK1!M c0bҝ,5@hS A&T£NO؞\Nt I o&s饗^r%3;gɋ~Gֿ9ov;H C@>qg[ ;t=+vS9'}N*d),_پyC[Xh)|IYzky)OٖھNXir}'n]G,MY=rTe)Z;ggme̷-v]svR>[ؖ+S:c 8'larB%\FK؁}bߖiq}vhykҳl\rmDZ-nsla)_aRgu--=%QZN6x8v,lJYNʸ#=J:Rڲ]Y*ytUH6[NʕcqUʵ=Ǎ,K,O*] \ߵRuﰴ w}Ԟ\kɔ:)ǔ*5kcq*ۅuJ)qmmʊle: aUJzZi϶-ϱ}黮R|qm;H)[==vRLs'pc|_빖c{k b˶-]WzJ>K9Z)sǶ=XiWiV@ u8r]Zu\dl>yʱlu]x)klo;k{Ҿ'\;ʱ-7J+mgG:VJ2Ch9cƎz)KUcY6WŞi? ^s,iَJ+9VYҳ]ױgk|Vue몖]:lW(r,d8*d ۶})|[c\ٶmٶm[6(Rkell˵]G\|Q~2=ג*um϶Sp])'J߲+v=SmKGyZkYtzʳɔ#mru,ۖi,ZmPhchb"v5:Z]==}=O5=zbmp~V:8X\8d\s<O}=#;Y8/n WVvVܛ9wc7T~,BygemDTƽCy؍ ` jV,e}#kzxcOdKΎSgք8[o6t>Z.>3l2n\dީl t!k'9V'Р۳;ز{g zhÁƧM4t&?okmo{xu|pߖ֔dFΑ]Qtu0ԅ橭l6/ŧ{vPa*k2;7OǣnQ7n<챧=@:׷QPt{Ôs WS7^y\l{MgpX>5C$ߘ<_[qi z?yP惇~scSO#r`i–ѭ[8ծg{z7L ےf<=uK4[g` =^Wdz+kNnS#IF][ZhW'+?wg$!;0RO`э;mW=Α;[SI,Vк ûmX64bCO;kZ6o֑3|p;ܶ T&WGz״ljQn[!n>`v}Ӷ'?{b^ўӣBoaXΌ9fԭ#ۭ CMz˰}*MxN}~9C}1=L9(-=92v"61g6}j~1hnC}bkʙml(X`jj4Xٿ0Ӏ"Urx*thOCý`TڇC#`.odk =:T(Rђڳc^7l}`m繁=luj~3BPE0rp`Ӫ`I7pO{{m Sc {Z{B6Ž˦{NsG彇VWOİtuˮcbըr+7=WlkvԔ*F ng-234zv;4kppD[FtFĢ'{aQda<\lkOm4cku 60ܳ1xvpC[pyP̛-uOXn+lڗX6eVm]0X6pGخVƒi?U;NӺ`+ot.Ij<޾}D`m*Ż'y>FӓBzcU<T[sKG<ܴ 9<9qhQ{ȩut#g"Q7xwg ,+#=3>]N{֝;3y5o_P=f\ۋUڱIF9zGܿ]X I>nWf(Cؙmeˇ,>4T׾+m?Ю<>upPyӻyѻ +QJ@kw:$gJ-j\ߝ>CL:~w7}lVm{bխ}4t 7#FU{P&=R7T<湜d14Ńr`Q^]E3+8')6Æ-d). cXD;&ڭᆽ;kRZm( -&契[ۧ ;鵆|M`)#5w`Alq!3lj7ݵfBwjg짷ڵ1Z8Wf)w`[-՛vD-$Jh7Ml/zΘŲ+Ҵ{>&{;BA׍:;RraСj2S͙no2;ebhcmWIe6rͽәu[pٙߗ}<@v|`zCZky(lܷݶ>0o  j0R-{^r`M=>_y>TĶ}&`}4V?Իs QZwl^ frjd&wLwKMk's,5%aT"Rf2M,uo/N).2m˒NH3a (i ,iIo&u`ɋwq9i1 D;ā0i֎F̃ؒɝ@Ǥ=wүT<܎)a?m ]&5muۇvO::?`f@Yt;"v'b2ā%m``IyEinQ+NqL '7T14uC&- ֙Q#bw Lfu;'s&ݶXD8Ӥ`"dS,y4!l|GgɎX[+72lkgtjO:''Ivo@l*qݶ:%`'s X:BNv}rb3I uB'E#Y>ND]#HPÏqSkYlREftAh:;H@̐yBϒHȉQw$Xv|]uA6nl>2Wv a5u& f>M DΆ:)!%c'ūfK&O.L)ci4'@8%}J7qg4&4AӾ=hglg "<+᮳ ]&t(mbbΝ'ϩdgp(#\f8g3׌uw"d~gɳcPGʒ6<#邏r'$yLArFq$j;OQP4.iF 23kS><9as09`.q09as0as09aK09as0%s09as?w"#;9sfOuΈB/÷7?߈asGŜ?u]so⿠K>@O!j1rD1B"2D0 ` f 0`1  "! !A$fDp $_ #"d b2 3@Lɜ O"5$ÁbD!""B"@a@@BBD E4Kf ƈ4|3 ! F8# $D !2S `` F)'d 20#%r D` %ZNt!Dۉ K!B2 u!ӑ K CHDj"d$Kvl#!1̀@!h`HjK"@C! IhOP)0CLBmJLhF!cȐ9i@L!d(Ơ#\dK "i !0 Ħйʀ ỻCcPH܃!b1HAWŀ"cC43N~$za@!Ď鎵&n:DBOE$N: 04gD`Lr8`bCWN0<2cu2 q2&1d &c"]oɒ$DF3JUb,kɪSH "NP'E3b "bb: =d!3\"B :Ɉr ""i@h-q㞙%d @1qωX!#H`8h@ g#@FD0!Ŀ&2$. %N 3!dQ7"֡04҈tIHd 4DŽ?@ٕ1!aY2q$0&@$n(%1 v0b@DN1n蒒a's Ɠ@X$C݉/&I:Q@"2H ф YǯC'A Q7-Q'!C4vD$CFLxi $K"$=]OX"A2vb=tƌND14I\H(Ĉ)dM$aI"݀@E@Ę!b41$"b9ŒQǜI@c+I$R786+;0tG+ R'GH<-#F NT2]&$NHĘpLD(!QV'#Ȑ %4K;L~Jxg޴o_"/Yyc|Y{>P>p}9ŸZlh5އn=+=|G}~/S~h }'CKW>npO^qo3x7sS<.>s۶]Gןl;woKzm={U ^W\%{kOF?w̽UW5V _oޑzV{ZvhW> UG]N~nu?}]ޙ׊&N~g{ G~_Ԇ[v_=[|p\txƲ9jgt\xۃԯ׾p 5VM|􁅟{տ޺׵wOCkCRw-?{Cw=qzbuߊ+~s}7~|wFyljc㫮:[[k=ޗM-*H'-7[OtkwV쬛:cNx@Ճ6ؓpz7ޟcyϵ ~̩.#O>~_ѳ|ޛ6n^Zm.8Ɗ;''{ƽY5_{{߮_x7y޹gn˿t7^ӞX|JۣO/)_g{!w5cO:9u'~odYo>?{VN,sXzYgO7[V2/YU?ONx|U[p~v7.ξV_y Q㛯}[nÕ_[~kkίLZKk_^e'oܹצ<{—]|Цɕ/񳽷.{IzѱS7?~GI=~WwL;'}=E+6m|G\ZsdzqC׭ٺGUWb8]ؕ}c^e^շ[>OnEAu h/>+]>?x]q5vmӖDmPguױ|ˋ[Q?y}2=ӏ\kv|;Nryn^96;o,;Ŷ;;󹗜w?xz=z5_}}*{n\_ݳ'j~w6]3˖_N}';O ˢ{?s%+O3߳ԡK[#ѷyM5oE9淯W>n]>eNJe翼8\w9SN-/.xg]bsNzd:;;'}߳#-s}#wط`'ri=#n^$ޘik٧YnG͑Vb}J.>bqOOn┗~8YهNz̋g~(g%Qo}9mn[~svv7]?u`MW󜫣pӫmwO_ 'rͩSz_8sG{|k4>s]ǝg*+*;}W>X?zw|1{_8k bč9=O?|꺣ǣƟ?ɝ:h5?.;9Q|/&>yNC}/dS>'tKB-;3޴؟ćx7/ӓ?;'׷z} U4Tu)xej/\'/W܅ۣ}>gK޿m|ɟk3R-o.i#j(˗>'k^zZ+Ƿ7Z=H{S'8S~<hщyj}x=X5}S@~t]ϼk3' sTWNy ?~ڟ}_LW>|uϼO]+شo-c3?# |T%_ru:UYL89]C M:Y_x+,[ 4b r&*0i7\GCPi~/N7n 'Rz5k25݌[jLQ248%l42R1 4ʅh^4a9PjmbyԳ-3V`tZPVLSMdʦ<^i`*j詪i7uUM3Rl*d+|h狵\B20\(_h+(l rNոڂTU4 ufaCZ l2T2-h].6.jYPdU}ieUlO奭x~k1T* \1&Uv%horTr6* (Lt't/ʔQ7A e&t^veeC5IAt;01rkBT73PkO52̖@RN Q:7El:NP ~9jf}e}4SRVXi6ui%sB9(UT]IDl"ҒUb 0F L _8LgZ\1gMCxجB]YaPfֆ` ,Q1Oi(ΘV:CSaj ZVUaoB<-JGd*U&o0dYQU * cPXl6[&55ʹ2Yyj(ªϳnڹvT:?Մr JƳ$bEG=TiʂJ LTW%͖ZXkj6߮4nc^W)er9]k72ʲnf,TQ>oSTid &LԊkdPAҜRe ,Kœqüz@F 1AfXR+\PlOW,zL9M6էEZN3'z=[9SzD垆lY(f؞@m<]( S)5hrGbϙ4Yh.fԚT rh4rR̖RL@UiS0vi: Qh(ea9lO\Wc(L7Q%f*S.Fj&QP./f!^҂| 尝NZ!'r\6О,ēfL Kx^ߴƛ:WM1`Q310Da4I TU9S|f A4Q̥D+^kdœL3:[hFrsCl9C(29YB*eCqO- T5LhՠRlLb3TYvJy:lsd©BR8QiYSU*7zmvY&RSN@8됙 hFTXEA.a%|U1F %݌raCUzے4i&DaERZ[-jT|Pv}9ՖL(*DJ.sVh.SZ;3njPij 7 є.f֬A\fV F"ODYx4U̴ UYVo.ȷ!AHD}+EV>e[Qϛ`)vЮV0-V&ʷJܞ4ZmT2j84lzcJEne" m\gH'`%g7^Ej.1Jh l4nEY(ZByvHPnF<ovkQ/s@jM/ą,s -C)R9^6 LP jMW*qr;ߘ6R\`B3_oj93ĝƘ9pL )xk ɑ#f@*Jrqƀ`)2Ƒ1!PJLpdX,㜡 ȘBH&+dRJ q6gD8  ȥ`CK dȄa1.A)Z#C%"Ÿ䂡1("W@QJ dɕhq, \'S\%aȑ1Bq&(80 # 8rq`(CƐLs)`L8p[ $g Ņ3`qqKpe\ %H[p Ɠ)8@K 9Z!Rl$J@\-J0BR(- B0!$Lc9WB(ƅ`9a eT\s% )P*.$JB2fIŸdJ!X+.,&9L*&J8Hi AIK&8C!).JFZ `’3ddJ θ,IH%0ƅ#WB T 4B \ )+D+ K"3gBAeIbi @X\0e2\pΙP\ \@ƅ%$i!B1 q`I΄q΅,!J %*`\)B0.(T2@(ř! \p3K$P[)bq Ņr h\ `1.@H*\IR@$ FC\rA*.@GaS 1[B!L@\2) @&A$ RL J A!8X K"H(,%QY c ΐ!29'nKι@18 +΄B#& bJ( fLp`LrIq1 !DޙBZ[Q*\RW8g(g 9@@E BZ`\qJR $G$CK(!L Biȸ`-.ْ)&-\ & E282%]0)I*ep qAXL)9B U")9`IDa!AD S28T`\ 9pܒ, !0)` pR`Uc9g d$ AXI) !X8&P 8R) %B ɥ%d%`bҠ9@(Z , BG)QH!9 θ [ BpƄDi  .3!X[K!cRrh -*ZJ T,Ƒ1IlD8 gLRLO%gR Dr ds!q!K31S )(PL`s@ I(LJqqəL`cA s 1-ŅH6ʅK%21Ɛ ( `JB2%’ 0@J`)JHB8%H@ZpQ J(W 9cL02 cBr)iPIι$!>KBdJ# 1@Pڀ\ `[I!gB2&"wf 3cDH>9 y = 17;Qg%$(Bg s#$wwйc$`Fg5m 3dSDp`3#V7Bgffݽtcf>uYPg0:g;?!3$3k}ԑA]AGXDd(5a5Ь h*Cӕ!y}‡6cÇ=2#$gqk?g$b,2ي4YtfOg:au 0-7Ա0vxе3˖[N&̳W4ۄfOWI;jefW;LD ]6~:gms/(ٶ,7$7X:ulySgQnFLfqW3_%7{N%Æ7?;Pf)t>fYz1^ij-r&VٌIlg|l'7K϶b8Ka)Βj]m5,'|FgpF1c\a>fIc:v_I&]Fę7gѭ`7fVTuJKoS/&9!9ݗH`gJ:Gv|LM,SI hSB:v[K,P6a^rZqt-neSa&KODr6өrM&NyK2jbЩ>캓x*I ΜifQj\+d8;P;n[[3g0ifTHI%#3Ty%eAw>sҢ[Sʯ [DgI݌:%uYw,ٯHc;Q琤d :WHK383풰C2$BNmf2QKE'+l)A3c0!϶**K1 3YxwoE@a"uq ]ۧP4kɝH3:DrÞ8+,йdqLOʱX%R.DĎMKLcU3,ns!c@Ğ%45)uȻe.svf, *Set 2F]$:c:n,g&薦lgp f3` f2v]%hf8{tNpW/sa_ЩʟUzꮒEߠ+ctk:쮷#GF3HXG 0p(3>Y4n@9u.E38ΐ˞Gu6tYmf^a'^w3C4oҠY^S?YfwF@: xs$USجa ᄣHֲS~xñn9,G)X4kIpĜ8ͮˤ.;fyؗS tof%)pc:u\ Cݸp&3&θY [Yδ9)ķn+tM܍17q/鍊n=_e˖;v-ogLꫯ+z~$(pЈ$iE!, 2dL$q`1"hPC; 9b30@'44D@B0I2g!h9I%1ù&I HP dő@@PM0q ah8HGBt c!0И !87!fЁ fH)9h 8B \Gn1!ciKNbFN`!3L!Lk" D@ 31 d4Cfx1 c6FDF`2m @ xC 7 c" p Ш!&e6#As "D`g 32FI`AlxL2{Ј71樑s$`)$b@0hT`cd4 $- IhmČa͈$0<$y KܼD5#zRHIkflL#OuC2wDAfzT;To_6,6)E_isD,hT/8%,Kf] æv|P"8 fwNO*A/upæ[%$-W&,*qSõMToۨLʳe-V% [5Vn% o*LG&ҕB x,dVj;"lT1=N5XyI=?OȸA;iQySY_຅>q;RDa$[Fdh,DȭD<2Fg\(Qe YNE\C oqeQ"C|L TDv4\Inll{AK08+[a.La1+VH9T[~9v~݊'{zyR/Z^z8],u[yWLjE͛zYqǝ_Nj3n[ hMA [L̓醭@E6UkYCK(SsV9R<1C#+=a^"ժl TǽFPs D0텆,2v*Ky`ҏ`@4 i]f`23r͂ln,C^D* hf%e֯a@`ඩ8נTd)@q5R{Lr=/NS~or}mR[ccE~U!}Ю`w _8W5}Q".]ӨS e "x,,xn/Ȝ)l_G#T騚h@5*8%k~ܔWgSv{u` =FQۡ\zŅ @MznMNۆЦ>8VxH.ecnS~菑 TV䶠%と &ea`9hɖ2o}oYUlB<.êT+uDЁoXFseWb?ǎ--f7D lZ)bYo&LYPoMAYVcv&ܸ>֛BO E%eRl.G@1.7 n:{eUTkT ctXV?/T_ƍ:O_/y%&R uOO1jժ??ړ f&w-0p%l8ʷVX>wW?~tdڛv^p]o|ءM۶+T?U?t6ؿ5'lyƶeV([.vyumL7- p{>zqc2฽{)lǖ܉ܑL;˗?.y'z5֢?E/? O^[?%./6ϼ8GN.Q?KNx5\N|«f'2?ԎOn:{i'rͪr.8/7m?Q{ o0Υ/z3~4MSg߾SV]%/n|ֿMїs `!}H_uz/Y/~q?ҾRܷ{sf7?Ǫ]y|qO?~`Sۼ;΋7:'ЀO W^;;ѳlꢅ fs׿ =0'~O'o}|e?2gkޯ7w̏~޺nڍ[`p w5#떴V-$_W N7M 8z)gϽ]o^}c+} 'O׌eڻ?U^XI^gr<=|(g=7@|ZtN<6̽[{Jmm5ێ勶Dgg?O=]VL]~wV|.??&PJ|4ӟÏ rbtk}򠿽MSZ~E@{ʱ!/?jCM9_/f[O<|\:xn)^.c~ROdEtp7>:bS懽W[&tz-Uk]ǡ:cumv3j_L؅<_;nϟ9k޷%vc_;س,ruSy{W 5\Y8{\|3lyOo#pg#-қ.*u۷|e7v驏OS8fQ߉;rKo;yKU婧gb別von?uX[:P8soϲyRK`6Gnvg?X|μo.1Q'S"uÆŗW~+*qEىӖ/=O-{^yT}%CE(? ^Xƫo=ӏ[>*._` G.z=au\ȏNxaytO {6/Ύ_q*> ^qͻytn:́֜:LU]samvI/q#z_XqGG]T.x]jG/Z?U=vۧWYk)k'}%Ć4_y]8wxl:777|?|/a S= -gޖ>SOJ|;Թ1Yu_~O;S6~K',޶mk> إh1)bcT]C&@$,J!AD9^4qbҌNA,"a$ i  +Ġ5[K!FPaH؂$KZF`A!64.]hkAQ/D\e:*v;)a Bl NP TqڣDHm2(d!e pari;Z$JA!*G[@T>(kI(FW"J`HYM 1*d Brz<6".O@Jg?{/K@$Z٣A @A@ 2yFT@,tX`zY*]E@ 1wQ \PdYQ$.icw2+ABL, r(qG`K11 XJ\F"L{K&u'"J"651"$u"K_vcN{t9@ tBFN4Ib`*@`fbPI jKFA$+L.X% &D` ,(ԀZ []% -0(OaFaҨ{Se BBQBKi "b6CSdT,$-D. e(  ,!;Qi7b reuQs-kIF!FFr-psFPšҜwM1j2V Bd@AaB ˜r=I\&3LtIz]Fyt,@BJ&xݡBP(9}sqµD`Bp]к %Z5u Z\/9׺˅@%2]Eg}xA˖@A br$=C*apgRsN%ȡBw,QcjfTDaE%8c`FҌwbҨ5 "VyH%LĞƄ4Nn!+*&D ]5RwظȩzC?_/_<ɈȕW^i>cݻ?jm4iü$؞Riٳ d6-~fq\R.vOhJa٩z!9^w~2TV(}tEe%f+;`G $D1}y;;4Ms1+b Gnzh2s0@d.~0L?.3K6>-}|@NFawvӛY}/h#%Ξ.MHY1Ӭz>U(nYhɮ;rG&sh^O?UY\#Gk: M%2wj\O~_A{Y%K3R =;Uz2H?sp!~T3l?C|G鑩{w-=~Ίg.|gZ(AEso4`Ms\GiթsxիZϬb׬ g'8s}i˙##f eVHGΑ r]dV]A}AgTp#)s̽_8R(tXC\1ȝb=Vv ϘMt666l6/_ֺo41s pѢEleŬ]{& zPYt}P=xSh@[)c1F Fkc1hπ6Z{hgc咧gJK]Tyn H`tTVf7p3bhcx1qK^9'iϨ1ZKF=o)؛Ϡ1 r9@cv2”bvڐBu(6;7~|y]LzNp 2\Խ3\TM5@<5ԹG:}<2m11I|d0  C1mD{x‚1F@;%4 u#H;ꉠ'f<.j(]3hU~ PjDFkp< C/luj-X4Z4Gju*OO0T*W KhYDQ D^Tgl<Ê )\GpyfL5dmd* aTG˕hp86Fõ0FJ3UNhtpqtf(25cd9 +fpZpD04BDrQLr: jGa:6tp"*CT Fe,cUX^Fv 'h(JJyxxdJr2Q$H82>ZF7򸎢q/٩ёpRgtTUÕ‰ h.OC6NfH a*lèՎ &MV)$h,aW^hz<=8<NGS#^'V`*p4tTp*zxzX0a Gxg(cUr40U*JX) Q'KGѠNW‰aZ#h<ڌqRkر0?Nբj86hb43:r8>ŕRiO%9Չ K11= + UGcCcCtMLE((OP1V.E0b\Zz0r8:Deo<[X±J9;OTF6-O^4dGY.G"*(L3;QTr%ZC/GS\ ˇGTrX[Xr{(Ll9r˕<\-WDrh=~8mK##Q-jeZh-TJy2 +QQRZQ1Jɰ gia,)NPq, 둄rT9\f‘ˣ0\ HV<8R)VvRQAUhTè2I2^DQ4EX°5ES6+Q˭JDCT2it0R0ɱr'70CpztEh8&A4FaT ;#Q- 4QU +Q9l GEx +r*#QATQjp<:ΔUyAjfpyj\|4VQk<83H8E܊F+ *5L32\We'B5VT¤5pٰaM&h|mD*G ONz:Y2RKNWZRYM,~T +CQ-(*ǭh4W"$d8zJ8. 73W]2XyC=OeC Ta4l3a#ЫsO'Gh=֣Fe*,s9#p,TjƇfLP2T( +#XVQ\Vp<1lc*Ó#zK*a5DeND'+aP ñ(ka8`e`dr<JyE82MW`T8> Fa9B3#tX p9]*Q!3Q踥&TNUʍ dF*v8lGW$ l&*#_'h$ BᲄPJT0TN86QEr5*dIX3JUr9*K4iMjr'B(צð2:>6ٚ ֋ȟȄ*.BgўL`2:T^kߡۈc*… ϕ(G=f㧽.GAS-xd||>UJ`tY'#mWj' ȒkiR^I(igBG|33-;9ĉh5#-M`y˓#Ɉ$;P$T: &^bRPL2暉oj3z|*穘R(εl֤.H&Ed.XM@u€iX IC NL c2UbNbe-R97 mC xz<߯&I=h01VbQF#4:60(L3zs-vX:V;mVZ(Q*D0Ɩd 8C5Bӫ`q2)o/.N&j:SUY2q",nO' `!+ ֒Kڭ$[\ޛo;y[bik:60m .pI&qNbA#i:Հ~lDYB$Bۆ`1O\vX4䏶,^ܞLSIDAT$B'Ai{L-E(*N0nJ^l`}l5<,Hfy̆/{4yyyyy_#HqcOcW7;MCFUJȵƴ͟t=}eAGa= G{g Z{MʎR ?v•1:Mxwh|.v)7:u6U컎}KswiGxڽ.sè>'HuyFG,9g~tȹ2 *O6L2tWh6|rr%z3"IO>ɬMȬ>87my7.6tIڪKcQ9u{fϵHg8ߴio̴iDR=R*`OziYOcTTҧFiɮ$L{#Ӷ0]yvO7.Gg6N̳6sEG3D刋ges {FiuTt]##5 5rgHk>} g#vYJ ?\9œ[nn@Mү=n{o73TGjq?w{m\^@麅t{n~*A߸w32MOw/E]pm_|f^%^߯~+1 {0DKVyyyyyo 5yyyyyy<<<<<߸<<<<<7<<<<<߸<<<<<7<<<<<߸<<<<<7<<<<<߸<<<<<7_K" *DD! `PPHAgP20 "0졂~cD"b H3@ B(PDAQAQ("@!R `-"[QQ" *AabB`!d$an"@$`* *DqKt(X "(@`Q" @d@&ADwXP1#9)"3BdD&7"ArRD1:J:cHh@Y  #-10H( ,DNYܘ)4)BBQn8 [©bEHD@!a E R얶֜ #*aFA$uB{T#! %A '@qΚ 1B p L,n@p`'eIM@,  *a`p,EDS SkJ5  +qz(n*!H,""JRk!D ,YB Tf@ \' rJN SjnkADD>#P=B$@$tw"T€N\c:0ڹԞYȹJ7E8*xL: YrU4TNeI,YAbF@Q"Ă.39Cv "tn#* ̀MS #9>%XH(UA" Ȅ@ N" *uj2 "܂a,XD5ME⊠H/X$*RG(FKerI##;F.8B! N4 R1bVB! >Btp ZWI kbе:wWŦSb Aԯ: [r "nmFT L]J-3BE w5@Mp 2" JJ8rDFD!tN@ZV:XAWs8SAR6uHC+DOݍH7hmZ*HD6 5Һ*`Oc: gGu'NO@L& Djvl"M^R*ibo<8trSvu# DNoe)U,C7,}ԇ4!YJE{;0շH.:UD]Uhn|v8V`wBnȟ%;i>.Rff5}XKyW{zV'K%ˬ:ajV]nRWe4jY+>Z?YPxDP#O$=9s?X 1~-?Bmzs"͙4a gzX/>RBh]G,)>ͪc*T4'#H9+NQewد6̱*Y|QaE4lԷʗ\ݑ"@oBD~nLwgZ2u#CY1,ν4k6ـ ^Ͼ#|+jٳov?ݾ#xgv٭~k=wێ=yYv菿OWn?f?~Y xMO.3AӪ[t~nz{SZ/yRyWk28v&ܢ[Nk.(a5׼g=c9;00ao_<[77)o .o]_3|Ίw0rXﯾ}R;y,s鶊^x?K5ө|#lU{ V'肥2Iuot3~?*-U"yϾ_vws ']uRO~&k}?}Mw|VA>?=r܏Vl{KPv~_uϼ\׃-cA^t*|w_SH7ۯzҧo_o:{moZPW^~ޮUūv~yF'OCǟ˳z;_ޱ_{7/tyrґ_}9U7.~^kfK^{յ3RY_x9C'8Ly>kO~ɲ /VeߝٺO֮}%w~՝tɿÝzm%+7|?0OO|]djǦt]ώ9xB|#?Box~=ķs 'hӚUJu>>68|_yOWſ]' +vYdxS_֏=xVԯ}^_|Uwe%{~Q[ר/Y_7zbs'?񝵿|+Ϙs{SWLϜc@Fօ΂k6r~tS۟w?Ãƿ]+}MGnx_s~[O3>jo~yO;{x^8|uי.=d=g/XWfxYcW+nYM'_~8v扗{_OB]S77^!=83ՔwW?Wn״>ǮpYs[W|xl۝WdŃ m+n~' Oy_?sٙ#׮ޡ}ӏ|l<+}ov W7w_}^ȆO|ozP V?{Á?uWGWG~rc_{hzdu:;Ys~O7~tbb4nZƟy_gxﱍk}{{ ?|/{޵nӟdvSL' :?.>xǢ cG{^oZpB؇c?k꺼?,W~E;\ΌWAxןR{ͫ43RsJwww<|%Mk›C^s;+ş3;?[_]v]wgi~ڻ?s+}`ˡ/>7/7z_}IogM#yiӥku.~2=>4ؔưb?q}ŝ ùeg_Ї̩ܲ<_\E5??@KV?gh%f/.?8,F~??:okW{5w<>0J.w>PˉΚxC3 7\x;Wx{䌽oֳ/Rտ+}\l~~mxǃ}ol+_=.:Olox~1]?n˲/&n̽ʦ';/)^i^6ت5^h{|N]~sg?֔?mQ{gVpcF˖~Ϟ{NstƆN߰uǍ /9LsK~}c:}TW;N F̛i9ʚ ~3>/X"^z~M CsZ[^Ϻqe/|>Qܜ ?mh-Xc8Y+zgw'kо`{j:ﵶ/ y'/KY?c}7-{~gnNx&uKyᏓ'/l+N[;w]}e???ӷv}uS_-?#u%Zm^??}W_{֞7eW>nozo|WwL.YK^Q vk+_}􁙟WӚ>A'aoY/=ѻVo'kHy_Vǜ#_a$i.\vLx_?7ȓ:ՕuɛN-=xK֪>EƝǝm-^~gMջT3 ՅG{yX\nm=j]<[?{i7m/m}W~('Cp/ܸ)u_A=%7ͧl/;X~lӒWܳ` ˇaz ?:^7 ~ݑȵ}.s,ztsxy"|QYdrrۺKb'FOË>{Ԓ>O}*GJvUlj-.]}c7u^xn[='.Z!=<=CW=~O{C c>!k$#pjo]xݣ lZr6l%;tDV\מU.Xl?|`k}٨BCճ܌^+ah/_'] ;'[l*{wMn,/pY<rˇxϐ+>v.N;{tjc ,18<^,|8ǮxpZjFY4:+ o}8ht 6?'SwTSpb{2yʍexɝnݽ w[l}n9v6*'XCOm 7|=3 Em;Pks{6NMP~l[~hjt: 'ڨů 6ݷlcd$?#f|xWepb- ʍ{46o,,fÍdnlo|}U:o(?{w T-n4I'n 7_%֟MkLvZ}ѻN&|s o?'`_rW˛w_{\{;ߡfnݖ.m?``[ҢE{o_1p`tI<~] ݝcٿP(-ڽϼ0yL{{V)o<qͤ8e2^RYvsd>Z:c~ 6]8K-y[>OOݼ/k|ܵpkjtbއ.Eo+$^v]nkKy1m7Ƈ3ܔypC3:9wwޝoR9=l~|##JCxϓwq#6BqX{7Nkj<s]#1ܿ?lљ?p*4SÝ5SNUV qH w7gﳗ_n޻>^< Gx}8 knY7j??~ucO(Lǰ~\l/%W".˝LZ<'ߞ7g @S_Oa_ˁq9}W|x|>-'hn{ ?.m^pݻwi&A1g{}^^1&IÏG]x[3^hC΁g}#աE&NfqtnDuv¡#:=2EooD)J 7?b/9a_?%/=g]S846H`ot `^6xϱ?>Yh*1X=ցNOe}cjp-| 7][vO}M<ȋ;Uةvm6ݺ߿L [ŝ'nwOPܸcev4;n9μd]{Sg?|ǣ0N:iwtL.zpf`MjyKE|O zpo׶# ^CnqZAd3_h K垼3>sGxZ7B^l5ZKξoK v pͣ'ڦjݳKMnv hسzKskǔ'!q7޷VuTg;rƦbw!wGr+l ]wZ&[9|蒧6oyz63O|}9|On$^뎻֜x<8EK$5w ! @le E ÌetQP2/Fy|]2Lx>j2lF(P\6Q֘$Oٌ`}((/1JJE |?g=e2y(! `>A>lKeI1|?"d>fKhsB,LL!O~6 &~A)=|@H:3tS)AF`<lg}DT3 ePyY@APLLS`A2le< |rc@!r` Y||U(@Fi f ^)"A.~7V@j|R~6@^&1laG%Y%?)?O %/ϖ@dk/r2%R:cPyڈ2J*)imB|6xZaP23x4xHFkO=Ok=OiP>ۉ15yZ5y|2~Fg Ze2F1e1㛚~Ӛ1Sl0E mT6CAQlQ :l2ANe YOVZdKm|28AcQ)dK#_s U1 < Q _k=1| B y*\FgS@e2 q3Y|Fs^EU'2$.`^g d6^QJi@T)G^)CϚF֘|=KHyh0)c{e2R6ȶ2(UT~[6 C?Ȩ?2L3~/yr M& 6"1(llʫ r c0E?!S@@)e}+2i8P+)Ig Ȁ1P(byJ0 d%B.dT.R*_@rjW^9 ],`^bj *(&L % f S~ =S ty{\z+!0^)PgLh2U)kTU:i,xHżVVe' <" YE\2y U +hRJJ9|Qkrz`_uҞm2Yqicxt1țlJA&Ё(u3SRN  @)oEZ D]"]ֺ_{W~$EEe "bي ef" 0[vY-0u ,,",,a l [+V [],fw- S,`S8}!o,XG#B-A2Xfv4 e` Л,X aIرB,;z`C[K, XvS 3@"CUqgA%# lnŦ$V,:> vLN, Xԁ%:ұ=*afLYjXN)grYLvR֊0cR`w-Vzx|"l ƻ`E@-8UXblW9qde+%z(?8weHi03XI2 b)I:q)b%3uN+.C҅!Xa e`'ktYk"bz 5cqNѝ [3Jol`9 pjN e+l,c gE3JМĎ:g;w3 pL+;+ak 5O TGpj:[f쎒 TLYtٙ$I4,x;K [ac?g,S+ĉ?x,46 ?NQ48Xa{r11,3sÜ< \sݩz8' g69c 뢁Apd;HXzuG-8鼷0=d`:aH4SvZN ֖غ.a$R܄*lSu|b֦D\rj;)bNafThinS2ekŲu1 C" l-t9+ <"ET\qʗZ#@;wCm׏VU]#J#xp[cL%9/¥8`k:g^J^j :<ήDw NzԊeIׂ%#N7s#t]0R#r>-\:SmzmݦvwܨR{OWZ9?;@wܽ J>|#<ϰoIzCR3Eo¹0U8^y a. Iygh8r#849kUUGsV.#/gπۑN{ڌ <(}8@s&뱶ؑhw` tWjZ#3yPuR\ Gko~ZS JG8*sB=rs>i^-IEu=q@ 8 | +~ "]tH[l-,M J^ҒWKLn+t]57/b)wIi}]-HOǘUM$iHb7[z\pV8}d -"S"NH]{t48Sw3=S&=~4tU[뭺Z4z,;[|] 3W1S2^1NtF«]Э>UoիEݥxn< ʆR4˗a0\芬"HVlOtߎgW4)ѮLaJ.=[fN;{,ۨGV{gkibiW=XDyTWTr-xI]l[& wW].HWMe /R0OLr>uuHqp$,) Mvuk߽8ׇ+%g}{Q\PLkp*M&t.4+nFnpU,]qnR:W`կHpY]%>_ |,IX⬟r+2SJUo/bAӝOoӫ gؕNꀝdf1I1VtKK/&w%}ͬqH$[.+.P!%sM'.u))>qWU͞ ݨ,ہ:Q熡MÜ}3| -n]>򑏬[}.lܸ _X~͛`޽w}703"r)'x>)D~AEShA(`D H,(bئ^E$I0Qb!ĊfdmW -bYL&@+QZu@ik!Y-QI-BV,hh 5FJz E`V8jAYKbQ1RX1X1e$e-XI&hEQufSL ,h@*T,hW[$ԍV{;A`9%I7 @   #*HЉ A ʑ8.[H@Uz`!# *E Z >"dB2N$u҄,(T u4 L^/*+B! x I8T0Y`hkbNrꀄ5S4ċ%VlHY!eA=( , =NHD1d V~(`Ġ Ul]x( g-j>c #`Ħ  8n]f `\OZcYADPEDdwb h*QX]<EK(@eE (D$b&ԒU((EM֤۪"b`!"kD. @*"&XH!3!n lJfc(`#=d@*v='5$b<DPH(UH"M@1Z"dAHP0%PYm.3 ~BAIY`b-"02i7Bte-hN[w`Ǹ9"1"% ,lb ( aZ^D@:0"SI'ԍtĵ!%qqӖFX$e{WҟjL&23}333y{W\yСxji9Vu%m3W.,So>rW?}q}7{g.z緄'C{])?W]j|˾2.|Au͝m^A`[/z3e -6o< _?M^z?pы}O?ԟ/hM X}2>kv۫?HZͳnʲb8>od_;4?:Yv oYN]?pɊwV|w6Zx?S>Wt?l,ڶk/# 6{3>y-fimg&?veuMǼbNjToK,=u8crxU\y.|O ]q*?؎ɯ8{* ?:𽥙ooߴ'g~%:O~/9nS1g󳳚6\v_n{'j{/׽ef5^/C}G[Z8hc{]t2;~򩧲'^GKcUcua?rћN'6^x|%awܟ*+=u#8;\·\~`ou2מ~o7<ܣ:xoun:I=_|'oya3Si,k}{7xǻ9}hvb]nrCqe vG?zQeW/no~9^0~bwgK^x+=v,[yICrfP3^{~|֗ڝYm^=RK^yWc siNw1?}V5[Myc>U+cg^|/\|_yC?U m<~eE5&e{r˻~×.Y5x{͵+ܖ:/KK̦+[YM.޾e[.W|s缢IA}{ϐd Οg{ɷH oɳsWs;_UKIhrA%k/{:w]QFhYX'o=F Ɵf.Zv\<l>49~/Om;n=uxÅũ5ͳ;}'ӻ}V72xw'^VDO~'?^?M~u^gO3 =3s׽f8I|5ы Ɂh#N>oo~>?7Uw?s9|w:im?>fpyGmy^e?c&7˾/%YsrT\yZ2i;-?]riW・QKѵգ섹ּ^}7yצ?ғ.\?OVwɞ\Hx}t8t%n}薧wU:mx龟w7:?;'z[1^4r_q2]ym ;{>R?ilhon츴}_YsӜM=k ^ٻ63}ɱ?y^_|ԝoa[ֹr;ƿ,Z'c]ǝ]GeFǵgV/rCsMyh}.ĥ _;W|'dӾx1+g__ɾU/8zʎ{7W\c'>mxy$>;?p ?{=O|%g5} 9t͡g jǹ>pY/|ſ>/>uptneX]5o}'׭~9`I\O%._ݷ=ٛ[ҜZ6fd06:u t,:˶SO~7߰:S䱓g߹׶'vwnk;-}ߖO`py1w]<]3[ԩwZ/xO>9^yf{/qֳW_pç<諛Y[o_q^zەS~PHE ޸Ο~o{9|7gx>߷|=Ze;_v<x3,(tO^p[}Uw6؍N\qϗ>ćڛ]>D[O( L[xmfxזX2ѹj^22{׮|k>:snSԋd[?y[Uo |o})L?>_|sM7}xO;t\'olOy;7y뎓}eD}`~7?z8 v郧P'mWgOo?sMuufײ~_1dKaGvh~vS۾'m V^x{V޺f&gpo|:ux^iğ~j'7_1y_\t_ˎcF?JCzE0~GcqK7_Xy7%s̢_Oʿ\Yڵp|[_9~x۷Nyhh⶿~/z䱇N~=/lONlZ[CV^J%vv\_Iĩ|>#bR@4*3 /3L.j9֭׾FD{ADQ<<}kʀ5R")5dz4Jꁗ;lb4vZL=Uˑ?u&$vTm @FCLAgbЅ*F 6A 󾵖,MP$FَS~+o)5lS8 aUC394r*\V%4E9hf,rq% Zڍ6t8p); M[l0S0ۃӖ|k!R /FkabMN36b Pb(N8XI0֒bZmRRXH`2D$u;@`Tgdg !1隰S I'h؆ qfJo%#o"A͋7'K&ru.5;b}*6LG3\O:($-Tc%BܩZδAVX `)~Lb8u~ &S!3QTh4Qvތsl;qq7k1xk=P b2Sm͆6Ğ,6- VZ9P l q}XUK [ݩY 8d$՚j-d_zF,T$6h+$;K#4 "'MՅ|jm[Y@:ŤU[ '{6KF;R3BQ3jpJlmtvV6JF6pR P~":KٓdZ=ȶc0qiFfN[kAIYToeQZPQ(f!:6<~,S4MVLŏsqThfuY G;HZqˈT qx$ⵊI#G^9ZI{"%%&$95&sBz V ĝ i3I BT\Kf;$2Q"@ IƎ#fdbM]63~'uR `$ɶ'ƟnZ,Mml<}cN`[,?.0zAN;oi! d ź@..c4 08QUvt &xպZ K $>ZtC-Ly1k iJNQҠ:hX%uhVGǓ,҂ojqcIH  k$Amg2Mh0񰝷EZm= <ˠXEԞč)?cTjb6Ej>%&<3wZLzE; RUJ7!X#d&<%NƦ JN;&c17lжuH0 V<l5jEb^`; ;m040 rs'-,ڱX YC;g;- bTf6N,fsשIڠc 3SFq*-'К4P;Z5֢xNǶ9lD4433&4ƭRb)Z*]vz-$ב e V5mOl(ˉPjNp#AUŨN.O)ۈmLj~M5XQZ%gk YT&^Lw|hfq3P*$ɠ™=[϶5AXb̾zAc^RZ>.5&:SGҪtB>YL5V%fZc6QKY qkxcHc~єi0udAg3>{%V@%kl9m/NP7رj*ILۂM_C3HPWɵn}.9aNO%ZBTZFA -øQN`7+36-Ic:HC͵'  51H3aMXזLvPԌXO֢Qc&@W'nĠk7"KN;H-Th`Z$Ħu!nz8w–7:8Hl b!;6 39I 1I)QX_ 'qltSNpwS袋nO~+W\re^fgM7o|ZWjK,揚'_x0N bP ~r6HDkE ʊH(D"\O_/mMD F&#Z/*6`Q!ZU0Z@B  EDMh@K{` iKP$h=T *$X b %MˋcPlI 20V4%''I($65Jr&.oIkm(&5U) A V,(- hm,7a% F ,uǬ0 YG@ʊ{VнVk& (aq9=@F!$$&H1!Ă}#J)A2cBpo1 Xtٜ1+e. ZĥE@ H@ڕ-0*pKB 1(r-Zߩ2ǠȽ AHDc cL0ZA@X"(JU, 2$nf%F"ӽs"V +Ȃd3 AP)„ :%F U7$ZÂ%tiIUQ)!c(" Ѯ<( $Xi$I)Q_<դ,4ۘ,eW,"# %,+ LsR(=d } @V,!hn0NJT=\b`uLL I+@+.jrm$ l yDd-cҀ6*" i>J۹+L$Mb˘ fVrQ,;pt !n$ZIL1V(. X$rZ=E(dP cEb*5%H%$q @ hQQQ4&=&*!"͌žjZADYZYBŬ9a!I(@V(\N@H@"bN\&:K+JA(tTJ֬ud4YB YFbD&W(Abe""a LJ3)6A`DT4)16M'@Fۉ$P5!#!KDbVT7-2%BQH#XD&`$㊉(2sLi2)"-+o<ЀniVv%;B`W֊QP M Hʺjdє0.Jc!,Q"a M %V+a BĬ A)bwDwf 4 ȬH 0"JL$ E͌ uaȥ !J h dpKXBJPI@[T )>.f{Ё@Th$22&eYX ٝB 1ѧ =H AR0Q.E:T ;@i F!ѱ,\QE,[DRB= "\YRU泟죏>ZV:,T^w_/_϶mve{e˖=n6|;o;*%BDH$rl(朞FEBH+ܤ1KHB @B7#@)H'vݧLn5P *!D rGR7X;!]TAyGUl|5{#(JQ>?AE(ADޞz %$M;?e 塠<|#[fΜ{fs0E0Eƈ„+,?5SM(P+DQ 8P/0))@z4(w(C  T/=H (O!<PrH@QP-B h  |0&E0kA#cB_cC"tKc?pֆPRڀi0⿜2CJ<Alk>` \| !п0&N!BpA@x(Pxj~E!}1X-bh#JS$0|QST?XKf(J% $aT-"Id ZRȰ(1' Lò&B2Y |LE"{ebB٣H"| @SN@"'14%Iϋ"A,#x"ރ^/C0^ L9 X"-$XEL D Hxc%d"!}%YhAeċxi/#!$2"Dx0EIF z"HD IQ8N#Ȃx!O$$ #JJ(S`E hH8.YDDB Ҽe'Dx `QAևL12x)(`C 'I&ɲDY& ($jD^H: F˼+h87MD3 E  9 E2 +˘!zyCF2O$' dA%I`kad/c dIEZ)AD9 b\$I%"D$/J<$!(3,8-s^"rS܈^b1X"2AH,űH#˲,H(/9D% # iK,EǴA0'- z},%{$ n1Q0HyeD )4EYȂuӂ%Q8^>%8-#IY IXM/ $Esb97fDFB^#N'zD5 R(Iċ"DK24B!9ˬ4+`I"Dy| ͹h DVFHxI%scX$"" "q},jX` E#G$ 2'H^0Xt>yNBnXG HBH +cH$N"f5"!nQ0Ș<#qQMb }xd/y(wI.y a·YAd$$ I3D}DeDjy/$1IƬ$2H"Nehhڍ#Y87X1%I$B,Fna'di^@dIFFdDL149!GH$ q"xh<^Xd ׇ8>QO8AdE-9,%I XQb%-PDX$7ODxIyhax,ŲbE`N%$$QOD$#x' $ẕ(T=f0BZmqq 6O]S90otoQ5滳 v溪sChJmQ2mdJ>X=:y6E1Z-d AU>dy5'Er|VtSָ:*&h](K3W'r":2tBO1crQNyZEI|o(υGh 'h u&'5ɦj!+stґĘx_%Pgb". e^cVBOaNpYtڜr9x8d}w akrWE Zi8 CeDTjCW(.*(CݖG1ml`]&]%>a()6霰/J^e z'' +cg!ΈVFDє0"9ZZ`Z CPehq(d/iMLih+U:(st:ee]ݪX-]i%ΒPMZShqe0ZW&ƄʋI4*l/9Y+s&m*1!n h-# ɳ;RDp eJ b{\A)#-B #i4`ΗWCpK I, i)q9 `bdymo,_f%ѕ6+)ԚrM ! ##*9!ӰXO thEY|!Wq(rk9{χD2w2Ҋ&VciҘ i]6h #Z 4,}e CBF(eCY6Z̪5ZCpICW|O3L#Vp1!_(p(m|L% 3K+j{z$cm|Xf9atzb*SZ]- 5ciJeGVh$W!@tB7@<(OF9j{ |H+FH*M/(+Xu* jBbM2Th> zTzjLHن))YI++gpP ` ^I*#!#llaYbԸ\.w!/i(Ѻu! [qB_.y=FK֟|Jl("lZNQ ҍ(,^Zy"Y:qSmLpMI(Q1'+,Cl-Fv>"X u"֥?`fM)ZW錋3$Dp !]"*Zbqm=kUA۫sbMq8D':8D4RӮp#*EW. USЕ-*=sYޫkfsTHҜҹX#񬥮'taE~Y'V΄GJi|6z &I2z bN7I.F.;5\jIe}T$%SE%7(*9XJpLh!V9XsfBy;jK eS8Y2/,AV,Dv&/5ت5fWaNKmrnD5c*RZ؛(V\=˲eee @ Tsrr4 !?(*tK0!vykDQl<-!Ar%IW?7e$G~/U{{ Q1$`%!pu,#@/L!|V H N/dd L?d"#쏯!"B'9P@@2+do282{CKD}7#2iFxkQ_(#D#YB^G \ H~1\I c$xm,רADž&d1F<;B(mZF2ɈP}! JhF$]i@h|ImC_V#XʇOBHB8 "J 4]t?Ұ~FWJt%^ W4͕Xh+rJ )@Fp_?dZ( R ]QWκ*ԕ[ &J!,UIuB_)r/\i(H+!:Mi@@T18.v S+Iࢴ z_0 0ZBq FJ m_\S.@?D)IBZD pAj-ȁ}eKTrJ#Ji'dn &@o:A0p^ |34DL(B(BI< U(h  mrJP ̃a$QzkN`TwAiZA"tP6ALEqM!>-"dU+ʸ@J$p8+]ae8]@w]>')A6`> 2xA:C UCR@XF $~AHFK2ƔȐgg$2" >IࡔzL(,_} aE)qD OOՀ)$È(!CPH+A3{R; X ý.22WNB.a!=RZ1!EP KMAjoMYF4X_ ?)H N) { ~!DQ!# iWRguȓ#ʯ ` #!,!|#%ߌ $w['8OISD7%ɴAJaJLi SⷨO_@a}L08D"#d)W%0%P"* )(;2x(B VP2##- $`"=cL莲F&m!90FsP$0$c@SA4eNc.)C $bW.ȇ ~6X~NC ;0+Ls ,b"HJ/柗TЭ4&4 p`Ph)p< <(P`*_@`&!"!f>Bt`TH(,Mya~u !FEh!L#F{# !X`߿ߛh /a+zM"Sߡѕq`CD(Op` C@P cⷂCI(XA&N  ΀XeD@Hd31`8)S(.ջf+kIQg]ub`+ 4#+7l_B!SYWUB`M#.|WпDѤe+w \T jH ^i_+?o+UW M9=HP_u;UtͿ_$4Y_+RTP+7'$ )Mj6Ίnu F+R5_ev_i,nDcEkTאrw*6zuW4!mj!k)khp),IE,5T=#cTSRW֤\.5j)F\Z::5*ua2A0X|*n5EH,RvWҸ"+ |iFW _|j&6^xu u4R`!+PW5j~u*T+׭9Aw*a\QŮ,_JoJj>x(CPI(:g"B|et zl_ _[Z]]r#!b9X5ITMzr8*=Qe&9PS/kNtU^5!0]D DpA׭9]5Gߠc8u% JjշW{!h,2,_uwkǰ+ x ]\[lQQQQQQQQQQQ=j=1)LbHt wYeVuWQQQQQQQQQg w:5*䎊 ӘF=#(ܜ*CdHw********** w's*՝**********ՀVQQQQQQQQQoBOwg]EEEEEEEEEEZ(ÝR#~j}DQy^B,˲,ceJupWQQQQQQQQQPU\\\UU,<je!&)<e]k+a#vUTTTTTTTTT'+ tޝ8CtaW1UTTTTTTTTTTkn򛊊_Mq5߇P PcTTTT>(ΑV̿ cY)J]QQQQQ w ,˲(!%! ؔpb؁U% V'8 l8 +F*EQI0LDDNh4({3(P (NIIZf/J14M˲W1cF(j%%%qqqVOFȖ8fY`0t:U>(ZFYBFcnn.6 VeňW: \q[il6~-ETAvrjf3B8\#t|1EQ Aj$Ir8PSDQTopWJ~۾}{hhhDDhZZp8L&dնlFQEdZFde)2 (se˖mٲY,ժhrssΝ۱cGdBFˁv&!l6 AZ3g*++ 2[рDžFdCe *_|966<)ڽ{劋(iXjpۯ2i*(\YYx"##  eEEF5. c+˲ ,@mݺ5!!Ai\ :$&&\ ^VVaP 3Z`-[!аThc,{np8Xj.oj###–.]ڬY3BCC/^dɒ={ȲoXL&bff3LaI&u144eYYFcqqj׮mZZmEE̙3Ҿ-Zv 0 *lY*ڼMNt|A.]ZjǦMrrrK1ƽzE_~aYs·:|?LٴiSff>(IR^^^ݺu~bbbڷo#Iݻ9ү_?XNx}ݷwޤsΙL;wՋ͛7{˗/OLLp@lllff9s>ә9f̘ݻwGFF&$$$&&OX 8xޣGv9qz}{9A`YV!N8ѨQʲ|%^BPVaÆ 6|G-k߾^%))Iӵi&%%ab}ٳgv Bg}?޿.]l6裏ѣ=zѣGEE`[nbbӧ!rNNNf(jٳcǎ/^ׯ_znZ^^`@,۱cǁc㤔_,EQ8pFĉE%$$Pջws/666::m۶ZVW(7n\JJJ-7n|ԩJ^o:uT]]`;vY8öڂ}J4l0AjN!df͚rڶm۵kWaΜ9#2"kҤ}ݗx񄄄!CtС6m0`ׯ_jjǍF$I&ĉk߿?B`0h} 6kڴ)hoVZZAEEEEEE5 wpt^dɁ D.]`Q[n'O,((cF$׋С.\ 㜜 zajժլY{oɒ%_uO<9sLTv풒?9rDz<vAbY²,BnnٳZw׫m92dHϞ=^ex۶mdɒKVTTN>}ڵmڴq\P_9>|pff֭[flEaDQx<ǕĜ={ܹsʞd۽{yŚD"hж`;!TTTԾ}{oޡCZjvBfϞ=o޼ xҥ,¢{ d&..w ^!0ڴinXfϞr\*j7,?SO=dYx<}pԩS 0{7mZ۷ooX233ϝ;~qLLLXXXyyyrrN;uԩSZn-bhh(Bt4n4͞={JJJ2225jtĉN:K.խ[yyy!!!%%% $EDD\|p\3gΤV$IJHHp\E> tah.]zSSSu:NξCBB6os}9sp@zرCծ];33f%''f!IRUUM{MKKkڴ)U#|/˲Nϯ[nHHQ`J:Fcaa!!$>>8|r .]Ծ} .>N:N]vEE󰗣eٴ={4i$99ܹsyyyu>vX۶mrrr|>_RR[l}ᔔf͚GTQQQQQQuBF#Xn[$٬YxA q,L&t^_efY)`gê<ړ$ c<a 8as!).^aۡPr8 4x lכ1v$V*aq OQX,_+?;:+߸\jGYZ&? D[E/kiZU!قv)3J {ur^c{1E˒@&;r ͪߛ{pWV} E~kpGDqgz UTTTTTT~ɜzw^^κ+/eNS[V**********%(ᒯ[X}sm iYb+q4MxxM18zxM.(j>7Fd:vU CB(0MUUU:{CQ| AS#6.c v;<55αv=8+CNOI&EQՂ-kXBǩWQbIrCgM؂w̒$A p%С]^ ?ݤJa}OL&A]);ي_A-keYͦSt*OޫWB(,,A~t^1BHIt*b@í! :!X~p wiuJH%⸒,90@o 12QR砠p`*qk^ )"7+Eq_HA%rfffJJJxx$I}W>1$ ,IV9(Ip8^K;8+b2it1!X o d邫XyvPTyѨhxQ ZhRTTTTTTn `Ȳ?6n811RNTIL&㳲{\`?s_ti.\hذ;={V=رc[n0 7++kرӦMQ&*J[q1JdNVZ,h4 z.4W_m޼O(n{>oƍ#F5jTzzoֽ{w:h Vz믿CݼysHHHffԩSM&jMKK۰aû۪US9re˖#GE`0^>;wdO6mڵÇ7mTVVָq1c̛7oϞ=:u0 sٳg[nvh47N(~>7/3<<_9r#6l?B}Ν;O8ҥKjzgfl;v`xwndI(kۿ$IƍܹsFFFvvFyl2{ss׮]m۶>(mx6msSN=vV7n_bŊ3f-]4>>~ر6mZrehh(EQ&L())OFO? 2v/_|A4ݶmkVV-zs\ӧO/^|С6mڌ=>(--u;vW޼yVZx{9eU`@.\}v/]tѣGߧOQ'O믿oW^oprO0 S~M|>p>:+&%%Y￿QF \B7O:uܹm۶J^믿Z,뇅iZXRIi޼yXXظqvڨQwy'...66vSL?~/{o3wh4?k߾}׮].\ѦMMZ<111==`0ݻw?}mF[oM0a֭Wݸqʕ+K/UWW5Z0^9kܸqBB{ױcf͚y͛OYNڽ{XX~7n}:Mӽ{3gs=W^^>hРQF-_a5k,Z駟~衇O.Iѣ֭`%K4jŋaaał Pjsܹ^z;wnʕ ì[w3fkC۷oOKKkР๱yfqҥ:bXŋDDDH裏nb N>}ԩꐐ+|ee%qUUUpA𙎍}MַoߣGر *٫W/&>o߾ڵes+V/xYDQlڴa=͚֭5 )..F}7,FaYt,rB/((0%%%cԩ[l0aBZZV-..nժUDDx~`qgXwk5i7L$qС˗/׫WFʀ|iiiyyyUUĉ6lHtyyyZZ!UV%%%>v1==~ zWJKKtҫW/sРAѣZ-gG}Tv_^#_~ӦM <߷o_,bΝ;f~t:mJ> :%%`0w}W ٳgXXX~~>~rk,R6CՌ*~'N|ᇲ,{D<_;k׮IIIh|t:u:ݸq&OrwBA!%f9g۫V+Xz۹sgVV^ONNfYVegg6aÆ;w ߿>HӴlE^vh(:'|ss9 B&44`0 z=o)--ݾ}]6Xpŋy晹sokt>M>cn[f2hv8?A;vlϞ=].uTeQ_qqqE4h`s?yqN>x„ cƌٲe˛ocjի00+6z|>_|ѻww}744A&igϞE%''f (G'OW(|p BBBUn8p9r޽-Z}n_ZVOEw\YYKJJz෪h m&`0ڹbi0!6`pALqIQjE8Nh8P!?gΜjJחiEjڲ2V BM(r\fYєqN3<<"@CQDQ4L6k1V烨2`0fdE2$$l6B ƿ$IzZVrGYYو#222͛r\.N3 `Sʲ n9@Fb`]Ѱ, hN'M_ 4_yynG< EX@0˕$tao?𔊊2q\bb"XJ/FDD[ptPrz<%Z,*EeVnuu5`F# \sG %QB@~%j]zuAA?ϲ-Z`\.Y!nRG+<Ӄ^cÕ+'JeQoFݕƂ MNA6`20۴iӯ+RY,[@9_w& R 'G6*--(Jwiw******6.ន 2KKKKJJ;f_(p1 we,ːBw&0geJ *?OB Ý{fpxQvj5A(zz^ Wo#""jժ< ,Ju̩`e*JE1 voiX+ٰeh4qv*J],~j]y'uJO* P*|(ÒwBCC.@IVC5_^}SQQQQDq,Gu-d2}pW<U(*$3$'g+1AQl].n<8܄JG.{Y5~] >ڳK춡䩜NQxb&M_kʟʕ9Y XK%uNtUUUYYYڵBN*%%p[7@ŋGhh(-Xz7+++66V8 ]L{1>|pÆ ! ME\`IFUdvWp\KEjx|k^^Ь999f9""BghIZ^=xv…TeDžRI&Ik `_¦'NŅ ;Iksj0k(9,J .*fIQUTTTTn[|1{LիWڵp˰6MF4EEEǏt]!jժ~p(7.44>p:k۶aönW_~g}_[[oeի裏ڵkٲe N޽{ő Ș8q|'|rI&͟?v;699Eq޼y'OرO~v])G2BH$;/'E7$͜9sѐ%PZZ:cƌݻ?#k׮ݹsgXXkk׮-[8f͚⋐Ӵ;woꩧӌ+V|Ç[NBjLd`)8&-[G(/R-]t 6TNLf͚ BUUUOîEn@n&_tĉSN :T |}WI_Xzuzzz^ք^8ٳg;*;n9|rzƍϜ9?W_}{…ѣG7nxҤI dNvsΜ:P|򲲲*Ǔ{կ__/믗/_>|pХKBO=Tbb"EQƍAXzuUUUEEE|||>}۷oʚ9sc=ֶm .4mڴwpYtsdYnڴ۴iӹs缼<ЬYN /ʕ+].W׮]/^xܹnݺժUk…4M4ҥK۶mTsiQFu~:u_|?2|222VXa0!Cj㏣!sܹ=zz&e٭[&''>͘1(//g/t<Ͽ}VMJJzꩧN`.oܸ_~i޼y>}̙SXX8dȐӧ#4ٳg?䓝;wر!ԸqSNČ9ȑ#KE3gΌ8vXN8;thӧ/^l_yCm߾=>>aG9s\tiС/_>z(!iӦh֬٠AVZy!.\t}MO?Tǣ аa{ ,wߍ1SN?|bIL-Zc֭uIOOٳٳׯ_ߴi?giѢEXXXee%KrssywަM?0$$G[le>x௿ZV~+,,|#""@Q,Xҿ˗C~QF-Yo߾EEEgΜyGv/((ԩ_|ѷo_wߵhѢrĉJBBºu,XܹVOAEEE忊돪N3??k׮ꅙ?x{/i5:wE ɔ/"FKHHСC իצMLg6lXPPoѢE f͚?߯hN:j F#B(&&v:tҥK~Ϝ9 8дivڭ_o~̙ .ݻ?uTyyyfff߾}۴iS~&M|&=zO?١CO>DHuǁZ7jd25i_ͽB<@hhh^^ovvٳg7oM\m֬YO>dV^/|1{]v]x?>CVdȐEGytlnݺ}ҥݻ4hЭ[Ν;oذԩSzV-[~=|Tо},K\\\ddÇ=ZXXxĉ:u4$lժU޽/^E0`ѣGfϞB.FSVVVQQQQQQYY ]iiiǝ8q[ngϞWh /))A9mێ1"%%Yf|q={,_~e駟aڵk=zС BH}W_~eϞ=VڲeKׯ+\pd2Ĵo^KKK۽{7 r` [ndddڵ- Bj!F-rTTTjjs.]j}>r}?;'EQ˖-xwN篿pFY!~#:w裏:u*::d2!^|Eɴk.tkbbbLLӑYo=O/2yda>Ct׏%\.8rԨQe j]vꫯx/R^^.I00[ϊ8p8\. QQQ6Omxa  hȖՠAkZh\әWXX;&թS< Vqq1!$&&szӨQǏUWWGFFkf]vTTT ,KHHHyy9 Wr @-*|>_TTTDD---/((˃)Sj׮=hР={8EUWW|l͚5?0BG˖-Ϟ=|ePII e!Vn}` <z痔(`!Cj׮ BN+qvɓ`p:^N:n h ۷oƍ'k;lLL Jɐ{cF$;;c}9Peee:u`<=PQQQQ\e*|׻\m_C-[6t?~|NNڵk^o-Mve˖u>h׮̙3{ӧOoڴI5m_0ӦM%iӦM6hРgϞG6~ t:n_lx"+b۶mp޽{UUUٻwnڴ)8[V0k֬DGG]O?\.x2iҤzkذaaaa`QտÇ'%%_ׂ *++aS РAӧOt:^F1..'(9`&:p/ml#[~7xM6 9s={:w#JQVy8Tfiڶmfdd- ~p<O?MJJ5jO;w.\v~AQaSO=W_aGo߾ѣGwܹUVx###xt^ժr7W%`*..anwhh}UUU<ϻ\.V+MrF²,˲n;,,`0 Qm6  #wLt:1XEEd2ǁt:M& 5 _QQ!Ilx<^`XJ 4M8qh՟}x^Hb*Beeexx86fo !u( ,R)H2Bna0RwBHuuN3td` *EFVUU~ t@O% qeee )z@b]A`Sv@A$IҔ4MO?4䇺 ϏeYz_1=q zY244T`+++%I)++g8 .Sn+fƎ۾}.](mhz (P<&p.9^/g`_RpAa+of~5k$R^7RjUUBHEŢ$Vbk+** 0)9ydNNΖ-[Kx@QTxx8ƸB5j ''G.V ;UwB Ft[Fe3gl߾b 0񹹹?cXXX~z=7Q~~~TTԽjgϞEF;vW+ Iʕ++**y䑤k5ٳرc4M^w;wwWEEEo󅅅qqq52՚{IIIyyyJJJpa8aGp˛\V\.MfdNUVʯp=hxFjYVNJXiHpX@08*uHtRZh4 uEJ1 & tݰ&z ި !Yz=p\AEVVVZ &"nQp#ݸמ`]y-psW="Oq 7/GyGi(l6x+%G$n-d{GY!ջ]EEEwB;/_$Ti|tZkAA ;!vPnK\eY[rx Y aw ]opo \J&]}"f!!,˽7&E>bt?ZA4s@Www˵";YEEEE1A$SQQ ft:Voz=8'cNhnz޷\114+5 =QNj&uQQQQQQG B;?o%"V#Jm^\7I]98yS^Epuj\$Pr>|NQG .d{H (CA9KTVVBl{PyyQ` SwʪP S yR  O|5"_ImWRC@hnk.XVVKO/, |V~ 2;;{ʻZDY[l9xԮFun 5>KnJ/ (.5ꥢr/Bp5~m'籱-ZpS`DQZ?>ܩS'*{`2+V;wݻ5k0̘1cvݵk׊ӧXI&[lyףjժEaYKIIq8ÇKJJ6lm۶ɓ'=ze˖bΝ&L8vXXXXHHĉ7n8gΜ͛fff˽{>qɓ7n5eʔӧjf OIIKsyg011C4BT|Zp7} sqqĉ׭[q\ݺuWX1}Ay}mڴ?~U4Mjj~O?8qaÆZB)(/_ٳuv|$@1H*5g2w L5kr. >.7jvH8ym1v\v}W-Zio5Fz~M6EL:u,֭[w ,ػwoV~y}w/_[r%8==}ݺuӧO?w\֭e[1?u֍ݼyW_}y԰ӧ/\e8p?4-~g*|zw}^zQQQ<ׯ߻woZZg͚k.Bokժ10aի#""Ν;w&M,]zk&MF *****wBHYYE Ӥq\ll5kBBBN#ȫbZ-j=rC=ts 3l2 gϞGFFڵW^,שSg'O4iryqƍ1Ƌ/>~xǒ%KFѡCӧ;v,;;iӦ!H:jԨt\n]v=S͛7[naaa={4|M^jժ}.]VZumƍ{ eYVeټhѢUVmݺRԪUk7>}͛ϛ7o˖-z~WFw}W˗oذ'=\eE:u3cƌ &:tO>ݻw?tP۶m8 G}o3%%o><<3LGΜ9SN͛7=z4''iӦl7'hѢ2##cƌ˗/ߵk!57l BJJʗ_~믿;v졇R̟??>>~ҤI&)++,;;{…ϟoҤիhѢ7NjڴܹsԩuC\YvLꐐ>`0TVV~˖-۷o_ 8ȑ#xGmݺÇ].ק~:vF͙3gܹ?#quA?~A̙3kצizȐ!eee2L۶m5k'|ҩS'hN:aKKKhݰax|̙IIIV믧NQnAݻI&w>>_~y}_… SNԩSVVFy.]ϳ, _{͛CTNvZޤI_~9;;Rz_tK.QQQkEEő#GhSN~~>6|#ZfVNJJy~?sB111K.=zSN)))gϞeeeW$iҤI-[ϛ7oGǷk.++kɒ%xϞ={nݺժU F|>`Ot!!!s.]4l0PddbSNݰaÈ#hm&I:u$%%lcǎ5h!wҥ輼O:.##6e{^32zhBc )b.]fϞ=`SNA?BUTTF gϞ;wfFjAz=̏agȟF s̹xF|[~LM68p`~~>PBtٜjXBBB Yhh($ׯ_!h"oVVVܹs 6\f BBڵ{'/^ޤIBPNNNDDN1v裏Wn]V~ii)t%V-ƍf͚%K, 9SYUTav!nAwy'**W__￿xK"Ν;]TTWa0dȐ>Yf @ L&Stttxxn˃t$PTTTV?W^ILLTdTTTT\_paQQ37n|n2{K.UTTƘ䓛6mڰaCTTTUUU\\b9}# t:]>}vܙuznb]vyyy۷߷o_HHHeeeƍ99rիwq`axΝKNNO<ѭ[{K|M&d:~cl6EQ 48y$XQQQ Xp޽{[hq1]V֭[׭[N:{]nh߳gO׮];V~UV={655p_pNj۶ VUV 6,44ݻw6mn9s,ˈ#C}׮]mڴپ}ձce˖Z<#[ti6m:v{'N}СCe%I<ϻ\.Ţj(jݺu!!!:uV( xhaDE8]ӁC#Pq itB6k/Д< X^dSy` 4 _f]W*****`A8}tddd$x^poZ+a~=,,&%sss{葖vw+{BB;̣J5KKKa_VVΝ;ׯfcΞ=+rz!EQ]`X㮢#Snn_ c|ii);O8cY҅&g)+LN:~^'xzկ|#BHpkoשS'Nx ϊ]N5Ǎx /׍*,#n⿎SNjx ߊVgZ$YB/?ɲ },En}] =8Q[68$Qٛr+*u]&?PvUTTT7޿FS4F)|PpM oXq|=1`7Ȳ|*В$U%݂q p8*5*x֋ ~Vf]W1^ `7r^ ~ٻ tevQ~THpWSo4 $KV{>0t\ǞRrp>w`0ܑ.I2?ώ4AuQQQQQQ+O~pFKpvn-<<b+I<^F_yY J^%B9\]+%93.rԩ'NBp`k_|B6[֡NǕ_/_|Ey Fɓ'a ;v)gL ;z.w8.0嬿S+< Lwѣk|,^ʽYYY?1]BGUtO6x5%hhW~EQ$18/`.//GA]~R;p@޽Y|7_{LI̙3eʔ9s V^o;Bƃ\e f%𮄢(Vƌ3F \ >.\֭ 'O\dwuYR1EQ`4_>''G9;jvWx )χi J6{ڻIl$"^KpR4 (\`r VNR.WS*RCPY]c˂,\4o>ФI}> !`g˖-EEEoosqƍ1* * @pڵkw~I[oҥK'=.S$)2T[A)SJJJP褈]iAx<{oodgg˲'7ny~„ W_}uUXEEEV4=r "^xiӦݑ$''O2ekժ4 Ү]G}?^b??jԨYf!F?hC=\'1 SZZ:|&M7̟?Μ9˗/gB=%%c;6--tN}vرhѢÇo۶_l֭[GDGݡClbٞxSNo~O:t(!`0ܹsΝ/͛ӱc5`ٳ̙3s>|xvpÇ׮]vY-**Zrez.]Ԯ]˗ggg7jhРAXQ痔@ӧ_|駟6}ʕ+ ҴiӹsVTThѢGӦMyO< ,sӧ_|#@"XA~g}6<|xٲeaaaovÇs7cƌC;w8qAÇ_hQ~~ٳg[l/^X,=`|D{)--tǵh"--O?=tҥKԩs̙og9{QB?7n;99yر-z}]M5].u:~mn***O8pBK/4k.c6۷o߷o_Ȧjڴi޽̙iӦ\9s 6}ׯ1bΝ;srr:tЩS1cwmƍ x<ڵk߾}{^~}UU/Do`Ya>dȐ'O4Ms֬YO<^tif$Io7oφ=cz\UTTTnh-A`Vշy'!7o8p 퉉yyy%# CTTԪU֭ YK?CDDD߾}!СC_|pL Znݮ];0Hk֬i׮BhݺukР/yƍPxVt:;ud46mo;vC!epݺuۺuk>}^xArssߟ3n8`͝>}zΝ333-[5_~0Eݡ Mftt4IEwi=o޼W^y[nl0bĈ#GDFF2 o޼YYv{zhŊ,O6QFNk׮?͛׮] ys.]z}]~Iƍ ?sΨ.]ڵѣ<Ͽ[]tdYܹsGڸqʕ+_xΝ;:uOm ؟p…͛7O2eذa-Ͼ슊޽k׮-[_j׮3Ϭ_>xK@:uإKGk׮k׮kرmێ;x#G3gҥ׬YsС˗4=eʔ-Z'NxG>|xرъٳg[n=z%KX"--7߄r(:#$$$,,' UBh׮]f9"""%%eݻv*,,$)222?(ڵc=tҋ/3f}7o<GYV'$$TWW9rG9|zz:B(<<8vڍ5*55Yf}EE˗_'Oq=ztܹ;wv Jdd?cƌaÆ3FgggkaaaV*++cYÚ=1f֪U~05nܘiRQQ~xQQQQ%Ug˲~a{q+p֥K>_=)) ¶˗;wwUlݻw/YdÆ 8_/**t/\Q\.WRRO<1`{"9tPy߿|r7n߽{we-/\PPp[Λ7}+V@8DsIx%-"R,HQ !gРAw_QQΝ;KKK{ѪU+W=###ϟ?*))s_l6baÆ͜9RVH^{gpĉ !oS^MtTZW^j& !ʥ:wW_&M&  R?t: p (wBH$<ϧ"⢣CBB8i:--fedd f-,,<{Ϟ= "@v=))3fV `o4^wZ***ު4bEY,ۭ&ZӁ qp$YVLӴ,˗/_gϞu\>Yf={ܳgOUUw}WYY 3k֬ݻ7B'ҥ˗֭KӴ(5F 9aYVӁ!& 3'(cx#Fl0d!׫9h"t:a&!%2dH˖-ʂסeAt% O%<ϟ;wΝ;w`0yyyΝi:!!յj;6nܸ****[j~~hѢiӦ}ӧϟ% x8]v˖-4MWTT >?pִi-ZԳgϖ-[~gNZxqΝg͚ղe)SK'NضmVmܸĉEQ1cF:u\.g}v;tPN+O?ݰa^}!C=zQF,/Xs{;v0 t}„ $%%l?~$IÇGSPBB¨Qx߻wM&Sv:W_qgۍFczz>{Q֦M'O g}VI.g ۷?tШQ?[0t/[VɔܪU+eqqqq,~w?<^`Q׮][]]6lذ)SOVKQ˅unݺl䐐h5k$$$@hȦ0dȐ>,66_|g233m6[fzjԨo<811i!جYYfUVV*I+f?cǎ!CfV;`I&:F#@f QWZuVa4hǎ^\\\V iǎB/_޾};q/B/pٳx xtK4Onۇ h>**gQ æM<ۤIE !dܸq,~G{Yp!0&iĈJWȑ#Ν1=ztJJʁF㏋8eʔ͛O4瞻y9?3š(BB|>N'[V|>xHC`sm`ydNe-fFh00Ɛj²0 1,j4p܄zRIy9\( WJTC\P$eM&Sraf2썏D;9Pt: !`ÁmTZ@:-JJJFfc8xF#JIrF`e"??ڥvz>86!vû% ,DB⼼M6%''?N{m~~>R@y^5/k I"2(Yeh4¾lh$I*܋0 N`ڎ;SN]t nV %~p7L,{^m a4!+a8Io9dȐ͛M)*0FѢ0 <΃fc oAF(ǎٽ{ta*`HKK&'OO!][TcXF#x^BbQMv<(O>;2*a @:[<`0(kVOB7Dj;*G*df(BH(IOp9p0qM:k3e;kz?$$!=d* K[ԺGZmmmպV*!CH!y_i@D~y+$}}s]W1+R=x<Ԏgeersso(V|F2cx]v'S [Zt\˻Z6%`0xɋ#6`B5 ƌ/݊- ,;>pk}e`<?16*d s7`k 2wAZe  Vp8ϟ+++OOOO?&kV{- h(L0Lx[ǝ666zxx`Өɵ_n}%Hhtay PmvֱeFiB1S z^$)uNvC uՁ,b1D:j[[ci- iBDHHΰTT*>DN455egg 2Pj>08rAc7BM}_VTT`@QU!B$|cbXcr"0F0Fmb5|PJ)jѫ0CJH$~h4 fabPTTt \.ck`0*e:C PG8oPYlUJpe`*րS/k &`G^o"JczzNPOI$RΝ;hd2LKK۹sgBBw|ܹs<֭ۓ'O;vъ=zYի ȑ#?S݁G N8!z}w%!! vvv7o>s  )**qưa`jZRѽ O`$?6`C5Hŋ+VwttT*wIMM:vÇ?~lkk{Ew^H\ƍ]F=<<~ǏwdGGG#L0ᣃ^x-KR)łI+TPDDĘ1c P@8s h@>>>۶mwޑ#Gn۷)S֯_ |B|…,kԩF8p`vv6x[zٳgtT*U(|>rT'N=zt޽gϞB D"q̘1>>>᧟~^nX,NHH`2w۶m?vƍǍQ=zzgς펽=--޽{SNΎ޵kP(,((4iB޽{iiiL&s…w}Q^C?3܇?.//?p3za)wH---ڵkCR3gt'ݻW^^0iҤ5yao>P8lذm۶Ϛ5F?~&L ۷oX, >|rssAn ={=z۶mFH$ZÇ,k2lӦM~iuuǏ͛ٳg;vy„ WzҥKΎ/_0`mzzJ?^߾};Bh֬YҥK!..ûw.++5jD:wFsppP*d<{ncccpppCCÝ;w&M|rмy&LiӦ߻w/..nРAk֬><ذaøq㢣g͚BhذaiiiMMMC8q֭[r߿ʔ)C ACQqݿƍߴiP(sssdg}VSS6w˗/u5<<СC cd29%%JT*{{^zeee c~Νfffk֬t:/xGYzooǏ3䀀!C^d8p` b0۷oo&L01^k^`wUcǎ'VQT'OFprr*//LP(VVVNڵ3B|a$3׮][UUg|||!䓥K QFi . kjjP3_\rذa J=} ;;;Lnݺ$_vl8egg <ٳ$iAAA`Ȑ!fͺw˗ssscbbN>}IF3 N@RԄgggoo'O(+V;_)..pT*}$>r-[\SSӱCGͭ_~3gDqqq~~~111Տ=:}thh g777<ܽ{… ۷oӧOeeoݺl2"ѣW^:66V"مx֫W/ _EFF"\nyyyϞ=;ufoܸp(hH>cG-b'OƍWVV_`c)//T*=s ܺukDD޿kRM6EEEUTT={˗VVVcUUUzԩF8ao]]ݘ1cB L&oݺ511qѢELTvigggaaQTTԹsg#VDL.&` xnH8uիWa?cF ܼjժ۷=Id۶m+V3±c*++[0j5;+++%%ĉ7oTT#FXhQCCBe2YIIB"CM0aԨQPȬ1cƨT{={ݻ{VTC Y`>n߾}s!0ٳBƘ$yLwE&}`%&&׏7O>?!}?9ByJLgTD"QT Ɔ _R0L&{xx0 M&-[FрB" }ٻwѣ x,--9T*=zU*ǃ(<M 8vBhǎUUUd2aryddɓg O$͍HIDAT$H$&d2C]4ŋ?~| . Ν;׽{wPxxܹsy<+PT*;-D!FpV^=ydKKJ"\AAAWvÇmll$ onn6<*dX5l0.[}^^^W>sѣGZmNNNQQQAAd ((BMMM@ğ5k/9 akk[^^pbq@@@QQBU& 4(((ҥK]L2L0?9Gy򥛛ۤI 0K.]D"BCCqh7n677wtt\~A_r͚5VVVᙙO.//2eRi޽7nxʕ޽{׏Jܹ/_͛<O(n޼9??Μ9NNN:o߾8nԨQ"h֬Y.]"\.SNk׮~zTTZ3g&Mdccn?`0BCC{j9c? PUU斑!JuV^^0aBtta>|wNGX,ŋ˝<==W\\`0󠠠'Nb^7f!J) ?uԩSaE.;;;33fTWW1c<{,//4",--߿?i$>UXXH"JeHHF;wn||mXXXzzD" tReeF}vnnnXXXLLK;Jh/_|-BҥKMM XqqqNzaN233y<^Nu٥K3gh4ظܹsvvvlllIII.]<==O>]QQd2X,ֺulllrrrbcc5ɓ'e2ɓ---&Olaa!\f'M{;wC줔6ݫW/DGG_rѣG*J"|'yyyǎ0`@=/^{pJ&9gΜx5p'Ot5000##C$Ǘuիd29<<<888(({;w633y7˻vjkk {krss;w񼽽M͛oԩӄ ._pƎ{…;wL2%""СCQQQC 9yѣGkkkΝkii L0-t:9 p$Ihh(lc{؝ .@RtKd2z xD"BjRiffI$F!HCA`vbgB4#ӟX!J XlQ` o&(S t:kkkaN; `XEL(Ρjycj>Ux,rXk`ۓ> .KRL&١hR$Fzu:L&\cff*++!V?r2<*˱@V%Z?L rVg"-ͶP( ,4&jj~UTppNr2 ;$0ݰC2 CWYd0g1}<_VV;|p#'ĂZ Go߾b""" \@Di` eXq\i4 F.V&La)-F /ælUTer` &|t61 Q. @ J+0[f=H.h0݋{}_=h %Z°F@ F^j#IN3Fc1l5[3X/}U 0ӷ+L.!S$>>>`,v=+6UY`Sll,5[6VYp| =(}raB 961W 1#^^^@a`oD"p `40 bkXqze,]Nh +@r3L0#B{Vo J.dwˡR=2|Lry;T#Q3kkky:@E)QwB,~[X8]$DU3 u!?F-jh' Z>R^ &` K;!dmm uǪl,Й:`0ދ^733c2rZ(֒U6jT3|]!ݧR;̕A}}N|4ouUi`Y#hc9L0co+:x/܈*W"htW׷0тD/WF:FC;ּ@noՄ7ږ@ d#5qSՐo7VHL0";j C XVayBp@>+JX Azep;bb1B@JUX{,fкjMMMMMMX+566 š\`RRzu4##秧D"b,SP'hZDOF1y<ӧOoiiiaa!0 QQ__Y>Aн{fx? A- ٨߻Xj^PF 5pb^ݚ[UU>B555Ϟ=ZmJJ LmaSn X,nlldFŨ'Opܡphb$DFO E.ku|6FQQcp!VpL&` 06a?uԚ5kJ`3;fia!^|yСm۶]|ayV\YWW' .]l2PCC/?@ դ#F$$$WI>|~rʊ+V^ :۷oGyJڳgo6rRPJJryFFƪUTBm۶[>yӦM[l9{,?sL*zɋ/7{{d]t=z͛ Bvvӡ?7n֭[nj#H,--u:]rr… b &Ni&gg禦oL{{+VmE=vXvvvDDDw% j*;;;"hccu֤w| w=x𠶶B>}A59//`,YǗ.]rpp/ܹs:>c 86 Jo.'L[XX㽼***<==͛~|dXc0~~~W633kjjRIIIL&+ʨȧO:u[nl6+++Bѣdž ƌ_JZ` | 9vX@pСѣGٕ9sD"-YL&߾}L&kZ:>p@2  B={3f̾}>|X__7eʔ888$J5cƌǏWTTt}Ȑ!-ӧύ7z=޽[PPbƌN_@x!4bĈw)}II Á`Гd GA$EL{󎎎 DVVVs)++[zuuu@O*B(::z/^ܽ{7~ܹ(Ё ԩS' dW^1cxپ}"fΜ~4J!tON>}j㥤|0 YEE޽{cbb?~…C~r|ȑ۷o|<!dgg>0[رcȑ#!֔)S>}jgg'7lc\ bGGǁ9s`l۶-((H 1bΜ9>tRAAAtt ;{+++8 jaaq LVTT٫WgϞ+VTKߺuի˗/1bDuu8["۷o4iɓ'}}}wqʕ2^~Ç޽{"[n-JNN^f -++b0 dd__qƖ4o߾QQQ))).\/W\Y__W>|gΜ޺uk ǎ;f̘-[xbժU:u¸.UUU}]t!(X?#9V<sh4.\;v,d2f͂d$sss s\^O>ܿ* ÇgΝ9r$x'NXz5jT^^dz۸q#PSYY6 2 4'ia*z !dkkkeeER!+B1^l`A~,˷mb1Hĸd2Y.O2W^ZW*jkkkffy LeD"Q&IRv9pα|2'''///++K(T+WƦG 8qҥQF!Ə?rH>D&lB"̙/H$ZL&;88@y?PI$H$sss`4blu͛7^|>~!DB$ӏ9bkkԤP(d2YPL:gϞs+@+*NknnƄY)ɔJ%J jNd2377WVK$XNM0Lx | HJ/rd~:dرpF.3̬۷?~xĉmDV+R +//_xٲe zYDDDFFa} P}ڸqիW лwosN2dɒ7o655͛7͝;!;;@ #GFEE3g&&&޼y@ TUUwM:tĉs!H@h恁QQQ$绹O0ŋO>xD"֭[MM J0aBxx8F߆D"pqqa߿޽;CVh4[[WUUzzz ޽{WVVZXXT.]xk׮N mD J ǟt钫 bϧM˯\j.]Z[[[ZZ憅A(> s/_ڵݻ9٣G`PRRҫWsÇgff8qb̘1!!!P(.^-H:ѣGmmmddӧO={V\\}ܼxb"xZݻFFFBdooG͙3[nO>=s̄ ;ڰ0sssԌ &`[AxpmUڅXt$JFƦ-6T%04 P,/F wժU5rFQzJGQv®#vYRxXʕ+MֵkWl1l6a_(!3r_bŃU?YUUedXQQrq8An믿bp=lˆ-iXZ{T*U}}=D#<a:Uj:%z0 ?d2>(lnn6Z-Q~kjj ^ohhp8: X Z-Z"pܖ (|P(n߾^x<ޓ'O`˱0TL޾c0<r)))!2xII (ovbn}jj*yGXXd(ղy6b oaF٨ 1jÖ1셚gϞWcp566B7DRWW+!RM:B؈ rrrX|>DEF$\ٛ7oj k 4uT*@$3JA_Xlv c0 \lmu3L0lnnV*wܹu떭-?~'Opld|ŋ=r .ٶ$BJ8q… z~ʕoOvڕPXXسgϤ/!4t.]XZZ.\A(?O< h۷x>>8fÆ n">>>7o|rIIIϞ=.\hff` &D{ [DGGo޼9///88xד'OM@~8nϞ='N|OO~׿+Bd~SNe|94rJjnnEK.>}zϞ=Ν[`BH$~oǧk׮III7oޤR2}:dtҥѣGGDDٳGV{zzmܸ,++k̙蕂iӦ8HǏŋ ¿ ͛wx񢴴 f23gXkkk޽b.\0j(++@`N}v*:}7op#F j;\#zӧi4Lx͛7?~V__8k֬oVR͟?ūV:tPjj1cf͚_xo7n\ttŋi4g}V\\O>$++ Jz1|Ǐ'''j\wiӦ=: Bٍ=͛C !W\Ypu4رcmmmwd2g̘ŋL<C|@x>|8>Ĩ(qqqc~ΝK.<oɒ%ܹsD"ػwoPheeh"O?UUUYYY!<<<^zݸqoΜ9ڿJD"rʔ)S Ʌ x<^MMMYYΜ9 Nݻw/:::++??>r?~,H~'gggBAR+**蒒K. 2t#G_1Br8!~?}?8fpN8Q @*L~4w` !jjjlmm{_5((H$=z޼yG׮];z(Jjkk{uNW\\'ɖ/_>k,&s=z_z\Y x{{/Y$33Prswԩrk̘1>>>ݻwٳgccc׮]۩S-[ē'O_|ٳj_W\iaaq۷ooܸq͎DQ?sРAd2SN|Myyyhh(ryyyXXX@@>{,mnnhrJ%TS[ihhxԩS+++=<<lU,x]zxx˙3g\]]7m{ѣGZ~ tϷMMMnnnQW}8x`Fʛ7oW_}!2,ɢvZ[[biib|||BIL0uuuݻwsN7n܍70yrx<ȑ#Qd[B;v믭ѫ(H!<xKT."--ӷoߖ111SNTPPjy<_RR ƍS*555n:{lRRJGlmm_xKKP=zWIB?#@8Ǐ.r9K\>yxɓ .=zt{wuu-,,D;?ɗL&WөT*J5cƌ"\xRYWWo&00~sse˖D'!H$#Bh4@ih+VAh pll}Flmm׭[즦&陟᠏.HlD"!QF2)p8v G~CRR8j5NӦM#t:nwpp@j t |JeÆ d2y֬YMMMiiiG |2Bٳ5 Zp\.www;uTFFFCd Zk⧟~9s]iiNr.zumll|~}}}SSN *jƍ߿y|}}.\?^xСC**---'''##"=#d2Z>~8BN,s$ 2GGGPvwqq)***//H$!!!Z &` &O˜P(]vẺ/|ǎ<2eohF.3̼;vwGR :?WTTnd2>}~ʕjO?t8o߾6mvСC{iiik.ssEݺuK H$M6|rvvvfffQQQx<~Ĉzj3gμ}vRRVڵs犊Əw^>`:/4JvܹgϞt:]$7ɓ'Jo߾zJKKDaaabM0!$$޷.H,,,\aNh.\鞞b8::hΝ;Ng!1@8qD]]]HHȧ~qY^d2lԩS9NAA5j333ry~ d qd2wwݻlZBgNNNfX={| /]pDbrrrNNN^""">^ pܩT*F}葳3vss|{{ ҥKǏh4E$}||]]]ݹsΝ;>}h3ݻw[XXdeeۗB>|XN>d&'' C(??ްaHOOvjjjYYYll{n޼ŋ۷oG" :9rdhhhbb˗/᪪Ξ=K&xZ{{S>~ʕ+Æ pÇRSS|~HHH|||qqqddtzlll@@@TTTTTTttt@@DOJJݻw/,,pBqqq@@X,].]belp>6HģGtYf}q8Ͷ<ѱIUԖh5}2"A>}`aGV#KKK8%[ /vh,YlYx]V'WVuZF &`  PXXhd=v4oZgDoyWRvuenyAiV2*|{OjE:-+h6 F"!!B)2`{Lecli2}xHƚugmOVn...p֥eF7‡j%1JeH4l &`G,DJe}}FyW?8T*Hk !@?Q*~D۾PrT!z^,(_!P(G! D"Hbq6lXbh+N^uMMLUX"?BGIb &`6Nfz2G?ߕƷX,vrrR4I$RCC@n< e7nd.D"566z[[ۖ5$@ 6Nv1u7"u@eT*[^v{d:S=WVG^O$Z-L~-æ'茊ƯF%i㕦mV^Z\x1L_Fo:c:BzÔN ky]oUwxh%3m`L2;DX;!!;wxDO=kU?n` &|hϪغSV755;S755L p\nFSWW"3:+BH,׃P(Vl 544 *pd2^DXR o'J+++${]]ǃ4AMMMKYC a%LHH@¼Cbޱp>g4 y'B9΃TQyݰ0R555 V Oe7A"Tɓ'^ХK&&&1ݻݻ999111}ƍ7o9ѣwp8aaaO>=|pee;Ʉ6FCS!>kssZGqvvu떷uCC'[D"}0wH$P?sBBuXz Y޽ۧOPFFFJJJϞ= DP(Zp8tStfhpւ@ 9rq R01*mۺufaaT*롃D"|0=^b1N 0)ZH$T*3PHP RvJ%JTP(=`WWWo۶[nx<Dh7P7P(p̦ȑ#|޽{/^XTTr\.F(h4.~sssZ r";wNӕ766|Fcff+OffwٳݻC;jHDR!v<ح[7 C\GӦM+..^x1ٳgUU֭[>|/ܾ};==gϞfRdX!3BH$jk[貌/BV={oV(]t߮_ջwo˫Vb0RJB:bRPTT*uǎ|>[=D,p8DE51,*/((غukRRtwwܹSSSӽ{;vܹsɓ'=z H&g &푃l*1c ;?_!T]]}ĉquV/(((::ݻϟ6lpȑ#Onݺ۷oϛ7oݲe Bb}W eڴil6{U՗.]ҥBh4 7&&F&]~?EBG eʕ>>>\.ѣG]tvrvvxN2e Z߹sHH rRRR\]]'Mt[pɓ'#d˗KKKzE={v֭}gw ;56 !dnnvcf֭$)00066vӦMJrԩd2ٳW^1bDddݻB...'NܰaN̜9s&@ l߾}7n?~H$񩩩:nɒ%>}zrrի}}}97|UNgiiO?}:[6}^|ٳg]vT^zEEE\K&m޼޽{w޵w?FSBHO>?cO ,شi91c@صk999?>yVUTGh4Ǐ۷oh111AAAL&… 'Nph4˖-w<MvڵiӦ]jD"ݼyҥK cذaɝ;w^zUII^|iffP("""vj*>_,Zŋ^^^RϞ=CݺucѢESN(((8v؊+]o^WWgmm &VZ5k,\  =J f͚rEji4###Mۉ;w޺ukJJɓ'Š>W_%%% 0@Regg+JwwǏR/Yu̘17oT*999?3{!Bh񥥥^^^ u ++oݺ~ԩETJ"d2ٴiN>=~xww;w͛O>xe˖H3fud` &ךM2xMp"̃1e`0D"э7ϟ}b'"$J۷/::d0^"##,---[?TUUAH#ݻiӒmߜ:u 5ݻwHnnnNKK>|xee\.޷o_zzz]]]hh'ON8v޽۳gς Λ7O477'''T]TRԊCEFF]vmРAV"H#GܲeKڹc:uBuH{^paqqqR÷f}zȂ[ZZĜ9sy֭AAAbxرOKKrʋ/9baa:::EZڵkd2ŋnnnݺuknnꫯfΜUYYV ҥK}||ܹwadpB~0a¹s¶mv޽2f͚c4ÇxVJ/_tvvvrrrrrrwwWÆ o6o\PPpԩ/^ܺuKN6o߾>p¤I.]JPBJ:uj„ ֭tRCC˲eJJJN*J>K.}&M:~88xL&۵k6(C WSS_|QPPj/_ܥKbi4kkk'''sss8p8_G&[gǏlkkkWWcǎx#b544 >/v9rL&;{ʕ+M_1LGGG'''gggx%g2R\<:99|L3gW@@@jjjQQ^_rH$?#۹sR~zddٳWӿ>mllB3Ν;;z^$xgggGGGP(Y,DquuEY[[D"t)___MR?&` ⵋB* t:99ZZZY\rWX1bĈ8\?cŊ'_~ .jss3P9Nzz3g޽+Ju6vXLrשS' YFGG#|ǍT*oݺu…[n!\ҩS'`0CBB |.]vfѫ͛7HǏ߿Lp H$2LB1e78x`UUՊ+>SK }wwBJU__P(Љ@l@DUi~_~%JD%L#Hj2_}}2)T޽7|FkkkגH$<D"i 1I$R]]P(h4B{nffftx`ZXX0L#`9;;C(ʗ/_>}4333--Q&EGGvvvr|ڴi111*FZMӥRT*xl6[&דd>JSx<P dHT*ZV*:b)^z͜90PYXL>jT*i4 TB V__---'LPUUtҥK.=y!$H`rss Xh9Ds8zx ʼfff<tDpxiŊ b*˗X,V(۷oV("`$ r&O( B:VZ*k4W__OP.th+LfooSRRBCC?.ɸ\'233W\o}L04Zggg_x:K]]H$ׯxb&M~ d~֭RYUU{w>B:e˖ZZmcc2Z77 &̬,k˖-#Gۻwy޽+R͛+**-Zdccs?>}8:2tP{{{gϞqƹ۷O$-X DfffݣG[[[`WUU58.66gϞO< |>q@GpH$NNNB#G0^N/_rh4ڣGRi```MMMppk:u+'J~)69a„ӧOcÙ4iRccc^^9r/z}ll,d2KJJFh:ujܭ[77k֬ #]till ollӧϵk׊H$R?vO!) ?|pSSӄ }DDDTVVN2%---;;D"'88өSϟ>}<++kG7336mZiiɓ' ɓ'\y_ӡCNYddd=|֬YT*UP666l6{ܹzիWxx8JξtdA!5l0ȅJ;wN޽\.puu =***:th~RSSkkk;w}I777~~~/_RfffqqqMMg}{֭rgg稨phXssΝ;_~=//oܹAAAǏgpO6nF=;XZp-׷cI|j5BM*kT*L2zF@Q[ZHF سgOG}26-x\ki.չF^-Q6H5uU3\ZMmw֬Yp}y]{lV/Ɯ AT._jB7D"h,XFhY_LvYԆw.vr+d%[s4]NzssbuD"_Rfff@сwl9N*vDXk pT*?dz*h[= 46z=FIPNJSVM0 Z;<@u5,vLpH G$DUAm#^m҈?e!"u:mKp70.12z(] za$,L(k(8! CR-,,Z6/j0EA6.n{_Ӂn_DP(X CvG;oi00`R:< iÿ]66 % dK 3(j^wW{mtVQ:7`vXL0  mFSe ;, Aܶu"wbcOF=Ô4 "lo¶Pehg7o>z[u_\_جۆ.:^CbɿUӶ~n}KzX9b &^gRp85E3Z]YYYZZر:f744ATVVV<*𼂲! xBwl>ӿ ^]]]TT$Ju:ԑaIX,~Eee%h566Xca ō7Ыp8eF?`p9WWWw]t~\~~~zz:jm䘔TUU^Ee!t¯n!<,},UcNVs864 >>>4|~EEL-!# P,PMMMZZZiiijj*z5< {KWWWt!JUUURMt<Ƽ_8 T^___Pj|޽={2-36Nm 1z^fkkkv8NT]%. F.UUU"e &A.XÅr8uݸqcԨQbԩS[lv09HQtZݹs7A"Tɓ'oݺK&#Gr<|ٳgK,ܹ3h 4(00r…jZ&;v<={jkkk&yر͛7Ν;3f̘2eJEEŋܹ3tdggo޼yəGwuue2hh3N)\.wrrRT*ĉ...we@PxX޽{Ϝ9ŋD"($$d)FT*-,,Ξ=K!\.ohh@9 Uy `PD BH=<<L&p8 cXTHb1?siiiFF/hhhP(ptTa<ŋG)..޽Rj|>L&%KXZZ¤ JR 􂂂'OPԜHP(  KYYY||ѣG\P(@)))={.]ZxɓR??j(BiӦ'O<{O>ǎrʃ:wliiw}>~xɒ%t:= 77СCqիW@eL0A*ٙ@ HpѣÇS(h++ &g\(Jamm=l0tڵÇA@ yyy 6,33EGG >L&sȐ!g=x|PPJ:uҥÕ+Wzջwo^}CGDD ˇoffRYY9uԺׯh__ت]¢yȐ!+Vpuu 'FpǏs.]?Xlȑ#LÇ>}xĉ,\jUAAACCߡCӷo.]͛7?~bR޽{޻wh4mҥZVT촴۷:uի{ss͛7*..fX BՆ2aÆ988\p!,,HNNdݺu{ILLYMM vD_zaÆgϞQTqϟ|ҥKt:֭[WT,k֭`SԣGeff>@̙3l6{˖-=zpwwoBHHȥKLÇBayy9nz!{fggO?tUUUQQQ &`Gm3\- {ϟA"755ݸqcŨ݇ Fzz@ 2e C$)Ν;Em49X,7|+**Ν;7--_~oN:ڽ{,,,.={MBO۷/B"***++ѣ!V sΝ={,]?uG[TRGv޽*>>~֭377=zM HlllDo6r]f͚ & RѣJd2Yxxڵk!, F=Ν;iӦ]J$ fdd\v,44G[r! 4;;K.AAAbxٲeK,R֭;uvSV777/\R_N>hѢS( .#F̜9333=zXjŪtppRj붶[nrss[`X,D;w.Ng2g~A=oߞP__O"Z-J=|X,B3gDAa3&H{=z4Nߵk!+`cǎUVVj޽{ܹ399a *A+\.?qŋb1:88v=~xzzb+Wlll6no߾aÆ^?pttgϞUT %00D"roooԩS'wwwwww777!TVV^P(wNLLo@J=z􈍍e,ή6=== S]]=k,d⬛` &Z]*S>KRR eeeC A8hx-[lԨQ"ÇvZ|9NGd2TVxR9s) .Ν;f??A B&P(}||d2""##l6B;VPd[n]xڗ/_huuuCuۻ,عs'B9x۷xFAPCCX! JPL2eРAyyyv駟f̘޿1QPP\__||P(j*J*Ξ=СC x<WTudɒ%VVV_~%Nx@z&H666AR1L@ӿ+777xUH$ꘘ6,77[ZZ]H/L&%%%+++\>a„QFI$WZZ* xB0D?jDRIV^mcc!ˣgΜ tLfCBB8Nzz\.򥅅@ 333GT*h:Fd2B H$H$5^wqqY|9@Rl5kh43gD"Lv @_  _~ɓt:#!$ 4K. FHTTT # &KJJ6olaaXWWW[[kkk F.---JeDDČ3ƍ׳gϯ~p8WVTiiiϞ=X[{ݦz>VMzjkk뜜Pqq\.JEEEBfv={P\\u%Kt,ڝ &`  _~f;88888l۶Q,w֭*,,$0ݻwd2Yuuuhh98J_ "??`888o jɓ ɓ'=zxٝ;w8K\\\~L&p[n7[nNNN={%L&۲e ^xUQQeXXT*uرC Ezzz?J ,p!FP<<<"##]]]JCmmy<^rr2JQQQ;wNII!!!b#..cQ*H,,,e2Çǎۭ[< 2W^>>>:uRTݺuS(~~~x<ۛBvN&Dӧ 7n\qqsd3O&LÇWVV>}L&t zȑ!//`X,Htzn݈D̙3srrc>uUz>==p!!!:PeرcW^eXs ɩ9r'ORPP8s=yÍ3˗Ν;vl``P( rt:^^^$k׮)))IIIfͲjbyر666!k4߹sG9;;O"H$HԱ3zBBH 466vxzOWWWPe`>_heH9Q&` &wxp BtccƷH$RFx<H$ZZZժղt齎2Vm]4x|SSNiib uϿ/xmm vd(`R@B\cc\.J2̖͋* A/$B*Fحvgٶ =s^zYnUijKNr &` &bcT6x2ѷq:[-*>-7|cm`!y혡,$shyA.jvzߐFW}o/oV`cH~k'{lh2ұ3 -cmL0Lh'h (Z"''U*˗/@єC\%^xFqܗ/_"=@cAuuuj~*//hWKKKsrr@ŋuuu7-˭"^xQUUjjjχ^kZHP\zgsN]]]bb"-{\tL R蟧g MiiQ" h7Hە^l:!___ޤR޸qp#^j8 ;Xa45- ZZ&2 ^[VB 7n@jx!JUZZp`M``SSS^^˗/aϟ?onnpMMMeee/62X0&|~]]X*x(@ XSռ Ǥpvqch _D"\UWWcˣ &` A.ZHׇ=|~P(qǏs{iL255ٳIII2r!*zܸqۛJZ*>>~iii)))}MII/t diih"P9tדvjaaqƁ 8{l~~Mkee0k֬ӧڵ+##C"ݻ7==],&%%\r !@XJBlZPV>{kRRUEE733rz=E"BXvmZZZVVV޽;T%IqqǏJMM wJ9URUVVzS]]meeuy (pRNC0`Z}OOO{{{]H$b{:N&UUU;wt\h lccZR`h4t$xl6DSjnnMRJ677KRhRiSSJ$ opʪT*z<D&lhh`0bX 0LVP(x<N@Pd2-FR?BNՙauV+R98cXBݻ*H$bĄxE$ϔ=z,]*]|r4dsrrl6("4 h4fffF$IRZ@"jjjT*HFc'O>>qqq׮]  Fvv6Ă%'Ox͋-*,,?#̎GTm۶͝;777788cYCjW^}X,P!sssxҫTk׾NJn:]d2yĉD"ˉڵkNg0SLYnCzzٳ+'Lf͚O?T(:::R(gϞDe˖9::۷?OHHpqqouVYYrʜ;wua0tkO}ܱcˍ ٳgӧҥKCCCrrr6lp;w8::p8:. 7o|͊ 333\~z33Ç%&&&%% {,z_{nܾ} Zi߾}˗/1b^hΝ;׮]{ML6hРǏh4Zmccӯ_Ǐ8qbϞ=/_.--}mܸts5Y&` _׎VZ%H 跽=(}[PTw/jnn*M b"cǎ;;;#6CtpX,O?`0~ᇊ {}]dI~~͛ᛓ'O!{}h4@0|ׯ?~S*_~"Hރ633CGnݺ]^^|ٳgǏU(4ɓ!!!n۷ X,ָq6nh H\]]BpƴTvډ'b?)Ν;B柸`P3,,ܹsׯ J&LXp!ڵkJJʱc\\\+OOO s%Ҽ@[[.]=\,/_|…\.WVHE$%%%%%}~ic5HNAA޼yرc\ҫW[>}~JǏ6lXjjF}*v:jԨk׮=_w^mmmTTf)77W !x~ܹs\ի\. *Z=yiӦ]~],D~>xyy@cUZZصkB˖-__O&#F|rBz\-`Od29...""B"dddTWWoڴ`$$$@^^^[ !ytGJ#jkkae}k>}Fmeebܹ0f̘+VXYYܺu+<<<++n3gĬϟoݺ"U999}g,֭[jZRI}}}7!~=L&v]R߿…=L0L@mB‰+JooﰰzOOO6_xxXZK.=z_{ιbݻw/Y"H,+ <?*iӦ-j:??ŋ?H$=zVVVgܹX, ߿s<!pnj۷o_z5111""bʔ)zk׮...:u# DOb֭[t@@P͏ԁMJJJl6&|%j5ɬJP`RTssshd<oee!RJJJRSSSSS9`@c!d2+**^xl1إ1LPPC,R !BJ˗ZK޷u:]FFӧO>}jᇙ3g:99I/k *""J ;;;???.=gҚ* <dJήkRZxpmxxxdddjGGG5E;w޽{nnn|>h/^TVVZbt:݂ `FJH$xYYYVVVvvvz?޽{tt<L0?9ٷnݪ;vϝ;ˋJ:th}m q!ms|iFd2PRlll._ =z<{,99i̘1}0`q޽ &>|y=d ~khhXx12AӇdN0̙3 >spphw9r N}p8ܙ3glvϞ=^ :thVVÇ.\hggjL&KMMӧ࿧P(~~~EEEuuuϷHMMdzj@t ͮ)))宮ƍ333uB(,,K.}􉉉qAOO&$$TWW\ѣG8 22&` q r8DVL&DL.kll$,.<* @XohmC]t܁$cTJnC\.F}Kk(`WYYCS^^ŋ'OsȐ!jf;|t05#Yovپ.ÖP?ܹu4G86233 DE5t{aH$./&aa`IRӍ3&44Cv40eԃb>Z v(2 E-Zh68sBFŃ%[IVpD _^-F0-paaZ6* MjknnN$CBB /ƖG7o속jQ 'ZځL0 Y}ЀFJ*..xD"χ@*#lvAA+DRP5[CC\WUU=}~***jjjžJٳgBPTTTzsf|6ssssss+++u:@ ǢBkZx˗/W7o޸q30Bϟ~cMM ollp Bfee=~ˌf||<W1pW\#v^|7>0u~~2lpi^HOOA024e.,,IԔ }'ɲ8knnEQHСC'N@b1 //MMMpapʍ7MXwYi^flÔq8X,ͅY__ra p;\_UU BaQQp oL0Z_dN֭ۃvaii ,Gnڴ_~g L2--ʕ+> ]v}$BJ={655t:}ڵ7n3f 9vXVV |rKKK0b/^`04׾}޽{޽tN+Wvg}6sb__߳gmݺuԨQ.]JOOzjppc:Û8˒l˖mLBI#n ! 7妇TRI'&iz'666].rr,Y}c]j;s̙ٳg##g磆`f6{zzB!I Y۷ܹsaaa... n/{^,,,>}o(^D[߆ EMMSFFwܡT*w Ehh(aUωWQlnllD,z,%iooG[QZ`ػwoPPL&B]F4EQ\.|'iiih4r8&{@Qbt>@tٟGV4, aRToo/ rvvfd2p\VhD"bqrrBCa%-P*+ .:tٳ?Gv3g|')ݺuJ"B&J… ӦMC_~ŋݿ7xcΜ9"o-))9|0"Z}kjj*++MV;::%dbX$I z{{h4h4677|6=::T*l6kkkD]oݺu%Kx<Z^^e˖⠠Gy`0;v}'3g$LMM >f{zz>UUU|AUU"8A\t]w!^?qqq <MMM!o/99yʔ)(m+讛nK/^~_yT*}i^vmOOof8cǎ͜9$Ip)WKllh^^w}> w}J/88.##$ɣG._<<<|+VxGիy<}h G?w\yyyxxee77իWZ w}MMM 9sfpp_Fkyyy ü6l(//OHHmh p߾}þ¸~ҤI$IlFr}Q[V ;:u*搗_~fq>ZjաC>矫j??G}tO?4n a8U}2m޼Y>3c\Jr{{{;裏 x\^vZ-R>;/vA}T* /͛[[[ѣ]&}af̘O477;v >> 33 e˖9r믿6L;Ν;3335kc'C!!!ȥCZܻwwsssmmmllsPPRT(_?b聁\6mCٜ~]w577755A;*z``^?>I >lWWw]VVꫯVVV*G}b͛7n+((@a id2%%%m޼yxx ?%K>q#<>x 75x斖SOH>مrc5$?z(AGB(B -l1rVuϞ=֭׿ɓ'_~{0???11ՕrTʅ<тbg [|M&D"-Reg̘q zpw\urB^www ށ+3!WyӦMK.ȚѣƍhhhHV#y}Q$o& CA:tŋ($""=I-**REr__ߑ@wwwcc7h2|3g=zلoBfR_|qĉ7~p$33 ۶m;x V4(;4ͫV7o^qq믿'GR[[kx\֮.bZGFF۷wwwcX/H4տ6]GqwwZAD"H$BJim/b޼yUUU"h˖-bqZrgΜg===M&M7ݴtR^Y]]=88bFod2L&`p8ww@ @ (q)EQ&i.V[[RAZj._j>"hɒ%h:""B$ EDDrs=d2\0 $%4|{ݴi ,,-{ωޤ[o>;~zLFDQQQmmhJ(.ŋyyyb8--e`` ,,W^Zz}p+ǸWTT;wnppð>4o'㞟Ңj~1=,8!H$2?6ԩS0--ŋcҥӦM={H$OsssWZ}vUV>@lڴI$577( f͚5m4Tb Zk.w# |||R-Ɲ OOHǥRZ3g`ɑd'O6(Z(*&&fɒ%yR v;# pqv=h yOc28J!( B&a@5B"iaÑ|HCC4MIHd `A)!N11T#sL@ C3>> =֨kՀzmph u5`( Ri?P}>'m'iI~־E8l6`H!룱u7?cd(04 )@ןήN7776] r7m6T!hOl.eIc}qi_vN1c2 CvL1ðήN^fM۰ec%nR7p:~0* 0nȃKvn+1ئA[ƶ|06yF `ش ~Ruh~8Zuuu2wk%`fmz &c8zTsm|CJs1F\ah{@R]~$:ٍ=:r/OjؗZX8˾? `ÀU޹j9F_2(e6UU3 ^C5٪?oS.N.AyllAf3K2W.]tg+O? c O.no ϭھk?_6ppY%_oq?E\*&رѱ_~}E\>~կ.+ +12-ep/?,bx`n5?rͅ\>C/i@;t6Œ\C1!ze"mA@hSrƜ-0["RP`\QA_VzN특ji- o Nk+rp 4E B}).N34>Z(Nj{1?? HwĹ8}qSfjn\E{"h@tW>F?K?jw]+{. F[)>SlYs~2$0*>2gdb8P?iZarcca(6g‘$[ qJZwАa7]Շ5.FW+d"\q>d5MDcWƿ~pN.9I@̘t; + 0i+  e 13?*sp>Xe`>C0 ca@+qfhp ( P(#C1A `S h+mHZHCi ,aeA BIp ER l@4mqKU0#,ca8? `&i$cb0qh[&)_C (H `l 8c)hH@ i !Ep_Q%8q(ʂ eP h@.@F[`0 b@Y)H@[hv__pS)n^[/_ 4)!6N@a(+Fi!hP_Qq{odCh ,^,q6n RG!4`+hP,KQNhb8p дelmkD ۾\hC28M,bL9ʾm4Gہ 6%͟f@RmHXavqӿpw 8ݼ5:by9󜛆z4=@oaPѯHw P4C y47728shFwI/>m_aB5&MBsSFУMf %!Ӑj q t4 6k!ᲸBvv4X}d5a2Pc} a\x.F* ܛh@34"F1 h!0|Ὰ}h#}C d|V^-+ a+(@{mV# 71f` ڎ:UosKNzvP;02fcFq' c~@`o@YP h( zeh0#0J ȓ!MY(sX⊾~@B) %'.{"<#8a`5@ 2 00"Acb@2$gX!K;J1 YЀ!1O1ibʾJ*`E2w꡺C8) u{GG@MC;VCC,~]_ؐ%~n~jK.rW*,E j2gAf0trP21 h۟HWө'+4Ф5kN& @w@a\ +!d0FVL1 }Jg56"5Д^w髱VD)lhԚ?8? |?#+9﯊Y /)Oz9yIR'ˋĀ${%~IX,7^. ,]>>86x"e~2=5h&랤{F.eX/zț8`y[foq0s=np 0~ŝfh%%)\PMMZխ㣖 䢞ʜy-_i]g|nsI^Iʊs_: I6 68 RSWo_}gK–4fmh4ywȫ9+85lYC>-feZFO6JxܚM!6zOgi~bd155GubPu݉۫ MԻ z|R[-9m9CVg1`S¦g>YIWRiG"o*ěå|.m.[ߞ PLLKqW3xe+*U>9!Ð43Ypߴ .t^x ըjߴ+zCըj88h5HVDhjpdgUm>O߷c'<9Oc}z^Msdg>˾V!G2ZCx,^n[k^rҦVUk{k_9UeqwV$H <<(cnoh\;vH*UMQ7[""**F#΁ WƜ7}S) P՟}V]5Zo[Yo}Wݵ_ou`3X QQb->0la2kQQ΁['ߢjw)0G|Z-x;$E5 5(VzGwǫ_?y~|Rʗ{k̚KjJ'/ ]mѷ~0bz(z8tWE_m>9?ӅRSř/\٭ه m9{̀[n/޾,b ܢJwGhAP @ `X@0fTl]^թBy,Zg- ]ךޏuj;9MV_PT  8,3}CK^w3Y+"δ ?~/WꁥD8{+~A_39-70i W d3[ȕ#ZŀaIM~SMՙ6Fke_]CѾ(piJz;m74p ?ѭyU(gM \I'zH7d-~lߢEF͐ fhT4Y) Etfo};/VvVp\*rpC*.E&ԯ 4Cp֘3  +>:T_?5 b V&ܘ?e!0`Ӎ&J ?l.K@g- Y$JppNh/ >}nn@[C!.V|׉;h7u^L̚;deErW擛2/chέؽb4WCpTz+ʹ.8p֨ess~dzL晛}E݋6c `ܢCebYm- o[ H7#X䋒/nWKԨugsN_ݭ:wk'@ŕpIF1#xMi>鯑\9ɋa b.t\XtgΤdJIH J3YM$M0ĠÙ P4&M\OTr[7=늯,.$($ @{O6]zt=..^.20װIޓP<8|<'!ТEsb%r8*2ݵ;/b*'>5(C  1>1='SwZ<9;53|}-ĠaK)  s C@z<}d>LgGl!00x!R_jlUrqֳ;kwJ@@ ̯U%$zy{,'SoLܠaPk9¼Eτ4yZW$IE2-p!=7^snjؼxsKΚ,;\ O> )US}dwdO2=J|?jXzFuK;K!kbSuV<<$\WUwF`W PL8B[:G:D,P88Io+.8{08oޢOvS<laXܦ.cי3:΄;}wThnTj4ܴbOo*gpֽI ؂?ԛ# } 4sr{7Gݬh)m b;η?QwbztTu_' ֪me ӯ/(Pa㰀-nfSvt\%=%ժ gs@-0e}e'Ntiv? P)[MQ7QWYWEw@akim4A}JY:tW8h$Ӣn;U1@QX2papY2_çNInukL]Ƥ,++b8U3SQdh4Ed5g̺+ʄ]Oi_jH9&uP1`,ըl4``3e>|ca#s9#_Ag{C3 ҄f}Ƞʨ)&![fwkT~7!lhraid08`1*[o=ߣqqrYrnܓ'NNu:2 0@14h<1wnP1X8=Gsp_F4â-`5 Ht.MWPE,Yglݫ1j:GVEё#.n#%%=9-9CDD+mMLnΪ*.uR 0(t}飢tܐ]5**6AStO]E&d-̓,.K5:|zI>YgZ6%Bۅּ?g2WUN0io8?d=m8ghз0da@aɫY\WnfՈLB]BO><+U)TU B hzUh_o`)*UUgM-q1E.pVU)c@m/GsC j:;aAgA;Rp$@t蟥 #0Ƽdǿ*ز o B f0ccYE_A4״' AZHUq:w֪W#8F`FlAc( lHP @i%FK6F[i fз]Ȃ Cj"$h @`!Ǫ98EQlՙbPw$c,cDcH-1$3FAa6);c"4{]кO?1Pgῶ^Vut bg8AZId2Q@f0F[hDE+]eYіJ@ap%eADgX/ fĂ06F[h caBC&NM?j$] 08DVǐ ):+Zl4C 289NP7! (@Oi\ifh)`441Jp `s''ɟxܯi4Le=kc& ͣFp]%@VIMҀB, `?!jINĦ8LԸ<)A4$oaCsय़U=&9M%rK)@@lp)40id $@ Fmk0 @@ȱ,+i`~ 0$C[h`I{J;11?86`P7XS`0;Y(35Fz ^mm|_Uإ$MP&o߳J轂 2ߎB,!L`p`ȱ觝 m2RHp8azǎM? U@t2_*bi`i4Y~HfԴV@ `_> bHDocVBvƦL[``DJ3m.v5o+e@@8f0 CMe7B&[86ɐ~ڤ]`4bl; [-VDFMH39+xiC%gsO8{QO+Rv(GyWXJbHJ4M ^ 0w~9U!Bf`m!#iDET ɐz,sI?SrEϊ6X <.ȋ^oH$+G.B[p6Sd0F e86D"PF8q}87pwT*IcKGh4j4OO .$B"y@j]]] 0˟vTf?srrl I 2VBɧKq R4.CM2 ')̥<" CP}X-3 =EF?̩hP З40H%NGK~U- Hd((YZ,DIQ t V&kَ~Bm] >n벟7b(H!z mk rG_[d83Ajk5* v6l*@ظTptY? Kk 8P& dr8bQQc=ADCA:ni4mPY$Øvf !/)gF!*]<00 Cf6:1X&Q=0Y50 lSm S81 ѳڗ]qьI$\SSV|||4MUUUxx;z2MDL&Bpо+=lARoZ...>>> 466 P,d2@P[[AdQI\. zztt4>>bE*Hy<EQ~~~A444 X'E"l.++sww B8ѓpAxћn 0ñ'''N:pĨ@Q͕Sm b0nhhA:Uc9 $pxʕmmmzðJ^?k,p 7qޣCð}Ą4 ۨʌK8sΌ __qロ;wGβŃ?|D~^_bEbbbee%K, '0/kH#ڑj''(*!0_M7$ F wqqi1[T*IlITxzz̟?(5taa! / inhlPB`2:z;)D~~~z$j-+-JE8ȑg}l6:99fBfXf(88EEE>,vyő H8lη}!?9( |X80X4 A' D6777'$$p8\RQ988P("""V68?|klt8fOO'|s}'"H(>Bᅬ=~Q$FH$*,,<{ŋl Bh0< Þocǖ-[Rtȑ痗?Sb8** BܼdɒDDC8VVV>}:$$D*>?HR@k͙3eϞ=6lX~}AA /h4YfmٲeddԩSl6; Ia6::0V9vXPP#""\\\JKK1 srrjii1L"/FFFbV}绻Ϟ=;{P5d2^cSP477 ɓ'^~pvvA_[^gXh4$)H;0 q\R5448;;Xcǎj5UՈjTVV|>_3 c28NEEIbxxxX,шw:;;E"ǵI !yhhhjj_ VDgrMMMBPP KѾ>WWWawwwww͛;w(B<<< nooG}wrTPKKGcccYYS}}}ZZZggg[[L&#IRV*ʽ{feeyxxx{{;99 }w?qo};d2ۇ^bȖ-[jɓ'g͚Gfgg{zzzzzBIʞyWSSs񊊊I&=smmm?)S?}t!뫩 E4aZ: P(9N]]࠻;IUUUZV* UUUq8@aL駟J$I)'D:) D-[8a~iiiiAAAEEEDDDpp0Zpǿ+O?뛓"BBB r9ꠖ޽J}ѢE}}}ǎB16mctDw7#1--7 < M ܹ˝X,V{{?3&x`٧O&I;Dws(7߼[Q }NNN..."護JJJz[ZZb6QKg͚kKo~RR`YjՏ?gdd$99fh-ȑ#h 8sŋn$I/[[[< _z%\nݺ7|Vڟ Ʉz0 (((xVZbt:E"ѱcǤRd6mc=c2@``j>x`LL?aXVZu*'NT*qHYk׮6-jSO=OCJKK|>C (\zuWWRaٳg<7(ʇ~x"e˖Y3g|G===b1$I'yUVaj322nv@bŊ3gnٲfSrwܩryII)S-[Z5 `ӦMH~p8nzz5ƺGmmmgo֙3g#v(j,J±Dl6{xxxǎ7oh?H$BCcuD"0"( H$ǎ |Gwر||suu(K$ooob1Ϗ*A7 rOgϞƗ_~yttf{###SL1cJB$8@&i055Xve:8pU0<|/Ѹlٲ%K憆~ Q-^T\\\¸\ڛA uֹUVVǛ5kt:i(!--M:tŋ]]]MMME9;;k6)5DzK B@022!4y{{oڴ qX,hYn>w\ee%]Rq8UVzyyN6mڴi,k֬YQ0L[[[ss3kڵSLqvvB:111 'ǻ[U*ջ+JkkkQ|kkkkkZ )--7e&%%%##W_@=b)***---..Fmtvv]x'jjj)xXhjjj"##{{{RRRkjjT*ռyZmYYYAAA|||SS^WT%%%p^YYYZZj0R)oP@7L2e`%IA$UVVjZ=001...۷o'j Һ:,Jϟ8k,''|ڵAAA_lYEEIꫯH||~gggPPPpp0aSN2eߒ%K4;}$=b=q]wm߾fhA-ʺ$$$DbXN ((( IMMe&111...??dd$22ᤧϙ3,vD"P(??$''oYV`sαiӦ ,[,((zBϞ=[.66%00b,^5***==}ҤI999Rt֬YzԩSk֬ 0,440oos΅dXRYQQaWWW>/y<ޜ9sjuEEP( D:twwGM bqaa)SfΜs 7ƃX,Vpĉ;3004++kڴi-BZ .,..(`0477S8e__={̚5kԩ.\Xt)AzIII%%%Z666vVbxҥ !!! ,ijj jnnxeмN:5##cʔ)l6;//bd2<===#d2'M111?9s233EJJ 0'OD ݳgϤIΝ[\\|Pxsܿlk8HO X,V__NKHHSB_%=;#4a"25<߮~?;*… (Z`*z?!B;w4}S-qm`6{zzU-* m4S8w_q]#\5="4 E1 ;(ҐLh%m(&I(0$*iCKA6-(v 8Q8նZbP.T5DM!pT}8ǟ !HQ!K*诨+ǘ1 ic*V%ƞtϾ1Ab8::Ubzl.j>Bb@-ZD4kv#i 24Ll'^teF]m|"l}.6`5GbmЀJ{K XtA[lCl3 :d6aco[ƙxlJCFe=/Mn6;~ijk8 w5CN%b15ar ØBrat:]wwm ڎaNZ 0 F?Mjwֶ-__Eo8jExqg zg rx]*s yv<@a/{ec9A*ׁBeQWḶ 0P_bt?P+s(]O&"0ls(\_ǯpGrn\{M[m~5yHX;崝Oq|ۗj"qcbmU7ǾqqylˏC$-R^ۂUR_06奍8[Q6s?Fq~wb/W ror\Jc|0^Q pаm 'DOqn? ]m^6q0>x,a/MWLWT.ekW4l;mppLB544A%՞+>RhtrrE̞׾Bh00 r*$IWWWRVVf6QBP(\]]9N___uuH$rHpKKKfL&(*??iB kkkb1S*CCC( <==Y,Rlhh6L---(a^^drssL&a|ͭ۷oE ۞6_$:?sLxx׀?9jb1EQRfs\HV Vpb?h4/^Dx<cnkk;~xll,%B=Kk0PT{bk. lN%m*v|󍗗P(ڵ+((f;h*c\n{5ovk\ 8(F4行z|ǎIII4M vG*izhh v NVϟ??44d| 8q"""_|P<*RbZZZ.^ツE)u!---E!F!Hp.HԢ\n/MPee%O&)eE8X,{#7q] .e'9 67)zפڎ\!TT Rtrrwp Μ J>Ktrr3gvp3g /_>9"$??599)3xjmm=t萛|pرe˖TÇwuu8p`5557oF!˖-KJJŏx`[[ۙ3gM{nrΜ9AVyzz&ѣIIIHT!rܛkkkO-**B<=!z9zj yyyd{{djjj4L*ťD}}}]]]RVVKǏlJ룢ʆe2NﯪP4I$6MӴGGGG__'Mlnk{{[ZZN81gΜ'xbD"PTTt҅ W\uҤIyyyCCCi!###ݽVO(bX\SShR)ڦ[4ѽz>==477QO>Z>rȔ)S}EwttTUUI$4"Z!&LJ^xATűX, T*KNkooJ(RA@`/*aO޹sgccpPPГO>922rܹ]vݻ7%%E(:|wp򊻇A݃)))555Ct$33Lx$I5uT ϟ\=6z"(22r$I&''GEE.ZO4)!!aΝSN 7,+66vttѣ~~~>>>'Otuu!믿~PzԖ:??(@+ZErrrt:]@@@XXؿӧoذa۶m .LMM5L<o֬YϟOIIrww 14M ݻw?~B(8aݻ'OoEFF~駽NMMݼysGGǙ3gJKK[[[}.\8ŝ HWܷlt:'|ۋ>_^ X,cǎ N4i߾}qqqDw7ۘz{{Ϝ9PSSbZ'c ZZZN:ς ?֮]B<l֭k׮El#|>{M>_niiAI[b1JJY}]/ پ}{FFؼysAA}( d޽3f@ J$Tj|իWmڴ)--9@=X``ɓ'=<<6m4k,77{ ^xK|j2226lP[[GY afy۶m>(O?Ez뭾Ey.a~SS?쳫VY,:::~ /&&h4JÇ=CaaaVn{ZZZN>=00 {zzvs]wlqqqmmmJ2)) بV{G}bPv|oGk\ aX,zI~ꩧΝ`gy}(E"7߼xJlٲ8qF>$.;eʔ{ٳ?xvvvNN\.7 UUUwqǬY*++V^qFWWaaUVVֺu^|ŒF3iҤo}ttɓ'ϝ;b͛7/%%;3 N{n6]VV+VF84q뭷 0SN͘1{ 4LAAA 111 hQg}vƍ?C^^?~׷U&&&˗oܸT̚5+--ft3g?$$ Ba@@}˽###(ĒWW҈Jg;Ã:to ;w\uuի###f󣣣QvT% 0 (Ɲfs8'Ovuur->>>r\"8>sL6@1Kfffzxxtww ˗/7L; qOO3f׷xӧO|D=Be8H$ <~l^re___YYن d2 X,wwwTpqGkSL4iҔ)S<==u:]VV.]:{lHP*;wnuuVMNNKJJiii XdIUUUwwr]\\|}}Vkrr2ڗ ===rssY,֝w0ܹs E[[[``L&C[\pFQXHwwҥK###)3g5u 6744$%%>}zs΍ >}zLLLFFFtttJJOO? 0h4#D#kΜ9 B،$SUUӥRj0&M9|eQ_vvvLLoWWZH$nnn BTΞ={eeeAAAR&$$TUUUWWVTTFzк:V1iҤSxhvwr6} 69999BepAL$Tf.(tk3M|bq]6O5x@OظnlX,.|r6.x7mt>b8-$Y[[3l`FR!ai=.Q6(D6A9P hZ6>km -0[szCtaPb*[ ҉3RKv6imIIsKNQqYmdv`'}Ҁ]6{y lnv .=jȯM~EO۰%i윒B>mO#Ս 4FҕeڢmZ٪m7^@i6l Nmn`3 3|İUajA]o+ Kĸ6!gQ7nbŶצ4Ԣ &Mqjf6#G8*HnV6j`7=<<ШAGģ>Y\WS~q8 l/\fRls%j5L"h9aX PX@ ^$GzW1YqC!$Irxx~F֊;d6񀖉Z+zU07T1x\kj2&*]m Dh,j1ףQb;;;8$GFFBb)׸ew1}`d.e! y*_ۂ|lrw_1ʓyjqicOiKoyޱ/r]&-w܎efm7"ڴg;zc-?lB3WgE/&u}ی>j^'|pm4N{bؗy8ծ6=_8 WME-&Q۰}\.} W{p'MZ^Cz7`pippP D^^^GR:;;S"%V'''V[PP'/Ϙm `0`rlx"bF+++R).++ň0 L&OOO$)<${RIDAT<ٳ* egg755y{{lBP(*((pqqz>''id21 cK3aW_}hL8D]]]bMuuu(!nxx- ag677wttd2.KQTEEEuu5~ˋbA 0()J%%%]]]Bm۶iӦ D">o0.^bFGG|H$:v_|1sL8NnxDmʴ۲"]]]hVpohh(;;׷iۋRPBzzz d21 999B}6??h4zxx\8p]:uyN:_ KJ{{k6:: "ȑ#| @ )zz涶n۶-//aG+܆~W^yĉ٣P(n喊_07(,,|wN8?i#J۞{xx^kmm}I|7?#/iv^]]]\\<::ZWWW\\!nnnX,ϟWTB]Pt .X,@2:::<< X,*Y{^^^YYٖ-[VkNNNGG͛u:ݱcN:p F_j_nkk{7NtMMMuuuGG:3<< /V=sLCCٳfNC;::vwwB]i{ttTjڞSNjjjHCLϟojjP뇆 CSSSqq1*z_$B?3ATm0(ʡ[VVV|JeIIIuu5_?t}}}F$JeZ~gt:|FinnVR掌۷O>AfYѠt (۶mY,[T*ʕ+Q6{^z 044d2nݚZr^#G~m /P]]K/ ͙3Gz=++kppPV#bsuuuA[ZZGFFCKii)d2"deeuwwKm컺nzpiZ~GjkkQo۶m//\oPfs-[^{_O?Ep=.TJR"""Bayy/_KҠ ߑ$i6<=='OlZKKK͛\Bh0P2 @RRRDDDaaEAZZZtt]Of0lvllN}|||}}O>-Т}]Z]UUr) wwH''( … sss===#"">쳙3gu]۷oGzoV(Jh̙ }ݙ3g\y<ݻz뭊>hddСC>,Z/..Fف7Lyyy)))M6 WWWo`&Jkjj뛛?Su鰰W^yBxĉ+V8;;x󎛛ۿ/@pEJQT[[ʾT*-SRR syxx'999jz֭~~~>}. ZV$ {&%%M6M&m߾]T4gϞʾfR뛕m۶褤[Ɯ77Gy$((hϞ=QQQ e{/JXw^JUSS։;R^^#ssꦦGvvvr^xggga> .EFFt: bccIq/D?p||w^^^PPL&vvv.,,V'8ta555*ʸt뭷d:OG8pb"<5nF`q<---$$d۶m}}};!BTfee >8rAk֬86AV֭[D{i;l- ?%K---(϶P(D E͞=?/"ロ2e `ӦMJEEݻ\.poZSRRm#JW\uւakZAAO}5kSO=g4QKB$ɠ?88xԩׯG Nm۶=c}ѬYϟtwyl6d?fdd{ͨ[xCEESO=j*D I2)){qAfQѪvZZ@ 8zh||}BQmݶ~3g d2ZصkF[Q}rrr[[[KKKrrb ===MMMj^zꩧh>z\.X,\.0B̜9s;6+jJ$>b<ϟ?z( BpٲerKGGӧ̙xyyi44נڬ~xhhHPLٰ{TTFAk^TzԩЍ7&%%޽{ٲewuρbP(CQd5..nddB(QvhEBhJVj A>}ZVZf###SL1c > H'N0 6l8:8f$Jekk+[o-))1͋/ ILL&z}s̱$O?/Xd@PwvvZ,;bEFFfŢP((ऩixxXTB 8uTnnIZ[[ZZZPt/@Tvtt,\a[hrrٳg>d2٢ECBBP6d''9sK[nnnBKk I0L^^^V5,,L .LZVdRY^^!DIIDQLzk4n_&|ɪLե9r9Μ9sBBB322[^hZu:]YYb4}VR5i$??-[UVV" at6tw577#wFI4iҎ;OP(;#>& gtڵaaѢE .i"//ORQTTTQQߗz}yyٳ]]][[[,Kbb⭷ފi^T*kkk ŤIf; ŹsJKK4rї(V[XXh4\VV,4 20eXPH`^^EQr  2͍===$IX,~Z.8p`ʕ۬fżZ t?wܑO>ݽDT466qqq.\ 7Lqqq+W NOO[[[/^LQoZQ>Jb Ii/[ɓMMME-[;p8QQQgϞmooGGFFFuu .\gff>|޻lmtp*c6===kkk˖-ݰaӧ֯_=q19U$5554VF h B񪪪Ri]]ʯ~!gggݻBBHIIq\"̜93555<<|Bرc֭qqqYYYohh@8r.;00!iJuwKҊKN4 |k>\UU㸷s@@ӧ333NaXHH˕dhG`hh@ 4iȈDY,X,H$9###DRq\RP(*++#"">j*wwwHtĉ5k*իWKSzjQQP(LOOp8]]]QQQbLJᄄBl6=w\wwU&O !rٙfffr8r6=uTkjjbccy<zrRtʔ)~~~2;<<<))n@Yx-ZT\\h bYU*l^r7PPbJKKO:zֶ///___H9sT*UOOOZZZ\\\fffYYYcc)S0 p?`P=00E555mذ[$effLjWWנ WWWܗbrooo%bquuuZZZeeeVVVZZŋ'M&MԩS%~/\d2$5 EQ'NXpaJJJVVVqqҥKі'OxիW'$$[, .`JU\\2|R]RRr-DDD;vkעI&%''XNǥR;EQ(/''ghh(>>^*zxx4c4/^d0 ֯_/cbbN8JJJ\]]Jum85&*L}}}:.!!t _w!mNJ @2겳Q\ӊ+PI{?!~Ϟ=EzjfWWߙ׶rktАۮVqDVׯQ98}gxGviQ9,Dcm08^]ߵ7xpP9,F9Mq>:;=SOWzZnkko`B󋤐ɀN\o(רI /B ۣP6a;KyDtщpANn!(p2j\Ͼ%~B96x;BB6":Cr3^wh,JEUSGMWfQx-& xMwzgm'4̭j7lؠh F|&R]>^q<^31g_p~Bd;!7fC힨z {( Q*ccc2R!ywH!H -,8t:X ?U݁q'"H*J$GKƅG6`[O[_҉bFmx5"*롇z+(At'<8~T_ o I[N^cReC=1Zܿ9D?\)ўqɬwJkwR+|@󻞈9hWGpÂ: d P5";/Г/Gl}b1%cAĿDmW ̍GoP;ܟCęXp̢ގN>C@uddmhh >33ѣ, UVVZ[[3a7770ԔFaҢRy<)(@S䫪FFF`5 I"@d A;;; 2;;jp02㗾gpĄNc0 ĞgVUUa`qq hhh(//wޘz衇 Q`9ydaaNDvB}Gß Ssssr?G 8qD"7麺>@RMMMnnnxx855!:;;ZĄaCCC555ƟF@-D"Q^^^ss3aJRTTuu5ammmb~WVV;vFޜ FFF!(lnnS^]]\II B !$H%NJ >^[[V+++qgff'''Beee`LGGGMM L>rHUUS(vttBA#D\.?D;v ^~`p+..޺uk__Bhzzފ0L&T]vCjZ*vtt444"0V߸q!rKKK>㏇?Yhoׯ_)/*++'''zzzd2N+..{;v n"|1//O&555a611!Zm$%%͛ϟg}=6yGG6?z}aȎׯ_500ߵkWee%aV 611H$nnnѺ{36b&Jd2{@<$$˫jƍ^^^ RF\777[[[gg缼<2`0\7hP[[666j beeefff^^^B0!!!44Tutt|L&S,BlϸK$۷o9rdѢE~)ٸqc{{ٳg)JZZFqF}}X,622'p8|>GVVڄk4'NtwwCj*۷9׬YC\|KbFR~m333+++Do>CCCsssW'Ot/b=3&&&3p!SSӿ1޸q#00G"dddDEE}o]FFKFFFsssmmmvvƍq BݵkL&311?wL&ppp=ÇStk׮)sΙ\|yʕoNNN777WTeeeQQQ/f2w{Qߟ &''lvww>:::44R>oo7ngggGGG|Whj@Ts\ Y;șM/_r7lذl2ZM&;WW۷o;::^v4-//_̼uV]]]aa!D JMM}g %HYY=<|pMMMYYYssLGFFZXX\TGGMMMͧ~ZSSR5MJJGGtRRRxxoijjjaaqa##>,***##cll d&''e2Yxxt7nX,WWw}!ѡT*D"_|z&??? ի۷o_fMBB7o ڶmz衇<݃ L^~ePhhNӧaUd>tO?_ ~( $ pHcP(?p0| ÔJeGG;vطo___x`FYroees?W8˟tuu>}!hѢ!X #TX,_wk׮Abwy'jquuՋ/T*Y,`^^9L x>Gk_D`Yimm_ciA###΃fgWXR!!!FٱcΝ;GFF ryJJJPP?B|rtt`?h޹/w߅*Fsυ477߱c 5F;111ׯɁ%Kܹj֭ׯhhkk ˗/߼y3,U/[dnذ߿R E(lO&}Y4/f{D"jժYPcccooo\.T\.d---:.,,LR d///:~풒K`XCC_]]]<oڵ:](Z[[ VWW tvvd2333D ^vmQQϞ= t{nnnsssMMMZV.u֭Z*//>7nt?D1;; h(EAAAeeJd2YT"rV-,,lF rrrꫯڪgffd2LV(K o߾dɒA\hѵkbbb:::D":r CC_СC|>!i !DBR Kgm_ 299?88^ZZa R(RrZ=<< <wŊBb('x"::zjj !P(JwCCCuuukkڵk;;;]\\233o޼ibbBѠJ%J'322rBH$ %,,L&mݺU,CĜ= jkk+++ 訏O[[[ggg?F:@ D[n5YD٩hh4ZhhlCCC[[UYYYZx'(h w]Nquu,v.jusssSSBcbb漼fff {zz @J=ϟTP(j Jl6;,,L.GEEm޼Rx//zL6;;jeeRQQ144IV`m[[L& JMMMJJ^fMcccnnJkoo1A롇z?HD*razãp֭S|~qqNӟؽ (R)Db2====fffYYYrnnȨ;,,mvv`p8p??+Wk+WR %##_鳳utt=SEEE433srr*))y*++cccW^(bbbblll Y,Vhh(l``(J=< 6Ì>vss322r'e:l2B122xb[[۱1\=kxxxDFF/]+"""((ΚquuŹYI$JennnggbVZ```K/XEEFF.Z(88Futtlccc[d333aaaEEE0\C{mmm@@Eᖱr+WܴiSGGؘkxxxSS%և 766R(ssm۶yxx )Pvɒ% Ϗ)ʝ;wZXX־O>+H= 2<@f||\$ ~Iܕw,C6x<ewh<ܶm#1(vRnٲ%$$7Ixq@petqRRL&{j(D06[bExx"bOt:]zzzT*LPt\a\SSCјLi4'3z ZI8t:Ą(,q D Q\2AGS:aKD[\R&q{ _`H/ѼJ9Odlu x! a+H$BZP 1B;_+G_,ց6?Tjx9WCU0j5*Jh) p<5筬ݱ4M.9q%3 FYv t$J *DѫDJo9 78pDd܇;8#=|w$<&opTh% p߮]Vd2b›U#BP5&T*T*xrao&DdD? aT O 0VdbbWd2/ B-%@ Vw/qTC=O1jw9>>G? \>66,!}H$T*orWR)P59].}/dSI$ t/dGM!Cus TJgJw ++Zz&{]tkkT_ wMqu:OU;UL&?r衇z衇Z?Bwjhcwh"(pߞ?zNRN}.}y(O\vl^KDG./ ʼn]ׇM!G8 ]x̝i `%ZX#wշǿ=''Ye0 c2`L&D XUUennnhhA"JJJ Lf^^^IIT*T)<322ꀊ$%%ipp~hh(##]&;::Rmkkt 0!D"򄄄Ϟ=f---9v<1Gg>`600ciik}p@5!I&&&8q'``;رcFFFmP ?*g100 ccc### (J/<HPpz|Q>̌H"C{!MMMmmmr---,KєԘ잞gggaXuuN;00`kk[\\\VV`0 o;;;#obbfBa^^^wwFIMMe0ǎ[f ]?/'|1 7 Uę}А{V500J8a B0-- Xggg~nz_ Z }P;{,7kھ>/#D"2ںk.4GРRΞ=GPA{vv],JR |w999h^7hmm=z5$W޽{xxᆱ/dff:99tV NN|訝J $uϞ=!.W_,9tH=%pcx@>::R EZZZWWa ~-?!'&&w[-4MEEEMM hȯYテ}ӕ8ѣ]hjj ޲0 uH$Mݩðުvww7ϟHHH@tIZEjP866& qZ}ڒJDD$ BPaaaYYa###%%%k׮ 2\RRLKKJhppPT/IMM]]]%%%B5++ !$GFFD"B%##CPd֜Q\\| pP(B'O nBHVgLMMO:U]] EDDh3gΤ#/Dڵknn[~=a@'aXWWWRRĄ@ PսxdrY Ê1 D[nI|nnܹsh~grr/dookz{{ƾK.UTT \uţ_~,}G,+11̙3聇e=C=~y, !y^xvbbfۗ4ۃa*deeU]]gmٲ^RoXXXO?L&"˧z Nѥ;wj!khhP(sssCCCӟ.]ZPPh4VJE6lzjPT R[[ x嗽|ɒ%CCCccc0C$;vٳbXP\|yvv믿mnnRo>Drԩ6o߾۷o?7jwt:==\ƫ^*>!!A*B޾o߾G {Q(K$iRRPPpڵӧOK$ :thhh%!@pBKK˟第˗/D"N~giiYPPp_]rܹs>))/_}Ղxg.p 'OB䝑qɴׯ9swvv~bb⣏>ڴi۷ottt߾} ѣGaj/^<}4Bhş}<>1BB/ õwޑd֭[hkkkmllmT*LPQQ1__;wRZ`͏Ьs1Lxruu733S(VzWR)"W0lƍ333r<;;;$$_vqqj=K/4>>&uPhAҥK/]3888441==aTܾ}׿T|SSSH#h NX, n:@rѯIBVÇ|YYY hdd77ST|ʼn`@]lcddDz衇z<,0>|̙3ѰWZZ)uuu5%斔@|(uСs-Ykjje2ٶmh4\. *jҥ ibbbzzJXexx^BcccVt uuu333yyyeeeFZ]WWW\\,gI$К5kJJJ<<<:tiX򚝝r@laa$VZGI$ب ꠠL>fmm]VV&J5;;;;a{BH*4P(|޲~||v.]T"X//+V{xxDDD_yWWW {{{ikk2:ñvpp033mZ www[[[L&333];ώqqqaaa-  VVV8paa :;;9L`ʧz* "M6Q(BQRRf_z饀G".]jaaQSScaa'=<N Y|x|m( k4;3quFp"\ =pO/4 ^_p#RR\PC* rfqHո:D"nڴ .JRA?: H$iݺuZkT;x܋s47"Ķ 2E{/KЉ' Jx މh{M00ť Ot:B; wLUu!р | òz衇?0 QT*'''Z:0(V.ONN>=P_ՏD"I$<qt:T:==GPw47֒H$H$ #_L&g@oV#=րT P=C=x\;L]k~Bk~T_ wMqu:ݿʐGN^j4T=C=xV|'~$^Ca^}P8ٹ'|!^g)ܧx}.wj鶐 D}%/Jl1{O*C]%iSDТ'&A mͫ4tڃwrA 8O7~ʝ/p޾x.#&W$x7^/{bo!zߪxp¥`(@]+wdPx"BÂN758&?e+=CGF_?` L@ח:77gkk[RRRZZjnn@D" ;IOO>lQE: k"##1 ZT*AL>y$w0-^~ }\|СCNNNׯh4b ]GyVCCCщyܵڬ,L۠yd2;vlҥb8##$l @|p͛7A{{ࠫ+566vzOX~~~s///:|^^^mm0lzzurr2--D"YXX`VSSSTTd2KJJrrrFGG=<<:p2\SS3:: B ;<33sIC}|>ܹsUUU___p}0 ~ܜꫯH$'Ouo%oïZAq`` //T JZ[[1  0ҵZ~ juQQQUU CCCߛ] 0|>_,*J Ag$0\.LNNNMM^zđ___PgggQQQuu5a@_ZZ:88o[ )))2LP766a666VUU977Q#0S[TTt)DIII---q\`򂂂1B?$B噙:322fgg~R\b)P8;;B555.]hff&''gzz!TXX888HuH$>|~ EVVŋBW^E-vQccc*** JH$.//~LP^^^qq][ $PH$ɼ]vt{NLLRԆXh222B_&'ʒ%Ioo/L`6<<<;;hooܸOOO7*>t2l޽0>C=~y,qwZ##0778ooP۷o_W˨jBfgff_"&J0L*d_]]mll^UU⋡VrvvDt:=00prrյX,N||ݻbqss%KBccc---jU(j5k w b[QQB$""b\|>(==رcaaa{qppX~}ggS,,,RRRlvZZZEEؘϝ+9NAAT*}w}Aɏ0Lj ><33۫T*W^xnnn.]Zf >PbT*rvvvqqCCJ W\ 陘>zhxx痕ekk622ܜi&(k B###Zl++7o2\GGǷ~;88255-((.++KIIhǏ<|\\\zzzrrr]]]~~F+++stt 700OSSSmmmm۶DN---mnn򲳳tr<22b1dzhjj?بT*}||ZmvvS@@@__T*qFxx;bbbr!/bѢEIIIRI(J$d2Z[[;;;Q?ϯH$ֻw^vw}WPPPSSSPPpƍ{.666%%ennu떷wPPЭ[v؁O7z/ V3 ڵkfff۶mC455-[ N޷o_Qu!P}@12|UKK˭["H${=SSSDX=p466Xw9qD__?A,BHVŝ>}Ϟ=p7n"?>|xjjʕ+ϟ sssd2{N>ߛ30cT[[_}ʕظv!!!*  AUvrr:p2S$zh֞~{֭h4>`7g}vjjjvv6???44sttDmݺ矟D,++++((詧 |@LLŋ#""xmjj822Z<3ZJFٳgYYYp0رO([PT־?<>>>~~~^^^8-/|hD"SyGG˗8رcll'\d\NNNg0|rSSSF*--}饗6oldddccy5kTVVdD2OOO???__߀oId2YRhʕ?eJ='µ};w.$$&/_ îH$ںu+BZW2220 .!:::%ɳ>KRi4L&555r|l6snnnzz:33N]|hʕMMMyyy͐}:99b NWYYYZZ:11aaaeaa9"aÆa.;55=K"!V^]\\wSNa&|||fgg5244T",_<;;O>Q*%)8CCCoݺ% УnOKK+,, B@ +^xBmmm?Ԕ;>>6+ @Q#N'bcc\n[[[{{;!***))iɒ%===Rd$=Bw}믿Ub!7nɁ@D9==}֭N??Dfff&@Cr~xJr``EPXYYJبI8KRUTT[]p!//Vnݺukkk:W(t:}jj^*BruuP]dT*۴i4"BQT</((FMNNBr-[a'y}PEEEmm-H-YJXYYZ 0!HMx񢹹9w XaOBBBJJJ@@Bա`𬪪T*uuuJxxx__X,NNN+XYY 2LRy{{ׯ_*-- ʁ NLL,..H$ɩ>>>yyyCCC$idddxxxxxxppPTFDD$&&^|qÆ MMM $.%%B롇zwOquujqqq"BgJ%ˍrySSo :Oa2= e_]] {,--T* FccX:Pk,Y$::z||bJ[[ۗ_~JJ$p+++HlnnYzmPPPXXҥKMLLΝ;CCC-ZD&A1 6RTOOXWWWannkcc`ff9HJnڵN...o񆹹#@0,{{e˖Akkkkeeeii<55eggwnpK@`0fgg_y@ f''''惃˗/0I|}}ý"""<<>>jD"UUUرfÝﷰ+plxxx`` J%###pT*T* kllܱc</66ybbmܸq```ff922 FGG}}}MMMz)WWWXXj]PPPxx8t:W$h_|[ZZrgyfѢE}zhi`'JD!!!< 8~*t J&bw??1xN`w/ ---ِ /|MIIP(D"UVVh4&/7{yW*8v=C_ jҒN9 p0ia'>nkk> t:;4y/TR:v d"O"B@_:Dj"Vp8rMFFF`/V;$8;p',ˈ3ÝEBh&rcf߰ M@I^`*\t {퉏ěƭB 8G>>Ͻ8:n QKx0~ D H߯$ PH$333~s-xĊG;z_OV\ wʂsjZ C ÔJ\.ЏO X ONjD"I$x=`}]?aV!HJ%bh@jBH(>r1 366VTm4Ls2lll 9|P(]3>C=w@AVVV?S]R 8Blffw`1}\\\~#/0( ͳʰX, 200BR0\׽Gٳ'$$D"TWWSTKKKinn!:)//O,ރ7nԴ;::TR333atQQBHNNpqq0 e6mnnZ... ðԣGnذ?%%Ԕݾ}ё`޼yJZYYeee߿ݺu[prK/:C,o4PgHє6k׮xxxtvvjZ&&&0Ё-ݳׯ_W\.7%%errz衇(z{{---a|2caaNrKKˁ?=ptOOeBBBZZ8}4BH LNNRT&%%So[ggٳg`g}h^Z^^5ϯp8!GGG++_d29!!A.@Q__?(Ϟ= Rb#''!r RƍUUU_f x344ܵkL&uzJ z.u֦sΑHl~I>8exxիUUU/d,-|ڵi rssac1]VOMMwww_p!466aXkk\.y&\UR Ζ?ru~Sh|>T*teff{GGGZ?Ͼ>;;&PggիW EUUUzzzWW\.??==][[577W]]R(2 R%X,HMMuppNB1>>.H&&& ?c`g?s?OX\'۷aRʕ+$44NC{FGGS(LvlR۽{7BO?I566^t gffT*Ukk+a\.ҥKp__rerrðL͛7+^t n<<; /1 a`Ϟ= bF377788xakO?B:uL&;88d2BJ_~%F;w\]]UUUՁ.]B۷oguuu6W_}5%%E(¦.>711ٳ<ڵk bxvv>~-Dڷo_KKݻO8111$<_nݺ%RȨ:==]P9rJ[dIdddxxxxx\.OII111Ybggi&Db^x؞?99j׭['H}}}@ڋBܹƍ᳗׋/CR\.Luxrk3336}ƍ@pٞboddN8100~ ~gdNLLyX,U(re˖=O=?#ɨT!gX,ڎzPHe0$饗^,...mC= d2ҥK< Bhjjm![[oϯ=|ȥj-ZNOO{՞/:88<!%$ < BÁD"ǫc2'O?q̙>PVN:_— qqq~ȑ#bϟkhh ǏN<)y睃ՙ5E555}J^h4nÆ *dԀ<ԔopɤG hց7|gaXbիrm۶jL /NLLxP0gٺu\UUD"a0fffAAAׯ |+.\f U(|>hh|[u:D"155}'֭[755UYYjժ۷o,P OO{NR-Ydɒ%&&&`0^q`h2xVX恪oG?f 6چ-[ѣ0ܹȑ# 0T*#;;{׮]J#qss۸qc{{(Ʉ$.KKR͛7{{{lܸ'*))hgyf=C=822 իWZ644@=QQQ/S(L&ҥKvvvd2R}fڈbdeeMNNR(4 à =s E,=h\R._^ }D" +,,lnn^t}#""zzznݺE&fffBb0\*)44… fff|>cccT͛!vJT*E޾}[.?L&y>?88(BŵZ{4s!Z TEEEIIBhmmݱcOWW'BڵkK,jjX,vrrh4NNNUUU999K.mmmMOOrn499-HW\I"|||RSS\+Fy&N***@y!}vXIJJjiiAƮY!QRRѱt҆k׶]zUT>S .ԬX$--֭[0zo 7*JT566fccciiIRcccL&L Η_~AJJEPlZeff[oSz"aRL&#sttظ6HT@@Fp8~~~J^322鉉144dXMMM...;v׀( &''cccccc,Ybll.wiff688r}Y___BͩZJzxx0 ///5kZ[[{xxjZGGX,Gaolllddk=#abBCC\\\---}}}=<Ν]]]^^^&&&666\.f،^ÃFAORCCCq}}}ƢCBB-[fmmM&7nrJӢE6lݭVmߜ`0fffZ[[ׯ_+,--1 S(6lprrZ|9ϟ |饗lll===-,,dT*ݹsuPPA__3癘xxxԻ)277 J˫](+===+W񢢢5k adZZZ‹oHHHgg3<ᑙr!F466B^P(400uvv겶^d N`vvvrr]"pܗ^z^{5ccc!!!d2BX[[jZccEPh<==MMMmTЫjddݽnݺ9. /`NC=Fͩ SE"QHHnccP<vht[IDAT#,q x<ع;q|dwiiīă_|m@|mFyGЂ<klJEP\ZhUczCAVYZZr*BHժT*<lNua*vyg)JVT*\.on#@yO$E# 5Ԃ(С@8:f8!r- %F]ZACӏPBƂ uDR}1Fq'zނ8?QT[UZH$Y#p®Fy 7":x[Ol |!A=~$[o8h~+%yr'*p ^;pE\HHO#0) x4w;{ѝCm눺Dxb]"oC=x?Ve9 D 7SJ%P&;b 5GGhͲXoR{18msoC>=jzAgA~/kc]zUM( Ywww 222=<<(Jzzz^^O_?BjZ.ɄvgggS)*s`ܜX,~ԔBp8fffmmmIII0IO"87B;ϿtH$rqqFFF]VVVfnnf/^XQQ |>ʕ+eeel6+++RSSj#BY,T*/--=D$B@>sܹ9WWi'''Ѕ!JÇnP5YѼFٿݱcǀ}?EEE^ZZ l}|>Hr###`.**r D00++ޞfgddx|>njbi=믿 }ɸycccmmmt:v*)))??͛ "99 nK$)++bq8l>N%''XQT]]bggW!HMMMT*B49AðFCш&6˱;͛7ہ,##Ņbyyyaz衇z< JQVOx<77۷oSuEE믥RX,vttO{9 BV;99~ujo߾bhh833s%P(H$vT*5''=1˝rJxx801g˗C0vY*Zh())-F@gϞD訷ɓ'l%B?J/ڋ/ >_TTۋaXOOOZZZ{{;HHH~zpp̌H$pBUUa YYYYYYӧO޽{tt=%%sxxٳ\.BLOOT*><<֦d2˗/7/ Jp>Chcǎ}70| PFFFFF_P(.^hggBR(%%% DRTߛsΟ?_^^aXssӧ'''U*Uyy۷% TŋSSS566 k&JUYY9>>>22222777#drCCp~fdd`&333;::vpBQQB ue2Yyyk:;;+**nݺa`nnn||͛7B ˡgggnjjMKKmhh8}t{{;a2,)))!!A^t_˗/!5xɁnbbbmm*,,uCr\&&&333 ܶ{+W߿``+22299yzzŋJȑ#r>#|;G[[[vvvzzF-**066V(7o0Lрsr9>55 !4<<\ZZzUwI ?I$̙3333ٗ.]t+++Z-РT*{k/ŽhbRy턄۷oDtssB=&TؾrرWvvv^px׮]!2888kwa=CX, ~5kְl&iӦ"R}3(ΎNaÆիWZ8Bh۶m:bnnsEDD2ի!x===j5Ͷ噙>TVVUlmmu:]zz(Jk֬a0'??_ڒHPrrK/A-[hcOOh```iii||<Ԕ9r9BbqNNE }źvZUUѣGbqCCCaa|:>55o>KKo}߾}bxS|X[[?󾾾LaxxxllD"زe SZYYmذ~rrӳ o580999<<$ k<󏼻}fggp){{{F#H/_zgϞӧO3vX;>ӼWd[[o4>>>''\|t:=''̙3555@;(T*ݽ{7055JNN&_G}p{ꂂ[n ?GG=uԑ#G---;VYYR<877w1gnn>;;{npuii)LBTUU9sΎB?~CÇtzOO>̙JV++Jc0ǎ=O:88pTYYiiip@"=::!00pժU۷o)kB蘝O<{oV('%%MOO=zɓ~+WryXXXTT+VXf ӗ>R( ,|X,Ry!A9>>dx_1{xx(܏;mcc311gddTUU]vmvv֭[Ro=yK;w>===eeeK,پ}T*r˗/ԫ8顇z|;L>wҥK{9L~&):iVxǏ{{՞gzxxaK">G#BUUU _|~8$S+V8ydLL7|WLJJZr%B護:raZhѩSV^}₂TZUU%(7n܈ ;pO?fvv`d+W.ZfWVV^:""BR{ g}6,,sݺuaaavvv ibpӦMuuu,KѰX~6mb2* Y~HK.ݻwnn4W^b2w]v}Weeeh!^}͛73L(_DFF[ጏ;b_}ll4$$dÆ 666$駟޲e@ J4800pʕ8)B(66ܹs6l oooH$Bpxx;wM=...00}```֭O>$>8t۶mͫVڱcBxqqq֭sww߸qcll0N'7mfKKˑ'''wwwWWWOOO###???x|ꩧ,,,z{{RH$x/'''aP(<|ٳg+**֮]h``m۶իW{zz>StժUxbz)'J kkklT*<<<<==asyyyssg}rFD%%%!y睶SNdw…={Pfk֬ikktO<񄅅RW׬YS^^n``BT*511Noٲc!:nccl2XXt|>ѢE˖-ذaCHHHWWWGGB-9[[ۈؤEKѠiP[[ Y=4bh4Tȴi(I$rl$ F =C=~,s}˗퇆tN{'t dA%]zҥK2xO^jgg999uuuBgffd2dIIIII@ غuPݸqڵk,+,,ĉ6lJHH(,,uF>SSS{{{CBBz{{]]]|I'H$[oUSSf!/TSSS ֮]k``Ůjp_~effw}G&/_\[[ aBJFFF|>_PB///"Hb800K*ĸê:B0'SO=eii988H"v)&''ah~~~yy9I&7l`nn~$Fcoo%Cinnn7oʂ(;;FAL'&&΢G0J^zuɒ% III0P(|~TT,,]tڵ\.ȚhѢ!R`0nܸagg>8￿{HrX`0Ο?F@xuesyCCC+++#ɀ_VIJR@  T*533kmmW(ZV";={6''2""GDD,Zwٹse*++SRRBJF@R K j;[[[HhѢl. -B,N/))y뭷<==\.t##R*++۴iBFh{АBPX $&&^xϏB@n@ h'OXlJuuut{xx Z̙3l6y!']$BB(,,"99z{{pR   zz衇6J$RiccjAyǎBҒ{zz;scNPlN7<_VFFF tVstttqq 133suu533YjUPP,TTTظmٲ̖-[<###D /۶m>>>^^^!Bqƹ9ggg6-<==agEE͛9CTTx@@s`"H===immmY,P(422quu}Wa$0oxx8&&Y*nڴ ` ;v숈 HAAANNNL& IKKK.dɒP//+V BBBd2O>.BBB~&wq26x<?7#CAsssff&d&&&k-ޞ?77 />}/<qv"""BBB _G]~=L*=A._vmddoI555?c=>Ƿꡇz@VYCB:nbb/A@@LչY#"P$Y[[TR FRW*=D>iA|dxu/J$'v "9:Q!LMMq^<(U err`ld rADq{O xc|џXlL&h4ȏ» Č{uAx 23~.~Y}7+.7x ~ ~3wTui3Ed :-i^Q 0X`$kZJy2d2b- gxT -?~zcO wʂsj@ ޱBP(%ͫã-,J: ?I݁_g;1 x@:; B8ͣFd2VVPb &(?T]w999yI1C=C p'Nh?SC*CRTZ (?IT#q/oJ%Nz衇zbP8Ƚ#\w Y/и~B*w-^׽kG^DmpҼZ]"YY}\qg >ߵj0C@)Dr:"p,АsF,X_<%U mp<1UKt&=6/ ~{';bA| *$+A(O߷JS>γ AݑBLĂ#4݀bt:W 3 ;1^0@!u+D%nݹz衇z<^x2bXPݼyszzRRR ݙL&auuuB=BR l7nhiir{Ye0 c2D{D"ѥK===ryjjjvv[ZZt/D|);tRNN@ 𘞞>{,χ=d$ihhҥKl6̙3eeeuuu^^^---W\ 9w\II ñ|rvvܜgEEERRX,vssCr`DW^-..p8! 'ZB={vnn-;;;--mbbٙJ DMZmll$F=T\\LP8D"yfII-ۛ?::z9dggaCOrrrjjАgV𥫫… K,΍H<'aw *Jaȑ#@} o>333P_!pj߻w+,_ 7 4*cddV숽; *xQ G@ǨuVTTBH,'%%ZYY ;wnjj˫$>>Z"fee;99T:nkkVd ^q+WSWW׍7z{{(Juu7,,,̎?j*<7uA+{gZ;}[YYlhhwΚ~WW׆K.uuuafddT[[+1-555??Ãd655]r¢>8k&=C=(g=BBB222vލkУNmǝhONNNbb"͖7n܀=0E~B$D}K,)..NKK[fMWWWgggMMMvvv``޽{BB ;p@__Hu!driiikk+Bh||ǧ￟׿gЦNaN+,,11ߚ {/$$d۶mUbbbYYɓ'Zmggg~~޽{|>(һ=zS Nؿ#Gh˗y{{/Y'ͰzgaD"/^xŊ O" 566NOOVTTDdpA͏9)|kMM}||0 sss333.]jllv횵޽{[ZZΟ?oaa NOOݻwo~~>3 WWד'Op8˗/ڵ4%%%???--M(TVV^x-X!CCCGGG??3g΀0{jjjYYYfff~~a==='O}1777ccK.YXXl6냃Gt###fzzz˖-\\\hMMM@%嚘Xilll˖-aaaf_B( `@:kdddjjZYY~z& ]VVvqsqt%oooCCË/{ÊW_}T*sssϝ;f[ZZNNNNt:㍍YZZyvƍT*yuY[[٭\RO碇z񟍻ϸ~=V=p}iiizzlii)=ljO8ߏSD":uƍ! F"=gy5СC&'';::t:?00sJT111Ǐ_fɫVBw;|0݀1H4ST{{{޷f 6644DP\]]J%ORnݺeBܬVTwMMͲeVZ|r|!?::$r9xKJjnnRp *J Y\\XbyMmnneiii&''AXT*bqKKƍWZeggWQQa2\.Ás툈k B33umܸ#))) UT˛6m2 <7 Bhpp0##/t!TRRbLmKaiii4:;;CRCNG׿4:'񡡡/rEEE?mccu㝜nmffv \\\L&{FSTT_\]]߸ X "!!ߞB)J\򲰛^W$H 7w|7|pY &iݺu111կfff#N> w.B~\A~ZTm6*:00T*GFFJKKKJJ$o/HT3gRSS-,,Ý8PQQ N@uܽ{WP\d2^psʕ]]]YYYW^]bRLKKKMMrΝp78^/˅JY`0^B*" `177ٓ >}>&&fbb!hT*˽q4l(쩩) "˗/_/W\H(Q!$oncc:;t:tErr]fffNN^wssCUB>>>0866v & }NOO% ;㛚Ξ=;00Zbcc-,, CDDƍ+++߿Oo"""JJJ"##a,?? v}p?VMLL \r%Ͽq ;w B.rh+WqܹիW_x1??ll,99YP8;;\W^ٱcGrrrCCCvvvGGNSrB0//^^:55m6vpt2 &yyy6mBz]nӖ-[$ o0bƌ]vvuuYرc,KP4ڵk׮]bA%$$\v 89wSSSd``K$jZFj 믿_3gΜ?ӽF166622!{|Hvڒm۶}箮֭<~BottW'A ?3|csܜV˗KR0~Y,OhhhRRL5}'[thPoo,#O0LTRTl J"(**fۻ|J?66foopW\b~ߚA\V\p``/ϼUVq8 T*###j訯/Kx7\ZH$[nEi4؜d2GFFx>>7n ??ѤPPaff͗-[666_J B@)BBB=<<)  x0*˭ZF HLL w06_JJ$Fꫯ Bjl6;44T*^bQT///. `OWbbFWOOOooﱱ177 '''."mlld2Yrr;ЁEGGs8XHLL h6l0 gfflJ_~e BV&X,?11`ii533okk+J===cccj\.z9;;xxxXYYxG!*\d2D"D*e:KqMKKKAA0|M.͛aKj@$|Rǝ $H_>9!d0j5L#5"щrȋHLw)^lZhaLp``0h42 LhqO,!5e0K(8 bɗ P`m~jGǯ'jt:\W*(NBt\A8o TzCj!*hboG ]xw7CjpJ |hxE!W/HGPp87 t:}0oxAꅃ'zԈc$C9ccD`0L7"m1Zśs"1݀HG|dI A XBh4---gϞOOO6}墢"[Bz^V[ZZfee577¶o;0aXwdN*ҥK7nܰMMM|>)ʩS,--SSS ggg}}}Ǐ?RnpXjjjyy9dz:vXyyymmm@@@sssffݻwX,VMMٳg)KnnnQQvpp4͛7wA=xC4G)!P0̙3vvv<o;Հb JKK[jaQQQ8Ye Y;,11Q,geeݹsb|H~O5440P(R}}}p344R___QQFLðR8,,,@j,77b{ʕ'NL&WWW î_~UPheeu0 +ؑfZZZ&''QŠ<}4vttDgΜ{82TH]]677׾ {>zYBܻwh4Z[[_oM1]SSd2ϝ;#7\"BO: A|̣SA"믿ȠP(L&sΝ!++ׯo~h2,>>VVV4 UJ%Ŋڽ{T*iii $ RTT>Db ?ooj{֭z[7mp@~厎 )mnnn 0 peeŋM&X466fee RP( \^^aXiii~~L&ACDEE}RΦ!B_R&ܖ]-%%ðb JJJgggq;&0 $N֪۷o ܻw! F4//ڵkPƌ .466~tahhȑ#nB})))`p֭SN566eff".]ߟ7L&I n޼yqpp0L###'N(++Ft҅ ]pARd?ώ&˩Zvbbڵk}}}ӟ.^̙3yyy!]Va<''_|j͚5p^r%''f!n߾}qx- BwTfǡWUUEGGܹs v˗/;wNPLMM]xlll CVVVnn`0 333zE___QQBhffۛd~'Z>[rѣGaᣏ>:rlyyC߿*..lkk;uԵkfffT*UFFƕ+WB߽{7\=z}^^ǥRimmm^^˗z,gggnJKKDT*ѣ+VO4  ꫯn_!A=;::[[)= vpp0555?+)))22B hrl** &{뭷zKjkk'''jurrr\\ݻw*nnnT*,ch4Z``BXv-F]]]gϞt2Ν;t:ٹ<44͛!9W_ݿ[]|yhh'EӥR, ϝ;W^^,H?_444gBu[[%8Uf޽P(_E"ѣGϋ, ^[[{H&)jZjllussͭ8ܾ}/,))8ydWWUZZZccٳge2ܹsi*QDxa{Ae2'|uʕ@駟 ݻ\.訬033{IDR^^C,,,t:ݮ]竫3220 +(({Jm۶%%%:uN8p#55544tT*7<<^cbbo2Ν;geeW_i4ތ;wܾ};117$$B.] >vXGGGAAA}}͛7̊rrr7oaL ݺu`fّ]]]+V(++y&ٽ\.رc===鱱UUUǏh4NR*ٙyyyr911MNNNvvvWK0Z077gXŇW*^|#GGRϜ9`cc p̲et_|a2$Innnee{Jeff&iii333[ly'&& WXf33r333OOOo&AgGF7{WQQ*))$J]6XtuuoM{D.)Goذ!aɄ'&&=sNXƧa޽{ c߾}wz A:!ccc:|Ak֭[~W_YYYرի СCvvv<\jK{{;˗/ ``ee)"##-[Ld2nܸաj*F^^ &''_y 6@ckk NK0h?UVh-[_^Tj4 Ö-[|5kRSSn:00066ZSS###2ҥK*͆QOOϨXquB BEoo/۸qgggի7ol2FGGWZf͚qiӦ5kEGG;889888;;;::h4*!!az!:66ёi&>Oej'99_RT AAA CT ڰaD[nMJJzaZ.766L&;;;@mmmBzeffd0111qqq>>>j NWWW^^_|166Bp+СC rǎ}YwwwII /l6;66vڵ0q`mmmiii2_lڴ`899pNtzYYYooᆱh@/UV#6 ---r|vvvxx͚5bŊ.dkkbX, ڒ^Xr2JS(>NXjh`k ]u1 c0~aTTLU3$H H!@tRFFFVV{}};pPYYYuukj͘@\WWw1Dၺcǎ<ݍ|r}}}ee/~ P{{R.*****pRf'''O>}Q++pWW׽{VVVn۶РRM&SAA3g:::/_f͚ᔔ///FsС'Ntww| 2==-H7o&&&^p!%%0T633SRR\\\<== ;u}BO . /_u>,++0&&&##cϞ=~~~l6[&!Z\.yRST,+99:Ltt4x,@j51pRt:K$544ܺu27D/ucc#|wi4FaX*h4x22^~}||7OXzujjjnnT*JYYY+WpX,G%%%:t($$d֭ﷵ555M Aij|TLbŊRioo]UU%ɨTjtt4=~J쬓xCCyLL (`߮355ER\n}}ldd$T0 Dcc#]n@WWd tssCX[[h ^ceej]]] h:!׶իW3 Raoo?33SUU"##1s*rC 9===<<<Ɯ4MUUNb0D`ݳ{FX Ω" &şpD"E5hnn&&&@ wrrϋ9>>f---kkk'&&bccmmm[ZZ"##B C,{xxtuu=x@(ظЬ^^^dwP833244QȈ8FcX+--R><91̙VHzjؘ[oo,t X>00`oof544._\(rJR.D/swwjUUU&,,޾NP$$$d28cxx;((0>뫪V\9::jff:* B0>00rz=FYzА@ʄliih4L&3!!kƚL&@  }6FRSSSaFڵ/,, (`||z]yy9 ;2tbZZZZmlltuuuDDp)\.d|>_ LNNRԞۻtnn.**|ZWW7==pS0C}}RG ݻw^ x.TtI A)=N;ryhh3qwtt|"TܟL&HS)qX;/---vor'-~-Zo8;;?mw>ϩmZTTV7o޼gs]ة]w!.]. _{5bg,UTTTUU1 6d1~WoA $ ^dl`` [qd\kc4JP(|>n A|mzzFYYY;&1"0qb{`ގ=c=Jո1"i.4JJFBg{(2M$=M&χKH%s\^W^L7O:O&''`#^;Q|^?!j\㑭3O9T*URhV\G-p8 Xoނ*|aS^'/Np l Fx6]R\@h4x]X4b<)t,rxt:0:XXzp=/ep|bχurZu:5,cG$\. w `0Z-~͓d7 xqV A0tA_#D ܿa#)?bZz^R-^vȔkBj&#d2(8wieG=C*{a%0 ?Q;F O K,Y.uuJ-{*0lzzX -ͻ9 $HX2o0,H@YT)#VǥRgM1 Kʐ6@݂j?'U $H'''Bky.s_ƿy1 ydn{daD`FStN`0pms[gaE=i:Ķezq6"p`a6>< @A ShyV !HUdq)=ba2|pIIIEEŲeY,VYYYNNBH(bv֭a{* K@qS8r Al!=; r5aUUUiii666|>;@(bAё(H|˗ 'RL&whGT*/=`x<l91Ν;}||`هhZ}r0S*..KXXXP(A琔V=~xaaaUU՝;w,--ið0R>Ԥ1L@pfxbjj[ZZ;=dtt4-- ڎ;f0+++?-[@T*v^(~̼CTyp (`ĦP(wOccN%eh}}}GQ(>>>---`兿 ALNNsss+ }u|||qqqFF ٵkagڵ{''a0 ⣏>Bvj7o?{5)((@T*[[۵k~333XDPnݺuADr 6 vڵbŊ7oB- twwP(6mJLL}Eqq1۶m˭=sʕ+Aettȑ#ӧO!¬a877tኩi4666vȑ" Êϟ?/H~Z'O\v>33Y| 2<g`0>裗^z)66!R233ᕵ!777##ŋiiir\ްaWTT۷OT^t)33vnnnΝ"ʕ+999ׯ_?|¼;Bƍ)))333ϟ?wToa0Z[[u:X;"RSSe2dW\Azĉ[nq8^z:VK3<<\UUR(`׮]z>[fMNN;::j4۷o߿bXєbV]] ]re߾}"h4ffffeeLK.A8p !4:::111>>˦C J0C޾sUVT"w햖YXёO>$66իuuuNNNV9q A !zzzvuuMLLիW1N߼yX.J`oojkkkVBBBHHálذYYY1Lgght$[o9onnnqqĄN[vU*t:=--FyyyMNN]J:;;wwwr\^WW7n_r%22r͚53~pp/8x`?B:44 fffv㓗WRRj>㚚4S(<޽{K.Nٻw/hc͙L?EEEvvvz~zzK- vCBB*++/]hii)캺<__O>ŋᆈeee.\r˗/?}tggcǺ9|VPPPPPPZZ*;;;_uС%D`0b姟~j4N>}I gBgff~^ݼy3|dd޽awxxBطo_\\ܭ[<==?c\JҲٳܹs/߻wj˖-`2p CBB֯_o\k׮A{yyޓ'O7bB hGwwwOLLP(B:&&&((ݻ!=!|رWWׂ.\~ڵ朜^xܹsMMM|FڻwѣGU*UDDDooW_} yyyϟ|Rtuu }p˗/oذ!*****ӓJ޻ẃciiiee588899y޽Xw ssիW666x$5$H azhF월GF^bPaa_Ww \ F166ѣEҸ1 ;xU_XϥP(bĉvn| t:?߳gOaa!8  Doz>::z۷o-]oܸ~zЛo_xLKK;vTUU;w333---⒒g0,--{zzz=xvuutPrwܹ>&q T*EiZ8_%ɶmےlܜ / 2qqqt:}icX\TTri4ƍju{{;DFFB |5kN>}ѐiJ5::*oܸ_JRuvv . <[׋DF#N߹sk׮eddT*'''>okkzꈈBL&Bk޿366BDDDxzz)Je˖1XM6MOOOMMt`466T*333???V >|󫯾ڽ{F9xT*yk˖-{W?P(lK/o>GG3gaC.|NWTT tR ~̿B666󋈈pvvnll p8& zfۿ eee,Ύ75x8lvrr!$˕JeHHȊ+@/!477gmm S 0 ׿_ZVV^$Hxa0It… 'Not۷fLD30Y[[{@\Tx{Z!t;wJ$۷LFR900PXXx֭wy'..`0p܉cǎ۷ᄇ^UU/\QQQSSښ\zNFT׮];uT[[[xxڵk[oQ(&icccß\zuƍׯ_OII0L*KRhRJR [nbb%,, %%E(={B~ ҏJ{K{n[lӧ^V1 LLLmoog2OkZRy)2Ƹ\nEEźu뚚N8Ct:Vd ===ǍBuuu`effVVVfoo/666~T*7m4>>.-[=R)F}S,,,|}}z.,++P(`sssl6;""BTBcWWW_x=&&/KffffffbbbOOÇ=<<@_Th4 633$&&~AAA|>_Pömt:]dd$dOÉCCCYYY b֭ NoGBse ۈ^_bELLL^^ީS?[n]~]"444w}v@@ݻwpbbFQT0NLLϧϯ… }}}ׯɓ'o~ҥtH,JY,VHHH$흛c0wޥbX,VQQQAAڿoz{{رwR(_=44~򒒒۷ݻbÆ \.O?mmmݼy3Ns $HXj*jnnnnnNPrB g$z{{\\\ Ͻ{JdIaJrvvijj"<<sJr---Rtvv6,, kkkooVիM&+Bhbb‚F t:Nx˗SI^0xzzz"aadŎT*wN}C P8:::88hgg~:Ν;4-<<퐞aFQ,qll޽{s I$kfsssbrFh4<ohh,lKKIdjkk P(t:쾾@<888>>nccB\R 022200IRGGGXLP|~eeddXuuu,+000//?))0L$3 FD-,,mooWWWt]0qsrr\r%tqqD<OR577re/`Djr $U*U]]dbXQQQі>>>JVVV^~>P(+ 6Z(]AAAMM|@T*՝;w(JTTNojjP(vvv...---B}hh(22I$0L#[uu5-gaa{pp0???gggXqR(  %22^ mmm᧞^xD&I DGG[XXzxx ttt8::< $k`VGGGqJ ̻|is\.%qwtt|"w}uȹdD??k%CXRPPb)o&]Zn!+..֭?D"'uI AfttVVV...035_`0́'Mq웦P`[V+ ,tcR|X(0?Ax1.G<hV4PF)Jd23;'Z/Ldh4s6Jn}CIǻ~tt&v. ٘!*Bu$R2LO{|AO@o -C^OsCU"ЂsހQy,cZhlԠBϮP \.{l͒+PP aYޓO,E(yQw1'Ғ+IG'#~C $ Z{;;p___Cd21%,>O=T3<<*t:hUs-x#T$H AFk2v>ZU橃099cgqj%$ nA{1~ P?q,] ޞib"LD $H< `F `2t:ȖOQT8e2%^0EVqb@P`u?v5> @mp4 eeeT$L&\._|,t@d2d2`0bqOOOBBJ Z\. hdeee@(jyah433+))upptVVVp8^_<>ʵL&S*Npw'$$<߅ h4ڶmdB"dgg'%%jM $~jE4IA1URe"ʀ1 HKTJ$P(ۀ-뼍4`;joPl6vW8|9lZ~^ZiuD6r"`mm &DOב A OT*U*K=X@LP(ΏP*`0z}HH`033Kӝ'kL)`i9d333b)zbnnt|LnakcX PyϵT:c'0OXL J} $H`[2L&YRR`ݛN#.FRus*z(2ݽgϞ^{-$$D׃sϞ*2Fy2gvg\ytgX3] F.b $Hy&4M&744ܼy/)BMT=&>?pG4Qސ?vFH A $H<4122P(pcN-LK'CO$ܐxUg A $H Ai}$H A $H A $H Aij=: %tEXtdate:create2019-02-24T13:59:28-05:00a%tEXtdate:modify2019-02-24T13:59:28-05:00IENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-filter-menu.png000066400000000000000000010710461414302661500272160ustar00rootroot00000000000000PNG  IHDR"gAMA a cHRMz&u0`:pQ<bKGDtIME:yIDATxwۯW*EQ{I4X1$Fc0FcXbo(DDAiJ\z/oݙ1w//I,s;;噲> joo1 P}*J%66PB $ltttuIg_APϤ!tp8DxTiR#gQJWXǿvcd~EٸqcMM͡Oqk׮+xAp  àZ(ʁZQW64_vD,ôEg |ڕ|dS(S$$1$`c)2Ǝ;x'صkܹs].,˖e|!EQLL$UBo_عsM$#t],K4xWpWFA?YUU~m۶D"A)uO>)))1 !DQUE3EG.\cznwyy 'p˜1ctʭPԥOJ[VsFfv%H{j~~`KRU%^J(}}YU>`Ȑ!͛7uY^׶\BիW+>hGGǃ>XQQ1hР뮻W^ٰaCvvUW]"C=H$ƍ7mڴMBi@]]Zj… \wu,ϖ#c_JJJ!=ؐ!C^}U0cկ~o4?)X,6tл#,K˲ljk/첃e \) DB\0iY#&iZ"FZ`!C뮻ŦiZues1w}u]?cɟ=e|+/H$IKK_RUUu=H+n.^{w80HFLrwuu!$I,+H8T]zϸ\BUUB>/sW۶vZƘ ZVs4 ikj#;`}MhkCx\ǣ]q=jXI1 "rgyfKK 7pǏ;VU'xbٲek֬2dHffA[7B4<Ȝ_EEE^xq~_3N9唴p8#8 p+,,x<(eee]s5UUU;v@麮iڂ {_ᇮ_P/?|Vps=9lf44-9oWwi=a@@0B1q¦[,,B)#'P(v;Y&yq>oi DQ>xB_5](am,prqx>1O)|^HJDe9X*v1?m |Î۞;1'fJ鲥KAH#СCsss)cSJ΍1+G8K_AH 7|s";wuE-^x/bzzv\I;>xl~dYβe˚gΜaÆ3f~gnGwnb~OävꙔcPDTݲaK - yw^^^YgYYY9lذO>yĉ-+8㌕+WzifeeM6skxJiEEEiimF֬qeee-[,=S<?FWxMyq2`@MUש.o>Zj)د=29hy(\DXAx OgwZН! M"?(瓗#<ԓ2 UtQT$Oظ3$IRUꕜoVH$BSNn*6qQ^廍3M8zܹ˗/?묳֯_[o׏3'(ŋ]Xs=wСuuuN˵e˖ &ٳ'L8q֭hMgDT6= "D)` .K$i:c Q$r1BϧBUEI%]R̎YԒlQ d06'eڷ#.?HIx.FS:0L2fSd(FX5Q;;2 K 'a']KMmƘ!v< !h̊MmIEI0`-T`s!8e4qxKrFbVw4C6 bEdA9nUI5i}Κ$,&1@+0WEODƘEM"VMŀhӢGX b2'qgߒ,;eTd \1 Ȃ,"1Nɗ^QǹN C2bvk~ zko777oܸ#;;iBHU+V455$IR۶+**DQ4-kC1t V87???777 fgg]vedd=zԩÇӧϩvz TWWj&b~~~AAAVVְa è? !YYYOKKC2hjjʲm" m"b(= 44Mt_>l.lCI#[I.UԴ(ҭ-[UQuKhKr1ƚc͚! SFZЦP2J_6"r1mӼ]>)IX `4&Ȳ@@A B1`" ܊5 u :Y,>U, 5Z^"*|א+?N ]ԭ,WlJ"@64nh]37T$[vMm %]@w뒾jIУx$!`At0a$fǶ4oLtfYQQ74n +:*fn}k[MѦZ67mW"sR^7NҒȀɂivnjڔKX;ݱ{KӖhBȧfnYamkkV%4QItIj[77onTvV5@TET,jaUU#"#K:D(aAE1֙\[:T=W$osÏފ;Θ1cټys,n[Ƣ_~yѢE{.P{w{sjAǛ {k }9B|>xDQfeddmۮjpFaÆߟ1 ^/h6rH@NNi IRvv6 <}3&==r%732b1(hbiZ%Mcy3X 4t( kEE\z}Kga1!4Q0$cOo~1VVK3 ٘[6W嗶tbщ+V8M’.37\]zޥ#$&B1B(JDUDذA,1+B yHىqc#*,/,Z$M JJVMa҂0Feۊ=]'$`w*o/?2ȘSEumڿ!s&$H]<Zv,i+YR9&N!p$T-~p\Y}}W׭^Uj >"eA-ۻ̮ WF{>\tahY2 m-ۢv4ߓOW֮\wY{}Rޤ'?i V)xd#Bfhqˇ_. 1[߯#ڇt왜;9AKv=+U/wyLbDݫ\]uʺu%%o#ѡʬyաG=e&5ZPX֝^Y~]MƦvY{YʠTOZuAAMm-0:TsO>Rf-/l~+gRsXڰ^C~1'pBkkڵkgϞrJ4/;vxٳgGQQkjjH<&GO=&vgE6XB!J)jۆs&,[00 A(a%X@cR3Ɲ@ `PzB2p5$aPT23i"M/03-Bq1 ԩ3Ȗ0Sj-Z$pzJ9d߯g#۶UUX׶vǑwv hKo쨔eSHu_u[/o{Ê %B@SP,z_Ƙe4`ʤIW^Qf̈}TS;;a!CHA1I_mt/ʪ @s;]4a4TQ!,X ]ye"7 m[eBI;g |PBg+I'apԎ\|rEG7/a4Q[SƯ3L-S GeBF0”QUTx OAEG.}}(:ѕ/aiMݚxgU?>Q<}q_o .S/k~RIuZpS={N,:zmWW)sz}#ko9JBfȫxT:?-v+;++:+-6@"K~u].(`Q"F($%QHDIdQPdIDcQ,)$b,I2?JN'*H(`EUEi=w0-5kĿݩ-\(ef+M_*Cg'5KJOg0ffI8x4A_|!h皛734GxC+V br FBE#\Q&T7vO,:#1XEP(?{5ƣxxxb9JSZfuiӢV4;?YCbW}7Y1y͗ lA-ʠ.ݻp[k.X g?cўE64p" 7aFg5EZPĢ*&1}Bv Ij fŐM "-^"X ؊=+bmFV0mlX4gJ7uI3vts*>V0col{s lj};*;*kC€X_%ڂ0"(5g M/l+םnug3_>z`!q+N(qvX"bW\1}xƘ w߭>tTX"rri©Z P%@))&ͥ5 H̑~jYkUa50pYutf_gnYzĜ|jW&T\DDb$EK.e65nEȮ]?+ŧbSҶҲ@-kAW>SX,\ThYW ⽒|Ϣ֪UFves}k}}GĺH_S)|zٮl'[?0]ҳ\O._VkQ%oMh'O͟\.MZgo7eJ,n={c Q%{>^wѥ-wSpL܎I7Vml6  _2;/fAyi@DgSR"+~੍OTx8xsqذqgΨemmܺf"*%m%]<]6]5*O->Uxg/wW\#W#~Ԃsdд={ |U2wq"8ꨣ|>_WWBwݬY4M 0<O 9jc8%ej(=L T;b s0H"bGRk+BMrsd+1cڧ=$+B/"oxR)+~t&cTQFYԊiƳptSv;in\ K7q_&(bWx̮D$HE)FqE-*JKBI :T(/99cDQfjkKOiA;2X!vtkIrnTWn&I0d<ްA\Pӟg_|!deѣmnCeYq+~dޑ-04muK.Xtbmvpp5+"V$bE53!bF-]f)?O5;Zv7k=~cs':oyf>輣Nwj@ˇ_~_eK]N)Ug?kCW#U^aC61gbIkIOϫ?o6_\_)|cz_T~r˄["MMbH|e+܋^G_Xtͨk|[yL3=x &N櫖+c[Z$QD?zvE&1bQnȣsݪۣ{YD1یP& XMi8NT ""Lq_+od">tI{]qۭ.Y m FL]:$`M¦,BT;rVKN**!n?%pg\06Ko\DU=EhGmQKEc/?"gda(7M#bqٹ^ y.#rsU&z6 SDL,fU/  Bؔ1U.VӇf 2.sT_PgO;88888888|Uŝ"{Cu{ekgږEוcA}MU/d\Ym–гk: IZoyCMWyKMܖݦ̧J}EEB`2jL6*-m;"tÏoc@(ٲd͕57AQ,cLpg\;8PWxՄIg/30]_ݯKWN.o%  4_#4 W_weeek bKZ$a}uN,dAm+m7ºm:OsOPeɦ,uIB0 0Mtiu]PbƊU|:gkֺi׿pgֺ. 1+noP6n0dXYs3aQln3WV0( (+[㲈[2=Oаn_ItJo%3OBCA~,Gc\q!`B, `2YVJkVB؊:;mɅ32 c#AEZǟ[S=XPX5U4 X^QE rO. Bu] J=PJ~nM&aI@oM̞KKD͐0A1#Y%* N !_s0Dex@m{/C"Iw]XJ)Tۺ~,A*{B(A#:::^ۿf2a@mӌ@Y31J!#KZ@@0*a!Q8@_w8S!5P?3W+ Uw:Am؅ˏm|?cLw~a0|;ͳ}rys~gKg,n`m;++v۶}MRǿ)[v555?v1VXX1>f1Ƶxb333^eY?v{].4QaSp+Ά.B4P@caXW3ºwb6ˆQs(A O>m[ˎ(3Vn $ֆB!{P-2j(ƗÚ?ߋ{߅oݜ 5/Iqk,bj|cদ&۝˻ƘR/U@ %b{{{MM,K$?^'~S.B0o/e cAO?IF(PhС,x<ES0!, 2 W Mmbi}䳢>Or[nNᵃ( OAEXӴX,Z 1Iꐊ`g'(]VKtIX^0`3 ie̎QFݒdMlTtaEC@EтUU!N}Jj!0ԃ;ȍm{޽@@Q7&&RכH$LE!LӌD"<Y].9sars!(B,UZHʙ1( G c,йppppp8,8;BuqO$IE۶ ! 1-QeE6!qgzv>:;.b@Q;!D$zЗ "H?CsUP=˦/# \QmR7ϭ[U .K’!Q;jRSĢ&h bGje&jiY|/RJ@pe)~zۿ';m۲,@{{y.b bj~1^fMsssffq$Imz^ L-Ԝ'ҿPJ5MWTTEQ BofWWט1c&LH$dYZd ?ꨣb몪Y^^{]uU#FD"aض 6|cC/99 TQUU;;;̙S^^.I%Ĥ`lB?,R$%`Ps>_+& ~\X%@A˫4MAJB ؤI303ѷ9j/rBڄx"^*=}l`[tGjΟ6!s;>QQm!,_yԟ*ews8•CHOΙ3g֬Ydɒ{}>!sεkVUUq+۶]__hѢЎ;V^]__/b<_`wܹhѢkpw%h5d1ydIv׾ BTU---N<ħzjݺuk|m۶1b3g 6mzg`/^|7嗕׿,Yj[[[eee?^:88888P{/c+Vx'gΜYSSmۄR`L0럀(`i?A S26xTXɹK+nij-S8 7ޡ3QX/8(Cu;lrJbw"2- NtVH?)D(9!iL˼v𵌰s?"?209,P!.i/YPc0oی0M5H7BFD<{kB!E뛛̙[UUkb1EQlfmv0UhpȶJ)5 ߿[c(VY^/B)5jQGuM7]vٲeaw_[[KKKu=͝;wʕ͟0spppppVJ@ݝ1.\pرW]uUVVV"uc{{KJJJJJvܹwݻwdϺd/c,y>UsV~ pШ_O9JOO0`@ IzV¥f/dL$5^>t/Y~J)~_Z"5 ܢ[rwH= 6m۞vLȘvi4}XaikR$9>x䦔NϛNl?=-(nj/H$Z[[mhhh۷ɓm۶sN;gwtt#.AxF"UUNqZ0ƉDbܹn{޽/x<0l6M&כnH4/hmm4Mp8,IRZZȑ#nY֦Mƍw%tuu C0!K{ݻ?nٲEUUBH333[XX8xYeY6Mz4NY՗N*/rsssrN4yPVVvϞ={׮]ڵkDrA[Ҿ6UWUsΑ$/x<<*7豂+Vںq2ɜi>쳖e}^z&%=Te"h$;^pN.89Gͨ):݂=>sGݘf[mƎ{%u iDU8?!T#:0ё}g 0 ~\L$hcРAFzWsrrȑ#322BP$$x<E9=լ@!g…|1cV^'꫺3ƸjjjDQwׯ_tĉ'pAg? n{֭[lyw;|ܹ-o[o au kD"++kҤIǏw\vpϊhYֹ;a„Y>:ujCC;;;n( !0^ysP( `ƌӧOOOO_t~7v5zhJ5kDQx<{ŋ>dȐ  :m۶5==hmmm7tS",vРA UUU]vggg[ظ{nEQEy饗bX k"H\}P1ڝUzs1ҸqSg3a%tҴ%CպkKӖPm]δ͐ZY9 >Y@JuWuuWuCMƘ.;Zw+ysE{ENE QqE|7K6-B  קO̎aÆeddx^ADNNN>}+rVVVzzMӧ#bXGGc*4H:y?H$N>iӦM0!??, ;ֲ]vM䴴2[\\7tPEQ9眺CN4:''άZ6~tppppirSQ h4h_@3?^/gdduQ^k~I'Fg}ꫯ-/k7~·zg-..>묳c---+Wu0 BH,D"MMMf  ,kg̘QTT4mڴ_~Nf1ooܸR:a„: z뭢oFUպ.׿5!j˖-UUUÆ _WoP(|򲲲kfȑ|𿩌 LfX q@ 0`ZIXbUuVaA Xp͍5Iٲ] hKX Hsn-`Auj}FA? Z8p wG1:th"4h4i(80?>QTTdv<0`ę2e 7pU>i|sRE%aÆͭ0ƣF:t(c+۶G˲:>"`ȑ&L,+7.vi|6 . $ X>}"HZOqj뭭]zD?{]r9sy˖-OTU=c.ni۶mG>s>SQ훗G^{;f̘ӧWWWaP#G$,Z[oݼy֭[srr.򌌌+Vb1(r>}{'s=\qx =zgR]]-ʕ+ 2lذs9||͛79|:\;nt`E L jnjf@E#l(Q& #` =b DC$@Pk1`pbI>|hgr>tƘimmm.qY%5;Τ~jr0B!>MruؒCwz0MNDEQ1vtt|"4Rglz{Ɲ{~m0qc TܶGyO>g}ԩSg!}RܹsO8 6ܹ+;wܵkWYYy睷}D"qYg]tE^zaiʲC=ltӦMgqFaam!C.\N;mŊ{+seHKK[xq"HOO>A??dW_b}l޽wg}e}+1ƱX[(a^a_U h":`?{b 0< @4O٣xǻW V$ddd477|1 96E4ߧOwޞ#BXALe(~? ~|P(|l' 49b{ʔ)e˖O?zYYYK,:uɓ|NN%`! zS@{ks29ypPׯ yj䒑`SwS翭w!.-ppppppppp7SWɁq'4o~{jU%YB7q83MQ~jH%IJnw+\D%>^[[iؽ8Z_o;s"ձLhҢzs$ 98{4M~LzuG+iÐ䎢4i& CbFltm]\˲xF?1\%7K&GC)4v\z%aE"@ϤضmY ]]]՛­C UUu{Aե˲ȫV~i}駏>5kTU}'?D"Q\\/X`ƌ}*))ӟ>jԨh4O曱Xlv9sUƎ[__7744;6?óg>餓0˗/'/_>x`0f̘piӦ1ƞ}W^y~[n14hWoH$2p|pΜ9[n+FQRRSO]6;;?/a}7ߜ6mZGGg}駺|>n>{f77@|mo2so0;!>Hni^:0Q Ȳ|xgr 77 >,r)MMM|R{{oYUUve0`(zjaaO>I)E1vG={@aaĉo֭۽{}7k֬Gy$##SOu=;;ڹs'Ht'%:!uw?SO=o=yx>[vG{n>-YdժU555~c^r%e0ʇӊgyf„ ӦM^SOz{޽{ϟnݺm۶o{ꩧxSSܹs+**꯾=2- BҪ HJSNz,AeRғcj 1x_ URcN$9H3| k֬2d^777O o9r$t„ … 3`ӦMӦM60xrkÇ,k9#,ڰa߸q$I`Ouᴃ `Ν;'N|||ĈaCXZRRwk{#~gϞmԩ{Ou{t׮]_|/|{:KJJƎJJJ,Xp饗8dgg>#H/}[Vd~vvvFFFaaiSabXrGCtԏϟ'Ugn̙s)--/p˲D2p:nYV4ǫV*))IR~&S/?~EEߞ:Zis駟~G`Fcc .]:o޼O?tر7tәg'@aa?}Zd':O.^XQ^xaΝUUUW_},Y)lr8ioԩ'x"|ڹs' o+A/? /Oqn喓O>yѢE<0⊎򂂂7#FXx1r)\s; NBHmm?_^Qu{챧zX9m5Mտq(nYEQ ܧOQ~ӧO4ejKK ߃ɲF'6lX0-E!>eʔEi 6RYY)˲(eٶ $ɲ7oo=eAnJ~>1 \Ӵu=SNE)닿uRmܝٳy۶m]w]qqqEEѣ-[+ٳ>C3,\0 y䑧rJzzzyy5\t~Æ _|1!7o^VV֩1bƍ=\eeGy䑍71bժU۶mC4MW_mmmꪫ!>u벲O/\0?Y^pӇ~KOOD"O<'|B1bĥ^*rSSS>}em tgL4%##cڴi?￟H$~,Z_ܲee]foql޼y…ꫯN$/BccW^f͚_|qժUӧO>}… ?!C\tESLz~44-qRj㎒ے$544`0oyYn~uuu[O|wx≥K޽k˖-{饗Eyϟkq3>:{7Μ9cgy&==϶mΛ8qb~<O]]]VV/^F_yn裏rssG#?,X~ԩS`+V;ॗ^۷M)S;cTꎎ={=;88.$p8)bAAAsseYm1BPgggFFﯩEѲl>WH$EF|xXNNƸ󵴴$ Ji0777 bFFFWWWKKKnn(zhkk(̚ID^^3988Bh4 `uu$IH$ 7iooG)mP((J8njj ^OF{Ps~7I&Bn?wy]}_K,OA7n5\s7o޼𪫮z'.\(B߾}EYfݻ:,E񨣎:餓:::B9r7|n{ז/_iUW]5w\nS2d,Çk|+7P(DQ4xw!=((`LOOOrq^^^<˵m] =.sss|>'SnjønǓBǺ~vݙgrC$GCP\{'Mca=qY3̢"HB(nݹUi$c۟A=W_}i\)!˵k644D3--.--1vg~yyy,#BLBb555|"˲.ɓ'b1I$IBmF)+eu]/+++++K>x,jiiצK/_~7|s[[[kk~$7 9qe󛚚^~/<77_~w`08zzk&LϻņNygQPPk׮ y睺_ɷիWX_~_~mۦO~ 'lݺd̘1]crl'WRF}m$zйrppp8<9ĘyK_Ax_=4mBH$zəx0ƽ/0> Ƙ B$If͢^tEPZZ /{w[ouֿ?]ֱqwpppppppbfccc~~eYɝB|ۍor7:IW֞~s뮻 =R?$y&5~8iσ<%e{j_70O;88888888P|ˊ;ө:nRN)ˡ2B?ɓ''h!f2=5Y+ڴ|K"'8O piUQqC?tv'R;߾饞h2MI..~888888888^C*^4-󽃃wcLQ0Z[[|?!˲z!]׿֩sZ$mgdd1B$w TӴ]v͙37M!@`̙3l>t[qOkد"ȱ븃tpp>uu˲$IڲeK$&o!CPfff[[ۮ]:ꨤmS/%OeIxታ8{;38888@ض-IeY0szݺu󎪪G4h'MDe1rAH kn+ǽ]uEQ ٶvgϞD.r۶;:: 4o8{!ݏgqppp#/ZH;JKKn˲g}$##K/}~p O>?0 ۶_|1c|Gr̙3GF׮]1~CYEWZ5dȐUV9tSO=}wpppN{Sy˗/ />cHIΧ|`͟7xc^^5\+PJ}>w!ٳwCBVZ%y4M[`k֬?`H$^ZZZYY{I&޽?$uY'tŋǏ_b„ w;vX7йppppܓBvfSyVB_~w In p8777;;{֬YW_}~K(bW_=iҤɓ'ׯ_qq(x .>}iI͖7L;888$q:888|sw߷LYYٜ9sBW]uՀٓ&Mx<7pC~&N(L2bĈ#FǏ.]4PJ=ؗ_~cU_f(cǎ-**Egeey^[[{(:888|?8F2?8\/E$o`֭H utNfRJN[tpppppppppqO=s_&2y5u:5Ltl)"#Q~{Ңۂ[%rpppppppppmS} ]7/ *?D"F~[[ݻǏ1Njs_ nݺ>}}keF@1e=# .'E` CaE! 1e`a(C(F @D`130c00@awge S C(@x@3`0(0`(Ƙ"F!2D3Q01@!D)0PEQ}`bün0Cb3`]Q1Fb!x(f Lb($YC\8F! #(0h Sؿ*Q Bx1`^(CLcFs:ƌ1f2A4"Brb^:n31ĀB(_κ" 3LBw``Ā01I!k(F"`eyc.d10cxƼ,aa  !`< 2 !o'<'a\0*00e<00FQ3> `B(B`@3@/RJAB 3 u+ hwBnΈ Bm1)Ā֙J`a 琡͛xH6H!(oI <#ĠMu'P0PF0=z|!/a`;;o\=)/2A`0y=c>{{cs(P@O1Xƈ }Hzc#h9qKݎ(ƘJ|xL)c1龧>2^Aair$g<3Q*`Dx92!O"0"OĄ& Ā>X@C%<\ (zAݣ,E=2ܭ3`H 0(V?qxL!^k(YO<-F10/QOFxyr!iwo\<v>=fv  A{:-|`]=)F!C<+p(ՒY'O,Y"^ ʥc!3wE\JN*r'{.8b1=-0PJVec@y܌Ga$|0mٲ7 & 4w劻(\e9ս X`3k֬[nEh41VUig~ZZmے$aYeY_O3!# N¾z*_D=Na8_l'YzOAz?mԓ} q7)RãIt+oO 5@B&uϕ0 ϩNzr/Dy`/j/b|S,싥(ľ' ~` )a@/ГJM@HEOKBuHJ9 #G-%IY)I~If:Yd;ipVBx_mXO3د6&'SR.`9H,/g0H6ܫ=,LWs5غ;؝('Ӹ'}VH k5V/ yʾ¾ZI.#$+"d2 ޛ*k6]JRHݷ = J-{Jm(#}jk+4}Wԃ$Ct$ٻ{)22}1(wDz{w YL:p_EC9گ#)b j/˲0#7V͛(_W(--;A_zM65k\p7?/W_x &|ᇍ{.̞=;33K.E:#wY]]=bĈ38{+*1\cDA ,(֗L6ИTPk5%2rÆVpH]!g!1fQb׻=`SIf(OSZw`v+nT~Άp@Zr 7e[GgRW`OZէ}22E %ֵY֬li9Z 3%j҈مᶁ]Vf Ul+$bJYSGb@ ^#蟨 'Ux9-...%4ː;VIPՙmMeFuIrkiDo}BMVnY';5m(Lê*G}|;JoV ˖[bܟPܺmfln%O,3aE 9\$#oT1eXf[;ɖ-pZwrMKYu$ 4bl:ӵv)swlAtO?2b{7}D"9-tɒS<5soۄ-FwglV۲Ih3\^Z?*S_Weqf=K75H#z^24{XC>VKi n (zPH_KO_{NVŞPUWLlbPKTN[Z;G6TڍcMтŢɕi{&,[Oa%7ŊZs6zˋ,Z񀩷@M5Mz%A,؝(WCZD9eQQU/Ԉj[X^^X } Z#-Y/dղ\{h]V ,;cZ \EZG Â+r]Hbݽ[mHG4᧝1Ammxܮ[Zh=AZt7{PG3]ֻ*6C"~sOǨx~"]uvF֎DhQP-gYRjhQ9;_US.̎pENʐkd'r˚-ZܬW vb6*$F ARXk^ש'U4撴11zSf~Zmڔ*, ła303VZE)?i .bw'_pX#X|[ou1ttts9^7p { ^QFM8=S9.A(ŗ-1:ͽj˟s>|.KËQΤM|??o̺b ״e{׸9wÃiUfGϜYcGsl>8/K{>o EW}/y [3{4W1gnF.k]Mxw3%\r\δki^sE-_zF|G=T 'pi('ttJ]eǙ9]m{ \}5{_cl?7M#jF޿/}߹H`UŖoEgyȲwœ':G<_>zo=yyX=jxZsbgϋ:O&/R?nW2>k}94ZU6m3KC#'9Glޜjg MԿLq_(/_Sfw\ᛞ^ro|dfϚ;Z|gYċo-+xyyhq9㍷'}7h=wtsyTɡ-`Rlk+?gckg>awm4|Ŵ/c4Kv\i^;j1YgЕwdk;qjhCil۲xAwu嚻߽ƓSiyYߕkAe}}|#vyCO}wӦ2󬺕դsg "VP2ٺ2Uzoo}‹V [;(TTI{6OXrݴx!M_KgΎ|ſկN5>l^0O"_v}dcqݿ?h֭eG6kЎpEd7jμbIAל_]e׭>)GR_z$NW5*]7~ZuѴM_˂#ϋBדodr=~z;Ϩ9(# Zmi+bǝXuO$b[|XR+O҅]˶-+xfs~79W-A?h=ZS _{37pC]  ƕ#͙רzڣow3(/pTG6|tt}:|p>D>;˛ǹ/-UVm^YZKsGý_3G upiLv+jYD<~u;6_+Ż}Z4qO }>:qn$.HOP ]?e6,oGӕ_l*;>}xeyK[jK^r̖ӳA{9ͯ]>ȣO鋎3kIm{ ?kӃۦ!/~oj_+ް1y/| iz8ijy !"G&[{ Q;{@x[+ؒX!Tf%O}uמgvL|L;_OQ̵;24h8Z{؀{sk}gnkC)mMߵ\s5@ 77t]|iii>3_]wu<X[[۵YYY۷o?㳲xK/reeeUUUM8/o馧zrtw4$* \`%Q k%=^/˯\۫.*|Dï"{e4e%knOTi^߃~VU"YR++ @I(!uMeMTuEIVDI4t5siB> ׫$*baK<2tIqeE]XUdA14KXAЫ Iup!WSU/VuAQ$|xTCbֽmUuc&!C=y5MŒKu~%Ji ޘ*ˆ[CKŠtՐSe#zU &.&_W\~AD2.T]0ܚKwky'5T+^ĠQV݆nUS<ݒ[exT(Qí{fx.ٴU5ܪ"4]oȊyuGǭ]N5b.z4ɐ5dȰu%|>UM B<`OUp@AtQ4/ Rx!˛."5GVs]+JO+(D:b"]n٥)-} 4$EUtYs+ ~$.lx%MKjeE@%dOV5Rō<~p4"nf0  #yu&^7VukC1Bi~O@T\.$\ ~Sѐ[PeYt4IT]ۋ%Y.$E4vI:F_RQuuQbEuAWT+Mce]5uQ]ґ"%H%a`EQ2tM WS4ix<.Pe0|t䓔˭!4L,(.)*e%.T %{]nIî4#u*v!Ka$h r Aqk(G͐->A$ Y fZ>YnQ j"DGV *2 Ijt H^zt]S.'qxDYCAY.Cb>U= jP^-_w3%@=l$[ 4#&]Td٣$*I#*VuCMK coP Ըv).d(ZR5,y$+K&HbХRեJϥpkEIV=RD p . nP^1d y ]&ހM{ܶ+( .5\d i.Cuz*~EV|k܊ˣ Ȯ(/kןǐE"s>#]X Epy\tɶ)JߍZeQ? k~eLQtQHZ0͍}:P}{UQܒˏ(U[t).bܺ0&ԣ.R 55ٍ<>Yѽ遠*Feˊ_q{TttA󹴨K5&`V i(LrdՏ5BnY6TeCEӽȲ_edEuIʪW󹈥=H+ETuElA4vKY]G>eĀ#!#˶-XAAp{4[ 8 نae\>}˫tUKsIWu=()[2X hDa%nE4,ɚ+KT* ]_{4d-ʺ"4SFLT{EIaO]M%Q|2\+]PtMPtAA"z=dQd +bH4EDAAEԯWc\Eq%$%n*uֹsb/⒒&LPUn?ꨣ֮];pc=^>|8OO>>aÚ)Cݸq 7`5nIDATy۫>h]!bFlPJ@fSRJ%m R(0J!RPF #)e;)!1RBJ%@Q!e2J(Pl!JBmFcRJ e6c2J)ؔQ0fQ)x9F6RBxE %Vƀ،F(#ٔ1Q^BB a@ `JmbSx8J)62¨M % (cٔل ƨM(#6`sJ;/T=J(lB)ffRJwPJ PJ(لeA0FeR%`#)$(%0+_nQFlfwRBb3J˜M)EF)NuWeuSwf#@lPL)%#@B(o[ݱ0e62- B)aR--Jbw7lFxc'Q ̶-FRvғc.s Ԧ2(NvF(%)Rb% 0aԦvaP1Jڼubw'Aag xNt+0`ym'؄Kc@l,ؔl#QnbS)cؔJKJaQ^ -:{ i6B#(e<&}lBlxH.0z$Kw 56#ڌblJ\@3ljS(j@mS(zQƅ͈?x~ӧݍ| #`(jSP]0&2fSʀm 6~WwT0 @!@(Iwr" eRxPG- dw;%Ćz%bC#vOb睠{`nԶ2£bGGͺoMvJz% >|PBmC2ƩmH${%ex~!%2~#RދlOvhLm =J(~Vxyo~je@-w%GuΩtK&'͌f%PBB6`腵w-L!cYl?B@PΣ9y9;Ty6|w>қ{VW8Vo3ZYYa:eiͩ,[jڰ&Ks͸x6d 5Rs~4lՐz`4dKOYp+kl cf,fֳ9ض&V̈4l.d4κhN5,iۚjtcsf ;'fCͭdٚ(ڲfg\6ɚnmL!lBj*뉙0&;,``Fgg [mLWM3{ڞ]f7g^g4W&ν.fv|5kּmoˎwywx㍳!_oR8zB!{fjc$I\dyyyyyy%y;"۷Z[N){$I8 u$bZ[.xfGh-&y.D4[Hdov ^m=;b[d{\`&Ng, 1exvM،q(c3e2cĜZ;8판hEulr i(% 5k&9,5I 8{ƛfyJZȌ V0"ڌ lrXPl"S6ɔ֐P pK d2aY4yyd0A -̥U%xa"vqKݙ^L6kDe$& `D,79$`+#E @ IlZ$ l,B62= ؊Hڴ 4gY  70@|e-6}G%dW̆ћ@6D3`b &,dr^(A34ĶE4DMlgDmuI AJD #A2ggMgPw Bd+Ef@2@Y&y6fVjB4U& M'Z#"YbfqaIP̓i>̂hMi,Q[ ̜,dւe@̏~+|ȏy?`7;>{#T[rns/?O21H%p$ZO̮$Ď 8ֵpԉ+JDBu4 4ZZ4-Z0MTdD"됣QV(F /EpHa"JL"rJd=NdPЊTWA'Dʀ6ҞlVZٸPY  hH05 H+426I&qKcD[NB5T%mQA`*E#Lh!"5m0dY/$+lyz1Bi?+-YezfՂ( ,/ߴsɉ%c~ש-*Eڷ.]36tJCJY+=Uzh삍A]Mv{Y|8Z]cξ;vPK(7xMU5`e+{ݸ/Mշz"ե[Z+PӸB ٱ%AسC5L=my弞237ځ*sךՕ\z9Μ ֞;uySPv=}msMm>{J%k__?3[xhs^y']\رqՁL= %B5vvIGdxiXW._\ИY3oUϫ3yc#۵. tR~V8M}3ڷh/~kz֛\.qUWjg9T\'hGa爚PtIJɅ[~Z,)f:҇7R_/=p+,c;_7Q(=Zo;k9ߘNw$++/f|dkZqRrdϝ:|`9)w<׵K axvy|qg]uW?le:Y)>[.4I~U~asU6D^|w~}Q>wz}e zvXX]lpLGڭyn*yd^Oj=]2Z=W-;u3#=ԚM:{UGufsKþu5zSY#ym{YSkƜB@ sy6NzS_(ѫr6=8}K #v۷xY8^} Iӯ;T*o,D節+o';vON{Pc_c<%؊]cF:Kzpz5=ip}YCzֈn~o$3Ǘb!ްl76*ok[iنM/>I4߷┳ϻq,]3N|z'oX\vEuO[C]uGz҅Mn <{Q osMSyCOV8k͢g:ӎdsC{vo;^9T8PxqM^4bo4IWI˺p/Zm3|ekfwWNVHϖ7 /pVxF?unT,y#]U Smn{/ O^biYSJW}`xa!sSMG *8VkewՋb;t)E w W n?oyW}Eùo,zoz8xE]d)6W8/]'l)B5O/UqVvx ή쪞';t?=~3땋;˶.L9W?[,ҁ`/<}qivRwKеn>y5菗wxAm8Z`P콝]C+֟ymG$=hql贙68X\8Sn8cxrdeʧ"]֡F(PUhiX'xSjc_E] uut}02 юU{nҾ]մ߻VT4bupEvxx]D*&eqt?i]ػqUm.w~<6>tI}aBYݗWڝ'eb81~9/̞Źſضέi+>QY8Rp[g|55ċNZKEG)uDsaG:ӇzePԫ)WkОEOwmeFdP6ؽu> jfOiDMLVYQлO꜎g%ϯ?4qXm(u]6>v@TVv䌤މv)k+J[L|S+&\-]z-)Lj(ԇ>sI(*1+tkzs#q:е`sRƣz!!M_0W&^[Or)M/- NW :ֈ[ 6Zt;{8.Vyb?h7mc'^H􉅃CS`8a7a6>rD=_8X;KKT;M-a6NtCS&$Odurh@ :zz^Sٹsx@q[z3f.1:%7N[,N޻sE;G c.GF姄˽Yإm]a{&͟U? ʻ/m?wq½۟k=l\vRwb/]]tlHwp٧/{\x[ܿ!/O& 8@`rًrfI23:h.}ɒϺ`Me]dz\>Mh7Fs"p28Y>tZP6{hoqz]^Wϛϼ{6/C{ɹaYxAz-+z ZV;P;`2Sx͍=g@n[8F?i.= `uoҕx#<8uN#+J;ێ{[vᳶg]?KPyk v슷]<oAk'FN.`]QY;Cϼԓ~5uLeAMQD2sxU92Tu)-_s.X\9t1ydW-j?rdoXK&-|CŕzJrvnɯq =ʻj]:vG5Q}tYOՅ; q97)GdCw+o9wWOV!X41 @5zٶPi0'KW aރr )쯯[r˯Rur!VrI'{O/Xѱudy@ڞzZ]1|.⁓,|v4ZvEC{T&TE%={Ѷ}ۖդ'٪;P_ȩZZ}JFc*FmKPpjSklPȳr[7 iX(] X`Jp}7u L@i$fOhH9Z2DCF@.pARŐ*V*P.9XxՁcCB}%IRu` 1C$@R* %\jz!!r㜎ʄеƆ†,R( # ȈL"04 \`Rj0(:3ҒV2@`} 4 u~d< c0h-2+Ф&"BU"9lɂf2nj aAR{P6kTlIӚ=F"a"b#+BrBN"IR0NLN6QhCd15рI,8 D' B N$]0>,83IyF@ @`✅HH ԠbIhiätekhjhP,=f d9QJ&MX: Į4&ee1Mu☈nSGAi!1 plZ/H . \0b`cX8^b#@ԭOub7b "b9Dq85zjSf϶DRBjPA QH2k#\RNl2"#*JK(c8BIPOl  O)bcE)+4 R0k+2RlS ,Eh(@ƱVM<6bt11zAUjc݂Bs0RJ 671ĤIRrl!!` GLXUuҔ5sHjSp,5Ycd]8Ҥ(1)JFZlmHXX0Gb[R%"GO@iuGz1cDK1;^I!r:Dm0 MT-HQZd R6ac\zAXzHN I*X SG[FyH #`-l,}aR ӱZ0T*@*!-B"c|Cl,I[X2(KTu"'tB%"kH Z&L=lSmвtcF@;1h$'Q2 R3QbBCP iXl0' c$21:6@[c Y J-["L0h;Zh>@:SA eS@+8a!"‹DUU lH Ҩ r[EhH Z5(2@6Ԗcm88YJʔ-*D&A0DYNIqJ\fOQI0(S `*Acp$#@u0UhT"MA*:5r/={`T*_c5\si@lذ+ues6z]Sis|L,R-Xm8#,e&}ih 4P x[,h`fdde46Z͠-0% ?lf&:dJ٣660٢54MMNZ d-XlY)[fpk  l55ϲ -g2M`Ɉ6V33hm3^ M4s@ fdXw΂J03榙,M\a\755 `P-[nr 2pVrfj`S6gM4{&/%YZ<˰nY0chZ4fO6-YMl dKk0g]j+!c5Ւ:q X F"4Ͷ جi[2 dT\&6!#5p\gFpV̏#ڢakSb aL i,Z ڢkj&Z 1[PF%[ui56`5`ƴ41`:n,9C+ٔdZM f[˶3l`4 ?gAf8 6A6XOh2GYx$X0fatR%f&CXhqH-` gWA3 Y*&Ch15i6yEE6rkc!~6՝<-f(YκՙAdMo ـ% -wj-d3YJj>7-_R1fBcu-gIl&l2ؔۀɐMmK5 [mA7 Ma3{PlٴLYt&$Yl-m8܌2 QY϶fJ[ƐŬpF$f f,f2dk8:' Uݜl6Y"πthiT\2iJdKfO\E"!CiMuF,dٕanj1겵 Q[Nfgfk2YPYЂLL )ڄlΘϜAx,d#1!5fEVV2ՁY7pPId@^V^lv믿~g1o~7! /w#1&Igff>|gd+12K𹏴c֮Zky1M̽<" !?p 9_&(4\RB/[C0 CS=7 <*ewyYPnU |/mS(>N K7Tw{*W=Uʵ9 A N>sœ,i= 9F朼)PRDv%Dss%/|7ps U0RQM!L B'/BkN*bpγW~\Av]Woc(mnWyEQ̫ q))sFܼ |Qʗ{V9ռu:^A,BQZ{9WmŜ~(J9';)[ y}/PpI(=s=OE dA,.7~"D1pk\,\അN y&Wȹ$ ; s 9 |A<7ϩ/y^1pUeU|_* *)d&sUSnl }/܂y?SywׇP T>E䷅9/( ~)yA@[IA犲X7ȧ9ܜ+PӪDm 't <}MoOymPRAy9 P.,|O Y|GX*yA{(R{NrnEљ(ׅ|h"\7zB󋞏ys^b^.uB]$:\P minۄX,0ȂB?Wm//Ρ_(A) }/ׅBIT>ͅ97'/N_q-rP(rmE'OAyq "+R~h yPR` N8r;y' %)U>R2 5ʅruDAAXhp~z9WՆ?!BQN!/EіpB!yXih me]{NlJE7M6?pCsIzn\Wsa {StB sN+3CuTLrP|RB(ښKX -aDC?nws\M%' +bPe.,;T-S*;\TsKA> .d䋮*\8n(\r I2יs@żW(n>t^/()Nay 'nusöC/\{aP/ I~JsyGPT*\yr X^!0ŜT]rQ|>yPn& /ɀTY(T@P|. Npe9+S)̻NP0Rɒ>KA︹-^g6~Rȫ\ g]KA2ʼnnd0q'PhwҮ-EΩBXCυ \8̵C]9/ *?Sws^t|{Oڽt<_RarB!G)U T _ r2T[Ȼ^.\ERn跕PTЖP} l-FA{ $U=9|uxn+zc&e*֭L, g7sM7q|%|?яx:63_{o]tڵk?-]tgySO=uu8p[og?P|'qZWWAt׃\faa{c|{zo]ѭO>^2L=M1px4?0ڒ8[L>{K{Y2F'w=_j{zZ_P= zQ~A 8kwg]4RUQ:尜L8?k7-q]޶'?*WrBɡ4ڼ] 5n?T{;4s*i=-?̦[n0{ZiƩ}?7= l{2 TG{^ؓ,4ĶGdr8_:h4߻3F:>!I~v==r~z+;<9|ƃP<лiؑbM֙F҃[[+<0rz{֞ðMD0qdB훊Ԡi;O;{v?s+{q^`(U+#GCضB- xwaWz>S6~/WgRLē{)Drg7ǽ98~v[N>[uI.ڹqujlAs?>rۨ'Iy_#J&.Uw;3ۓ-nJC{\;4ȾpѾE185xSg#;_xqO_›mz ;oE]߭z@#0bG}75vxCvmq3fxrGrv#ph`Ӹz|4ӵ5󸳵/ܗر.{{~7{EߞvQcfxHStO[ '=ܿ^u?/t=|3S=@xߞ·cĚd>4Mcmh`-?>Pfp䋃7ynzD`mLn ݥo}qᝰjכֿء;+Ov!n<٘A<\uS >j(ə',gu7ԍ{'{oMQsQG}~om3qgcrprI޺u8w-UU}E ֣?ky?,g젩N0fe}.V_tԽ~J³QT7pg5Fmc* b[:ćzқ17GSv<'-dpp<z#]~h٭ލptq7<>>Էu{7>5X3wvA;p@~>C#D9o  G_tbl[F4#US wxRܻ9 P۱-S#bq?M>wL8SO:/i{#;pHiynǪf͗Ŵ8\@1~~3i'ԫ!t~{l٬MF" UfO|`|Vc;ǟvir]n8t 򇝛JExxP2;GVgq0`g6[=)Z>hիSqX<1ɍ<&]>x8܄iw3=S臙Ġ ȖgA쾡dJgP0, y]z*; [ngYn;x;oo'>q 7J͛7_җw_~僃We˖o]wM7T,e˖cP,dФ*ىdbYJJjXXidA+k: Hkc~iDL&82f): % $&=ķNLD!lPZXР'j GZꢚ#J@ hAօȦ&puÑ4, 3Ss]N9vUˮ61 qj<6qd]m0Qp_FNj"ZҔ BFňe/}!C2[4 [Zd`Zi*%7D\ki%c**cXKк '.JSVRA,H[u$Ul0-[04\vSzi!2:Ǯv hjm\:~&P D*#"`X'*LڷĖ v\k˰Ԝp_C*r:\BPT &mS`*eʌJrkiOԐX8D&e *R$Rx)cH4d$C*b%H8h"::6uL.8O 91RaD4[+SSc; TM,X]N,TrŸZU#?qE.NqÖ85;4lc@ؠe RƁxnb Y`C^0f#HPڵ҂S-PDX$ ڭek%2C LơI$IRFqc?uT#eSOj{ll{ʞݱcq{{{X|?\s5V"wy޶xbg&k>cvyyyy«[g}ӟG>??^r%rmkab||;Ǿ|jذa|>?33STN;/}KiӦ~l4ozӛ-[o~u{;c̫mCɶ[k2/2/2/2/?"z=2M-ܳ/]w%x;ޱrm۶@OO⊧~z…\s 7pꩧz͚5}{,_xK,Ylizgwy4G?iӦk֬ waoqyyyyc׷}V(bf-"iΤi z])T*Jc3ezzСC[ee^e^e^e^(I{>+bi%׏Y[kqK km̜}T(f_8/2/2/2/2/V S9;2>~Y/Ǐ9쐙yyyyyyEߒ1/2/2/2/2/@2/2/2/2/2/=یΌh}X`^e^e^e^e^\ ss 賫pD$_#\e^e^e^e^߿۬YJ:[ @{-c> QV]*g fg7mTf+[lf˼˼˼˼;_+Uf7/_Z#eKso%ϰQ}d%KN9JǜSfYje^e^e^e^e^m׺pϖw޽{y7wu͛>7o|;c]ve7|3oεk׾o۞yK/ oxÍ7899yUW]pP+7 vW,={衇}%KxӟqÏr3 [quszz @Ge0mqOܬ-U͙pqv!i@A6l\lkvʖtxd|=u0:Yf# 90Nbn6#Y, q.t$Z05/j)ZQZ3̉.ќy^3<'Xl_?ϗ.]>Otww?_WRw7>>~W~K_[RJOW\qEGG͛j":W\y޵^k׮ugٲe[я~sݿ=Ѓ>xu=[lƯA|ؚѣ 51afe7:1-涆44plGN9M 92Ջ٠;Ymcx[g`Gj/^UhHUGYahgvzw Ht* @Y8 ihcf9F'jV/Xx3xQ4[hGs43[uc8Gv;8& *߲Z181VĜ.~‰Vzk~DGZ]c0 f1tTJ9:tL G1qͶǥ<8{?#:>ps7ix򑬉4M>%K<c1#q^k^v{wyz…rJmmmg k6a4t(j@;J*TuJ9]Q(Ѷ5.4+ iR^Bk$x9lPT㺑ssdjeA%˸?Wnae6 L'ֲ{(Z]JIAb `)IП,B7 Fl?-m"WT]qĞ3طź_ABꤩo*t3Im5^ZMF#@[L.1ӥ6W2㋦;vAһׂXGq^đQrܺŌ/_EŢ-W dXQi+Nt3㵇+l#az0^ڸ3כj/Bϡ8b_ZS,i uZiw>?\Y`įj:ܘD)SNdCȠjerä>HH՞닓B0HSFM .9Ϙv:Dz}Ltp[%rhwyY+3tZ̕.$nAnul榶VJ}CuҮS!8LD P\MOPfDEeӖu&.r[XפZ'+$i.ջ0W3z,r*tfR8^R~4TDX9*j1 ʍ 3TI)S-X&!FX:zڶa;#؎C&3 dz&q1NV I |52Ih"q(6D%֦Y䰡TRв㒘L-q"h&2hE"ACoM0ڰL]r(Hc" HTkř XrrOUڴ ƌ(.T|XXidtN"o0bvUaUy;i⺯ڦUmƟ%IhdJ Š" ځRa3(׸ZR91pKx&q*c+p2 ʹFi* oW`&G33ŕ*z(rprc8aȩuT8DmgTx2Wj^PeUifJ亯}L:JDA'IFD:t0IRǠa+y6rf7jj=wYz4H~5TYtG+.륾+6:)_! .)i8QPJ;SB)Lu7NuSewow7 2/J4h9SI2-TY0`Rq]5.VJi."ؓ!;g1'y!HQaP:QOJ6rT+%pcQ0XU֩zR4*ujG8B+jmʒw0)/RCMmQbi4.%*KXP~!M6]pI#R!ԍq$JUqy&V8OBKFbY8")QaseJr5NjH8abܻ(h$6554D#<ڡӉD(͡J+8* kIcJ0QrTj 9u-P8LIuچ`3ׅ234Ca"& 5m 1*,Nm,K]=ۼo߾g}vGGй}֭Ld…Aq]]]f+uԥ^wޏ_~=ܺuDhѢb|>ygu?xGigӟ Ovӛ߮xnׇq𭇝|W}_]}o`_{'^3o{*ջ~_ȟ;H{Mo-|!]/e꩓_|_ |ߠa;&O?:֫w~5#z-5Ԏh߼z9κ>mQ׮ZtWkW +{j ?oNG}9]+L﹩ǮiٲM;syZmsէɔR$ {~{3Wz}SO߼];\һֽoW>ֵTo\wZ{-O/ya`Կ|;7ycZV [UrӚk;~oӦ_%շ^xOwwf^-_\}柾>yͮst'yd#O]ӿ.}{כG=wg?U럗?|MsǝK򯓟|I1o{3xۿT?ꭇ?{>]{Ϳ˃~ֽe?'t+/톷^{```Ë߯.OT;? rU*eWnF|Ze}ۿ\v7pjmomOξgyamv^p}ZW=`Z9K[y~۷w5>?V=>'?]Ƚͷ.K/=١}Io_{'^sG7=p_w#wx_.|o,ws> ~h=3~qkCO^8K=_np'szhd+z6VᾮǿzŗW yxgoq:':s>$UU't-<}AgWA^.xݧ,(w]kOmGg~w;=uprUڻ߼G!#{'GoyuVM8":T=唷w=}]S#?|?^{~o»܋sʧZEW/Oߛ/]_ugxz-k{TW?sZo+:x9^YX?3~3Ovs/;;sӟ;ﮧrJݷk붙/ܰq-߹ou?l=_:{n{[g\6"~f ]O:ѯ达Co]{Sž8Z_w|?}:>ïESt۩ϋɼzMjh9}o>/>߱;iӹ3ބ[۝:U7_]-{s*c}knT~qjVZAoE+ϜlڑՉ*oUNݪ K ů~z/~е]]#ڡvKNVRj}}ᮧ?ot玶eWM _}fz/<>DMvwzõcw 7qƒLaoY?{rFۓ-g}~_B[/8߱,gx|˗O(P{Jw]t]ڙ? ob{ 79;WzOgC;8x joz[*3;COT~;~0b>޸jǮ7Ms{ }yn ?w6q|}RG%?=cDžWp ϭw#rK*/ ;bUsq4nxK0s|t4S5zȑ4G}Mq9aїi\u֗Kd~56|5C\s>/W+dG~x9D*>^z3։/W9sU+O]N>E4 >ŗ?z;̰O\qx9|J-lw= WF8x&^6i/9coԽuq~ɩpN=/:_hLOOgjsfZA0-c!Xj"#0e.MW!hٚgigѐ2X،ĀMbV̂~1KGx|Ԛ-f)C9Gr,= dLI#fFOm3"{C,,x ZED6Dɇd`YQ8#߽`0KC Z̄l3Yl `, pc y9K :ӄy f,z,XEHi& 2kP#l8dFf#,3b+",@InJ,5M{R ĖٌsBf Zs >bK),0eEm3[U=,fL}g=- M[@`Lͻku)Clrlxfd1>f~(,3 Y~hI,q$@Cleh n)ldh[atbtdJD9,`6X {df#Љ&3{2%ۊD#Vj !ČsfA734}!PSU H<tMh'q݌l9[ul =S+zZ~;&U6s֕jr=y= 8k MWI Y :  %!Xh4q܌ٴt7[:KLMeYsGHB{4vr6[ 4 `j99ٳ[@d@QȠMGEM`Yf47j&"X\* #[KZ3۟ȘxEB4zN4C63fSY@\ -5ټl!h@XLY~,b$j34YHM\/"lVղ'0g [>½& %Q(L`/;c*ql}c" @㘔,8U끃`XԜ R UH (uYDi h8qDJTL|n0 lj.14"#,KL QH F@*L,o!a-#Dbmр%l8ƀ dj96 7\pA %9@%b6 VHXIS|D*A{"F4,U%u, t(2~ I #]AꛊU3!Ԅ=kQGx JV7@_CA4 #ǩ k(Ŵ SbZfeL' !a !h[bN BOyM0;6NvtT;‚`dLͦ9 *@i1 E rZH%r cfNh%2ƖA{db 0HFlj4 Y[&AUe tP Fg\$ `LGDFkL2Zj б(1U5 m!e,0qIS|Q)ki @A i,H@N"V68Q%(V3Acb$T1YGk2 f&RH Ic,˪a|NrWuu3`THTL_*W|EAĈEDpatUݕnqE1|_|r9;=׳ci!،P{t36Jb Cc @B2B()LHD8i.H1$2 AVBD FKs A ŵQQ$ -c6N@ oGB!(b bFHL 1%NB@I̍A ؤc QGK ' H1'ns-s4`"!|z@C\D+@cIa'& I uL(92.'~l6-] x $Ŷ֪,rV[QB[C`uɎc$Km.bEm :nXK0Ha∑LH"28$b- c`8pHEPr!EBD30 YD8: ssbCaYÀIdP#  B.;*"_6 N&&;2PF1 !@hA4 *JN챆TdYņG8 cĄ`&"K0!22X+/M߸ϝ;ww%/yI>~Gi;?YZ#+Ƙy/j[<譥 v O풁vlUC:]u; }K!g5̶u?)3I~z)"7O 9f7] y|vq8"xRgƚgbpꌍڜSŏZ^bly|]޼=qt:VљPzd 3CC*2[}=%=E߉b>;',#k3X){p4boLg Cíf`0es^tLub:q>Z;7d:x}^|xl/ .N}uw,4][-8w xVzen/k>9W\Kg.mlo@~XthwhB8xdp4 Fw܈eߪ-]t4< ;Lϴ|Yrs{]Ln؃S?.š?},9 ;ml.ܕb2ܧQin,3ۢ5=i~ mhWGA57ͅi1|DVa\|D\_֜$+.2p\{Gӓfsձj.k Ώ^1X9ls[uxrml+nmWY5vo8Q錖U|߹ųWG[N(zG̙ٗ9' ya R v[g:9KϷgwDnT[V΅Q;ru}Vۣٸ##nWvLz=7ܙlKuF)Q**,PȆ}0.- Ȳ@yDxqybUvl!U|lG_5AXܹFaK79dr[2 ;#&:J}ֆɷOVۖ&#@ekTg: 7TI1ʍÛ6zHȸQqR ےX܎$|jfv͚q0].ۮSkk`=;r4< ղ#B6J2eKw\l{~]\IDATr1ِ+ *_wxʞIoiO `u{S 䒚]'ohnT W4Uew'>c!Q# qnGuŗؑ7Y51"*F<שɌ_1o|=We+{q3leD\.?\APsmDFjnc 6O U&l zKG-.~o{Ӌѭqm܅fpymLyTȅ3}_Xt°[4m:S'/cZf:wˀ]WpR^S;o]G|v6;pk YVΎl<*.OH,sp|m#q~&V:c,}D! VW@Ċ4 @ya{eѹhkGMr}]ې$Y6&Ņ+涉; ް,Oj.Njd6~]|n'wN\ 7`~eJX;\;a+4r6yٮL3co[Bdh8omK\q{L[lVMw|ߏH)d7-h_[Y91't'} Rwn4 JK7 MS[LeFyc3/LtzxOFѫ1?3o=j}sՇ{D7 *j{A9J;GnM_:#]/yuݙCg.8koɋry߮wU >$q1ko~U/싿_Ƌ,ٰixƵ8]o>snaK:ظn~G~W/gW]+orux=J_& N@-Cêg oذ܅F/[r;;GOL(x[vg[} lOΝ-SG{:}lS{2^6O]rv_=#c3F˝-Ɗ ԣ7~?/L6yҶT6>>zyi?ӸeM=޸=<\yUs,P7?Z6{W6[ߘ;{;TCo~J[vA⽹Au4nY"+F8q^R>|w5=sk󱥹>S]e4V~;mJ l3[|8W<%w}/g^m>{oh.47{;{vC.mjTUOoz#Q42r32/ܲѹps3 /_ٹʾVSp4?~`g%F翳3_օ={RعijC)̏Fؿ,+'NdwW%n.3LŅ:B:T'}e+v}V:}K|Mνyp7n5ۇ՞7]m̎xNhɗ mN;RU7Ƕe9_4NoXL]k:~1d{wb]38#ͥmgU=xmi9?~n9~0_ gϿ-+{n{|wӖAU[tu֑_u3C/ХGwouNm,qf{}v<j-SkOmlt҉巜^||dzwՑ`2_>μ돎#}i ΂./ټ+K30 'Z-ExDڏOtxjO3N8֑g׷wGםy왚p[7rC ߳1 mơk.Mpv\N^9WGv<͛Ԭί_B~kOoWٝtnݲ5Xߑ[LF_^̹;n~uL!Zʾq3V=vGpοEpK||屽^H%KۓS#$G^2 7;|hxYVckZ{鏗_@vR㒭\r%r:0JſnGIUn:W^? d0h7dZy/C; _3xqƭ]hC?s?_l}_vg?6ٙ[Kꕯܱ;g[OnWuT?uߥuаGlҙl!Su/v.D:{|YǷ|Pe[/\lMl/`7xI88ȝ+<;;n7s&eC%As\ "Gu]W//:w>q' p\{h|o<3ؖ/]o` ۳c??E{/Om:21xE+sgr#gGKYϕZrՙS̶s+Krl]mX4Ԟ,fKwv|ٮm~CV\I.Fé}g^PKFڶsk/L÷;e>~~ /̎]Þ̖_M/S{xZ 7n* ׷}Օ_xw;s5%0Q7U/2[o9Ѿt\xKcg~(M >x3ASꫯ>xcT*}799 'Oks/v:0Ƥo߉/O?$kZ^^.J z=cd=3>>$ $Irw9s~0 -Sԏ~gΜd2oy[>|~oz K罏OJ/|atttjjo;ࡇzG_7͋/;v;jsZ)'BChȐ!2 Dd CH4!"Fvo& 4D` e&H?w/L6@Ȥ7@xߔYn&Di&1@` :5 v^DL:TІ Y:n6 rHo4)mѤhVRW HgG젧1Nt[JN !&0] ^"C3@2 jcȐAMiM!Va!"=#ª> 1d$@d"Bc N3(@@ $ 2@h*ChH1؝= 0JёڒԮDhaR#h"0@S0tAƠ 4bd@ӭi ib4!2٠HI?& ݫ,nE"Ѐ!c Jz:#$cRT SI5O1c m?m;bTҁuЂ1ݱu40̊G.54@#hcIO6b5#4dPwB&2&#=m h` @ɘTНZ'?I˲6Ϝ9sw6Ǐ_{x+T"(3Kپ-ŕ-s\׶gپ*ڎc[ܲv3De,ؑ _[ZzJ,۵| ȍl,pY6؎qmGzu\eҳTllB۷+}_iǎ㪌k{[ڗ6XTﻖke(aYgYGd\BWێ0 /ʿ㾲_`ܕ&ǎ{[9B0Oxd2Ogg]wӧ7mW2Mlr~dGx7[3ϼ/d]}՛7oꪫG{Mozk^nۚIӳԹS(1W'gYhsriYl9>51D2|8'N.S|vKʇ\EiI{rKR\)oV=78u&<9cՏO!8rd>с.riۅrqhcuz#%]Ofəxp&=2tgL:Z>ϗ}'N(7˝'Y[օFjQw.\lKp~>[8m*5gGZ.NXrO'Μ/4O"쏞9wd=:q#ŹM: lĹÇOMp9ny18rzSmןP}t);7{ܑV435} ux ӓGlrr#tasff?fB,=3塹<;sd8us1GO 餾x\#XB~hsf.v'Oj3Aox0܈g&Cr㏂p^ɨ7>\p>9g73ǭSũCUa`MD+;ͣgN3 SΝ蜘S\|dN/ =[>3/NO\h7@P8{:ь3|l*نLslaVxfDiC 3'E!Rt!8S3)ofzh:{Pd*ӳ@yup7s|4?OYf {fn:yP&Xzb\?z|p/88SAi`3QGg/ ctttjuS g&30-1[?rd-Ơ8dIډ˲g&ıNeJYLCr\=.v/LR94?9S+ONgKz5ɾ Ό{<;ϞE朞fō3Oo]ԅL 33K8 _,WeN~љڅcAS/m;X}ޡ}Z '[On~$7uh Kr#OfΝq6;?MN>3$qDvYi̺37g=nm:G|w3;^2P\t(bS#Biziũ֑ :}B\4GyĚ=wjvdqj>[~ :Νj:O[<w*C;Ǟժ6^~7-vJL:W=GO\.lBqt␌S'J'S˵)鱧?sPb9wՋ;SOM5o*dž.L]|4/:TrTa-? ӧm8+ D<Nfgr}~| ^g/TB=S_ /`Plg'Lx̚j>8sv ۣv[33=7u`ѵp1'JrG.\O^:w.ȮZ8^9e&tؤBNod37;uTM{D@]K`m]:䕎zT=[]jzNꔊ B̄J:s .6 -(ز0={K[sLix.yׂVHWfF5CBʬݥ3_ ͐&az V}0+ B&D xwOW 2Чt<,ݍb Cyuߥ'Lu#g+z`ݓXYʟS@`i!B@v{19ut̉MA+]f zNub=gZńA+ @B)=X̓t 6 vpa#irp$jmVϰ8fI!ӅtE 6W^qeBa˖-qQJӣi_b+ewQ]]mݻ oxZkyeY鶜#D㸯tgRʴ}qR1q,b]s5+o߾ٟ};UW]ev:|+Vkhh(l*NkӮ˺˺˺˺:VҿohRjhh("c|8Zk41l 鮞)cT*1 B#bʓj6o?$KVϟ(2uYuYuYuYu*gEQ/q_4wOSJj`ƍRʔqӦMK͎_ڦ7\Ic@k=<zۗV+?4zf44}ΑOcG_kSN[[?sq6|ٛ?G~ZW[+{p'ܙG^pÛtի?;O?;3,_]0:on޴}ƶ;&ojYv糕='m|G| rːY3\_Ql8;/eSvKΛH5 ;wv;gwmǯE<0t nfȟo}䑽MhzkåK1W߷^c}]?/S۷!*OO7=ޔ;xBAc['{rO\UW=_Ͽ~5ߑ/^z՝gμAqoW}-v䮯l>|e*=Qwؿ(Lgćj w3| 7Jrj+2>t5?'y~k8Snxni{j疩C{7;lQ&To} '?v s{'~BÙ=W_4Ɨ_I*տ|w zw[vyuZˣ2;0S|w]!K 6זxժM?񆻾^(F?vv;?/>G']֘>;C\[]v}s?N䰺;_ZVQ'K;~6ضk3q?鮡v˺pfxrt/c~}{ `#E?k:,5MؾS7s>7'?ѓS[N{o=޿GouL|-™{=[ͽ+R~ W/wԊ8c?>Ώ|;|Z3WVW}UK?Q1.G3: [<:]5C|@]/[}}]G{~៾8_[ oo;|Ww/ͷpǮyMy,*]|>1^z2 M[hg'nOzWn?4tC|{t+̗_xe盝靜Eũc7mKNٻx7>Oe6drԎ/x }o-/x/;Du`/:~-?s?7O~֑s?dco[<5mK7ܳl;>_ߵVy}S3e_pjGt&nC[޹CO_QؾI_O׿^'_s/=ղ'qrS˾r5?t|oHCupdoSW.ܑ}ͻ<|䇇*'寎3 o-G[[4myKoo~;oKG'ws{mKտy5z_cޭO+tZϞ l"R֖dSlY eɮ>WpV6s͇y_w/l;F<7G~5_>}&f{f=o;NR-( ~jB,UB\+Mח\ %;VW[aکR,i|3 ZKBTk$jR7mJRTOZAԜ jF/עZ[NV:*48l *Zl[<̯TPnZ'Mrˍ-R}6jG9^5A[rPI M$AԎAj% [QT5;Tnu9w\U+l-T+G IVJ]@/TCrӪpn,_'0ry;fh\,D;D\T-,@R^l.* aQbT-f> uSv-Ahe Ч˺ :W_ `d1/JՂNT_lGf J1h5] z_P3̷:NU k[X-7@C\Y\kTͥF`~h r3B3\+Vk!,ڋPYnB0p6gbaT_Cn7a~90a zF/۝zTriw",CKtӮ'NNͼC]J5Pne(UBWb#ϻm쇡%(8UktjzT[TMV|jAc Ų`=_K ,rxcψ^" /rcGR]sbԂ2+F.aGrۮ8f!]-ՠ_(8_hbIZc+ZR ^VA_R_?GoæZQ)RmU /-$ʅLX$V%-L4 KQ-jFRZ!v5$ʜAKۖʺSmr?K M׼\ Uh@ZjL>B/AosZEj!hiVjj5'˝B>Q k~XVvՇD)փۋF(נ8OkfL:-dG?.5% $qѢVXՖxT'mU%h4^jISJvgA642zɷU[SLqVwr9yb,S})UXoKk,Wu\_lVjI)^GFP5a"Wkak6[bx8^4,uZeVL!Wkd#@RAZ]`Nl5Mm03P vkmVW_CRo$H:uVlB{PM:MUW}JjQu^CĸXKaksP7-P bmi tHctj] 4s80-@ʅ@I=Pkƴ%J;\VfkQcTBq>h\5k#d1f)@B Pr H@*΅3J`B1Bpnc\p1)㌣f\p ! Ι ȘBH&+$@)D͹b0pKp.Tq%8G)$ G)PXKJPps θd\rXL $r.@gdRHΙR2.% θB)IgBpLp #pJJAs Is.R `qGa1!@INb\A J2.('؛(3)@.@JT 9Ps)HqcKP B ΑsBp1s%b\FJ(n!*LJ%J0q) -ȅD&`BrJRq%@(8"W\ TRI-.r!R )Y+s.m $C9i ea(DJ0,%$ g\ )%d\r  AHƸA:7 WAL H8r3!CK R l.PLp% W(Ⱥ )\ ,ӻLX(Iq2ki7B2K4ȅ`F* ΤD.FJ^E(ř R%(- % HJ"3I8SL(.$SLj\2 GaAI )LI- Lq-R LY %K Ť`Rp)HDq A8W+5\ )Ʌ\rT 0q+u  Jp `IP D.AXB䖔hieq%D)\p&rR! )!-@B d.Q*g, L83)La1[ Ő JɹbR1nq!$\ i!L0.9 $\$nl @PZv[q.YL*.!HHɅPiT3Ł+%$#A( 9^H\q)d(,bBn1N\*\q&3I62%@Zh &%@Kp (ŔXPBr$p1BKHɹR05#-(-DbR0&,C)RB )R@ AH!L)!%"SJ0)h @)RDq c9r(Lto!W`))BP $gJ KrťdL(eT,rPH.rΐK-)D%A!8P( AH+6X 3%sA(D)-Hï \)Lc93RŘ\"3bB -ʂV-"DP*9B "M"P9JcƘ$HNWp#Iɸ Ƹ\ƘnV 9L)k[θD!@(B"WB*McdL R .6㒣($cRrDK0h P0\ $B4cH|2!0n+ $3%$(J2,R(]C.$e)P ͸b=P `I($P`I%TĄRX )W,]=-.BA0f7L(B&)B2r!,`)8 bLc YĘۿ˿c`͖d+7Wj%"C`LbzDg!D=D@"bekH ;"@`>NkoMzͭoeNigڛHtYMܬN`;5WL&bڞ W{ Save Y'4_j=y|n@@-y1ƺ;=Ep{s@vS;M^;k*X{m<1гZTyt/ K=ޠ`oW kfmiux+x-UVsUZ>1X*nWs[͊UrVKyXmЪckf@ 6km1t5Naδ5O (q".LMt&mIXZӬ { jVqPsYjik5v\[Zkgӝ7j /*Ӭ󫕥l!u-eVqfgz0k+mx^]Ys}Ek;YSXuk`jRk;U<Z hPsGU>ŪCa$)-3ĐzՃ!<ܳ8^}mw*VSq@ W ik_FqkZnԭ![9 WBVPVt&?rށ??=ϛk_{ȑ'No\.я~tyy Ht_/(OҺ[dᠻiA 2@("inQGJ8Z%k\b "7h4G4r䠅!R c@&; nL b2 y c '-Jb1aGmb\RЫwGш@`L<" c ,a,$ 0:ed 㚔Nb p$P`,zg5D4q$0D -233QBIf0h 4 V8xtx:ZBpN2 c!c2 mD xF"HLB K2d43`p0Q,6ƚ 0` Q`DI D# IPp bR2EB9DUCw,3ڃv061 41r"&YAM0IBJ Ȧ@@5$!ad&Y4M&e`چ(E, 2,fO&p:12"04 2 J,v042 !'2,L&dFa@HY3$FΈ)! 2a p vaVo- I A $0CqJG@$Dfm)f`&F3 f0bc!c&'b) IRmdĊb"@C $$H 21H#a`J>NHuJnCKPC@ cPFaADC)` ԂA4h(H8& I4IJLaRnZIE#Qc cCd b8Ȁ!ÅYd $ Dr @@5ɠPa` 7&yH12 (Mĉ , !jt"A O0A70Z9  $ 'A0N `O~щ&ag Gb@9ch&x L51`1hi4̀ J4n` g1 0$H OuzPH 1!)04`4$Bj m$KB cFII R@baALPI40B,FAd$0Q a  AfQh QQx} @`4!nP!1#(4Ā5 f6&̤C (@@f 4p0%8&( Q#`u{lH9|#`H0#0 I=7BDMW 0!2ƈqFaB4"!҉@@3#  Hy ` ƹN$qeHq pN12% rE$@' gP3D\#P3Ga$hf8r` aF''\3@B0"$:A$1+ЊGnB4##L#`'0iG]zR^#L!a8!O"F#L9g_`4 ;%q'"X._7nlZ>}~'~x7t ϟ={6}J)׿>ɼ][3 }[YLвCBtqX;-ryo 8<0H\mA'm-^ĠEETM%L1c$$aPiEdKQkvDD'14l$@ԾAJiڵby1ӗ%oP(vU56N4Bp!sGvr'LQӀD[CTv i؊he`+, ֚1@;2}F[;1P_Uft_=7IehՋc™AMA*ڑanlK/LخLTUdžuFB0nZh '糹屆 ol*l1$+H0BEahC;r#TYƂ~{9D`EA @Ĝ A6݁s7 27  - ujͤ:l!Z!Z}5]7%ЍÂhQl3@tjHkV,Y/:f:d/nqk@"VD1 rÕL12#Q6V"YXdz \ 2),T3c 4SɎ*CPhXʹu VMɶ/(! "oZoe3sj,J*IdmuhAIJzHRTj;dv$6%ΰZj '{Vk&(8-QbI?klZҴgE(a,rl*.ᑸy 48óP%bo o%a֡ӑjAp \NyjUV/ 579va` i!*heTt ֖@rxd!;~U<{0t`C InΖhZ5;[j'"Ϊur&jVB9xqJ"(D;Ql-p]8X,pnסoC8dXM 6BBL`O l^,Y#Z;Z2N}}ihA <H1F"0y;/,5@mi ֈ4[Td8 ȆasphdJ_h"7QuxSa$nj9ƦV' *A$ -T~7Dp믿~߾}lڴw|JֺoΝO<Ğ={I\^tw\Q6|֯y65Ϛ | ~gprxWZ?m7-N\T?7Pƒ7W[^8jo7seNc캪Ca|NmF{%r`clP$! IH! $$/Jh1{-Yb2{{Ne}fYfN{9k5T٧fww7M[/d==k늧-+6g-.l,;y#:-kzK˫)sq?n\>=_;7]wOTyvS+^ܕGoyX.<7sHϲ毽맯;qwMhAe=|{8Sʟ;k}sudzw_ҙYrEJ^5_|9{-|s#lx$EFĢrQrߦ|&n 5Ȯg._y7l1wS[s?G?3o, J[u 5oyh[zu]{f^.0.;JfE W>1pfڎ'vsM,Ϸg-g>q o85 3C]nLh<~a-Ftߒ+sri<3 w]{z3KN+J/9wڢzoY̺7SnS?3W9δo~y>5*?wu}q\??z`_zxhW#9;fu͚S޳9S=_=ߕ^8؟_]k8L(4{_ij\Q; ;C;s_+֍~Gz-f˼%S^hzZ֘=K_x<_~~_=C[-97\#qb8ub K~sև>w?gpVk~cŵKgWηPOo^}mC?˱/?U zbբQ7XX~z}VeVC]G:u!<}MezC[[:׼S|ݝ}}ޟ@[ϱwnϮC(sx`Ll!q, w=SoKYjwO ЧWF7>|j? ult̼x$͏̍X8z m{GS{-`i;f.<5yd蒞][<|;wxЮ6u6:;őßR}(g`:zjlf!9MVl~οntFŢO~=d}[sGS+/~cm¶v 6:<4ę5zÏ^.-zsya7.hcp%묿̺ͯ>#t?νs`^os0p`c7L_zXv8sddͿ5f5s'SOpߝ~sV>j,Ӿ;~o}KĪ9pȫ[f=s;4k:ќWgY˗Գ}lun;;:Dw[Ѹs?Tr~˸ӗ9kX3YxFos_<2 6ne}u7;{m ܎gFN \v<=GnO?~O(>0cօpە]`BDû^:1Mnl3ãΗnnxqU-*Adl.H}NL+ dA lK [ %}l$6n=HI_d3c4C!-5iv\S̙Fd$%p VHĶuھEDjRkܶ#2 䓿v%!l+ 6|1 #È8l*9ZvFn4S 3 MM* 02ejLam?D@Ж@#nh3l:7F#C0f+-8j4h9$ 1&Ōq26k 0$) 6i%J^ClIpMgDLnuQA6mb&ɘɛxgpҜ @ km f2ۂgbF!cLҙvK)6cmgvL"1dZlM[*I.1'  І#D@Ba{`J#pԆ8cX+FIob0Ðk$2h; iY qC1 [F @v&i 1 Iw'Έ?-b0!m;%Z)$=ymZ"j@C1 @@('@,I%j]+#ӭ*61DI#jHOH/ 0ik:14v*1'I,`LzLk[;h!.L4IijIk 150ҐyhdmH7A!f9m !rF3^bL1lmJeXbZdk!FqB"i׉#1<4Z FcDc@)$gWNI5F 547&IV64_&J|!U%M02́`&РA"c{%Lk c1'$m-㶣fۺ72L[,i)v"~EmF2oXlA QRn8G`ܚ80xhsN!1D2[:& 1D8+m02 #q0;meˉi"@v1 ںM@6~5;^o??O~8̙3=#nIJOz׮]<H);{{rߪjkE'ۧ O1WjKwkr j}>`hlIQ] E Ņ^OkɨN.in.m)҉ WK'x^]$L\ `-4қ&wx!':̅?N:L8$6MIy҅ܽՉ"N??/WŤO P`'2ݴqr'ؚbL 2k5YbT*LbEFEn]@Iz-,.nBE\6Q^FL0{JկVށ|-*EC`PGDgvBjGCCasГtؓz#,J{kAa_\ Uj*A%á@ ĠR0z0L Ǎboa4W0ʛTŢ#|^P'Atwm8C~XAga CPQFB7?=@P(á _X(͠GzÁ< M1Pz_{(|ZzU1 AFm Dqޠ^iȊr:R8fhRq0 y F0 CNY }Å|@P/aOHO|0bP qsM? r `^􆵞rCJpt+Peo0Zi7(AP(+"p¼mq1 p47A8Z zKzQxho 3FŐmJA>@P^Bؓ( n/aWlj~{P8 S {uBn:(b04{>/0`~ؾ`p`6T)(àT!TဂaT0 77 A9(9!χp40|A7a@a]*A8~mA|Ja<f :^%SJA a>[ maoP pЗS ިá7jk /FzAБ)2.0_ "T p((ւ;*}^"zA|-àY,LF{Qa +gKfK @ wAi aX,Pc ҽaP9 z= 00*ąBc(NfTp1, *}=}=pEP#CA;Aǃbr%BVoTa R8U0Rþ<}_t HO/jPR·D!0h60F_zO!pP#brg~hx=A(F%l ~7_ yB>A 'ֹR) iuB!(þ.|9za0 i]vBP`賒(.՞c_0TB 0+GR|/ A[|VKR>h4 ^¶\BoHBaOb! z1 t#KQ7\͸J5*>ejMBhr7ҎW7ڈfJQLBkԡfN 4 )*-2a*1L6hE,bԆ\j##6?R4BSLeb2 z3`dkSFkFj#G<݌RQ#JՔ^`Us4fN yT* U+dRV˔%.,EEި/kզg lNHڍ0O4NOQwr#N\uЭ/6jq j^Hوt : R/ՙWQhdQféFFGI:<3PslHuX.T1Usܒ_R՘Y]F`$5xX*V~ |dpq%4d7B%)k 1&Ϥ2`usFNk8qc0fȩSaZډY$ı91kgAt ̴rEAd 1 4}0԰Jct#3`mUC bIHHPS"LQFsб@}* SgLި6ۘ!qGC3~tƍ)4MШd@bSZKxK"̖n6iVHӸrD9JCaS2Z6=ڛG@f=btZy1` epe9d+s]@Yxg2jpQq3>UTܨ~Ri5,1hkP5 +7+Hn1F#<#ZD"YuD-8Nf-L3M*FP7RJ괚9^k3ĵ4]QոÈlF (" hX]"%/skQu#D%՞&ŎӢ!k#Eծ9ukV]P32ʐAP5x#N L,0# diM봵PRqXXCi]M 3bmfTԬf1SAQFȵ4rʬ)&]f)IC96* PS-ze{*6)x+E( gfn<*y5d8*r"$C*B'f"6sK^opE Q5ձ,g.LtF P:"35Xus F;YਥT 8کfG3FqvJ%R7b8X֔ڥՕFQ:Ռ"Q-G]B֍ׄ)bw^sy Nm(ދz"eRuc c?V 05d^W"]t?4*iQ,z[5Rij7GˮTNެ:e @1h8sq+J)-9o4c&IJcn6+9Miͩ:FMh wD>T8ve Z:&zY3.S`4~l,FڈY&vPԭbX4PuT"AIXy}u=zwܹQgΜBCz @|_ՕS0S0S0S0S0o*^k x?6o1ٻNVSǍ52.8;I`|n#&kc.)^&"FeJNlY]BsК:< Nڴ;2L&ma ih?jQLpl _0DIԄZxlze%ɧXBIJBN^X I[x&&H2V IlDlŘ ='ukt"Upˑ&@Ҫc,b%]+P`R &X"*Iߗgw$šW~~Db"u 6VqV-J1 /KUѣ liakVƱ]nMcL&Yv0ݗa ՋS "1Ɣ mݝRr|21&~ 25ijVĉ򊫛|E;ZL6-No0cl$[|&v{!q&~dK-YO$`J_vK㘒,aR$ `Kn'qBi DCMh9&)l9/{]|1/34Im4ISd\Uǧ zJ -7D%}圝 sl,k#v@S 0iF X4a4&{L/&0qL0%t:zm_(czOI)争A7f&Pb,\1|ǥA{ 6c/g!g]WUa_Z]7PhgJ$^_/g&_Hkk3 _U"LLLLL} ` ` ` ` LS0S0S0S0S0`*p)))))/SLLLLL ܧ` ` ` ` ` T>S0S0S0S0S_)))))0OLLLL} ` ` ` ` #6Ԛ#"!#h!r1"0  L0" D-,h7D'"@@" B B Hdd@D` #E$ 4%|E 4!1ĒA G#DFhmgg`hG  22(\`5pF4Z. 02X "@20HD- e Pddb hynG@4`!J8k!c0  Z4{ Cʧ 1hƐB0"+v? DB$ (˦HP";$%$˅d( a ؿ ZDnMђfLB24@ "1d"jZfC40vh0#a4bK0;[j*j `4k!mHH3-Ydi 2ĀAb"iYfAO, dƴWD!B0&3 OD2) (1 2֚@"1 HDlL第"FcKKY)LD@ X" $s%CXA [!U @YC9h[aO"{]!-z%JlL-zD&$$@ "72* bfă#0cc%$҈'ǂn $@FP'"&SF&`\ mXA1x:B>&n:MR֞9 hDF-!2 40ƒ0E}$ m$-, 흝}` ` ` ` ` !4b8w(HkmA3gtww !w5~_&Qdj7}vç7d#?1muLЪ՟OϧM;/מ>- ]l+OzەrHK_\}ۆ?; o8[8NxO 66_Wӣwl5u_l^wO,eÛᆆ,|騳d=l>#f>~z\.|k?0ooߖɎ俿stAg5ݥ.}EUɟ\Wzi3|x(fL^9ywdseo_w~kwO|o-W/|ۿqsG7>;~vC6&|Cdz?ukG\뛵{]]oı9ߢƆ ݕ>x8wѥ̖{5XG麟O~7!%љo~؁Y.]|2{ssnݵX4g|fQk?#uw+gVǃ7jD~O#_ԇ?x~M85wx״[.w[z f( k)55{>ޯ۳~5{f_(]3?BnξqެlߒsM?ǥoϿs]u㮁Ɔk^QQ^e8<>k7gťry`?^ >[=3jy_[M_⍚@s^8877a,ڧm&rR {մ9f}/U󋥕}7o I5ovOff޿_S|uo|ps7"uZ!?|c!vMyRs?g7죃F;sْsAs϶?ҫ~jc?N_u$Lyů4zϯݲxϿ_.x>g7|e 7 Y{OsrsJI{rKC6h5~~zn^/7]5? )n.sFtNP\<:g񗵠cwi,;}os]3l9Whax7AmǛxjӬ5ûpnt{Ȇw ~Թ=/n_=4to9=+uQߙ]Cs\Rq9@-t쿵ߞ7pZ?t|n_?tfLk[/]/ ew;5?~9:v۞0kͩ_zȜZELa!bs3m7NHeˊ,4cx`"utۼ8𸺹\]m88to8w<%OVJqxыfe>s&Gh hKtxߝ֌k%wlpd?Nki?3pɲR_Sý xm<}.cٕ\yzKegX8pSEҩok~kKn^JZc\?;VKN5F,ƹM=NMECkKOsľys.۶Xs}{ >xt_*|⵷d|h󮸶a52K7[~yYx~KmKc犮q⯭u:Jo} ;e7>.u}Y#Kzaڻo JO6,^5Kzk>u[q{~7Fl_>n/cLߖߌaxڿެ-ߋ6_o?韭Sk5XƘӳҝ/Nt?ݰiҿKұ箑8W+7;WHEO|Cg“XYO:~]>>4 gz,;`\OB3OnywЩ`:}==s3mm=3Wo:zvYNwL߶uF٥gwfه{LL ?VÙlϨިNی=n'a~iSj#,ck6Qh ގC/l[0dOntuIAOgA[:@g3C)F.D[KȴT~?Tg/-o:ĻrV?|͗_yPoiO#C]G^/|drhG}/X?gV6o:5uUŇ +xBX;kL̴E=ၧ0kgo:`c;=[sV+O9fW>ҙ?BlS+{u\~֣[~O?qr!<{x[zeYزkcNhF q,t|dɰt jű-+67[_߽ۜ%81*Ƕkԓ^\VP]˞)zsz;K.:ujU}v3c"QI;qlC[faZ-WҶyO /Vܧ$86=;W]t'O_yst VGYٺ{ q=;'JOO_8Y_9~ՉOVw1z"V-^#'\3VnS?Di ǎ6dC޾H0dmn_+!p>GGz~9sds"Dg>&$=0#_/n뽞84k.:t 90g0N^Xx*.=AYQo\ZTv5mf=9=މ//ƕE{-߱}ދkm9wu23Qe6*5sud+̋ԓ+B`GG.]Slx:~tZ|f^~ȼ0'`GzqzPlݩ/?iɻo,͝Kl_I`?'{j'{ GmھԒyF/ؙ|oYw_6q S[ݼy{;sϭ{]vqHes]\O?>lg=>sNGCW;t>Y3zȳא4i7gͬ͗tz{[S%,ͪG'| rmrm /pYǶ9/=: :2cơg4ʵlvEg"}p+-sVoaڧhv_i~'׶w>=treN'=ղgRoovz^=} ϗ_܍凞[3-leK*ϟ۵5^:螹W;矿}'u-{hiO-GGLjm/\3:{ϊ'W>Vql2l{=~gg{;sm yϭ܋kiox7G;3z um{vvgv{Pmlh'?u?Bq5G6{ɜ|?km/XT^ΗQ'\n Fr(<{ٱࡽ4ێ?u&RYś>$[S"( {e}T,srIp'> 39Wxi|EߑYŕrG9gr]cn:Q2]}绐nrғkB 2t6";uqd2/2F2;3Wa0LR^u|$~6eNKH!a:ml 7#\/z~F rY7?NLTA&'2c2p<i812侇mlyjP> YeܴDՔD:%RiP3>pziɕ ciyqg=pOe"P.P9'`*#-JI"SKl*; )rܜ\`'2>w{"YZJq|WJŜ<\)Y:RH){J8C DT<z>sҠБB %sS;sQq|_ٴ\ᥔ']p=uńp}esRs!J)sHz]O:w$w=fYg3)IqJSr]ǑB %w]Ťf\OrǕjmi)pRsp.W)wJʘ{qO6])w˦R\psAi:^ӓq9R*Ņq!&G$gv˥0fʇ8o AG *p#s#ICFJ.ƌ)BR)S)%\(渮Ǖq}(vsD& OLґiGxBeKgTunrå<@_JeJʌ6p#ҳRٴj(-3Zx\eRKuy&Vaҙq'6+}I{ ys)/-p]OLeJɌ=Jܔpd:<ݬL9YR0NʕxK9ynFA:'JR6S@4dϥexupdPLdR)_\l*-Nu8TR:N:8d"l*L9#P$)8"͕lV)L^Z Lv z20c1D-) JD)bc&Y(3k2;4eZqՆFX)`IҲgÊMDduCd Md%9.[I4RՊNƤdRv͖1Ql$rBƐ5Xj4m(ZL"8oWDzԕ(!HR ̈́`4kkEJHd-661尌NHl#cUZJa (D"k =dNݩM`´e  V%hb5>"QK^$Z#uɘngvԖ&cEsM&ɲ8%V:P :A 1Pi!Gfv'zeeU' iX[H&Kвg!0IDhfvh$掀i+[hcZXpڦP);C 8~YBddet#d[rɐrx 'DIk?q}f6cɈJ,a@ @Byka[։h_I[ Ǝc@1ђ$AiQE^mC@%&+a+YX0fp6cZ~%4.R-Ad{Zg4@4fq ,(ZV@`6@FS(M06` cB\x 3vdLAcCZĮNK!HbE@NBzurjZON֖|襯Ư?{ä.~b@;䤱/ B ḻYbPG& /r).T&xŌ-pɳ :ڗsL88i_Ey8Om |%l_%xq?gKӄC FiDMa&?}Jcx%Wq"^3(t ~ԿI:8fFsEњdd&eUV3^tq+s ENd^*|c>)2"/\+B}E Wd^y&H?22I:BƟ#۲W0-MN/4xOqh4n}kx1V*'N9s[oF[n.{Ui&0fPY $[FjUJ ˭R) *I=6Vm#L*˜|1l:Jʮnq&p3T/Ȑ-X\7^(!)2I[R*)bFU}дJY!DF[nZ|hTB`Rі;"@6),I&a0H)e9$EB7VnD 1 Ƞ%-8fWg<kMak?NVI<7^jpBDLZdK1F8-k'#URKі)#f` (jl"N6Y\c [K1vㄲ M0`&xl[n8˰1<X%M8ZMK}'AKV3.\qG& q܆ژ?#L|e%1a&ٻ&Xݷ8n!Ʉ-kU+N6. ɴ"a^R!4>ђx$jqЖbDb88}Ol,m% ,ҌUWӐ<ܘDC- -ZqFL0C8G-L6Y U_pkqkEeZ*:2L¤}`-{ I=͓-XOКtRlqA'[q 8IY@M!q8.cz1j6e ,'KkW' 68A G$0XӖ?-NxFؒ gdBD+)l FЪGmUY3*BKz'\9.Y gƟ0Xyq['[k"mֵȂ-g*I`'lp0IC:jKZDF+B O&w6jĘUja>髆'Ȥ\.Xpw?1}{g>g}vǎpM6-Xjժe˖}ӟ\3ZJjWܐ4 "4FԽDZ4f,GmC3n7`I4,Nbdc202,b%3b [ 2c\k6F--L[ZҼ q"j-$XRl52"11Nňf1 cub!ӠIX %6e`Vcnj'A9b̔$B!j:F>V–`:g ksLDd 7X}nc $@ xѲ8V|hdh30@̴ ##!4bRT (D13d6B9A34UhDf q#aD}>NE+N~g/g7=Ϻ;?Pp/vK5R熯;uǝZ#]>zksv/,~:=ӿ39{=E3[gz~%'o2̔uU|G޿Xڹ²}:Wjwjg`SUϚ[mwƊݜ.?.U ?4zwbþ"I}|ѼEW>~|;q]nr'ss`d|_ǾC7k3ydAJ_'ߺ;nǛwh6L~ɧO}Oܜ[|{'_{v9WGͯwc=ř]z_xzh3/ll/ոqV_?'Fz7Gg׏1Y=g..hlΞi䷡,nweߺ>8W>t9יqႡ{^[׬2Yy'fwn9Ͻ 3Wŋ,m7N37㹙 .|Gm; %Ļlkg`d~yYaݻ9'=#W7a~gYs7+_^Ǘy5WbޞGR7-`;w~;Z뿲~T%Y F?Ojhs-9 =3* W{ݒoV3xoAt ]|%r7:=;y}lD'6{)|_1׼0|@;go&od[o{ߖyjWfwW 7E8m@ײ_yxsYasҵ;}d*\M{o=\ʏ-gN_[rmޭ=x\W_3Bw3[t҃{=7@wOy{7;^3΢صz|-ЌׅY1{WхNW}1{ߖo.ĵ\~7񬜝ٍ]'~'.nķTQ|{\f =eY©;m]߱.soض>7߼' ֟:O˧ʛঽ[?tˣCOENxijG,8=]_Gkξ7;oyN6Uv; %;-qhG-k_+|p`{U~=Z\,ބNiۊxŒE.pϟzF3aA&۹[RXyyNڎgnim{7\1g.iov__fґ@N+at*80mN[wakˋ4ު]G=skg{_mW*g_ut+V={;o ~zltvٿE'xTg՞E<Ӎ'O w&|5Sm^~`37f?{Eo?9wB;Qy_w`mjs78ۢWobo<xvsȞ+|5Ѯ~u[f6w~O~$]9wu}+N)_;/ɕ+4Gfn.twEӞU{X8;s>ekO_vY#r8c늇 Sɖuӥ#P74:' 3+o-5ۭz,a`!XG\DF,5 @9"`8Fa3 @^!F)"6`l0$e& l!MBkҼ4Adp!؎od![I A nx$%'Fd!7a6f@˜V 5[l2# Za`DLBH`R+G0 ͠`$HIOk{@ئfl81 \[ fr0h18 F 7~h,{x,HI!abp`$cZ#hKXYClJ?$3Cj-&@3<6`,?0GbS$Ml02ƦB0hZ)hJĆ66]kͬ#0v/"0WgjS"Β|wD#H A0ca qsɁ3$H# 0kͯCdL#&) 5#,&Y/Vf ]P"A38VM;ς6plU=@`"X3h3WZ1"I1&@2#iTeF!$C~h!bƚDٽ !m5CAȌD$Dc&( VI0Hwxϙ{'@Ћ4 ?+^^*6QE)"Dz!5@z6~~P*t>O؝9{/-˜@ @"t*Qt`V6V`Al0R!4EE ClVQ .g)/NS} ! -8 ~Y hbyN L=HCDXX2a*ࡎ0Maf!(dczH` LA4BZ,_رlFA;t3VۥKP臗c^ $$DXi7SЬDI 1##NE@&<<1(AD#L"q#?D3>?pxKă9!0"cOhI< i'SG~e)P^D~ ~`'&D E"8EC_$Gq@$D ciѥr34,bx,X/c>B ,ϋy(GF"VE H<Ƅ'hr X1ae9 GY }<-pr^S =#яDgϋeY18įb9 YQσQr' cKn"r>G^Eq~z {YbDQd8F`QBGH$0bYXf̫ MGY$E/Nsbݘey H},ei# *F$X`xB$AH("c' DF@Xυ|8AD<"/^H`GYH>Q^u B^'aNA؍nA|oB"`N/ī\"cNDaXIby<?aED|Dy^ 漄YfDX(PJ,O p!ZNт(b/J>?=f$Q-T"X'%''ZVqKX${X"Ќ}b8Ə<^g %b$ q_| Fn2nVE1'`'@hޅ~Y(N9I$Ja<ϳY!p Gy9= sS%Rc$^%ͲKDI>HI![gų|F]*㏌sRd!6Rn=GzMR)EHn3M.X w5Yܹz.`!5^XZۊbR[`,Q%j5ԤqJ[lf;qF&$Z[ĺ<:Ǫ2M>ܜTq˙0U-ձ >d[(hMN'bRS>ͨAY$^f8jZ5*"1gg'w쵗aVxLȭ68s׶ Mst\Vu)>oۘT|z:\A. :|>773ޒZ.ίQ*ְW5BӼXZ9MVg]eY)Gxra q/Mqײ Dt'B$9yT5lbLi$gp fsLL8c$މ&\6ީrkqkTu«]Si='KL gݕtt/3*Kў&uv;z$6QpPiOz:맵a:o`.XcδfoRe;ՓpFu 3:Zu0hi@bT! LUAB/=\:sCbK*KRgrK F3W+[{;#TMs}٭d9n`c6{TI-BfC-$dz$MKR%;amWD9_699͏wiu4KNKCI8Ѯ-R-uNiXP܊$0*u#ɎsاkU[-+9tj7_*- H@*uOp\ViN(ϊZ@V]Ilk*QZAX*NKRmuHu-% Yqǻ 6QnX דkX:}r6Mjh=/Myu WemH${%S­IכZ뚸HӅcbӢN8hnޙ?OUW/D3\)V69Ul~hj`yb`e2OVb'LI>j+vKQa-B7ԺSZ 10nSVXHkpM~`{ǧ4Hz#Z7TѤBێz&RYO\gSY4D*RIRSBC@-FRc1,O S2Q#4DDj*OFUMx_j k)3g%*jU:JrYq优&b^c Ofs3)F.f^3ő}&q'&saITH7U &$FyETIQ֧kT(N-rMj69a~0LmmmRR,풒JE+@_nSe?22f͢ EP ܄AK%tQ8J!R/UBW,D) IQb@m` JDH1"( _(Q C( (0x|:S5AH" QH"0}1C`%$Q H  C<T6$! !.)DH"pT(jQB4DDu`mݨ`4yӃ!"HD0)yT!͢δRxH/L/&X"I -Fx(I*Z;|8 ^w.ht$􄐈p(VzPtVIIx1}+.*[Uo,Z+R0// BxCh@Ƈ좀#ҹ5r &p#oDN>" ɻ/&*k`Y%6(HC%* C.ʓH1EePYpB@!DQp  Ht1BH > "( Q:Њ0""x"` in1 :B8JTȔ\OIGIHM$*tY1Dݡ"|.SQU1L(P`r S(TZt)8apQF(bB&Жc/6f*ػD"CǃQE  VԸلW $t?a"S@0Xix.. |)ٗIDATd9@wt8cHtsP$ GT.]!5$K" 3>ƔA9p`ARPe4$Z`R)@_");L<-l aQ%/"Lo4,gՠ)$("#B H ^/ H`Г &1xA"H?B..xTO0V M΁fMIBt;!*8 P,Q5r1%, Ep**, )OWH"C 0_ѵB$BaL(y ט:0%aA!`EEhBƠ?J0D"pKVh "t)azŘ@Tp1iυS }*Ncƈ!Bh8sCf) &T@wTR R` =T0 $LPA) ĉX4ưQA:8>(}& &]"T$aa)@Q!9H!8$QpfT*P ( sMhF?_ b& #:V;H&t`Sr-@ø"pƔHQ7`Y*k z | eh$Ic8(H4 6Bx&U̠ʠ,XHSK0ځ-xj aBKR@[с \9 Q@ iBX9Tb. _TR!L#49$! . `UH Lh:X&N  b`LF4š((9&ŹF $a8-g8M#,(F 69x$X!&DDPOp cT)$ iQxuJAu,^B(䯃SYp%0p$X7:BapxWJe:DDv`OJL M!)=p X#8 8](N 7` & UယףGAUnI`(`HΫ,D#!4>:ͅF &ш L[3$jE3UPL@ 0H` JXi0-OF臈*0QS&0tPr&>I i8&``D$Mgeb@إT B`pCJˮ2 +UWW_Ut]AAAAAAAAA@1n]AAAAAAAAA@1n]AAAAAAAAA@1n]AAAAAAAAA@1n]AAAAAAAAA@1*B!JgMAAAAAAAAAA!EQ`B(6]AAAAAAAAAGx'H$IX$pWPPPPPPPPP(p~(Iq 2qB61 $όb+(((((((((HdZ!c( ,+IMӄpWPPPPPPPPP{={jϗ p"#I`(--֭[]+(((((((((#<زex'oK wY6N?AXx<4M^_lcC{B*y1&EÝhAtN?(~`^0ǁ B744FOFAAAAAAAAAcLQ(^BeʨTqU?BZCoUSPPPPPPPPPPø)+(((}77@qQPPP ;GX0ƒ$QSpc $I8(P'IT* FQe]AAATenh.ߍ㮠R1@$e]AAAFGqyTPPPNUPPP 7ᮠpp(di?;!rO6U* aHrl7Dj~A3rؐЯK=B4M_jB|>_|'XREDDtre⩽m6bx<7\c#""Vlcvzj:**隚e˭0F122Z.T(PTPPPPPʁ.(WեiSUUUz>**P}Zh@BHYY(VZBB?( >OtYYqffvviZAEJp8XMNNVҭBVby$)66`0@;ݥJ}Ah9UW8(RhiOKw 4 W2;` !|>K$(!9  ڔpl؁#U%V' lĆe#($ QQQFRa$@\@nwzzVUհz31iZ$9!yT*GQV],~Z]]]`6 ~2rQ@ٲ,k2tF6pȭZ6[J<ij$R, T%\$Fܹ Ie%FcUUU/(X*j\.AjhD,BscLQBQ E .n{[77X߶m[xxxTT^7Ͱ[f0 b  ٬?䓤Ta(t qܢE6mL&lVT3gӧN8`0 zd@ fbp8FNy^V|xĈpܹnݺ奤TTT9s`04mtǎCi~xEQܼyJMMر\dd[Bo-++kӦӧ7nح[&M8NQ].N۷o޽{oVFccbb6oܻwUVyaÆ/7WPPPPP+rWZBHf͎=ZXXغu+Wn۶j~G $%%UVVΟ?zҤIZ[|y-0 ,{w/,,~7:wC/^899>sf|ZvڵUUUSNeY6//ofyܹ%%%Ș5kTT(w>|x޽Nh4 ?~JJJT*  fɒ%7oy?4[lټyʕ+=JiӒSSSAhҤʕ+ݻgϞ'N,[aժU-m޼9B Ӳ?7CkIII"o`0^ȑ#V~-Zؿ ?{\̘1CB٦Q !Z… =BhԩO?hTT7n۷ȑ#kkkiv\}YLLd={v]]_|Ѵie˖cǎ+V޽y*X WNQ嗟?0??vkڔ"BHQQ(}m۶{q뭷feeQ5bĈÇWUU}9rwy'8WB=Aj#G={^?vXEEEQIIIE 6l̙#F޽ZKһE:uj۶mAAACCVX,}u:sӧju++1-//EQ5jzb6m޽M7O<)I"k׮]nݒ󓒒޽{WVVcXBBB~N1bDFFF~~^E`0;v,33;@t:ZgϞQF͟?}ВwUSSAAAAAAA wptٷoN6 p/E{۶m~CUc\RR2gV:t[o|7-[<~ԩS Cfffuuu\\ZvÇjq\ny0 !a< T*թSj5^W>ǻ,{=r-^W0xwpºɓ'\2;;rA~ڼyh4 ~eAx}֬Y_54 2  wOHH6lXRR|={FDD,ݴiS4}!C,+*nWl;v͚5q\\\DDnOMMh4]v!<<!T__oJJJڶm {*j͚5kӦͱcN>ݷo_^_\\u .lꤤQΟ?rOE1))r?O$҅J*..zF:tgϞ6~֭ɓ'@lE۷oh4X,pvGEEp8hkҤIu ~I4MYYY]]]VVfU dXXqzȲ,M~Z,..իWaa1SN{INNv:ǎׯSu9A222`i]QQѤIp9ΥjO:uѤ]VUU]pcǎ| 'U*եuxHNw锔XUUUedd444ڵKݻLL8JJJr:999 JLLl޼yAAAfff]]qpa&M޽]vgΜILLpB͋=ڽ{ϗ߹s碢w!TMRAAAAAAq'z0n(FQ2 xA݂eYI Nnz]‡p[|aWDQq @V= eY8w\TTjd@'nnQ^TTz4i;4(pt:r峆,˂3 @$(>.T䕏lֶhj?iaaFcJJJ7x%aIP)pl* Mbaa!󙙙B"(ok%oB/|>Jh4rCs:]v@AVz3!d2t:Cl)h rss_xЇ;Z( |L&|˲лZ`x<iZX5Ph )# eex#άy:{_šd'oY4ACjnf\D`{} -IF#V Z˅,grriCQlˠ ăڠVUT]F,ʈ*C6,, Jl_hp=%;(]|PMw9*tL_9ShOhH!rmtho' Y­k9rȅ#w]AAAAA/ >zuސ]eõZ-4D(*,,d2[_ ,rN'AWjtkkk֯ыk}y٢F5B-N/#APvZ7:^ q~mI0uiR0̪ߛpQvC} nDn7-tM?qȩvnEz{r)(((((wT>UՊAKhClŪ*嵻̥iQl˺r**22Af:z+].EQ j.gNʯ !b\=B6444@B{$iáh@/1ECFApQvJVlۓCc+**V+LͪFZV^cdϒS $8ko%EjSpש ^4.ڡF/ yE ̺Rr#=]L W)]([Al6Tbh5A{+4W`-3 cX䘛ñ^|p':5 \tpמ! iZE0 EQǁJ,Ԏ?|֭!~M#YC]m$^mF}s!+Kؒbqy_ZB)m8P'A(Dbrwu1o;r QX#UD2O#At:l InSt90*N;vn ZKAAAAAƘyj$IZvm۶m^ouUIz; jL?|PNZj5aܵkז-[ݻ:} yEQtf:pݻwLL M`Xȏ _X!@(om۶v۲e˞~iX)I8}~uEQ ,صk3Æ 2d~zO> FB*]EFW_9r$,,gݱcG۷{ԇ~]U$I՞?~͚5>,jV/Eڵpvm,t:`C$""fF8V+FVz7m۶l+{#5?BhС;3f}jbN߁}ٳg/]iӦ/bjjjl(8q"'''>>Cr_y{?|kjjΜ91a„zr!\.ɓ'7~o׮ݴi&LPTTTPPP\\_~~W_}jtn:e|AAϟOIIIaYZrɓ'5M;uW 5cǎƍ7nEQӧOիW߾}g͚U^^~뭷 ^s΢za?~,6ЩS^xٳg4T\\_ <ʛyvB4M~~Bذadj֬ق AxGϞ=uVZݱcA8puuu h4˖-{e/IjuYYYLLg}ڸq(roSNiou:$IbŊ 6YYY (zܹsVu۶m۷oio?vءC|-[]I&>_}[lپ}{ס5ӧO؆7%tT*ձcАiۏ=[o5o<))… x_ްQjM&Jr8G=s̗_~y=|kٰ֬aöm:w\ZZ'^wȐ!׿ ԱcǾ}1=zlݺu޼y :sɓɓ'Xb111 8qbao-zQĴZ-STڵZ999?2 jz:{ݼy3B;XlB6tiCFӱ,KW%W^paǎ1}=ztVV('ONKKEG8qJڳgϛoΝ{nV[__hN'DQ8N}|w=P޽-ĉ?䓩SZvnlb0zV7áxcwJUQQw^BHUUU֭-;b=>>$99tfdd߿?MpIMMl~hg鑑PNbvtpq,2 =;`^ddd4449N|aQF;6&&&555%%%&&&..pdeeN{/;& vu:MӐ 81)j}m{jyyyk׮۷ԩӦML^ wŊ;v۷bz? M&dL`8p@8I& PU.[lF1))h4ZT+x<E`0#&IV7k,''gݺu=ܦMRRR JL>W_m۶>G$7o^__R'&E=3=zxW~mܯ_|fXP2hݺyfs˖-WF[Nhj56 PV-[|饗B=ۃµ2EQ pX,Tw(*22 2lvP|aaa:pƂ 5`C?j~Zt:1ffvaQ+X^^bbbt: uuu,&&&jkۓ(lp|VqZhѧO+!/rZp\QQQ4M< !&l6)턐HY!{(RMbBe EtBBBUUN3Lq\RRREE劎j[pA?f c0`'РV C]]QTjސ@---tQQQ jJNWQQa0@b_E n[VtW78RΟ?䔂X<ϗbUUUUrr2XA wFj3?-&8 nt:p,ڈmb @-@Z Yjtcd_^Nlڴ)%%%++K_^R\.Il6(BR  "RT?nGEEY-gXY/긇!j̥ r5,ixuֳg>裲w(M䢆Y'ke[SScZe5XAdOV UJ*(((((\iIIIlll焐ꔔ555]peFߙ(pkI?LHYø,˂ry߸Mr5z9j4vPzZUAAAAADNHHVfFFƯp `ikJ4MþVj`n;574bԟ"_~1k$Ih􈚚N!u[Ateeexx8wno/7vϥ_ÿNvA*4q7 ap)4y_|Uߣ$4{^ٳ7V~=}>4?@ٺ\. ?  _}צȵ㲶ץ6$~WF7M\iQp85J~qry@dsεkNTd?;kx|KUߨ~-Cz$Bk!Y'˖s=Wl3hUZ|iiirgD!].\PTqqqp_uLP:wHvխ[lw mWו.l#ҷWjQO0רFh,w`04k֬jĉk֬$)33sׯ/..n߾֭[_{/bӦM7n3gιs:t Øfg-Y$***11Q]s^lٲ3gݻcǎ>_߻wo~E9֭[o޼wll,8GMKK {Wjkk[j5so̙3:u>}믿ޱcho֮][XXءCݻwO0۷t=#񉉉_}Ն ڶm_.]-[t~!d0 uP64`8N2s5PZSS'ZJf͚\r̙ر-[Ox .teܸqK,t ,;wcڷoV~?XC~{jajVZ24Яbaԩ]tiTk5Rr\&GyDeff~穩u8жm[^1 %K\֭[>|xܸq{޽⋟~)%%d)8`0k@͘1ѣ;w޺u ӱc˗WUUjJ?~<f̘w-Z@ȑ#&MZjՖ-[ ٙ2eJDDDee姟~k׮m۞={6''[o]~_~жm[41v}„ W8Yfv1cɓ'[lhᵬW^9uTϞ=a]={?ѣ:uwr!O>o$y=G}?oߞiӦtMvPPPPP@BjkkMl6$VTTx.]>綾^7nܝw g]۾}mĉvډ8bAV\=f̘!Cdgg 1w\O?GqIcGӴNS<Ν;ϝ;׫W;v :T;O>޽{۶m (j۶-8''g޽:u ?O<ѣGJeX|R:tА!C(;wn=&M4qIJ;w#''gǎڵkڴ)H Ξ={ԨQ}]vp0 p˗oٲp̛7񤥥8pM6ӦM۸q͛Νi&F}˗C_]e˖]VR&#6pEu};vaþݻo4hо}:utA7vطzgϞf͚\[[k0HԬY5k,_\> ???66Vެecr,$Ig>q.\7u~pmt222>`Ǐ;hР޽{{={իW\\\{Kp!C[ o7ĉ۷m۶;vL>?l^9tП>$iӦ(vKN߿?Bh4:uSNɑ6m*,,8}4D6F9{l߾}U*հan1cNnݺC>h+p[ٜaÆ.] v_*--ٳ'B|.\صkWII EQZ?a:t;>Xvmff&mvĉsΕz1}VZ}ggΜihhxW6oތӧѣwܹvڛoyڴi C niggggggϛ7#W_}ܹs z}jjƍm2(lѢEiilt{(j=z̟?oihh(**RTSL9sf;w\TTTNv{ff櫯dɒ}Kݭ[W_}ɓ=zl ]x1j۶m? ƌ2Gݲe-ҪUoYRS!ҥٳg}فVUU?/ٳQY[HFcLLL֭CUYYY֭U*UTTTqq|o֬YVn7B(::ROUPPPPtdKknٻv푑].׾}PE.¸qz٣GI Pc4 ygYZeVWW>lfB4MN :{*pÆ w^xu$Iz| .~ojeYVEa{UV!t:ݫ0ݻǎjkjjZl?FxС#G@7x#++ѣPE;Cj=鬨NcǎիFCQSrG3ܹS/11q޽ᄏo߾˖-SKo޼K,ٰaCiiO?4cƌݻ]vŊGQT!1NNN CEFF:իWÆ [lh!>>!T^^{`1#-[֪Uov'##X,q'qcWp#I! :wB>>>BfƸ\k!U槠p%.^PP0}'OiӦu[lk޼y˖-?իWtG}s΅ 6̞=;<}:77wĈ5556 aN:sϥ۷vÆ 555Ç瞨7VTT >k׮Νۺu!-/]Tbu뒒Ν[0Ơ51^t{_r|}B:wdaaaCCCRRF;wիWaaannСCGyy98zh>}~W} !yyyÆ S?}ݗ?|p80d***zꩄǏwfM2__pEVk]]]- xӧ?޶m7ܽ{w=|?p'N<7o>tP}ћn ◍9nOwygee%5Э[%Kdgg7k,11qN*((曍F5k.ׯӧ>iӦ!Ųk׮ݻw'%%}ݵh4>[oeXnm6Bqqqg>|O? azЅߞkqLUUUn}px1Nv.7t:V`ַl ׇs8 b EQv]Rl6aqbZ,].!$::lb}}=B(""BE^/0rPt:b!\.x!@Ӵkhhj1V1 (FDD׵lxe.aZ%[رc˗/8q"?7^722B£9w !,99y\.EQP555 (I_Zᝉ(vl6 мf6$"j4ezRuu^X,ĨT/`0<~f4]^^III,6444Axy.IRMMhZWYR]-++h4r@YB -|.(Z``Y8i6¬رcuuNZ mkZg-t:p\>ݮjnFh{<ϫT*H'jBPzͦVۦMFQs$Ihyyy;v)*ik(-<^CܙyxOOu֊?N8"ʆuB\˝2p! 9*)_zuII7of wBHxx^SSa>)//_vc=K ̙36m8ÇҐxpbbbw?A ýnƼ!Wa~?,,,4UL(s\4M_ _"ɾzF%RW* p:"4 2٬h^w4^Iq8ށ\K3~y^t:j5jl6;BN3 <8yʽ\qHPqlRR]zpǗ_KS\hpZPFDY[[(}#]g*j<' xLZ \;x4}+)$I˦\5AOO]~c>j NlE,k2B(I|h4Ā6M7JS0ɤh6z&XZ%4~.f;ògKW\ev*%Ei4Z}}GsZFvWFRW ZV%{Awʻ\:NiEwVV UFAAAAAZkڄ$I<_2YQi(_.*iWr.P~OA%N5*Тo%I7CDQ\.B ?"{l^iTnrQhzܡZcṡ-xb -_+V8Nt[w9{Rȅ  mt. ~ըTšO(A_]zEEEp6=˩z/Z`rYP' KG֨LB96Ǐ, >{lmm|H r,ǎ[]?fGni<}!v?Bz(B|ʕ-{i/nN^/DtmsBkMsmC+Wn藆F-ҧC_k./ygyF7o޼lĉk׮ey3fظq#!lݺ^عs_|qƴ4aÆytMzy/wǏ_dfKNNl,,Y2s:^{-77nN1c۵ZmRRٳG`} ;˲w_BBBrr)S~suٳSNݵkWzzj`0.CTTT$''KjV~a-_aҤI]t~iZƏj*e,Y2{={tafKKKǎl24i2gΜ >|}~i4 p1KU~Pr?<;;;" HH &:1EQزeK6mrٲa4jOo,_>IIIywv "6E͛7vs>䓟~)??si ԸhѢcǎ}w/sss۴i3eʔ:,X ""bϞ=~޽{WXaZ###Ν{+V̘1cݺuEEE|I^^^CCdꫯ7&MΩS{VTTL_|q'N֭O?wm۶L7ڵ}?|III.]fϞ=k֬)SlذaPǎ=z}!<4g7tx˖-'O=y$4Ky#DQ?~|.]L&Bhܹ(6iZ8ifϞZj% `Sڶm+)S~Gh͚5UUUڵ;v,ĻW\9EQy5瓓J#gҳ?xϞ=ڵ"r7nٲe0}73gάСΝ;?w֭aر?CbbbLLW_}5g( 6L8z*));vO?ԴiӰO?4''LEVHA! 0ѩS!ve6_~ѣG>|С1cm֯_\2q/:uG}t3f@3B ,g_|ݻ!\йs{?\hO?#̜9!jzzh ˃E-^*^oyy> k~駟]v_#GΛ7oҥݺu<8u!C̙3gK,1cop†8;t={̞={ԨQ_~eRRM7ٳm8pK.7tSQQQϞ='Or|> /pB;p3g/33wyu*++{էO`x0O>!C~駉'~W6l[omvVw޹{۶m_ׯߕ[C޲^7""W^SNmӦݻU*#<q: ,hhh1bN9sftttJJJǎ{0jԨvҥw~ll#RSS):ڵk_~%Ktd2m۶̘1#99933sѢE~8|^W<(+ Żtݻw7o'|뭷Axꩧ\.ב#G4 󑑑;w3fLRRREEűc&|'nz?X~ PDD_|O?uh4[0b >РAo… z}iiI5Miiy|>ߋ/(.P={g}jժro4#F뮻BӧO޽;Bĉ7t{W^rg}v7<ϫjo@d***y#FTq~wyu=裫W~'v{~~~]]=}8q_|a.\8m4˿2++?D}gV=O^^u:端2eJBBByyܧ̙sm 2d֬Y~;h޼ &)''ɓ9vСC###Ϟ=|>_۶m+++ f̘nzƍsς ~ᢢ!C )S{YYYaȑ? r>C_z%v9+((PT|SO=5lذk;v,==xEQ|ZhQ\\7pg2?p8>{UV;v۷oNNNzzƌRUTT}G}o޼=wQ[[{sjڨ(.\644| u];veJׯߴi{͛7/]4-- E***gywM&Ӟ={cǎ}ݸqrrrVZU]]ݡCo{=u̙3z6m,Z믿Oׯ_aÆaϟߵkW_>CzB(W ~$O;w>qs=׫W/Z.--֭+9B(11cǎo~z[o]]]v"##A]{"bccz>!!~LHH?FDDu] ~wرE1--ȑ#$uqy۷/B`0l'O.((P?˲P.\0`((E#Gu֯_ 6;677ԩSuuuNQQQ]]VZo~Μ9w>ڵk=ڻwO?NV;d2EGG^Gzu>lIII=B555)**ڼyizi߾= 7WzJ?gӦM={I7??[nlrkjjZn=iҤgW^yBo;wܰa7C 9dYɓ-Z;{=aPjj[o5| ̙3: aFh47nKJJ~KKK?^wpK٢($EQa1N,'NLLh4?ȑ#QHKKK~BF:s̱cF  cYvڴi=Xtt1V}>߫ZWWw-^$Iz~}Qmmd'FCAXb^x7|sʕo}rZRfΝ;~lȑ#׿"""9aȑ...EC{ڶmi&Vz7~mpYL;w'O g͚55jƍa>!!aҥ&L#N>0=sjӧl^bŋ^yÇfիW=Z}>CCD8ׯ_Ç'$$ >3h49rdԩ0zuֵk׮gϞ^cǎ!7ߌ7nժUM *k?=zoڴ駟~1PN3""f+r BhŊ<~ŋQ <466{###Au>rݲ|G߿ɒ%.뮻yDnM6Ff^x<!dX ]JJ Bܹs%%%EEE%%%PJ >}<3^gϞ>ѣGyONN~뭷SVV!_]]͛wرlٲ۷/_y߳gϹsf̘!Iի$Ilk׮lX\\@paXkZGE1n1#+++666..B|p W___VV՝hH^7++!TRRҢE bccVkYY,AO:jٲ%,i*++STϟGUWWBi*DZc֬Yz{}}M6m̘1}(jGw{ݼy3ƸO>ׯi~ԨQyyy]vavF8q/|l `OΟ?hѢ!CtiĉGgegg>gFӮ]>aɓ'ltN4r'66ve֬Y?ѣGiX,-zwu0a=;v޽;==}ȑA/Yf<Ͽ{0j3fFy'QXj(iWx{ꫯ*++Z-hL&0%m6[JJ666**JV#G{wibbb]iӦYo۶oӦ/}lrڵk=\[[kZ&T/++ 듒X*UV/Zy_VZo 0Lbb"T#FL6mڴi(իpvjˆҥKV`!ow3',,l֭2eJ-nziN7p6mz'*++Lv횒V}kJ>;;;::zovFIHH3{F3g}3u)))f?&Lرc? 5k_{^Ҳe/bȑZjB+Zs͟?ѣݺu{.o0|1chwyg?8q|͓O>۷oĈٹG֭[}}j2~m1iҤ޽;%Cǎrhd󅅅a^/(  1 dS\ws8ɲ,veErTAXx<xtt:F#!;**Tܐv1f|>˲r:!8ZQr`vϕ#^t8??rժU&L7_~?D~ h4B~{# %''( Р`44^ lhY,H0 󼼀kiA~F8TVuu^X,ĉ###~aeN'3^br=HۄmII ˲ux uzZ`mFVƍ%e[VV VX,,˾` mҍc,G N}8Nph4Ж!555(qGgYAMZ UTT@ ;\W_u'89>(N. ka[,:Jhω&)k`F|(w`${N'jkk!1)))`vN|HӴ vjh. !maa*=/V+$s, _a'\.FTall$L74M9Qc0 f -Rg6w\FmylOCAٖa8NՆbkx"Bv*2ArB.8 8'rDqQP#؉'ȩ~O@~pl'2/TpJ׮][ZZ:x`YOLsYYYRR;~L=kjjz= Iyyƍ~a={v˖-`~vmkC"\pؼysPøQ.۲%$I۷oӧu8hfСC浗 k׮M6ٍ~^]]m49?[uu?V%I4hPBBj pRx[(mwƍMAAAARA((( jݞ*+NQ˲:|i h46ՕN휡k~4[N šx[,Fx~l]z˦Bq:`^B3~t!d2.+ns t6O+f$r5J(V(,ɛPMW? fFd&}]a~rW$FlN]h5F F1Զ/G|x8 m >>JZ-l^uvdJ5{ٛ\^FMZsF%piA4^)2'^yː?=nmЯB wUC$qqԠ(aywq+M`j/_hE\~{!eYy6ڬNX,bfAЋ7͗ymyYwRك~v90jmZ bȁ0Ʋ7ȵDzRp0]k-Ku dR6*SWWwuc6xguL$I èjJu2FR]VWFN$Iמ?=Ͳo;:h4k.? ([h 7w߀k1}h B' ,4F7iW. {u(mp [ rF~0y(!~QhRI06Btݻ'!=hTPq<2+Q28җ1q.-Cl:{3gPHǁ?v{AA 2>b)oF/x<,߿t-Z(--6nv[h1cƌ͛7;vK.[n}Û4i}v3~~̙3;waf7nM&SZZUB: BH/Zh;vh߾=˲:gv/XlYEEE~^x!:::==L;ve˖_uNNΑ#G:w *'OS2{ȑ#ٛ7ovZ奠"BP@-¨q\\\\BBt]t駟X}'Mtw&&&Eׯm۶EkNVu] Ym۶Wܝ:ulǁl7|cX^~cǎ1*gfZ={+))iΝC%j;4iRvvvvJJJ(u ,8sL#"".\SV{K.5x ۷oߩS ϲŋ{_L:r˖-{۴iӴiӸ8۽p#F㦛nڴiӈ#Swg^t͛rrrv{zz]ڷo?a„͛7^UVӦM۲e`ؾ}+x7 cƌ'$$,Zhƍ0D\.ggg?>|3>C9aÆ 8}ovϞ=srr&MvZ r~pSݻW,3. Ǐ駟l6ݻgΜ)IRqq &MԱcG9ԩS333!"zaa󡵄re-ڿ||ܹsmֶm۵k.ZiӦ~^SSiӦÇtSPPPPW7ܯh7ˇ:tPPPCxJUSSӣG88o>lذXZC%''+Ϛ [9tm/\PQQ@!bbb-[m~!**ox<{y㒒ߏΆAt!^NLLLNN^tc9jnPuuug~)***-- 8qo߾qf?}tEEΝ;=;SQQp￿k׮-[l׮w}g03zk?~W^&Mx< 2L˖-۷/D~gu,++իWbbٳgDz26m裏~X/[fzn&؃^Vԉ'~Ųe˖ɓ'zeeev!t9= L555ڵ{۵k~P>|8**aIII}z˖-ξuvȑ ~'-ܹw߽|klq@<&&_G}oؽ{~:==E:uJJJᄏ{wqvNNb0a{~YfUTT4igYbEf͆:tɓ';VZ;]v555O=<ЪU{۶gVۯ_ԼGVVV8cUUUmmmG7߼{?$Iz?uTIIk`~C,YҡCym߾l6=l_2{ 8wׯ8ᆱYj:u ]KHgaqq1[eŋ9s7^#vޝ~zG/444>|x…cƌ1 x:t#X!1~ƌt:۶mm۶,Z,l׮]{m5J?lB[,T rVy|` GDDDbbbAAw}g4n烌`xabgΜq /PWWu ifٲe+Wv!Խ{{,==tĬ[.)X,r\Fdt8(7&! 僪ysRAD4hnƍ2dH'O\PP b b,D^Y_<ӧϗ_~1?>Tyy3Z-.&%%l6w#8Y% b-zxINN6 p:~"111< BmrB*W_ڵK/fLһwoB0 wHLLDf׋k*ϙ3ԩS͛7޽͛7oܵk-ZL4iŊ111>={rrrN>ݵk-[,YDvmGccc 83M4Y~5k̫=>޻pBee^9V#""x㍈GvСC?w\ff<Я_?ѳgȏ>hʕzٳs=G9{lf8P^^r>/..n„ +W ssslsРApw}wݺu)))#F9x DF1 qǏoڴ)!nw)??Yf{޽{<2eD"|2׌]h"ccc.{^{-00ƍ*jѢEp&%%[YY1;wLJ۷φAH${yysKKE"ܹSUUP(OXlJJʓ'O,--cbbN>d2U*=nooW( Q(4lLLŋI$\.700ؿ?O=z@R#""qF5pt\.ߵkݻw {gmllA/ĉO< 077OOOooo`0G)**ZbږϚ5+==wɒ%UUU\ĉӦMr l rjٳgwvv*9s~O6|Etttڂ(D1iPH @S.ɈD"h  Rł8&uBX, A5XA'H0dD"PHL]m="d>O$aHrj82[055%Hd2l D"Xh)svS(2 &tH$ T)T*xhT*BP(B!FC5ڵ(fD"BF~@蠃:>=r*~؋Dw L7'& ÁPOO^cwD?Ah%rtE BPho먧7RPd>W`>BD㼀O5ڟv}hN^=fBΰM DA0 tqqt6 v }}}4=:!%ՠ>}]*㵧0:A'/Eg4Ţΐ9OBG ybT蠃:KX^XArbJ9$H @ bRc~fAepKXa 9^PrPV#]E AGGHvv<]]]zh_ A\b "H(j **()_RAT?RSU @#q>#Q=gftA;}d0܁0d2'+bb2̱6Bgp5:R(3 Qb_;MJR/x<^RH$}}Q*(o2[a円(inGQDtAtw7%` B_* h 7 `K}W.'J A@IuG@ bhm :蠃:߆#24]ڊo2 .Oe`/mvRJ_bB@#thˣRp8}j \:|(Ja bPd{T*|\>RA'.D-b hOh'*à^@ 9 VRڵk!!!S]Rڵ+44շStA43 rJ$ Ќ Bz={̟?Ɔ%%%M<׷H * PVVgϞm۶y{{3L\. ;d2ˍ7}W,g8D"1W_}5::!77w & `޼yq0F9{l{{K/^ Amll^}դ$VLMM Lbmm- \{CO0Ӎ>>>ϏDEEٳG wP` …Sd77UV577!XWW1p8UbR;y_=c h~OD$b555oq)GG_ҥKjlw7deeM: fܸqSN2eJHHHtt{ƍcٰpnmme0>?~LL̞={/_|g}뛚Lv:蠃:#pG O&H˖-2AOs |>trrB 5CCǏ柩 H]]ݯfq ;sLKK˷~ /iP`D,??ܹs)))r|+Wx.]Zv-HaA>x⤤$AT*ջb ;"ǧHR*466644 rMXWhN[[[STAL&H" Ҳ@`S/d_@>/33ܹs>>>$%%3!44g...|>ܹsfff)))  9RCfE ծC$RL&p8nz)]]] NXc@,R~3f555d2_Va.@QD"‚H$o 8nhh~m۶h4CCCWH$v9a!\KKKg}`0L&t`M7ߜ={ŋSLٶmw}w+++CCCC1J%022uAtcxGN:U__2a„{ݹsg„ ە+Wlmm.]zK.ׇ^~X,oo˗/šB2Nݼy7ptt ǝBl޼JZXXlܸǠ/?^p_2eH$?~͛^_bjww.Pcǎ[kRRonkkoFEEM6M$M0v7npss3gNoooUUoՁгT*AT]]b^}ղL>bZ&fΜuΝW_}u``FyyyqM6O:UT?^,/]0%%eѢE\.7)){ҥ~~~W\bv@a0W\y䉭azzŋ<? p?~}Xܜ7nĈ8B駟Ϛ5ԴW^IMMf:z(PeBBBz{{Xzw蠃: c` &<(TDA~T*ݫT*a'A\bA@IB!a)y<jv/Z__g0@Xu;JGDR*EwDB4(  k ƙRTT Ka#eMFA?p8Z*ЧΝ;;v HhxRlGA+;::lmm!sԫ`RzZ=ES* $HpvPj_ DbQ(m{pp8<*(zzz Bxxxp4пF"$RJ%dnb+5ڶ&8% `BvWJrhB ъӄx RnFNAtAt`]TWW!FaXvvv`ᇽ b5_p8vyjAW؝a`8,!V5$Vn:4кpAv>'},oAv1 ڌhþ FB"/>lm===O<`0L&CG*AW0hZX?"h/#v+@{CSyP>;m P{;6tAtߏqgXl6/r\*3/I>88HPxտX,Uh4(%'|>_&h4*pWR/|>_OO<3(J>ж\.Jj{uAtA [ZZ542ퟴi#}־ "cjd6CM؎744cpt CGJ6z1/PL&s خRT*N_pZLMMc_}ea ,,}}a(T&&&hJ5@*?b+/ ]\nll㯋P)8[bz7Ph퐱=9UAt w3 ?2~7ܰ[p8`v_a\9W L߱X\O2|%m^===mж8@ h_N/^7cJADAtA @ˣ`xZJ2gHpp8bmClr\$|>Z6]B2ER*<O[PV hhuHB'Jfp8999VAEE?=(ˆD"8u6P m A)lvQQы-[ twwm0pZXX8000l@--- {:y<^AA7=hFeee]]2՞ɴ{G*O AD"|&r0~@ TA|>R*bĉ%bx```9@Z@+n mttvv#; #Jx< A/T [|aKKˑ#Gx<&JA N9s|h uAtc㥥?{キdɒGo}Y[^z֬Y?}P( 5k֮]WZhݹs@ ={̙3Qϗ"W_Q(8й{#GX,ggO?4##cǎ34 ]p͛}||VZ>C566pH I$ӧ?O|7oLKKP(~@ ;wڵk'Nx)>O"3gTVVb˗C,H$2PTJd2h TJe2[ lΝ Çp^UUg]V,GEEk011y <:)))aaa/Dж !&NhaafփmT*jdd /^H ϟ9d27111<<#1I j5H0:0^y #HD"Q(O?A;QuÇ{zz~G'Oh4~iKK˭[uzk߾}X,O>a`]x1??J_>''ҥK111X,677wΝ===ov@@g(iX,)OB#@k@Tw ym$T*F+--/Pm+* СC===ŋc.{eedd믿n޼fXٳ e {f7nܽ{@ | ,H$8p妥_:蠃m qVVVr\ fee)ʕ+W>޾=///444((h{;wɓ'YfL8_~ٴiSHHȍ76lPTT\]])++ ܴiӉ'=za.]{{{e2đ(--500],X]vΝR###tʕǏWVV>|X XXX@40'O!RUUebbiӦgeeyxx@7*z- v1kkk2|xvܹ??ٳ'66˗/JuuusΝ2eJGG/*//߳gώ;BBB>`&N zccc 6ٳ妦.Y$&&bp8X Vt῁踏,$ۻ?2_5ϜeTTTkk ===ֆ@ pss zzz͛ JӧOZ[[Cy=`aa t/_ߋb<?~xAF133 CEFF{yy8qD$ݿB̘1へ?i$"7?33A~I*r\{zxx@*0v?p0 ^^8LP(gΜyWH$ի.ͭ&!!twwwww;99={6++ yz6A3g|sAC"/N9r2eŋtpfϞ|l0###Ϝ9b{###pBK655ꐐooﺺ|Rym<R:;;CBB/_nmm}ڵ;w.[ N ѣGr`J%ڰaL&裏ܹΝ;tw}9,, '$$̟??""bzzz{QDϞ=M <==Gutt\vG&}GAAAPBE`0NNNO舎1c˗ߏ ą HPPT*N П@.O2WT߶mO?5kܾ}X:.\9s槟~)XG}gkk{Y77ٳgO>}mD"qԩ `9sϏ`xzznڴ V⢢ɓ'K䞞V[[bA:WW3gTTT@}%I~~~\\4 JAt#D$11100ә]]]zzzoFss3P$R)e .zeSS RA 5cc㊊BngBꫯKୃ9ٹfF.C}mT:ue˖q8H}ʕ~ /zzzΝ;իP%KtttY]*?|0>>>55O_,H t:}͚5y2c"|򾾾̳g$&&"rʕPA?>occckkknn>m4GGG&,BKקP(`!?L$ @Q:&/]tk׮mnnbm۶(P(Bv`td2& F p LISSS2 Z%px]**  sɲ2CgƍT*&ٳG*~'|>?--ѣ.\@$11AիW B{{{ y9GGk׮A ! }JruuR͛9sfuu5`(=##Śuuu啕eee<OT>z\V$$$fBsc2D"FYYY v(JQJJJRRX,V(@O666V0s رc---~ZNMMݷo߬YΝ; ȵkt.ɌLfHHȤI իWBARSS,,,U:22¢ܹs SLHII:uݻ]]]_{+W466l߾x…aaa]]]ǎ0aBLL (Nwssȸu;cggzg2 L&رf755QT 7#d2m`0CCC|#b322-,,MT*E"ђ%Krrr>~R9nܸӧO[[[8pͭ;,,*NWՍOdӧ_rѣGR4::?88X l`ll{-LW^^tM6L8B>}Z {… x<޵kZZZ/^(5oAIOO!!!999YYYnffoV[[%&&R(p B477xxx7.$$$"">F'- 355T*UCCCxxx{{;X,_h͛7|I:::ƍP( srr:;;~F2|{{M61`ccSNfffwܙ;wX,vZ]]݂ <==Ϝ9><6mZqqqZZͻK ޽;uT \vMTFDD<:蠃BC@CpWmkHǶ@D( 0 300hvP>7zbQ(/J%*:#dPzP#<b!/:@j4(J LX=brJtaMh;xFr@`A{נT*ax}}}sssLL W(@=\E"Qfff@@\Jkw !Wdu *x/C j8 25XGr>[PP0yd:#Pr{Gq蠃:w^զkF ^~mxib?Qʱ0fB{ $TA5.Pomi:0H'j% BߢV;d] h(@{X,*z ===|h)AuX,h4q>8`T*Om5h}b NSO-#:(~KKA1RFk4`aa-4,c,e0|BcD==^<ohh'GpS~Ȏ PLLLe~?:P;lP!# |h}_TQwA" F7`)( `sz=w+{RP_a2(hhcBp8Xc $TCɍ2GdX pg횢o^R ⹟/*st uA )6<>}EuuL`>88%vM`Be;/;j TcuPh,мJ׾}Q|C3|zg9c쎱ڿA1Fcƅ3ۍ(9Wtlo*J4=4=+8gX,R$uH$\.OOT}}}2 /h!+ Uf. \.Cs@ puDd``tP( O.ӃpPa``DGI׎F{h BDA ,  t<dUhhbGv hB A|>.ڽv @K2*oИh+ C,|#222^+CmJeoo/t= ";օ:-OςYYY555gΜ;rHkkAeZq~tpx<:I_>p ±6џÓ -dmI\\\<=՚:&;;eggt校]Ȭ,i@0hIuuuǏAmACQ;P( h0F8=g5˅ vAQJRB~44ޠ*8 A,ST B..]zAt KKKWX|}}wURRtԩ✜蜜+W=~ի6rww߹s>k,8}T*% N޴i۷U*3 !ΝKLL}F^y}VWWGDDddd|'L& ̘1? qFnnnHHh/&$$ B77seffFGG_zԩS|>ڴiǏ/..~TTԙ3g.\H&AP߯T*B!HE% zzL"T*B!(D") | "/ \.`tttڵݻAAAsν{*** Qsss``O?t=.}vTGRQOs}ĉ_ P(@9r$55޽{...8nΝzzzF`07n ST)9VVD"$  $JЛH$;p@hh(Jp8X,O\.@ȇmٲ$ e2*+ U d2TYYyС'""r9FT ??B[MMMN:sLaaq& x\.JA(h> Ɓ d`d2:_\gϞm[[۪U XZFe|ٰa/8P)rJ%Hξzjxx 70DH$H$Bχ`0YYYǎ}6?v d  #a Qm+t@[m޼ +++&&ݻ  ?ݻwx}.]TZZ:qĬ={dffTk޹sAWWm۶]z&22299!!!6l{.oذƍgϞ=uǏ_SSut SSӟ~)%%СC.\xI>cxfddk&uA*fc`B!f.-,, Jhh(裏?ggguΝR3L6VAѣ|̙͛*3G"uTU{{{FFĉw}ĉDDDD"ZMR̺7o677;99ݹs',,lÆ %%%'O ܺu F^^ޝ;wl֭[d2<{lQQ|I{@OOoɡۼyΟ??TWW3gN4lΜ9t:~駟Ə֭gee1L;;;8KP222>\\\L&'M-Wj# ͛73ӧOY@ b e;w_[[[;w^2lff_~L&%%%s80asssvf``Z6m*))|ד޽[VVVYYk׮&\D'O߿O T]\\Ο?=cc㎎G::: B0֯__^^ۻp2 PחJ7nݻwݻwmv5ww#G@Anݺ`0bbbN8QPPp}++^KK˭[8p wM`233{{{=zdaaqUWW{tPq'N@Ҩ۷o,**655]n]TTT``ڵklB @0>>>==d2͛7SN8Ç111666[lIKK366vttNNN6++۷:uÇ~~~ĒXRVWWwvv^tݽBgff0sݼy388L&\n]III}}ŋϞ=kaa -,,*++Lӊo޼ǏVTϟ/**b0 ŋiiiVVVgϞurry󦕕UgggrrR+>B&YQQΞ=KӁohh8gZ}ƍ3g""7nhmmo&''={v``j׮])))B|winn>ydpp0,ښ}||b]V^^~K.T䜜חu+W?~|˖- ?\lپ}<==ϟ?7opׯw %77O?ݻwN>maaq~Çaaa-:vkhh>leeuG7.!!m۶gss7n9rݻB066V* ӧO744ĀpA!J%ZJEFjVUU}W!!!QǃD"3@ w<?~wѢEH$(@hG F"^pb\.hʕ===|H$222JOO'H„rx(333tل_>p8\.y͝?0'NDEET^^^ZZzO? ~ryWW{vvv^^e`` x񢇇ǬYbbbvޭd2O>}iӦ}/P((N:ydYXXչ:uŅGGGwww/tJkax<~6<@?~|qqݻy??I&͚5+44tőSN9sfTT̙3]\\N8QQQ#H͙L~||Gܔd...ǎ755533*޽{7n055ݼy3DcX.\ Hv vvvu>}ŋd2x bccN?eʔwy'##-^xܸq߿O<@ON8!ЌwqqYv-JsAD8vٳgO6-666(((22rΜ9wf0GKHH ? :;;'a-dlll``pJ ӦM400r˖-E^y9s(;wڵ߾v횹QYY֯_9w{I$>,//G;T?Ë/:::fgg?S(+VCY[[s\geeellL&~ @011Z FVťȈBXYYl@`cccddD"dXh_"]~ᅦO\.w``uʔ)S] ̛7~R }Q||۷E"FYxqUUUkk_R`yVD"FTrZ BѲ'NB9Q]EA+X,;ܸq#F{뭷O:啘 Hbbbxx8 ~X,ŧN255}vVKO{zz EGG mmmQR__ooocǎ^~aԩ6EiD.xϊbڪ͵bJJqƽ@n1f͚W9rF;T=n{d  R.xѕNz7Ο?cbb4Ah4\.Yr%ze({䉛˭ijj:yR|OXX*,,ST`r}}}X,L& ۋwTTT@OAL&/ SV}R3Ù B$?sooo&d2j\]]cSN1 PlAYqXdիWy 6$&&644466p߾}W\qwwWssso߾dɒSI&7BBBLꫯqhTjKK PE"_ss3CqqqEEEuuuӧO~~~ )Sp87n,^X(VTTPT//4Vx<ۿQAAiH$҉'j;Csssϟo``._o{xx@Dz*tR2 i bnnBsrrlllBBBN8ĉUD"pӧOo۶ɓ'D"СC _ LIIIKK{wa+UCCC;:: ¦OXPPRo`UUVV;88?>55\V;::^rBƚsr|ɒ%</88X 0qӧO B` ϯ[.I$n@O6}ɒ%555'OuVMM Nx<##}ݼy3((HOOٳ/vrr:ydSSӲeRSS_y*چ{#55$,,رct9믓ƍ{]\]WWmkkkll8o<''䒒?<< Ah"w^KK7|ȑ#"O>d===d2N/Y놆/Rnnn555ϟR EEEϟ6m+bfffaaCgaaoCt"hii?00`oo/cbbT*wssG\FF^{{ŋ[ZZt̙3xԩSmllt: Q___ Օߺuȑ#===-zABBB\\WGGGHHHSS7U*U~~~YYliipqqqeeepԴVVV 陚l2gggA;w\kkG +V;<'N4i{=ww䢢˗ҰaX N5J'9sFT{B6gX555`h4 ?\.*J___##AΣM:^{ ttt=<, ӦMC?S{{A*}NAh;L/ 2l36R~ #Z͑B#i? ͰmSC0T}:~Tj7za 0l3jRb0/F C81! QiG7(H'* kBh3y0Oã^//ɓ'#;@=[ԉCdY1:oDѦMh9x!*ӰQ(Oȧpr?HH|(YA*2[-'H`akAP$hD"(<0(c0`c SQ1.=dcv:jpN|>_7tAS;% ӟR@|KKK0ki =ڌgP0dd=O<LLL5?~| 2!mxhGb3a5pxU+m B&&&)[_9#jX&Ο(ĶA%0ꠧF "#,kB1{v?]4tAX,V*fd TzHnhdC̫M9 S(d_Ғveey u/<dJcI3vU~pQzG#1<Ɠ3/ c$? ~hv 蠃:4ȾR(vuu400 >|Lp R`XpK.b`D"So5R jz``:`%Cj(8zaDU< p8h1 łӍB"o >S?==5橤 ZDˡRpND r[ZZX,X,FjwV'++ yiw)((hjjBۇFMZNS ?dtV===F #HЩ-@f?LA݃󧽽t3[ZZ{w[[[1L__p3Qݭ=G{:HaGtA^,,--]b_+**jkkCBBΝ;WVVv޽輼+W?~֭[<_w^}}q㐧Atz{{͛%3 !ׯ_OMMp~۷gϞb<^^^'0L777 fO`0>c`vss;tН;w r!(]v-//o``… >LKK?~|bb rrr j:˝2e#DOʚ0aǯ^ORPP(P pd2^ hJk!&@&J\K;r B?y榥^~̙3k׮۲eKqqqZZNGE<1JIOO8qP& 9Z@TBKK˽{J$'''Zf!ԼvVr\ dfZ V90 ϧh;wvv۷ի999{tvvbk׮wH$:xuH$Rrr2Ž 6dffb0 ̄a#!rmllP*ZNXLP` p8cǎܹ3..nNNN&)))111??B!@ooΝ;322\]]r˗!F?0۷o?>;;;55|ͽ{sڵz\tAP9Hm"r4 \.0o 44HT._ٳsεkiiȘ2e7cL{x<+qСٳgxc``p1{{ov˖-fT0yq8D3g΃X,Vddw~~>\>sÇP(Ο?7̒LA&gϞ}MRLMM 233|ɓmmmݻ7a„{:tΝ;111O VVVO<˛0až={N8Q___RR)j5Jݱcsrr*++띝o޼9nܸu=z7o.))122~zzzWWΝ; Ϟ= Ael w޸5k֪ӧO8l…?ڵk'LpΝ>//V,9ŴǏI&|g w2,w;;zkҤIǏ?3F"H555n+--&J^re޽eee%%%wލ_˱X5kT*/ b8zСWbrLu>|8''G$~fffFFF?͛_y肂hqݻwdTUU/[lǎC)6mzjUUIMM?~|^^===+**222 N8QVVVA}L&O0FI$;w̝;wɵaaannn'OcX^^^[n+..>}ɓ'+++/.X`N6?qıcܹf,X0a„_=++K"/>o>tPFFD"qss:X:?#X,ptt AƐD" B"=:k,rb' h30^{ ъG&: qvPzٳg ?sP_J&M<0#޾Pxss(cc㰰ܿ_TShXH$++(CCC??ÇmEp¶[655=yDT޻wJ~$ ⤮X޸qD"M4iٲeׯ_ojj W뀨FG}WDw}_]]}iff_ BDKK.11qݺu .Ph/(w%%%xϯ]E$SRR f?ʘP(X,Z&1،ӧO Fzj+++* 'L Ç9N?H$Atzzz?|ʕ+mmmֳgξqƼy8pʕ۷oyxx ܹ|ժUرc<\.鞞w-,,qCBauu5F377߶m[ggB`2G酅aaa%%%n촵}WcbbH$RLL ضm͛7,Xc"j6-wQYYrJqС$__ 榤xyy-^888xʔ) e۷oqFTTɓݻ`Ph4T*KRNWWWP8{3fH$ #BcbbD"э7^{5X\^^4Px<?y$(((6mN?vyTjaaa\\>ǻtR__߻ dӧO3KH$T T++WX,777*z}kkg<2leΝ Fy UtA0d2}.fqgXl6v8J(J. e ¾@ X,UT(%Qow>o``׽c_@ Ӄ3cPѐH$ <]qx*蠃:1bwFC$---ѠB?=sO|n0yih`֮: a=s O~<2#sO~A)hy9aGzⳢo m^48.3) Ńv ! #h7`TaGş(Ah>v&;2ofhuco0OԧVɰϢQ< F[ %XrF1($:cYo dB x--- bX C2\FbAggzdI-'{J+ _6]]] ӅBass3]B2\Ԅf744C E F(d[ԮXNSAQC# zI@uﯯooo4浳 vuuݽ{w>74 z!. Xڠhݻ_aGZlShg8J+JcXC/ $ӎ<|%53&:9Ncc#(̓'Ojﱌ-텰3gܻw===wnnnw^||<iooU 300G'dckl6 l*n:<DK1L?<:d 55mmmo$͛7{eddtww`hKYݞbg^vW  OAD"iiiAgva' :A{ J9|?|RнnpL&C!! 100QmmmPx p\xHҶ6tأl6 H$tpܾ>ȹgϞ=xAQ>`0>.]TUU:a„UVxzzVWWxzz?*###22ǝNlٲ%''55uΜ9,ȑ#&LYz;aXSN644 L&svvMwٸ|}媪7o?ŋIII999NNN|3f̈xbVV8 ZZ rdRb1600Dy@@X,/r F{{ssskkkǍcǎܹsťgϞmii[n]qqqGGG``?~ `0(Jkkk&N|,aP(߹H$" ޽Ν; fuyzzd2FDR;GL&p84fKR{re2H`0|>m},K$h4ȪS__ԩSAAA"H__GT`"zzzk׮pJD"xJT*SRR_T3Զ|> /HmRM`:t`>}3!!W^rRL&5D OKK;|pff92''֭[-Z~}\\q8ݻ|˗/ffflݺ577źOKKJMM=vXff#looW*ЏrNggggee9r:99/~EEŹs:::<<>}tLLF1225gX2 J(J]6m4Dk{!;;>pppptt .h䌌۷o /!Bww7HT- bL&  * 9sLzzzjj*<x<^$Tf dpN PrSh*X[[{qaFTGPDQѣ",,_~{naaɓ^zԩLooo>aÆ}:!!!33sܸq۷oɁ0}]^^^]]]xxx|| 222᜝ǏGFF9rիYYY&LfVV $kkk xw}d2wI O;Ǭ:j5TZ\A\.p 44T. s̱˛:u311wޕH$%%% ,p =zۺu+7Җ+8D"999͜9BϚ5@ DDDL>ѣƍ X,W.ڵk᠆>s̔ccc{{{RiffFRݻ'&NhggА;iҤ}:t\_NR*nnnnnnɽFFFǏ_=r߿)j5Jݺu7ʲ?~䔜#`ݻwҤIVVVԩSl6`|7 믿t: cĉSJ( $%** ::zyyy'NCBB Df]`Pbfffv%K-Zۻe˖&Aݻg``B|xJ:88899I&ɭ@yy>|7 fff6lhoofcXǏ`0?H$rpp|`$''ϋ-BV"/H#O?]l'ܼy'Oꜜ6n܈<=/hll<~ J$??UVUWWWUUl`</,,lڴi655%ɉ׮]{?X "xxx0̬LBuXww_˫E&?y$44ϯ!22rʕ롡555gΜikk[n]DD8V(J2dɒYf͞=ёH$~Wx<ظ9 ȑ#l6Ϝ93"""""B K,rP(~ zzz.HD055?~|EEšCyoo'Μ9344W_ 2e#""fΜwR#Ɍ jjjBBBRRRJKKjuXX333̌MMMyD]]]d2<?cƌ>ՕN_3@"Fi4+VC`~0>|㖖CzÃT*Xζ6DR ²2kk뮮.J$zB"T*0?___ 3acc㊊[[[,KPZd2}}}]RRRZZ}رJ&) VTpx?!!aʔ)P~6 ţG>|RSSrrJhkFiii/_J $SI$ROO֭[WXA$d2YLLҥKq8N?〮@z lx<ZP(@{w}||~G{ @+"e555r\OOJbXcccLtI&[_5ÁہG֭[gΜdD~??*333k-tz[[[WW@A }+ DO6tvvv"p&Mzj`*l|͛7 &fAEEEHHT*}ѣGKKK?~,kjjASSSTTH$...$)((ѣG#""B.766888B2ZYY񚛛'Lbzzz|}}>|XPP@&JJJxڐH$0E"*uAƎ97n277KNN~\]]91k֬܌.777>oUWW\@ :t(99y̙N{zz>x޽{}39>yT*vU(&&&t:ƍ+..{.Į_pɓcbb Ʈ]n߾ky{{߿D"{xx+~vǎKJJ ;wn~~~JJEbcc #""g̘ajj:yd[[Ǐ/[ ǃT>JuvvS(^^^,U*Θ1¦644L>]Ryyy1nRill;w.N/^XlɓL&sҥD"NP_1)JqqMjjjPPŋ}||spf*C"X7oI$CCCߏ|{edd|.'IDATӭNp(>|'N4iROOOnn.JwUUUssɓsrr***0```0{l& B7T*2ybWL0!55H$2Lkkk77E @@RœΝ;7n8WW׼V?#,MP`]Wؔ/\xBtRtŊ>>>o߮<<<Ν;tR-?LJfx<2lgggeeT*`cdd$x|WWW{{;v?~AAA{{۸q㒓{zz<<<CBB`4;;;33vFF[ou]777,meeU\\g3h4ZDDͅ o޼#""4]AA7Lbggw`xǏh4166^r%lI=|ڵkֱϟomm]zH$"AAA}}}[[[+VX36:;;srr\\\Mfnnl2##d`8),,y###q8ܡCbbbƏp))((Xb@ 8uԜ9s,--9bee믻~/^\dݱcnjz-77G`8wCBBLLL>sڵk퐬%11vqq/// 666&&&/uR렃C UzzzA@@ $RCVb|WdtU__g0QX!E,Q6v)pj5ľ eѣ͛7ը/#UggX 522z%zd8,,d)1͗ԧݶ@F H$*--?~<:իWٍ-?$?Rgo2mh_a?$w}?]!X Q%(st|P(iL!Ik؟J#0.~DMi0zл? ja+5CBo!@` ۰~ qH/pFk1Ju!| Jk@S凎?4TFd r@Y:;^t@1Z1ǝblP { #e2Oǘ3 iW`XంHh4h4Nw=u+ERH9]:nu8Qh,>pbPZt A@e`|>BciAD[U$I&$}頃:;A#Fbii*+#&D<rxCCCX\nYű qb M*< Q3AD0@ 0tCyi[b&&&D"9?HeH0?]4tA`m2+2G I,6^gGdR :GG*6G5SkhA#3l; 7hP&OaPp\ V;=_^])I:XçϠC`5OQWUUOBTd2Y]]]ss3JJe6L<bTU*U{{;!b@#L C v(-Á>|с ˭54H&jkk[ZZr`DmmmPG bZ[[pT(FuI}}}Ȩ3 lcFljj>h窪'O@ q,--- ttt@}ill 7n܀- M&JH$jZ._~}Pkv |QS+y2JPʧ WWW%IMM L%AT*Umm-ꠃ:蠃#ax9G\R۷(""ʕ+ׯ_0aBIIի gMMMvvv^^^KKK@@ nyyyll, JR"'O/EEEl6r .deeݼyٙL&]֭[qqq==='N(,,ϟ4iR~~g}fdd`NkhhrJPYvtt4ǣht:]( sssDfI$FJ%'722DWc0[__9\.8|paaaEEEdd/RSSёqܹVoob$$$ܾ}"ƓH$;7yyy몬WTV}ADw -t:544={645ݰa@ iN333BZ|>_,C~V%I__<Jh8@E4ZTI$޿ܭw:P50[[[) :`0ׯ~PHT*D> G-((yfhhhWWWfffNNNoo]@iMGAt&"9oe˖վ>Eߺu+5k֥K _{50Լ1̮]떔diii`` ^+W曯Ed(… T rrrVX?lڴ Acc㯿['OWT*MNNT(j~~~ TW^ ;JC.ٳJN&!*^TT믿2,Xfx+W>`[[D"P߭[BH\nhhꫯ޹s{ݺuc׮]v266] SSiӦ=~877W&]zD"{/I|ƍ===+WVoll9sfdd~pdoo+V̞={gϞqpp@|>R{ׯ뒝t:ٳ[lܸիEEE... .hmme2oJ655 B'' "i&ooNOOϊ'''p85o[ӦM+sϒ˿K77ԕ+W  @p܏!SCCb2QQQx3Ϛ5+**bxVpdV Id@PeVX5k 0 8LP(_}ܹsܐĉ!!!Bf޽7ߔJL&…  ;::N:5<<͛ .D-X !!ԩSF,𹽽}ggɓ'z)VWZl2L1q[[BIMM{7dۣ<<<<==oݺeee5u5k$$$tvv5*!!appp@;vlT*>:H (T:s̤W"7o/_ׯj'~b`Nk. #G'$$ Ν;S__߭[R( OOO///|DFh4N9z!3~d2e2Y__aZ6--ԩS*JVT*xVmoo7 !/IX,CR^+zX BN7xח4J[3L^@P9twh9y۷GFF6m4eB688h2B!B㵶|C"Kooo^^^aa!0(/r]v!|g|||pp/L2%@X$H^jժ'O^zuԩDJȑ#|>ӦMG7o^ppp`` НᄅUVVfddO 4b Àn0*++> ˗a=~񅅅-6mݬY\Çu|HHȉ'X,VAAAHHHKK d9=rH[[۶mۂzꩨ(秥 h_~FmܸՕB ,>}YLr-Zdee3500!!!z~Μ9by޼yk4x / "& 9d2 OHH`Xsqvvd27mDkkky6-Ϟ=+J7m~Q''_|L&e&뛐 G`0 CppX,OIIfXwq>}?ϻ\pyʔ)0cbb4Mdd$1 ~:˵5͡"(22bŋֺAh燿3L %88X&EEE{yyX`2Ҳy sd[EEŋ/fkkP(N/̘1tշnݪL&8;;O6-..nԩ,+'''((رc`￟?~\\0C710 B\4SfNRd2?)OPlllX}`P&vvvd2www8p5(/F諮.3aKTx;Pgoo/"d21c*?)>00E"zرcF H͛7o֬Y NNNjU-[#CK(oI?md/^? xb`m-,6ɱ4lyEo4[ux6y60NckkkFkF#^?~r}`)7ڎKiIC6,|˿=6DK3؉NjXdfine:zKC d2fH$q-c:nɒ%ƍC{I-ȷ˴C;;VM5IP޾>OO!NjG9d* `0wXR*sf6 ;t fY.0vPOr2#ߧk6 N XCT*u:l6[YYtUh]Md2#Axx@WW!Ybn6i43{,vgŠJJxfCT!Fh忖X[9Իv o@ \ߡz@ vn^ˆPef2*D,UT07ƗGʋÑ4Ro @ pttI!:侻H@}pp_ʽ [>PkCa{Hc,hXdw-~r>X^֒-X=ȽmـX_+9'?!޸ Eܫ`8+Kg+ZdJL kOcHxc3R퐻 @#T*MMM ͆aP(ƶR{d͠V!5t?*Ha`@ t!TM >DҞJKMtZ y@q@!4880@ahjjj+l4 B/11Y-{˒F[h=V涶:J *PaXwwwII (`bWWWMh4 mgg'#G'}%&tgmrވh4gZ:PPѥKp76])R9u |'g1rfKo6H$*TaRhnnjA3n. ve2ƌwر̸W^paԩ导 khhikk{ldC Jemmʕ T:jԨׁ`b0gϞKHHf|k-Z$ ۷oϚ5+??^ qܹ666`Bɓ ѠLҒT*^xX7LL&;%''ǯXWҥK }ݏ>!doooL_|{ڴi˖-wZ8c HajH$P%߹sgcc (꯿IIII&^W^]xq@@kP(曝;wVTT3FVCXe DbX/BbbbHHW_}... .lhhhmmZ`AsssQQ`|2áR۶m{Lc—_~`0@׳ghoGe˖ FGG;v^KNN^t)y/KRȃb0UUU'N裏sxl2_ h4\x,00pѢEoްaL DR?r횘HRnjCPM69::d;vh4ZjÆ ,۷osww߻w ZZZ.\oCM6^ ?Skkkllm}}}ee%a׮]3 ,`Xޮ]bqvv6JNNN/޲e F۱cGEEŜ9sRiJJWeeezz+܀?w ➋[83;bXqqq'OY$-ZŅf8pwUkd:ӓ믣1,R/"0 i$/X`+?~׷߿gΜqss:u*Dyxx̟??((H(޼y󩧞0'Ypk~GHk Wx'N={NS(5k,_\վ}}} #-- &r`l۶-""T*u+WvZWWWHHȭ[-APL&7|eQ9zhOO'B?..ѣǎknn >`ŊxtzKPttt<**//]]]O8QVVo߾͛7x>>o^_x9s.]DP\\\d2Y\\܂ T*OHH6mp8]]]&MZn#[fڵk+++Σl,++d gΜ|?8cƌӧ_xqo6ۚ8qCBBBBB|||B4… sA=s ,kهIE?{FNbVӃ<TRRԞPkk`}VeX!!!ֿE;w>s^^^#YZR׮];z!"aҥz!$ E"BBq"88XדH۰z%@%99YRH~-55! u=zժUEDDDFFwww OOOXtyfAA>a2`xrW"<~'___T%D"P(<7߄JGk4m۶Ah%>Soo7n Ξ=;c Mh4ZXXۋ/rcccB b2)2=0|ZH$ @V*Jh4Jd2FZmss3lVVV!:bZggg{n^bB... .;88@ZhT*mmmZFt:___*zȑe˖'D'O޺ukddd@@p6n8}tBQ__/!oBH$DJ rĉ-[ T͵k윝T* @ஸ;ǽvvv?|QQQBBgˍ7fϞ={좢"Dhtvv޽L&+W C\>?88("##a|2a666NNNGU:!99b7(??_*:;;?sSNuvv5k̵k>}fd2^zoܹўg\.X~cX7ntrrb0NZpa\\'OsYYYiZzt:D"@?m4RVFm4Gh0 srrux %88X*f/Z xaVPPJeDDBz7 $6lkw2Դj*{{|BqYH4}5kddd455ڵ !DM6iҤS¾3gp8oǎfĉ ,0a # @#.P(яfVRkpVF sZJa̝CtZdJMMCW3c vPH$b0;R  dΙ3g9D"}6$8q>ӦM`@ prrS[ܧ@ GGG$`uhb mY:ɍ<@e98ƅ-47j5=D«O. 6bx &L&;88`d(du@cqLqWIC0D ~~̀zpuKcpg¿ٙD"AUVA CJ:::hL(Y$Fʕ+ak0f\|$XzOOO~d0NjG9"WBA"#Ɂ* 2j/|KRr_al6rkkGvRzL1r2#f`@n2!Iq b fUTz/ FS(   @!\]]-_Yol6h4(0d uHyjаBZReF:*3|MwxF5q]mbe*͑bHSe`ta}_+TZ_"p=̪ p#o{ W=:<UO ё\ @0  Z6ZCb9Tv! CrC0C\^p w/o a@oCjyYzؐJwXj\0A_0DR[[ RYRRR]] ObPRR0f^_WW' џ#J%%%L\M!$ gSSSfffss3BH(Au8MRWT(p TZSSm0i)Rl62KHH@ Fdjjjt@p*..0#77\(bS^^ jkkՖKׯ?¶={w/Lj!Lf4z ,>/ל~n;88/.>{|+7+`H@o0F#ED~ ryQQQ]] #n( ͻwBٟ}YvvL&S~~~ee={T*U}}K/ah[[[EEŋ;/SRRᡎ-?{;\=))i:o}7BΝKHHطoB^JLLDa6w\y>e2.]g@HgggYYŋuyW_}!TWWk.RSS_ŋ~!Н~HhzzzZ[[M&SCC({yy!d2YSS\.7 /***B;v쨭UWWPc.\׿sssUVV}'O9x+W Ê6l"ˠ .../= *999Vy`I[[[eed2 PZzgFx3U__jBagg'D0W"WTZYY 3FLb1B7LIIT\pڃj+ F+**r9uuu"a׮]0▖DPd2E?>99gwwwOOOUUovIg}^WW7 @C2=zƍIպ͜9?D3gO?$Zĉ/_LXX^uք /_nooSfWW_㑬ABe˖hDEE@988:n===SLYlpQTIII3 $B`E"6mdee/|wwwP(+HsuWWW[[[Є VZٍ7-ZꫯzyyiC޽dk4?VVVBH&W\yՀ>799ß|򉧧… ڲ-Z 3+Wݾ}{Νi]]]ӳ{nU4sLL&f͚޾|7o5j˖-sYr͛;::Z[[#""[ΝrpZ'|f6M">SZ-8p… -[@*QQQd2ޛ4iRuuulllYYo-Jo޼It_|}vWWWHGurrJIIYv/^а}vDR^^;,Y)<<|ɒ%Χ~JR؆[]]}…:thƌ555$)>>^cbblmmښo޼a؜9sdL* ٬.]e*K/̞=~~~YYY˗/7g @!' !NO=T\\hP]b{{{;L^tSJKKŮ>tA񧬤hu!NC/^bYرcnnn ڳgX,L2TJBK,y3B!0ثt~hB\.W |SLQ( ak֬Y|l?)J;;;lvzz]|}} m SVVB[lYbbbOOO@@@VV 3? 2l09K/d?D"hiEE$ۚ6mZss#GT*VE>}vPff|rJ"""^uFfU^^.{=OO~j޽6l|bB`R1jԨիWBx``? /^z=<|zz:0.:;;!QVXA&~d2SRR`֠m0L&BHt:L- {{{!;uT@@T*5 bLJJx_Gs7n9i$X\VV{ﹻ Ξ=;k,uLfDDL&+--}gŪVmnn&Hv<0 V> #㩩gϞQ*FPL&.BH)Tih4&z`߹s^W18]Ãd^{gқL&Jܬh(Nh~ҥK".2e֭[a֭9sBl4...555eeevvv$ 8D* Рdrrrrdd$ǣT*  @oP(ZKyyynn\.]tiYY7l{ٔzjUUUr`0mmm~z.{̙%K?~ԩqqq ,Rd25ɴh4d2yԩZyl6EP3e˖HƁL&g0f6mDRLJpRܺuM[[ѣAhEL&3((֭[Fq4:,,BBBBrssLbG`\}ҤI...[LLO?u3fhZRE"BCCd2drss}6utth**440kk 677ֺlY___*ORu:]XXV HLL'ɰuaݺu̩AC&˝JI|}}/]?uTLVRRvܶ;wbd2}||N:iҤ)SDGG#^r%?<88}v ?/\066P!@0L}}}e RiccsLBP.GGG?rHjgL`;|"qG[nuuuuuu{uRYR%%%uuu駟y!(.oݺE&u:ɓ===G X>qqqt_%> 'H @B`08::Z~xL8L&< sc 9~BxxS_)"q!5qW Q"=Eth _& i~Jx`0@:|`H-Rѝ=/n3^x >[ {Xc"/=nk2mUpUjy p8>q>y`'%H?OlimFѼalnh>y7l~/t0V»۸,M˻h4_ @/߭yzz1ͣ2EiZkkn΃PIPH$&7rJe6l63L**`#Y.[[[?m1mĄKrʌ<6t:&rAk6* j5ha)tGGA6lpuu on6i4e$MċXDX~~/ <=h"e! OhYmSe,_q{9qB8UfxG [|F ʌ|2dvdkk{pÁ͟a:迃!z[ =i @Qr/gĆ~K# `Bw >X^bȵ`ɐ⮮ ?'u`S+x,bYJF];+w [ͳN۰|x|?$iC!@iأ|=Hذ\ HxwXJRCasssZWW!0 +--!\WZZ 999ٵ҈[RKJJ[?Q{ Р4͍yyyWVV4r|>H555nݪC lH)2h),,h4i4p;aUUUggggyy%ejg'555W^ŷd2 _vB9!!oP(555;vq@===7oϑ^{'Oٳ!ۛpmס--- ,(..J{Dh4&$$uww766^voۯ:B7߼x"qK.{/))i x˗C&<0U*JVX,He%kjj$^ljjmmm-**2L2_fUW\qz>ϟ={͛'OT(|Abb'|߲e ^m{{{}}=a.,,TT2L"fsSSSqq1h{.B}o냂zD"T]]]---M|,Z-[r1p^Лoy V+J|> |7DR*0Yd*JA>TQQU__k.@jll}U__vq )ZZZ.\w!>ӢVBǝRe 􉎎^~X,]\\bccI$Ҍ3~Hd0Ə|rKBCC5ףi4ږ-[F#lyߌT[n>X[lՇ~XUUo8p!2 BH5BJ255gVd2K700P&DEE!!p7nܪU[n=쳁w5+Zʂ?V4d2x^xN7|px<^kkCbbb{~*zɠ8P A^ͭ͛&LLP'bŊ7n|w&IP@Ǐ?00"T*uڵK.RoB\.7##cǎJm۶-44H &,^ƍ?ORD>+ZYY幻KRmmm!^(C{W\ CtW^yh4vtt<>>?c]]ݻ/r\coo_PPo0 {j` ݽ{ŋΝ[VVH&  ̙3gϞMRכ`nf3v+V888xxx,_|uuu/^ |"򬬬0 KNNH$/_޿s=;eʔ'&$$[7HNNV*3gΜ>}CDDĨQ"""aT/7**jÆ \.جZテe{bݝ+9 PQQ׫ZPP^WWG D"B!եh222F7n Cgee>(~߫WvPo2n݊aӁގrrr)J&aFsrr/_l >ӣh233A9994>u/_J3f̘1 uuu 00>---==-xl(`!V n2jLf^^o$JM&X, R<W^aqڵk=o8;;gggΝ;wҥ 111jZ$ !p Z#u^o0  Xhۣ(J^^^___ZZJVU( Lt^_YY 3\ʊNCA2`??;vz }||l6NߵkxOVL&hJ"HZÃN=ztٲe1UxTM:u˖-QQQ<D"^zΜ9JX^^@&aP(/"--mҥFV"TѣGh4*D@~LV(ZťDpܥK$''o޼ʕ+=ɓsrrjl_e2ٮ]lllۣY[[wuu]pA$ڵ bR0 c0,9:::uBz2UVV6vXHj͛gΜp~ײ 6xyyږ BZM&7\/{xxL>}SL),,2L&ܹs֭sppxebbb&M=|* |t&i2L&5Lt:}ҤIfy>>>F&;ᤦj}aa! |L@&*:^\\>>ξd2_(Y2dwwwD;::$$$ L2EVYkΝq8///'''X}}+W?~<$}f;7;`08::Z~xL8 9R!;gy ϑEs8uFw2 cJP`!aݲr(0l@yrzD"YZn0,ÚdR</22 Z-d2p X϶kKn\CdGb%o>iZ`[YYEН`P'D顡v  z}  noY0*C V@߭#\+0LiZkk.$IPH$ En|H$Je6Y,},g0 E,˹\o{ar2#7l6tXH6P( h483T*JƣDdL&K/!\]]-[q74 /0$ 6,ctR% ʜ>>_Y EEE<#q=*((xvssSTCVsrrX,7KAYYYww+a4 (7o09555,,D.L&_p!dee o0 vvva_PP`mmge @!PUrMMM{5L111 Fx3233Rɓ'MҲg6TPPPUUo8qbҤI C׃dqqqnn.7@g!xȑE^zU \|y޼y?\nxx8a-Zpp0rqq9|OOٳgÁ2QWWWRRRZZ:aݻ.]Z[[w^2}ڵWvvvFGGRڵk߷oFRx>88(mll***IP(lnn2FPX__:88}v___;;RMWWו+WRRRf͚RԫW!/^+Cۯ]6fxLiӦ!jjj an`0,0LTR(v)hgg':;;e2ID"Q}}=qpp0R$999AJ,P$¬@)JPph4\./++3666|>ãtʔ)Oh$R<}^noowlll8uwwwssc}}F0Cxr^F{ISקh80sov~w}I%$$;fJ$''3gdddd2//w}W&ݺuk2'55F466VVV655?ȑ#.\Xl>iOIIqsskllpႿssɓ')ʵkf̘;H$)S @?F"ywggg79vخyAg}WRԈV{e//c̙3lt::ydXPP0o޼ P p|.'N,//7 111aaaO?4ɜ0aBttӧ'OVBq5www///$@'' &\~v:88WM0!>>ʊfO>`0 1c|w ,;w#G?[nq8>\h4buuuIII$##Ӑd28p`{񩯯 _U*ӧu:۷XͩgɾΝ{srr&L1vبM6޽O>.))9p@RRF5jJ2L,˫&H3gDǛ+W̙3h8BHNN8sLbbbxxxjj=Bk۶m,o1 /_/**3Ň3f;vwwC"|cǎHgN4ԩSǎ_Ԝ9s,--Bttt߿?!!1>>… 7o]\\ZWWꫯ:tή%%%&L&]6((_~ax񢛛/ݝ1s̒0wܰzJѼJ͛s̙>}q! P(  L&^><=N>INOa8h4ܾ}t%6l0~x\4L&SddΝ;lFqMP|~rr޽{ш՝)ʍ7B/"<8駟 _5d2端>}E"B"##! Te7nDEEr׬Y|q٬V!ɔJkvuxÎ ڵkyCVwuueffl޼9$$DT:99mݺ5((Fqܢ"4~g}6))I$j Fd~7B!--mpp2r9s/R*j|HݻwʕaN~饗Bfnݺrʢ".CEBӈ;vXE=ӹꣴðE?LLL ܽ{wll,Lt$iԩ/L&qㆋ믿o0>0 &;w7n\qq׊+L>|\2h̙l޼ysXXXrrrjjV-//YfM``ѣGV^߽{֭[gϞ2jԨ9sM6m޼ycƌ;vۻ: 2BήŋxӦMӧ1 /dkk[VVT*w1}tHTXX믯XbHxM6;]rb-X@"dff+ x #@ {d6[[[;;;Bnnn7o.))ikk+++SR!ЀohhDmmmj^liiAwv!***n:O?t^P B^߰aBjF!w:D" u:BaXq~~ L&S}}}SSSKKKsss___^^Juww~zAAx]d J7n\LLLsssyy@ 5jPBVVVk42sVbwkkkcc@ jN={688DibqKKKHHFݹs'z { ~~~n֭vvv999gΝ;!-[bbccz@{{'"666w`0(ʪ*\%]әLB|j`t&\,J*`0Z&´Zرc׮]T*fm4A<((Q$}7*I$!400R]]k6]]]wA"`rD0FQt:`K$NJVz= acV,X0|\%%% uuueee}}}'Nؾ};h4Jh{"!$Jb1>Ν[RRRYY9qD///N7uŋ/ZJN81**6L6MVD"HXQQQ]]-B---|>ݽ``;w^d B8²2 @࿂sܫjjjL&^dIsssZZ֭[oܸQPPx &嵷 777tVu֐ rgyF8f``@"gPe- {@kjjΝ;d2 ccc#ͮ-++kmmdgϞ0aB@@Ylŋkjj6ngggW^^קT t:/2eX 8qbQQQcc#LcXf[[[ggk׮Z*444---99y=BH"L&DeۛL&XST3̟?h4d蘘[[%K0BƁL&t:b!!!Nrww߰aL5kNF^߲e ȨZzuhhesrrh4رci4 c^^^$)((ϒ݁*SI$R@@Brnnn^^^@bپ@+++GGǧ~LJ9:::::ka͛7]\\&OǍgoooggj4Njoou++^*VVVZ[[{yy'3 "VVVfˋ`X[[燅yyy9;;x>~Μ9&Looo h4W\ XlNIIYn]pp}NN ƎKR'O윐fgΜfF]]]pjkk\EjjjlꚐ /s @'#.P(яi>Y{,S)Eŵn4Bx7`wqb:2jg͚IY&  z5QTr @8ɲ$ ɇGw(p 94  +) !t:5 @8^"p;nn<CڅcXi zoT*5$$5,,l6z4(*B_<0WIsV=÷C˾( &d~ -W8rS D hx'kѣG = F9x )>nzzoxKsKBSCG&u:LqՐ1 ul|Z^#tg>O ~;/|?: 4ʐ2Zm)z(x HJD"ꑗ;D"T* L{fcccoo/fӑCPtww?%x۵Zc5$ˁ.A&ZqX:aI֧`>fF2r26*iZUOCnߋ*=?*?Hhy|#< /`0d/te,r;!!w|9>nCdbfM^!‰4؝l${ٌ; K`Iۈ0t ukl]i24,<͖<"Cβ]8sز umt~=[@ߏm[2-xg{Ē[c2'~l9 -{Ӳ\o0#0ƻ{b0 *++2.fJKK!T*vss#NNNg04 $vU+Uwuut:'''VVFceeeEE={\.H A 5 -((`0\.2,##C(<dJ겷)..6bV^^mʲaX---YYYnnn ϜVCBBc=x`eccpEG}Lr CqqqCC=Niiizѱ.//`0766@ȜwwwdN%|>իUTTdee3?~ dq'X~gDx WaHw P|V@"*++322x O U.R~ѣG9Ʀ⾵t;t'&HB077Ύ`X~w)''Ǐs8۷oX[[>|]&yxxP(Rym̀&;D˃"@P<==>(//xt:H$:}1crssryjjh: :s*AƘgx~m֬Y ロ6mZGG{b""":::8`ee0c 2EEEǏH$œ&MC9HHLL 񶶶Ǐ~ED"э7Ϟ=;o޼>5 ðڥKZ[[QQQNNNW\J[hh(g|>2޽;))iҥ'HGr Cjhh~7z+W~}!]]]T* BSTTpLdrvv!& CWWWUUA#eV97n9s[<ի6664M \|y``F1--mڴi~mSShjzh4766N:!TWWWXXhooO&Y,փ0R bM"d2 y<^wwwMMuWWWgg3aBU&@/SXX1evvZvtttTZXXh2x<^CCCmmw]]]yy)SPa ǮRΞ=kggx<^OOOggg[[;okk SGGjdU޾aw@$i``׮]:ujGGQR}ٳ!=BXXرcǶo~777QfffN˃E_ޘ?ԩS_}T*K}}}l6K$LF&^}Ղ$N믻^xڵkK.]h͛7333]]]x Z]RRrȑB;;ӧO ©S>3@uܹsegg꫋/DlnnnF1%%e׮][n}6z25  @{k*Q:::ܹsرFcll;CP(&Mp၁K1TrB$IӍJ @P֬Y"ɰy0^駟nٲd/ _|񅕕Djhh`|3<cǎ7n„ ?~]8Ͽ~zpppss3dE֯_cǎaj!4mpp޻woZZڹs琅#Yv%Klmmwڥzzz ߺuU*ƍB, !;[nRbkk+d||ZЄ9|0px)0uڵ_Ð(//wV\g5 cƌٲe L@Y.y+Vx%KDDD>3l6GGGoڴf…O=l&Y[[aŋcbbp7no߾=&&kt"4}UV)ʤ$OO]vM0!11C---r t:۶mƏ_VV| &@F38m/J]~}xxxJJJzzlrWuttfўZ8`T*`0ڵkΝs 9s &O>>ӓNpܘ&SOzxxxxx`&Jǎ蘛xb6 daIq^PHkkkN:jԨgz{{$IN>Fi7n 6npGpByL&322f?(aaa7PWW;G>0LPXYYh4oeeekkncc흟akkeee`0ϟf3tSjj۴iZ[[]\\&L"PIDATL&'Mr-h"BQYY@IOǝb&???2A슊F RAAAqqq$((ō7...)55u˖-<o:N{zzzyyt'''6 Ld֭[Y,Vpp͛7ϟ]d;;; 6;99N2eرb!o H"$ Djii:uj``3g–,Y^]]a} @c$w f3J r<::!ڑ aFn4:;;zkew<ԃMњY? \B&Zܹs}}}ݥ @u{ C8ur+ ?`l|\x)?d2NoI8cɄgǸF R.4`n.Q`FP,8>Nj@b<II h4B{!; &BDDDFH/,pie<5p?X-EqYnK? 00*::Bx;2 {\u`0&Mm5 H<;; Aap1ܷxKYK1DT9[֌ak._ o`\ݡL&ӑ#G\R___EE.}X,p8񴵵eeej4ʛ7oꁁݻwgffdBjnoooiiiSS|ڷo`8ydVVdt͛7 ?~>A]]]qqqooC D"QEEEMM믿~An| *++!sƍ7n@R.''G&aF!T: CCCCNNNCCayyy;wp8>>>Z1==]Rcjjjj%%%9v''HؿJ۰ѣDќ?~ʔ)G:::&ݷo_[[M"233sᇌs ~Gmmm0˫@8sJX}![oavرk׮]~ @;aaa+VdzLd2966Z[YYEEE-^ dUV1̂/ST݃Pvrrڶmې,Edɒ 6 ++۷C NNN۷o_r\.J111/s Y`0t."$k׮]nBĨٹ R]|9...<<!tR6Y&555++fܹx{{wuuD"<=x_ׯz7|/pD"9tPGGǦM:;;z\+_|$%t'OD0WPݻ,YiqX,áR/r+W ڶm[FFP(|çO,$zԼ<<5J裏@!cw((HN8QTT?~h|˗;::oѱy朜'OVTT? ==͛7o裏,9mmm "HR/yyyoJ~RiFFƥKۏ=d24O.f3Nhjj:tPgg?ϔV-((޳gOccڵk Pxю_رcNb0?ܲ2sNTYY*d2iZTj6`#FݱcGqq7L&Ӯ]Μ9SYYR__s=3YYYv키G)///))x˗bqKKKWW͛\nVVVRRիWB/O<ёflt;wnٲ%;;= @I=i8-x``@*|8;;111 B_ ZmssJ Fi#B|2N_jBL&Cx+|}َ; u9/0 tuuu,ʕ+?SPH&92yqƁ2l4i[oEњ===$ .iӦGzˠR 78x`~~3g ͚5k.\}v䔗jժZ~zOOOHCSUU=zYRSSb#ǹN"r#G}]L&!h,X000p!\ܹs111x=~7VXOf CLL̺uh4ZWWÄ;PvÆ  7o3af966vڵ=󋋋o޼d2!a/III!!!7n=z4uƌ˖-h4nٶmرc P(I'pxzznܸq偁K. 6m0dܹslf׬YcggaXKKիF=jԨ(OOO^o|饗̙3/88xڴiƍ4iL####"""##_z%X駟f$Dn;v?_P(8NMMdZnݴivرdɒ~>2;w|H$:qUSMMM J @'whڦ&0͛W[[ϼɌzꩧ$IZZZeeiZy[[[IMS]] ě9s(J>_ZZJӽ_^VV6888nܸHSJr偁L&S$uvv>3gΜ;w?ۑ  @SZKCCCgg'ɤh>looo~~=<}ٳB0LcmmmoopAssO?IR"""\]] {9R ?d2 1...**W2ԩSt:]JJ L޸q#  `x'h4Pfgg~oiiJ80BaeeEl/NuwwrÃbly浶vttx{{;;;;;;ّH$IzxxX[[geeϜ9}ҤINNNmwرL&gh4555nnnɤO`688b( h4ɩ,""|d2***mmmX,ĉccc'Nra֭\.W.oܸ0:d2_lmmlUrr2F۲e N }3<󻺺`WCRRRXXآElmm 7mZVV>f̘ɓ'wtt=xţF hqqqDvŅ^t)** aMMM4mӦM翺 @ S1X܅@ƈ~KuFBR@d2]|D"ڵw{t /]D&Z,GG\WEwz @_ ~^///X^DžGVA VXX9*bN0|N" d4סrد~Adž!.ڀWӤ`'k\0\3LhH<n8\W퇡d2g̘'z^:} }OhQ>8ˠ莆#~[Nip7Н1 eտ3M=8O 7*i9; ~;]GlU!w;lJգhBwBu(YBH${7 fA/*᩺#lWQՏ$ =VAypӡ;_m X2<f\2FH[^3qSed }T @`0 }:}w=߬{|?=waxA{]nx6{E0O[q?*!,{gHݧY.`r$cuwfy#S&,{*á*3q"~N' {'1mWKpR;!~PuGB4`Io_/w(M,!\/_Yڌv <}Mn3eNsqqurHVVV^^MkkkFFgBH,bZZZQj0j5HNN^^^ >y_AU0ҒT*juJJ\.wuu5 l6gddx66ð(|rR4>>>;H$3CDhRX^bH ?_χ)))莪 U*G7n755WWWԀpZe <ޞf;?U$)==ܹsx<ލ7jkklooo++k׮h4xok0,55~aҜL`R.]!Hcƌ)...((8ԩS0+~Nsuu0,//͍`@z]%|L&<"PUfn*--׿ӌ{~'!T?$$$ N> w}/J?p1T OwK{zzE"B)55AVegg^zUTJ$W^y%55d2566^v  ____CCP(|f}LS 駊ΣGDC}?}(2yyy%%% ___myyyuwwUTTgΜ1AAA:1)):'':(33333ðb,wvv^rS*a&H***% a ݼy: CKKKzzzuu5a|>]233lJNNNɩ0LܼyܘWSSݙ H$H$㏥R Euu5Lc"""nݺ500T*/]wGGǎ~I*o>D駟  {񢢢3g |'CTWWíQB?}X,h4=z.\ Hjp8p```#  @Cwx,]jggg6m4mlldrtt4 cԨQ .xP_75C!b7ZhѪUT͛a:yŋj| $]Z~`<\*R(UVX2" +))qrrB]|y֬YFBEDD,^,++[|yFFFvv-[x<^NN[[[kk+N?|g/^}o) .}Wd۶mRD"CX O?)O>1ZWW;v}:??ɓ?3ɴ0ŋvH$[n-..>}4tyyy nϙL&aXKK˿/\.!׹sJJJ `.7 ~G}}}&%%իB믿f0l]]]_u[[￟CөT*L.((ݿWW׋/qȑ#G={ᄏpႍMzz?877^lٲʪ*99o=~8FZM&U*FW {ƍd2y֭>>>ſKcc۷o޼ϟ?o<}}}n݊aX^^7|R^^nmmO?eggi4iӦܶ/B̛7oʕՕfzOOϢ"kk-[?H&@F{*U1P(TTJFWWGGG"~_|a0d2Y}}=@Poq׿ pB9<}B$ #V?ݻwCRt'/@UU6oW_A֯j̙@0͓'O޷oBڵkUUUP'\n۶mGNCT*kvСӧO#7 vvvW~g6n܈D...AAAK.h4k֬ksjf)f4U{޻ {I&M؎ n)cL1#B{2ҨL|?֧LKȽw!k˻ߗ)J455 f;p'Nd UVGFF t:h85Amnnm62 7L/J9x~ݛ7ocٛ7otqqYx1ǃ={y<ڵkWXh2LцPݴi?y߮]BBBj`0ݸqhxW²`Y+1ц`pqqygϞ][[y氰0h:N _~e&}ܒA$% | DFlTߗ-[5ٳgϟ?yB~@CWzz: z{{%%%]r+ȈF577(cǎƷ~{˖-FqΝRt߾}d2nݺuܹ %vUPlٲvEQT@[jVլ~P/ ATjkk;gΜ6@u_UUX͛G$kkk% mmm{A~~~[[TW_}u…h O,++kmmmmmj=Dt*C jjjRL&+//cXӟz}uuummmsssvvvAAAssÜ9sZZZrdEEEeeNsppXhH\pٳ{{{߿?44VPPP^^P(\.bqWf 5LR׷@ (J2\QQ711#<<X_|_GB&mܸQ$D\>88nwss+))Y`AeeeJJhokkPeq܌GLBP8?̉ 2H8j5И͇QZ Hٳgt͛7jh, F$<<ѣG===/^X dggwww!+40ц(l{3M&Z󉉉ZRh ,㎎jz… s###mmmݡiiiڻwozzF:NV3 h" zj\~޽ŋtUVhX+󆆆ԉUVr ·RfѢE666͛;w`{{{uu5:yף ɜ3gNyyyppHZZZOOOpp0?S(jVլ?f^N<}dd`HիWWUU[BsǎUUU:N3s熆-\NÅI///"':T*KJJH$;CPP(rsssQp8F`lY(ŋi4Zaa믿noo?44$Z[[t:h={Y,VDDDhh9sjkk \B}?O<<eiQUT$L&O(H$鞞 ~~~B !|ҥK%D"cR>PRHt^Xp|#N swwZd2577l JDLRE"P($!88Ã|6bb1?~ccBp8"JٳgϞ=N,WTTvvv&iΝ666d2S$|'''6-L;DΦhD .**Z~}@@@HHHooࠗTVVVppu령kjj^{5P\__ ŋtsN{{{>8k,???L& Y,ʕ+Ri]]o- wSgjVլ^NE(P R'`-9?d!> )o~gKn6aiA-<ÿ;$(J@`b DcL4f`5YjVڳ4;4RT,@c܌Tc; F (x<o02'@ @"z A ˟--˃۲ %eRar& dE0ph4Ba Fhí9s愄b0C.f 0_c*Uh4NNNb41`X}-.h oh4¿8$ x7 F[r%AEIĂKK #d78 $P}3ǒ;/ o3W떬OH ZIJ[vR@fBC-eY[ Tjo'''qլf5YjVQ3LO8{uݏc2:!,f9ߌry/e:ߛj?4CD`ȁI TM+_5e<.z2cҘXjX^˟s,A/㾵Xe ($0pA0^śѸuLoec(N9fègȲ!AOj4}FCRxE-`-ep'~t7Xm똗7~Ōez|L{||{x9wQ5d-Ǿe[vC&cEx:ib +aˎso`@,I%:m֓.Y=0U`0x)OOOl>KvvvF1))) ^8t3f2lvmmm{{;nG L&sư9#)7n̞= X>999""ja28NMMMGGdxɖ 4C?@CCCFF ho5Y?1?*3sF Hrrrrr2n2 | Õ+W>|COUU;SWWRz{gm@:ܹsJяZccիWI$RCC÷~ xww7|NtXyP|wGGGO:r9 ᣏ>:|0͛\|`xxɓ:O?5{5 gΜFTѣGYYY)))t:],(--NѴegg+?OߟjjjJHH~uL&H$j>?r>||yyyEEE555W^EQSSS,رcW$L&PQpfkkkVVVooϬ ;88#E{{{ ***\r`0x{{DRUU }Ç>DQT*aɢ(/jumm-ĶL&VAx|[[[VVV__T*CyŜw}Ee2YyyyZZN~WZZ:44T\\؈Fg놢dOOOFFFee%---999`R*++޽;66Ojڔ2Ersskkk$ڿ޽{ EUUomm9yd@@@FFBIIIs9NGG͛7 A>#tС+sEƖW~& դRi^^^CCaɹwJOիWp8\NNΣGǥR؇~ {|7o?IOOEoWWTKKTEETss3 XZkk+YYY.\ _5 :FٳgppEѻw޺u A<P({7n rj& Ļw&&&VTTܸqcjj:wuuo@oR={8={U*7|"ąw#_|EGGlj'(ʾ}FJ:{lII t|AnݺֆẺryooGrrr`W:11?< %$$ZFCww2L@$&&AA1@Az}zzzZZJJLL1ЯQUT)))yyy0.{OO;"hdd$##cbb"55A\\SS ;;qqqeee.]4 G5 1?LjVڿǾ{ӦM0=1'''X\\L"h4ڵkᕑ_]3^{-666-SfٻwӌMlfA_^~+WFFfxexxM&JeŃa6m"n2\\\h4Zii3 III+V Df}}}TTƍ .l6ǧ&yPr>VTTrرc]]]o:~`/HjccRJ_~955E$tzAA˗'''aW!Y>/\]]]GGG.yɒ%666;v쨪ruuݾ}{qqȔ.\>Euuu< A8p?yjVJIII.]u떽-F닏l4~IJ+W466VTT$&&fgg8qo@ |gj:..ȑ#iiiRO@8sLggkr7D2::z!"x!Pc˗.]wQtd2^ziPxرw"fMOOɓ';;;?Ӫ*ekkkkk[VVK}ݻwdSN~WJ2..󩩩'''/8z^TTT[[wMP:tgcc@h4:;;ܹݻd2^`F׷hѢŋzzzKD"ozj~~>H$=())XjkkxAE&QT[[ۂ~W^UUU}GD" b߾}ȑ#555/^,//7+++;V{/ȑ#舍ݶm ޽[   yArr;@-%%$z%Kn CKK /PXX(˽@PO(fТɉya?OgϞϏ=z2 YTTTTTvP(@sڵko١C=zbj'|"  Jr/!ҥK<oggG oܸqƍ~[۷O9rD_|yyyUUU/o ӧO|XwA'N|ǖSpg_~lݺA_/`9tлkooXDpuu5Jĉ8СCV Pg;w0jT 7MUU7|4 Q8tB6cǎիW]vxL+**|||֯_be2mmmSSSsϟ`0 `F722rءj|"//nnܸd2}X5gϞm^wۺu+H,["##lbkk;00s!.nذiӦM"h@dܹ6mDW^|yMMMNNHzmܸбP͡!a4dڵk/S( DRܹsD"ikkD";^@$??@ tJe6-[vZ+{yy٭Yuٲe7oެYnπ(j0`m6k֬z?? 6DEEAMI$Ҋ+^xe˖ FRGFFL۹\. 0Dz{ݻtRH1gΜ9sxzzz{{z{{;ZvZѬ, iiiW\!HX'P(mmma˖- ,zWVXm۶C֢(ZSSo x} \lq=zܹǾ=\rrrss = L__Xc1_ܹ F P^^1_i4ӧIJJڶmۚ5k ÁQTRϑCٵ5)#EўɄ/^W_˲yxx@CL_~e$IvvU֮]/^loo`0JKKCCCwIPgϞl2//@jk޳fͲEQ477wǎ6l`CCCǎ{W08ʕ+{{{kjj4o1|yf@Qp^OOO[[oۍ7Z~ wxx-@P(=ƍB֭[T*D7oQQQ-///*z֭7T*lI6jV,*rL&߽{733@ tҲ2Nd&&&6mpz='[[[;::tRhh(455566-[Brg)NV]]]aAP@No޼YCI JmootVzBfN*Je2 P t 8p8aaa**:::&&FP@E{zz$I__D" NJJR(߿ZZRT(:Nh4\dΜ9d2922rժUuhhhXlY``N Y|9D;w.DZlYTTTsssBBR\f JKK)w\\\~~\.fk׮>",X *ʉ`(՜9sΟ? ЬKjZ(輳3::d&''ܹ͛&III}ќ9sBV\\^VV Ȯ]$R4 P*`ސFEEcN[t)Fhڮ 6(澾y_zB[N*&&&Ʋ3gܹs'&&F*2LOOϖA"##tzdddpppeeeqq^ŒJd4 ܞԔF|A~~>ᳲ"X]]P(l6+ ^TJd2YEE$766F?=zT"7\ ¬YF]\\\]]^A gϞVV\p߿T*{ ]UURt:V5JrppT͓d6666 _~…緶]v]r%&&(#zn5Y?f^N<SRlb ZoΝ;}}}asё`DEE,Yl6 5<<F#\Nhmmuqq1Lg9 @~ottͭXR@s8"d2CBBaK+OhhEh4ZEEBx \.wvvjvvvo 7o\x,NzxxlٲBսKԴbŊy!%Y,Hs8@fe2Y{{ի}||8X,r|ҥ>>>nnn Wp8l6+J 8ón݊9sDd***ݽ{7LV(AAA5 J koo 'J󃋋Ȉ@ ӌD"dlkk<==gooﶶ6"6}ŋ$ ,FD7DF3<_ tgggZ uppp8[ZZj;D 9***444**J(ں744[4 oݺ`dhPf ^0_~H$UVVnܸ'44t```xxѣիWC[[[_}U.=44422syzzH$&h"EH$L6k֬̚5k###,^ƢRbɉdVVVY><<<((;** n""""""TX,H$*++sss3www h@Z[[|77785t:}Ν #888===&&fŊ"gvqqJ N޶m3/2t:d24Z9BF9;;;99777/X ((H(D";;;ٳgupKcc;;99555BBÁOXXXdd$\2 ---QQQS*O ,\pRb͚5111uuud2_$x<&1{vR ?D M"`www0|LxyyEDDC(?|788X&1̝;wFGG/[lll,,,wtt[vvv#xf5699SQl˓H$ )П0j<O>55b^g;LfDg?3>< gAqqxMS'iQӻz\(tʋ/hkk/ 7oޔz~Wi[i4cYjV4p,i6RX,řw\iRb$ɀ|;pǂ߲ Xi4Z }keI^Rd2^Kwtt$C,bjb<3j4AbO0p!ڱ,gEB%Ge'k i9e4CfyYC 3Lǃ3-#b1Yv=l?:dYo-53j=[2H01vlpj3Z 3Z2w35Xjp8rTH$lZVwcB3&fD"5_v 2'Ce=%T?`GRu28X 3dš2Vլf5YGd2$ 3 ̏ -Dg<O~2V`B{{\Mfxq?K[bǯ/^6zZ>Xy1%\!l8q ѓD"ҷc3Z zupH$bXcͨeF֝%heb:KCnX c??YkGȴB Pr{+eX~Zv9?X3 9ʒ;K7fC,&3&3h7Wf1aFj\.P(,@7>q[hM` P-9chk,S˺cy|-h4ZFFFNNFsttlnnNMM޽KmmmݻWPP& XeRirr2~h~!Ӭ2(JKJJ\.wuuUIII...!+++77bX,(`a04-999++KRx,@DH&]\\ܹb"@&Abܽ{ÃH$b*4D>EeQ !nC.8iECG:޽{\.nppd޽{^ՊD,>okkO"@ ( ڮ^ 134̟D"L&8p(16662̉!]G,-t8L/,S\]]de:XÒFprrLP&L0LJuȑh`%xMMMnnno\ ؊)))L&ԩS</!!wjjԩS^^^>tqqRCCCn"uP HΝ;@QB$RRRPHݸqchhB%!!!22ȴw} ^}Z(fff1iɌ&tg,ki8 &$$'''㬪!|<4gggg6Azzz^^qqq㮮(ؠ(ZQQ!HBRyJUWW{zzT@`kk;::zMT)Hn߾]ZZbP-**d<@ۙ7oތP(=KA@@+ M(@H$`$&&D"XRSDD ce8q;r,W_9888::GX jc5444::j_d2v<}mFӁ6f5=+1GYefnd`0<|0##Aﻻ7Lxf8裏&''xzz޽{7==HJKK++++++o߾Mӏ9211_'Ovtt  F1##$!}NvΟYxwdd$;;Ç(vvvfggopNjPڮt(߿@VV֣GdQmmmvT*UTKiii  qpڵnW|D"UVVA F裏QΝ$A}\!GGG[[q-裏 _|ARݻWVVXTTdoo{!2>>ݻd2]zΝ;gΜJGP(?>x𠸸4""VΣ~aRR x<^|>>>@®jZ[[Eobٰ̼w2ݻ~33g|}}}p>smTa)(( W666(Z__LT*u:UUU7oEQ=:s̞={z{{>--+..Z֭[jZ洴CAKrr_-J$?'AQ׮]vZ$-;wdwc6zʕ+_d2h4.jG=ܪU d-RA֮] ի𭭭!!!W....,,?SQQKKKQQVrѣGssskkk׿NNN?~N"HD"%`QRAyyy׮]#H~)v$^zHш㽼:;;x<#;v쨫D6m7+Wp`ѣ]]]]O<n0<ѧ;^&r<###//իd2l@\\\{G&ߵ߿ŋn;<0MMM~-NO5MJJʾ}GFF׿2 .]~].5̟?ٳ'O9pFxׯ_x񢗗׷~+J322ůO[2m2Ο?ֶ&.b8Nyyy^^^qq#G&''_z%V{ܹ#GLҫWfeeD8qEEE"h۶meee_|ŵkllld2@hD"`x* i`˖-NѶoU]] ˒DT:gΜ >~A\[l6f1HyyyCC˗*W_W_}ujddf˗/dCfYR=zbk~t:NԜ:udt:J˪k׮555]z@ L=D:Fٳgӧo޼)H._\QQq644|G,KьBiw!weJf˖-yyy&լfGӶ(`0zh_~?#G( DLBor}}}yjq8<e,[@ ő#G{=`ч1 rԩ{ܹs87n cqټp})ʆd2\^^BH;7C+ w~:bp+V=D"qtt>>>>+W b4hfsGG䤟_dddAA\. _7pٳl61 "J i&<_j4__ߵk;vJ"$tww曛7oh2%**jݺut:O3۷]mذA(9s899Ak֬qqqYr%K=zt:(nܸ ;((((e`ccz} %((hܹ"d2l۶M"tvvRT YTTt:òe˖/_Vq8\@@+Xf@ Xr͛7kkk׭[W2Ez͛A' `ݺu>>>"(44Nʕ+n*֯_\XXX]] Lz|}}y<,/|%K|Ȁqwwo2O"H$yu|||x  MWWL^ne2YWWK/fZuuuBpŊs۹s缼bcc`-YbEll\.͝;w/7<<<7n,XNcqvv`>pM`C$?su`_HVA|呑^Сw}78rHaa!Nomm, l.//'ΎNwtt,\ 8ydFFFii^0(R(OOϰ0J6棣Νpjk6k,>. Aj;w0K,dn@ {֬Y<ήl6ׯ_W*[l`kmm)))YtuB͆ o>>>566fccfsrrV^k)f̙r)X,޵k׬Y_xRy}Bakk fjmmhNNNBQh4޽믿b[jV{}@.TUUMNN&7HHHHII)--R*HRYvuui4D4a÷~;((`?jg}v///D HNNN]]]MMJUKГ-,,,,,TT֭srrR###  k֬ioo0j̅KΝ;T{d2Ydd$KR -nNFc2233 R$HuuuYYY>>> 򜜜s¬}ƍ/nPx1`'DFqhhAk!!!* \… 髊⤤LNNd, ޹sih47PTE>h4FV;pRPą j4wwիW @̚5fOMMmݺ`0ܼyСCOt---鍍CCCSSSZVRVX!3(n:^%1 MMM:W\T*===2W5a%jHPhZL+:訓STTBV(RJÀH$7nh4#GRSSr9̉5F1 S(JLJٳgX Wh/^ Hxx8H\b(_^vMV[NTTTh4ww"??wttСCqqqJR@>::zƍPZR\UZZz-700022vᑑT ]`׮]p7`0í[8AۛdnذappJrfwwŋ:99xg.Z(""ڵkgΜű ׮]C$00p``@ pggݻw+**D"r9N $zsaaaZZ]xH$vvvjN`xKV;999:::xtt4((ĉ ,9լf6r* &I(ĥKL7xuttڵӳ 0̰0 vJohtt:]TjZ@EJBhZ//оqo"p H```ww7D,OXXآEh4Zcc^᎚kl †>+,X˫ ÉD"`0JJJ7nZmmm/xkճfBNT*,K,l@*ٞ\.W.Y& Q,;88(+WzzzB˗/x͎"WXT*hooogg'ã 7n܈CTTTVV2]vH;w dr*J uqqY`Nqvv?8;;r>K`aW B:. i4ooo[pp0lr8xQ(Č8;;BP5$lmmV^mgg+@A^^^@\G j0H`~~~ܮt:WTT,YbYچFH$X bˋH$0///@5|>͛٩ܜᾠH$ EoP(~z6M& SggglMwvE "##6m:22266鉢hiiiddmmm{{{_}U6  U:<d4ܺ-Z599144xbVop8;v|EQ tK/DѼΝ>g6  ީ)WW׾>J500g8<iZzؖ!!!QQQcf_{5###6l U*oP(  x ,m ^c0QQQeee۶mdMMM[n,X*( B.R(E"Á戊0^hh(˕H$suvv5kؾ};Fsss0sqq  'ɮJ@ QXTTT{{;H XdZvvvW[[K$_z%.&aa١t:=,,fKe˖y{{H$V!S.+x<\.7** >l6FIZ[[wpPݸqP(Dd彽+W|լfgh?z9urR i'<4)c29ge<%ԭ[^~gKn6%H$_qׯᄟ[[[?<Ե^|Et= ;wݻuOpD"5xg Z; ST 3R74O6t͑hѢUyHp/"Nk6~Vլff28/:s.˃?F9sK(J.k0& 6q{CcO(`*5ibYp  גd2{bT؈=ZU-i[N bNsAK|E%p.bEXFPTd#ƚr4$f&͐CĤ౦L`tp F58fS*T*џ988Bꇪi[L}F_z<32BcǸ-[7MnI?bذ3I9P#% eiN5HV$47 eլ E[~ĝ0m,`)7CX~QKʠjxPAP{e?AX~B`jEQlk\KiA,/>`!^xNS(pcYq'<[Xxl5ݻ ֯JOKV՞`0q7?&49in6I$Ň899KP<s2Ğ*e4ǸPY`U2Y@eh4PYjVլd3LcccO8{׈@:vH:CV&Gő2de6Aqrܿk}|q8ejر_1O+J2aKDhX) BWXc&j ӈ62@AZ^Jd{I$|hOKqdzĤa~񣣣vvvLBRr9DF-{(vBq&%=K b92h0nk_*KPx X:>SCGٞ0?Mp8Z6 9mك@#TFe釢$@ t F1ew@^D"זX>V~l< !,grGլjO9|?LWW׍7 ݿB.555++Bp8Dл5AƼTB=x ;; yܐiV[ILLPTp]߿?++ 䣡T*wED(c uuu---R\\ 7odX=JJJjnn$H@wHR`-ɲ}}}ioB)S6UUU!_|CX5Mrrraa!˥ʕ+EEEIII%;;;##C S۷kjjZ /_;w. BQ!0D"L޷o@,kjjX,\.ʲ9>A04III:3js8(vdz ƩSoݺ%Jzٳg}||jkk߿B$ oEQt:"XUUj2DkAj V]]}@`ggYfŕB[[ۮWT*P/]!,k˦D;edbFGG۷{zzfsvvvZZH7n8996//O* B^S===qqq8.;;;33j~UNMMDd2977733S,hk׮Q('''JuA._\VV=66vű1̱>P(xz wfx5uuu|>S,c=nΘf3+WDGGć5|Ϛ5 F-P[[꺺\\\;Z6틭୲;wD"8K|VլfgeeիWFcdddBBBAA… իWKR#G,\pjjԩSd29$$EѢ?AAA27L&[bLj5NOOOOKKK.}EQS(22L0kܰaXkk+>~e4͙3g(Jpp0ӟ.A[pIDAT̙ckkgmٲݝFUTT8;;wbr|jj>##cɒ%ZsEE֭[ϟ?o2"##Ϝ9O|0h-_rev5???۷owww{zz~WZZ$}O^vmOOOaaaEE@ JII?y$1 R400]pa͚5֭[_p>|311QWW BxGGǾ$"hoo_SSpD"QMM 3 h$ d2y֬YEEEqqq۶mtUUU"믿5kFxT*]`hbcc8 E"Qcc]~~ؘBHII vZttᄏm۶f ˗/ݻwΝMMM׮]sss}vLL_|d2H$Rr@@~vZdrʕ;wXlYFFJ2 < I$PPPKR?___EAmmmzz:˥hBh4 Hloo~ Tà ===gϞݭhX, U*UjjjSSD||F!>j:}bXT>|NTΟ?6;::~K)RT5558fddZ-JJJPmooꂞ. {zzh4Z}}\.oϞ=iu[jVfSSS?:qC[77+W 7 #;;bX,wwe˖ABmmm:K/=-l--[lRtttr!Zjҥ s=rtt|###kҥPD&N dddM6)/ X???A7l + ͮ.P,** 6lx >{Ǐ/--mooh4ډ'ۓΝ;gooC>8l{1 rȑ#\.СC?9sLKKɓ' .^p;;;z֭[n;wnpp0###;;s2@twwk׮>|G,s8啖lxx>((h(644裫WJ$o߾>((CfE<()))VA@>Cggɓ'd2"T? `d˗_yʕAAA%%%A1[2L{{{ooo777OOO}/±cbccaj>bX,x<~d2B`O.x??zڵkTцL&جX"::z||i-}]vmٲ(:::n޼yF/Tj?LNEDEE1̒2~zP痔/&&&zzz2L@#99d2E,5L}p>NsG. () 7nܰݴiڵk)ʁD\.P(BQc!d 5Db}}3P"r޽UV!nkk;00rvvqssjkkD"ѪU,X0<<\XX| :::Ι3bWWW[N755͝;7::ӳڊ@;;;<_RRy%K$߹svzx<^eeeee#""&''CBB-[ZSSSYY`뽷_^r ;;;___;;;2LR7lذrJ+Wxj<rJX,^nLnmm={JuFquuwʕ+Z-F :~լf5Y z=T*utttj D~~~~~\.ߺuT*Yf %c_hϟǏb'O(|Nsu@Ӄ HfffuuuEEBذa\hjÖqqq[n]vbqW^yD"Tڛ7o޼y{Q@协DQuFEEH$8*RL& gh4SSSCCCMMMkoo'JH$666>zJeFFƼyt:W7004mmmAuAx{{ؠk׮I$8@Y'''322H$0-v{BB~;0J2 KRB0S($iҥtRHFd0֭[joܸqoVն466FDD MMMiZJcccxs+V0 t:FA/_VO@vhrssA`0"Ǜ;w\.={BHR)BT*e2YTTŋz}@@~zĉwj^jZ`S*@y-[f2.\ҲzHFpBO V^=wt 6tBtҥ+,ABCCSSSz͛|~ww7@)F^7oɓ'ϟ?3 PHJ₢h\\\GG… LfFFۓP( \.Rׯ_OaAA~,5MvvvaaPxxe$B_x \rQwwWZr JIW4000>>I~ ..^رco^dNp6660;̴ssshZk41eaaa^^tR٬V͛w{ؤEDDTUUA@k\.) [[ۉ\J599}{d2>| 7-V}}}>|H$LsJKKANd2.\P(|}}/^,>|- LRrGY h4B/P*NNNS(QQQ mccccczҥovٲe::}%Kϝ;܈un5Y1ՕH$xDk999 ݻw3Lggg&9|ڋ/Ad0`민 {{25Gnkk #쉉 DBӡ`0-Z4::.]J \\\TV 7o^LL` 6m1 >ѱa6=|OOψ|}}mll`T*L&omm i:.GFFǍF?L qtt ?>Tjbbё899022tɒ%111"޼y&wﶱ ݶm ;w^x7g޼y H$FGGWVV[(:#`c0|>?$$b yzzΞ== Fݻws\X h)$${zzJ$YfDEEٳ]]]QCϚ5+$$Ãfz Vm֬YR+66bA$0X,7776-\]]%䤛gVVP(0L`ƍ ,uww}g[j cHQLTR+?;x SN4=%͛7E"Ν;D"DTm_~:*t%m֖\=***"4 65\H<99>e\!HsKoKlKvg L3jD mllF8 qBrʃcU0Bh/ce64UGhY,,, H$e/B{;bƟ,V՞,`b;a;&I.L_p '>%~0y_ibO?! 3M)~~LANs4P, -/[rx^R?Zhg3o8ˮ ]~aN ~@uYjO4|i ?` P/Ae`j?*+OG|p_6TA_ *c5X2Vլf5d2>y=AyL Z(]oߛ`Ė<^_Zjov{fFiB\Yhc Lbgؖ/nX `acQfBP{E n1WϨ 7ba<Cxkhh`2Zz=@}oyttt\x`@Ν;7jkkoܸfa{]z$T\)===JD;;[nՉb q!Ӭ2(R(8LTW\tw`0l6p,cooGP)`pW^mjjrss튊Jook׮;::NNN;Bz*x);;;!!4H$EI[&悸?ayhRgggd}jL+길|.d2.\0::j]V^^acc)dܹs' ^ #K.xQQQZZZTT6 E d2> ́J2''L 0qB~eap>.؞J&1:LjFFA XL~* &T*8O؜ٹv Έ5\_f2ONNζ=s挫+TT/^+//OMMm/p8Py`0ܸq zbiii\\cX&H$^repp߸qcΜ9/499I$O< R|ĄlNJJ̄ 3LD-c MY--33Ν;DK.x@ @6++QT*oܸA&]699)aTp8RҥKàJPvuu='C"まi``… ~~~F͛~~~SSS, wMIIQuV EEEIL/þ7@P*wD@(++KLL={ C,xcǨT*ϷNϡ —_~fl6vOYSRRmll^Z߲(g999ӗpp8Zxb__(ZjVf0ʩ` H|||qqy}gϞ!:^TT#6>>x###?722`ggnݺ Y'@cWXXXPP/GGG͛d2 ETTԙ3g˱X??{8peAlll>| ӧL_-:~JuMh"r˦;w]pNgڵk999J۠zT:<<֭[FܹsXn(J2, ?#Ѹwޘs qرsι'FBܿK jo߾FS\\H "---)) EQpu^^އ~xiRVsss/^|mAFcBBBBB ]]]оdMMw}o.//GD p۷owtttvv9sX1OMMܼyAD~ƍ?ٝiii(NLLڭyP-))IMM_פ$</ GGG333/]B>66veguuuBBBiiԔ\.WTrAޯ/Άejss3ս{Je___ZZ+++a%o>gΜimmE)))|Wzh4;wn``ɓ{왚NHHhhhx~QQ_| Hsssbbb[[L&sNNNNzzzyyyTTԧ~:11~??Ç€ (={VPtwwK$ޢ"V ? BR)JV >Jرc\..Kccc,((xQbbbKKwA?Л۳gIMM-//kjjj'OH$Oڳg qDDDMMMrrŋr9;vLxhoӳ_*JB[nUWWCΝ;[ZZ?sILLulE7ovvv"NS*p'ܹs?:::`=66v…GBhĎ:s B:uj``h49OaaYKJJ,9{G}wJJJ .\011rIII_}#G$I^^d*))=r3Tf5YҾV,/]fF1??k֬hG,7j2&pf;v S~ ^&>СC XWW뛗wԩ .8ܙ3gV^ e: O{D9:!W_ 755dx&>>^"(gڵ=x@mmmbbN+,,E(3gPT0{׏9ja{/۴i… VZEPACC׼yBBB ˚5kH$RsshH$F߿\Pd.Mh:;;oݺgƖPZ9%B`<LA;wYnyTs46lذlٲ>fGG`@(:OOOНimm-//7L&FMMM[a`ֲ1"DR/^|ԩL& BP2~~~֭H$NjD"6mE:'\K,7o(Gs\rJ&nݺׯ744_s2Ez[[[/_$\|ʕ+aqPQQ҂(PYΎd:;;8::( ^$=ӧcbb@(00_$ X,~h/BTTeee(lE}݊7ntRR-3gX֭[/_n2vM"`. gϞ oϟ n )Nj;wF)**ڸqT*uuuH$Ë/v… ) .h}ns ĉGNNNRRRww7 JzP(tpp8qDvv6Bjz>**ʕ+.\5k\Bidb999#|MIIIr9 4Ν; .LOO4J266l6GDD,Y3??r2fzzzz$!1K2LA-ZDRSSS# ӧϟ=zdpppΜ9qҥKmլl3 EXXXgggMMԔoAA… sss#""bqSSSsslvwwG`䬬,NA4,**\Pdxk֬~xusslii4؄-ɚ===9N~~f[tP(tR턫TVVBXyM;q<X֬,WX<d2= f⽼v{`04VwJ sؔ5GKRU֣u}iZX Pt)IT*$I|(}!ZAjSGmuthes:ESEITTvb?85iQi<==!Q4E~t(R(vӸǻc}1i# 4I3G-*ͺ[֩.蔃}ie.iM&|Ņ1i\x8ȽAr*mEkJ섃0<{8-T, Z`ޱ'yok9;c7̎ 48]T`z`[0ԧ93}x6}Sӛ#[ 8πӳ~uzJ#e}ZrAwLmCt IG>rpǦ#&ndx! ޱSO8Rp!6MwgI>Ʉ3mcnq`0O qu wiُqfȏwmV+m`0F#dOS_xR<4EQQ#0Ld‹kԏezw;=rpU7NK3RNǒ*5L"`0 Z4w_OMp*Ś> SXG4PsjiRr`!h2R1uO7HُghLiU xiv* Ot+;`.L&rwG{6\9www.N3OnlB[P6Ngzg ȧ86#KBt:.K').SGr0>syVsdd  m/?1:d2I$={|ȳ9}ŋe2ӧsssY,L&uÇ}||@?`۷{yy{3$޽{###ޣIg{ ***/z`` **`09sҥK<O,Cyb1Lu3{juDDD^^ީS,Kpp0|l``СC %^^^^YYа~oooH׮] p8n:x HƓ'Oq8=p8PkjOfp9C 4 ÂX>)׮];vXyyF ?y$#I2;;!ܒ6lؠVjkk\re˖-`]|DMOO?x7Lܹsׯ_j6m:qB577 vڥT*m6>>y椤oVڵ;11lSצSN=zsϞ=MMMV\\|\@9vX}}}nn;FFF>Ӭ,\ZZ{4î:k֬Y_|l^~+ޢg^vm@qqqiiEkŲdEG.'|ĺv*,,$0##CTmذa&00PPOrcǎP6ǏX0## HRVVsΆʞ={b湜|ު*Э[zzzvYUUE={)Rcccccc6fOLLOt2=xG-[;vO>iiidnnn\TTt̙3g@NzUU5kN8188X^^/B^p!&&wMHH8{L&_zA`0g"l??4(={^xb\\I~~~RT(-Y|wa*ippʕ+>N/[ իW=IOO_` 5f^^^k֬ p8L&300Br޳Z|>?44ٳ$I ...dlZ%hqh?={ߎFL-HVVV,]4((F1''G.Ia Pfffgg_|?\x7nعs'-7n$IR&͛7ʕ+gϞ ,_}UHr]\\̙sy4k,>iX~힞pB#tON?88xΝ MM_}L&8x`ZZѣGHo֭[ù\n@@w}R.\PRR}K.d>x.Zl޼9<<|Ϟ=[nKrܹC=zmmmWp܀. :|p{{{fffbb/8q;vi˖-qqq>tI]]]ΝS8zÇ'WWYfEDD̞=ÃP%H,Yr̙7xl6s۷o_vmllӳ͛0[1 yk1UQQ陖&ˍFL&۴iS```]]|ڭ[B6T*ۯ]~=N<@);wΟ?ժUhRh~P(vܹ~zpSn:00PWWWRRoذ}}}A|f͚EXo9{ZvXVH8pZX,__ۻwc}Rkb V&"""111>>bAfl uNcX-pښW_L&XillDAZ??d͛7$ <u֭Z Z%11199[PDDDxxp&Z˗/5kիWs8aFpf͚;TTTԀmpp棁aaa|>|bccVڵkϟO$DRBF]p!̺GFFB~%444===>>^.K$D"|||`YVGEFzd!!!|>fq8 xPXt`0 _]0*/_\RRBg 摑}effKR\~ʕ˗/+wy'11Lt$IFEE!YX^…[nUTT_ӧIlkkC={d||W_E555+W\rEPcH$XKJJJKKoݺo>%U(/_>>>EY&55`0l۶MVݻ+**bFD/XԩSmmm,Kӑ$ 3!!!fC˽L&SJJԴiT%ǻyfsqqC%Й3g֮]ͶfX6::g!}СS544tyWWWѣrN bh4"(//oɒ%wž%rO:%-nמŋ8q"33SR{P(0LA$YXXfwwwFW?ĄxJj*.u֋/>lxbIIIee%OLm_>22"ɔJ%K***`WL&+**joojOo…`k0, @ `0vH[~u`G^pgUWW777s\`0ـI$$$ܾ}fGFFVVV 2Z J[[[!=::Q q8>P(Bz^RIRZ]^^nELM:2LOOJJR,X 򊊊hxʕݭE!|>IV5%%'&&&&&/_殮ׯ_ .BP([ZZbx…!\^`,UTT$ϟlBb\J AAACCCGf6% ŪW"(""bhh~Ŋ===!!!3? JUV)RT:|ZZZHpbFGG5MHĤCm2\X,vuuU(J߿ lH0(//W(/nmmmooOMMuuu UTׯ_eX:ϏK.mڴ [p8 +$$dddUWWl77иL tNqqqlUUUnnn|>ѢEڵk|>?))ׯ3 P7d_nť,'((6666$$P(zzzbNWRRV T**s-Agg'9eggT*ohhX,qqq X~…/`0b}9jڹsΐD"y gT}|||zwx㍧[AWgZ]P&zN99;193FWZ0 [>m/?1:d2I$挌 @ HVcΟ?/H??3 LX, ܱco۶2&&f[,:;;86(pss+--=r@\\Z޵kWoooll^?y \T*u,P(xvUTfͺx' CXX|ouuu\. ׯٳ[,L#Gq7nݻdWŸ@t,XVV"IOɼyb@i4>j<_ #z{{ _D"tgϞ^ziV$_رc l6{ѢEJJVmۖ }}}`#cuVRm۶+WnٲERڵkppZ'&_=z֌zwww>zjffsT*UAAÇkkk/^u^B>|h4eddNk2uԜ9sf/T*GGG W\y恁m۶[ɓa^Va0.\Gׇ-\pttWToĉ~۷A3/--E8qVl6Å ??Qo֙3gr͛7!TPPM.X>HLLcO>!K/͜+`0=C;+HŋCTh;6w\$%I^^^@@D"INN\x{=x_T''bbbRRRBSxXlٳ  +WlתUD"c2lѢEpֱ{j SN]t$_|122B6 +++-Z:{??͚5 !$/^ jㅄ444TUU'%%_zh4;w</ׯ3gξ}ZZZrrrΜ9m۶{x`P(H6nbRRR._|…O>l63Yj섄8.h4~AonnB0[>oX@,$٣j[㰆׋ٳg'$$|WPTŋk4wuu8qbժUG`̈́Ν; CLLgxx8D?sIIݻ.]'9$+@>|m˖-111!!!%''O>qDgg']b=a0V~R*jii9tвe|T*7o^@@ɓ'oߞ|ᎎǏx<\~9Nu'O^xkCCCl6A.[ԩSolp87n8>>j__`d6mJ555j322*++an Nd2/^j]WBĶmRRR``0~/锆* ڸqA`aÆ?KQԊ+6nz֭lBQXX |d:zL&H裏,X J_~夤(h425,,lqqq%(((==bܸq:fppp}}=ΐ c766^t믿6 555T*y&B(''㹹aaav111?0<<]6==6͛?P(ԇ2>ぁ贴4BBBB!˝5kj]t)iooOKK{e2 }Y,ViiNj'::OSYYYEEECCŊ FcPPPpp;A[[f7of[z9sH*Hf po`쬩탃 ϗJ'$$˫5))) 1$$dҥ111 / B^^^ezZ~饗9$hd2 Bj BE `~Sl6fZAVI 688STTT*RJjkk#btttCCCf]]]B?&?dggG|>O9G}Gf!tɊ±_0z}www^^]TP(v޽i&___??uֵ Tk׮߼y3##cϞ=$IFGG988344dX<<~xzzNKLL}x~rKJJB###eggkP)c6x QQQ˗/G?w9ٳggd21ÇCs \(===KKK-[VSSm6L&H;vlhh>iiiǏ߹sZv|o@VVV^'Ibڵ<O/X~y^y6lذ`s*ʀ+W.;;jr8r9tٳg]!-7oH$˖-̬ ,,,lnnt,kΝJnFHoNlf2@7oYnJ"`0tuuZ,Џ>ۮ01 `6 ĄNj:Q_sj___[[n -𨬬h4g!Bpl6U*T*陘MHHP =֪jJ[TT`0|~xxxCC^(jҥ]]]E9ݝ$r՚zMhTlvUUOHH 9ѨT*e2YWWWGGA>>>bxܹ[n|f+++q& vZv>V>qF0jjjRb8((hdd155AAAя}} 0>>^__Q˗/WT$>>nwuuGOYYłĤ zzz"(6555\.ett^%I__X, mTaQ]]=22]]]-bXCCCZr֬Y......zFFF;E;z{{uvv®րRQSSc`tttGEE=_6>**fT7nxR7o<@hCJUUU9sB&O?}RRRnܸAX,dp2OOOOOOP+**e2YOOV5bxQ?x"HѰl@CCCf9**J @]?9RAi7<`ށ`+;;;}||~XϐD"y gT}|||zw=5{5k< R>:;(:Z6++K$So?Cl&aXu1 y˜L!__f6 z~~~$IRn&&&}ώį `0:6"d2 $I> .hA?Myhu p zҔ6Z @B;V+hyxZKMfp^%O`0^y8ZvT;;]CQdh4M-\/n.48$L&,bP=N-@]i{$I%OKӇӍLĿ뿚Le˖!bjЃ玝d2a$k=cǑ6Gj'q^vs.k9I;9-8ݼp<1\;`~#@ 3EEE.] F*p/Q ?hwjQ`z?W)Q<ޏM᩿=/1>>~zQr?h{#<nZA/tϷ!xe?ޓW"4q#2Ӽ`0 hDS}P8ȉ @W;EQ...3*sL3*t(3?t H?J f*жSe0 y˜LA:o65czcX,]'lyBO@T>܅J%w}ע('ϱ`] Il6r̖qN1 }}}fHF#rz?0 X|݌KJ~SݔCp-EQZE8hl6@{{ҥKA0M&p Vb8&a(''GT[$ᖖT@($!!4@+'|k4'},gl{3gNjj^f`ϝ;?h7=DX,։'H|뭷 1 y.$7YVVt*|AT@ΥAGw[`JSa.řŇuDۏn#u҂)BvGH){vnjB9G3 `ff삂XH+,Ћus*_hkko~Ϟ=jl6`f鼐!cw iFߎX6}iϣx3uXSO! <`>(rrr׿xЁ;|эW0 `0cgTG`0 `0 zV0 `0oƣ`0 4{᳟%tEXtdate:create2019-02-24T12:58:04-05:00*H %tEXtdate:modify2019-02-24T12:58:04-05:00[tEXtSoftwaregnome-screenshot>IENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-graph-control-left.png000066400000000000000000000066561414302661500305020ustar00rootroot00000000000000PNG  IHDR*}'( zTXtRaw profile type exifxՙYv#=߹^B@.9ww)۲/-[G]LZrkҸ(yO a(y=o X< Gq_y,Ϯ>dOc7|3fb NV.yoUZxCwwW{>]qCǸO_{s.Dd_Ϗ'=붮Ō{sōW3-TzgA&< >~GwȐp 2N0=%<ӅB4Q Yٷ/<=wg1"B{[7gxK "gE@~4{`:n.خ~/ѓV8qܗ;5\ه䳿TDǏ4N.!J'>%mbB&8Elo?J{B RA DbLGcC-]J)'M%r1fQMFMUhVB%\RKR%,\RkmMK7f7hK=s^zmGy(6eI<2l/J+/]e6Xaǝv޺ˮGQ_"s#jxӏ1r,fDL'jb1Q,r Id"FG~K&7",t3nDm(Ȳ|zMaVVP8f(K/}oq}֔SX;Y9{]1)$cu96ݛ!Թ5 9ڸ7 ;9^=pHGlEӶ;b_3^AhQ֪FoΉyjbocs{(s/2ckl|&͚/q?۸m+ ŧ}S[O J":ZgD)DpԴحPX{H?Oga=+;?\m啋iC^_?'>9t3O͞z) ZxF7!ׁXL5,V<W@{R((u\}Bܸ4 yj)!F HBoAt{;hgPIsםwq=)ӰH_tgA'إDHrA f2ݒ̤+\LƎ]˲ f§ٴ*1B1"AS HcuH_H |9uPH!W@.u =_}62GqheYEdGD L) @4R Dy0sKhv%*>rnns .02Oۦ8̈́{,lΨSp8de4l-q1ck Pun- ?E\DXs4lCXd0JֆNjjmrsB6KU(_A[4@>hKI󴟄 iS]81>e,/j׈5:KK7]=B> P> h{aoWqoCYÝpoL8rַ:~0D9 _~6ch`u` ƹS-8 "f% rMС:FLQ+F;j2m֢d%u!kT۞pkLO0e0`H~h&ъH晩È̻h֮zR@=fNznl DȒ|ESP Z-U&a9lnq["Fƒ62jQ'v9.u ENm>lr(*ǫGB{X E j$c9*0+ܒ~BxwoOxԛ0cRF=M֌"!6gԶ׷*~iqh)Jy(߹p'z38SbRysK߯ߢBA-խ.&mا4LR&ﴵcONWN#aȄ2|o(63&`e1i-jpzJ&Yc jZ>=5MPi EmX1ʠ᪱ @-n=eGX2KU4%Ea"enUrB9lm[1Y+)M[=]e䄟 1yAP5 5R]7 {?}afBX !Ҕe%uHj`EUS 쫧F[z`yo'~vyo'~^!R5W>sQyG rh4дb)-+`@&˲*~l<˲Xx|F [ݘL&l[a8X,jia,]vضa5 ~nCJx<0}|Т,txdZ0mQ^F\8⭷oP>4MR!PJUR4Rz)%AB))+p:H8+iH),;h :Ut IENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-graph-control-line.png000066400000000000000000000144261414302661500304710ustar00rootroot00000000000000PNG  IHDR("zTXtRaw profile type exifxڭm#EYBKY\iW]eH"HbZ^kU8w4Z~\oz^lY޷I31,~`m݆e|v~;=_sxfo㟿A'x IƳUK;>ƧhQ>Lulg_d!W]V[Pev۾{ BF EN>r/j6{SN01.v 0ˍJC0H eP#=pb X6}#?qȥA.t7߹}CmD £i@axY-!]HTͩkQgF @TCWZ#5bL J^ρCiPnծ+eB`fZl+5jeVUg݀QQ7r:ۄ[TGCeJ@ vD/|  kkKB{B3ۊ7z@R.u.;8iAZlIFN{! %G$en|]635bש֋D#̰lC"vHdF5ruaĢRO Y(u)):j3O(b#['bGJB#6}ʣFb]kB0;C~ OtyG'>tL&rsF'߲+i4&ɦfV*bKGD pHYs.#.#x?vtIME-@?IDATx{XT PQÅA"W)'TsN!Sh=(yAr@!@*+tbaih ]+'m_R_FDD}K䚚ޟB2NyjzlV-Afy&DԣmXˈ2QA%'""""b-V-,nfb/.zσm?^w Qo4^;0m4TVVN_F:}4\\\XD k|GBQwx_uu5,,,Xǽ\]R_œÐu֩ Rzyy#.-sU/[o˰7tyzmźuַ",, (,,얾'@3gDDDΜ9 4jll#<<>>A )@BkkVQQQ/ ?$~MOBgoW$P^WWs}sqAPRa]'Nj2x ;p t;ogmΝ;sΡ_~OR*b]<;Ꟗ/_ 11SNEtt4 xyyaܹ)))8z(jjj0x`ã<,X{H$J022”)S_CS FqGH Jsw׿C̄Iļ`.ލsFdnNl/؎6BP y,c^Jz .mBX 7y]NH1w cҐIbܶ]_A@MM 0qD4֭[qaڵhll9{,&O7bj+WGaƌ 8~8tR$&&bXf o999hmm#GI qYbܹHIIAebJѣGKK'ڷƍ|իW{nҮZ Xbrss0`HII_~)pႸ-.,wŻ GGGlݺ(((k<رׯW[Lwyǎŋ / ::x::c{v.mNKVE swGT7׫BT44_} }>͜őٜ:XvfZ$.s*J맑Sׇ<,l'Af$ávm~ !>"@߶҂Kb}?%^z%AOOP*(++qssèQ埙իW#""kGEpp0 ;v,Fyv",, sڵk;Ɔ2iT\\\]]1vX;wt^^^pqq-v܉-[@*}[u[[[ܺu m67߄F?Oػwc7c 899A" ,pXh#/M)---χ<<< lmmLO,,,h"qa;.ޞ(..cZQի;PXX|T.u]>H|BBԶIJJBXXYYj_@P H*NB<cEdz~Mco%- T050m*{ȬnG8vvx}=_\go++ف`y08/ޏm+@ooo8qXtiF$$$ŋhllT*ECCjkkm,--M>UUUo,khhCyv#y(J\v 055G‰z[cc#كe˖7zوGdd#y9L"$$'OƍsYY8@q_SS!&&yrw@FFo>3gD@@{9Waffi:Vߘegg#)) !h I< tzd۞2h =r@j{U= /ޏÏ?bE=qW px[xg}෕>?x{XJ|'{ߡE7n"B X'ng[vvxyhP6 =0J @D7]y4eҤI-F޽ׯ_իaff S ^%Iyؼy3lق  0gƄ :-Wgyebb"3f Μ94&99#8y$|||:Mkmm-~=|_ǎÇ~/--ENN>SСC؃'m۞B9scL<R_}vŃM}ƾ,HLL̙3nnnerwKSkjj 8|06R st_swn[ 3ڝMgi߆&D; RH4f rBE]~C~90p5-O?>ןԞ|Y4+WDii)>s+5ӦMî]PRRJ&塢TJRf\r/_Xl߾Bzz:qYk']JuuuHJJBUU@OSSSǏc֬YpuuEhh(`޼yطo:f(J ;;lllPRR"___R wwwHR( رC-MFFF^$Ҥ5]1c`̘1Xr%233!HwG8w煱;2v*0vn;Е>|֝GnUm~3]5f͈ɨoGt-W(q4~=a'°{ b^#D44ab:ͭ͸eDeGuzwǶKP]_v]wcoV+9 ur\-(}@lڴ ׯ<==1hРvyv 0117DEE.]ɓ'6mO?v#ӏ>>{mOO2 ^^^~72"(((@NN1p@>͛(//ǰa0x`m\\\'DEEaɏܧ R)LMMYfa… 7ٳk֬%KAxȑ#Xj`eesssHKKbXt)O$ 0eʔ&Jq x{{:TF㮒/ëo #ؤ@jj*xUQo|T_vv ,Y_~YE=Vrwl*sUuemҥk.ꥶ˳8SJ b̠ed}~PE  Qe2T*$LےJPTd,f븫Coj]b%!"畈z6/}/#""077G~~>F5PT(((9˨ce乪:*^8aGacl tA:Էԣ~#x%K_ˈoCw܁BЊ7"`nn.>eԭ2\lwբ݋cJn\+"xxlonh[ɾ4mmO'd""""""D* """"""bLDDDDDD2d"""""""DDDDDDD  1@&""""""l͚"""""">UE#fIENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-graph-control-minus.png000066400000000000000000000047701414302661500306760ustar00rootroot00000000000000PNG  IHDR*}'(zTXtRaw profile type exifxY[v++g=${*'I_:*@hoGN ‹sI!eRK9J5p:HsS $׃ϟe^}KAƵ^ Ůqz-;k^Kw\8eof=N0,c=!N&>𩮅w[1#S9v <cwk?Br (O]rOr~c->v`mO[tyZRR%\F w%iq/&0fPq@"^ȨѢ l1wqD25MFVc| Ƿ[A F f|g¿\o 9z:ݧ g?1 к0}7Z_N,aV؎~.3oq DНb0pLQGN9n 1Gh9b RHRP˜S9,YsͭpI%Rxj’$K*MYf-*ZX!,R%T K7nZ{깗.]{m}Fy!CG͢[1 VMpfeYg[+ʒ#kŚ38yg b$;g`,& sv(9"GF1r`7ޙӯx_1s'Y7A~ Ӄ5"Vawօ5ZW%뽓"\,UYs0 Yr1l,d87͌ear_0Vtt&C⟴>?sMA|􈆭YK/v@aYmMhl[ {sPL 5{=?Ws5sՄW̹W^1^MxŜ{5sՄW̹W^1^MxݧO5u>Մ}T^SMxݧO5u>Մ_&HY1Q*=@5Jqwe:dZQآ v ~B9J\ BFZM2B~M Af#!e m9riBD9ڨ 2a5ˉ1rNvCblMY&HT M, 18L647/:΀IAfEPMHr,u!) `~GB&VЇ=a,,:M*(Șjr \NCCBG>n>Px!̇͞ٿѕ'6S_< 0<<=vXubyxcQ"iI(2w`C0շ`Z9.Sqs݇Y+^y=džkW*hfAꐨPk}{Z| 1 og07&6hohDžF8N &X# Y۶5bf,bWl7}#3;FSNù4;fhe㻯p,fۢ3a^9r8N׈  5R5ta>32)ͮIIZ6+.ʫxjlȲ&֬YX}f-0=kb{aIqX3N!19gGKpZ,NFg Sxoy %s_0?y5;&Ƚ1=0*C $ʐ{1FYVZlkTUG[D@ySGg qn*qV|@ql| !`TB]8ZmAs9w 1qtÆ{:ڂGP3ǧ`br^LxGG1uńwyQQLxGG1uńwy޷SLxߦO1}>ńm޷SLxߦO12RV(`lf5("a5kq6] ;xiR80; ͐"'D'J\Jj(KH E=[>i@B*4*2\ks Y l4+2ȂZVzIĜd=! e1RvlBgM`PcAl3`RVIZ:D2R;\j3$p4_P72Qg?Ù0uitH Q)ʨMQ`V#,cdE!ljM0258NtQ"-=pƗ,ɰβn yP) ?`=v?5ŭxM@2aKB7,G|)Ծ㸑L,{ZL2 <2/R3+ bYiKzzGɹUXOwA)NRRB5 eUF#ln^3VQ3ln 2}ETt;7lF?Ԝ&8\%/G'Dy c[>6'h 7"T꧝^:"ʨNӀ4ki(q>0mdVHX.=6''Ilw 㻟\ql, WO 3}iQn~r=eɃ\5rH;#Bԍ^q/}~>{z4yMvG؞"ѺE3[@ TM?1v$*ەwp~YMk۬' a#Ζ' *UQ>x(az;IpʬN bvsϋv \sN7So~VN. ۃqK~`aU(#%#xdkgx~RLu*vI؁ WZg*6m;pmpS /ȃ?EMK9սךQ#Ht%*``C/cUMnWiTXQc("DǺPT!;t4 G0c}+2- jp ; b8%s̻5FC.vۅo bs[.m]eLؽ@$$;q-" )-.ɼ|O П]CbKGD pHYs.#.#x?vtIME4IDATH헱0E,^/b|!Lΰ[dX/\0B{Z*03>YkADZgyADh=RJYYkq9gT(x]>r*=~' ?(ifqٶ_d.X)IENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-graph-control-plus.png000066400000000000000000000062631414302661500305250ustar00rootroot00000000000000PNG  IHDR(y  zTXtRaw profile type exifxY ߹,3p|ܓ{ږ) p0Ͽ51I5g+X}u};ysqr;Y |g^qx^WНv] Zwߦk9??nb_̺ḡ_g]nף|Ǿ3wΫl]>| zxED<1euYbS܌zq9Ž+ù-rޕwb4;a\uootmp_w{g#m/3M( 1@-_uqgzt\w6y [C9uf W|ziPOyWX^ lt\0~ɽV88K6{y; ` eg{q?ihN.%?`Buow_˔H!bLďB R4)$TS!ǜrΒF5 %I"UZ %TrRJ-(a*ZkklݸqEkcO=w3H#eѦa3O1:rPZqjXaǝv޲ˮvC#jQs7x7Xyᴜ$ |t .3[\^Sl$E撂3"q9{ /q3) 7rF'3 ?q{l\٨Y>aSvTRq*[ȅb9nڥI֙p뭴i/yԗYq=sS jtHu^+`qquJ{%۶cY]IM6lݾCzY 9xjP3|$~l~w'PID"w!%Ҽ*R! ;ufӎix`ws=AOFE@N 's1<<-۞<]bӇ *V_Tͣugca<# a*ܗOMZ$fBvqv½K;INU62:CX!tc9*]U |p^Q]3DRjzUꘄ8ͯS#} #Au!=1W\HĹ Iu}f/lvs1]iRC騥ex=vÄOFRv{?}Xٔ)G(>a(mrV)%t`9>HEEW?^B*%2(:ݚv_GƠj_jU]"k,I[>ۋY murBNsKt A#$ߗLq.4WBxYt&#VP K h %E1WdKW#5\ R]85_9x,JaOBҩADj0rQDC㫩m:UaZ$r~ 9wt9,{ s1 fsq2UcëV'bKT@~sy/xyXÎpmeJuZ߄ ԘV0k/C5 ?]]<5hPFEwD` EVh~i֗de@#{ڜP*Q灹_1Fp3([ ~-8Q`SS(. c€jژv 9w>_ApjƄ>65:p'9ѹ85j;nLrH_5~PaBAJA;kJˎݐ}P珗YVwd 쪰Z_[kZpy._1d\RNH&͡T1c(9-@r A昿Gi utMlD5Z\p2^Eyd8zCӸ/_+kט_ҠOR^h4IDATHՖ0 % ILu+YCSS:vd12d;), 㗐EZƖ0j^#sv;vD+;0 {VBH1c%󃛊D8KN'E~m[LӴh7kMӄxG.KiZpzx<( B|hqc݆8MSdY+jE}>kI9s,(sRE=M A!Z'y,7 2MIENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-graph-control-plusplus.png000066400000000000000000000077051414302661500314330ustar00rootroot00000000000000PNG  IHDR*}'( zTXtRaw profile type exifxݙYR$=ߵ^B]r4犀~j F9to\OJ\pChR>3=߷c<ZgW!y|vU!)59ӛ`X^/bG~?yΙssvE, ͦnnKYIʺŷ0{タ5eX=';Y9{]1g1ú-!ܚsj1[>wSɜcY mwOb0 [dj}r<t2"نGaЬa:z_8oq?9eOv]8oq?9eOv󘾗q?{󘾗q?{󘾗q?{Sf$ `{' L cݪ {/ٳfPldݫ2_cPdf4%FaY2+t2_n#Lkw)shcS ,sQ;e YĨqj&'ƈ1k]me:3huliyv0/هΰIVmR\SV(}p8~mZ;Xq{SfHJ)\qilO:Q94R:b?)>W/mz08#c~Z*J Z.'VD(]c3Y؞SRj˭1}mib@kt Bs0{.J!U"fcB,Pn#֯/u@FS+<^RWibMJivE{I/ezH)y2b]=皲4ey;vR(ȶDl}6}r&) xHT* #׵"T%v >Wi"ѩJYlqu?(<`3THW)t >4d)h8HY,r¨yجN&\>QO(J3kK!š% f-.7c/2 l%/cWbXBd0FF?KRs0$曺N5KHtN"p&[2RN˲Qќj$@' UA.wk "SOOQ.C=Ʉ<6M7%R 0[ Y3g/2ڡ|xaQĸ r _ >lHaՄerkTRU: ;V&bwMb(A8mf]c)]p \HDyP ~$zSN.+5B6pä\̚JL,Y /İ#"EnQ^jLvAl .6%vfh2Qsvʎ. ;O 4R0$~I#&s[{mh{n%) Z6⭵k,Xݮthk`m$ YGcZG3>*?$O&eAKx~CvZr@ʅb\)!Gz;DBnBz@ȕZ7LeO Rɤ ׊ ۲e?7]51oFth CPOXlgOjvEMRSO=oP쁗Aƈ AJv3ua-CSPl AX]Ghĝ]ĮE1%ڮzMM) QddIXZWH.*r3t;e=ܵa$ Am:gՕo >j)8sK1Ԟ-B=;[;`N &jƅ_Uz|g=.ѣwwy ̧)HlYێPݾ6VRRsQ3QD.]xsߨ.=;%cVk1g/e4fl/<Tv~AYI^ vr"Tu2C4iLmݦ⧆1*:|du|m0lbңZ ƗN"ХX|x}?m/ʆXjPKP N9:g%Z($@>}{̑ "-PZ10@DD!M>Ԑp!$E.? vȍmO;U.mz+}C2U֙Մ#AYȕ[>F vFYS}9-9B*bdQ`JD˜;t2LjtF*@bTd_eGwǹ?ȕ(8*Flż[=aYL $4Aǿ?}m*#PjͨA{":(;DUkB/ dUE(lF԰\J68݁ǹ8}wqy~jqyAqPTL^ѧLSHfJҁ64ZZQ٦+whH;58?;wl`bKGD pHYs.#.#x?vtIME:oriIDATHݕ10E# p % Pq 8%D!{jE+_ɖHc Z"2ʲ$(} Cs.dYcLT.n[F#,N c EQ\K9!٪U+& Z7**X 91/ǯ=Xkk4>ѦB+n&ܗ~\Fkd2֬VuJ/saٰX,p8p:.lnw]:NcO~^3o#iJmG!%q<k4~g\? UJG>=Iޣ|)%ڋ{)u{9J)[HV @"IENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-graph-control-right.png000066400000000000000000000070521414302661500306540ustar00rootroot00000000000000PNG  IHDR)f+ zTXtRaw profile type exifx])Y,!?3;+"nU;r2YD@:9v{c.Rs[lsQu+';) Po<O?'_]:YH~,|^,\} {X5^ί ⳚB +ޮ>?qyu?O_] "l'6#\YB,WJ|:;!A$%6 !6sg}0@C!4$1+)RJ9TSK=s9l5PbI%RjiPcM5Rkm7%,܊k;F;Kwfw}FiQFm |fiYfmv׬iզ}J+*k;λ?Dרɇ}5yf3j ZB$Qxho1-ry"y&ɂb#qO[~g侌K_)rB9g{"{>(Ȳ|zMaYkFYliSfVamVU&.-Rrhmm[(4Ĺ=c}-J֞E{5g8EtTK"ۜ-3o+/֧ ^ ߭P˅ 5pߦY;1H9Kƞ Yna*w d黆ܻGzreȽ{!^ܻGzreȽ{!^ܻGzr䫏"SC[+ɏXYFhZiS\,y؊cGsnxuPgh+k T+q'e\14oIhLjFL:zBf CP~$ъo Ztq xeO@ε.yI hlR3%]/M~" a46KuuUsQw*Usk6q!tF,VXNT*"Jo䆳%)ƕ B:4u?g6we-Jfʢr z>6;Mʎ"7H\v/6w}]S4ip ڭpݣm^^:ViUFc#A[d*xMI_<3,u'Hړ6<xИoFAGO*'?M eDF,h3dоXA_ JtWg0KH6Zgm'L ngZze8(@@kz 2,i[ZYkQ sAXrQ!Ef,7(jIip"ϴO2`*&.MѩvtY qbzlBڶ_4!ln'"h)Bz8U&\bhԨabJ ÙvsHQ4{9f6SkD>`xn?ݽXJfd NPjlC$/56CU,pE^9kͦ\{|PnRgJȵxnJVୖ+=mzL+t*xp-hTvX!dScRD,-[>rRkPIk!XQ-gLފ:$v\tVY*%G@NAZnrȾ{8Bj *)X|B;#WpMS^9fI=a̾ZG{Jz}ѯQEiaN3*Rz\xy4 LEp 5Bdzvn}&Mtt#6Gн{A >{]mA-Wϔ ӊhJ'ЏR,oe : iNkwDɎ(0z HHe,EMz5REt^Kr I!Luo?G𬂩SbKGD pHYs.#.#x?vtIMEbXIDATHՖ@ X6"`,|KVY|  ,Dl,WHIEfe]ܹ~>?#(Rh^B$AmۘIR@v;%}BPV1$^J㹃 @)=m[7B>}u'v)BK!ϐ0 q]nl6#MӷN[ KӉNd2qՊR ˲kVx8F#C~VX<Njjgv_.hfʥ uՊ{wtFx>T|>^lvkk8} `lƅOV=. 4oc;?cW>?xgP;Ncѯ.v{d+ §Pg>=B\`l͉ 91N)( yq{w^Nzvi,0̟г?-yf2e/ii2t@iqߘB(_Li֯<0u~B_j R?Rl8C TI~s<59Xcea!M$] iҋ q mUT֨f̆h:l#[4`::0#blO:m3Xbnu[cCR:cg?Z)i93>Y{Y`YXk6en9N`.4_2w9H aFrtK'w_-oE'ʥ\Խ?9QC‹im–sMwkLk Nk]zT'} ^$v.;3mI7AF.;&z{WN[#;+na; mdq :ψo#'`h '- /746*"=׮.]NNof"'[ttyrZDZK# DYՔjmxκz΢Y" $OT o9$]\ò|V*Z,':ڞ#8[,O{:U?a *T3\LC$2s\c82:||AH{|]g3rף R"yg] /@'|,NMSIpI< u^jg靐s{D9*h>HPhijO #y2*sw.QXRe0B>Bo7$i b 3n$ * u@nvXN@y Z+fFRD(PِaCNہ{` |hH-!ڢT[<鯢vSyTڊ=^-BK)"KKVLf1L G~+{Ϲg~{Gr-@ g(@ !@ B @ &@ xFEPή]D!C&//O@ pp@ gT*@ @ /+z=ddd#ػ׆(!q'gg׮Ux]5a#3_~ٞKtى h$!E޽qvvwwwBCCٴiSd2qsswAB7nAAAj<<<>|8)))tԉ5j HػwU~ݻSfM o>I&rڶm[iZL&۷G"pQ#H]ZgggӶm[\]]QT駟>4ׯ_'::{{{\\\^\_b899QzuvʩS*kHR4=fDO]VVƄ FRFZZ3LX>C57;zTF߾vh9stlz4 lǵkϭWOGNN}JYSC:%{ ?&h5 qێ{1^ }yMBa\/nǶy3sqNP6eDZEq̉Vqfe<Ǚ[O_~呕ERR7ofʔ)Vz뭷HIIѣ(J1 V3l0BCC?sV-))I&۷cʕl۶7nFxx8EEEOޝ~WF^{M;7 ӳeKǎХKqYX <.u G,q4`2`4= ~:C2(U8tXu˧?%y`2oҗWǃC8p:/#mHSîGI$lllppp`ԨQHRRSS-^iҤ /K&L`曄ҴiS,Xŋy뭷v ۛ`.\hIێ; bƌҹsgB/i߾=5k֤Yf1Xׯ_+ ꫯ2j(4h@57n#GX4h]vZj̜9ROD"ATZ[roIj VZTV ???ju;;;;vX<'66R?wW_ L… ɱkرDGGӨQ755TZ|[#FаaCj5SNR{i΁GInԬU+N qcGjwƝt:;V@GfRl ~m rd %tQj6tvm ͛;re̼{w{`G>DyGIƌQqҼcR x]-&~, $ܸ!aj 77##-cPRi>#gРri-CRĸqZ %lf{;mî],[VLz\\L[+m V[NwB*z-̭>xWi_U}@v >}x{ج;v<:^ԩc` {`&[ZrSClbMJ!<oo FTph;4ԩC{~?dPQt11jFTSٰ9!2ҞqT9R^,}}Dݺ-GL|*oXPA8ҭ=.I-?qBƴi*r;bbԴlhБMռJRZhiubEZs6AMW,LYh],}22qn;_O̺zD=ߛ&KS;v &&$6lɓȠv̝;777INN&44'OoٳgYf }p $˷َ?Ί+J%%%Ѵi'i_N&Md21dMk%Gu%00ryqqq ;;;^ JII*͚5#77˗/WZ.իWrnݻ?2Ϸd2U;viV3uj 4mjo_;a߾B+d6[ֶ°f)9xІ IM- ?_BfR R HJ*d׮B[HNN>3Fűcp7Y&'0z HI1{DzeLr>32dܸ!Q#:-skפ_/GJ EF/~RSeP?V㣡aCGbcUH[deѷAߊ'7Tφ "z\a#-'Mk4%-KP)8yGz#ȷlЬgp{|T#{Jap;Lr\>'j:Ԏ#Gl,m:9q^tHI) 33ΝgW庼KE"m]2232r8%^`wy-5gHIL,|76Ч.ll˂9r=Uo?h9RɓקM+Q#&\Ŗ0}g:*$>_ױ|yĢ" 72`@~MѼ6geM5|gl0T7E38h0C91{+jo$Lft!00҇=U'W/ֺ赃A)ۻ3>i<*=>:Qa\]-J̫Corݗy!ZϹ>4\Ґ}m.p[r%xzzˇ~HƍQՌ3B?F믿46m! Ǐ?IDD2  FBB=~#G ;X {n>' M=zc  ׯ_6lٹs'K.k׎k֭,Z.]TB/((Jݽ8~Ǝ… 3,&&&E!?|ڵk>|c{|SZZʔ)S(**0Ot4ib@4ѧl)qq%891Ү]o^FλjUˈ\Ǘ [/(&F>LR)kC=W;p8QJe%$$Tmͭ[ P曥[Hxxhph1c*6KGgtgbRJKaL% Oː!-ؽbōԲqו, s'c͇4vkJV4 ª .`DI\&  J%m1"{xcHۗac;ѵwXA.:z֡PJeuk'HDDj o-eepN\˖z(C~thQz,5)62{y\Z.^ZyQ֣UoCBHNe$'?ٺ-ViJJEs9~-F^xA_rrT8ҵ^WV\iLab{<~%~DF ϰ&H8mKRХ^zF!SQѺvJ}mԌ B?_uG [OkIÛy_}ž :v%${'-vu!H-K Icc>&?>۳gO&NJrҥKxyyY{J=4իW_T>tIII!$$rjOs2}tCz;իWر#mڴaUôi+'00@[ח̾}₋ C aL4Yf=ع)((heGGkt!ٳ|ll,]t^xd-[Fjҥc{F:uDaa!z"$$?ԬY>& V\|ٙgqOObw<k͕ ͛'Rrs%וrysdKk$iOVzO/q;'%:ڞKq6{w{v.aVzFHBd7P Md0iR J%xR>H̙VWǓߊ~O&F|1+3Z{G^\(`u.4* ˗1)kNcG/ݭvvHO.}@-#'GJ b S(ٻ׆bs-,p0R*5O+ϛ +7i6UEUdw[gtPXBرZ/WTvƠ탘6W[Kw_2=6PмV󪷡Kxi>.Y'[r*c'Kf<-=ࣱ~M*vMF - ыpp$2&Rُ7G?̶3MRUf999V>;;R'^^^>m=~ ß? {!rss-:۷ooM\\܃kcL&{E333+ָqcz=4nlB$''jUvw,^=zXűsN\-8 YYYVp +Jx\~g5\ Y3ÝI\*ZٱÖO>QeK1;8; Fj6qHŞٳo3{_ %2Ҟ.]ʘ:Z(<)d*E"1c>6m͕Vn/Ӻ??}32)Sq_.qcGbce ٗNuYsj /?8a0a 7㘫,k[FjCm{]p:ɀLbn)RhڰJi7#)-E \Wh9wΖa:u=[q|3gdl^ΤRciU^tw'O[UKEa=M2U9 x]e8!cnaaٞDz@mk#艗Ƌ/Ulc8lي몂E<r r^vA6ֺm }5TMG~rg8u1[k#FA~_9s`Μ9 \Mn޼͛7-̺uؼy3:^ϩS駟u/cǎe޼yܹ///Z-Vs:V3gJϞ=6mZVk%,F#ZwNVVǏύZ{0ĉ瓙ɠAppp ,, m۶}v\իWYd k֬SN4dzsN gرܸqLfΜoaӦMDEExb:ud]o>,~W Vڽ{rbbbʽ*sqzMHHd[+7):ũ>IhLԭkn/ii2\ryٽ{:u*J0ޓ￷9R:u'"qJj͟bL41 X@Ng$,ZÈH_J(}/J9qBFA'd lx%7cG=FTh̟/[N7,֜Zø8s %2oe2T֞Zh>0,Rk9y$3~+`+ #|#JO=9{ؒ VMyzo '  (,;qՄ U0sO^ձq-?`l&_?Qʶmr֯әz8`ciFh[\΍?}? Te,9Iؼ$4U=?k2+O^ DJ}2K6gl, ̺ul،ΠCos)~l b[6֧GgQ/Ezrg3/}"]sAgБq+9Gc9pLj_vrp SF<=ǟ'rQJ)!v_,s 4ǎqw'PZlO7nĆ HLLߟ(z;D5hЀ>}7w&((kײh"cȑܺuq%''W_=vZ-3gŋ4hJJʛR,{QT}wK,… [«T*f̘acСT*f͚ERR* vږ֝777˧URSSڵ+nnnnݚB-oFƏ/~~~|| 6̒%Kp!+V///ZhAΝ^z0/'jHN,XcGIJ=Zӕٙغsd4o=?Q+W*tIʜ9 jrx_V*oԫqcG._PlHHRA׮W% d({ ^]^47Ťqsg{:v3~|I]v|C߭}1 n_z K. >ڗ6mnVa$tO`athӶN*NġM_y>#@Unos.=QoRܹ%gn['*7-w<V.b5rdz{iʒ@J0oOsoS{jw$CǓ9;laH/HMO4mЗ×nNHe v[ˢE~B?F&lc5fu,8߅4Z҈$F|o‰ =6"6F+;wfd{{+WCOO@5iݻGWWpL&˗) µk(!`vv7n Yn߾Mgg'Hl6˕+Wd2 EP(87nܠT*O^ʕ+loo388nܸAZrիWftt!d{ORwazzzN?oM{{{ Bi.]ܻw;w \rt]r˗f``]xt*  AZegg|?S;7ol vffo-oj|;yH)y~ 7h4-gkk MZRL&׾FR_:Fwկ~|>8|k_ciiwy_~9o__R(~P(ضL_4MfggWsssd2~_+.|k_cyyϿW4h@XZo9qX[[_:333dY}]H$ ,ڵk],[  o|w-nBP_F,\o\|zΝ;wk ‡|[en޼__aY}\e~.RJl?1kkkڛy/e mkbHThH&yko}5z-^z%fa8v#q"O<.\h5<{,?N>ܹsr9.^ȅ Zp86L۶z*'?HӭG"d۶S###\p!߿O*8CGG_q7Bn޼ɑ#G?3lfqqw_ B{'Hx8}t >BP(/@(_+_ y?zzzp]P(ė%/M>gpp_|V |2a0118\eccGH$B2$Tx/R|>ORW_Rittt011R 4+_ /"7oޤX,opUK_??h5;!˼|+_io^zSO?_2nu]@۶HɟٟM|O>IRg?^6B\E8eH$A^' "0 L]BP(#ŋ/mz-2 {_g6?OZe{d? KϣiO?4_Z_`&bSBN9qO<?fBP( W@zƶm~O<ꫯrA2tIſ?}{$IOO ˭>2a/~y.^H>ɓ|{ò,&&&?C>L\  p]~x<LJ۠8pu)dY4z98qq!ϓdH&T*0lk׮133C"h{pܹÍ7DQ߿O>V|( >eq LOOs}ݻm$IrDJB,SgϞeff[(۷w[ B{믿}}Y(Jf$V_{6rvVWW}6wmK!D E qFGG9s _9rg} YYY _CCC\~A_|gB355$P .裏s=_~JB>ɓ۷K.Q>ɓ'rܼyO~8qw_ B{eY\tB@"`ppW_}\.G.crr7oR.Buy[$< .\~h4K/,?8?0w孷¶m~P(ĝ;w7dssR(J7|FA /pY^^3 筷bmmB(ikQשj;v )Z B{J^w4MZG_Q622µkװmu+j5 ='8w===|$/ /ÇywsLΟ?a{>|g})ܹC<K_ꫯ277O BP( BP(KYO BP-hmۿ( B[p#G?CJo 3==?8( B-dY@kBP(>ض׿uz!yA/|_BP(qXYYQZP(0i[oQB BP( BP( Nt!DkgP( BP( c u߹sp8ÇP( B񷰰@R̙3( B[p]K.199Igg'LAW( BP( B.Jl6Π+ BP( BQ@m BP( B6 BP( BP|PtBP( BP(> BP( BP(]P( BP(jP( BP( GAW( BP( #ڠ+ BP( B@m BP( B6 BP( BP|PtBP( BP(>7_ w/8,Ͼ[:?[a/ =Ev[& ۿcԧO`q|9V9|\L~43OsiY۾@ʌ<#"G\+@l4?=^c %4!.OfC)!f'^~6߶~@=_浃1z@z1c8GljsrVX go;~z[HR}8aX73Gxs0n#VdPK,fq_m PrWKOf>tc23dd772 t.?6I@C /t6=݇5޷9TXSg>0"Xٜb@.Oпf"3 ۬Z|:y #Bo=ˡ*FMV8gj_(wN9x7&٩Z ^5sa*r7OM&X 1)H8C-0]{ǻya.>cHäk|ُ{C,?a3XbB fDn>o0#] zor֒S=#P97´ SX>Α+&7\œA^??ġ.SccBf}k`t6{rG± @7n5ٟrn‘,[S>qvn#9UxͰ2E#KzYwK\pr%G4S>ONs4b9G <=ܜ r4z|8W/xnz_ƣr36չɁx^1Sd3)sI{מu+p}u`{3aD:{ҜIn}.,Y-!xsۼ|GsEHWy~rvu~Mcu:>Fd=Fj).ə%~y0G;<oĹ2p'X㬌1YJKo"v{Ȇ"2g/yb*B]bgkoFz(e'oѽVE&8Sa=Dح#'y^>nO!ƪ 䡷 2@['kSjV#Ct5Q:IC Cl}|6qY$xo͆jo"[f<ưئ7>f*|e8ӑI]ag>c/`9Df,ϳ~kU~iq#?p)ʝOމ/Ru/!=`q"(H6F9_Á[!|:q^}P;PQ#GGhLeܯKdnNJ<=7XHڃDaj/sow6.Kd*37pvHt?$}C3Xm bކ0P[:C!z/q>8% <͒dhYbW>@51e֟L3}w^~q OSHtDom=a#vqj7 /?A܎ ;)V;U3^D'(27ŅZ:3l爊"|nIMe" @_6TC_G!)}[lI6g`x~'-$ж[shG0鿡=-qΜ4so)}Nj]Q InwNS`Ux{\;Ž .|lݸI~@u(Nl9Ù4zozSuWaĎ29}uu +O!4͹Ο%y&:9~?#3J;)6ؘED_Uꬒ\8px f1~#<7!v) ~fkvu D:8'o`?8h9'R<]} }^ _jpīsTS#L2מfa i*^/N=6N>Gf/ݻ{$#9Ve4Ai#s<~ڹOaJLR?=b|N3Sx}h١e6}&XocG2K\8wS(u8=`x.11jGL<8=™G;m+Y?0}'KOR?./7?dK>3{iLccb7T_ @~}L.m S7y7qTN'xM~8Vᙁ_ҿQ`][ (%yE`%; _G#Laԗ{ 1,vɝAu٤oFq/~/?0m[H:`tctħюPo?F5O\  ?{g~#Ll ?op󧟤!lէh7j6 UN}N,]{W'_g %>hukዼ ]V 'qCi/<ʼnLgyxyda'^^c<=q{"I\6 ܸëFK+wwml] Ν:9xG9Jt`k3={"p` 7|]mrUn M,CBצq #s|09կƁ_'ps ]Cwv`ƨ׾O׻07r:o(b} 8z7Oc.lQo~z9~sv6:yfv8oRqqcqZ?B3tod|o^Rp/Os6}ێpf= r UGbW$TgVRL4G` 85zz\ ʩ{or!~b36{Wuo <9OO9x'O1~S+9s3Ln\(3a-.ҕqg,oي/Lrn%s<$sܘcD׹9A v->7,hb"=w}}ߡ2s  ڞq'~ #]%:g,4۵qN ^Gx%LGOrq, L>un!:ˇxs♷>X9ohG_wH~:gzt3%6¥H'2| =ş2R3?y~=QG/L}aQT,FW:y?p޻HIrœ1GZ; Sl_UX`7\YF&wO̽᜛%6ց>"G_[fqcTp2ALL~Tg7iz?|#7k~oFHZ+?ňd Ms=+CmCD~x㹷'8/}ϑwtӰq9=G~vdqye,&fo5r0rqSr435xYW}~(4Cw61{udO33Ϩ_pAdX?Γ_[O31]sGoyAp_c[Pq:wfoݯ?JLb 8tk+Op{HqǓIU&Ɲ 7Jxc79`JW_=Ez~q2ЪΥ*ֱ_q[f\#s 풟t0:)&_c/ݢ .=6LW[Dy,!yWbQCܤS̳v?Q}*}>J56F37Z}g.S1x9FxY[=?`&`̷F驗rD.Wet;6{,bߌa&qFQgN'jc|]L7W?GۣKDߧ5Iv$CUVum;C8Pëd4fi)νlק}:S$Q1zb2%8{ǥ>~ʽc\4άҗi;??\$EwBBA/t?ciM?#3!QzC/T?A+.O/ӓ9+\8>Gcܜ?qY7_矤_L|X! Xw|?>'0aQc_Z7:5wM{\sh>o6{ oH3ͩpg&zo;\dt~;÷/5]>dv-~jg?l@:lm _/-"DK&YI\4͋)3V^\f r7vhDZ͹^+Izz Mw@3.ZFybnL3ZыzF4}أ~h: 4/G! o[ ?Gw K9k{? ᭃϳqьK<\禞4i͵}];bOkyJwĞ'5Ǣ9nk-o=q^4woNr n;9 _F{֦&blI 6++a,*dž4mha{k.-u5IᏣuA_vkߋfP]\)ϦOp={+qX"=Yin @svڲ8=6mdov}bw̭P}_HD3.:HZzӜUSZ׏R:<ֿNkt5սZ*pD+>6mef&t"ZwLf%wס9{}nzSa=oKZTcb/{t7%W.Mף=At;5uShMkS4u{،k$^ڴ݄\ֱ]#mz:7Mܚ܍MZ]#47fw[ |7𡾥DqF,h.=E1=|{{ ܠ1I+_4h<l/B5nZ;lXUĐQLk uc8?<Ϻ#;`'}\c,Qaѥ̰Cw8_"oqc.]{wI8UY`a}?̶~0cN15r_MT#R7i$ݜkܣZ$:/208.ZsxQrn7aHۦm2F:|NFSo_*c,l?A\M1-mHG gj1vBo&2Lcgn@}{{p9[X&'ٌ u%9Ia469"gi/8,2qd"ؕ*a42ngZc;Cl`T+Բd{wL3ByÇY)`8CE†Ch2 LTkm@_tuBMìO S߉fHۦjofqݴ7j #zK 7lm'gnVcsppEOpob9ZaveP"apIPos8C(d(Q:y8VO=2Xe%Ir?K>c Lv"] R%Z\vm B3 2P!ڝPw1M% UnӵTu)24 p2FV vՈ,S?zx.#17 d8M{F':ODdS +m&#b׈#XhCtp3] A:9B;)C@ez#LWX" 3Wv>huj 8SɍEV2gw;6w{ѧH> vF'=磜-+TBb%3yiK%bnFreR+ ҿ [dh&[]' A)w\# Ҙ=`]4ct$V2fH>F_nɚ}HSp*z%x@_t?Et s@%DO;G^6,bow~1gǘf a9Khþyj_zq?Ai*YMurdbǪ+8ggI6FoR:EϤWL3cاqAcbgV{zRW+O1`wUvQE:e'^qD\ 9:)L8[cA4cl8hK#zHVCܙ"v;Ck+y)%Hnbr" J:؈DQ/֖ uIzDR0@u-`.L_|^'C-a/ mgj*֖ ?"St1t=[I-@b8ަwthccDWIDNcaB^!PI)46fq5?ߨ"].J<);g+w&;rC,w>z|4@nBlm0hX!J].}< z-=$c&W¡E7(lC?B|<]8,QD_)H-]`ݞ`Ma^:hBKԂ"I>rGmuR۱O.h<\u4$8uKF} }G5:vh0Z{M[x5*V[M ׁUs0kwQp]xO~':>Hx*FJ6H& <\9 5z*U}f=J1#kA#V3ptDΉ 3#vRHFH59Fi(9,VtYc?&GjL`i~Z­h6-nJ]E \:XQ% _5/q5tl0D~#TFy+\ Ŗ&zw#Q[=c`eJg:JFaX9pquDNe`&1X0xds7APG8pތ^ B.HhLըhAegيs([ݡ $lʇh̆Гrq)&B~pIÜiҷbgHgFx{;G2IL?pclt{O6>L{8>i.ޠ>P;.n?H-MCJY%L;ci_ Qä:2hgKr2E+JWzpa'^՛wd{go0;qZl`]kaVilF mt04zZ@g9|S ڼ9RqqIǎl$.'"L&s$ΒiE:tF!Ff0 djC,=g`;(`(m7>–FX8kRK";,}h97}g̱w* FM`v bq?]}8].#H@1;>mAMR롖%9aƁc$C Jt4d֏;< 3SUdgxZ?IهU%4I.BVlnM\b?ʑh(20$XqҢ}wi!vܦkNwu:AnH5nG~8șAˢ\gퟂ}ob~6rř>B;_!Cm_LnY`}8;TzMzR2V*v#W,7m1 tT vP_8@Z*h9e!zᖢl)/pN9?L=֠R6$ 1{ >˰ t;y8'6\3@9;B:v#)NSvh'h#Sdlb&Iyp.P>pdkm?!(H;zP>/F-E"Ži:;gp}A]A*eVk=xM2}P.Z:Gxpl8J,ݝE'h'% CLw1qTmi 1%$&שzk.WQ~|S%?Q`0Eo0FRq@,>tb ab t]zt>rl@tmclk#̓:FwxhH<>Ar Pz\q`4aoQjdVNnWH0qjnxăiءhuJFh2ZC<dpC`GLڶ?&c;m,sIK3h\t[lG؂bAs\:2A{}26)h d-1 LMֳI=(%EaWԣ.>S w>Y~PE XӠR!ou}duipMTMce6t)jgV1GȖ=}~DNy8F@>\az@MPseOUq"&z`&C]\Gc68֗bs6d'mmISӹ%M(e[L ٻF(vcls%| `r<-Bn$Z#06GI1ԱvƵ6ڱq'쿀6)ڠ?~ks~Ǟ2'/mpj+JK4a%"{KܛfIW=F~I8fiEK䞲fA;vKxffip]/6q\/!r{2Y.qp~{JRxmk6yO%bepeMye V*?ʡ52fIWfxCцV9f}+ڭKWe#S .ЬUM=B9_+{OS+ v˄vKy[bf׬vrsVJN-lK~H7,Axkܬ+m~-mpJJ\)wmWcM;lEM7^T.lxf $nӏM;}v+ ?N)6}ĞBuvs[^bOmi] aWGdl]ZGU/yw jo=pvO5$cMص!וHt["]+y$ BP( BP(~`𿻱Ďy/ 7i7;hB 8/.44}WmD߸An!bhxkoBHGCC yƛLs|Rh8xCz>!J4}!Ѥ7gZT/mk/Rhғ qK {MW4%mM5gJ.%/;wǖu[͏kMٵ?9~MusM?ߦ][T?i MD+[s6=qAkWZݖƈ|Kx#w ~>4];tq׆Zׅ]_%>4V>!hw.Z_!iYֲњ2î͜I=/Xo7h |Z9dmʩ5/ԦZcդch8ۆ+l+bosVIp諯S5أ=&E=>DZ-]{bi3w^ٷbɁ[uEryhs=A{ơsV[{5ٌvح)_i; )[ՇhqM߲wi'ɽyq6T~|!ګeviw_۷ܷd7&ۍ_ N"D˳Ns{r˦l˖lz)vNKvZ+^ͮ_nGt+lM;J?f Xt޽\_{%ZSWgP4=>wm95_Oդ=n>T$3נaVX5RBF 9ʚnڤ 1 fV|)I^3f0-f6j`J6$bY(;"WIj)zfhq\l T[Z \GI9X'SE),&R4%r"¼f<ws02v!Mf)A~#Z!r[i3ANĆLf!IvRJgX SdXSvw,\-9JY Hgt6VRD L`%Je>)sbb<ŦfbC$w;,W$t~Z[PaYk$nXm̸3h[$+Ӕ\aNN?b%R&Vbq8vl@Wȹ :B m y!2J6Vemᤗж h`'kW+ۦ\Qߥ//dE UFBf:tRbllD#Av|jjiQEiRpIKZ`ɓLejirv|0bB5`m˔#4B kX,֒N\0˱ԖY$+5$+1,㰝uVtʚ\MmU6ȳ"N6օ]f.`-W"[ԷTY)Xbo퐪uK*Y+uq [R63T+IDIت,./aUS++ tS&XY&!kmΑ*p'W%Tl$YssU*, 7xhUc9T IKd6w*=ҥ(<%Jq'PHIVs;T,ijk!BiLSIIrFmmBRhd-A9gVbޭPgyLAp+Fq\zR/ILX cT n-j<5;] A9V#7MlAy6OJ2Q!^LmҶPc+d6wfYX˳@dF2[ L\[gv9LN)#V ccteU7NBPL8_N>v}F$ȝ\m}4dUb%4[',WlUfh8q;6 V d16׫j*۹se,ƶL'Yic.WDY,F9BD!R0I[E)h2E,j颋Ye-h1W3biJ-rj`Nê&Z)@`]$onRrD;g4\S܉ӅeUkEkdiUbqFlP*lSpu:4E]4$T Y/RDrsث[OklT@A6 Ut#&HĴYVsdb[hyx1C_(VyF8Cj4krĬ8٭E$SXV:Tsܳ N6CzN6^`J:2;y6ʛ$*B96J81:ہU1:*e*<:4a1Z^-9$]a5W8.qjw1{,sw-\u{7Bǔ&AZ!CFЩUp͒{2k긎-N),L7@PФ}`iԥ#+]44iHBGáyAG5[K&9GI5\U-hMD$dRÔz뜙#AAC0,ct4iRsíGy~X\"]ݵjU,#jA QGZ "\KFkhTe54y  ,l)Y޿Ғ8 ڸhj -cf[i!qw4İѥe!` aI tAlmHhZB(A\G KF EC޹hTϘLn 麘Dyb-BU׻H :t!?B`;ח+Dw\L;?l]غKy qpעi8&+hmcK mxz+k{)K*y!ݵ4 8hXX9NCHiy)u B3"k:᳃p5I] u vF\\;[I@-$ V<نw>Rj.!ҽ*HKb]y0}h.R4i hސ4 -z5J%f4V:8WDgٍ ifs.hwZ:Zװ0S m,!, ͨaS3tUq G%SCz]Pu`iB 3b8M"l44 C|t\l3M[jHS  GG&FÆQm=ĵtt"p%% ;-эX:Z{̏iu А SDzCK@.\ $hXsA69a [!m=X-lFe6daK XKE" ו hC J Ŷ`ih¢ie;oiخ?nO` ħ#]"nѨhA-0W@-tL Fa 5= \l)YFԽؚw.&-Y ` 겎Pz° B8y%DJ|?b?0$ha 1uخހ zc]C;Zt4 -n#Jfa[2 CJ.@7-] X6u EMwx~CF3tLKNShĭ4φ 0Ќ97fAL,)!Ѱqk!NPV[p\ϟڍh cq5ۻ׉f|ڗp5u-6Njz͓{U5ۥ!-j &v#6@ݦw;;]GnjL BiaE jd$A@4MoEai`^Bj4cl׽{Y @HT@{0uoMe;gkite1dBH/qm[ `TѰEϗ:R`nsh8:^tߖ4\^[b-B`IlEغ0ic8:.E 8i4}Il{\^ r͵5Eձ40\ .5z~X7u^$k@ 0# 4Džwۺ3B4 pby:.4t2hBmËHL݋GM[qϮ\{c^7w˫-t/~ ϟIAoHm/gwnB^ڭ ?<#@BuD]lGGX[}Jζkz񑀅|A:^e 8&B8vl/7ij8˹LbÖoMo,x  [RzB9:Dק!L 2pGHGnFuח&l,Wc]O/fr R5>]Hr-tB n0:|3abxJl6w۠+ BP( B?]wP( BP( AW( BP( #ڠ+ BP( B@m BP( B6 BP( BP|PtBP( BP(> BP( BP(]P( BP(jP( BP( GAW( BP( #ڠ+ BP( B@m BP( B6 BP( BP|PtBP( BP(>*Lځ,Б.{5ڶ:DN " X4FAcU(u {ΛD&0m49AHFʃMUA)7,ғo ; %)I&؎Lk딳CT;a: 25C0%"Bu L1i/#KdtY'1U;F Tr!.dw9`]m̈E6)kb"t֫Xv !dwq PpQ ĖF0=.L`-:j5b;u7HM-Khh}a&f2\Fje0S`?A("8M6І1袧^~e;0@'I(8u`kO%ӭsƾOPVq]4wPޞZE"GvX8t! "Nݘ$͒wk_#?Vk NCS!BO$ S 8=rظU6]V :00V!A[&vfa>Z/GU-c;+!zW)oM(tEiA=Bξ v!XҩpSrJp?d1Nw֦T%ԑ0nIH=JJJ϶>'Ж}It5ʔ"wW#m0F+݋Wl0ѺTM4AC)*}%d҈ش\\Wm ٬"h[t.` m,8%A_. %U(݄D5'EO&nށ=!TsLQppw=iG-,'q3Ot']B7 ]*#k:!A{$ґ/A-9LFnQjDGf{bzPYR Q(Q$} ӰqSIeB ޡ#qz]֋`/{'U{}B9OY9 H"g 66689\q 06 2$f4s񤽟?Ωn}ky}ϨNk:3kKÄwO1l"< kmP pHI-"LV!3Kni/)Nwjˉ6㔻UzuL{ at͡T&н"R˸|'X Be,Upe}Do.d{,o)1՟f09IwVRdFOreWE[襞Th搮xr+egՃȔ6rwZE-awYQzHX,S;qB븚Fև=T$yjP۵NӨt(G9UmH1e"0 l3 *nz ,vbDvi/VmDOsɬhTC!Pl`64TT1>Nif-2LG x0Y;Py'+4f!L#hTI0ד$jRr #A`k&2Y^'膍BeKhkB jwUE[Gp>s upbs[SPU)R54[ged]%l;6pX4Oe]'[ACtp67]gx"HlCY#2p(P\FE%qT^>H)% r\!"U+i(e*BE%) (Jpf;M!)ti\v@-㲜}H5h4Ҥ+緤2,oQͱNA> Rarږy#I̚ldXa9 d㻻^Y&D+㽽$˒ɐN!S 2vud5IHAu-xq JU[gٜCIu/%֖Iu ]Opes .,*FJ!3@Ōmto\o3Tl=yΥGHyzTULa&k) X&2ǐ靤*ythi=ρ 3N)ib<>uTbh~2vUI 'YMG1=EvoE9dh rtf5!,MCa%J*EO(AXbLRV  abΔihRe+]N2j,71rMj}NB! U"óԫTKԉ_JI&2 9fRjulGoeaYŒT BZ[tuWZ@%492윯P  w cTjEȰgS<ܯ>BAOR._ϱ_/a53p*MkW|x?Dgg7qÓy-戽Mv/q%N\x Ư*2~d}a㾡CW~E[K0T㧯5f6*N\>Qynƾ;+>3}h| g8v-7.M| n'+:R '_2ja,Wch6g?̜;?paȰ1oW7߾B.c{ j^|K'zW8]Iwd m'7=\硭\έyϾshC훦.F*88^[J2,?r;=fMS2|'\awsǝ fGo-ߠ?uϭ<o/JnǗ;'uV9="ڋ|/4~GoS|^^WCM|xdx4H>:^?G~o&oѷϳ׿/7#ᅤҋ39~Z[A"sog%_~ۿCzr?w;‚<{ŕ7&To^qɡ|=xoo owȖg)թ6Oػ3ϼ{yv^q_A=KK_qW m /:C웗׼upq0_-Oыhy?Tz7qsTAr92ҼE51xƴY{#*bƷpe4^?# .O|z~_&c;lD鯕(9=돉^ʫ'X?~=kW_B#yv^5nacL6Υ2|?G=U~w3>F4b}tM$xk7]7]G{6v >V_|yO Q:wm{'0:^rch^+~\15(>r'?d?SB,:zFOt=@RRGʿ-;^ n |q47^aZ1M܉k8{c'_; 7D,gaks#],E~הp¾<,]}2+X$=o#9{׻xAu畼?rwܕ)^43Xiȿa>J!|V:> ;~Z81v1zPwΗo@d'KI|ϾSe~ \mx)=eP} w>=E [9~-P=gۯ#1D\ W->I5$/y~1yW9+'e|Ү})J83˿jco\{: 9G rgЩa8\ :>41!4V?:^{K{loa |?[s]LCc ٵ|Ws6/ꧧVRd𿿘n )&~ s3y8z7,4(O6˳X#h9s}#|2^N/玥lIDAT'9ѻeHG߶{&r  =X{y?}w #b~'eE}#÷>{H?;?t#6_|kK|מ¥sřSl~c~/_~ c_7؄@O9z/}{GOWXx}9YvYsĻ}Ic+N_̱־É }4ÿhJpa׷Xǵ# ,If{S,˔n=á'/oo]~sW9\?͛g@2)zSNj\w~32̝'E_{Wq&=ʯ|>vU<{+;uRN e9dx=ϤS6ĹG᭬>p;yn:?%Bީ c-i9/[`OLU7?o]S\x-LS1:GW>y)o݆K}:}?){.=./tl6|ٿL~:+ٷW3ד௝s! ^7اpAtN6'oV5_<Ns|ujY(|7r\^33/-wo~Yog8SG_&s.9Y-z!.S$ ;Xۍӛ[_'n;AbCzۯY3Ўg-sܳ0z5/O)m/;qAU7)7Xus:ߊ|<Orr{v\f>?90^B: _B?LT}.\i?&O;_%>;^ș7M1./u k R TP B)_JKK0J:PҿN)ѺC0jLѾgkRu@-9Q7h}ȪT[/dS `n2nWƹߧ57ɆIn鴩WI54E%Xߖ^|+?ͱO K[or4_~S[E|mꫭ?Chڜɍcljf9ذ-VmoOnF` ,$D!7]|?me^Z6y.>$SnƷ.61i>kFT[A f<ױ;~ۼ6&i]Os6&{ZEgl^;Z6->n{$us,ܬ&mfrkLGW˦q8svT-!||&$iQVnu1sm& mZ?f6~ތcc;o^٬ 6Σcpצ]nyߍ9ӗjǓMt|ؐa:m 8njw,9\M:| ?'7Ol3ċyh?swwAtAtAt:tAtAtAt#ztAtAtA?.%6oO[@ ~C.)@5_)ZQ׀P/ϔI@h=@S_%P׀5y !Ђ.-TYќ@4X $B:T?SS昢=Wt,~T?Phx͋k*I -БBV#T{]lԗB褩wA\\``lȃP ΔZ@'Mi^ dnl6xm Je-y"[Kn'zv'Zv@AS*[CS] $E ɖ}`Ji}#ۢ o 67ך 2\4 Դ_RZ^MRh %Bk2j@mDibHpwͿl@`}Mn64mֿTTbU7E(TE*u39Wװ j8SFF-|%J7"]ZaduriRZ(C0acji QFxFVE C A]M"Af-4X4q T 2VXe{:-DET ]s8NTí'6 EK9jңr*`uQ)=+B&M_i ܘGH^C9&.n%0l7-1Q2]hCe% XVD '(BU*XAr1]QL$0eU?륭h2e%#ܿB0^Ij %$DTl CO.rtͥ\g "t$u$T6]e}wEStmIb #5-B5BZQiѰR{Z!FWtj(2 Gpuju'JRud,%JSW1BK)zݤ+CT \֩պ$rԋ}̖3m3dp2u\ k{5FʥLR4$D,Gwc0Vh54k W*˃h Z1N*kG :Z)F>6) NW®fNJ4݄Ax?YVʹH.rJ"v¹lvz7k0+^VH`/b:ň1j&%-NY8)M#vƫ$I ^)tSX;HѰR1pJ8#8FE],ۣ`"kXq'Z8FXa&UZKP*WC3ԐCMejV$ckʣ@b4;)tyѫ,0B01 wSq3X1JU.IMIyԻ-ܘ' \/Dmuս8^:Q씍^ 5F9d9Aem qN%htj !p8acd8{-Lez T=JTԨ<̽C&x:Z5lDXHt!cz,FJI#7BeT5NE%NIdq pSq0qtęAYfrih3ZJ!eNCY1zmvOQJDipzn-ɸ Kؕ a7%* RfZR/ CdC*^} #H Ur&gS@bWJ(LR, +I0q=b~ bNni)EMz4t" 0npɄlbʠ Mc%֩Lz5 K4%Q-j4B:xFHp B zJciI$)vjy;fW$KWטcèTgh\Rn K~bZ݃yoF%T5&"ĪHCa q0NA*'WG ]8HP08aZ2Ft1T+8ĮfH$VTX׻YQ/bG=%zChj:NHQ q ^%Nʂ$IF9&]0^H/4XqH yp+"NyH[6گ]i(цd9 VUXa6Q,v%,8t"XEK9yRI% YvV{BҤ P66%zQc+Y$k$њ)QҨn~B.EP"+zȇc؄(AJjA RRc5Eb|'_L<ӻ&ih! Ev<idUÒ`9ԃۈ3X5B B3[3X*D5.( /&c,y#THd-byT7RGhne5E]XHp ۋRb']V!(Քd.4 0<2 ee%EB/Q %0\V! 2`erBCJZBPvB`(T"!RI#%-DKbWAA P@ LKDFb)܃\R53,4htYh3[M9Nܣ.?DW{m5GD4tRe58`-d e *=.*RwS#T"& TatKnhu*)aQ cep l+A͚эy\n$Rl#h90ˑ."ŹIHY%BxqBnk1,^#?+CXSD(01by@c4=O] cH  25\B,#crJxgct{K Q7MW^lr+qw$_nzNfwR8F#,y`ج!62Tg%c̜"J;;_P6ϿiO'ScM (͒JR1#g] ^f%prdX}89 tm;t)—>C+yD &p[ P(>{%UbOo4&Kpq&V1f"tagla?yu]ƊG4'^bya</c84s9Jgr5Jק#T qv9³|-u3W3q.!> ]oqȞFnadv\z8?St]V^M""i7(n'ZKǾq4Op7ϟ!TT+dfD5pK*"Fm|?ZL2Bs|J$?N+{jNbdl{1&f){pE1g^ϿJԤ|pGJ-wT'"k<}MOB.l3o%-|-t+ .3.}HB5ʮ'oG2\{a(ʀeO6u!{y>?>w!n?TH+5Uz0φcPHX㹫="r=Luw**B`% CEtܰdfR"{Qr \K,[ΚT .'f;E? y73[Co6J,b<g Ѻ0z \`7/,OqF| .Wcdn`6 m ^Lx"nR-RqES[yӽNǨ\~֦;vWѳY&OFhcRaꬭ%ҵg<{Onq$"wl?? L-^}ŗ7ؿ~b7;N>Ý%B;9/1oc~(sY{Xܦ^r(P;>LUTpx!CfR=cZ,*߂S*OVЈ ym=S,]ی/a>řn}oyS;,KJurC`Rη^=.Q?67}qFq³Wi(3|Ed{{Oe=D+[=Ӽ} kȶϼc!f[)nzq0)w٫1q*qu|̐FSޗ| !Ξ{<y@#Ȑ}) ؏]ɽsfg+r:N(=bu5u1aZlŜM>nguUb\2_@΍'{F iUɩAĞ)vN&zz9sG"{L~-<>L|xEw of׏pq=3T44-Pr)zTn<ϿJ3N)?H1?Jҫd-r8"K?S>F ݂q&j4nsޅ,5-1 <6*VIUah <˳D~"Q NaL[P\Ez>>-2|x/.UTQQS2HY:Tw2c{:1()]:OMJ\q6KamC ӻ(yuA΋fD_w-9pvepQ7Kk^CWhX$e5~F\N69isG} raw CJƭC1s r~5ŋ7_֝|z=]ʼc=JxsN/+=˅!^ލJָ׺||6>y VwFh4RLҘn|ngi\Iej+:wR5"hf=]O >χG_I.$nPx|ù*VF6"\(\7!R[ĺIFmY&3T)4!{ L_犥){}d/=8yg: OkR B aULMrH/ ֦) kh45*r ּUy5we[6Q5;eڞ*kRJr6˺Z%"Xc| ,s΁мv9ˣ&:mnPofb|^CIU)TBBhxJVɜJ&BƴT7&Y)ڦk*q׵ZC*]5WOU)KI[߭v PUR ʿr`$:4}]Jl(oʍck]YVawX-Tޚo+I[Z?KJȥy5T/UP$5֔ULDo&2szo&lM*7hmRmCmk߃O ͣerflh󄒺?)rVQ %\Z-Y2q/4kӶ^u}Y",^@[VڥvPB!MpʧK b \WiM>9]#PL&`ۗM#AFBhjAٱ @)/EzZ>zMA҃-+ZPjD_lX[CC%-Hj>-=DH-MjKL Nxpc6\Dr`^SJU~&WX @ʏr}6pܰ,X )D̶9C.nzB r 63vTLך~nm3iZ[\d5%3J!5ZfI|o'M~q6aؚ-6``<lw|-5yn&=:1쀇|n1v|OoqmԹ`һ״̓`Zkv\}le8^.gakƱ%k櫚kf>|(2>n dtm, O" -s2YlA jk9Hnh^ӞI)9_W۶[~8>o7mr,*_onf1 l$X ±M+CmkA\@Vg{>GrplCVO>Gl l}76}9πuahn+8_Ʊ}icO[=|vQב8q7m;+\kXn v <vQaQXR,[ f^`h 4 Y8׶q;8G;OwlQ9.㠹&ݵr&l!vZSe^`uc<8ı-?oi#6'[~.ccALt,dO xByg,;ıMmctp08mxAsl[x`I叧|dz|^l\[6֩g[k-q8oZk3m8Z3[c5ux\ŵ?o ƶ=KY-qlъͼ11۪4=۵q@׶pT`O9/kɝ{<S\ ~8^XOu#|;6乶\[i=9ǰ9SyXՐ B)?]Y1q|ɉFjg LHs(]hMj>}e1F~8JXefT(GM&$4"t$Xk>~TWUT.Qf}E&0aM5;B4Z Zxy Ϛ8)(FQ9E&[ꦰzh(QC rtHެ`LGRzX5LYA)(ubu[qzԊGzbL)x: ^1A 7E*H'DvHҥ^Feu+ 3%S$jɧMT!K#aRt=Wm.Ķ2H"qKD-KElxD? 0 nTJij!j0AtklE*q֠$:>l4NҲ[SlR6HCRx5'`Jؙ: ˽,FX,Odbz:NbzɮV-MƭPYJHX}5KQ".P(; 9H R ']XF$k6RÓ9Df$CyV1z R`Tn[]'+,ﶨTrĜFlYd`%Ş4>5nzdI1uA2tmA| JqVk&bS".RXZ=kfW3I QPhki*qFXqIAf6Wv#ˈBST $Yj(@OTH{COl?N!^wuy/EtfvGMbh6/EH Z%ƨQVrrFvjKx)hSu_2/txsb+Fר.)Q_%evwQ !Z6]xiDba`{ \t4qQF-Pik7)H2݃ NJdSd} iUfi}?1Qh6 IZ˳elha=C-&ɢ"S. H/c%<]8bXc3.<sE`BRfՙU[)iIDpuF!Bz٤4ZT PrH1P@!_J9f !ī!F=ӵ0\XJ֙K\ LLbn"3/5M6'Sr8%VKw$aJ"k2? 'a[hc&O`T(˳{sT&=S.T#&'=ct(C881#aɥd#),}R#DJ:`dNj Yjd{tƲeAVSNjc븕4r%&IGW ;%/s([K2B Mw۬F+YVapբ5%ѽ4O3ѫPfqaG%s0E;z:ѢN%)#^,2׃,Z`= VJ4:ڀN߲:屰!Wa%3E20aQF@4Bx*b^F]%2UdkQSXQuq;C8͐`Qqb5C"dc?+8T,3VFD 35.[bJ tp UP=zTC*h f9{3VH0eXjgO=QqJ%.p}ɳjcXG,Zb{<3KԝFMr`K1aR#44d,oHTӊD]UfpiV1fpJ/ *fQ`m cӈKKEQJkDg*BfLE_<F] ki{@WJX-Soao/dyfjWJk8a]oYUFqͦ:L74S*c3C7{dU@@Zg6--m7LT+}Ioj nn)Ef3M6]ZYdsW[k4`nhZ'!g7o(64lke+UXot#D*h7i6 o`7Ck-Zo<4^4j:ԦݸlM4k(JXJQ=tSWަG 8y䚒x?]|\k6jSKfvӦ/7ǂo:HVx4 AC;o5 Y3 iȪڍ[ ZM66pL *m[ >X蝠ɓ& MfO,6FjccvCfդ _~sxo~Ȁ!<Set2]1`7v-Nf qsi5"f|nUL89jw&~?#d AtAtAtAE?uZtAtAtAt:tAtAtAt#ztAtAtAAtAtAtA?WiHw!‘!4xf`k&2`~\6tWh'MBXI4dB0\@!=4Eܫ#G)? )Pn jzai!,S bIB%r)!ti82D͈y A|TĴ*AMぐ8^MCC aJ9}&.:J'ux(|^3B j 3|tҏٺ.A nkY>IVn4IX95t/uDhH]avTr=ӑ3)z}>}u~ Ƌܷc^=ȎоaΔ`c\q_ W/}Q= > ejs̭+7`D\<1*Dwb^{+L'? &_zӣ { A}/ x3[mI>y5'n m}a^,:Ji\]">6y޽ F#򢵧 U {s(|Mpo*ƫG2ahwy߻%̟}-=4g2X7=i("S僼'[L>j{ia /Y![v7x*΅w30=¿޲7?ʎ)*"Οeɫ־Otlomjc S?V^u3d<}=;Q:Ջ{yfoկKq|hRKߣx |ew-O=c {wreV#im-5u6n=L,_g.^gLeQ42Y oO0naӜ_ɟFyOł3:3I>oga~kEXA{/$y'}18 lޫc{6υ.n=5˷lgcyq?'|?0|*/pl2ǁe>0&~JM ::rkK+/5hO3\KFOONowe`[<~=x:S{/\J^|r=yu3MX\(/AO/%caK[R,Ğ,+5z'_DlDMl兏Qbb`y7]d./.ź4J󇗿W>~XUgp;s;->zQ(;_?a޷p8Kn{i`/R]\-nNG;zX%ȳ teOK+;xesē^ț,3;bq7og?ɑEtOsXX >ƙw=u09{j燸gxMdNОoO+8N(Gئfܱ,i\lcͱo2]Inyrp;[N=y`ICSX۹aw/X'X;y-ow􋼮Uލi48SI\2{~~/|vV>~Q4Z gJ֓1n?G_`~SxķcLҫybtF%l1 "ZY%},[xgg80SG-gBG({ h9{3|G S2%wS:o\}i&ϼ_:.2&-Mߦw{~7qy ;BR:Z//.r1:̓? #<2>9Df F%2Sa#<3S\uسgbɧ_9ȫ<3:6"3b #:> -gαKM\޸ʡ/{ Q|:HLry2xTF[ɽ>Xg ~yj-)6W}'_^ܻ;gW86 |{lq=OC)N|bF8~cR92o:~VX<#?ۈ$ҳO% Jfe!սT/mD p8^?LԻc޽|=/g)a\LPT䒻"qY>EX%sj+ j <,'uN'$r !ņMj dז10<eXp'WY" Ԗ֘,+!H*R?Pb%z"Ox%Ee`ًpJi{FnRq]9L`]\18yGͳrY#+4&YusKXKӔ]͔NJMgYh8V.gmhRnU*(j5ol2$s뫫4Xp7peByT,#'{PFw erEM|zAHmi5s:g bku#V&XɳuU)Oe/V)#/( ,&%K<:Ts,֩,-0(q yT% Ru,Q;RZ'o)d+,p/b&Hw|dϫ Q`qOuCYV w Rj:Nj|:E;4mfU<><6V̪KzSj~XyQY d=P2im暢[>Gin'6tO\n͎c j`jŽ\z!Oގg9Ǟ ?e!TbH']j綱LI%iL0]kĜRJ5WgY,XVWVw'Y箠V"ywaaQG) }zeiA}q7~ibpdrբ2%TT&EE6Xuiq/Ա6(]=a\fކP"Ou@LAE$y+Oc1bSb9EP޵DU$H֗ăLiujk@uj9zPr]UfD*سQ 9/` p1QvQ+4ĴI*13Yf)bXĜQXYF5.Xc"$J9vv=Ki2Or`mJR nlŖjpu\S+X'/QhVeۂDP j"GDVQ49)(jksk}ȵ E}9F9Wg-Yؚ_>L$4jEM Ac*#Ϣ͂qQj6u*L,{IŘWDI`.S'^.3#RDbB!wiWQ3!.s *2`=d%VjucL6 ZgM!%]EV Xis$B-Jj 0i&rVX P!j[qVj)7@(򋫨9<DziqUf6Zg=JH6=2*Ƽ s. ֍5dj 6jk:˺S0EEmUr YuLq9|~ТMPaNzE;J9GyfDgX]sQI*Wu4PYE5d"bn ]KUxHnl!cf4ƂB,Ta<>9F)G'Ye"/PSAg=%VF8(T.R_UƫLk89zLU W ɒ -RҲB 8$gI]Yv͚{m>g8áB n]U]Z223}s"!p̊8Ǐ'5vHԙW锟l} ʋ H+1f')֙[%PL-blF !'7 i+cw߷\Icɲ:'ߵBR9DD9کPV<"X]_ DRIH(ˋVRg8@ EzfV;%2*6_&Z"X]ƩH֒V$V5:tg"N6,AГrbq-**4R~duggq;NpeVX\vIzEvIȑX-0ޥ^bokzdJN2. Wo[DRfe{ ,8B# *V~BjeAW„ջ_j 0 ͊4!R& @P\+)@*)J!yOHH)Rk{#H =E!)M;~vߦB=^a!$14#j)s8ܔƃiҌIt_m^yŒJ뮮>J!6̘=Zmʦ;ґk p*ۓkjG&Խ0vd|X6Hj \tepGIMK}%*ܸ#"wٛφZ}w٨Wj] hH4?Dv^Ge8T+r'H)\Y˖z|ڄlڥ-qlM/͋apo&?*$.g{>ᵭzg67sWcZcTKSOAxs^{K5_i'cX<[.7s =j7[8޽XM4ZsJYMߗ&Vi?痮i%<կٷ&'V-> Ϳp4fϞڭvC4ogOSqBk&e|Zfi~\埸qZU冿":蠃:蠃:蠃:o ztAtAtA @j_//\K˴K">?7l?/*KW>Gڼ}->/=M7x>yV~ay xe _/ks}>Kܾw e埦r|ߞ/" '~דi|5`/HտW^M//3kF=믲4_/mL. gLZ]L|wǿ)uP8J" B2He e"RH,B0eaJ瘲4Ҕ4=mG(SCIhiHI]ZlKBLi#vKaJSGec5phQ89VV;>lL ic;R8Q AC(wl-[Js$ԥ¶@bĖ"MC( x-M@+C33&4c|{nǑHSI9H-)%RHmR8‘6emd0,18Lh(ah3!4BjGi0*-vkt/8J[h Z phmJinڔ6C88eʵޠDjMآ)?$@D\i#Ц!6Ƥ@;Ҝ48U;Lu1vXc䤍-ؘ뤣;FS/!)YaaHԚ0v 4B!1>;[iaD2BHa?16'BR{ڔ8XvDS57)=[ v qBu܉bNM=0eg0mEkҔ[ML앦 ԥa1s gƂCak ^gK33nɛ8\0z0?4!6P8OQ-0{e(oE[(SN兄˳ZcCj(g-uzQHTfL M״NMyKL6x42mreeƉY S` _ %~hU3ƶqa0q@H,Fn*otM'FjQO+[U:Y-)sܲeiih!x6%l0#Bdp6,aXեc5ڑ8}&8մW]”jHyqcʢ9elW;nJ6\N`Jyur ݸdl*)GqA?iˑ1hk1հli;Rh-7%J`52lk ؖvF>h M)'mi*_HQ қjpii2D&))AK'<L3xqF#v)w*0e<.&7r4yҔԦ̪& e7mmU i-MuaU1>ci 4\[p& L(C G m0%8&nhm/!] h[( R[JSʌprYa,mv!,;ab<3hJՅ}J۱ 1:AXu<Ɣ1e'1אl^nrl8oإuHlVlLY3 l29919)fo6nM\4|r0/dèE]O-|ѕf{)% `r8K Z|gF'>pc{;1el !fNh !4BnD#lqLd%6JQϝ}%0:19{M(M3G c{VˉHTüH3A19Bj9YBvh0lSd绎s|>K_23ѫj).KFIJ{x? R08&ca %8j~B]fo*˛'\v3gYݫ8pǏU1j9ػNN/ΣuO)%4{g'ލ;B\[\0\={xo i=\?·7bޱx>F;{`#|8vyq;{qbe3DH߹ '{ /xooE\/̇='[StmJ8E+֝6Yut[}cA͏rpCFYn\L~G|W9,g8~Au*F??3Th?|ezWώqZM8,ГVp™?qOekOj~'EjNb\/f,R?}|}Xp=oTby ƞ9f8G 3_ N]o8ѢW'ȽYҡ01N'Y`DO_d"͍Y4ũS{{9aw$T  \gܬǯ%gX _μ{_la|/F +O_ qU;>ddO3O5#QÓ?89B,BHj_xaRٿ\Bgk37|[@f:LESS[S|'%VW9͈ZG(ǿ1Nԙ?DD/@?gSs ӳFų|*2bi_)'tP1f'kE&[U2\ H`{?ܗ):@T#ᐾÝG ?fSY~v_0nQ r䟾x.Y^gu~\GE,%βs<DZ5#vk:ѵcM7ŗJoq3OXfiGl-L(%|zpMrGg 3As0STtP&,goQX8?d#y?wD _GwVybbG >j?u^DwH}Xsa|$=Lá\b;͓s0(F/Ω9Fy?qJO;<SK:,?ĕ'm?U"S!\)T&,\ P upUW&cs[vm%n}A8 j'ƕ}t{9<ǿKo<xơ 7f]aMcgM_wXc> Uבk?"/s/ =ā&^Qn}\U|NqCφ8_ZJ<3#3.:Do_dwH,Qجړ|.eO'8rӡP<=E5 3I/"eq_Tyq~5RprY`/W'xdΉ7͗/ˣdS ,Uhv}_cӈ2p`|nQ qfן$׫g`oF~-IM}#e>~R|շvq使Ӿ/DH?%ك wݡ?̴:̽j۱Qʹ$澁Z>=crN7g8=3 %t.f&X;CDSNVF[#2Jg"Orp#š>VG;DUb3,xtw ??"Z1vI|y7^\'"b'ֹbd.b:A@܍%9rYQ;s3 e$cx'&S|ȥ!6!.vf,8k?y>}zÄ&tmȁ_xSňF˷_`| 0E;5 Y1=+zUGi% N+Jl3()Zy!>rNv)vcQWCSDWP?j/)ڇWtI+JXӛS 9VRvZ7l®(DyՅS `EdCDe;` ޖ$12*NYd!4 &/:5ҡ0Jt u1;(ЖH-٨rp+ Vg/"-g٘$㋲R=^7V}4b5lmѐZ ˪P+(@@NZ@EHV`Esd!&e`P$-h| m%|CJuPdq2HThB@BeCȮ,T`G^e''TB|TQ tFT`IPGP,dƢVY l ʦ8X%Ha A])T!@^TK=XP@Su#Ķ)r YSȒpQ.㔃yUZRGJ5FE])zKe"vRlJndUtvhG.ppŠ5f>+RSö}t9yJ  _Q)lжEPTwCd ]vtOH;n权,; @5KQylǂK^#ˑT,WȚ" U-c QD]ybBU>?]eMc#O=b`aضJ5-%!4"lZ8BkgX{[+[l"!b2J̷Jң3X;twOeNZ?A#8]8q1"@ETgP&h4ԄH#Ci̳+ݠtZt }%;f5P!]P WlR!k%+8k{"9"i*/Ck|;O ѻnfGZalWЖC N*吤PD D Eˢ "4ݦd_}IDAT[$Z-`¦R"k }4s=O l UuJ_$G*KՠO$fEiHEX(Q6X6nQQr*JbkԥBH'`S A@V2Jر*EƲ55iH&^lPmS*Ȋ-P,mK?aQnME= RيvmEԮ[#eʖ@"ZZ"'7qj!͠D]U()Ux`Bڦ.-(JpqV4!PPԻ+>v'V򡕦'EM+!Vb"* pBbISA% jQ TE%u qMʐ Q9nv| NZ9T=Dr%y~ej=|MAj̠ƒ5D,|CDPŨ%B8(%E(%, 05idt%{ Qxb%½%OEWS,}6u;v'e'X@: XpSR馮IZM1L- TɆ Y!(qe.FG* ij(蚟zPkb4Fj>B, {U\YB&ԨiD(iXZS bBbݞ j4|IC5aYT%5i jb/VURY TXV>;C?Yj ua_` P!i,S )oZ4z!*HY,Z?B:5(a!+P!hVIwHor-N 2Jw`@44$=KfIQ!M-E(c1/+4AT-~-rb~N~Qc] d@fЦ`[Ha'Y26LC+|;/SGJ2E!AK*Q&5.~IZ4q|cYX6zm Dڡ!*עa W͹@-@\ 8R@S/` EYp dMC*!PT"0SA20W T!/#(P%7 W/ >$!_ebżg .!BW֡]aj}vЁ"BhM,X1 1d!6T{jdT2Q?î2* :!pϗ)$8*yb]Ȇ 8u*LoR}6M=M#ܠ "y _UJ.> evT/J`(z _io U6j|r"V2EFؒUh^Q+͗?U'UDC %TZi :.}p"> GԮ(|K_Y4BuE3./[ukZ7y}1%B{Kͱzl [kwi;6.%X4om1-hmi.kpǢW}ϻO% f?!hʁ,'W]Ƕ>xmIOSaPP=[wɺh4e+B{ˠ[RI-SAvx"lDhk- [qh6վӻ]֌ݼ.ov>q+a4.ijrClջVjliusdMh6=9yhmڮ7,!-[SJW˹gX8,ݔgNS7\-<9{kkF'4u$m#|b],Ȧ)aY㩖>mMm-~մ۵n|@V\em'IRhw =#i٢ܭ2G!\vogxԻvɧ%[s=m}nSצ8Mh/te"m)'-qRl:X].xt1=.dc6 ܭƽ5q%z~'إi+|ܲ=/Oxm /;5uִ_fiDcZJohuuwY~ƱZH+V5ߓ+WԞd5m h|,h3ycbJ7dzKPBnlfwђ]&kKL[q*!&n{=?pV/l0%CnarkD~`^6=Zh'8/ɺ.YM&ښܝ^c66ɇ[&ٖ4,ae3sn7Gnn-x!g\ƛ?cnOD3:o[+.ׇv8M;6?.&Dݭ&ܭC^ZvLd dݚ#}rvوzMw@e:蠃:蠃:蠃:蠃ͷx|~v +JXHKx~b '~NnDIT,lʇ>J![]b5 PR"%$ %%JJ A n_Bg)BJ, J _H@ Ba 7s2m DR'7RJ T -P(sT(нP)\mi϶%flBZHkEJ3F1Ka+ؔwHTX8_JHrFmB eב ljrј1J$(%H!$HW%0չ)ԫػ4m2n2%R(Fގk?!ce+R2XB 9ed/DKosRZqeݒկ#ڀB5eѷeX،l+3VXZarbږIP5Ho\rc4n_[eC'^7¡}5㎫˕lڍk%]ƕ %Mp۴$(-c8G cF$#3wO1۔9#w!0p#'06(+\VBc!~H,d{̿BC> (W|Ko@8M?J ,j_j'\F6ptBy`I^c5|{aot ՙL>̑I&3립'ئyصҪ5BIrГi.(اOZK)1ЎfW q#M+MiWъ?xV‹lK_[P 0zha/ x+w#;#S(K0oxЊ?ID3Vm'ESDŽxϽV;+'Z(7.scPHil؄{؜+A3\;F\qfbvK2nvo]&wXħ@ ҿ !\J,fndlהϕS fl1i /{ؤۖ>4b2yT ڦ6㹛X%KXg7ry'^b$$֕Mj xܤ4˝JbD3G˝״Ojtsw _9rj/V\S< ʧ@Xs̳/Lh$f~!lc IfXj]/V6\43s$vs@3Gp@z~!ЮψfGݜ!Iԭ̓=n\w%ic䖀vnj5^!>9pcws+؃6K$H >o!re2ckR*ARC}k,iʍWɿ)E[/r:| -fU7D R [IH! ˧hRF [ f,ȲeUkbz9"jfpqJj:+ Q^XMRzw6mJ>χK͑<_tZYH6;2 iYݡۼQء8]guN",.f=cSX99z*E!'$&xˆ ,Ud9?M.rRbeSn̑+^)|TRqzC^ǚʲ,2'if-lt9FB̝:uj:7\+c^5DzF$uYf'K\fHm'>XgK\FUXd&x*;$7 j~?[;&E0s~.*jaWFu}*2:iGD\Zv]BC5~\b3.Lc7Y]# 7^!P<[gF,7d1 2WH)T`U͍rzC9P>X.nX]R`fY';Sd˩P}|G8\Ng^/plnf*Q+dSZO2 s,Wy:ƋdT 7 ,<߸Mv\*mY+Foq˹HZ%YTdB/AqYvdtPnu(HVfC0{M]`%?afDcD8jz}kbJ5B4hT<3|3[r=M6ES$İy33Jf#e:ċ/H r3E4$m"jO:,.lY_)4nS(rYnZ`72JWЙLQ-MQe>7˰Γ,XlpT;+-Ovej+ \/'B3trȕw7(nUwg{CUԵd"ͻ n%wl|"-U9G5s6tJ(G2UcwvI+6eJa} u6xŶN2EeO f# [k9V*/$9$MQ]t6FIH k*y~XOStU_YެS S.:hV 34VɲnFdϏr lR~C^%HHŇS^l)(d^b*b溯ld K4vJ^k+; ~T~f^coR-"mr,&z5g%0נ]bM>l'خ6X՘9>&UF`]CR:Tk6qz+ΟuօOirȩfv>=V(Ҭ.‚\"RV/R\t"k\QIߦg;B]@Y4.R~A ]&k\NkP0UlP6zDhwܬACO4&[.?/s+sk$oSL&)شg7^&7wdAga_YVezT H۫+5B *퐥ʵ%,gz3|7dQM`wfmqfn9tqؠ\L "WՋdMl֣p3&+EI"VN.1Ÿo ϳ2M!d%dIpC_'%\&[rh&WYS+lrt6!f5ɟ;"˺;%9??baC"jJ/?(/OU1Vd. kK97j7HNlf[NpfES)QYkVX R f,ֶߡa"p?-ְ;̋xc*J%/xo:o/]C,4)ы$(r&Ken'G^ae!ƋVei`U8lΔYY嶺\/M~'CeA*by Qqx3J=ǹ-tN\ onŮ;\R'aK^ݢK-,,%6=_ \+=˳"33eJb!k%83\QvXvإ"WNRzBA36fve6L7A\-NdppNae}ƚKX ,W^y!N,bmgkљsdWmF܏\盵-p!q-&icuH&Q1}SIkPÔHFIU\Irb@N1{!O I<‹K "'UY c ZES[dY℩ֿx{f_r!AsOB8$my%doJ8-={hm<1qZ˷ho&O)t%)?(a`lUi!gY+&nlE4\jw&jOnRr/戦?q4}e΅Zvޞ9MY&-DsKOC3`rhO7l" T{37hjH4c=s:ic~k?>Ͳf/p/6}D#vlomū9:MM[+l˓Sr|7H/OvV2[qE+ʕ ds❻M^.z͟{B2,wvOk?u=nk$V >%O=}jL97Gkn: W[д9o|?:9<5053ctua}BvrG p6\DJtwAtAtAtA&~StAtAtAt]t&tAtAtAt+:蠃:蠃:蠃~ЙwAtAtAt::蠃:蠃:蠃:@gAtAtAtAL;蠃:蠃:蠃:W ztAtAtA 3A:蠃:蠃:蠃_t&tAtAtAt+:蠃:蠃:蠃~ЙwAtAtAt::蠃:蠃:蠃:@gAtAtAtA~rqZ!|wS9.FH؜x |~N`NLI~wmn0Ha&'gH[eαh᝱L37PpFsLj~5: 8H6Inm~%I,F8_1Ȏ/>`]>Im-?!(照FGw_`?A~fbQz(qF?Wv]ÅнI? /A#Ze`vK,Ws:t#Ü \;p=pSeQNIY|07 B8ܪf2H/=p`2r?y+̎RH/lV<%*Ü?#?cLo=,{z^VkSÕ!ظMyW&aWRf2{HOses<c,-vl sHtc>:2ʍ(ޠwH}$hXcO]a*> ;9r:هnrL7\/CC9n>l#ӈk)f&W86əWLJ)N8DwN1*8{N$ |st+l9;%#'_osvgN(R{w m⛚,//prKbܿVO>20N㋚Hdt Ǝ˂}\`}я-~>N]a-rE*BG*b3AR>Q%ܝ@K[^7\#z(A0Ù vK•|51fw׫|tO?="?N?M^ԧFvf'mMedz/;c_qV+#>3 \=HߺS{. h ziػIUFYiסvp+P'5ߧy"y,.1ZgGO/GYfN w~|[]28'|drϲ8WYStJmFG*$j*:)K`ϲMynG9vƥ}1;J!3¶396k\9ez 컏үsU=|19cG/A!9ƅғܷ˗^Q+.O&r)g; ^8G_sS7sԾ.sby :v$s=xwI%`ש8a^L/ftʣP{ָph{lĻOshNWhc+Y.0+-VÙK5^\fMW6̥mVXH$ȋ(;d2^Ygߠ]fa7X%&/:[G8'^hc# ] G.+>X6˛%|oMSJY&zoZ34yg48KGN0q=ȩQǽ)^!FjǞb8`)j~An$հ睃蚟ߘrD_Y1hmR8ЅqMsmÔ쒊y2`Bf8'y2sx|>~uM'N2qM"#$U7cK$xnNH ; 7đO֜ | fYkƻJXl^<;_a~/cavjF&bY9˥Qd9 QߒTEzw?*!/‘Af&F#1Lop;f$~|<7t_b߽?'< M,y-z]V 8u&U>UCI$ۡ.NnNpPIk3(w9 o#J1?+}bɋQz/?fR8b>Ζd"Qd.>\AlX;qZֿ2e^?9{I A0)b~a =,zq=Dw>?,>i~>Vߞ;j/~Ӎ  Ƚj6%݁~✹`mBqrs=E o.^'Vbn㜺QD"pgγq]bςRA"YAUSX;M6;7|e _ >rMg s1O#|u6?zO-U}<3b{u-޿gw7'P ];&eÅs >=C 9A](nנ@?~/'8{휤jG ?&ft*~ǿ ;?XI,&_b1G'g^; ~/v4̑(߸(^ @ա),d^X䝯@ <ϛk? tw_ ?ݗA44]E!z8F9Q>\zá_mSŃ>NWX2?yJ]&0>B|kOĺ@Q~OhGWy_e4ǐO}'xDޯW= `4E=C\?W9Dm_㼯A8t?b?7B e;q;+09ē|<e.I0ڷ˽rkdw(gg޺y?,#?b#@%n όe22"on~jXdR?Y7 6S7ca7Qc ̥_>{g?;%5oj"9n 0?r4#i??##5\^9lr=${+$$ $4G <'řS2U:K57gr{8Tx߾6$Swֹ=M?wxd3kn3"o}=/25˻OX{x`u`p$ř{Q}ycG׹ro_}-;K8y'2_;w'e{SPй_!r.-E;tQ~ilY7'y/|,p?]Y8'̝rE|^`{0| ~Zcu?/d9eVc1?XaxGCI#נܸ?cr‹>&cB]"~/cw]fۏ] 2SO𯃓oo} |ȷLg`F%?ρswyE s:3%nӗ?C5_9^?\#}7k*wo%nc{w']=Ɍ>2F߾0)#ש]&"t?>{lfOwk<&Cܗ.$2 >sv W?~-~`d/a*<3`47#'EA^*J<<Cct^g_ٽ% _8S fl#}/`=.zy/\'0rE^/=I~ynΎco ś{[!8Khۯ9~k$ u&y8v Oy/n0s 闉%-./LdmY1:w}\pƋF!> K C#ڨ$fc9%g/S'ykcm?l~x-&/l:#kbd .^`cy#>N3\?53Ŗ$腅5F8n(sqFW7x~IuKf:%uz>j}|*h;88ݠ{E^u=tƩ~v<>1N9&}TRwlb]ᕯ1z>f]eo>O4QOa`k6<̡x/A#o/Ywr2̾.o8yxKŠĻ_'0}rˇ>aR~T:!>>=qw. G\hKlK=Ρl 7F[C*x,7GT-N1 ׷Vؼ@2"]l8#W9u?ohr7s١y=dQ|),.l;sk˗.p5zt$ҧevq"T{NЛ=-{E#8B||>x},)djv}#W$`{Y<8C<)2{N]atwG杧$˵w? zo/4+ՃD6Den(vm6^ٗ U:rG1f&<=Qo*鋳޷.~[{(shw*]Lkn8Eo8W=Ht+o51k_##7DG^Չ(އ\w_&~Ր7G>Wv9qgt_ܫWp"A~5ˉ?M5 B(h Q(,,P@ @PH!P(!@Z )-H%D %R$%BYHia $P e !-$R)RaY}_"eBI BX!-R)M_@IR()J!D(THp_BvT(%@YŒI(PXC"| eIR)-(iI,Hea}TZ@IO,pW*#sS;VKR-1"-XC( r@YaK, (#[)H퇰$2:HK"0RS@X~,x-edj+cBYua{ eƢ,%\= O)O(g$,p@fBIĵc_B*yMZJPOZH!؃,,) /l/j rǨ=Xgޏkq!]?B~<1 ,K`IOlْ7i|M,n?.ǸzBy(DhPz1nտMޒR g`Ʈ)jgel֧4?B4>) ?r%\N.y2˥W[?pK_WiO,pp/-=1^ۦ߆3<{(P>غ('}B lrX8r},cte3lk׷&VJriIR KJ$p\rȖ.Y#.OIK50\\̤ՖUB{[؛|'1<"ݘ)%rղKK cn추@X͸P?׌ BVJ ,mC)tHo'QqLq_,,O1ZKH|G ^gӋ%XHW0~PCH_S(70~nx+K -҇r"XXݼA7TҳK2cv$JZl-]|&BI %MiyrP[5Jia+S3a1M9Fӽ[{vԽj@J&7|Qty\[E+ |n^+ Zlڱv)CX-?#e71ӡ)76 lo7rs /JIW~>,d.2->J5uej͟pby'3s;P뻉ϺyJz1>?R X帜+;9eb 2|.>WR&WN+LKy'w .j͖ky\PXH߻T.׸|g| Bܝ=tAtAtAt+:蠃:蠃:蠃~ЙwAtAtAtZcZ/#5Bh7U;Yh-p[fA mZ^FhyyvF:aoZ=_[@qD8HCU0 B AXvnӺ96lLgHl$O6ci^J( q8OX>*AkOF-և'GGFpu&@8^@9Kq\#<@lZj\-]k6 }{q`]Kwh3vs] 8B6 M#WfƠ\hOiڊ1SG͙ڵ )L[mcl 5 Lڳ^[}6QwmTbĴz0<;6c7\I.2n٣1&_Wϗ{kK@yY7b[q]ђ]K|s.G5ckչЮj7}1:N f4%Tw R;-bF^뗞ggmo4cnaG4cl[٪hV#mt4hfs}_ی[8^SwIOGL ޘFJkld!61؏D=3c)5ә'-Njs{ qHy(l> /K=jیU3iҍp9-[u#>ݖ v m#\q ];l%> űa1nc~+ba6ݴ/3 #$v3'kN@؞'&u3lͭsn"<ҭH-k8-tl8JQ)l)/ozsf1Tu˛g)1fLB;NτV$dVu?izvZO) xhd gzdQ/Sws$p <&7X%61̇]؍E#UYSܑIEWXw3ɱgx X [Ȳ3 ON[Xi *9HvhJ*'Wয়rxxiD? Qޮ|w#P iI-oC3<:c6 Uv -p`/]~$a(M/3W<(Y #tϐߟc?/}ienÛ)f%Tr͇)8aUOibsC $)6=Gvlʄ3́à GLmP=;db!fl n%v[b xoA7a_rpƦWΒ~l J}u+j['|Lc,kj~ߟVfRK\݇:J*px槿`dAaΰ`q0@=[Ezć牅\C('9bܢpfeb Y$b*e ARF#Fv!\$JD)pHgVGۤ7P;qܢ_KS>Ig? ?X[@#v9/1;M4XSo)-E@E38^bkk\e*Kgl[O:E`go K֨BWdN$ m`^bz ej!\h} NP?aB!Ty6W\'!fY#kl03rl&2!Ё:@9-=\!stpaë^TOϺXD?7.!Z:Hu({O9yƲƽ>d-򤅭-ٞ־.Vabr#? Ñ4!,Té mٽ#HG36P7, fA X njfO5J25Fݵ,)qdD'yDj7z9&*[8 ?8u{ϐ9w] +Ux8NU{%mpP9Xf4nd`Ł.v*:GXL5Nb-R=Mߝ(cݳL2(zd[Iz><2Pa/ªoGYc9<*?`C܅eWb9F fjpnp޷0+[gX },ityv GJ|s%DGyj@ (ɨ `wQn]XhKӏpFDjdt<"Z9õ1_3n(Pd8 gHcXiK\փȱ?uD9)\럠]:sLG] nC|tٙ/5&K rp AD:\l.W3(HQ-z9>F>><1<a.yI e%֢>nv8P+|w?z,O 2S:@7/}jn6$;y6U?$#,؟!,h-ٟ١WmALHv;L8/<6F%v̑0fyI^rv"v8~ 7=Csax? .M2noR3U1_)zk{G#Ă;LdҜDbEV0zxl^%އi8-g8pOKaJ)#=-YJbZT0BBb^ntM{=\~#Ca la,ƈ䡜$[RJWjv{-;4Ճ b2,tC l9\ ot=D0f~R;?fX r!i>n"w_a7@wl+VAj'|Cr4 ӯUy Evvm8R~@a_n\Г[D%zƷ.v1gxU'E`t;)TDaJG.%k,EV$" wߡ rZ_#WrA~o t%hɾ$=CĚgc?@ZDzBwXY*~E.\0S9A_=K6JƁwzcf}0'peTb`P Ţ7vbQԕCQRQ5I& y,E gza&sC=<$(X9lSM"ޛX\yODϐsUVe;NȞM! 2,V fBSL[s|y{8'2!BNwĊ+VdkGi.OA8sߙ+9=eoxhg)ш-VaZ8Mc?c}ŝ[` 鄼?31:GǏz |<_}AkM9cr1{< *N}cB|c1H{gc+~"9G OK~q/OhDgnf>9!o|7^r~&cCߺEk~ILFmy˳oq[.OX 1?y x{G`!ed~gn=\??s9w#>lgW-4G|0DtO[r3qK1߽?G>č m6;ސWOvv"7PwSJKCǵjL?kv^Grxk%ϽoRSş0ݥbOL~rq{̇wַK#F< ]ޕZMm7;p?+o74oV#| ,]q:&hwJ.i}qQp KN_Wps:>KSBn>Ճ]n.'Vnoh~w\S@S #F{['۔ÈWS; ɓcMx8 0%/C{ןTQ ')s^%|ߦ,x&/Yv֒ME`pa΂;)w{G;1=׫-^?j¿gn07Gbv+[D]-& [3Cwy-=>x'm>xh< =&؎Y~ЦtVa?sѵ9Ai'w.w^!Kpi}>f7Zp{ȵb1\yzr:!m|VȐi|ܢ[5^, ʚ͝]cΊ㛇)oCw">~sݥt`8|3qL^݃~K7B07|.>`zx2F~Ʒ8sNd~qzJpsOǿ8^}r2uT)b1oQ D7ݮ269v9;'=&Vph=9hN>^qpHչ`v^kT>_KɂQ#^ܣW'X~-9F..?>W?< Yav]Tw돿( S\\Ww9Ç\^ߣg_é?rpŝwv;w[ٽot!=2uDKtwkzV :;ͧ::]c{%sY:yIpjx57=|DAm>xO?rvxG.O"G5-f.}sxv[> H7;|8Dh͞`J>##yʋhW?-}m.9ٺAOD_p},:;xl5vĄI)\Bң0 YvWO`E"W;%?-~2u7ܞLXEhY1c_Ǽ}ɂsZ[|p9~  }v'w(}j:osqs {\oJO<4gCv= n:wx4J1Bhc9\3wb)␏=wˆxw/ gGTOϏ|rr#{Lcb/zνל?cx#n{Mʝw)[!||_,n/P h΋7>>;>G#>^|I{(dwi1Ewg|X)M 3/sg1u JjϰPflE˻@!{߭>>BTn* ]' M>WlmS C|iҾ-Y.ڍØJmC}1w;l_:,t']J} z7fzS㘘FwA}mK{< 0n;>j~4734!;wOnQxz ^qS,핈'{23}ڌkјޑ`0Y Ϙ˟w1;}a0 Yޥ}Ɵ6U?G?z1`bvyT;P}85M?:B d_qns5$۠Wy9;ڌmӛ_;ˀ3N7o\c6wc#o&[38|e>xmE.ol߿A?99Oޠ %L*2Ά (EhЬ%2d2RD"1Z_>9d*a-"%f)qe5cIRu*-AƩښ^ؐ;guiЩB0Lcdx-|5+DT>\ޕQ ?Iڥ RR!H9 hks1ieuڔ&~3ˬrU(쒱KXvO܁T"rY L&]7Z$b&]t;d>iDVM&*)%6ңkDj\G"$67N3"Wy{rLګLf}Ly z\Ply"u\ISu rXLHyI#eLqC~/vҽtlIK8H^&f$LZnD.^c7$N%4Z&2yykI_f\u.MG+'&l t dqˆr0$q_Kd 2RHyZi65T%ZTK֎ltMlLNxgfI6f&ωH I! {6~i 2ږ]wn^ِjfga!fW"YҵB~+K{T.εdwaR1ys.HkKw$CJm7ۻ iϕED45FN.'H|1d=߈#"we:IyNYƤ^nHSǬK9A|]贴a]ek{jܫH%%w<`t[$z$g2=sTo$q,͜4y%&SBm6kZҜlcl;5k/LZV$kS&i^+\IRk"YroOl<[rt6뜔ں.2FXQ2ul)XKE&q!Fukdnl!q>ll|5S:_mE_4&g&ڌk_RCZLc{HLbX,bX,,?CBɿI@H 9|)@&'B&OH)H(Bd'BN۠HCz<"LR"%_Y7:%҇F!T~_!T~=6+ K~?#CJB&IlUyv"҇0$C'$_"UaP62 /1gҧ%&m#BW_"%mkb[ueVDr&}dP?fNҾ̿drk˼3 /#ԆMenBHQ˹gSg~Z1'لgsΤv|4 is$Ll%!e:7!2_Dv-H<q-,H3y;؈!/cl%_%s@dmj$B؜v!*/k;M[lĽ<#R?]]o#OU~}2{s57r[2=rm7}%Am3nB8%7aGJn%!m?R,ir :O2؈Y6#_/F,1rmŕk|,xZo|Əܧγl׹-yacFce1g9ڐ"Iϥ'y+7ߓS>̓e#UN9g>VrrEBo`Zܧ2"1#|pip<}^W fC.5Ɨ 3&kqҏy'-^ugWۄoTK>z7!m%:a˒ptcy 1|AkqkcqcNeQ!E98TU40^\/u.+n 5xL6;KAHi"-Œ-Ȝb0;m359g *hΊ]j6KKf;)%byƋFk.z^]jfs1-9No)79|#%KyڦrJ&cZK55G{Qb]ލ\;3N-FCV"1ϫ<':Wg:U KK3$4iLfyzy`h*SN#j:-1lڣ==eZ!J#X\J+N˻i[vZ"%nC.FE^3٣_SYMXTJK3;Yq\Qo7F oڡ(z i՛9en)/fj-?$5cEp0kN J7VT:VbA10,zMgjT}܅` h˼."eyۚR鵙g&Y4(u1S!9aE|ئx߾`24=}:CȋEG5SߡS?"4,+E!i@I7/у9i&[,Ej\r:^d:#6 ︜zjaEAiZYhJmrAi 1 XP /FH'd:!ariMˌkYҘosBSFUqLw0mn8X24fDgСKYe>?ӟjQϧ b~qFGv/xh/ްע=.Wϛ:tϼمpX;K͇ԇ/8NF Q9Az9?UY^v&Fsf #Nriw0R\,u%g!; |MΣ3cï* A81KA_èC[.抋AfeqgȢdtJ}1o fc%tjԝ.S۝1YG;4'/ֲCcy̸UEoNQ8 swx495g VnD֨JOی{y7Q=1AFKџxa /G#΢sfKCCDx^UIwQJ=};ȊʰFp>b40Xyhe̫3Mb.:see~Lzę *M[oh5ߣ&XΨzUIΨtr>m0m7ZrPEH' >Ŕƒ~,&jzޠˬ$7YϠX "*i%1ͮ˫y 8p}68ŪC4gY{bz]fS]b;IW?aQs9šf\uk_02?gQl`|ˢ;6ǣ3jKAg>XUEEyqkLuT\| x_TxYr9?'iv([U^tg\V oK Bŀ48Rl/#*ހNzF ],G16b5 +BT8Lh>6 x#ڪ`ӎa>2]iV.io;1GRޚ0|ABOQعeZiW^Ui "f%59hЋ%}g3&3pXMź9V9qt=}U#S`, S\()e5ߊLe7C*5?7x՝1je@]c`zѦ٫Xnԡ^se50tF 8# 0O2YrE,5FDu$Y\TWQFaTbU _ t{1CѤn̴eC߭SxW{bN}ap!5vãWvjuω! RH[D #_PQhb)@8!1FKĢV>nhX"FK\II!K$g |E1cbAF¤PK#"¸@쀣c"d9@t] )D1>R("VʣH7@E]tሐи(_꘨FysⰀd ( C\ 5>}J7oCA-". u %"Keb"_)< )#%tNi#GXbb)RRs=c G:+a+^%B%)!.Nqd\C:'Jjc!HJ$'54QR+#)# Vh*LLHb 4 W0pCLk)b&X'B%+! H!cp"Ja &vXPN"I1lE+枇ҚP: mʗh|bʗI%&r@K#v,): l9q#M DD(Q]Mq8&&2ኅV +v /BjBO`bE;'48ǬKrP{SZVEAO*IH{zQmx!^ķ4(Öx{< T @ERb )It v /&ǒDR$ 1M,e4st0Fห!d K%"6HdpuAB>fL9I xDJPcD,gz(1Z d$0PPRW7Q"fkP r0/x( E1X9.JVhd2'\C_ dIz&NuI4RFH JP(E"ƍa'6heEP}V*O2ɳnAH)+Єa GD#%4(`p%q{QpVUZ#\A/њHh (Iӑ. 2H3 q!$ !bXJqEFcCT&rܴ6Z&g9@bDzrC" &@#Q1y=ĜPHb@nG}"9rW*6i p@%''M{7 YL:7%˜K%Ƅnz|kC0ݥLa$Ҁ_;(}${B%+1wu0 !Ɖѱ9!] q1DFc>|M1$`|Vܺqrv:h&O`Qw^Ef9,Zsc"ԯ/?4~xC\x{\)'51 jёdt?Ms#zl7ONw_Yp–|/[r}w7֪@.V$2lcW~m-seԩ?Z|vCakB҅' n?ZcYv~z?*pJ[}'Nby؏UmΗ?J<=yl]q9;p3wn_h|k.q)F+fn"w?sRy>'5iEj/}+,OʧQ$w$4G!umkѹO"$7GhqO=Vu hھ׏ ±z~UPGA VEh<=GJNz, LO|?bBI?*}߭FepTl&N>xK+(rA>r([Kk[_ N[vr 0}1O2޸Џ{\x[çi:mœ|3!Ӂ>>ğOP ^!ͻ7`xJp[\W5GQIX_l)&{UfoT6'}ނmy?#]#})*޸ cZ (Q?|8? 0o}+nX_ /wBg޸i߿ޥF|z~LzuH H1ځ uwN'rÿ Ǥ[lҪzO\Ho/ v楛HҦmudjeǧSo x}Uܑ+M6﬿IARu޼ODqp՘܊iJn_m-<&3hU!roIOC3\1`TG {xإui7Ϗ*g@WTy=:U9r]SwOvwJv*r:Lӧ~己# >5<3 jĻ.cҡowY?ǜPòc9'ʞ='o\}p}W,uH8*<WrI~O7q'_|g\)B^BcS\dl_zJzq3TOxz05y2㡞MYڌK81Y=v!)FMݫ_D!%1kڬ k Xcp#Dž4oFd za*ϸ7O?\K{o?CE+˜noNZvV ۘZ bۨn78:n]LsiLŃ|k?O?wRV't RgY AV?j?J2H9#ߢ=L_+N|x;Iaxohۚ9]%jM;9F=[``))xSQU'4)#LAćIdςs3%tTT>:nVH%&V^`Jh]wv.]޻4Q9A9|$ڽCBt}Mr?y]|3'6=<|Z: *MO3**Sh.n>|&Wiĝ_G㜮ҿHh˱JӺz~"r'= +EyLX J(w{Is_SE>\<i[:3%&9ܞg{OspUzdO>Nr=,7&g?'tQb3֜䉿oQF91՘|@F3t?WAE9ZY`I&Dde {b/tiIOQ|ߑϹnF1U4}2/&pBw|'!tEXtexif:DateTime2019:01:17 12:48:12q:%tEXtexif:ImageLength300~ktEXtexif:ImageWidth1843` tEXtexif:SoftwareGIMP 2.10.8IDMIENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-graph-plot-title.png000066400000000000000000000074551414302661500301650ustar00rootroot00000000000000PNG  IHDR@aBzTXtRaw profile type exifxڭk#)Y/!XszLW:]=#AtuIqGEkix^;?^{^ݙ==}sޖ6m(^f_ hwq=m6=+X8.,u5S9'׾s9|~pʋ /}aE93>Uُ\Tq޶r=;¥gUkB'B'>d9c3F+\`2A-y5 Wg 3?]? +WBlXh12 9sT.^%n/&͕ v?&gl D?tl1bB_BP5Xr D MJpj%>THj X9 C]d'"ET4%\8kҬEU65\V{-AaJSjkw&}đF2QG}>3Oeꬳ;J_e[uw؄[vٺnbrNG-iϨ5C,_ͪo&щf sq5hra[$)$ZgC QNx܏9rΠ ϸ}WEI@Sv4Ρ)H"#C6_lht}.+C^UڽzѮ{7s*1 >TGmh$[o +S*mek~9o3+XGr{zɫ;0qimeO@mxu -+JcQZa(}:6:!:s+kkHc-dwOk7-c,NP25BDVܻHMkd/j1:G{ Zh+l3J~9o҈Ja+%lL͕(ڒ0\?*=2y+ϔj6aAD r<S m4 u'ÆƬ PPo1͊zmxUb|Yb]{=j}/\ښQ:P@s5Œs#P§PIWʫ Ir#Em #)Ix 1*ڰ]^}∇PN^G4SP2! yСVRhIu k o>ÒpBYj˞d9E)Mb2.D8ѧlO}#% d3BrC6T;G '[>ZiN3ג'} B䔆 Qg-b{V;E ю Y~dN jlŠ (R[_x~zx~z֥w7<`ecvKj}'B^M㔖SPCH4@7dm+TqBL>-)?]< zU9":('E$_Ip #YBB=CT)LG".NES CPT7|FFbc'L*0i1b (T DŽ6bÙ-;^Q[&G@P(#(&``b'{VYT OZ4CFb v2YHd#RkлR0b ZLBj9@R1G,*f22;𥤎e~w.b1>^mVRjWYVvLcll n[VTj(((@yy9222" `ݸtRd'AScCCCFNNz-$^c&2===]{UVV .\`j @ @ @ @ @ 4#5[ٳ'uuu+5fXpy`xx ;wXiwIjj֮Ν;aZa٠-VLjݻDgg'z{{9`~jl*,,Dww7~?FFFpi=5fZaQZZO>D |~{ݻwPmmmhnnƕ+W" kmm QUU֮]+.K5q1>  @ @ @ @ @?ObBNhIENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-list-adjust.png000066400000000000000000007776151414302661500272500ustar00rootroot00000000000000PNG  IHDR 6wgAMA a cHRMz&u0`:pQ<bKGDtIME 88IDATxwwtF9' l0 ˮ=new]]mْ-aFYMΡs==H <k>S]OI۶#   b4Rg]bAAA5UU#N#I:7!No}ABB   TU%J{ІqIK@vՊfZPRYAAAfu UU~wZޅ.Ht @('b+2=Dv!:HmoԐe YVu ]Y{/Wґ$ YVUզ+g$IB>sr$I>j{)۞C_d:wzI*wF9.7S< 4MGUUE緦HkIS0C˲Fg/G4$&YI&3wfSnlih0`# iɇ Q*gΜ EA6cF ܲA1~<ȺuZmrL'(OfӦ 5뺞;̙N6lXhDut]G$cVt]gppg?>UUh6xfϬOL"7e:2>>bـx]|2|x, C"@`08v{b`ll~ l7p8B!&ǎZz{{~Ȋ+|={P( 1>>ggddшhBT&'Xv-]]Yt gΜabbN6x&p $ T5hrDXM__!| s;SSSb4l<hJNp355A48"_7t l◺A#M|G?f |Goo/?Zmvn|@ee%7or122Ÿ]V5\ :D>Z[sSSS(CCCw GN>Ν;> /nd2}G8LMM__!Ip ***0I:(ϣPRRŽ299I4K_]vq1(^SNsAdYnTU>رc]]gYj%۷nr=PZZ7Ç"Hpm/t&&&ַCGG---裏100@CC8pC]] w>n&qS@AxG4M'O9fL hQ+VHee==r 8{B]%I&ԌnG5b8w ]Ws٦bpIV^MSS3{&vI&ȪL&H$$$ҩw}uA|G|G|G3]u]'J%ٹs'ǎjE__?~/|ccxxqqx N8j̙NFGfuv/Ol;3H$Boo/`M ݻχl_[9q<,䭸\.t]# q=D"Qj\Z#G~'׿${cbbl6ϟ…-;v{raV+==/N,\:N<//[dY&osqlܸMXlinfΜ9'>qq뭷rW2<<’%K xݲv^|TVV3ϒNI$=zX,F"̙3tu?L]]- bHoE O+444zA$ tKfG|G|Ĭ۷i~tDx T#IX֯_,<3x8ɓ'im]D__fEy)++errǃj ' |ujuni*#DQV UMNKa01f$IBUUL&cn 64+}]׉D,ɓdRv;h կMIܺOUTuO8p׬ gbl͛7:WfiX`>U( %%%RXe/_NYYȼy󨮮eAn`0D4c|MlVhnnKЀba]FQd-j[?N:R^^AA f&V-rdb in˨ qM7vjhm]Lii -lRP4D"jkkihhEZq]̟?P(²e˸曘B4*6mD]]FE\Uz=ZKH$Yt)k׮V HbZ[[bR]]Mmm- .RV+˗/gݺlڴi[Y,]Ō[ĢE Dt6lUhiijXt)555yWشi5n ‡ c0e)oX D0f+8GeR$ 0>>fd2纻g?ٻv{&H$͙댍iv;##C$ l6+W:vHW4F9gq'X׈v' |4 t=3xvDu9eG_M>ku4u 6edTU5N:FQ2d#2tIPI[U\TVVLg-6LeTu& 3\ X,HN}kNWrWfkv Pez@)s=w5\]o2w6yWH$3~KKמ iƉ'H$#3o\tRFE_Ma7d{ }KzwlV{A࿋2GUG AwG$lzxGߒ7UqAAA>t]gjj A$MMM[AAAH$>!n6AAAAC a.u&Åv]v3|\ ,N-?ȁ   \_f΍r[,QpiZnt]EQ JJJlsNd:fI(UUUMN*ͧi[ΗH$.;Rw˱>WAAA)7,˜9s=z@ $L{n `FuW~xSNaH$X,|Iv;;w0-ٿKe۹9z(|>?ҥKsu1twwꫯ2o޼t.$Dxٺu+/]]]zsyMUU <,[y[$IAqxG(//p^#I{/xλ.I~]w݅l܋ۻؾ};re1 Q$Q֮]W_,˼+n$Ibxxz UUٸq#{Juu5O>$eee\qϹpr-G?b(< h344֭[Hę3gꫯfl6nv^{5?]wE4`bbV6l/Hoo/uuu,]I`i6lE.XVdN͛y78z(.뮻YI&׿e߲e ۻ   ‡Ԝ]eYĉ{=z1sO<(v~|ZUUmo~& PXXŋ8t]]]K/qYǹ(,,h)I<,Z( ǎ8N^xXr%6l8͛hEłbl6c9tPnݻwkNGGNBQFGGg\2d^~ӟ244O=MMMtww~EAUU:::Xr% l۶=?&    \:s躮3ou]g…|_ _fMH$v\.Wn,l6n&\.>(oM<`D"j-b2pFRWW_O{{;/E4">OpmQZZJ2$HFimm>wA`0`61qq\AAClΈbPUUEII vNÍ7ވi`Z/꺎㡲"F#ٌRRRO<ŋd`` wJNAAnEfrظq#NdժUדJxgrϫ{^,ElWwǃXP(=Ccc#[lnpxb^/SSS$w^TNIX,RT.xe@("Lb1]H"@eFco@*d2JF"Vٌo~6fG7LD"$. Y ù8Xw]X,5ٲr˿]׉rft]' t:IӤR)nnVp8#   aKg{/;^tͦ8w[u;fs~4%ITxbv.  !'MLLC(;~5k   ‡!_<   GRAAAA>    AAA@    tAAAA0\ E6lw   >Pz"`xx;EQ(//AAA~. Kiڜw/[-+JQPP@}}=疯Ȳ<+iͯ,h6kdO7/]hc~YJ,{ۙGfN;]\hY]h zȖC:3?ov /HH6X^Ydyen}7~_˒ 8>%IBBB չ   |(7y'''$`P%\ʲ 3g4%Lb2f}spgtM(,,De&''`0PPP@,chhEQ((( N344D0nc4djj ݎdBQ4v$LNNb2X,099jb(Jn4Y`ll ͆babbbTUeppd2399DQ8N CnyObB*:fd9QS*+Y_hU@@bNgn>А͖ce&'% tIn pXn׉%dt=3L(2b<:"+N_FňkDQ, a1d2ҌDFcRL Z|> vւ  9VSy=+OTT]/soD \&Jlp𠂮K\zns#?su^Dɤtoӟ+p[$dIhBo$¨Q1|76KJK1b*>`Aƣ GѱL&cTsAAAh~=Ɖ'4551::J<fD0H'cZy9|0 Ȳ(D"7'a0rw%I"L*x<֭[9r: ,`ppロ V\ɩSضmcpp s=JQQ whoo#NvI<쳴Ʋe0 ϡCػw/%%%LNNrO{{;-^?yny?g߾}155/K?8uuuL: D 2V=il(($2eDo7f7 TWk9FΞU)+ع >kb '0qjj455 PS[N1$$Ot<]EǘO17?g~©0Gl&۳eeJdIf4:ʋ=/rlGƎZ܊I61iH|u`0 wwcxMLͳ!h9xPa`@a" -|H&%FF25Vx%&khZ^ΔcsF*FA3L:F#ÙVD zMyi*##Z3m&el6^0֦PWYn  Jٜ S) qv`2,(B0Ĩ &FGQ$;,Ztt#h`% HHi)lF$|d`?ϟ}#cGw1;#92~;ip7籎2(_}   g⮪*k׮% с,tvv*W^y%8?iȲŋ%K0d}cݻ)lB(E׵l6sw:ַc\tvv0oOs)[VFt~s388zu,QioW((y1NgL,XxJGDyFuFG±c 2) P^q-)%^sMI?00 IiTV<)S\sI^~ـÑX''>j`pP榛R۶X6,3CX;(PC+jG~Nx:dRSl--% op*hCU]^EAyu @: ͺetvs!E$OНܭkMӦe0"˙x{+T**4}ֈǣjJ<ǎ)|2ݖ`}W2A  2 HA'zuR)ز%OPL*ET.,ݞ3&|>d6ok]pYDehHKf"={ $PU15%s ȢE*+W:a2x%*4yx-_e#r/3O09X\`?TyyLI)>5Sϟ}iv09AA?}Z"`|> g>úuؽ{7hX,F*bͬ_jjjhhh_fL&9|0x7aV^M}}b˲h_fFcn;vnl6c2rw4O?4h4 XlGD$WUk3+phqy(]AJGec71)&"W`3ذ,)YŨpx:g&3[x1AAQfnO b2dtt45[uL&S.L ~?d׋dÆ lذEQZhF0$Jt:ɓ'k0' ?:PP(.NsС\vUUh4Fu6mڄituuǹYhne˖qYg?0>`0H(:\s /v|r9y$mmmXV\.>p8@qs1f1uN=f\22fÙee:g$nFO|"Iu*nٹ3Z,: +Vxc3gi8sF!UfOQW,Z~}UTVX=P **2`ee&h_F_CflLfӦ446jX,0>.KD" 6 dz{%<X@4X,L --*'O*lْVGV!# 'N(\aCA] dfW7fQaANMfQRP`Ukx,Rj=C{0\[-6 $gp::#\uX ֙eÑ#HZEzI ʩSh huuHze%ʙ3.W& j)kVPikS4((*SS2*jf),<2`2e:%%)kת(JBCCJz̧ s̀|i3&Sf 5NTH2UVfk6Î>dn0)WPb"6AoʲG90zJGqԹ5[ [jMGq49i4t%+2JG%}>EuFԹxsMYÖ-4hkg,:u Qd-RAAAx$w{O*jxwrs_u߇B!=2β߮]y;yK&Dsr'Jڥ0: о&d2vnzZfvɟ._iKWj,YtmWx^}w-~ުi䏸(ITho8L\^WsNC{ϗ4\vnN$| ";z~hd-!MmVIRN[Bm'BAAA qfF sDo; ;Y\ߝFr[YN ml\\_hܴ ޲{~`xp&.[%(p21 .B{4kil6wSSZ_;Yyvr  aw;HRbu;/[|Jw_EI:  ¥exIt][.]A5h+MnAA{gAAAwB    tAAAA    |\tcw_kk/FBBܻ/ =/M.]>`~X? Cy(u* B!h&yf3.t:M("J 8F#`D"OvdYjp8D"D"mNyyB24M# oel۱Zokz P"3]OYi,nd]:G: u@II;// Nh4J4E?~t]t+I|}l6^>AAxKD4%NS^^Yx)t]}y߹iLLL`),,|y$ PVV H$H$2(,,NR) @S$ v >AAt._,_bfzw 4MC$MʞB=!};u~4M PgB秕]+@/(]g]UҰijt4RM8H<GCCddd444]krmյlJBM s:L0>ϕ+3Δ:t:9t ,q> Up\:t 6oޜ (&''ioogƍo>$IbŊr)Μ9Ckk+<8pn7ofbbCN)..fƍFN>M `͚5tvvrI.]JMM hFYr%nؼy3&#GCUUK.՛av]]]̛7Ʊcp:TWWUeGAA|oٿGGG9}4j*++s eǷS>z{{bڵ5Mc߾} t:Y|9]׉DQ\./䖛Jx'Xf tzL&S~v_-  \Eoos};wd``@|Ҍ%κ{3'{Vy}ٹs']]]$ [)It:w;++VSh*Ąg VJ%`ԍ8[X]AMT"c_]Un13 >dt]b1 sY~_L&GexxO=?x~?Nex#G̪T*|>q}q( 9~8G!2119}tӧ9{,F^x!."oQ!MxGwHnz*駟FQغukm|>yv;}LMM199Ɏ;hkk#N366F__?Oxel߾)TUeppk  ERt:͑#G8q>.8AtttpimF"`̛7oiʼ՝l"IEOzq{9E5k>]h>rQ:::xW444PTTĉ'سgμyf=wnioU.Η뙻T| • n(B\ 7=ϰgt^lk+%L%:P};vz@MX]ݸne džl6g޽NSS6mZZZxWhkkl6sWr\98puE"(//3 ODoo/EEEHehhEQhnnR:ĕW^(l߾#+Vȑ# #n;7آfppײk׮vލpWo>(FbxDZlsW#2 ʞ={B Ɛ$grβQ'ID"6mľ}[gmתcu͛1 |;atuuQZZÇ B(( NdX,Foo/|Sb\uUok AA ?I>j,'p5PTT ϝ>NFQD@ @$/4ds=<$ Nϋ( ׯgD"~pً\hF8&  qTU% seJQ]ٹs'w}7|>~_u9{iǹFCaRK) [bƢchhGM&vTHlCt03DWulX++VL7sLMM#pUWQWW>?h=pqz d{6lݺݬ]g<裹 pw~v ìZ6ߏ$Itww399y^:;h4J2Mv/}M61::0:466UUihhIؿ?Ź.pT*E,]H" #IRnwYٵkh˫J$:H@$9ol˲ǎ# :` YYYɊ+$~~?Nl6s-PPP RA-N;8vկijj:/+轐%KP[[7p jN C/| Ȳ|}48?8He˖}{n}f;o9,vZꘜ[nMsWc2榛n"HZe\bYz5fUUq:|=;|캚b.#swh2Mnwd/-d]kv.,,*&bvyhG$ne9ו=\>]-KłuYy NFNK:&OME'tMa߹;t^:Z$IXU+Յo{kaF60 B,`>?޹ld_(+pwznFQl  s: "{~'IfE:& Js Nɔ{^,FƎD"D"wtB}Qe~.CӴ rG;l6DO̠o=C,2M%M|cحv ɝh4J(w۸f˽_L f$a4EDwAAf`ouLo\]d?if]S]R;:.||]:wAA-Gq]]aIKAAG/AAA9   z'I"ȥΫ    *((d2nV.IHYq:SAAAAx$Ib||ݎdʽ6p8L$l6ϊp8x~}vhjjڵe˖!2[n;}x9p%%%l6n?O*z_466x8x QK]Ԃ ٳgyxW$񧡡ömx9ruuuA?Çf s,}8x ˗/g֭x7|Bbox7e2yn8MMM({Yd }}}<ٳFiiinyPłhӜ9sR$I"yq%ͻh"NFFF8pX4Mfqr7sYd Vq/2===~|>H-[l2ضmСCz)++|+lٲ0;v젷D"AUUMMM PWW__rJ, ݻ}s?~|A/| m6v;+Wdddd2``qڵ~X`}}}tvѣG"J188ҥKټy3&֮]KOO{WPP5k&L"2+V@UU~?*˗/o믳w^-[FCC,|rt]P__Ouu5CCCA -͛yꩧHRZ UUsǒfN8:˗388~1>NGGX{6;F2dϞ=رՊLMM$EEE466RZZJooouee%cوba|Zenvn/@Go!}vTU矧NRܹ'NgvڅK_~;NB48Hߏ$JL&Yr%wu+V !Xf ݻ{nsϿ*I$rn6eKU /Yr%k׮}lٵkop:߳ݻ^u|M'>ɟJ%NssWF*"͹5M|d˖->|'?@I;& …$ x 8sG+Yhyi8q#Gzv9s 6p]wB[[|_oѣc555vmCaa!\s 7oĉ$ .]g?Y:::0B!(Pt:͛oٷo$Hi&>Or RԬ<˲>}}!tUU DB4?Ǐvn'PWW޽{y͛73|&''Yf #o>ZZZ+W^ছn7$Hpiz)zzz+b߾}X,֭[fcŊ kG̙3R[[Ν;dŤR)>LOO\{ / |t}ݻ1LȲGHDQQ,LMM=PqF-[tRz!v܉l/W_矧-[8|0eee,X@<ĉtRV^́hooUV+m6X` "2L&sUUFݒ]vp\xYx])**`0066ˤfJ0L shzl6299,˹4$8Nv;PH*"`x>F<i$It:$0sM0LLLJxx<$I#2(Baa!Fb2ݑ/..&Ju˕/ *"rK,#i8bBIHR$ B! p$ &''1\.T p\2]$  1 DQ~?n;N8xݻ?/N(A]$_̛7. UU/uACIQoΏ~#~_D"׾v" j;w/箻YA5Mؽ{$mo\AAA>>ft^l ‡j^l ‡jpNҖ|>_nIrz/z369F4RgEA>FGGZ·  G@xw_|٥Ά  |蕖\A.-wOD& \l   :@G   v.   "@AAA   AAA@    tAAAA    |]AAA>D.   KItrĻ!&431W5SfԄ)R(o9IT%vdkYrFMݜ远SFQds>b IIcd})vGlHÅ(ZN8Xc ebUvg#1[Tte ۻĚLѣLPf HErhQbX C cWwpYϘMTωI4ց0Ҹ)Pr*g8XNhԖH3nZOFԤ 71Zj,dDr ?] ` (3G1$0XR*KLo<0LW yCa};A8Z (:$Cjec ^bBFK;eJ4 ~/`]mLac(Rz9Kͬu1 L \Lj88aю(JJVP!`;&7{4.lcH`r 4cE&&ƨL09:VS~ $qqurbAQHiψpE; h6LDQ6$رzlT3VdDrI ^8ʤI0((e]FS S2ӜtStNlB>gZAOxHFS%$[p\R2HO5a؍sͩ2ZiIcq-ndp$QGjJ(v0En=ͼ{KP) + -u0%]f&nB!|V? W%C-uxZo*Nc (UkeL%%AG=̏,(8L̢33>"RMa c/5Z""M%^F-SMVchiۨS㰭t >މthP#5TEMxѵDLcMv`)DOf",.CDt:*T, wrJ6Oob &=&I4O-c7݈MC._t(Ի@G3:j?0ݣpSXMANLl$_1v9(l؁5#ײ0zn8MgRDvDGO aFVcsL7ӶZd$`!z%J vB6#Jyv!9!S`})z[T|n℩ea5A/-2:016f7I(X S'ҭx'`uRKg5Ƴ:D.SuҌ_QjF)gVCĄ%bg1v6X'Xd,XBS;Z?H_sBgݸLգNk-}Tcؽ ß(ځc9J$Ij˴9 MX p04%NƗH,eJ$YxG5+I"TI&rQ]2n5ֳr*Ihk'݀sA;#-`3I6Ϧ ĊXcH"ZZq$4F1uͮC+&M4p!H~;r!Eg8k $JXD- 06>KW1KLEF#Dee/QiTYS=SZc]9 S,Huk c + JF]CʢS:`[Ι5 ?Ic 9& t^SՓ!2ZjvJ[3n1w[H`҅R6JѠBw5ªyx!K2$2D8^DiQxu~|Øpi!EIA)nS>dVcj>jpTaI crJ&,#Z맼(ZH^H:F{OLڭXhC ]-9{XQto -jHvע$b˻'zI$BdSg'p౏ўt*(ǍZK(tF;ác2MYsǫ 7]gx+7„0o"? Ǯr$vgG2W sJ7?a7Fݫ|\yضzS\e1jK i'qr˸grS/99{(q]kf!8[(IkenNqOY(S+:ˌ>;[]6ElqN}LU%OPg_sg\' j >m}-(]2W"5 ]X;1u5 8ٲ=>PN66hu10? Yk/65ԕuE? zZ1g?c9^,ȇq CԳZ,8Ou7бLca{Xqv?ZIe~NVz4>Li+m?%dUwǞcPlq5L]FceKH;V?q)ɀ{Xeg_ෲcl0,8[ vx>՝zGJAQm -f*Og)˫H ^}5FA;\̲[(?K9)䛧rˊ'sFy/s&~:V QwC}'llT*2 kƿn6E[ATu\͑~v\O5̅clzi5^eV3,.Nxk:x nfɩJ-) `ɡ4EvTsx(عz ||ŅYO\wTTO-ɉlb׷м\M&-cڽ$Y{fW]|O }ˡ2>6p!vo獵eRήRaf)6F%0>_[˕aĒݴ^OA}#w0AZ}D#Wʘ9x Q߫~FWSx2,v#)UΊ?=}e/ƻV4QVQXsja{i7o ~[*m/*2z.P)U5@DOɏxf w#R[ ҿ"eNKXxH/ p?,OQxcu]*FZCDEFXš|c+"Q3C;F5?r~dU'`oZ6?i)W65X-~W1Cup)ztk~GVLz>S +2olDqшu_ܱ$߼vR~[8nib*]LI4gǼ wc&"+v'p=氁_yƛYfeC8+{|叉=Oxe_8xC+yg~W4:Yp/y"D{xy9f:7Zg֛<_b%*NN~j ^o?"y<90͔_Eט3g;7أgŏs 񦾙d+϶P٫Yt/B'1,>xG $Fx E}E_9x㬋kI`˥$MͯRp'wO/}ǡjݬ q͕\QpVΫK)~n(⚦R|]/'ٚ;^hNyXi} gX}͋eGɩ$u{Y|l5ΚZ9>KuccŽCt %WfKßĠ^S PFsgSuvNXjُ*KtkT2u1h8u(6)|kU) ?%t|=ᵔۻ hcLm,xMைYq:H6ř{o-6pśI73~*JDXRK;I4Qr XxNqP_3֎Rl'd7_裆j,ψ5QFPn#ۙx iSLFӛN*>Szkivi!|t9%#} \LN60T_t>ʳb8ʩ/vir^MOljNs#}.z%!)*՝nsQtQ3RVe o ;}^IY)&c$smgyi>}+aykWqL om[ֺ}h-{7a_Eggt YЦ$ I2d ddI$i߲" dYe IVPdP+ )2,(6(2,(e$2Is˒LZ,旕JLHi2ɠdKV$ο$I()2䦕sNEs̖IΔ+t%yzZY|^YΫd~NCVԧ"Ku^̏WA2#˳A$2u!KNN䗯WD$9e$Jn_<,aqdOLIgI g+OI.[=SNMRri+䕋+INCɮsd3Wn夐7,O>Jv~ m\gl̴Ay\ L)^\[e6ɳk/y̞_r/2ƕIOr\cRm~wHR+R^(2Aʴ:M;$%N%YK8L9Ka1?if;ϵleKJn?Gi Q^R^>&︘kKym@R2m),e!{!mf5q'{nKv;>NǕmzD.   o{8̙3$IQӧO#2MMMHFTTTd``/z    0?O0LBڵVmF]]Ç9~8_?)l߾NXҧ#M~@Wy#:RwI&//5eM7KesS Hl䭿쟤e2Hӿ3.鲔/'I4Ч=SV͉K眄[Nnl-$ܙYrёgeإYJys~f'grG*\=up^fO'& f?l=M#i嶍ܟ esLHJ=|Yo=WbJpNm&Ը#ۆtIlMʞn.lM6sr%~ٲdxfYYd٧^\I:&ʹ!>%XnԳG-2M_^izINer'K}VϬ49%%MsvyB~KCs_/񫞗D~g[:%?M~y.gs>vf5cڬ$@;g;ؙ66X-p^ZyxoV'ܬ}+\^R;Ot$mد^ uT?w_l<֦UdzUhyc}^;s.}&glC~*Ob:JyK:J?)/Ѽ5k{fM۳.LЧcf=7Onl9g 4?g-\䷕sOֹ3??Գu$=7G]/0Sf:ya9ߏZ^^;߲%90.mR^udVo?s4g>7Wni.m奯gC~Yf]%/͜/.Mkq5r1YO^LݞS4:BҦm"[Rw28rfϯ߹رcկrwpWc4)**@ @"@^)]ѴӁGRTTğٟL&}U5@jRK+7 WmdH"б|RmT'}<]9[?C=k FьN%32-6f|]: h`$cTƻL;}> &>u/{K=>Lo!εs8{M:syiZ7de1BhPiro Nc|];'Q|bQZ+~>}Rjr-{|ihu"ש#DD3fyp};!fz4I*'2-Z걺V;9TGa5&Iz޹Sr+!Bf|K {ijCG9|EqAc'^hQ&#E!N䘾u@1Z7K\%'vÄFҼ:bcc&*Ff"Jau>kG^b#8T,;0'{7؝ =lM|#ex26dhGh/wW&.DYX^NpF8DgC9IJ>ÞgFP#^oS{z}_]z8 [([no Xps!!W; ./X07 t7FX3[TqvEyMIFɶfyYI43s{1Jht2+^1s^C^>HeK).zmsǧ>IhdF,f30l3CH=t#On.#s\\V(4^yqvx7#G8x#4Tltri/{mr~j\l>Aw~Z`jLT"J/9t2ԃ6bũ|0EEk t $f$<2Q63:Q¡,3h0h'{Z 3[y2/1;z?g P l\{/fANGk+ʞ/G1V8m+U'zm,Kdj]m#,o4apn_{?^Afz5&wusX6αϒK{*ZSE7}=\c]#zdBIDATDv5;^(7.AiF;|m("5FM)B&8&%1}Binvkgb%G(ٍcT88:VN-Ν׾=mVe`#f D>N5y#I6V,2B5I4Mlσkiewɋ`3{yW| 9S`##ݨp `*vs}EO5EWX7LVwl1OS$(uS yx3;{ KLWKZ-J]fu.Y(b&yuh'zӣ#1ju8;Bxa0o'"tq8go!lz]=u$^^g FiT'$ !s8὇@B3x`ڷQ$+3Q3L NnPqV#VبSÑ&^Jxn߇tW$;(%{Qa5iźttɬ!n8N[-Lu {>zņ7BMRyI\. e(iPOFpmg38AlF`Y"2Ț0B9*f M45kT @RJ`YJXͱ'_ E\옆2޸#8*4}*PfXC0MF}u0#Cw(D*&Uo!ګ>H>w=Rm5J$iLË L231)SWai)LASl{홬%4"@Eӈh%b%pĻ=0RR%҉rSF beYAnh21.qs9D'Flޝ#:{A \፣Qx)ζu,R/O Z"H}G+e7m# R~mZf>@و-H :͙ Qc&!F*!ꑭ,qg:ȁWÄslO GzIy6Րq{OYNkk+L4ۇ(d)0 6(h75FqL*!d;E(iMԘ.Ven1rS&ۊZ&8m6tIfy_zYSd${24SQDH%옳ljMk +.(J1 lNq>̬KiD_(xn= "T=Ew-_>jXgfߑ2G)Ax;ĖS,xj:CIđ6=bcQҌwin IƘLVI$6ISLhT)vG㟦=Y?؞Q h6Tuo.QRt*Eh5j-e (n FG9xCDleOt]:fX o(xK7fpm _īz4m{z[]il7h{HM/i!d!IdnBz4bλQqS[1ה7G1:~pfkXGF;Q=ψP#|0׾P`;ovX26<ގxi{4zYdds2Bo בd4q9 an <=FҞ*Sbё5Zhߣъtғof2TA¢SxeB fz HhI78UWS1t_P2I̼{^YՎR0..0RDm#&*,E9dF9tzk,ڹ]`vF d]f}_,Nu(ũTS;ȎFFx:SىGY*L- $1F >2zcguS]6B*c5"Zɵ]kaӰ|0H݊1aQE$qMFM8dcoHXԖJfdp.z2OߴeoSOQ120Ӂ5|mLCi ë4F;$XvrxAۥ3.NzAuEW!;nhL`0eOٜa 'ߝ+v*6;VKSFؼ}9ntMT8InJcS`s&aP*7}ve*1k* T϶~:n)TJܴHG݊MO47=qjŒE%J@H]HV{;Z1;L`TL'A杻"[I/a()mF֔=+N6eʛ>o7=*ˎ́[e/س觟_?Ke.\ZT BgQZ__XF6}cX[vلtyX %v:0,}~pY91 U'DR);z2mN0|´enٮ) Cʕ%;i0N!eurtЍjhL=Yc;g 7}Ź΍{banZr:ރ)6G),89XeM9.@!N^J[[-kf;~#>OGwd_‰>S9=Kr]2Yd/P a-է㖦Q8G(L۶ߚqr$?c?ٳgd29s'Ol6kN:EV_ɓCwXO{ RD&TH hB!Ht/(Ia=sD /Z%MA<44a?^`/% 4#BG~нАBCݝ#j#RIBG k౿Qt\jБB"DJaVJ4 ^ ! Z4t%~ֵWR JJ-/O!R]`i֙URٲ )4Ape,DHCj\4АRlG KNu$HnC!fMC iهf"}!5Ԭ+#&,@Zk RkBt4۾H/^’ 5֤Rh{ V`fRslӝ=_[GΚD>-VSR(Li!΅5GMXVdهe){AG[پf]9}>92mm/lh_Қ),]J>bM7Hک[B"ryHickl2i.XlZ %Ǒ +6aضւ5Zkvxn+{'{,YyiJlZXjA]i&|J:AWl\l zY6RVp om~]qךlr8\ Ms⍥G/\vږ&E[Rͺ^hKӰno;ik4aekK kh[jMhʚ$6;[ӕS> )4MK.1J6Iaq]צ,ъҍ^mW$~ccgRJfSiH{fD}iNjL ) 7;iXI'\{9U]tlrރHtt{=~eMʲWxm)|ٵU'J@Nsč;d_ڬxds?)]fQ;XL-5@Zב,_|Z}-w^O֖Dc\l1n ;V;1_)tONܸDGaKt7Y1čӎo9{kv &ulOHn}&ݿ56pn7رkك|(e)R߿uۯsqc8Ya\ɮ!}dsBi!c[ߡ(5%~N^N)<$ܺJ)nuCUk{ʊM]:_F7DZ~khiwOhEU|/Dx_ˎ'MN5$<êY7j+yQ]V0$̒{+ {mI '%|?% BtrWrhG$XաWe˲C= neU^֭[xNO|uۅso9G}rʠm6t[_rۼNlrE{L ]bnQ]w|NgRd ]}Թ ˤD;Y?+UKmr<՛%m:*|6&FM̶BkQk)MXq:5Omd1dϑUEJ$n?Ce% zfU dROns=vXy:-s5ҽ g|-6HwFy=K+݂bR}j^vHfZdwM|Nangh6[t"P-. jWP,r[A{>L˫/{46v Jh56(KKYB?ߦI? 6Weq@cC|y`;ղNVo5kfؠ2j uȿggM+/rY2.!oe+ԅ=r9M8Ǖ-iTDyMKu6vnA)nrڄ{:J +ׂ;k_ K|U2ORZ N!e;w^]թ rWi63d#VlMŻMVVt".clx]GҹXb (QHzg x** nVYm lowӃȔ;j=E0GYBv1O,PɓA*7>#Iܬ?IBnJѤW>5jAk-_'u.[s&ZɲߠjRv)3-|t}qM JfiVLʵ{ٮlSepA.()IH/r|wbb_#B9ʯէ~S@H^i mU.: ׄ"0tTN zDb~"Y-ϤRoc*@U;=POh.G Rߩv15uj~8u&5­&8r͔vj0 .5JXvwn=)D (QXPb 5np;'iY[4Pe2XcJuN 鶗Uolv[ غn[6ZYEnS7v=Bv]Wg*ͽOcr&٩62aZ:׃5_/OA~Li&ljpqqjQhv$wߏ7/81u;sT[>L m!VU M&~9ƭsQЬZr>栮{7#\K}Ymѫ4]_Uʼn;۶wՉ+|(՛u#k+cǕZMgߏ7|CGVJZ7yk׶KҶKbgpP^0ט>{C([R;Os!iuؔ㽵ۮp ޯ p1nv8EkdEp+Aٶ}ڷTjξwe`ۼef|K>_ow$Ŗ{?#T'H(SsĪ!uoQ܃\ݷwd;pª?WyLGÿַʾ@"`zvRhχai('% ihM Rx"αw6C 1C 1C 13=fm!b!b!b!>C 1C 1C 1Їb!b!b!C 1C 1C 1C|`x@b!b!b!bo C 1C 1C 1C MoǬ 1C 1C 1C 1!p_gЇb!b!b!inQJa澟nЇb!b!b!vl6G)FA,{S}!b!b!b!ipP(>IC 1C 1C 1Co !b!b!b!&>C 1C 1C 1AHmnӒJz{ѣaEH OCGLq2&6"یy؞@K1X;S[*RQ*ڄqhFѡnVJYLE̎fa^s9~Ki0;0Vja(A 4h"x>ڵ8r49Y$#ƸNxJs"03Өhr.ח^tC'hAC`4Ro(*'Dn'Ygl Ӟ+P7t'˄:mFe I1$iM4FmxJxVAZ!EnKlsT+S!m I0 (ގ!\.22sf2=9Q5blO _EΠf)A?zN]I2Fr~NىtZ*t!uˆ m 5W1֡P!Fk+ ~"qQ F*1mxzrnMZO-*${+(|7P!ՈҘ nv`@S5 8!YnG~5dO~d³E8IwͰbt&^ إ0jA:m|#=foaAH)17gKDz j>vv7LtjDN&6ۡ$SтVo5x: 2gZ*M؟Gū2h c(B&3D[[B";##DVnM!)'hu(M!.Þgz3Xl,m30_,k7)u0f/8Q@HEZ@ AEYm{E W4s1xA~Tj\Y Z)th@7Lrܚ 3,3j#:RAswH4(12FR_}<5cm/:ay:3U'S1 d>ݟblOP덠:^fwq=04[|5*IFAb6EbP5/+Q $Zb,0F9VER=Vhe |=D!eQQa̵)TGP4Ж -v"]IPDhCdXH`L~b ī= `G;3D1Y$t=* N_xdʓ*&j-6ǘJA%Q^@ƙPzH [>~αm&[ERqA ?+t Ij^ZHc:d6;Hɋx}U2=As m/xPM0:F'@vR{6N&0SDj&cdhǸrnEYX3ƛnk`BB+htGIIfM<<45RWR{4 h56fD;M/e3AKzF`v-NӠ"xOl\KM(@kO`&'܌MQ~ & 0:<~Zf7B%--=| <[ :'5i,twXڭ?X'ke jkD[}qGcܻI-38xZLj7KGiuzk#=#WE1Z^xFRXkc9Y#Әg;8Jh$E1$; ( B,Z]ᡜg$vgI<-I'PS4n'H[z($m8Z#r5pLdsx1jQ9b%:ף79m\F{훣',4=]Б:6"MIUb[LRengIRMkokFxLV+K-|eFǏ%{O4I*}1$I(uXPy4؋F(zx! QYF(C0aĬR(ϓ=]fnH}:!¤aSlIGCT^Z{2hXKiӈ;t*k+ЅF4" Q= ג\½k$mS[DW#>i~Hl$~-ͷ6?*/}_g)H":ws?Goq^{*jzru_ UK|穙S,OB';ƋBSS$o0 j(,}+Oޡ V qnGZ:˗oᓿn~ ˅sǡ&o{|Kp;~L܏g6v3^shmA>A׾¯}_3KSs|)B/ 7urzk3I?ٞPs7F9<ۏ!3*NijAY|k?rJ]9/9sӿJ{/LXlx7EO>o?* OOr;vv߿ʡG~קh p[.4K>{gƯHY$LdrU￀W)/uor|ǹ>>Qur K{U0[ex׉/Mcz_KwSe.2WW?ÓFyE~7TC Ͽ$G'_䧿x+;_O湲:7ޟ !>Y^N}翻ͺgN?M~;e9?.3|petCSo'?JⅹC|KؘY_KF;cT枋.~K/o=nh/KW 4M d4_{'8{G{1WyK?qts~PQ8aY{Ļ}#|}?RPIw,w:>?Sܸ>w_?:EKdoo4P)faN_&Sw6?hܺaĽ79,>5ŏY'N#1lk?|YJmU7`hM{}Gx1'yϓ_rqAgZy|Yw";G^'^4y#G&̻6Fo|񩫬7NjgNβy~􁟦:֥[X<4sLio";<;z|ş;/¿l9ˇo¹}>o3fvJRuOhKL]gѷEt\Dž[]JygSQ8%V/|þMY=ZS}u|Wx#M>6^g'~c] YzչZЙdcONP~̬kwI9#?;I+ae2;8K4zS_qp5^?8u5N?/3E~+6u>N4>1rk~ kI<;q*?$f_o4#rd|cޙÿ_6d?ģ+t&~s#ͷE2WI5ip$Sڻ{«Sܯ!o1zR?U@Ty1x? ޅ!sB\nǗ6ŏ'x]vB'ŏ1Ìe[ͣ}xtc4S&'oWJ/q\_\ YoBce~x:y 2sv6LC|g-P1qR>g~̇.}~@>~g>:kaf_:O?˼uO1eb} eF?N_sF8k~]-?ѯ A/XSjy:|ctMq@n{ƁO/~.󋤎7?ѫ>?d-+I'vZ1u>o]|gɁI}{i~9bޢT㍱EԋS|ϻ{‰9~/vԕ,T,UϼIük-;';x=:h>?Jv o<1[ߺNC!>-x9bl*(#+'~n2IsF+#Բ<}T _o-<񓿴1yo]`jn# ++?ͻn{Jۊ̷3]VQΑ|mܤ mce~k=`Z<>_~ǟxYnv+ʧJuO2g|6ta[ ^k](WOܻE:/a{="z S_S/]~DKwPS N?\#˵ 'lO _;8+SK}YC9*~?'_ /-JefBL{7!FAws'WJ:+Gns`o=x㭂;ĎwG$ s{:Jƒ}LޗY>}Md_3˫w~'ng.r5y9 #Gw𽋿DAy&M7', +,W>\9?H:$o9/n2Fo-o#'~W]=ꯢ??8W*W)͵xgߎl[9ɵQI˷z?c\Ⱦ^yOO+*~3b$ߚY[.n'xnFN{Ρ_׌⏤yy8[7?M/y|7cz1‘>|/~,=s+ I3yUF_}s8RKY*~7;n3oo9*~ݟ{N{l>y=;Nj}o>b}_cXTwIoj78}ݾ~bZ/oJݽo /WGNoz}iwR ڡ+65cnmoUߺ[߷3-C_obqNkvfuuugD?طAޥһlBio 7kˢAٱOח[ؿc5c`~>-sq=A.] .}|~Hmsk@us0稻?~ˮ?}c opхٟ;i7ztcb__7}Tb.y\;ȝw z:~g?u/_Gߦջz}{8"^76swMM1.^gMKs `nN9p0wl}05F`oR __p6+}:0}r[bʮ`|wqwl'\z3 .y|g{7ow78A&XRMߵ7h<| {0n>A׃2e\ݱ\ ^{ D 7 pIjֿڿV.1Ab!b!b!bo C 1C 1C 1C M?s{aww^BvwwB0==R 4F4 :X 0HR4^C 1C 1C 1C|St@oZ|P(H$SOqRb^unܸ_fg>._?gV iP%XGsWU$B85 {v[a"Ss9ʴĮI!Lwx߿^`Zc {|51PH5 \GسSKAB4kJe q3~g"-71@~4(@}_Q2VְCJtkB*Փn4?!LRh&ӞBHKҴ@(ֿa 1,*aZ'N´e` .w (ڑҒ0k^(it}Fa 4ZӚ *k~}r D*%aB qs(Wa}u/aLiC 4:7R°ekIDB2M+K@5NmWJZHm9mvp=&pn#klyjg’# a> \Q¶eB- i[3m#W1PPTZHinܗcg6(%(Aʞ-s_]ΰbi.i1>яw xE:nVB|&H`ƟeH[Pzi8β.&yCHoM5]zhKy g[MzYXAN(meB؅L-Q 1Bxt[&BZܤ}xW"QUQb#ck";1B/1IX`Iǿ2NӚ=iat4(Bzeӈ%ߜ!]\~G/uFy R` .卣G 55hkZwrst24={?E1#\3tbmZi nu<xfi kؽPdsgxgG&jj~ NObV";#ȵiDcKx&RH 8V$ [N=1L{D"Yj9݋^ zdl; FQJEZXzHn%*>YypVgȕ<76МQjL*{f1άD /Ӗn4nr}-GuW1R4-"6lH"p.xl(LHxu{T"7F2gymLwNfed =<Wh:J 3gȊ$]zgGȝ1#JcA1E#j>UX_ ZL;F;}Um #s{!H9&uʥY|Z*Dұn./&xf9Q':AetFj?5rcֽ>}?yqLm=4C*.H1N~%F1Jg12ù{#kNMJQLaud#cD4=b{ޱؓ"; 2u  ',5wM0&h m]po doSk4+=>n&'c̥ꤏ40AԨzt &N|FS-uL 0wǠy@ :/VdJLxdǸ0\w_"PvLR ?R'\<2 YiQLu}u6|Djܜ1]~3mR(;<"=a#$DzUR .f& 4eT'l 2DU*_6hl,,#įz\.sZQmWۧ&ۅNUE3uXWL[ Hzzm@a=L3CiF!4^I!P%9bwWQ 9CvCf 3\b#2JKٛݼۓ#\/'XG>tkT]\%<E3ʺ|^t=ɬb#4/$Jtז9﹗R T;(an,CaGwYTY/1 z4TfBZ(FcIi /@ǃryddLbǪBQ{9ӻmT.9=FH5IϛLoje 1]@}k SC4S6£`QgPMc lb&YkW8J ^ՉӜV>Z0QB6Eԅco=J:I;B=eKD@@JD߼Whr-> $wC>4w$QX=գQ$nLٝ׃#:TqJRD"  !… |&Loox}YQh//Ͱ. 7G@`ao]5]FhKeƋ'5Lu1NQ:ʸLa؅l-'>BxlE瀞0~L sT;Qұ m| ?Jo^ avT+#%eKo'A1^V]r uVCh*Gwk\u{fv^7= rK-&zRnǓczKўj({ #oSOiyh/ϝag4WT|>T> H(Ve"4= !i#kRHhLܶrg ^RrO¸g1D봤}@.zz'NS 5 |X4ƶݺs<|:34{xn^JI/@)V{ nREG 5 $98kRؼAMAۨ/ffnKa0^)?t#w^"$>O8yEm⡡Y7@eƙ%VNhlqf\8H8fW#K2:2dO0}އŘ\2۠D) o4[َҌw ܉FY_ٙt| g,qiv }*M9$G1EXVS:s^뀮VБne8at:^}7P3fʄ N&{BJ7AWtvfKP?(@-L;3~gw˞;6z˧a䓄ex :SeX\6aw ZD|lh1u؜BoN% RS8B+3M}IaЛGtTjFujϼA57ҼhƳkq6VzD m$2濃W=ghzʇKT_xځu% lNU?S;zj]U#:@+٢[c㴊4(މbm1aS~EֻH._DXtiDA5;0okav44/p?H&zPp j|[.~bjD1jq^;Q%ҽi{!1-R1 7R''ϐI#;^zU #Ǩ4"U=[D y z)%5ʥYz 瀞#3I'>Ael堗FzB 5u@IgK ^]nhQk‡w HKgO+K|}>lP e빿Su{x@N87:}!]Ԙc: {`Ҥ 6DTb[3!eXVLJJ( 1BzdǥI-E"tF, cL6_5F37VWM LHa$d{\.qZ(uDuvOQMk&jl>sl+>&smz!MjEdLE7~Fja y5qH# \`8gj5T̹A/''Y4Hv6t7ˬ =ɫ5擣 ^zWgrOj1ސHfi̚,͸W9繗Rbc2̿>Zn CaGg  +EAT,b4%&Źwl s.GInz-TT.o)H>MuP,R쌓UԼzGyPNȠ=WVQ'4t4t-q~b{hiЅu@x_<ùV7HPNg |:׻#hh*ƻ_SG vis;2堗r2A%izG9a2j*3M%Ef$;!zhA}Nh>&9UY%2w?{@?ttW^yMVVVt:-o~x[loosuJ)"Jb8p>QrRM>@ dde;v ShT~{?H}`ژ5;% b eQOMINGMg9 8Nʆy?^b(m 3F/)fqIDt9GOUD1Jٲ,M'IusT})uJswq hz;NQNa \g~*S@vbIuT*);J}(HqʴSެ~'ޒn4gIUr@@u뤠)] [,+NGT8ln>k)VhҴSMW`WZ;tK}wCUñ)Gqoni :`I3%w'K20ڛ,OU/} ړSN]; a_'~pyN!in)vR/%;N̵54 wL!m=RBG24gJ+є%"KJk%Jp؟4@iȞ}⇝@Ҳ#'f:OQ78l[rC9|jtZlЀEfLmצ]O :)v5pXc[+4]B Iu[91~#l.c8+x؃cJ'g8*8> eaǞ7K?駸 ~&uO+wJ |mpm+Žy qđv 馝 ijrҠ?p9N)wtgwӵ=ᔮvaчtJѱ9ǧZrJlYR0#ls5t9:a L'׉7 9{iҪ/}mhB)}@B}Cv#GbYHEc=trW҂O+Ձ觮Kg۞GvJ7:N8e٥6]R.zOqw}q^v,Yvtc{ U-:``WۗiSˣv-%p-tnog'fySX{ 4lOqvvae' q<.S%t3ՠ?,//311^s}d?Sx{~nyg|={Yw\Mt !b!b!b!f.O~?ЇNءwZ|]D&$H D4 B"AӐDGCk]"5&%RJ4K.&a'$x@0Hº#@V=D´դ55hҚI4M DChiH)х5Wi@ t!1څk,t{.k=i)4nY޳楡 j/-9hHt=3R`ӗY+BRfAJ!BG%+aKY 9)&,} Kn5kBzƒsӥu&@{)%JX2B)R lYj=waJnۢBlG ]HD!t tͱ+K۶$t͝nۡ05&nfB@l[БR%kRH[o\u:!4Z[-s.CitI㣶}jNejFYhh]CB /_ߑDZd`٦6k~&9c]+!%' lܾ-_MDZ7MIeZCʝLOb]:|(.K,npYe(5Xk2g ‰p'xlsRSٱC`]Xl(g B}c:\nsZwb3{#%3R֘BGiNӕtmBLݿnqtۦ=.,IMsmAZ_JMKe!KD@h t mlK Ry@]°߷IlN+1ۇW_VLm]=4inﳜ5h>3H{`٭=GigIw/ҷyC8q+ {$4G{HkmNm Bko#־#oqǵ ] <w+tF YmX㢔X ikwZ,%lsg{ŠO@AR"Ņ؟<+=٣ˑڧ\پ k!=)4,;4}0i(5%yi'u4k2g1o|g1T&u +;<#42[Ti#.m j5ےԭzNJydUy=׮:اfiAA1D77Qo3b3$3jb 0(27cwCwCpSSuFT;tծwk{M yzKadbM2י~&>4p$3ns8*j {HhFtafa&rOǔ N9ʣģE)C;xrd`;gR f;H ϰsqFx݅P:|i7M̖*H<;\%_Vb&is1LQ 8\Sݎ&CNAKLVI(Nx|f ɬB-vŽ`BdlYFO@w833@gљADT2{0> i~|hr]d!͔Ї[e J& U${!7X\JV{Ffq"3%FVjq00܋8?ÎI;OXM(2 E mp<&#Ȳ#vex_w˴KT f34UǟFG7Rt'<5րdd=qZ|9op"ϣOQ .SS  RrdYF<.(3>A$#;XS<񤋾w1YbrA~D}1Qbn gaʣV9ɸ33#al&ă$s1a* 3CĨAmUF SgZy-(;zf]F'Kʦy=p]vc ʓyx§m,eWP٣0B0Ψqƶ0da> *a6o)a+8@-{Lw:MV!fɪ%8n"pZ1qLZθHhbD7/>@%9D=O힥XDeWu|~VG04Qb:]qQ;ٿG#E,,m4G1FG skHbKD&|? x|~DK4v!2~4^HAFOuf!+N3A=[(>0I{s"0CUxv'p T!O_(S+p>Eqog̨ hf(s߉sM pOp Ɏ:v:Ek~umT鞄J>~P d;Q.fl吣0NcfF2]zAqcfC+(h &Ef y0P5٩6q&ٽ|qrNG#?|/TGvL3mE@2=DtR16!uF3F2,xwlg@bA!9)mLW(C~`,U1Ħfw3nc:x Ŭ2ug0g&vو46m(!1N!v CAESvQw`z \'bPTٷBkR>̨|PuCDv15r?;LaP ֶceEP8L)<2Dh-S30{vx3k&h0BTw2, ̓$a(̈"r™9–C- "Na S" C2,1K`EIffu`0aEPJrCAT␥Tt؎W%3Or ´0QF#r!3[1" 1JbR,]0wN{e,oR>s<U ϕ*K%bvv1w\A>ΗA/CfAyb ^'%%%%%%%%%%%%嵍 +VO>|0 m{oR 0윷G+vss=!N[r')%%%%%%%%%%%%%%C'cvI4R<%%%%%%%%%%%%嗛tˆxŧ0%%%%%%%%%%%%%E!uSRRRRRRRRRRRRR^zJJJJJJJJJJJJJ+AOIIIIIIIIIIIIIy:))))))))))))))R=%%%%%%%%%%%%%@ꠧHW @{ˈ!]_zJJJJJJJJJJJJJʋIdo멃"# a&I$ RJDQ3h]A5=x6 ]xdc&13&lFQO5m9+2-j ۊHԮ83ڧ!Tڊ ]تbTܜĚPnjV=/qv>+T Q!D%ıAlV@Wz5LBy8$TT[ K(ѓf\L?!1c(e4_D0iĊX91kٌ-T)ZDL, r|@`I,aY8dK d<B5lGZ!"Pǰ6^QF>N"UUFkfn"A dcI*ڇ|Z+e#14pz|V̖9ҋB@g 1'qlAY R; VQg!wZfD(D̶شv St0$A^9BcgvAkAxJ }2cVDC[pJG)dQs*Q!~$8í_CQvfWhzx^)Q+n؊` ?2w>+ĉ뷂g2L'zT㗈TAoLDT"4bȠ%7PZ*G( "vĴTb2eB Tr [iyۢcF} I) H0NwP WiqCb3!Jt-DHɘ3G%S"YcG>3,V3wM\dEJU~5L90  3FH ,ےVQ$,P4'α2T=(}ӧPw1 S8Ah!z&vrd#6i9>EۤG 0OY& ,|CZf^HbE&JWX$dSReH*RH(eɶN)!#jK Ցz1:3FmX[ 'QB. AKfVY&.#qmڭ &f8AW"F# (PZYeth*8T5 ݪW:I6au"аZ(U@f I`r3=)0 e%*eQ+YvcgDMɌ%:CbǸTujFw[IA8M.r9l%1N' d#aj e%O1JZ%1#BTE5t&vVuS6-4"֌UN#LPH(v$.Dkf+N;:,20HlS%EQb! (| &&-JJPS0,$T=Il"͈bE@Pҳ ~m.")G^t mKU3iE:# ?d܏x覃3Q'323LhDm.CIWtөeTOC"5D\$B  eڂ3tc$#j^&.!2-P ZKEhJHEȄ$tURq%B$)X6UyZm)L}E>IDATY.%5vF3h%z*Eq Q+aK])C]NFw! y8KВ` ϙh.z`7E%jCW}d%C ZJ լB o䊒Ȁ8cR>8щR`W%n1L827k"K\|Mj4*᱈H%Ve=NCvY?&#$ I{%OXm:ۃA'+Q&LgheJ'C.;ryBA&i8q7F}u9CȧQPQP9K.N_} =W}G"Ǟ[ޫxg~xS z65ታ oxv3'rR @ ֕qu8c9%bh˛ȇ6>CIO)w_ţq=*kg tsh/VAf:d6޺mqZi6f;6-qm{r~m3OGGApH ֞@lv=~7oc=}kg{8_y399EGGZ \qirl>_>A?v᝷ƻVq^δȏo#?x1o '_U޳ =N8*5Sl8ߪ6'{s]{y[fo=~ wX}:ƹ[ VYhw=K'!=LWX˙QyG|;p O8{V犩ML{+V{9@[[9kWa'}m;*oo ||H72gq]S'84`s$SSxR;-9qLׯ>_}9u0Ͽ]u1>|nw2|#>ac{2n}YwoU 5v +jXy©\+s׆ʗf;VN'Csʡc >&>VN3 ַ D/!? 8͘Ǟ=W9?Fqr-{uyDx|߯LtGOa{B{}TLN1CW8K2_u#Dewa;O7y8zoЅY9K Oܹ8z'Nj=MM;_%7o΅a x̸Fw;]]ڋ,?V~3pwx/畟edj{oZ&5ɯl|+SгqLnONr@E|?M9|ə!Rt-]]xr!i[SveC޶+~ amy^q z7ױatw<6AoI/G߶9 z'^m~0?C_3:.gpxvSɪ|ٿUښ?3x t3Me-{QWO:-o3J8g~/ \?J^ϳ)i\#Fw|Oٽ*F^?H8`ͣc6t4J?1v8gS8i.|fcν&.Jd"gcOmZ.7J[fSqD%88"VަY`Ud^ ]۷ύPe>s5N}Vl۩x2g||sod,:/>~_lz+QOo]G36v[>laQ /%p^fZM=spa'ko:3vŵ%JN]h<'{k隀5ze.7a(OpЋ&D^nBJDDNLz(A@9DJ 'rbb'$\!T%"  "q|b'&$Fa@DnHDND腄OxxQDnL% jUȉ7 0 #ߋ H'\ b B1IAR!]"'BN-]!NP\O֞"Dxj~L$Ո$p#Tx~D% ?<|D̕FR ЍO#? {Q"0je$~DR 8rc(r@!x>­}v+ zaM/$%>Z$$GDKDK~OCL"5\?DBB%'ȃ!Ƞ1XǗ~ ~wDQT+t4Pw%~HXM^j&NpC'*!!/I"0_8b<7!bc|/"<5!pc HH dwc\!1!8j~,H&$CkK!xQ 2rG솵]8ЉKMjy<\3'5V? .«2$;2% _! qǏk!!w/\Ϗ"Tb8rC( ݘ*Ð c/H"= /xx^RKJR%HE>>aJ{ 뒸s|1!= I|$ EĄnͦ{qHD(UIX'5QHd(kҗT?+7Cz.xJ#k& $v}pkVk!Jt?!0$2pF@ͅ)}BBp7"t$>aGD~\{lKTHE~ # y!qY5$rfP'#jM<9]IZ]]~\5$HQAI\U֞u]b C^sxDn@k>]8H;~Tk߯ <7UkODT 5hcDxaDh^PB8>vխ'SsPp~gyIoD~X뇨>ej>*$yVB7<O$C! ۲f{*$~rxnB̵cnLāK$a? Gs6i!7y!;\p4p]9׮Wk3!jE4y5;*}־W#$Q:D>Q\7 \zGQ@$Zk#p7߯Y~FX뷆AꇵxߋG82 H<ܨ(j}/#v"_%tjql˚l? "'1< }78]ЕߏjA@DAMbͧ%At G+;s>NXO"7FjwEaη +Լ}{dkv`|. ^t sq^ł/h y.g|Ē9O .a޽ra>EDG )]he1 ~6j̢BZ"mq:#\X,yil*ćyq"5=b-~M h(u^,os׏hzHeo.H5JDȦp^ X niΈ\RAͫ 8jD,9s5RЀ54KKGkk\BK՜9y^Ҥ7[b:&p^B9/-(m~&{BIZ 蔘60K G_?Kk){!+\ (- ÕK=OAF"3/b&chV"tXMm ECRʆ}g/ dx2l绮ˍz.߿D]_~M.YӀr^ 5/mz(ur^5;"RXnұ*440_ԋ^1UQH NR5Q5Q4*c4 :HMza*QkD 6̨XF)BD.AEV00.T4tS1$CAεu}хXFT&BP@G&Fl-ɘؠQ,!-uF 2.T2 Bjhah3N0 HlDVkSQH `"QT]ݔZa*(vBdhDMh5+:"#0bHz6B[|1aD2D QfIL"['cEBdH2*e*!k픝f$!JL,#"`j H,61-ZBbV_F&X*`Z!VkcT ,Q)50Ê1MIk]O- S"$$Jhh@ǐ 4Mj6BjR1 nYdB*J`ZaoEWju4;ưB"fii( Dl Jr i&RJRkLHlj̠$L+@dLDw-!3$hZ; B5Ht!Ub%.4$gXDt⬨#,!@L$ֈmDPMjvP̚LQ2h9"5B&Ϊ$\ݏ adZ,HIM#YDTT VCISuHQk?CMPZUQu`X1H1TL&5b馉ES*1T"inh8!tK E!$)` lP-YBд^ck!f&QVi DFb:H]GWA$IdXaP$ 0=NbT[ B`jEd؄0T2H㬊&i `]CdYjVϱ%`1nV!$If61CFjh2&QJb)*V& ``G-C(@S$!K$NFD2"!Y/$DïVI\}'0\z٠́TUJY/Oa!DDx_I[?-uNTnAW% a a T,F(QڋhqB֑@KBU%WIP-jV*x0&n\K+pBzb"}CsıN]@0+BP,R]Fe8"R@yYBifDM9dk;##$FZ5uP`ȡ1}%b[5n9?陌TJ{)"4$R1LUD thdp JΞfZ餠ҚTT@S0Y+H)5 jaʐlD{G3 ԙV;Ⱥ1Ʉ#TeD!rBU$%#v{JJd3W nuABzŵ]6E3CeTkC# r/Ba%Fn@*;QrNa&E8:>R*8!bd\8ZD(Mt_vO&H"T0kahK Bm(q cbҎ)zbYt42Qm˶B:"&f꣖-D RM=D PшUA z*U$yRV+2"NJȉ y+A$hQUq 'x*c J+@R,0U-0,K)X#2e R#CZ [+3a1H"+h1UK $F -TOErjdE)9 AE0 Q:K(U%:b $1JFCXD )uP9e)4DХMY>DH9ngֶvQeB"j뷅Io4CJ]F :2`ʀID'c&T !1C26XGۖpefD, m)Q^FQ"p,|]ajHHI{n%>4NyH21:T3H#B $YQ!4%VT5K2e-LymEB%uylDOP#Ee0%q?hJΰD搄^#:9rZRԁI,B>%0*`RmOP&aWXZ5ld("mJc:XxĉkH=?DE=K.ٔM-(1=4"((F,%ķyf>t!5$!FE":~0@V38}=k!T<ҵpUp VB iE&Sj"T1ELC 2ġY9923@*-q"(U(K9c xN $q1)z>7ˑ(qU&Bg\vn6| *E .QڐRZQU2dbiD$ ,kZ9i3m8JLM )jhD!*sHC֜X!Z5ied'&FQᘸ2S뇊,V]A#e+\HUPKA -|L0B1?BTPCAU0u`!P&1 יhAkuU lB5U=NN4%@=WE]ci1vOu,$){tvZUHiR$REW=4 IQQh hקI SjW3$LTJTn#N4TbN$ZPflݓKf-A'$AxS 10eƠ-IȄ!Qht@ËvJ:(c-/V I2-g=S#(h",kL@`zY$YZB5| u]D$vD$$d5\_.QZ.L)ʒ@WD+dI2ƓeXx""BHrT J MӅB6qfU%RKcGm5hV'Ȕ7!|،gQ԰P$kЫh* D,jK,ƬN2aEH)-]"rxv0"'Q{Al"+fK>JW+ށ)ңwKcB0DUƔf:cfs_i!kW&ȹiR&Ζ9 M٩O$Sէi5ϨM<V}·bQ"B4MXKMi)b.taQ%I="AJE|y'Mk%$JvE.N5秞!UM4ޘ:'zz\(熌r_,Gf I=enlJ<9ˤ{=ׇ65o:M󂕺>-,92ǺW$I}}޼I/uԦ-_iҧT8лtQT"A"L^.mO͋|q/ /d:*(iPbS)eNE?I> RI? hDըB)Dmt{w&|~Z2RuYW98g+D>-\Sol@˄1n1L+tWjh3u{ d͡)]|4U٤IG.&]iLs#qAY`Qd9۵ E}sݑbn9lҳEud.f]5GS i^٤xTF6rξkqDG=K֚.57R!ő6)_GqА\:BTΊq(s1e]EIad݆6yz؈2'z瀦rHs#sWrJ4ULJJJJJJ(/wRRRRRRR$ Ba:yAarr8_dȤzJJJJJ+ )%u]ڵk9?Xۣev(KA:?.%%%%%8UEJa\l68Iq˝t=%%%%%idYLl\3M۶1M1zߣ]KIIIIIIy哎ˆB@E>j,333j)ecļ>rӓP0 yꩧٻw/=_ټy3uG|甔WzJJJJJ+ !===z|CbvvL&vzzzXn]<%%%%%嗐W(q366q]UVq'f_#))))))PTUeٲeJXlI: <ݕ=%%%%%嗛z$bB4v5QEQ^)h֧f N/ iVEILy:)))))) ^뺔_ZM4lq_|>_3 P*5!:oZm1qjeYJZ}ItU9j9芢;gA.~Q`񢆯( I#/QqAZ 4SgD 7t!b˗/I⍢C1s e$LOOST|U舔JBEkuжez_L&NJIIIIIIIyy^]AEH)QUgvƤZNW*H(K G[o駟~$IXY)i^w6oF1mo۶m|{cβj*4Mkt<]wřghhM0MRF9I~&&&8|0+Wli$ 333H)'摭{} rݻw/---dEӛ4"/l俧rPRSקV8F4 zF۷(Xr%\\.Ν;[y_O7̃>Ȏ;,FYQi{G?g}"}뭷299ɉ'H&!It]g֭lٲ0 ٺu+6lX6[+y6NJJJJJJJ/-a]w%\d2LMMrgM??q. 0Y|9v6mX,ry?uL&áC8PIwkR(( {y9:::Bp!K;Y~=7nZ oxBCfYz5_|1pY<۷swA&SN9: NmRa֭TUYc=v^OEQسg?u7ܹ;v000UW]7FI/R~ Ps^yLNNرg}˗sUWaYK"C!m6JVN甥4O]n~y.[n(wT*qs!֬Yg}yǦMo\.w%fgP(( ^{-_җtwwsgm6&&&X~=q'me]6oYW_,oii;hxx񆞷sYgq5zzN8]י⡇btt!JO?4Bw|k_Od``|P "ڸ8KYnV0( ۶mf͚5tww}vt]ꫯfϞ=l߾\.qG.|ߠX{/6lT*qwR(8s敕!n(K/e||~{9rA@P`]+"uSRRRRRR^ubMxӛ֭[馛⮻b||˗sw!'|2ei&''yӛۉ=^0 Y~=֭cƍI[[[-siϖ-[}s=LOO*Bo> ;w' Cfff8ظq#Ae]OwJ%6nȻ.x'ٵkׯM6qqqeq')#<ٻw/333޽1i&lB[[<4F_K͛7/ꤿ\N9ظq#uVxNs=G֘rOa?_}T /?y{Xlټ47cExGwwwc`6J6Z( a.?T*{N?\k0MoLMM5)wy\{}cʕK?奣z)/'dzzVTU=\1 qhiiAuTUmlV,沏㘕+Wtww300@[[.aryqgP.gi{!yl>[`dd;nͣL=X,sϱe~i|Ix x O<ƍYv-\r ô-y]$}ٌO}+tvvIKK w;wDUU9lc߾}8CXDUUl&!a200+u9i6f#4 <:;;"֮]˶m;߿?k0 GXL 7;抢ƪU8Sٸq#6l`jjzzz(޽}s<ÍnwΛ0uUUYlhij{똙att>:;;Yf =z=Nq_,wy'nW~W0 t]hrr{r]wqgpwS,Yj6l'Er _|1J[nSO=$I8|0SSS\y,[lt_ww7馛xH(mo>/Blذ۶AEX79cY|9ccc0 s=[n䤓Nbʕ 5l񩧞xj*:::8! CZ[[y衇(9bvvLZR4FeTUT*8lL&CTBaeY݀#e@E޹>:dT*XLjN&! C,"A4G3 ###6֎ؼ3jEJɡCRf͚[u$IBP a64FSgggey^CQiZ,|"3w'θ~%!wfzR(1r+ c,J?gH)/bcI}qd2i0;; 0b8ƶ톼644MjJTjl"4 rܨϷ~;p%4dTpu]\.y^cG]˲( $IҰ۶{۶_7%%%%%%%yeK][{ڐRז 9̟¯?3::JggKvMnj4w1?,x%lҖ$ (qZ#8@___A/JxG__Qџ6l!I~,/Dכ_4_K4o:ZM]KRTUmRa}IK"%%%%%%%%kA9L,$k=/6/dK/"Wms_ B|"䛖aJJJJJJJJk"%%%%%%%%%%%%%%et*%%%%%%%%%%%%%c2RiyĿ%I8kg~&(_ VDʡ~INjJyyy%EJJJJJJJJˏ }c{iii,IaHWWP<|ߧrKa`YkQBP,1M5PTBf_29H)) lEQDRe?e1qS*x2#`ll,"IqbH[ry$y)zxEi}ᵅ!:ۜ/Y/!DCvK'|]i^rZzRJ]2IR344+A_َ-UrRNIIIIIII%/4 0HdQQנם|>A@ggK6bXiRJ{{;x:ccctuua&###5eppqeY,_+g0vS.m>ǡT*|s eXsaX yۘCn#l˗7`a߿o\Uy###Jl2\.S,Q^puubb(o—KcccJwwHK\j֛ә2::JR!IZ[[Xfq"Rxei<== 7܀(\{tvvө_.|?!cccoGu0dll~ pA:-[t"0 On&,bڵ\{|S@uN;4~7~O~r {?S.0_*7ndhhUVqn:4MT*QTRb8===h,rN,Ps|A/dⳟ,w}7͗e)$IBWWm8iiii8ϝy(""ZZZhmmd_Wxco|#GVAOO0==ttt0::w]7isҚ޽{rMǼ oK/w]/_a|MozO??066W,}N> 5mjj EQN2 r|>eYhF$tvv2;;V}>Oc9.BZ àLĶm&''QU|ߧP(4ftvvrM7q7/};]_"}UQwΣ(s˖-믧P(4fq8P,k o}[ oP(>q7>K)QU|3߰cL$a&|_:;v`ŊDQ__000S0 z~>rsyo}m۶1<<>VZE:::89餓BpOK.U7<!kkر;O?B@EN?t?? _gu?1uGLJIRT*5;l߾nqkؼy3I|r֭[M7݄]|X,rwLNNaV^͏~#/{|CjX,f99S9x ԧx{ 7ox|scÆ Gy۷|~,_U/'#Rvz!:!~w|>馛뮻8ShmmM垒*yi/K>1ӌ76Zz5{,a$(4qiG8p8wòe -[^JͼTU۶P(ia|3\}8ýK.c֭\q?/k}PVy?υ^'k8w}7}{X:}kٟٱc,[~>(|;;4__.EQhmmŲ,zzzXr%w?JR4믿׿DQRN}7t?Ar\C_VZټy3b\.;F\ʗ$ i200@yگv|(SSS_;3^{-ٵk\pӟ4KnZrtuHJB}عs']tk3 ]t{.ꪫ8~jʢ>Zjv|K:I`6rI'144e]6o"qf֭[׾5RrI'( y׻E{{;|^n6z)4Mc``!՝8ioog 'm׮]xիiot8mlذ'x+_TgN#c\Yb!B>ƍ}KV~uÙ_*}}}TUx#< 7G>,'p<_|1{noLioo'7[_2 z]Cq7SO=ŝwgx+ 222mۼol|r CZ[[IG}uqp|/u{)1p 'ʕ+>zj:;;T*]˗*m300iaH{{;rm۶Յa:x۰5ٶ1M81 }iLl63ـWB0drrѯn8e-zNg>́X*Oc+xIE>ݨڐ 'v"qWs ' 0j8_uk j#ʞq饗r14{\(KPK/~A|eYJ%\mlx:WfŊ\xᅬ^Q |gc1Æ <3\0_u֬Y '8Yr%B;<* 'pgy&j)8A)\,Y֭[իO]y^dž T*~3<3yJJJJJJJ/ r ʹAad2yψFoy ^꣗.azu$ r]o#k]^$_\~]&/Ys >FOO'ss&8j7yk$^ !p)%lvLkq\(hkkklu|]f|-A_f؆\xOty`޵6XRRRRRRRRR#`bb]ۛ+(^GK|=Ο'z8<c7F}V'RQ?ˡ/ZK+^Z[[o0u'ţf4]?e^?ZB3P:s.*Rz5==eY/x7_LMMavc"B  :.gEJ8}}}Ð_SEi46ig.9]Q_QsE/F86^,کC}QO~_/AOO\:g_/q()?o$I"I2LcuMӰmaLئݻw366i]p;:? $@HbS+dw9=='OUeE,(7 z} 0Lj)R#<ݞ{뾮{yBz,WVDjhH$C1j\jettP(F2<>J"300 (f'$$099l F4ezzqr9r v;ZXbhhχFv322B$, xvrO qctt<@yӲb+Jv;###FQf3SSST*a,p8$&& byyFf֯CvILL\Н;wNC 9<:],:|nbqq6HJJ~k?+sss( hll$##㮞ՕAn޼` XV?... tH$]5wӖ@ pOm bZQd2f3###,..z{V8qĉ'N"Hcm4/TZɧW\+Wj`tt!!!~a6g} b1\rw}\.ba֭j7xafff̃3TR)ϟg``K.A0_ݻwcXr }}}477S]]MCC< u1??/~ !^RqEz*믿AѠVywyWr\?ϙɄ׿5͛7ʼn'Z[[_ɴ@ͱD$bRen(`Tfph4o~Cqq1jiWc~@v\vN'/2455QRRB{{;+;088HCCz@ @{{;W^={ t4.\D0ӂ1S>77$2 `$^J8ܼy/[l#q\8HHH@"0334h !!^O8&99ÁbAT"p?rS,Gtp8x<$%% HhnnrQVVbfT: 011A(BV3??fr+B?yyy,--aYXX@*"q8B:'1}~~LfC.cٰZT*d2LLL H8s mmm0>>N("11Án}4ϟ6O~}H$BVV'?Oyt:|{존V+$&&2118 JGrWoHRy%))5kpMyiiir¹sr {֬YO~WX,yX>۷r g>} 6l2}}}LMMSO!HBIX,! fxx5gΜ7nD8$}233Yf 333 @]]"3gΐX,?۷ol6o}L.\Bj5W\!11d#<c4D466RWWR$99}kB^/ xa|MY^^ݎbttW^yr o~O?MVV]I/<رzHLLd֭B{***fa6ihh׾5N:E8СCtvv266&j}Y-$H(--.N8qĉ'S]zR7nDصk>`v ROsQv;vOO4773::Jnn. Jb޶X{-%%Hx"IIIlܸQYV"ӧyᇅ+SNL&pϟs=!sI6l x0NyHR"8NʃjyWB 7oR]]-|&F4E.OPQQAFFKKKZZZظq#O?4 ߏh#-- RI4ٲe W^% 1HRnݺaϞ=AV+ $$$p 6nHrr25558q333TWWݤ''篪c=Ʈ]o}6UUU|;ߡL&ktww羴M6Q\\2he;x 7o:nqF9t`͟bۙd2Oj1ͫ(DQ<>v455166}vaͅB!.^APѱjT*\.d2:ƍ!//]vQVVBѣ;v)nܸ\.0Jsiii`QT puw͛),,d׮]$''399ɟRXXHss3a).."F#bɹsx11ի455|M8qĉ'Nj={]v!Ʉ馦&:::CFjj*PRD"!P($0`?r\:::s:V{O{7~:vB* t ᮱0݊ 0 BU*tuuۋ$b!?Ϙe֭D"YXXRgggY\\fرcB@(bnnNegg UUU3==džFQ@Bhr$ SSS vfLƭ[$''χX,v3??OFFZuc}Ű.\oͮ]PTfrrr8rV%f3k.֮]hdÆ QRR`= n)N'h>\. B!x3gggXVN:VEFX>V[R0͌H$sD0La6q\baF#sss ILLD& +Xgikk&\H$6# vt:***x'Wj222HNNfw\,s˅\.G&a4䥗^bӦMQXXH f˖-B[׬YO>Ε+W8~8l߾"֬Yڵk9YYY裏b2>sb۷oD&%%H$•+WD"O$nSPP@{{;fKnn.{e˖-c0/_jr14 ---D"fffrkjjp{yڵk1L455a08t333477 Fh~|IL&v^Oee媐AH0Dd"99HDvv6ZM61>> ݻZMAA v$ Ŭ],{n399Ijj]=(V755j72== vY)//```֮]˾}̰e˖Uin8)))TVV222dBP\.')) Hḧ2=++ FGGddd077'`0F!77wHX$AVSZZJ$app@UUP(PBzww7MJJ :-[Doo/{XLAA`tzpQZZZbd2H$FȠV&''IKK @mm-6Mggg NHH 55~^/#112JRXXL&# 7͏D9K$J%J}ccch4jkk|477V)++cppZMee% dddo>0999$%%QTTDmm/++KHDRPP@cc#mmmTTTk.!t>VH8qĉ'N8{A9N|:|``z޻2?XRnGVR$z*333$&&ow&uaaHtQ^ZZڿ:SSSDJlٲ@ڼrM6}=2::ÇYnGsN'TUU^\\_$77cǎgC6slj'N8ql6 N4 \?V$.>bH$_G"ubDy>gĉ'NEUSRR׋^a(jFOODFGGann"ffzgg'###tJwIoo/t*uR|rr~ :COO~Nc``ٌJBR155 s ```ZM(Q(022"AH$CCCBٳAfff0 H$ K8FFԟ(bZILLDT \v ^ ԡPJ0h4F4IIIrE, 5*̙3|lHGoo/sss~^~ep:[|{ D Bbb" Yfgg?'Sq_Н:uUj*$ׯ_g͚5455QTTtWmzܺu NȸDQN>b8CCCdff~gY^^b`6tHҏ]PBIh4ʍ7HHHXan|>ׯ_'%%saoZP(Dtww399)){˼{T*YZZbtt^O(Ox~T*Agg'SSSA4}1<gϞ%##TWrMvgl177bhh͆V]5SSS j˜~GVRp:^?ta`P *J(oMMM %j5JݾDhZF*kյH8qĉ̽~ ǹ|2 dgg388oDOfJR\.\ 55_Vv ofll۷oSSSC[[>,B)۷obݺu8N}YF#BׅTVV /ʍw> + th4 \.\.7o`0DHLL088CղLMMi&>hT.JYZZB.3==X, Fl6~SPPFl6 _ϟG" h4\_J= X,d rηzh4 ?._Lcc#l6jjj%PZZ 8w˗/r-SSS8>{^Ν;GUUKKKx<~?Hj5v\.WzX,,..N4%==ÁJbttYZ-)N'2W_}X,***p\a6piiiz|>];66ƍ7Xnq:ׯ2o߾#==g[oDl6K/n:RSSF\|u֑Gss3>,BV/FbqOz8qĉýO?H$?1x^n߾MUUb1[~ߏZ^D"vL*ݴi[lԩSX,{ X̣>J4?N*{1NxYw|x^x'B?233Z~y衇`hhl=Ǐ yyy t;wge߾}FܹCJJ ?Coo/999#@qq1k֬27O{{% BΜ9CuuPY&111͛7IKKٳ|{ߣ43aX>266eeeB!ɡ^( Řf^xR^J/_L[[ Ν;G0$77hhh`ff~={TСCtttv(Lee%R7o~zyyV+PRR`vv Evimm 6C=qz0::H$cǎqe0o#l6-[ξ}?rrrP=zz>FP($xmFEESSS!;v3FhHv4ٳ 6oillwayy.~ى(((… $''Vddee ^oo/dggLff&Gqq1o>77|Pc'##Q._Lvv6 Hc HgϞ%''%\.{x<pɴZ-H`0(goIDAT\7''2JKK)--EףV)))~VTT\.??$++7 /f3gΜp8 ;;[~ç+n$ LOOs~? D"|lj'N8q>?jۜ;wZ{d``dNytzO"n@ L&vr|Bihhgaڵ/SWWǦMD"f36YV+OBB999B!l6V)IIIf100Q.Jz?#vJ!pn:BnBA$l6 .%vMrr2SSS~Z8ؿ?zדGBW+211AWW69 YYY|>&''a~~Q~hD.grssɡC~r9p)--eqq׋h$ yccclڴz6yEIMMezz!!xx&'' F:;; !%%0sssDQ:::X\\y&&&aٽ{7T*ioogll@ BdbϞ=ڵ VT*ٵkPPP@cc#6l`bbDFw4)))044|X ØfJKK韨$11ez{{KܺuKc||~ ,--]HOOl6SWW?ϦMda!rrh4jell͛7dp8Qׯ_gÆ H$֭[~2228qĉ'ν9`tl۶Z ذa$%%ۅNسgSSSܹsRljD"ܾ}9>,hAv 4Vwuu!Jrܹ\.GPRX,D"ˣ.iرM6ۅ/..rqB&afnnBAuu5fͱcHHHJ 550;;Koo/Z-|FQx zppfñ2],F!77 1͸\.!׻Lww`DD"fggιaXx衇(//ĉb1"T*[nd2QVVFAAb `t:6oތT*%99dRRR0 h4*ۈ&&&n:av؁Ν;,--q֭[Gmm-PSS󙅍b91%Bnn.eeeLMMa4»}>E2}zzvrrrطotttr|lD"%%%Ya<k֬>)--]%ԷDKK h ۷Yv-YYYHRJJJDLOOk.l6dggjFRAJrr2tww yp[@]]`P(DFFfYINNȣ>Fb䔔233ٸq#l۶ \NB-[HNN,$ yyyjrssmՊRmۆT*?ٴi֭#;;[ ###lܸ[R]]Mnn.۷ogaa9v>sΑGaa0fBVV>ŬYM6qF6mDJJ IIITWWqF6n(D"***رc9999U*߿χJ";;[KV͛)**bbbѣGtz҄pؽ{`ধBJJ p>$|>0錍А0&h4 qA`L:::0 ] }x^^زTU4]&&q1/ɖ-[(..+),,, A4eff/]sr5n7AJ@UU՗i"p>aaϞ=N BTrr~)$`0 r|MXY^^&99e$f!_vWĉ'NfYpB˅\.`0@X5XXB$ B^'Cy/ HD8-Hx駅>r8{?  4=6_D"|R;NP3흕RP՟bt!wD}LLL淚jĉ'NI&[w7AQσayyY}~kE"_vs_܇Fx<vV7zsVy|ZjFl~M'N8qĉs߭G h4Ra_4+[+!6 Z{ BcH_f{ `~~ qs"*'N8qĉIQqpI8wg*qOyV>k;V9|%K* UeXy<1Yɇ:?qĉ'b~{JJ tttv1b0===DQAA XVvfffHNNf~~FgNss $Va`0 ?sbjr:;;|FA:&FzdddD>ݍFĊ~?$%% ihh`pph4F>$*m$a``J% n&''9ZZZXZZd21??O[[PHQh4(J, mmmz0o1ObddR^^^fffzHb*JIh$ jHDcc#X,z=>Od&''ijj* Ĕc*+7xFV%oc0HJJR˔ks֬Y+}Vb[c.IB!^uRSS葕*_uyyy9# 299IbbgL4\.ᏭF ߏ` 8Zǝ;wfffTN'A HAQ*uM@NNg_(Jt:( a61 BO͛dU#'>v=pM'a6Jw|7с1ĉ'N%ES ;w`ٸr B(?Jb?% r5xz rss|2n"##TB< >R)(4xq8 RSSae[np88>>N?2 DBww7FJ$hZ0<"&&&X,bŨj$ønJ%SSSLMM)V]ckbll)jžC`0Hee6>aȠ[nv`͚5LNN2>>ٳgٸq#=H7nOFTb41044 >F#h}L&F~q^/mmmTTT011*۶mC|tuu`n3>>P-|XuffAtlliR)"9ZD"rvD"V+< PׯSUU%<^0l޼QFFFHLLD"2,--*.̠h`zzEt:333HR sssh4/|Pns%R8qĉ~q/Z "2;;vƍJ P(Ǐ~#h48Nv;PJE0dzz*:;;b˖-B?LKK ;v`ڵ= KgE,s1Bn֯_ϱc8y$hl~iFFFկ~E8f޽tuu /1㫺ZxH$LMM^穧t-a}Apc=F{{;HD\.^(L9}P(> ' %wvvRPP$ \rT?3~裏"ɘ`rrA222zx<}f`Xᗸ;G$%ە@4%))}qmjjj0 LNNwߥ#999 e˖1^|ED$l޼ߗ~^x.jjjHOOԩS( idd^FGGw˙3g}A$att#Ϟ={hiiq\8pW_}~P(bappF0vxuvh4?p`0vcۙhfv̐ZXX'9sr8}͛7zimm*TUU|Hh4믿N bDKK W^%%%VqㆰƞXU7dii\RRR{86mDt78{쪵{1>L8fzzZ('N8qdh{Jݻywi^p/H|;{\zݻwטL&^}Un7'|&?rp8\.N5g0 q)222pYH4O'Ha4孷"11׋b!//38qw&''ay뭷B_̳{a-[t:y饗p\B}aсh4VGeڵcp8X^^&ƍy'tB!xILL  ];wvFLNN~)wC4D"0k2Xf 7o& hoo'++ J>YN>?kkk'x|xꩧ8pDQv#GHLL䩧Mt:=֭\0KJJ(//b 2p! O<H%ddd t${졭 H۩B$t:q8|_g˖-?{{{III_:H$xGVhH4dddJb{>T*jD#!!^/xsrrضm*V=GAբ9x ֭Rb'pRIqq񪵫RÜ={FÎ;6N8qJ穬dyyt LLL".]pGBBLNN2??Jb͚5L&&&&SRRBSS.\ 551~P__OYY~/>ww$$$`0O$8N zf, 6 ,*e~2??Onn.~N権r haVӼh4zerrՊhdǎz6mڄV% RSS#xVFH$?\H$Z8ND"RDBSSB RE&'')..`0PUUÇW$y9s ~0_ӉgddE֭[|Pdn |?ZQQBD̻‚0C!LwwO^֭[㄄T*$0Lܹ]va0bppcU&c!r\8 IRhllU8W^E.!0??OII < W\!%oٲB{{;۷{#×Enn.tvvb1FVVLX,F. RlLcz+_'}OLL!bXB!u_zz:VF D*P(@Lgdhh,RSSѣz!Ժ>233D"$%%Vdxxh4l6 333{9(++1??Ovv6DDPPXXX,fÆ Amm-,..bZIJJWb13>>NFF0F}0;;Qn߾\.GV3==-sbbBСغu+zm۶؞[&F:::F* i-hZ\.AqYIVVVVf^__'//KOOCCCDQc(,,dvvK.vRIrrIMM#GNmm-KKK466P(ZU3GdCCBmmm,//}W|24f8qĉ/OAONNf||R‚` PTTƍ)))h42<<̮](--e``!֮]ˎ;Vˑ#GB244Ν;H\NNKKK|>?~W:+sQ8NkKB&xexxeb1l޼ٲe "Hh;~8 XVT* dggRF(ѣjÊ rrr/}l@bb"FNd2=999z)--e۶mdUx*j5L&%99YX̰ȁHII!33шARvZݻzΒFJJʗ~? r9. Fƍ4czP[[+^M6!堛L&b16֬Yfd2a0BVc2d,//!^ޕ9sssRPP޽{)..fppGAA& J%EEE111汱1F#ʄD"/}ff&@ff&iii[N8PJݻHjj*Fyv܉b9 D"fggٸq "UYYB\v܉^g݂qj02=##C8KMMeӦMh8ta0jdeeP(`0J"55@bb"k֬aݺuP]]MUU`effjtddd``ݺuV;w$##l "P(Dee%hZf3[nEVc6jB:rrrؽ{7 RPP(STT멮F%3ޜJuu5,--qaq\*MNNo>֮]K^^`0(xrN']]]t:***ظq#jZXIIIlذh4jСCfal1 x^:::HLLG%11E^^܋bh4rIOOG"),,$771, EEEM&hp8N w4ŔRRR"F~jo>60>>N-[D`0@OOp蕝&I_DBAA,,,N[[tGVVF_QQAII UUU֮JbllLx0L/ٍ'N8q.r:1H$***h^y}nQ8N'>O|xuУѨ^eAx[,T}QꘝeBxݰȵkXZZB$~}^B6+W= bcw>'axwQ_Sollӵ1 pe^/ǎM}}=ÈD"RRR1`ο73)lj'N8Of a\.r\Њ̥beֽ^g~~~"ÁJBVjc޲Y(d߉D,.."h4Oh9RRR`0$%% ʵ uh4OH$177B 99X|WmDb:V/f]p|%#Kb)))TϵdžanVUسzXIib~~NJf 9ⱒ15e"Wp |e*E,Jĉ'N*")"3 ddd<>xwA~PWAGG"ht8vT**FFFHKKC*bXs b۹}6PD84 jqF s/2E{z?ttt J@PnjjOJQ\,WnA.d2:N[RFadd[nߏR?b*_VJeii_~r Կ4bVft:?5 = 1::ZY~x^^xJKK?us8 B ?ܹsg>fz- OfyyY9H$B6T*IIIvnݺXOss3$%%!yG؈smIMMիΒ |cYXX~F={z *]f~~9t:uuuHϜ077Gkk+999w(7DsBĞ^`A###\rE'N8q.q/*jzr 2<ۿ[z=iii?GRq%JKK9qhLr T*e~~9p b>00j [UWZSS>J… gl68N.^ȦMĉ \CYXX7ޠdR),//s***k׮qEF#FRIkk+;wD*FC]]`>})nJ}}=ϟG.s-222xt\t|t:oH{GEEvbJU C1r8( ۅF+X,fqqQ:::s2NpP~@ooogiiׯ;wFÅ (**b``;ZH$***XZZbiifFGGٽ{72f3SSS~|>Pez=cccahiiJT*t"˱Zj\.NJEww7zn7jì@ / j,..2??T*ell N]]]( X,~?@Ll_W`ppU\$nd2W^ܹszimm,׿5ٟp>99I4ezzC0dqq`0( &&&nĦM h48B!ܹɓ'r122"̑VpR^/L&###\r˗/'LOOt:yWHMMpOYYNbΝܾ}@ h#))˗/SVVs=G8Ʉ^Brr2ׯ_D͛7Q*,..rjjj˅d^n399),4/͛@ pA1ʙZZZ|믓B`09crrR(B!~?bł& 2??ϝ;w#99YXs 266X,`0D"azz^jsGFFp:,--ׇ`X-  &Q!^݄B!zg`ddJ2 &k#IJJ)&''Z-KWĉ'N/{1?=tABccc fss3[lA*244DBBַя~$΢V"11ٔ{nl6;wXBMM 6l7t`b>立@ @zz:<o6h,h4ʎ;hmmqF(* TJ?ZB{1---Bb8ŋ&&&ɡÇH4E"@(""(,,dϞ={Ayy9PCLkkpBP/_& Q]]ש׿5͝;w(((^yWD".˭[XZZ"055磭??frrD޽{O]]@={%`XBXL0D&?jp8LMM ===qKff&ܹn}6III\z|4OKKƍ<Ü={dn̙݊3šy7)//[---|ߦWXFz{{r裏si '\U ttt`4a׮]ۨj233 ;ѣG9y$h4HIIW_}U8Dܺuimm+lf{۷zOCf͛7D\|%|p⦦&b1$''B`rrȍ7ؿ?W\AVg~?gϞ% } $s=GYYAD"x YXXĉ>.5wttc=FMMͪr^pDaa!UUU ^XXXu)))a||\(VQQAII Ň۾};6l ''M6sHQQ$&&x'T*{qn޼ɑ#GKZMEEVL&eeehصk%%%}0`n:)--%;;{UbFXlbvIOO֮]KEEk֬aݺuQSSCAA>|\??rvb$ ܹsG?N'B>{,'??m۶~^~eCšC8tEEE8p3gP__/x~m?.iN:O=I̳Jbvv  ׮]c``|D"p8LAA;vfqq`!//۷oxZcaBAbb"tttDϧ?ҟl gϞbPPPKx衇f||\0Hc"^+żb8III]DMM $$$p)zzzX~=z*++ٳg`^ONNN@ @$A,STTDII iiiܹطc[*R[[ /@^^6.JB:ԇEbklM!dB>|pPXXHkk+6mj"HppeA&֖H$1;4*N8q*9vt:Yv-k֬aƍba޽a6bÆ lٲyIMM^~?F!+sQTa YYYC+sv/H$bddtjR*rrr0͈D"T*YYY԰vZJJJ bǏVSKVV>ZqH$>RK]/++q سg 2d2HJJh4288HBBǏ'!!q\.<P(jر$d2EEERUUEnn.ׯK4ØL&RRRSRRgBqff&dff`Ϟ=,.."ňb222p:L&\.'o2ZnXzhZ6l xz!L&>DannN0cmD"lذaU~&))P(‚ Bh4 ^Qoe\.'##&''VKff&*J^aXXXZfgg`ݺulذH$f#99Yt TWWSUUEAAXL~~Xf#%%TJUUvvZ $HOOgbb֯_C"~zQ*,,,}vr9L&oh0dxxL)((#fiib*++ ##Vhj Y$d2ө2JJJcjjRn݊V%##Z``Ϟ=bHLL$066e߾}TUU {eYYp,TUUa<v|jqfeeaXعs'B!>,hdggN#%%Tz=$$$D"p1RSSu)..r Gl.8|0F222ZX,vAuu5x^x^&&&e$%%j|:t{ cgڵ̠VyGH$x^;B$"77yt:撖hDPZZJnn.(JˉF|>JKK<))dA O&a2|***#))INd"--M~zz::;wj1 }cINN"d2z96oLBB⒕hBPHHH ''Z233YnEEEF, vb͚5~P(fǎƉ'N8_e%]t:XH磢6>^eAx<\Ϭ xPugffHKKK/QUUźu>u>0"߿@~xtNh4Jee%6mWyEWW---$%%qϵ|>.\ Ym۶5:::hkk#j9pgV'N8q~1͂ø\.r9aUDNJąa~m|{ gq&H$(K-yT*h4>\WS[2XErQA󐒒޽{0ND"7n BeNĉ)ϳޢ(7nMZ}DR)$ ĉ'N8|^{'tځ@ @zԄB{1aA,uqqK+Y^^ŸSH􅭡:灍L&ˆ"לĉ#~hĈ.{ݮѦ8qĉwH[ YFQ(_TX, q<ȃ qD"|tX8LLh.>'qĉ'N8qBXq+7; ~bpO'Fa} Wb%> D~Uĉ'N8qĹ|{JJ }}}ܺuKH$B!D"zy&&ꘘ 33i.^H?$%%BCC"HTqf*, f.ۂի\.222XZZ֭[tuuRjtwws-zPVr5z=>)Acc#žC455RPܾ}~JsuqU~?AhkkCѐ uuuay dee},gٳx<222>377Gss3CCCzF8NRSSkJlD JRΝ;"H0 suW\yDnWh4hn"'N S'^~tttHYYozz{{)..^a.\ڵk?Wv;/V-,--ݓ7oޤZMbb"ܾ}iAڵkLMM'N8qĉ޸O5{zzF\v ~` 55gy.\@qq1o*233z*TVV*Ŝ:uu qb(n>FFF̃ZWWbϣhh4ʞ={p8LNN̹sشizTŋO~BMM :u !8y$Kŋ~:YYYL&T*}}}[رDc233GPV9ѨPΝ;BY@ x<zzzؼy3}}} Vrgzz&''gtt$nݺʼn'`qqf3˘L&&&&}P4ЇF(JzzzPMRRj~Ŝ>}۷o,--B?Bپ@ D?bN'x^Ο?ϺugRSS`\.*qĉ'N8q~;bj={2.byٱc2a4 _0 nt:˴`Zh4d2P(Q\~=GYUn|͛7p8˗YXXY8x &h4L&Cp8É<3 ve``!"۶mѱ"p8{G}}=n~۷ovΝ;Dž hhhbp xQ(d28u`7|~9s 7oٳh4f3rݻwsaP#ٳ}=;;wzq$Jҥra6l k׮Z-dӦMD"<5688o2fHDvv6Z7n H8|2_h?ڄCSN gΜɓA>  0͸n^z%yqݜ9s&^~eW\appƙ3g#'Oxx饗_,KLLLʅ xy&v~L&h(봵!x7p:>yLLLpnܸKĉ455[o!rB?3.soA[[ /__Wt}QH$L&###tttLNNQAq;N8qĉ'WO5oiiiڵӧOt:gxxeo("??p\vݻw77q)fffj"*FQ\n'-//SZZƍ4GFF8wO?>oFZ #Gpi8qÇ%!k.ٳgaNJ\._kΝ; üx<Xn/(U}Dq5KUUpjkk9wɰ}v=b~z֯_H$ܹsCss3A^/"[R\\yyyHRo&lٲ-`0ӧj۷ID"j@ joOj~b z)//=FFFȑ#DH$<455aZyʄ}QbjjjI0dyy*$  8v(J֯_Ǒd "Ga֭˜v,^,4KKKD"|>>Kkk+KKKa<2Zv؁f#11Bh4lٲ۷;C(􁭝ˆ ի188P(DWW8pRRSS)//GRxxG)))a``$vM~~>iiiQTTDaa!z ҥKoR)nضmN4<VE* %T*Pر,IIIUD"sqN!LII'VOKKf a`0Hrr2BmLPX f}H$JKK%''cǎANNx< xB}GYY0ﭭ08X,, `8@ӑOYYY^QQQ0<|6n4qݘL&$''ɓt:9rbggey7ZİΫJVVtۍ^fcwp5KBBRU҈"&&F(\*ZX, #??|=ZXV\.x<P*T*y L&a]}!?~cccٿ?r׾5  XIII8NR) bbbP*9 "++D$++|V+f|{0]ѐHLL YYY~a I$VWWٿ?G!;;[+j%66 GÁB 33lNCQZZJrr2a&66,Rl\.^JRRt:L&٨T*~?#11ZM0dhh~_s% fZh48NF#c0 Nqq1$..BDDVUxc0x>N("!!zLܹsDGGoKl'P%\l-J%qqq?D@^W(4H$^P(髒g`#Hj}q>:]B!!E6|)(( ++K(>QGۨrڿ/+++ܽ{+\; (\@+,E`AXZZl6hhh"""hjjDB||<###TWWVܿJl!HA>DGG6tww 9s Tg?-===?VAVyǩ|DIB!˙G.^Iy255S)lnnRSSCOOt:illdaadu333OLy:g蓓DFFD0$33{`YYYTUUիW!//DXVu\~jC<`IFFF8tcƒ2kDEEq-Z-znzzzxWnP^^Nii)ׯc2HKK# Q]]/K<&?~$R)DFF zJ">>Z ׮]HR~򓟐+(466ѣGijj$nݺd̙3P]]Mbb"AD"|fffp:^uGGqqqA[[G׳-跏b0T*sL&w6.\@ll, ݻw9x sssDDD077FRIjjvCRSSgp=())y%"""""""~q=FAVcĉ( `00==bannNunjjbnn-j5LOO3;;uǩS}jOT*W_èj!^BT 0ͼRdfffĉB)}J^gbbMLL III N'166`vwwxj)//'twwSSSCuu5CCCpit钠Nee%2377W^ݻ444`6GVs1NǏSZZFyGhZa=DEES nLF^^rM&|>xG0(JH$XVihh@&!Jq:ڸw3g__ ^\rW211NcccBV% BLNN_*޽˙3gBl6^/MMMLLLp8#J͛H$Μ9#l|aq8PYYկx>1L[$''Bl63::JKK $&&X@DDDDDDDKg{{{\pT^z%]fcii+Ad2?hjjĉ8pW\СCL&.\Đ`0HUU|~pYJJJ8p?+Cۼ;.`0˗q2<111ʿWu:::J|[X^^C4}]PT,..r~p7akkZ[[fJ%jJKKIKK{井DGG377T B-HRަQ\.n0CCCtvvʛoIRRPk~~IHH`oo8N\.[[[0;;/(w%%%w211A{{;B!ȣA]]] 1::\.jT*yW0MVV& w\| zzz'//&]&䫇; OYYQQQ \.' 2==MAAwfii?9---T*VVV&22EJ%2LU~vfwwaaa8l6뙝 DJJJA"H"HH$?Ntt4)))>P(ѣG 55LFFEEE䐞hDcZQTh4*(t:tdff" $%%T*>|\\.ZLRSSbNnn.DFF nd2 GjLvv6f] BT*%77WJLL…T*rssILL$##׋`AH$PTTDVVIIIr0LBwvv'77BAtt4GvsIHHl6RX,dgg ?qqq zBj㯾*~ɓ%""""""""lytb%I~ϒgnۿ:vv)"y^:$$$P͗`0Hcc#ccc$$$o|(Rܜmg釟XJ.Hpx<ϥ-HpWpaϳ*깮5azXr  zq\/,Tx4c|xz/Y_(@D"> ggAnsa#f?h|UY ˿Pv_6|Y M>̉A"8= T*?wqzB~|:~`0(Ή=/ƺy! ED=;;;~c#_$.KOjp<[[[+b! ),n3omm=SDDDDDDDDDSs=Y\\$11R를`0H||Q~kk+x<ݻGRRCaO淋xT*g~9233zBmmm(J$瞖?)ccc?U͛tvvRZHKKcyyK.xZ"""""""""TqL}aaHKK ^,/~A||ٷo!͛LMMGSSGyP ՅL&n"22FFFW^a{{-hCrd2F0gϲ~^$N'K.+ׯ_f3j5n޼ǑJ?tvv"J1LtttѣGln޼hŋ=z*L&qP(d477 :>XjkkbyyVKss3޽ ~~c0j455188^RGEE ikk>8^S[[`vv"""Y?4н^/---ܽ{Zn۬Lww7*E222 z*}}}9rUL&CCCx^`ll шD"{O~.F+ݻwRPT3662+++ܾ}Qf3 Z[[effD}6SSS~VVV@__111Ɠֲ.li4|x^vvvя~B ))wn9 }}}Aj5hZ۹wNGgg'MMMH$n޼ɝ;wZlmmq-ܻw^AoggۍF*vETruJJJ8<999b4qtvv /1?---RILL ˌꫯP(&..'Ob4#%%Ynݺfݻ$%%q)4 \w||Ço`xH$;v|"""jqa·d_&..(J%#==]$r8thZhoo'**^z$"##477AWWèjʈ! R0tww`l6SRR"LBVB!;p^/ԠP((//gtt'""g2;;ŋG6.]B`6IIIڵk̰˙3g:DII JNdb{{ntddd%DACZZۼ돬!0 F"%_X?$77Bf:;;O Bhiia||7nrܤ[n1<RSSy饗X\\$JKKlD.u:Dss3gΜ!??_B?яХ%677tww3:: C```~ZZZXYY[Wq5***Z'묮ISSӼ R__OVVԄCFB`uu6D"D"ɓ$$$hPTp-HH$d2Cŕ+Wp8}nvv+k4! (F#%%%Oq/IMM @)t:@!\MhF#'OC}fZndmm B!lrinn~ܿ?]]]\v!FFF0 BT*iZll,W{xxX1 ̵kטC؈nG*gϞ%22"?loopתD"!...]Dss3>TBॗ^"::^싏 JEFFfׯ׬2<<,) ~fs68|0eeeFbbb(**)># NLL gΜatta!(jĄpeHMMemmVxkPDDDDDDDD q:KO"`#??_xa Bdgg*2 b6l&##`0IDAT(阛c~~lF#?e @\.O$fQDFFQAoo/~_j۷y#Y\XX &&R\r9 !BzT*ckk FCqq1LLLM^^BV+ }PTB>tNN>.ϓ&R(VWWh4x^bccaaa쐜b||TV%))I|>LMMIJJLlll2kvBX,FFF ##n[(7?? VBL&aB!IHH@*233&JdVWWtb4x B!&''Y]]%++`0 \.bbbPTB!R)bXX\\dmm JEbb"[[[F|>ۘL&Y__'77@ 4)))x^f3sssB;j" deehq:(mmmdffrI BTjb^tL&F %%͆L& ~_xFAA0GkkkX,RRRgMJJ !z=ьdaaOm[c(BѰo>&''Y__'99Y BXV222})"""""""UdnnNlmmT*{(S yy_f_$aq63666z*N2_m4П `P~ь@0DRobX~qݴ"-(?<" 9vs6EDDDDDDDD<3}ggCϿ($my T*jK_Y!Hp:Bw(?$+ p8/,IJ\@!-tB܌اv0!ˑ85?< lll?Y.hzs ؟} <sEZߋIy(U?ykKRgp:< y_WDDDDDDDDGF{Rg#z(,I8=\i _@ !Ȅ}! }*~~8'"""""""""jԓb /P(񓲵~txOmoo E8|lnnx^tSEDDDDDDD~/˅'>>Vn޼ IIIT*8什H1B!Μ9Bx"""""""""Hlnn A< ivRRRhmm񐝝MKK ~! t:>C^yAÇX,āHJJBղCUUǏB4НN'%(++{A AZZ555T*W^y˅T*%::K.QZZJ0xܼyr.MMMdff"J#)) .#W\߿Dj5TUUqQ$ ?y" ,//xhllWRXXb… -["DNN8A6֭[L&zzztww,,,0;;hdssSԫL&fǕ+WHKKl6vihhСC  󝒒Bcc#*n۱Zܻw-666\z"R)fSTTR TJAAjd&''ȑ#E 6(,,ŋp]FRR'V<qCqAJJJG"F(d2{D"lf}}FF#&Ç !DADGG:Nzd} ȠLtttǵkׄvillCMNNM LFjj*n)^abbb"""h.\D"!%%F#gϞejj;wEMM vIJJ tR\\J"))^,AAAIIIϑ3gΠV)))akkϓý{hmm8VWW"))}jdxxFr9?я~:& Lqqm_]]$ Gĭ[X__Ν;raAii)qqq\.j5*=""""""""7|ə3g(..7o2;;===x^^/@׋R.[Z-DFFr1?Gttt%4rU 7s3g/o>c^@ S^^ CCCtwwwy666ڵk_FQzR՜:uo~477 UmX__giiǏ,saX8y$ ۍׯ_// H$lnn222Baa!d2x׸qiiiv 9|0x^ >cjjuF#Rz=A[UUn(N'O?Žٳg a08~8lmm122Bee%`B&5VVVHLL$'' No###LOO BAa}<+d2b`)))!33XAá~GDD111X,r#R);;;?ݻ,//3??O(1,--ǁ䬬,drrr_pQΞ=$&&233CWW69$ G||vq:zrMOO ,//}2z=YΝ;˗778q:444055믿N__ }6###ezz]4 gΜg~~g$&&T*up:; ;י%))-?4lll HMMhRX`Fq8L&V+PivvvDR1<<"22R(Y3 ,,,|IOOvjֹC("++Kv 6B[YYYA* ^H@0`~?HR222d MNNۨj󑕕\.gxx]j54lB!, Vl6( FFFz4 vHj5+++z* \&&yJLMM Mχh4bۉ #̫r9~ *FY677 Bc4!Ȭ7L )))L&"%%Z(^JENN)dz`PeJ,--R$!!Mzq8 677Op8HHH`kk χ^199%33JRC˯P(XXX`ooJjemm ARR~_06= v^/jZ;k'33P($:">O~?6 .SSSx^PpD񰵵<@@ }#\.k9_$ B5P=‹vhu:,.ɾ4s@ `ooOS$ {{{)I?Ds5By h="e Ãc</s"""""""""Ӽ?$ s>){] q_#vBC~sOE>ߏDDDDDDDDDX=1/ƺB=Bx6 Lp\vbccBQdxLN'[[[]AQDDDDDDDD/\fO||<3>>jEVr* \zmҸ|2ׯ_gllL^YYɭ[K.qR)p /^D)˅B@PPSSÍ7%--5>fqe B$&&ٳg1L/HLLdggw}zׯsm677IMMa4 Z˗/SWWG~~>*V^$ G188Hbb" rnݺ%H?rp}]٬'표Xoiiavv[nNTTP/ hbbZZZz*XV^/.]P(DTT׮]Ejj*]]]׿&""BWWϟۇD"aggVP{Gllƭ[$**3 vj[[[466`~~fffdBOcww:V+KKKl'*bN0r?*khh`tt}}}g100coo#ytuuFqqsq/7OxnݺEKK ߧk׮Kii)XVAY>66͛7YZZB"PUUE? Hoo/¦ӘL&p8?% f{{@ @LL `~sVdlmm?  D"Ap5ۉrqU߿/H4g̓L~~>{{{388))) RUU qqqvZ.W\att$JEoo/~!111T*n޼I__Fqdxx&jkk1͂#vVbccA&v9}4$&&2>>NEE c(ʪ|y3ߌ 0AV+SSS,..ꫯ"YXX@׳~YZZ"??e.\̌`$@ll,viiiddd^ͧA"PTTDLL 2 ezl6IFFExB.SRRB(Bc6簷q=蠵JE~~d2qMHJJ"##D=;;KFFxQQG>Ldd$c69}_{eX^^9bbb(**"'']dBE0X,'!!ORRUn޼dd2QTTD  ..(xVNcuu^{푱璘rȒ>4eeeDGGp8h4fL&/_F& l6bww Ο? ߿;w`ٞzxH$fff~:ʁb``k׮o>J%^W8)|Mt:ϟ'%%͛7tIEEF8wP(ŋ˼ V+WBRA0fnݺŝ;well8z({{{TTT/M0sAjkk/z DDDDDDDD~/LppJKK9pLNNMGG>ǃcooJŷmݍN_lnn0W%xvsEt:7s+++9sSN?;_Pfzzz~H梨Yz{{h4///w>z@TT'O `"_ױZLLLr8{,8qBPܿjPRcsss Q mmm:u7n#77D(bbbt: 8N )))HR t@yy9ٟKhZl6O_-nə3g(..~, 7llllGmm-?xШ n@AAEx)&''D" #&<~d21lllj  XRj1G;;;x^222@&&11^zb iiideejY[[>|hJjj*QQQ쐟OFF6 LF^^nJ%t:q:HRRSS1 AIMME+єd1@+Wh`qq|jjjғ4 ۍF!// ΋~K>3oo#&&HIMMnϩS麟@ ɓ'ihhe^{5V+ a`4|$''# qz*.\b%-233Cdd$.\@oo/ `T'%%Kyy9,JJJX,Q\\T*ƍtvv %$$^KL[[SSS䐛ˍ7 p:8 ɄL&###;wC||dzIqq1ccc9rEV%++Mj5ܾ}SNヒb<ҕat:Z0g̓!?Oioo'66ZMDD### HHNNJDDP`rr+W@ZZ7nP\\Ph~8="".VVVѣPVVF͛[ý{#>>s9<nYZZh4<}}}撖&# *### ZfkkhP qLNNbZY]]ĉ g8Ma1l6JJJ 2<(Jz{{IOOgnnA.|W q8NAM"`ۣ@' $%% &R(677C111,..`KKK aZZZr\Y3 F0Dד؃`QDFF2==.P AbbbfaaAhKjj*6 ÁD"y   /PV׋L&#--]"""dnn/xh4\.hZYYYa}}P(D||< NJJ 2jv;jlnn ;;;űJBBR<5T* Bn[777''lllL0$::ł ..% B$%% 9_BܜpSX, x^J%iiilmm|ښ 8l6vvvP*zdqq666e{{J|> 3??/l~p8RTjR$!!uN' !%t:C.cXp:|>"""D µ B\.bccuIG~?6 ٌSJbY__QP(xsbBje{{\JzqqQX狋\.3$..yj5fP($\+v:Z-fdd2HHH@"Htt4|>!i^EDDDDDDD9 lmmT*{H/3 Ƀ!ltA/*EAq׋T*_'%%兴 t1IH$|a,H jgwwWwD"v!} B_8B!n"\'OZ-7/Qp☊v'\,tب z^]^T*~J&/rB P(T*}ȧ^✈ODs^P<"Eyz!^ H$/tB!vww>Tx<qNDDDDDDDDDo}>; |Rx?N O~?u''}q>Oz\l6[[[O}ӌ7\~iiKvXauuE7Y`ii guusɚmnn>ng=~`Uw<,S`’m|fnnaAۣL [[[8߻O|c>zykϱMooc}GONN2>>I24!)V[[˕+W OSBVj>#N';wr  rUJhZ._L}}=;;; y>Ν;Ggg'z~ 3>>Nzz:kkkQXX*ϟOrr2uuu? FLrr2[[['?S2GQUUnK.ЀFAryٷo*z\))) RpJ.] TJ||<7oޤJS(B}]233ړw%^c B444033Cee%---h4L&KxMM W^eddG%ʬ566reZx<Μ9Ccc#>N˗u[[[ddd{GDDIIIܻw3gP]]rձü{rUVVVƍh4gU}Pf9rwFill+(Ztwwsݻh$66h4 ½reY4O(8wMMMHRf39sbccիܸq]nHHH`{{%,MN>ͭ[ ==slnnryjkkO>MZZ կ~.z9 7  F^^v/^)((`0H$N[[ $ .\ 11fT*׮]ݻDGGŋYXX`yyY^[[#pzzz0Lpuv;z JJJC*r-:Ľ{APP\\LKK ~^ tOQQNʕ+55ťK$11i._ QQQ1?? P^^$)))sQ(>Pr ---HR]Fgg'!***Ykkk#bccqQWWGKK 8 s-jjjU/<'a}ww7nP__Jb{{/200@RRTUUڊᠩYӹx"tuua٨BR4kkkvN'뙜daaaZ-X,P(P(DDDΝc||5A__Fj qE1LܺudrrrZsixxXemm>ʀ=og~~D&&&HJJ HNNl63==fnrB.]Dff&t:iii<+W8~8j6HLLl6SXXHWWo}G,..233C @RQWWJŋ \.?1rׯ_ Nss3dee1>>իW&)) 4v.,hkkԩSt:X\\رc7 ._̑#G4BtuuQZZJTTOBee%N666z E& ]Y\\dttXpUfcc@rX[[Vv;wazz,߿ϵkjr&\@ʢ@P())`0<^vwww(J233<L&/^dyyd쬬,HOOR::iz#ީ|\.'))wr]hkkcll[nR(..ŋLMM199ɉ'h4\zU0Μ9#˗cwwW^yY'995LFVVJ@ @jjs!233jn/b6^N ɄlVQ(,,,ꫯ>2ֽ+ Bf/hb}}"</^ѣ} xa``ӧOcZ+Wp!z=@sC^^q 1LPSSf#'''O>"ՅF~?244R$;;۷oġC8ts=f3{qꨯ,_s[[FMBBϟNGyy96=Nvv6N }6N^:;;줷WPx"KKKO[[MWW333ܼyQ9rϧ.ӹvLLLp \.}n'))IH$XV/L{ĉM__ܾ}'O B?;::AP6111ǓLGGuuua2`mmtj5iiiz>j  7YxWY^^R,Y[[x<߿$}Q^^Nii)###=fNGGaArjj|㉉!%%E~&$$1hZ!2H$loo 2ܹsDzz:a_~癟geeW^yq666X__g``@+"lfrIN'###Iaa!ׯ_LJ~HBB ԰&Kgg'211榰QBBRR1Bdd$~.lPZ,{x.eff)嬮*zݻG(Dfc``SNP(X__gppCVt:FRSSl;Azz GWW.;wм竷hMۇZBLDDDDDLg{L}eeӧO/o>jkkVA񰻻Kdd$o6sF#rQaIIIw\.'p9L&oSΝ㭷DxQ _WW(ʇ066Fgg'mmm?>lnn۷˿Kbcc^y~m|ÚٟiiiŇ~H~~>G%22MvwwzT*t:SL&{oo͆dv޽˛odggJFFucbbdmmM"##/ynn.j1\t`0ȟɟR8t%Μ9éSn7C8KJJ g ttt~O Gh4A||rC2""" &&\coo@ L&vxj5Rֻb!77N'}|;K&a0x9vhhGDD)ZBdW^EDDDl~fRү~+FGGQTzOIee%ZߢT*Ƞy7ի>}t:tt: ܸq'N+ĝ?nj1 jppFF#?)**}k )))Or lnnRRR0 477jj(--% 7nHII 9ijj>;t>?A_m677INN~:tzZ-,--QVVFEEÇ:/mmm|_gxx׋dbggJeaaSNy饗sܾ}W_}_LOO^'77rQ $$$t:jz9Z[[Q(瓟Ǐė}1<<̥Kp8(J4 ^{$ 7nȑ# Lr=,,,t:J$$$/KRRR DBdd$7x-am8._ҒPw!`iiIKMM\^|###ILL͛|;y(422\Nl6 5N8ZF.#Ɉl6@}}7FL&CTV h|ߟѣGx"3g8y$KKKT*d21N WDDd2AYYP 4<6qqqO<]ѣGsdeeqiBjj*ǪJdd$.]СCvHLLqxii)?e߾}³QHeĉ >7|e"""0F^z%{L&czzV+l(PSS``0<ԞP(4~LgkkłNcjjBZZZЀC* e^E&q5L&jֻD"AV #ݎN`0/SRR»x ijjݻ$%%!Jq8+M{{;̐׾5n޼理n~;;;턄vzc6 bEocxdb~~hEcPTh4V+ft:vB!KcXӉ``~~( Ea20ǣVE@뙛#** , <j .+RܦjILLbje~~KddXɓ *I)"Cv366sJb||GBB.Kf,BAbb"Zy"##I`0$y8r:%<ŒjbAףP(>Knr)eV"Qbcc;VZ9IO mjK/kl6J%*f,qnn7SSST*D3 VU|H 4wn"fbbp1W˜pNc||\t:``rrEBBF|DFF8*E8n㄄bajjJ|f|/MJ$j5(J m*++y1 vRdaa7|S ,, N,,,t:ES IU4пK ׋րo@YMhH&>EEEOUuR466hd׮]߉džvj$KedddddddZ tɃgB{¾ҥjqoG%q#x. oJ5HEʳlo }s% ?v$/d*T*_Vh4*@RqN3}V|>'K!2=r)X4)IV"Pp8!㹇x<(g~?VuFR~Tx<"7j<պĢ1R)'H!_'k|%4YOxqO+B/k/{h)NKؘPmu2uR[dqqil6>ױ _*_ͳdnn/}`pps{@8 r4662::*{x|D}}= K:_Ijg5OjY,Ӯxhmm}bOg?I?( ;66rN>Mkk+iii f3կrN>4NFF| 蠟~+zF?˗';;[rn޼IHH>|/W\ٳtttݻw9vMMMBqO>x^ӁG^J%yE>_IAIHo:u MZZ8c%c~JKKuY >2LCvNT֭[,..ǹr 333RWW??HKKO>R߿ϺuP(ƒ.Շ?$>>+ ~\ⒷVjQ(omJUU֭T?yZ?r\CIMMsN<ɝ;w BF:FkÇIHH@R=Mo9.^HFFƒl9Ν;ŋy!999qAjkk1 vGEEnbՔ999'P]]Mdds>}M6144Ç'..ā(//5kHmmH'######őS%h_<S tJEqq1wbPPP@EEUUU$%%jp.eee@ff&۶m#11ʦM@EEJM6K tx_l6$<n޼JEGG۶mLFFGhZ[[%##iiia8yXlZHV^͉'>86l ++KnbÆ (J:oͽ{cժU cww78~8k֬a|| .033 /FV*֊|&.Q^T_Vɓܾ}P8x LNNC__333\.N:Ess3111tvvritn:ꈊ`0P\\Lmm-g6 tRɺudvvEؽ{7ϟdVXѣGYb T*Yl111[aXzl8N:EUUcӦM%zOOǎ޽{$%%q}N:z胃s<@TRVVdbbb)߿ٳg ##'OR__<&D]Ftt4\r) <<V+ׯ2"""p\ KJJ ?~[R__^'22u" ̰m6.^ȦMHJJ"77G~zbbbBӑOTTk׮d2vٸq#(`dd]vtzl߾]*,,ȑ#s^y&''aݺu<|h`xEvAXXny!"Ŗ^aQ!!! qY.88xvLNNR^^b!66n8s UUU455ϱchkkCTȕ+WZXV~ʕ+TVVIqq1܌h$)):˚5kD.^s^Ff֯_OFFx鏍֭[yYnQQQ\v={f<Kx<FFF(..F!e u322zv d2yfJ%F233azzb9p]]]tvvbX'ohh6^|%@ c||+V|P(deeLz=IIIc#<<4&44ćZuu5,[L|\P]]-Llj^wMGGNwRVVF!55Uyr!FGGIMM^Y/_8͛ =sss|DDDISSuuu477SSSFl©S`jj^z?.">Z-ӧOߏBॗ^bpphrssa``˗Dt\.n6 hB~~> s@LL  hh4.ɧj| m۶OuKK Gl[["N'gΜᥗ^bϞ=KWWmmm9r |2ϟgǎ|*lwll. INNfzz7nB}}= ( ڈ;wR^^NTT'Bll,N+WIee7ROB͛7q֭t.vo6ANNk֬C0r :;;bӦMիIKKcaaVKZZZ III| EՒ*rssIJJ;v8IOO'44hEh4jzzzرcǒ^D$'' ` ##AP*"g~~>O[tK?H3غu+-/&5y~=jjjW_Y:::X~=yyyŋj+pܹCnn..]z=ϣIII!%%***BR`턅T*y!сk׮}-4###C<ϒ|}HvFxE1<<'|‹/HAAnݢ*|l6_tuuCII o}}}TUUEUUbob :t4v+8q_]txtCxddWUUImm-555gg;ܿL]]7og?aaav|>lٲ={յdB`zz!}]w5\v-֭`00;;lv333CSS555 x n͆` 11NGmm-{dggp8%11Ӊ#33PQFa~~JDDk֬ATF\N'GAoh(,,$((9޽{{v18|0[neʕŻ8333TUU+7߿Bxx0lDFFHdd$~ݎ(Nʹm6V\ɹshjjBP@dd$J4222 l6c6YXX ''Gl9INN!sˣk\.111B9_Ѡl^'44l҄nj RRR팍$ñX,DFFVpt: ncٰZ[HF#)))LOOvIII3gDIOOp&&&R$??9t萘ܹC~~>.L&]Fgg'?ϖNJ r5Z[[~hDP`2sh4v;\d0La2l|>pݸ\.l #++$RSSIIIATxP*X0233˗d2xh4`Æ l2t:;wwyXٵkommm~>|lfŊQ iiiDFFk.oν{G0&''ILLDEEE𑑑t288Ì0::333OO=''sm"""ezzSVVFaa! \|6oތhd~~H~322B]]:ϓ8سgn󔔔PYYɦM(//gǎnʲex!W\{m}r :֢Vgtwwe˖'zȋ>'NjT*)--eÆ 477rJp:lݺshh5||#"-¯ Fqq1NbrrSygggy>233t3::*brrZMxx' """ ɓ_)a={[zy&z5k҂BB{Xv-(^͛7"Tnݺ$l~~ݎdbttR}J%^Z,Hddddddd Bhr|ܜ?䙙f8;;+^b.:L&-HH"e8Nù\.<Z...Htt|> QQQfffD5,7[V3==--畼111f2bOf M&JR,.rP*rD.v$$:&&ۍdBlj #<<\sbjGjfP(Bxȃt:q:'#p|Jx<_BJ&H?ãj% @5x>׻?/<ϒrIeIeAz&S$?GOOvKgV{|>nѳI*.x]Ϣ\^y&?~M{fZ}bΜ9!=='~8zQ(KKKy&jZhx^._̹ssJgup8D N:Ecc#))),..GQUUl&**GR^^{}ҥKܻw V o>a1 477NFF'88/RTTNx1999\r';x<( 9w(,Fd|>BGCR~X3dzd>%}g%-#g+ƽ4aiLtuuiiiX-p #G"Ҏx=IT3\pE\\Rhjj5kֈrJ]~ڻbarr9n߾M~~#i7 +W$((hɵ'&&8s V?&әo,*GFFFFFFgaaPwӉJlڴwbX(,,fh4\rW\!::Za۶m#))gƍjR]]޽{YrP[45 k׮jĦM>w%衡lڴjT*+Wm۶T*$''Gawddd`9<ݬZ ŝ;wxY|9:x9qyyy9x ӔMhh(F۷oaJ%G?GP|rfppF??я8qYYYܺuM6Q\\,RIV*Ցי|@zz:j;۷ bnn?)Y9y$MMMDEEDž Vee%[l`Ynn"&&ƍihh񐛛Aٸq#]]]t:_ŋŪU8v+V 55AT*˖-#..FFFJVP9z(ܻw-[< 4Ϝ9CYYQQQJCCD|ڵkTTTP\\qqq֒Muu5333tvvrE ի I~~OÑ#))+WPVV$iii\|r_Nxx88qfI__ 322R\S>,,!w%jkk9z(|>Ξ=K}}=x^?Nuu5Y9BGGiiiܹs'Or=222pnݢYdhmmeppa&''QT:tIRR6 AAA\pNDZcǸsQQQtuuIcc#A,vN8AEEZtwwBzzH).bccinnLLLӧq---deeT*ô '&&7ochh'Ob4l?~6q444*^MM ~UVk.J%ܹri ˗1ПTbfrJ޽lfƍ(J0$%%,[lAPpAn344ĩS cƍGp@bcch4 v/U fffhP줰pbbbD^X7oM~~>^֬YCSSGTLoo/ "Œ墫 GWW.\@V rz&55X^/^)RSS@ղ /$>ccc*,>F}}=LNNRYYIjj*wܹs ȫJHHfaa9BPP:s122`W^app2331 tuufz(kRR[PPDRRϳb `$&&MZZ111DDD\j[nT]߹sY~ϛ,^x6o s/LLL KcݺuP(p8edd6F#"o}}}H9fqq}{";33]Fcc#w?1v]D T*/^NNJ+P՘L&gll LOOJRؽ{7.]rӧQ,_Kn˗/Z͵k'++5kp N'166z+V}v1333墷~&&&XbF͚5kž>(?Oijj!^z%|>/Laa!rMzzzhoo'==]׮] 6AXbLNN󫫫y^Ζ-[شi/^dݺu? ;w$22FSSSDDDrX\\$== fggQ"繌w>O>a޽P__Oww7ׯ_͛#yxl޼ uݺu+ T*Ͽ1>uYO^^۶m҅wN&55X_vs&&&JyVn߾Muu5; `6y&)Պ#>> 6c>|(J $17ndժU155dtݻO~<}Иz=ݻsΑ&,,⚚*Vpvqqqbq&##BAOO,..rA"""xWQդرcdee==00Cعs'ܹs\/gK(чq:a4 cZqX,! ZR[ O퇕h4|>jZj5 СCLMMObb"+|WP(t:pxx .bRD~$%%n:^uRSS9~attQ, VѿX\\p֭[ 7nK.Q__B 22 08v;E(FsVfcŊٳ۷osUBBBHII!66vN"<<J%(d2q9f3 T*~ӟ2??>9ʕ+ٵkUUUTWWիWٶm o4T*GԦ%jEѠjezz 2}2222222O qo~Coo/c֬Y^^Jtt4۷o˗/t:ٻw/s]֭[GDD_^XX(BC/\@yy9* :)[RLLLhpA߿/>8}Ƞ+W0>>NVV;wdŊXV6n܈ѣ444vZ;|>333Ѐ#777or}6oLZZǎeXXXݻ,..i&]F}}.**V\I^^Ǐpvڅ^_>n-RIDAT22[oECCaaaW_$%%QYYI{{;6m"::Naa!CCClٲ,+WdxxAzz:.⨬dqIz=fxʈc %66u?N񑟚Jkk+< 99DR4tvvrINNe,))!))IG q())(n߾Mpp0 30sm\.n4>|(«ݻ$b/_b233`dd`rss1ͬZLAnܸlذK/1??OMM ["p8dff288H__*beٲeD||<˖-#""FwV&22!v;ɨT*&''ELHH|>JJJiiihZٰaPXXH~~>QQQ Epp0f"󑐐 tHrsszjaʕ(J"""hkkFl7gڵ.άV+oFc2pOgg'FINN&33F P$"}immG?mmmlذX&''Yf 8N~:$&&2::ʪUERNիW)++cbb7|;v2222222|wܜp( fffhXp8~BCCR*+Fl6c0t✐nj l6<2|%,333bo‚PGT `V^jxPDDD< <`Cxf3Jp~* """pݨjj5GXX 9!.j1 ‹ !$$DN*l&gffJPRpt:v;AAA(J,HJ:NtX,\.BCCQ((Jfggimme׮]\.l6Fhh(v^f^~,GP C-<_ $$ tN~?ǣT*\.j5z)Q -/}n'WRVոnюj)!NC׋"h4٥qp\ljZ6"azznܸAww7!!!hZl6n[ڵk?%//MxҼ w#Ӊ`@bXP(VVKhh(^,w~ֶ˅RDPx}jX<(͙O{Á^s“U׋lR]Ku/m_zh4,-fT*x8] ASNjsbvt"2IWKGG ~hh(CCCx<233n,######5244$Џ#ـQQQK" j?O B]"@^Ha&@YMh>FSII͗yD>44|GSSdggSRR"/z賳ϓ\r P(X,k]A*Vޚ" ͆B 88,,,,|x^VZ"$OY&> !########ǁj_@W?~$0> vR t)Yh6ˠ 3~R=H9J?}~N&v6j{۽$wB!vOVy"Tʫo V,=+E,^K6xh4TcAFFFFFFFFITB)z+W088Hvvȏ]]]J"))s%*;Fuu5] )ݘFӔLvv6Ӽ{twwS\\(| ΒKyy9@bb" #?LNNsss ܶǎ/TGGG9p  BCC9x 'N`t:N:%1%%wrIjjjErUV+TUUqIz{{Yfo>rss hz^T*z={Gzz:RZrd+JΝ;eeeܼytq%.^H}}=_HAr Ν$l6|`49v׮]c``Bjkk{t:477s .^Hgg'7nDP`Z1 Bvs!0Z]2gffX,\rBJȰ~oX7A`5x].*NG]]h4>*++Y\\$33SNq9k֬\LFGGQT,[6n111X4XXx<F޽Kbb"n"??3gΠhhjj.$99 6Kvv6ܺuM6/Mkk+/29s&RSSfܽ{hll//tvy&l6NΝ;ٲe m6;#nٴiϟgÆ O|q|TW\\XV֬YCcc#&**XcΝ >ZZZx^ETr FGG?u_ш㡷 6| ghhOaa!*(!Bdd$NddTVVGVVdl½{JRRIII#OSoo/*Μ9J3x;**}1<|>t:q :ׯ_GVaZ -- (IIIš'<<8bccrNFFsssh4F\466GYYVUD ":::pK*()) 6vZT*---dddhdʕPUUEyy9EEEٳDLL qqqDFF233CHH~$F#X͛7INN&D:֭[JJjj*SSS̐Jbb"#######mzWWGW_%##wիWy&*L&󄅅fsN !77ݻw cq&&&裏X|97n҅kii̙3|p:=zyſT*|>u\Buu5h4^}U^~eFGGEpss3?O aaaCRRk֬aӦM"^mmmo>mƲeˈ`||IN'dddsNbccaQJZ-6H_ܹs򚔔$Ҵp8D]x<RSSyP(C^^}K/R$66ZMGGǏ7|{{{9|0w&77;wϿ&&&x"'?2K4440XKPPA<.9b8YbäT*Y\\vֆFŠ+w#((|***^cŊܹs:ٱc333a4y ҥKot:9v(J6l׮]###_~R<owܡ"??200^m:55ŦMx!]]]"2h4288%??_w /`4X,,,,rJFFFcݨT*l( Yv-555 T*yW,JJJ83g133CPP!!!b fkZ^RIHHNSxDen!Bv]IHHT>Of0h|&Rf9N\.N'oل\*wpp0nj[Bs Hm]O7'########~@B %Q灴n%1,IP&JDw)^Pr ti2OGDFFFFFFFFFP,yQ?J>y<<Wޟ,-H߿k~R=(gZ"VƼƁ,ARm"#########PBTw% \9!Tx0ͨT*T*v:h4!%~f @wǃbYϋ$jq:"]VS6M^)JT%"Hv]l6v!R$ j֕*)a\.Q.׋lBJn"DpmIHNC*Xj7IΝ;}i#%TR8ͶDNBj[(IK7PjqqQԥToBlraP*"M‚u$r\R6? \R|X,'"l6URY%QD:Bf?>د́*OB{R_{RHrׯ_!!R~q*++jܹsy&''{.[nL VU!׋bAPǑzi >in|i.lB|pnnJ4 aaaKJyrJ1&&&0KgX>|>T*8–ݍdppNx{{ }H}sboo/555$$$={~rrr~'T -TJP>$/ Gd0IOfppWrMn7YYY~^/QSSCZZ3 4(--cXhjjbllN87ahZiiiٳ\x6oތBXbKG!%%+ ~ t^>#!++K.QZZK>tbƍ"AuDN z3I[¸4H8 <%%cKZɓ" $E}mETbE&x4!Q^^NIIb菷I__~!MMMLNNÕ+Wx"dff9v333444qFE/Ձ) +W顠@l 'Nj8wtvv244DRRǏ)8<ϟ,pQ*DGGSYYBISy&ǎcժUܺuI 8<ׯ_bɓ'tp]>L}}=^.Kt:b`nna(,,dvvVKHHȒz$44/VH ɓ&''oիWٱc4KeZ9pqqqz¬d,J}7oRPP$Nu).EBzN8dn|VJ3`ٖdp8T* /Dz+thc%N''##1(y|p]illȑ#]k6}6۷k׮zN>MKK GQ[[KHH7o233Cnn.NB裏!((0>nܸ!֙3gps=8@]]xTUUaHKK8onnoodeeqmشi^l mFGGp%D۷ooݻG||<6l 55'N֬YCnn.)))#gΝ򠇅qFv;weӦM=qqql۶Z4 W&((.n݊Ncٲeq)6l@ff&< && V+/^dbb"|>---l۶˗Jff&%%%={<ٷo Z\III 6V9wo6}}}hZټy3ccc`6_ɓ'1|'PPP@ZZ*jz}}=\v JCC>YYYT*9z(uuu( GV+333"~>{, Z[[9|0^Pjjjسg7o`0p5֮]Kyy9񤥥uVܹ#77 @=::[<SSSٳk׮yfVXڵk9u+W$77 T*˖-#11M61<h^/'Oqs111"/(Kgffۿ[TTTP[[$X*++#::rjkkq8-z*tuuG}}=OfhhΟ?OHHn1fjj29s 555DDDĵkHHH`hhK.LTT|'rؾ}ײU!@蠢B]]NΝ;"!!|rHOOÇ022ÇIIIaJ\\ϟ'==V߿륽 Mcc0O>۷ Rhll .\@T_łjҥK466رcJ}}=n:BCCz*[nrQZZJTT7nܠYF# bbb:;;u\rH9<<`nnLal{^.^H__MMMSVVF\\T*&==]MW^'?0rKKKO~޽{ ˞={8}4\|FCee%_+b-[Fyy9^)~s) UUU_58(**bժUX~_pBBBy&/b~~ZvM||<555L&T*?8uԈqLqq1SSSrٴi!### e ~FX,_ZN'Vb2 22ػw/?~Fȑ#"y}}=7o~qxx8Vnn+$::b J%aaa/UWWn:""" yIHH -- EJJ wfhhKdd$uuu o墿`&''9qJᥐ60III1557od2@ll,z~FGG1\v;w,)B`jj>"x sMv;nݢ\rqy뭷f߾}h4V\ɉ'FsefggIKK_f``8x<466uVBBBXr%!!!DEECVzn"**fgg)..&22>ׯ͋/ի9uz*/"w~fUPP4ٰa'333DDDpE顰boNjj*wyz&&&p,,,0==M||/LXXFшb.ؽ{7۶mcͼk^{aoƍ h4 Cĉ Z-.]Ol9|0DGGEXXsss$'' ür|M~#5kÚ5kصk رc`0"&&1IIIPf@<111|ߧ l߾m۶177044DKK^#""۷s=Φ f3Nll,\D;i4?LQQRضmW^F||</^DѐFի}v^xL&i\~mnܸnf}}}x^ !//oIPhh(^Fm&>0Yr%BCCqݴ_^{f /hkkƏ~#Hyf$;;z:ԋJ⭷bڵTUUihhRRRYRJw8Np:$&&&d`40h㙜daadq:LLL@LL AAAq+III!99DGGzH\\slfrr$h4. ZVQ( /E ?j߽{cǎkLww7իܺuKz~~>w&&&QRSS)((Y\.>l6STTzj֮] WWW/>\.8p[o%rP;Ioo/---TWWsmJbpyя~DPP(gjj*YI<n[zzsss}v RIss3'O䭷>|{)B 311SwA v%S__OBBB{ݙN'8f? afݻ]!ӳ*nvWl6fggEz QQQe믿NTT_~wyRd2qIQRD`|P[[K[[֭TDH{n7>ZB`ʕVE{= qll2~_ߏZ8,,aFFFRv;CW]\\dffFO ̫LMM'g$ͥ4{˖-_񐔔D~~>v]xcccyyy޽d())d24fj5NÇILL$;;M6vh4,..211iiiG__XPC*?=.r8u6Ml)G3gΠP(xE_ }_%mpp '<<\Fy7qݟCoX0L"cllxViQlϞ=lݺ۷sU ]?33dnY###»T?R{J󅴨b4 rq8b.{|4HlJJJb4͒q044KHHXbcc`hhJEFFLNN /lIIIFǂINNfttQv;b䜠 q6 266FJJ0"))Ax<.OI}@22222x|f{LL bxxiBBBx饗G~aa![laff 233ټy3/_! 477s]mF~~>mmmdz|r !t:Y\\\2K裏a||h<| CCCt:^/'N@P0>>NVV555TUU111AVV{졸ϖ-[p:9rVoNLL 1^hiib 套^">>GىjKMM ^;vpMwϺuꢦ7uV|>W\Aӱw^BBB{ffzNw㥗^7|4K/ *77)lقgzz~[سgTTTXXX 11J8ucccLOOēu~0Lt: hooe˖ϡC!BpDž7.ڑF^ތ &''Y|Xh Z"{ex<JKK 7 ))`2HMMeմ͛ټy3###\~˗aŢKqq1TTTGff&###(J6l؀B^"uXv:\|^}UEXo)BQTB8355UCƪU{SBv+v J8066F{{;6Ms,ǏÇ8N QTsm1Z-<⑑LNNh0sf3"|?<<n7$&&288$ XVڊZ[ujjj>??Ovv6*Y )))›?;;ƍ>,_+W299Ɋ+ 55FnSXXd211+Bff&$''uV%33&'''44^zXJKKY\\7$++:{~xxJ ؽ{7*Rj5o)))ܸq~^{5VXm۶p8(++#**_~DnܸÇyWYr%TUUh˗ _'..rx7(,,F^x֯_k.ZZZ|2$''E"NdddddLbnnN 3338-[&V~?ZVfK+Ǟ*HҤpsDHHӒ!-yY}^fffDrB>PUyN'nR2z\.גT^R :NxZV+~,}WKwRK&݃G>@"ij||Ģ$q>^K+,CSS477WWDDDP$&&gZ lJ#Ei\JZ{R].>Noҳ~x<IHHXlm"6t<|ʪU|(Jzzz8{,IppSꏁ}+zXRϚ4>+< Ƽ4H cCY+RHsސH}5%(IB*o(]TρC*$v&N8I}]wt /yKzfiΖD$>8K@OtHm-={|"];5Hm ]KRևāHHH`Ν#UI=] a!RH{8$*՗?IIqX?'R<|Km*yR}S@edddd144$Џ#mA{|S IU4пKϋo ,wMhQioo^pv;<ZnЀb ++'磡 /_Nvv墩 Ʉ'55+W~ї!@ȋ  '+!+]^)-/~_{ٗ<󃌌wYz2?k,!?TQ &ep F UK~R=zПU=HQBxTH)j> =|iWݟ,)4?}F=ߵr? 3ic>odH?Mddddddddd%?ZLNN xdX,!vt:QEK,..±'''9rfnn+l6&''Z?ە~z1==-ul6Ha$!)K"-ӌa6Eg'~%r\LMM:v8LMM1??/<6i!L455%T~ܻw աv.VJd6:u) \MOO/v%P6 <ngofa8س/ujY<~+޽{-cQt:~N{{;˗/si}}}=.\ RIzz.nLVsYnܸ۷d~~M6122ɓ'}6,[k׮{Hrr2)((`nn?'j8y$ܽ{e˖<twwc00 9r#GqFt:ՑHGGTUUFwuuuLLL¥KСC,[QnF`qqQ,2X,7vjB#CtѣjVIF`r***uqqqX,> ))/RSSÑ#GXr%7oޤ&,o>Z[[D_Ҭ}SufM2vr K9#""1:.\@^^wNYf[nn7VR)ԯf 177Gll,N&An7EFnx^]R^XXJRJ+3g%**J(KH.$ii[tf1::JYYh4l6Kg?Z[[ IbuՊfQ+µkװ"{ihh ##@8/_&77V+I%uiF>|:;;Ylْl ~~:%%%,yjm2 Bш[iq磥dddddd2i֞߱c*o$''ׯq:ܿqݿwW޽{8bbbXr%#III`0 /pIo8 555)++زe˧ۂ^gӦMZ-===ܽ{(zܸq4󵦀n޼Izz:\.JJJ`OjILLdܹsFÇ;p%&''䥗^_>'::MTTӼX,nݺj7ߤ{yf _+Vk;wl***Rx@Pp 򈎎|>ˣW^yZ uuu bccikkjΫ{Gvv6˗/I\\{ˌo͉'⹯^Jqq1V\IPPϟg⋄zvZAhh(?Oq:_%$$Ç1L撒"r9sӉqa7A`;)R"%Jܕ${b8I4_'Y;+i%DKTaD% zo`03iXUHIs>>ےx'9y$KKKT*=s233 B<믿.|8y$RϿWJEDDDDD|`Ŷmۨ' QVVF0nc0t \.O?4EEE8qfQTd2;T*n_Fsth:zzzطoWh4ىD"`aRD&qmFBBF3 pi222HOOgee\`y¦oݺuMf3FÛoD"A L&C3==-SSSLNN{n)))$$$T*릦&*++_SF駟&77B}z{{YXXnS__OYY?q\n"XnhZ.]DFF[n>}h4`ܹs_)b0fqq:t:cccjkk1LsMl6BVcǎ=f. 155 >,III,..LQQ=sN>, _ٳ{̎;عs' ?G?j9<cqqN?#kO~9x twwc4)((v"8pË/HQQ@ ]]]Q #77]vo>N: ɜ9sN͛񕒒BMM =,ɠvK/Dx'Θ 333tvvHss3p 6P[[vo344s=B| (((`,-- ӕg?EEE088ȯ~+8@AA&)L&燐:GQZ-FNGRR=vnA6 j6hTh/JB`ݺu<3|^ڛ7osarrrgfv;󌏏 s=G^^R(,,-"x333C0dff,W&л\.v;~\hDP2 шZ&FG+d2aT*>  !wXEJ\.ԹO'''j1 $$$Vz|,--hX^^&..̙Ԕ`1WRQQ2jCظZYY! R#//~kReBʸkMlm * RB 99}{sz=+++D"? D"!99atkcj5J<=Z&!!aMf3\xFV+ǏgffG j2G &DQ. v./ Y9b rǃyGEDDDDDDo377Z;v`0e.^HII uuu={gϢ9|0ܺu.͛BAr 7oc/L&8INN& [o177'/N"2;;Kaa!\~y 8t[nEPk.o===d⭷bddMMM 2R)=  ͛73::JKK {졢L4e۶mj~zVVVL&N9ܶm7nܠEvM P(426m8]v1==b!--=~b{glfT*njjjظq#( n @WWmmmOGoo/ٳRAX8IKK,HLLC8,Y>66FGGӔQ]] #FɄjeӦM 133CII#u`R֭[8t: , `RI]]\pLVV+++Y~=TVVT*illdddRu1??/^h4bو#??L&,,,p!v;g|h4gj5)))TWWHYYhɆ `aaݻw3334& ZM{{;֭2,..Njj*:|A )//'##*"D"t:كD" OEEruFGGygn[496nsss۷fff+8 v())aΝ$$$PQQAZZǎn$V \|q Y~=PݻwxE.m6 B! gqq3<#FQD"HRlBss3~8 Z<<n ɢ% P^^N$77pt?e D"d2D"#w8`=cg hbeԑH$B!ᙱpX}α:o1t캸8ᷱX'zg1MZLk;/e[YXX@Ѡh֔5rhkkczze?'HR~1LϿW>J΃~{ػ-cF!Eb8e$HKKܹsXV~ }v;%exHOOX3V}v[_WQzzz0ʹ n @nsB!!۝"V l̝ȝo}X='b~_ܫwCTf \}{[wWz w^~k;L''$%%)Ýeltww388(‹,_W'j{9U*}{L&zzzwE8bQvͽ'\UΈދ߶߹Ry^ ֍;QVVƍysiKnL*`A> T<̷Z&*MoT$O]?4kpX0c\gu|Ԙv EAyOOG_>Y<2|. z,Md 3qЍaAR Ѿ \VH$kLܿv5<=f+J_UOl\;EDDDDDDDDM$ ~3w/5fyͧc~~_3//,v>L?|\.A"J=F,uV%11Q\cURiZp:r҈cyyÁh"_r7+ʻX\\$..BN'Nxh4 X\\$ RtvINNYZZq[V{ii + F&%%VY\\Rl6D^`  t:q\B=BOO}M(ݕoRL%%%}L&cnnP(D\\& D<*Jy`00 Z_`7oRRR"D>~Ebb"p Vh4*E YXX@T )!? pE~?)))T*" azp4k&ӧOիW1LL&fff7c_|E۹u tttLAAV_W T*F144Dee%2lM6Ξ=KCCpO]>CZZZvn~_Ν;>A*++r ?IOOuuuc;\. N|@[[R^crrxZ-oǏg( ^~e:::hnnd2100Kv:\?OGGSSS_>)((@ 񰼼,丶( p$!{,b;N^/A;Fii)*JNR=VY;w\z$N'/2 ŋikkرcphmm%--@ +R\4k1!v s)..O0D"+FA f@Pyn7r_|$~Xf/,//ikkJ菙yؽ{Wq-6nHss3'N`vvoաȣăYD=;;;wG(?e233 tvvZJ x7`ۋg?*$''Гپ};>~>u#Ž;hkkCѰqFF#ڵ VKMM oMGzff&;wddd׋B`~~ݻwʾ}ؼy3:x?l6OII EEE&Q8qKKKH$>#8u\xQR\>7x[nq-9qNgϒDKK ?Dºu|_gV SSSܺu KZZ$%% yg8w[l,S1 k.$ D}}=FIMM@TR]]MII 'O_W$$$KQQ_""""""""?Qjc._L(χDӡVR[[ٳgilldnnN0~t[o133jizzzxAt:---r!-jsOBA(̙3޽Jܶ'O$##$<?&/Q(={rrr&T$ ohZ-lR)JBRR*!f3dQ(FyqwiǢ(~|;[^CYZZvDuu5? sϑOzz:Jk׮Ζ-[ػw/gϞ%z#IXݍngΝ(J&''9qDDqq1.,--133V%99cǎvv"D^^Hf(((`eeL'--)&''ٹs'Krr2yyy,,,`4gLf(( ZZZFnTj>h4zq:@&w^(>O0z8zzzhii@ @AAŸnn79r\.<[t233sr-S Oj!IHH N:ő#GHIIܹsv6oLaap;%NLLӟI\\ "$ n&XmJlݺF#EEE(J*++QT,.. 56 sQ&QPP-[,O&b6)++#77˗/8rȗ]DDDDDDDD &.bWVV(//no:cioD c4n>&΃& H>vaaZ-o,T*+Ow)vg=lX~fu2LOO ?O߫%VAWܫ-Ws,bXHKK{hV`E҄zw%n޼ɟɟh Jrrr(,,\3c}{/5EPFzzgvIk( CdjjJPB2 B_iVoElS;7w~ZpZƝ <^Y}}5w>^u6_ݏ8F#: A0{{TuPt>6=^@III?F%pΝ zݯ]>o;vݏ{ ;JDDDDDDD {:}qq@ZS@ @ @} A. )ݾ H$!=B<ߔvH$|>Up||CPaNd2`qgcI Dx<o%T*ӠGQJ`:U3qOII\*['+HlD"n#H0_jSSS{ `ii+"' "J>A"?s+nU RT/2޽iΜ9í[F rrry&Iee%KKK?' 'O***xOO:6xZ-'NرcرB /0$%%1::JSSW^ER!ydxx^x&''vyyy5iKKKByT*G=))ypLpFYXX`yyVK__)))AVcp:h4GRS:ŋikkFv;B^cÆ 9s_NJJ ++++LOO#˅1vt}uP(bt"XYYATx^,.|cGTL$aeeLHrr A^/RTH]v 8n7P8~_&E"ׯ3Ӭ /088 eeenJ0N:+† HHHt 9οI""""""""mAҬ}G]]}}}rIA //hjjBb6\app[bZl)gϞ%##ɴF@7Lva۶mbR[N||d׮]g={;vPZZ$)))cٸx"pXxAaa!ŤR^^NUUΝBpzdffn:RSS),,m۶T*|2;wdvvdvmۘncۉFg?ĉdee޽{T7z*tvv2??O8fhhT믿(}YYY-p\immt8<999f.\3|UsrrcddߏFann[ž}ذaJI]].Sfzz)((d2~>c<R'NP]]G}ϟb x<;v!nܸAZZ}\pTQ՜;wNSEdvvwyDb>cfggy뭷0 zimm% ʩSoLիW 1~!|G8.\@ee%QQQARRׯ_F`s""""""""_sD@DJϮ]8E zg~211!ܭlܸE"B||<>,$$$ hll$--ZvɅ B¸_5*vN'{A*233Å &ڵklڴ DEEo&,// \]ݫjrrrJKKH$š\7<WdN'$$$pEJ%qqqcQ(_z ˗/fc``a7ߗAףVCVqFM6f-t &&&"""""""""|~y>$pP__w>e~j\;#}, 033Cmm-JaL&F~U|>z v366YRRikk:^u(,,'D;ﰲ"\HLL$99gy"z{{)//br_PvO oSSSNQ(B_Fט~H$"HD~yu㳴D"ATIzz:_i-w>?#{RnG5˴ZCmGȷl򙯻Snʵ@@`0N\&..[o["ZϘPM /S@w\?4˃p8,S߉L&:bPy&Dxu`RE}m Ǵ߶z߫VGY2X=VV{QE#'O~,£V/7db~~Q~?z^u6D"j5vd2iYZZh4bdnn@ VerrF]}yyaN|՟X4sBaz=^!Q `||Yj5J9&''cMLLV `6FhZf3SSS5 h&&&P(( &&&XXX`0 Jq: ^3G9 166rPrV#^c )>-1ME3:###|>z=h)f`˥%t:P!D<###H$!F=4!cu/N$V<({<ufiih4J?VB&bctt{WÉ z{{1L077f}F`llL 9~8[+hiiaݺu299VE.399$Rk,CCCXVBAX~?\vWjIIIYӎq"4>>} .a{133lg#cccsb1?t2;;AX{dll%q/IDAT7oy21f]}8;;+3z'@AX\\DIF;EDDDDDD>3K.ǥKdff2::__j ]yy9/cffnΟ?555:u_;w ͛7ikkeJJJ>u#U\ٳg… ddd xW`Ϟ=peioogÆ ϓNnn.頻nϣRtjΟ?0/_B͛7ya[pi;Ν;F#SSStvvR__L&h4op!0׮]^5f1??&0==FLfaa@ \.f y- KKKK/DQQY Ɲizzzr ZαcǰS\\Lgg'?~7G144Dkk+ +p8P*deedqqLEVvz\.|qLLLn6%\nfjzj??É'꫄a.^Ȇ (sssk\~{¿;dffV~:]]]ܼy5s0o6qqqX,ؾ};X#011!4Af3K/lRn޼ΝP(PV(>}9֯_/KfggH$( ^}Ujkkimm%g!p!>xvlj'tNK D~~]կdxx5bddǏ(cccl߾y7ؽ{7~)4 ~iz{{C_IFFFX~=ׯ_gpp/RVVgrrH$Vz ۍ` !!IPE&aۙ^7n`xxW_} 6 ~:7n|SBDDDDD[σOCd?gnnOCCEEEH$B_7 p8JB*RYYIYY6-[`0 pݴiuuu|LLLH$BVV#f3?OЖggg~'Np8X,=z֯_OWW=)Jٽ{7ՌR[[ٳgq8T*}Yg||vZ͛7?!?0;;+X3==͏~#6l@UU333޽Nعs' Ӊjeqq)F]Z;СC$%%+O bo_ƍ¡R&y'?Fs/ٿ`TYYɻ\zp8Lbb"͂O~ennDKK 8p;^73;;K8fxxXhɓ\5V@̐yn~ӟ3yyyx<N>2zaO':Kr]F$aݜ9s`0Hbb"KKKnT*rJ?1< nKKKTUU $ٸ8z{{ȑ#\9LlڴI,\L1:q)))rFff&/2p8ϦMMa8nS\\LFFo&pX{7Ha-Jikkcnn2DQ >,dddi\.@7ni&~T*$%%qQAD"\~Ć ضm/_ǭ[{ illo> Vׯ^v͛7ƍ9~8ׯ_ Ay뭷X^^~պf-Nʕ+LNNR]]V% e;22B[[ZVp299IQQ#99ϣRXYY{aÆGaD ))za]CߥW `0H$4>|4=}M _M6O4-[ JQ*(Jf37oޤ:tR)XFjr9+++$&&rXYY!..J,mM를\ԩSB۷v)ĈN>Ncc#;w6kbKgZڄEQaP(jd2"p 4CCCk5qqq466b6eeeTfii F#|;y䅲s{sNT*SSSSO177fjj *4IIIlܸrN)Ӄ㡧G^nctwws-x7IJJ"77}a4.FDjj d2aDŽ90$&&gv܉L&{d 6 hO<͛˿K4 CY^XX1טA"0>>ҥK8N>`&o>,,,;'O$55Up033#??yJX,f3'Oh4W^BAaa``20ŋ9 kq vލR$//V_Njj*^+Wҍ7nZZZK.z~ٱc60Gpu_,^P(DAA &H$f3?TT*`*6v8==Mvv6`L&YYY<077[n`qqV+jEDDDDD=%%ׯZ vM]]R]]Bm۶Q]]Mkk+~d2V:;wG RW| |e2D"fggIMM%seAˬP($@AALMMf֭L&v)Oqㆰiazz\ƍfqqQsz~HNND{1Y^^nh~?EEE455aZYYY!775 d2IIIA*hdӦMLLL011`h4 m\.*\.sss۷f3)Wj6|>6 V˦Mexx={PZZ<&Ruݻ\!HÇnn}``T```$&&&t_FydddctG%))\.{1T*)((@*b4)**͛nSXXZ&++KAWUUVIOOgݺuSXXh 76zBhb$ r\0 \rÇIHHܹs RWW'ϓ뉋#Hjj*Ք#<8Ny'1L444Æ عs`YByy9XVmۆN#%%p8Lgg';w\0HOOpuN4ūayyg}9ٰa[!!!V֯_ώ;p :"ccc<3r^ƍ0C `֭ 1cXͥ\N$tFMM ׯT*h穧"11W200֭[ٺu+2E)//!8r,..P(,dt:1 TVV"Hhnn37EDDDDDD]bGD+++m,?Ot_XX@328._b!>>;$]H(A,..ޕ=sI?5VVVhhhv#HXnW>ϿɄB!l6_} n.S`0xϨ_7VVVB)#݋h4}^!{7 ݎV3/<LMM J;Y^^FP&=w.h+/H$uA׍XcmR(..fݺu_wbhT#kyD]\\]gffG=׉E&a0L&#>>k߇1kRk']2\NڷߝliI>uwjc_>zǃ\.|Ŀ H$nmH$t!H?ؘ_2  w u炰߁ọB$ܳODDDDDDDDD]H$PTOFQ*_xz|.}aaAQM1" RP( aXHLLD&DOO^cyy l6`bbq 0V{E166=WVVl_Q[`kxx1֭[ Qx<a rt&debوD"k}^V|_VGqx<;v BQQWp8aa``&P.KXbh4"˙ZvvzzzD" ~?,-- c{llqQ*wf~|>F.sxxV.?~xL&Ӛn7w|2ceeN믿~QfffPGn{"[[l6t:IIItuub49y$BQnv}{,Rg;nw{ǚ5pM8`0 `vvrpFAP0660Rx}}},,,(\|x((_v .^V%;;!t:{hhhW^yZ-999l6Ƹ|2(B[顽"MU\˗1͜?Tvn7ng, MMMƍॗ^"==]Hjv;/2IIIFJ%׮]czzsQQQ!D~:>pZVs%;Ʈ]=nzz=AD"$''ra"---򗿤Tz[,fffp8ajrbb"cffJ4ejjy ݼz}#?LV qT*[~)--exxI^ujkkyX,z7! VÍGI@ 3??\.gyyNvp8A"ܵw8 h4bZq8 y&&&044`00??b HyaLrnjGCCW^J( GJ;Y$&777sUz)(㴴c( ,/NfJKKYZZB277G$رcLZZ===?N'*^z ΍7X~= z z*ׯ_Rl6^`iizJKK1͌si:܋IIIBj9ՊNpzywرc@R)o~#t׋n  裏8|0p1 +lr)++crr1Ν;hh42002F 7oޤ;v}o~u%Rm5`0 ,//344$Cղ "ecc#- b /`innRpZXX pqa Ϲscii F/Kmmm/377G}}=tvvr&&&C_|Q9{,eee\zFXYYaݺu{||zaa!555h̙3h4ggR󑔔DAAB~ݻwSQQAMM v-䛍 ֲ[lԍTJ%TUUq RRR"11!vڅ`ٱcLMMa2czzf eee( AMvv6[+WP]]MBBH_|Qذ撙ɺuq۶mCºu똟'77;va&''|lݺLػw/JRMn:!V@^V&P>ƻKnn.a0PT,r\z{{~:fG2Ej=?? 6044L&h4255EQQf{RVVF0$PWWLJ~277Ȉ`QLFF#);w˗/P(;TUU355ٳg BB>N_W8ZZZHHHsMrɓf:::P*8q>rrrHIIW_}\__ijjrK/ +---B!X~=mmmܼyS8?I#Z@蠿b>CAp.--ncZ?˗/c4r 455BCCehha>LMM ϟ3gΠVϙjÏ~#hhhfQTTѣG9uRʟٟގFaÆ -[ggg9upPom8y$q$ YYY466R\\L&tD"\t7oR]p\m6LLL255E?j&''9}46I222.6nHOO]]]lݺP(ĭ[hnn2 >>_dffHKK… $%%eӦMi7o رcvHMMlڴk׮199ɍ7hnnt k]]]`6lijjO?ˤLww7MMMhZ?s\.>x [lӬh?Ο?/9,//޽{پ};NbeeBq9֭[Ǿ}(..ڵkp~˕+Wصk7εEDDDDDx$ ϟG&{nN:XpT*ٿϏ~#z*p۴t NѣwnG`xxgy$rIؼy KA*b8q< /ZV?sJKKo~fee~۷ p8墲bz-02L~xRTк>H$._L0dx<@P]͛INNǏJ pywq:39981L$&&rEfffarbttAXBORRR4ڵD\T*\ξ}LWr9;wldddΡCHII! ͖-[(..ŋඖjZ-p!uV6m$6P(drT*;v_d$"פ'[YYAV 4^LB@RD"5P@ J^/JT*0fddAJJJضm555TVVRRR\.]]]&&&X\\dÆ l޼*RRRزe UUU(JN'qqqH5n77orqM^/—^tv l߾~Dff&[n%99YzHJJ"33t|I֯_D"A&!J B(J瓔Į]ؾ} v;wdppZNXT*V+Nټy3O<#wYD"B!FczzH$lfffFm~~>333444zILLۋD"AVHoo/eeeJss3YYYTVV244իWD"Dz*###TVVNss3mmmSVVFww7 h4vJVVnf .3CCC,//D"a``B |>5?>>^O}}=_7oB`pp?aGLw:x8}4jLMM1::";;[x_bsb0??υ Jdddsddd`2HNN!fBB@9sya'$$j͛7q8dddAUlVv;w"v횐 ]va6 Bt:.]DOO%%%su]FZZUUUH `0HCC cڵkRUUĄpMBBO$..]Fss3[ȣ}MSRR͡fh4}vlB~~>Oww7;v젼.(--e޽Bm۶jgffF`e>::FZݍ\.jF4R)hmfggJ8gaaP(DNN;wddee}v"MMM,//3Ϡ&..N0;GTaqz0`4q:Iyy9~݋dffG2j>(t:6m"߿"vzu}}}lܸ;wdzz'|r{||<+++LNNb뿔{Mgggu떠OHHڵk|;!116^/_cl0HIIaxxp8LAAGbb"Ōa0زe ccc,//SPP^'++.vNZdIOOGVT*EPYY H{ BRVV{(=PLch4FFFHOOr JbIIIP(Drr2%%%twwSPP޽{gjjP(đ#G((( 3>>ÇY~=)))twwS]]M]]yyy h8|0,//377Ǒ#G(**BÎ;̿9x 7n@"ܶBdX,jjjؼy3 FEET*'''GΦ4Ejj*lݺUhr騩A*Y\\$992l +++e ===ܹ2'V$0TTT6l 11VKJJ }vZx /_ZL&#//OsbƍlٲHJJDZZ%0 '1189pl6~w~GV]]ͭ[֌L0駟H$(Dgg'lݺ\=~i ہ:dbhhhͻJ%GŜ71qv4G|ee+/zxϽ1_XX@V ھ-,,,h>UDlX,L&~>a8$$ bXHKK{hV`ŻI0|sss ʕ+\.JJJeF޽{"1 ~4<JRԄ~p'(|{YKF[^^FPƽ󞻬yWI2?i,H׍Xc RIMM dee}}eC_V\b|"6l`0fۧ@ D"!!! Xh4J\\m# =$MZ~ct|d|ݝEv;_i`sic>1So3;&X~\4b>_Fq\)  wWW(7;~g!v("""""""""lR>=Rr3MǃMz. (<+gKDDDDDQAFq7LLNNr-n7IIIHR0BYn޼L&`0OGGioogll G||7nH$LLLp-F#p;N{h(vcZ6u`uwݎL].}%j|餥^ҧ2BLMMOOOn'<(W\aaaAN bbbbͻcyy!JgqCFh4΄p`ZYYY˔-b0a\h'&&|~477399Inn# ?WS΃DqDƥKP*^Off&O(ʕ+ꫯ |q8XV1lذ!8w[lAP{{{OӬ566ٳgIIIA.r ++Wi&MZZڵk_pk )hmmnsI!@CC'O6Fx vڅL&?9DE4MMMƹs裏8|0HN^yJJJ{B!tHRR) 033AP0>>쬐yvv/~A~~> 1==hL'_VV+W^E.ᅬ\.TVVbXZlڴ~M[[* kB >>^0_~t333B1fggh4hZnܸJvv6_+G3gv355eqqAd2nzzzlz 񌏏c6 zt޵n'`X#)) AWWNDl6v_NNNPՇ=4;;K(rZQ(oPPP h4Fq8j$ ZN__qqq|eff\(JT* >\6~QTp%.]jebbjp_''' `0c~~^/DF>, ~!UUUw¼ܺu<ӧ)(( 0==-륻%Bin޼ɖ-[a||NRdff^d2CCC\.VDBGG.n[nad2Þ:""""""Xp2zzz0 h00L7nR\222ϧ z^+zFFUUUl6ټynT*)..7nNEE k.  ZZZعs'ׯZ199I{{;jRT*őJAAdggƍ1a^|E|> ,YnB^6ҰlQWWGee%ccca6oLFF]]]ݻRɺucݺuD"?墩\}}}~Μ9&???h4!7nP]]͛7ˆ/$Ej=7j%##C^TT&SWWɓ'O,LOO3<<^'99Я]kFjj*W\`0ww377$\zUؤt:zzz(//'==]пV ]]]SQQkX,|2ż kN">>7&/|HRJJJ?DP;Dhjj"11`0(MMMd2iiiq //o&ĉ8N^}Uv;,..rqj5J+WRnYZZb``DSSHR|2yyyDQZZZPT\vl9s P&֭[G?f& կ~E xٳgv?f֭(Jl6F*++룩 Ǐ j\\nӧOc0HJJ BAss3FQRR,f/RXXH?n7oř3g6466 0ʹ200;lLNNp)ucǎP(P8NEV >b9©Sذa÷>nȗɃhGD8uj={GzFzH$d2p'իx(++ ??+Hhmme||~ `'N!Vĉ^9#y%\.KF =JUU֭ѣ,..sM6sa4 BdeeOp\nHLL*ZZZpDQ O"p9$ =KKKiw,YlCuVسgǏH$㡨>@B(F)//'$ ))P(L&c˖-:t9 eeelڴ&Nee%t:Gqq1LLL;;詩aD"V+>jv!(ϝ;'X-Ĭ ]***p:kM"Emm-n|>fn7o6;wPXSRRx'ʢ̳>˞={zGQnݺŦM~4dff}j('N`0sNp8,Bȣ'_uΞ=Kyy9>tj5LNN… ,..lfffdZ-sss jW__ /@ii@+477SZZgeeafggfff_+:nSXXcjjl6f9j5>YZZ"77OWWlܸe, zh4mުXVΜ9oAUUznttTZaeddD0Fd?BD"6pL~:vD\.G&Ғy8Nf3EEE$&&RYYɓO>țF{|TTTq8nt TTT¶mۨ!255F6p{3r~:˴xvq_z=(455 bg\T*%T*LLLj5LOO#HP(XV(((@RP(띁<+WZDBKKXyT*ġH$.]F!==/ux|I^l^sbnܸAii)@Ijj*RtpVb(++駟v!8"~amۂcL&wnKŁ,b̅ \c~SSS_dJKK9|0jZh& ^fyÕ`0˗h4f:@ V'ʕ+LMM -ɄPTzZ[[*:t:͛B_:tBkkp}ii)nҥK 1#}MSRRDRt:IHH`lܸ"jkk w捻!FFFN~?7oFV uCQXX HRA+iX=11VeiiIhZ\.rCnn d2ٺu+7n$??::;; <3t:V+jAvv6NZMMM A9FU8(//'77Xy4 FNz=HFHRtkjrrrh4D||<III!33$^/**JKKH$vكjdz.VONNT*Y^^F׳i&<"77W70==[ne۶mdggXXX੧"55mj"Kwii [=Mưl(JCQQ#"..d233IKK#!!ZMyy9P%h4 pEEEdeeR~z*++)--ell K~~>III䐔Dzz: b222`ff5o\Nbb"h4rrrPդSTTn'55*@ףT*Q*D6oLnn.jA.OYY`Ů]X,A]XX ##TB@299I~~>YYYL&T*8VLF ә //ra˖-ϵF[<QvXXX 55o/ϣz8fnn^[[j>:pz{{q8P0RN*B!|>skD"r+H7+H.8pp8dҌUd"S$|Hr ;v  }iJ ?krssILL$!!(bcc BozLHH`޽BdJS"$ IIIDEEh0 y,""""""M?>AlbZk|>>7BJ8NJS;"Te ?m]g! a/J0. !FE^ϒA_^gq_Ṱȋ!)aڃrboƧ q2B#/CA$]xgi#De`#UED>1YDDDDDDDDD* *FLF P(D\\ܿDN0==lf||zq:X,$ ݬU> Oy__͸\.Y]]ӉdbccߏF!66ZZZjzK(T;::Jt:-`.QըjZZZb ˙'&&2==YZZ"11σ"%%O{{;Bhd"%>QINN~`rrrS^fWq_`4 ôӃFA"p=kD >@R bbb^X*>{,111ONdݻ͛7y7q\tvvvvEEEʬrbaaGWWHRa#qQQQ 099I( s)))8:@oootr=Q@ii)Z۷oc\x={pR)---d2gϞ%!!Me^t$r%Y\\duu:::6󴴴ahhVĄ L&#))饜 dgg ~:p;w̕+Wعsb۹}6MMM?~|Q  B!!7<{\v-[0<<㡴ʋ<b;^#066F `mmf8 |F1??/Z ))&x޽cU튋)..… >`HRz-^/~, o/_&Lrr29|0qFFFb݄aj5r~Z-|f,@An߾gbbTx뭷hjj"#ˉ& PTB[͆!>>7xAco~ZZZ@ ~# "::@?YYYLOOB]]III/}YYYarr222c5?紴W_}P( @(J( Z-]v [nEӽ5+**c߾}8.^ȿk׮jd׮]Be~_M}}=7hjj ~~ ^yMd"0={аir9 @ i,f{S@ ۷g8F!==^/x^Eo/~: =zk׮bbb-xr" ̿7%jjjeݻ8'cffo}[9˥K`Ϟ=?|;!66v0/^DP8ٟǏŋʙ3g8y$)))#oZ |bj܈u=VWWtRWWfTܹY8pׯ_')) NGff&&MUBVV?~d*++7333aa-uuu}*фB!N:KKKalŸɟ멯>rebbAaaYZZbiie666-//SSSC{{;SSS|>~&ܟEDDDDDDDD8|lhfB׳}vgdffbZرcdgg399 ߿_[\\Jh4RTTDAA;wBA_YYAV Tfbl6t: 'Hl6-䊫T*|>LMM!Jh4$%%k.e޽d2J|_Grj\.x,׎d144dB&a6zhZ666HIIAV "..$X,t:t:X,n݊fyy5N:ERRfD  &&]vZtr+++X,2eT]v YYYԩSx8pbJ8N~M"qBhdmm Ʉn`0t:7 ~<(۷FCSSַHHH`xxp8̩S6y_#d2h4~mt:jRSSX,,,,֘"xRl6Fzz:999dggcXHLLjP(8&(RSSH$HR(**~/IAZ__ԩSdff&ܷ?ג"""""""""ϳKv)xزesmX7Aܼy%rss׾a6_:@/vIurQVV[{/#:(0RN۔"q`\y% ~L+|OvDž|=ןG4 xjG=zF#?ξ}-F@ s"""""""""C">wgUO{^|V}Q~OkF,_t?qσp8V$iy1օ !ayPY|#"""""""""UcUJFL&r9@:B Q[[ hܻwI.񔗗ֆx?>==MMM OQ3W*tttЀb`۩bmm$שFC\\ד |v\ܽ{<eeetvv cDss3p =>|Hss3jFC}}=}}}$''#ʝf&&&D|>#222Ty*ձd" H[[jLFee%mmm `2X__eA.&aN'111/,q O]]Zqbcc?q}}x^Q*:*pv ݻ h4J%---ϛoɞ={P( wn<ќXo^'lj'' [oEqq1J Q^^ΥKCgiinj@ @(3::ʥKJT*y&mmmLLLpܹԟW^y'OD"0R.66]vCqq1ݻ{1;;(/`EEG.xx"6ׯįkrqUv>;wp8h4lꮯse˿K۹u \|EVjY]]gccׯs,~~,oo`0};w"q\LMMo|W^y'>K.a69r׮]ceeqg0??޽{bgg.eee,,,L(bbbF?dddE{{;v]Pz*8q)$ |>߿_z*BJ=***/w˖-ގB 337n`9r;v`ttMb j^P^^N^^fP(Dtt4M"fL&_ii)IIIhZvM~~> JlOgg'kkkd2NjυH86_ξ}fffK.o}KH|e[c"""""""""χO4QUU^gqq"233Y[[c}}LN'ϟgmmThlln uuu޽Jߧ Vjol6L ->$..--- 300(?zutt̡Cg}} ߧ^?d2N'<`zz0>>N{{;p8Lkk+cccvqLŋ\x^686;HRNJd2R)r|~(";;n߾f>ɷ 33p8Jbuu>oNBB9rϑ(--h4D(BR& 188e֭#3==D9޽{q:466QD"auuUd}}*D"!??eؿ?%%%j1FZ[[7H^Br\NKKPs3 sqh4"ؾ};:{ QXX(gϞERVihh`xx~_իձcǎF<f@ ``˖-PXXݻIMM%--U?Nzz:KKKvOqq1pZ͎;"0;;Bʪ=v1 d24^O\l׋b _ dffK||<111k!!!$nJaa![la( fffk_T`  D("&&m۶ 7xRh4rsscqq<<66Z-qqq̐ATTfB` JhHHHd2Nrr2AVWWq8 ߓJűg yN*L|m۶F!oj4a|>N@id>;L&}0׹D"Btn&>RO z)*r6,~Tcyy?""""""""OǪ'&&ݻwYXXbP(TVV twwSYYI0l6S[[˝;w#%%hiin(ofyyR&q***h4~*숚RÇ԰BRR+++`IMMemm*Z[[QTt:ڄrZuJKKn^Jkk+PNG]] f^Qn߽{Q( PYYV*++b}6hhh^P)JB?J!0cccBamm'^VWqΝ;aXܽ{fT*2jb)//gaa$$ ---TWW1L#I?~_t <>77Gee%8N\z^B&IX?un4h4tvvRUU^Çܻw5,x"~bRhkkݻA⨩DGG>GP__OCCHuJ\t<#`2qMMMXV"11#ƨ2&jkk6***X,Q666C||Y^^IMd4r jr!""""""|yOGiQ[[ @kk+.,,,pipܽ{LFVV*_TTT:zI.\L ))r>|D"aeereZTV~  _LOO355Ess3YYYf<`įkv4<^SSNC.  Bp8p\|t:ill.JJJ<ߒ~?p{>J~:333T*PVVFcc#67oB{{;oY]]ݻf}}BSS`߿~_bP]]GV"W^%..-Bii)LLLI8fbbAZ[[|2O|wttk׮ڊTUUQ]]y`qq[nq=^/TVVy`TWW3;;KEE ҒyIBBKKK={IΞ=KllHׯ-|wllyf3555|>/+Z~X\\dnn*ܹ#Թ?)&d>f˗A"FAA---,..vEƸv&Lii){100*ϟz9}4*.jkkill|a uuuLLL|rJ%|p3gΰNOOo~SSS;w8Ξ="&EDDDDDD|~!Ott4jEzzz8r QzcccXV&&&w+++f V%T*IJJ`0g3 /ܼyիW痢{ֆ|j!`qq/T*IHHh4ruY^^ٳ/}8tѨT*.qqqhZ H$ڵ yyyT*Z[[gvv~^>߹s B\~En޼IGGΝ۴6#_J$hmmx<z{{ijj"..ɄB?9n[L~: QCH$>Lkk+d2$ )d2rĉz4 t:阚ȑ#ܹZIldjjXr9&yݻ2<`zzAPTF:::P*h4VWW  pmƘ#H &&LF("**ӧO$lXzqcccl6(J">>^?<<+k\.<_Bzzzz⺔d޽fزe o&nͶn)x 9BOOQ$&&o8III~BEDDDDDDh{<Ο?Ozz:^#㥬 2 B^$ 999RRR_099 Bηg̙3ر]v^7&ZL0ҥKn&&&#%%??)++cuu9Ο?7M5e2Ǐ7ޠ\DRR,.. H)?F[lazzz0;vB9r.K(6>>ζmxW1 B!ٷon"::dRRRaeeǃT*}齦^/b6yWAR"9x qqq|ߤ>as.;w$!!B999\zѣGٷoBhuYFFFlDEEz1߿ l6F\n#J İ~VK7&/P(Drr2[nLOd2Fv$Rgvv"nѽU.ٳg9pwe2pOO DO}}=l63??O\\ǎA._SSS 066F("##066*uuujd+$$$033C  ==]0\- T*!(_nV+ ,..xW͝;wpy?z|]ME>ǟ@@H)x2`0(;y!^"""""""'?OFT233پ};@`0HNN_WFCC,-- ݻL֭[D%%% ..c!0Z[[H$,,,N}}=tww344~r9KKKx<顩EN:EJJ<55%nZ,<7v;. A}}=+ HZZ ^/ B( 9wW\A2==qnbll|p8,ԁJMp788!==]P_]]bHIIa߾} Oyy9*iJR`( Vd"11Grv;f7vʄ0s۷Y\\ݻOl||>RRRX[[ӊ ӉFѠKMMe˖-hZvIZZڦ $x=mkkcmm{he֭Jl&2~'N`yyYfggGGXVjjj߽{$$$011AFF._W\.kz{{ ÛX__g}}˙$99}۷ILLdccWr-P8nݺE}}=;v,xB0n300@ZZp=llláCͥF B0f#j;sNܹõk(,,dccB ?TRpcǎ111Amm-))),--_R(-ﳺ۷QDDDDDDDDX8шL&#-- \h$''lBqq1V,~?Ǐ^/bB!)**BPj6ąaRRRPhZApix\,M.T*b q:Nl6P*XVVWW1LX,, yyy}vvATT |M4 ZV8jE.֭[BkP(XXX //x(,,d}}m۶ iiiBhVnSPP@LL ɂk&GRZf )))$$$Lzz:iii p:8|Mt$%%R߿tL&ph$%%}ҋq8T*(zoNll,p_]*,,6666p9r, :Bo!:NXm0t:R) Tϼ|>VWWپ};HR:;;M||<+++DGGsIZ-Pp8Ltt4B_RSS 11NGrrt:6RRRHKKjϛEbbbHKKd2emFVVǓ.xGF!&&l233 LTTd2a唯Brgv-R): śoIZZYYYhZ9t)))RTTĎ;$11ˉ'(,,j"Jh \Njj*YYYu'JItt48q*[lA*P(rÇ 66FovSPP 2VDL&Ӥ mٌB_G&1==ۅ\0߿1HJJ &&F^{ DOO"""""""_]E$Nbۅ=D2-[<VuЗuЗnڵkP\\ѣG_t?3W9AAElOΟ?\.w~w6occ7n&>۷H `iiiS/:pX, cCycDҽDDDDDDDD&'''q8(JA,rYK"!_%"H$O5v ~F]P|nnp 3^D('jއaN8!*/ܿ a]|H$|O@ԁ"ϳχ t'eTwߏ^!p_"O   s"""""""""IIITTTP^^iiir lh4\Bcc#===dffI}xx[nObbG̕J% TTTHJJ 6˗/Dff&+++J%F&nݺ`TWWWt& ř3ghnn& 騪׻&㡪:BRfffHNNfppRFGGZ~nܸAww7~jjjf}}ՊL&ۤ^q311!{v;;/U(//(++(J W^\͛7!%%DBCCaAtBWq<}Ν;h$bzy>Uܟb`6f޽+C0eee455144D\\X,ffftz<jkkMll, villtP(l6 L&pܱ1Ν;Ggg'p@ k׮*\occcjIKKcmmF}6tttihhN'P(d2 503`0CJKKBףRw+++,,,`6|֢XYY֭[̹s稫ÇLLLƍ7hmmn _v*Q`Xƕ+WHJJBzݻLk1rrrG+W{>5==י$%%.\F``pp7o@JJ MMM655K.mgF2v;IIIBYHY۹~:gqq\t(--evv4ZZZ~:IIIR^^D;>Loo/$$$ЀV666(--Ĝa߿OEEQ_lllpM:;;JZ`0͛7q8{"99DBEE {ۗA\RDDDeYT?@&11:|>99933^ VVVhnnf۶m\zc0P(TTTw^~_uVzzzp:l6JJJ9hz %***chddp=& fwtb0F#?O"%%EEE333XV:::hmmtb2_vlقfh4ڊf?!RJ?A$ ]]]hZ0_:ҏÇDGGz{.ønq:=v#o}[ w念:|M&{o~ 555 Hjj*)))B;>GV366ƻˮ]cկٳ@ 7qN>\.B:;;IKK˜:u)--W_enn3gw_׉ڵkkb2Il6w `0|@QQ3<|XD8P__VٷoaHLLÁdb֭ڵ RV%&&{ 5 tww#JlA.\什JJ%7n```6jjjBVsY&&&q:\th, iii\vq!eYݽ{7;v@Tdb}}]x9jdffrعs'ۍlF"Icc#sss.(Lܽ{, rfgg)))app+W_V۷innʕ+( &&&x!L4 ?ϑJtuuq]ʘ" R)FtVVV#SQQl6 NW\!>>/̃˿K&&&#Q:_twwSZZJJJ %%%RWWǹs焟R`"3R RjGll,v.Q(|d28mdRkk+)))?~_x)**zj}KKKZF* l077T*7T*`7墯^/suooJ$ ,--a4 1::NDP(s}o<ڴЀBjgdd\.gjjNgtt\㡵׿u҄Ƚu||\s( F#׮]/b0p8n._F"0eeep8x_}i***1pccco>N8<>JJ0͜8qxx<W^\^^'OD"tvv233+۷s1666@q L&/v)""""!>@̙3s_.x人zA0`\w](JF. [9p 7skkk>}{cɗӎjjj u3`+W`ʟٟܽ{U&''t;d^J%'Nk_UUU~E4yg֭zfff\xNɓ'DF /""//|ۇ#ɘTIOOgǎBHj61 #664Vvs99z(hZn݊`}}Ç9x Zߡ!`޽|{ߣ<2޽{ILLݻx<r .Grz{{LNND\\ :k.Ұt:P( aوBPKqq1FqӘzVI?T*t:,,,0;;f#>>VKzz:> _Gzbb|=emm bqqxFHQ՘L&Q*x<aq$%%a6BxCCCϳ`  6]* Lf3Fv-EڧR6E66d2~@ L&CT=5 e7J~?rR)|>R/\WOL}w7d||W_}Y***:{=\.ܽ{eٷo hmmb|l^[׿`\0?h4233CLL wޥVZ-ݻ#11!:;;Y__';;o}[l6h4LNN2x<~`0gmmvV+ǎcS^`uu{!l3g())~!=={188Ƚ{(**'''9uԦ~K$rPNG^dVVV4zވ~FSSohZ 6 T*xϤR)kVhW_vSRR7HNN&&&FxyH$hhhȑ#Q\\LWWyyy~t:$$$066&ɟ w" `P Ƽ|l.//O0>T*% a6}a4|w^ywEDDDD^$v]p H$x<ݍf ''$/8!/2o)f3kkkHRbccYXX ::GBBmmmLOOIjj*.!{Gvv6&UZOOKKKdee ykkkdeea2XYYv }bbbRSSX. aX,x^!'{vvdfff0L,-- 5~͆lfaaZ-yyy?jKvv6BL&n3<>N\\zORRcccX'q^v"b! 122 rNbbbajj @8fuuR|jOIIrᗗX,dee1772^|A bL[,fgg9n399R$!!fYQAs%33Ȉ|\^^6fgg'33s`ng||\L&CbIIIaqqZRdyyd&&&h46 }}}x<!j+ b0 --&''&115tdgg#PXXJbllLЧtl6X,xmT0vZxY""""_&&''ȇq8ɦh3зl\1п޷gA_]]իvD ϋn6_hx"jԾ nܸ!ю;>6Bss3(~>M 0_ן{<ׯ_geem۶qСoGpǮ]>pڈN<)DG-""""""|$336xHHHx]D"Gvۿ H$v;* J~>{rB,BA8f}d"Q{~HGGr!hJ+iAVWW?rN0pl|^}P(^H~I]y|M9bN D^}>sm~?E /8EU%o!yz C?qe' ~D>"xvzzzx! tuuظIK"fmm477SXXիW Bx2Xmmm ommmA޽\.'==;wbx!D=<z=. FCTT%%%/z:DDDDDDDD0|ӧپ};{֭[LLLCkk+>G0T*wDV0rcǎXZZz>+WP(~˜>}W^y[Džxe@ יl6/~zVWWڵk>FQ(V9q_שT#mXYYavvÇc6rYV+a¤R?chmmP(db䐗Ν;|d2 dggsNz=p4 %P*zz=㬬0B?_V9}4yyy:t feeÁ륥wZ[[">>Jž}Gkk+v}|ϓDqq1B!V0$ >ױdlݺՊfcdee Te|HuD_RjE.?!'Jq:LLLo% SSSa:Գk.!/9''!Hnn.[<ș3g!!!$ƄklrrDB~~>iiit:Kۍn\aGJJ 333zmۆbpjX,( FFFXZZ"..Xrrr &&tZ-VUFN:EGG QYYɶmۘdii ->>$IMMJLL vb۶mlll|eEDDDDDDD>-h'?ex7x7<-[ H'33r>!D߿DB||l6r9QQQH$fJ%ZAcc#r>1e?9555288h2::J"**q rF#Ǐ,,,pE222j" Y^^͛pM}6Ӵ U2Lbnܸkph4JKKyb‚QQQE.#ɄǏcn7lFVVTTTrP*S__/x}cbbB o0F\\UYY(& RT*64f3 ˖-[pW^*lg?cdd;vxz7LܿE?T*Eד̍7w\.;wX\\fD<,--uVR)hZrP^^Nnn.={M.#킵!HX^^PXXa1L#0LF||<6 1c0L$''h4%5.--aZH54Bwc4,//Vu0999DEEG(`0@FCnn.sss,,, Hrv#L `ddTJvv6R^/ \Q2<<#''\N__jq:jIOOgzzZxYZF||666E h4j5 N'hl6jOll,LMMۍl011!|/HOOgjj Arr' (VWW2kìIMMd21:: -- ^/xu#}cvvłj% 111 ++0sssfR)P(X,,//c0XYY!>>K0h4~fl6f3/䍏fccE!]R M<Jl$''*FP2>Z-x𗗗ILLD..l0N #11ӉT*`0%VVVayyT*1""""""""䤠a|y-[k7"Wz@:諫\v5<ݻ_t?37?/>l7ПIܹC*r)^HQBW~\.H?x< n;Voo d_x<qLEDDDDDDDDH$x@ DDDDDDDDDxTi"G>-tz/)_JjYFd,"{ڍA @ӽ讼 _jn#[DDDDDDD7D_\@ @bb"555\~ARSSQո\.}0VwrUN'\t7n088HVV;wJfgg͛TTTJ=#` ͅ hkkh4~W˅B@PPQQ͛7 ##E})((`iiK.QSSC8&))Μ9d E}]p:'?Çz=7n۬.xU׹~:DGGåK(väͥK!)) ӧy;wD*288ȅ #33M8fffj>x...@ffB HPTsUIIIqjkkGuϞ=KUUw%33 .^H$(++# <숉4&e$ jRRRlLOO82LP_8N'UUUJҧ p\2::;CSSuQTWW300@aa3wrrvkO-d788㡷TFMKK gqEDDDDDDD^nBiy^d2jzA~~>0gq}cc\Y]]p000#G|2 }կ~ɓ'biiEٷoiiif$66Oyy9wnrMfggH$ىJ$q:6<<(&*l6pNt P(DGGwޥ^OCCd2? BDGG ]vsUz{{YYY!%%入 |s1{{{Baa!k׮,iiitwwSZZJww7:[v)++ZW\a``d(M||,//S__OBBmmmd2n7III QRR$p}&&&/†ɳfe 9effcǎ!˙F׳cyΝ;111DGG̱cǐJB!>qތ p\?`H$jd2f3 BYzm۶vX,h4X,eKK r;vXVܹCII *"҂ᠩ(,,* ͛7Y\\$99,x`дDOOw%lZctvvR\\z!ݻwsubbb8v` f|||&&&& ЀJ"77CaiooG" Jblln'66ՊdҥKd2rrr8tKKKQVVٜ?q:::صkciiE. D(7nܠ߿Oqq1---tuuq5P*|>we||SNj9wfaOOdggSRRhd˖-l߾3gz \pN˗Oh$55۷<_EVVP*ꨨ '##x())ȑ# bX^^~S """"""" tӧٷovVx^~?(o@ @{{;P\\Ν;illDR}dN… hZzggΜĉN=vp{'BP%%%LLLÇ1ɟ winnfmm^JJJG#.66Ǐ` o))) r8}4YYY9r`'JP`X`wQQiJmTUH#ஸbNwN:93g̙y3__͛L'NhpEQԈ ʎ( /Q;_P4ƎNVխ{wW=}wαX Dyy9QZZJ8&#J&++bbdeeW\f1::\.Gףt]vl2֭[G{{;+LMMt: 6jyerrTt:֭wޡSgzzBii)b1"hP(D4%3jd2r(..fѢEBC4g hZRSSxR)ܾ}!p%HMMV ϧ,yyy!Oz<6-ZĦMX|9  tLNN/SXVrrrHLLPRRB~~>d2T*$&&2<<@*#,z<h4$'' "27xH$j8NFFF裒d2rVhj)..bP((**bҥh4<ϓ~Ih\ry7~@^^YYY,[ Rɻ @~~>uuudbb%K7nD* x^,!?|0ppGjX4wrml6uuuttt!ɿoz\|Y'O222 /jepp;vPYYIii)`fjjl6Om۶Ç|]]BNbF# _Ύ;ݻws! 'Z@ZZ /YVYx1>,fhii>_FA4R^^"jJ%444 Q(|9sF*"""""""8ڐH$LOOXd jU˅T*%11訐o>22h4b6bLMMRB#z\5:55 FBr4jF^X,Fvv6 (III FFFèT*rrrn`ZnrȇJXV$ Ar9999x^T*!B` IHH 77ZL&&&'<99۷o Q`0`XhPl6|H$j5. 0;;hdvvR)&&&%33qn7Tl{ CCC8Nb餦2<Oc< (DzG_tB!_Cwll{=ep8lG~\h1~>7_߅59}vzܗ"""""""_/!H|aL&'OtuuaZP;b)((z{{)((`rrO? .%9|0`$ PHHommeϞ=\r}>Pȑ#pM򘜜gppK211={hhhTO<_f3iii.V~qU(FP__4Bd>}VNcS^^NBBNܸqJ{{;L0;v젱u133î]8~8G!''yLNN~)1Μ9CaaDr ʝ>}*:;;"駟rBZ]vgQ__OAAnbϞ=tww @MM D"V+1Wǎ`Xjh4G=p7oR[[KEE3gΰjժ/u.`7n 9}4" (~!fk'E4=0z#NZZPa8vrn̾}z{r A}޽S[[Kzz:.O?f222t8qCrG"055{h48p'N 0TVVr1jjjX,b1{=VX^'saڰdgg?R:@܈|tiz{{)A\.}֬Y3ׯS[[˭[۷ٽ{7r233v466RUUE{{;V`0Ȯ]9`0o>?"77k׮?D233vGyy9Rί~+ˑH$|477b ^/w>p͛7O ''Y?hѢ/%F)""""""\.6Z0D& x<@,_\[RRBCCǎ###ZMUU?9z(?<6mDFFuuu jcc#o&UUUc0P"MMM_;aFY|9OF.STT-[DHMM%++={PQQ^ Dnn.pVXʕ+디IK.e޽ n:rrrj(JN:H$|G|ߥX,Fnn.qmV\,.]CVSPP@zzN-Jٿ?.\I;RD* %իW"))K8ĉ\x@ww7~!zRÇr ,6@Ôގns=ٲe eeep5***رc`llqΝ;dž =PBsEEEn~:;;d``pmt:Nbhh蠦>y󦰐P(XvpMUU.\@.ֆV \NOO>T.^Hjj*---ֆl~*Ozoo/UUU\t1hmm%''~222줶&b;v uuu aX~G__twwsDZZ"JQT,^)INNl߾CQ^^lڴ={zjd2W^E&QUUźu(,,jnz{{y׹pݼ޽[onn|XlPkZj0")LOO355 )ܹ# FTUU111!35{{{ a۹y&jjR)~Ν;deeqq.\ QQ ̑#G&--*Z[[XB-[ɓ'Qrn߾MJJ  :ĺuhnnFӡT*)++gwCMM +V 55b˒%KHKK(JJJJHIIL(zj9ƍd2~?׮]c֭B͢"'f<nbӦM%V&yD@`{QQ*Y abb-[ %55L&,_ή]y&999s1'## 7++ łngŏbR)D{199Ivv6Z,҄K.j)//jr)8RMJJ`B!!<ڵk:u RI~~'R0ݻ1V+V$n7$$$OBB f0룴<ݑH/㡧˗7oޤX,ƪU8<BHVVh41LQQQAuu5^WxЯt:~|222a߾}ܼy+V`2P*LMM199ɭ[o_ww7G-Hhmm͛lݺp8DԄn`0Ⱦ}X~=[lAPؼy3tttk.ѣ{`xx>֯_Omm-LOOF[[9r-[033Í7hoo`Æ RVVƕ+W룠[D8p\pv Dv;EEE YVKrr2 aZ/npp-aQohhH('VAuCoVVyyy R$Yz57n>s:\vWrU:;;P{W^^ƍzرdhhhޱN>Mcc#eeeLLLp9Ξ=˗illdrr:n(gϞڵkL&VZ(_HOOgzzj8w\r%K VULKK#// a. L-8G߿_*..tb2HIId2.FFFFxgC4%V|jJKKq\fp,Yƞ]DDDDD qv͛)++7or% zh4^}U_4ikkcժU~A17Cee%fm۶=rܹÞ={xO\5h4g}FOO? g ÜKGG>E=p| ---d2(,,͛466b6ILLTal6v;f@ }رceee$%%R*++ƍ߿ݎD"TTTDyy9A6mX9<ٳgzǛo)|:P*( !$nǣ._diiiT*od֭B!/_8&|-Z|c444 ˉb,[͛7sA^z%6l؀"99(ׯ QYq\$&&b4x>,RL~o{zz:RafggQ(dff Dѐfcffh4JJJ zQ B9MOO nIbbATDtvv244Dgg'N8rE'''H$jz=6P(df 1t"H0 LLLvF$>4!w? }t:lFaXT1,0 nP($P(fbvCd2DC&a4rl. FC4<D$ RI,Be20X, vAPhpt:N'~_HQzX,BjX,-EpF")) ׋T*% axx'O3ϰzjaarvQ*z$ $''#˙@P`6qݨjFIJJR%ܯ`?o.Dc4H$d2 Nj,YByymXP*A|>蠩۷ ~jj ӉR$--KB@b(Jv8z~?2L+"gffh4d2fffBB4畏?׳drrr_kTHZb y!_B޽d2P(# !aوba0p8tym>}l2JKK%bcccaR)YYYH$P*fn߾MCC/."""""ܹsGYJ%)))h5&_ yfe5wOW㡾-[Uݿ5x.l_|dUOgsഹ6m6?u!HQC$иηGiݹ$Ωjb8NXH$~`٭G6}[/{Moxڸv73A~_qxv\.Bu-ۭT*U^8 x?)Y8F. d2񚈈 H1UBEkC~2?t7RXLȹ~!@kOEO8rEDDDDDDDDDr9@X,&D-Ǎ`0c*k?6w LI$$N|!> |.),tq>/ 'T*c~jmybܧKǯܱpo?lUW_E{ܹCRRv{Tݼy/z9|>~"y0yw' z-Z@P(_˹ HbT*RRRn3;;&D `jjL7@& 233OEDDDDDDQ( H$\엿H$dTUUֆjE133ŰZPUU$|rM O>rO8r+VV BpDee%/^$99BCq 󙘘,[1>S|r ?aX!\.կhnn&`4ٷoGellakzzݻwsZ-ڵZǎNV+ٳk׮A$?ԩS_H$¡C'??c~йݍIJJ>jw\炎ӟXnwᥗ^[j*hkk? 222(.]bƍ G(ewbÆ 58#GHIIattիWy!}Ǐgݺu`Xhjj"//K.a顶 ihh`pp^/^,z`ŧ~Jww7sqXV>3^x<aAd2KUUn"77an߾ccc( hjj⭷ vIKK 2ns999;wÇ388Hnn.Oȑ#LOOc69|0ǏP(صkׯ_͛066ƭ[w駟|ryyy;wlgbb*X,?~a)((l{zzؽ{7ͤEmm-AĴ\`s ":IIIF{{P 0@]]6 >}NGSSpˮ]'336: sEp\BI47222ŋLuu5%%%d2:::Xr""""""">00ٳgt 4?C$SRRq8lܸT8F\Ҙbڵ|>>cnܸAvv6 ެ ) 3$ yyyBM|T*B` ;;~ "xRΟ?``ɒ%BߒΝ;Gee%r\FGGIKKEc^}'ǦMXn0uVt:'N}AA˗/gʕH$~?D"}6W\!%%bd2R_~Aa||)^{5$'';Ƶk׸|2fhh;w kjjt 2r9Koo/vq-ZDAA:No?;;K[[W&!!R\\Lss3---dffl2^JKK W^d2QRRB[[曜;wVx饗g``I\zzz'77K pN0s5J%K.%!!h4ʳ>|bŊR]]M__h{'O +V\ɶmb0!0>EEEA._Ljj*EEE(JvW^۷z,^^zH$ɓ'پ};7n 11W_}gvN'I~~>l6F#6MH!HXb?xضmhQܹsO?{sFz|>n7Zg}bEKK G? aN;wó>ȝq-w]!\y.p:O*xaPF_ŋpz_G?ťK8s ?U4%55M6m6nܸA(ws?)((l6>cVZ%\sJp8RSSצX,h$??trrrrR)>yf۹x"^)$rzh4֮]Վ;wd͔L~~>?nxdT*~c:33Ț5kx7}6n{z$''Arr2X O$Q @౵3~}%bJłhJ>!!APx0BۑdTVV2==Mff& |>ߓO=DH$ rQq:8 (MZZfG?&xz+Dzz:PǃfٲehZv;"X,( L&4 ^+f< "C\dvvC,.&ݻw388Hzz:F~?(^/2l, pXX(Wjr^/,^g}gr(Z-,'$$}v',YӧOSRR|T*QBٌ^G.GnngT*^/ӉjzhZ7Dիy,TaJNo GEղj*:;;^+ܹs366FII hp-jjjx0?~'ORQQٳgHFfq9t:jnܸACCfO>RyWiiiqV+oF*|r8y$. B|F'NkLVV:G͛7ń:t}{,^Ǐxظq#UUU\zTJbb" ?w玲 \Nbb"eeepqؼq066( ~G}իIJJwC-_^/G&-[$`M6=vZV.\S0 jJ%|>xy+ d"## !ŧD4 zCb0(,,\NZZ{ΪUؾ};8N crrFVe͚5 D)))deeo~ @*T*-[099``0& LFOO333hZV^M]]0 a@BByyydee z~1trA(..֭[LMMP$%%!HJ[~b>,6 BD"`4O{Ѩp8Vn#:~?U\$N*v(JZ->FGRb_{'c2!!RI   ^OR <~_jжb"G<]3008$%%Rp\ܐH(t 9-bjjY =333F!*"~kZd2l6d2z0 $&& A|h4|>JrH$"x}>*h4D. xzt:0~}iِH$F!=!!3<33#. DRDPp8y9 T* ÄB!b8N:׋D"A. s*?8 2iT*X,Jw~N__+W$t:~v""""""D";Nj5 bx-| VIII@Tyq[ߏl6S${Q}nK=*_V~ w??>̶拾B}2z9=Wq].me>:Ecak1&-8wxvz .022" ͩ3o 9˴~߱ϝBneڲw#^<++X"011\.(q$}`B̺JF `EG!#""""""""EV +V u\R\@{)Ёz{{ٱc/"EEEJ/"""yZDDDDDDD17lrQYYI(bHy }w!kshth<<%EDDDDDDD)h4fbbB((6z$eA"""""O.""""""" |;y!2͛7D"\."""t"""""""""_ht,˼|z,^ t#0' zq8ODDDDDC(EDDDDDDD#qxj|ZG$! #/y{7ʬ uEDDDDDDDDDDDDDDzZ=5eEDDDDDDDDDDDDDD %vCLJIh<wwjI%tEXtdate:create2019-01-17T16:13:56-05:00Kx%tEXtdate:modify2019-01-17T16:13:56-05:00dIENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-list-graph-follow.png000066400000000000000000007623331414302661500303460ustar00rootroot00000000000000PNG  IHDR 6wgAMA a cHRMz&u0`:pQ<bKGDtIME4IDATxw}{rٝ9dH"0H&%KVϺlwgmI'KHYm$Ia&cvfwA@ޯגvWWK۶!   c QUbgbAAAL&0tIعygttM{+ ,oWTAAAd2RI4{Z79=C s[5H{s\<   "d~wϵ]$$tP]'cs+27Dn!Hk-6Ȳ{]YAAx'dYAT4 dY{\Qސ$IȲhd2rt鳍s92+'M餹TUAA dP=UUCxOxM@ @:Ze QUd2`De~ѐFg6 KL,ntHDӨ.  adTz{OS\\`zN'7$5a4̙3ȲL{{d'NaF =2-:1$ N<ņ Wb04 MӐ$IY|>łf[t¡iڂs$IFT?頥\ۯiKqT*Mgg'˖-jsAᒤi¦J$(PI(((@׿'LӄB!,Y((ɓ'I&EAt:H^O&cܴ:E,cZ9o{+A*0w]A.Uxo;\WW03㡲$ (r>xTUUc0RSS ?vH$·mf(?RZZn?&j8`V\EEXVTUeGe韾ŪU+H$J*l6xX,TUU( cA c Kx<_z*k@djkk8q$wy'J{{;?[^/Q̂ $e/0)%{:'H$X2('Ot ]$X '1 d2i2݂9***)Z9}gѴ:UU'Ȋ|^k)4ATU# oS֭[311ɏ~CL&3&;KII 6mb۶XLMM%jkkOl6cZ[|gK& W_M}}='N`zz;ؾeoppwtI<~ z_-{/KvEWWcc;v~&''󁩪jlVos|瓟$\.w *p{vZdYosqΜ9C4__)**$NH$8N*inn[>͛կ~{ 믿N:7}<3,Yh4ǹ5ȲĩS__'2Y8v~p8$)F. \r4M%]P}}},_ϛٖH$8;@=f2$T*,KM+It1&&(++.&ݝ_8D<l 333xbGt!L +2~Ig0 ¥*7$W'V^p~:\.z2rb0d2TWWa(((`uNՈD"۷ݎa'N!IE!sN"(R)2 \NR,[xLaaB&'']^cŊFEEtm۶QPpiuu:<uuTUU#2˗/'xT*Ŋ+4zqTUe4f DQQ&m ' O36 U055I4l6a2doH'L+t|>NBU3baId2 zL&F1,3FaQDioԩSLOO| l6h$*_NR ̹]fMAx_(**bӦM\ufVZŒ%KHFuut ,] 6VZIEELZ=BaWZ[[qXbL&V\嗯Fjkkk8QZZf`x`ݺTW`2KPTTDYY)f5kV~lܸB4c\~:˗/`0P\\’%TT6l`͚5a6imm+`ŊTWWa2)--e۶k'Ϡ L&:Y.Xo='2TQFGGb`0 $H$FQdn94i246qYL+9zXhi=@8NA~t:]~tsNk$3 E,]^YQLc׸i:t:(s#2tItUu^Kss3"(:T5O'i~_gfGͭdGeEQEEo:Aᒤ*'O$Hq\f[}jRE AAAD" uw   dؙxGt7`枃ޓg~-bew\GAAA>8t2t~DWߟl2po+8TUt:i((EEw`X9Rۑ˳iF^/h7LiF*ϧꛎΗH$m.7^̙3c?   o|_Ȳ̙3gHWW`A2dϞ=$ ( O>$?X,&l6^}U0 ^.dY.8q+V_`Ν_ss$H$£>??O__[&A133ã>ʕ+й:H,>(uuulݺrv{u<$q=P[[ʏ+FAAAx{tI8Na49qx<>vA&aʹ$ILMM~zlق,l߾$Ibbb'xL&Æ طo~KR]]o[ʸk)..>rr闗smUV( >gdضmoa``P(@QQ˖-oQ__ϋ/H?333tM]0$N{1,Y/p8xqݬY+ӧOciiiA_"dd2a4l>|P('?I+BOOwq===tww( SSSFIIɅ7,399=sǙ'8(d2zzzXf l۶]?&    \< 5M;`=說ň\..7](l޼O|-Z(Ȳ` HL&$ 6`X(++tii|K_sFUUI$l6Ngn,X,>t:yᇙzn fK$|ޢ(z=DL&C]]Ї_`vG?'?IJKKI&$ (K.>ADa4qq\AA}dV+6 ݎrq-* rvq\F\.cl2*++ߡw\oaZEQX,8N6l@ww7<]vR)zꅅL .L&ի B}466rUWa~ngٲe8uL}P JKK)))::&'' XV\.zt:SO=Ů]ظq.  >&7Dtt:d JWYtB!$6 x$ dYF?t:RT*E4FD0F2̛is "dӉ,˄nxՊl~[5b8]p8fΕ_hF<ϗ{<h4i84T}caUGAAAx/3@.q{B^\Z /fy=םwsٿ~o7s-K$Rdٲel6ѽ]AA}Nx<"{ʍ{͚   ;   OgZ/vAAAAAA    \D.      %@w3p.a~W   uID tK*[wP^^~!   ]0$)'WUso}lYT J}}=嗯i9?Ȳ(iί,˨hN\=Nk4,3 ;,2 XwAAAKtǃd2QVV^&IǏl6ظ(ЌFhj>/$I4fggqDrQPP@"`||rz=333b11 @ %%%$Id2t:$NS^^{iB!E8zRTUezzh4JII v׋AQl6SRRB:fllh4ᠼuADAAARo~9z('O$ xB$h4"I@p8l^ȑ#444 2SSS$<@X,eYF$$LE<رck166]w݅a͚5twwm6mmm<},] ͛׿5tӉG.py޽=zFqq1w=W]uPzGw^VX/K:D<ẃk.hsLT*E&AQ𮼪HӋ>    Ad2_P(DOO,K&cttΉ'PUYYl|rFFF LrWo>|>_>-//gɒ%oF#ԧ4dzze˖}^ZZZhoo{ [oR9s24LN墨'?IH+7ވgll+Vv۹;d2~X,??PUDyy9& G?Q~i`n|Q7m\Md2H6}&c4e2|AAAt0Hc~?^{-~\~ٳh4J,#Ji& zzza444K/aXH&9rx<Ά +Yv- eYF /PWWGss3n/7ߌh`0ȧi|IZ[[B!V\ɧ?i"{/t: \9Baa!UUU~ꩧXz5vm\{ٳ۷#IҢH$B0$_u]G&l6SUUf#D"B!2 EEETUUNI&ok[   >.Ipj PBG&ᦛnB4 X,TVVb4QN:(Y^~?555z***((( Yϊ/|=ϣ*1== 8B]]]$ uuuܹa~?K,a˖-\vev:&&&xg||#~)"tuur4 ͛A|I`>vB4ƨ;vPXX-B ^  ingyǏsWlٲ >~v/yn   'vrʅ,na00s-+ H$hll|C |evs-J&AAA wv |7>/^_s;yvEr1   ݻOc2Pp8|rщ]AA%kUg   B&      %@   p     \.8H{i5"!!2o{ UU/^.1W|_ |P 6Aq]4Bh4KFI:& J}u:v;zYĻ>ّeٌn'D޳w8ox{(zϗ*Yl6f[^B"Serfit:JJJ|Xp8|Q߬p8DQ(G4G~$Yfgg෧b}=AAxo3@$h4J:= 8>Mp(TUf]U$~?EQ(++{H$nw~9XD".PTTi̠o:,<?s\Sщld?ߙN9tSSS477ffff8r]vNÇxشiS>ztvvafffؿ?$zjjkk8vbŊv?qTUU?r\ven>߫pj*\.ٽ{7hɲe(,,/7Jcn:4 c  pa0>_.xx<꫌!?WPfiq{9袻7˝Y^puL&'o$I =O惘\wnك^?ou۽\Vj EU>U)\/6lUWQkEhp j E0h,2Ud5vG; WSb(Aͨ۾-Udt"}2drrMbݻ;vx_d24?0@6'L СC9rQ~O痟N^(fQRRBww7Z>X Bu]A4,ssرE&Jů~}Q:D$ȑ#tvvD|$?~z wu>/ѣGILOO3<ͶmH$riޕy; =07AygP:֭[t? dꢧ۷chhhvsI݋E4ZZZ=wv+d2fN|ij>l:kP+``vESV V|og^BCX 7VH$!JrC {f^ogNSUSYU={(0Pf,c"6-`XG> C4ظq####9z(F뮻t:Z[[4 I"ѣrعs'k׮]ԭ`0p 7w黺Xb7pOnOQlْO_UU*++)..f׮]\l6yeBcc#{!`߰MvZFbq&''bɖ-[e!FGGYt){% 阞F$kg^C'ID"6n>hd2Xr4MM6́룴#G PEQtF$X!z{{'>8  .x+tIwTc=n۝Ϟ~ᝰ ݭFA`H$r; >t3zwϒL&;|^(MEQ+شiH7_p(afggA8LYpRQi*wuCCC~~_㏟3w etRs c1‰0zMOEbc1iL`*4E&G/Lz{=قj; Le4,+J `V̬vFMng|lݺ믿 փɧ>Er=qF# ~zoe˖c+piR|X|V^VBAs<硇kp8mmm455z)((_"7ndjjm…uvi466p&@cc#$qp8L*"/-zT$HǑ$);,˼DQ ٹs'H$iD"t:H c_e<Ǐ' i@vJV^$Ih4rmaZŶAAxoz\'ȹ?{r-455!;W{>˗/7LQQ5z;y!>9dY`Fgw>_xG}H$ʕ+g>Caayq^ˑeSWWnOe |&H,Z8ŀ+kb4d288{ϳkls~?d3349(le> ڑ59j&\iiR{ ǽ zhy{Zؚ}V:6KW;vScDַfcժU`?!rK>Xl/Xn7]]] EEE/S\\kƪUX,E,cjjX,Ν;IR>}\W7%IbŊTWW/N)..?ޒ{X$ 8}4 $ ***p\4-?@^xw`9\uUȲd2ݽ袑gϞ=LMMNٰaECCuuu( $qQfgg 3::J4e]-QAo~2 0v >ם3ѥtttښd2fa0 V}r^hٹiV|8HɄj=KDUU֭ttsmFW=kdι I(,,([&`0P\\f{<$sC|W|el2_/˒̮]B4qDSQ|1zYO~?If3)8mrgGec&:'^@'8:u9=?󓊧Xe[84d"b555B!B\.L&S.zJKKvc2hlld,]v֬YC,cxx2nFXd YZ@nD"Aqq1mmmX,47|3N3gPRRbɿvL&)))pYj&t:(Lojz\~]Yݘs_(MD|YPYYr&`٨˅bh4RSSCuu5T|.B\.f9_ TD"AGGTU=yu]2|[@|\t)$IfggYd Nߏbo0J7H([nJs**++|,]łbaՔDO$06~T~ߞ  Y$IY^JR騩ys_0sVq0@$@ wٹz  JQRRrtUyU6LadY=}ll,˛NcӏƮje QQ_6w#7J6P_*7YA||zze~H$L<QU5_nm^-ž'gO\캻>-|GFFHR߁ͽf*ɕknq%7ܛf-AIϥp}n$1>>Nyy9H/p8,A!WFc sݍBNNҶZ"xA*z?Lb4 {ܝMEzKɡQ[T2]yDB!{b=t:2$Iœ1S]TGP(t ۗ sr> 8[9]T=;}^/KAAs8t E"wN$F#Nt:,T]g^p80 m@nDD"on?l٣\Aދ2X,$fc ,44qu6 Νh4J(wrbɿ_iA.$IB׋..  ,vުsu̥ZOeVIHidwwކ   _( t/iq1 PXAA~DBAAAAЭUAAA>[ z2$\   j`0,nQ.IHYq8SAAAAxI,HѸ(>gwݎgLUU$Iw?{w2"y] G?_:iZ}W\hsQӴE -_AފۍE{xB;Wyvwy~oDA>N\zvx.[i` +7.A$b& ;+|UUyꩧo˩Shlldjj>VX$?/Xz^|E~_P^^NII ?3uuuA_ÇN㥗^⡇bdd{ȟy~_Eee%p{wm۶K/b , > ]v===y|>:::z׿_& ٺu+ôMQ `pGyg}ZZZ8~8wy'xfzzzkdgy{*n7|ߥ ~q!EvO3<Ț5k0L8p{+WC>lb]vhllDQ&&&y(..jsϑJp|8a ٲe eee/ /2CCC$ hjjbttӧOٹs'===رO~ rСU N/OO8x }}}S[[ok\.'Xz5od2\EQx<@'H$\},Yڵkiiiᥗ^brr2:tj*QU:;;8y$<$I֮]nfIRt:V^M2$_bA.qz7O}ݻw3::Jcc#UUUoKO"2k֬!x<ܹ>8333ʵ^K{{;hi֭[_X*> `kRRR«ʾ}Xbf֯_Occ#/###<\wu(¶mPU;vӃn}nzP(eqQtYill$Ѐd*]tR[[ MMMv),,_uؽ{7N%K*eeek.z!DZl455QUUD>K.l6#k( .6n܈,l۶/bTUpPQQRVV)++#b6ijjQ di\.eee8NmMqq1eee l2E˕osW;::PUJxWغu+$aXÑσ餼<(TTT000=܃$ yz477i&xtK2D$I~ VNGUUL&%%%x^b$:g2d2x<t:EEE; T ˅b! a4IRgXh4J ʳ]dͣq~x~~ϫ  i<T Y)))!H仠;dY&++,,Rt:Z$I^/z" z&,f9ϻ˲L0$RTT%N\F㢷E"z=LO:η>`0Haah%@AAA?T ˺AAA tAAAA]AAA."@AAAKAAA tAAAA]AAA. BŵAAx(B&AUU۸;$mIoٳgg]AwF$^/w}7_)**m  dYfxx}{lٲ%' Z[[7q" <|󟧮bgGA>0;oo\AAA.tnX; ( . EQ.vVAErj{$ χ餰b`D"AIIΊ  |`i&'')++CvBT"VYg pI&LOOS^^~ >`0Haat\Ac:* yx/2Y}`0PUU{]   4Ί `D.  gA~D.      %@   p     \D.      %@   p     \D.   Lhg8`DLK֢Q1jѕ%3kxt ֳ>b" ,}g0F%WڶaqNCNf{ - ϶c BF0l0m*6ÔKj ]`N EML^O$Sj6d] {5 )c TZqG98{5ƸCǧ9cTYFIIO$ ǹFގE-as ig9`Ё1CM~!%XGlT&0S RC\ۋBŦ o12"2F7FYَ=CSNC覝K4NqS )VƩJA7^’539DO$Km&`6GHMV l7Di 0]MXǬ 5fhRKnzR!9 Qa4JLuOcYCo1od/ECX%4fxTdBcQ"W'(14:]cPif,e¯P-Wrc j(oj$́ "B)8;Kx 0[o"<3xkÔ1MeDZPbzJ$g]t^x:394FE') (f(Gm( =Xp3vN/ѡd`j, I*fL&YʙJ':UEv{[̸)hhT2`SfI4|b&f-HI37z SpNbʴiHfD.֧g/#icdR.%V+i;⫨"8;vS:uI.%)c4]%gActotE`KQLI$D?@:=ACLOt"#k~,g.2l8ঢqN9@R23nbAdʘVS) P`,^q'xg똰:1[Skbs@#MQfXљ jt5 /^ )B֋dlf[Pl Q5.ink- uez>ʢƨS[I׋Kx/L NQ3h.c2fWN!؉WudiF qو+aA'F#}43`]{ ix-)K&P `ǜ~Ӭҗi@h 2Р}vI!6:5ðZGqQABL XiPX:`bLYKS>zd.0adR:Mg PalGY'\<4OQ 9)Jhrf0 +]$T#Qs4W(3Z!Na[]=6l|FKQk&qT#v+*T'BږqXp&.zaL#Wp5EϚH$&ܘ*&c dv[JGQ:@ J;ɌV"ONm᙭ j_r7dd,2ʬ5&uL+ʶS6gH2BtDBDa)JRaN 3F0TԎfza K,CZ@ZpBkPIi%#-ϖ-d0 qftZrΥvj};#t?I쭫U R(ј`)zװh'րub/W a8f1 bqF  "qzHT kԖhچ-hce^;Qh^óil ,I@m1Jq:|*4U0cEb"IXsTb` Y:gt 9N0޽k4CTo }Qf?o+'( 5{f:5:fj}֑ E-Z͘&&%3f$< F(P|ETwLacbz z5ߥ,MSc3JY0T;R0!8ތa"Z]#YPK}(I(A?FHOcl9)MkGEbq_e~xƊ uarA85\ ql8md K{,0=<}FLkQO u2#HQ#e)/F}՚$ѓM0/D$ WPЅ XM><1<:)D :i؇7Q\2ìՂru']uxl_}4: bӁ_0et%|#<{*=v Q%ۿ"J' ~B·;:h8 ,7}iHp~>G;(Mxv^>M|?Qb lFD<_9zUKg> 7{f؟lwuMʃj#Uw4J9>_{oF=oZ;yo*yefFs۝_%O>A|7?r%?okknPv c\c{JUw݄kg_Tߥ'ek8yQSa,&e=s:ę:;e:8F/|{ [b`{)?%[{4˕([t8CIIsr*+>=q#YN~YzX8ix@Zgw Qr0|c+x:' XC7*O'ךէrki_mPteG-<*|םA6$Y|",x rh v}AO,/adeC2qg#\¤*WX&ĭ4,}g& q=}>z7쯪yFLj .NYmK5IAq`JWr5EnJrJyj#s+P3#㫹R݇~o;Oy`QlE_s =φQJbhCw5õ=[‡~Q^e8_}>M'ӳεѿ BZGٺN6M˨["|b7ߋѳ[b-kߡᗫiݭ=x1zq/iw2po}7DizMLdǯǮ1߬Fe߫%cȤɾm*yrq=ko&4ULx7 {&FO:O4U5nzko|׶v&E]zNї]6ĉt WVbx?Hm/s|cO_z{ump㏈lM#]DKef>?^h%7]~L=WǒC~OqDR[R2"S> X;xtM\O 3ߢNl95QD_5V8kߨǿK؟d+Pgyoۜ|.arKK'^搵ǔ5?Vf6BL \gmf&iC*c_S /hX ]+ Kñ:&J+_PO3uf-5'?ǡJ&z/m^bpL78Teܯ Zǟ]ϞRNW۹᧼?b"IQRr՘Fi ASq=T3W1Zb9qu 6ŠbVq/zݺØ*|''Vc=U49ϱej3sE[ܿϳg}ϰY|#n&!1AJykOQsF&8'sL X[34Q{qtddIV-i>>7V4SKp^gܺr?v<%KP8RS+ߗ97Q}Eg٩(~)s=C/Q#$*Rvfhr5e_߻?kGu6`qPYx343CKInW GC1=H[. |௨s%4ðd2=-tA37 [乼g9;d 忟[l .YKCA^4$)H"I N+ͭ62r{ Y);/2$gӐd$IΗIJ;EҐd]vE˛<'IZX>2H $(e+Rv{ lzd7\\2HRvs[_IɖD~yL뇤y>_~vz] Fr Ϯ2 e <2rg@ɗ$eZBȗe6$y.}yn[ʲHsuGʥ/e\=?-l\[2uսEU!I߇ss>[7Yi@edma(s+cNn_ɗCnNS}n\s!-CQ% r븠yOf~֧6~ndOAY:*r掛[an }Pu+ki~dž\ w\* us]:+KJ> )W4˔4%_4uٶ ׶̵!0RN--//.(WwHnus%qc"ܼ2HRnK'_I,ocR:y6߷rm.,|CR̵j~q-M;ϧ,ϒ)v$I7_/J/cٶBAl= d] mS9͵Rn[Z~N˵tmH =qY7n( ;jץo'̯s$+zHȚo+=f|? g=ix 6Bn߹Rs~2|mw<҂ʵw3w'Is|[/-^weYF͕XKcP|`N/<ϑ`~~KdYF;Ξ'۹&r%k9CbA<+'y-)$d6?<_AYi+sj񖴨/Kcs,X/^(\"?msruEA"<۵msһAAAAD.   =s$(ӧe&$I"PRRB  RQQllQ(..-   a~ӟb0(--%  xYt)۶m??ȑ#8qo|Rvp8y%P%ФE_iOHHH} %M-;s I ҜNe˄-ʓpg'OK'-ooR iQY+/^o˓ѤlYJ&ϕw54i>wy ?tM"ϧܹfׇEerֶ4$M˧p\R>* 6\ڂRªeyol҂EJ:WZ>݅$淿0v44iafWT+|YKٜk4y>OK6\ɖ|ڂ+lMʹe->,sy~ȭD% n,ֳEźLUMO,gQ~ޘܺ.eEf:JuWs~j|!.,\Ӟ3d^ϼ`yoXN҂cm8r4y. Rn/LZPgok7iyU|ͮRLآ岑/֋?Z7D\nߕoqv/.\I'U7vz.ۅEm6s86i 6 M?.h-]r(i ;ȵ_sm|~;0>|>T`ma\mሲEbn~!I oA,.|ۘdOF/mA4W}֩7Ƣ:p*M{SZ0EOrO:~Ф je`a֧o%-_n0.cF7ronIsmOA돴h=[t {#iAZpjn.҂=_B҂ ՛1s[;,oLgW;+'ǚx74S_2? ->GM7Կ7nµ|& 'm~ߕ:νmrXPԋ]m~[Kh^XFs|+un O9ov;_S^pm+휕|a^w9.Ǐ' O}Slٲ^`0H"@ p|_%L2446b) ŭ|1VOY Unek5Tʣ9 CkVf#Yb>`I Z1ۼPb:fdtiXiއ-fJ.Ơ_FwMOG=qfl#L D!U(:%6{pJ&n=ǘ2W;^Neãq"X9S梾(E&]}OmSISњ,ey5 q{KH`}gҘq] E.ŏrjbf-d#\(Il˰R҉˧bdp=oLKhG׷P♭%RcMWZkE5S3+1dtR%r7ᷚ7qY0ǪKp/7ưIz!mو4vBm6zC$JøXP+QL k3L /}8@rlz,pfZq؟g<]Eyq-ǖH0uz=u%蝬E*Wb(?L0׆8]gKt&hH sۙNR[f FՍWPQK0$\olI)ǘVE4B/Vm"aRBLbՃ{=&J:EQ&LE[XNI$Z e5/5'N\qwKLabfq1ս(SR 53[Ѝsly G#L2HnVG4G.BW67V+l41%0'L?"U圊yd?3Bȥ1uJvT"WӘk#fTHzqLb{(*U>xA ͜1aG_x"4f6"3SLUa> f` }TG(TFy‡ 1J,NB_?l%QRL4``5.A_ a7lf0ڽa}cbq ZO!%uU6|iSN0jvz:f fӍ)ن v|e*i#5a5ԧYB[ӋN3kLn}0gXV*-38: +ɬvk)LPHц4)b\]yI{; cf&0w%cpp/QTTD: NgGL&1 ((.I2J2uC#T'&PjjlFr`rS (6LfYVO:ISebe䀅K9zSƍRuJ1cJfJT,ZL8A2őF&D2vL-2*xY%4J\10`)Ú# &`3i cPSUJ8 v ,ۆحF4 iI,3#O_Cq2@}d2:0f r_vYhH1lEm*nt>S)a %bօ73U,PCppMZ5Qc2vZWLb 9R=&AHM2"u"Q @9^4BjD)&>12TPC qDi>K2mEn MUy*09<(D YqI>bLU0䠍Kb465JSIWM-$fZb̗)=Vlc˄KhAi{dĉ+f!.gL1aa W8)'TII<ž4DSYxnW9' +SRF5V1\FdU9@էIK FW3i%5P+ȣ "i)(ctP$gR(UDX]XTD۸-fTsEQ39B8biӔ.cd.q1L72Sh`EešF\AdX3f2jㄱI(Rr҉ʼn{OS >'R+>&[THRףf#uk35Rk$785rD#yZnB-δY6a&'Wfѣ-"Ud&4TvD3LJNZTS'Ѥb3Fx`hP 0ZP j#TFƷQ[ .@PG050f+t’j)1j4Oc!EHt酡!-Se,Q ƧW4CAd5F3s2xHG-:A 3;CpH; =RضKcVNM1**cH 4iשtf ԬQzI pΨi)M+&CiiS9xRđ[PE2d+7EP։ȅ q PdM=L4-d3K'm"2`N}a6D.pX2;H˃ +F=OPJP0&+8"o_-J]SGX.ZUNerr>~p[*plʫ'N02rݲpMgj`޻|[n5L5>Ǹir#Os V:J9u}g~KaY8<²Shpd9Jo>Ҧխµڸ/+KJ3LquPE=(9⶜bٸr_V:T|F.SxzO7F9qZ %RX!MN47;rzOٹ+sW \svKx^0^%mIDATc5u80]/dtt_yq[\빕!/>K ?{6c =uJ)<(_1+~4hοl1}1i®ubö攨A躧Cx|ꪇsps~9pravvB +7kMl*黫BZ驫j3\6*o>ɕ5m͐@M7wcrr^\h N ۻ(%=\`Y#LRTXY }vv̙3r9xnw}Gٳ}ݼ}>;y$GY^^擟$ÄÇ>|Ç3[~#G8r{ ]}{߾ MxyT),B(M+%8k_BwӑBC h>^CGGCCB=t^oф!АH!@H ]t9ۿ@am¦ +w›_Z MH:MH4 Bc!,| iϭ!mRHtiӯ T:o[CJ.@-5I{ )RJ$=>JԄ[H$:(D8Ii/ѐ涔H 43G.^=:H͛-@ (MӜ4&+v,$B#%τt#gM[R$ k`:JLh8:¥GiNJt[\C:ǹG {.N@j¦O:-$:1^&cKCґeژ&a|5g!%&l5[=?XvаiiptN 6|3Oj86fp p| ݴ}%?&_@_lI|sln?Mᗣ~5,\k]GWt  !H' |Bߪ;-x96Z>i^!%Bs|'h-ٿh6R $ ͶE!to±kQ[W ٻrm%m-5[o./m9!]н1#3 i[l{/OgĖC^Μxn<$ʴvb믴c5a 4g=or]mo@Bc ⷔ}(~ټtʖM*] MS6\uHua\kN>2 &DHq4mȗk|r.]}vKܘHCjbgat4p HM<ui錓chҮk]>(<ϤtW~\ ]Ct}"v\^2XX@ GhҮ`R96eۗvtif{N'n{v.愮l۶usH';Nv|2C͑;5, xqºۣTN !#2Z-Qy ~LsucKmMx~ MZuJ2I`L޿ȕ);9yG,ϭ0#A! \d[eBqaUm7"sa`m42af$٦d.WktW6G?OE&U3K-b`M?˹zBz 3'^Ej"QD$nZIz w.f;B*sYrBlm  Ywhzj}.5*VT=CwOԈv6 a'챕 Rz| ȴ2lG՛&֍4[ksphZ+z5- wj9Vw[*/XTѯ߂=Yrϕ8[\i"VиQ-Vۢr')B^l/ VMcgG|AkCqM=FYd4cΓ<;Vv/ӿ q#C%*5^yEzy' ;7;T%B F-ΛoϒI]Ǖ+[ef3-\Ah/Kμ.HK1#W{4k]sT^\oe(*[8ګiUI^C-O? oXYː+H*]5 9Iw%^z~#ki.(4^Aq|\V#W im2t3=.+OۋJe+֗ϵr-Wohz Dי$ZmryJ@*tkTbA^^hFIE}#rt*74ϖyРֺ՝:nm`%nv7yJ]fVmyv7f}VC/'k=v.<ֈ!jMVatj] b4K^L|&%5V+&w8uZfqdXbU^]I+XըUT*N[zoJHJ3 ,*k,vahdk/h^rƸ -P\Q Ul<_,`ąB~j}"V$B, "VM+iZ$=` [m=V*!"]Œ-:Ff$xI2 =tc]ˤTa2Rt#+ZT:Ed*J=D=hO _]R`ƫDL)(LWlwUddyW#V٣I\UQ-^B]d)rV*f RW*=tku* ^=n -kyV_$(,D{"WZKmƛ&{Z9ą5>_ PZW(:#Un2ۗ6,˫l60nhtUJPܺxA]m#ϳV,oSʝ!p:&l#>zqŨiW*+*w7EگDoXt ~d'L=%eBE%-X`ס&JsKJNZQP7^`dchD:Cl"uK29BzkU?XeJATbdd9iN۱{O8cqC~-Az;+V] so+7 Uvoۗ z -^Aۗ.= z"-)6ɠgҽrGXN)#,[>vCN?n wHZX\^ 9\c>%͡q^ 9-SN_K!ޖAc;9vt7cDz=n#A&z=q}t{0nw_XNcrvdcm̑&8B%ty^e9n߭tWoMN?xvXa,,gij7~p:-ci7;r{ԃsWm=ӃPkxnwB*(e$:qzs[8hR=>:; ;n/]PNO;>s%=[sz؄ghH[l!۟Zs3\F)?Kzyz(\Z@9 58*TQN-R tv>xv]oyu|%Q~dh!fn^pߝAzF#;CXhC=|?1Sk:S@ll]thtoQUv2DPsicȨ];Azt0t72_.r}nqz8i gf³%a7뵕@J8Ry=u\3ܸ'^Xa S_/>{qz :4MKy=AiC`U~<Λ2z/lK=d;^"e#d3??{_r$y% dOpi#Nt[NOPXn'k'}9;dmJf'*=gM SxGGӅgrwöG-BXOI i99Fn;'OxÎliUzj1dCNjH6xtU5X}>5ǑyvQ5n^!sIGFհprd5$ K✭p2'Nj!M:ϣqSZaGlMX./|lГΪo.մ$BJJ|=kFaZQ=ֿ9Jjq44xi'EÇ>|!Lj\p1NN&LJ [:f͇>|Ç>| Ç>|Ç>| o}Ç>|Ç >|Ç>|6AÇ>|Ç>7>|Ç>|݇>|Ç>|xߠÇ>|Çot>|Ç>|mÇ>|Ç>| o}Ç>|Ç >|Ç>|6AÇ>|Ç> JS-=RiH@Bdz:AX$wp0&&ɍDZQfJ6Chζ ΧY PԧԻ.B 1*cDc%E L^1B),L Ӵ0j4Xx ݩ&^ƈw:V7L`h'HJU%GnQ DxXhh^t"Pl1]P$3J1B\#i1o%te [$ ՄZXۤLgMdOf$eC fhDFyRs@7UO>}+ȡb@fc5Ң  {Y:f\SNPU 6XhZ cE-Hg!-slJ|ƈ^j,H/4u4G6{'3cFa|EpN:X&lnl1g֪eBͨDhvSH,8#QYځFKBm+ u-JیQF`iӢ?a&O ʴAb(OHs}N?6tڨ@6z3`IR%wWK$P$fkD{}beI'1 ӂD|B֨d$-Ìޙ`j3Y )Fm0ia* wTǍ9Fk\%Љ[ `>ӥ0dRe("Wf8V39A͖F^D 1U-C:HK>Ir P>}3]eB}ȅ=~p Σ9/8IɛwZan*%9ʋni'#_4f??G?;~r 1b_M>R?a%:}?˄Náuc{)3hO+=;|^ L/^aXѱ-vrL\GsKoeٽExY{O ֗opez_7 &_c1f\?6G7S\O7/} hLZ3dvt?ɽ-4k12?fbew|q?ʑSO8|cGg)H@W(k eRc Bq?{SfCD]k^a9ν3ĹwC#Orտ{?y3?.:Wxs_6}[޻,ű_{_}OƎA~޿Kǘ89+,dzG>_?im`c_;¼kqY7>FNJoYzׯu>k#*{h/vx}b\r\7KcM}?R\OAhUɇ?OXC`{dbmf\F^=OK<qG)Qrj9;~O1grx/~̻$NTsモe4dɛ!? D#df&ɯ,<\{?OhyZge5xn|w^ ߸3M'&~_pN q|k,g>šc+߳;]ܓ|?>^8W~߾k"Ͼgj(·MuOn2;4B7XX{f>oqo>/qbz'.p i5byZ|l(=q6<Ըί|!~/3 eeF>y->xwy.>D}n'sK=C;<7w=֋C-~ ݍu2>|]}o䝧 X-7ԝ\>"_aa>y'}LǞl?/S Jq[>;Dz}2Kvk?\%&ٜc[Ɨ_޿o_ѭ'hv?~?2o⡙gغm˛GgW^)S d{XȗX;%E+ȭI4OOS_=~Ǿz4J|"'{|W9].b6?FZ+ne|v>t;9]c7טԞvc/8}TH+_C) aY\j.g}oHX򃤎*}eBy>}t'(|Ua,#/z>q^6B_׸陻OԞE:Lnۘwy4x?#,x<w?k\f~-=yϽc qX8}@\t/C<\ڞ'_~_*+>*7Yy{PM^F-3ld k0s+<zK"ݟcV{w0,n*>ұW?8F>^Gxs4a"?H ƿ"+ܗ?%|sx/֧ƥ?+|׸q߳1^|`h'$ͬe ^OV0=.;Wh*Kc׎· ,o~ƝYmMo؛5ҟ}ѣl5O%g}#|wM.\sOVrߍ|U O3!p靂EF wh3a~tX'XpPDz+7OQ|3gFY{GDu3oݧ>?= Noвl̉49g?=c ?z?}ȗ>Ŕ,{w59ykE+c+t(gxϯb;R46l?ѻ{ U.-OxWylKd չt{K3<44/o~𓿿~;qr1·^ YfҹFhwiz?Ĺ%/ɍڗXT.N?ԽփJC_`TGc3#Uk.R7?w~7^YEh&BT 5m+=7w9+$Sܘ%^^1C Y և8 f3nϛo:' a Ѣuh@>Gߠ?Cl/:,4ܦD_a:]Ϟyȶ뱻V_o~'}vBvlܳ,v7˛] 9] [iqw:qooٰ(\{)/r6 G8;Cv__]/ouj؞'|saٯH}5!|iXC 7ҡχcِ6O?|>_yzǴo3cٰo5v_No7m!%VX;L7Ƹ=6ӕ}1Ψh7CV^;ЍqSkax66njx}}S.t ;/r aܧܶful2C7~O}msx4ݮ־fXηo_n!:O^?tb>e~͝c@S}Æn/McgB\_xx9?C Y>{Ѣ g 2>Yy >?=>|Ç>|݇>|Ç>|x[.qzi `ff!t!(,d2Iբ1:: id2,b~~MÇ>|Ç>|-m;ۿMTb||%>>,GE)"iOgrM~Gv͗%\?o8!X ,r*BQB;ۇ&HWA9Dس ('h !-Za'edٷ aSPgBٓ a?RH6IG !>J:fJHg]6HrF B F{5WҔ7T P64ac vՑ–P@:kQ` 9xX(%qk{` 8Q_mX],oW4,GW\!~8sMK],;K Ҧ(,!-94@H !LlhJ:>(fY;AJ5(PJC` dR,Ooy"Y+ZmK]3~B" ֐kB 3-O_YCWh°ek4{q`9|AkW>``6Jsuʹ `IfiN ˣ52Xm}^֏5a8*`ڐ²uܕPcCu!,$RX>xȑ=WׅAXjwlmB =az~ _(M9;pC=!lE~ЎB2táYWRtayfh0yr۷ok2W Mi/QZuc꼅T@577]j2ʎ볆‹-a*{ },, g!s.ގ=B <БmCnN Jr]y]MB B)m|9^_'rڦ%HrC!B8W 4U8z;ZgK /rbݐ߷͎jAWamJڱK1n |+8]`yñ7Wm>םK a 4dq'Z8-9bߜ}B8.;\Wǭ;SȁںbSJi!Vচ+})lcwצ+[^&9et O<%v(81¡c(KrcO oU.-}m(v*GwQYJL7!B<۴9y.mXl, ~Hgɏ]jyVblSZ2Q懗Ր8l`@ s 77Uaw:ē OnG5d~mU!؋*a\('TNrrJa 2¥E YM!J^+OBXS85PXC@(1V1 Jܯ]??ȏ~G?ez~Nԧ>8i~+S>q8K'9 L2AfP]4x!1P#DNQ5YTaE"]-%,ј꠯,POP5[h~.m B]=cd$Gl9stcDQ՝Ebx&L'()VA֩?S3_%w]DFr4:}+HHt1i4"ѥ:ף:dI@LzVEpkr(rnʽhz&A6Wg=xMACdyX_œP9ΘV4Crm`V Si?{4ʦͣ1.c78KC̐>2H]d%Cɜ<.]Fe@Zr3hٻCwN KDEOi瞉 vځ&FiPSV1F;]4Ӈ%JTSԎyNpm"/܃}>##~¢ uX:h#t*$VIF/ (V=;^{2d(=ʜv'֐`INwg.n+3 nvIBǹܛA7'8[<‚!$* ɊCKԭ8zCLKZG(kܜ›v3ONB?s{/E3*hv$ZGhXILlMS6'ɈYc[ǰB TiT?ř<y.Wv?q AjҜOMH;GZ fnsN;`& =|Jy g}h$LD9N7a3gSDnͰ %e-\lнcf~X"K@0F4K1awZt0#yB$:c)F#tOC'T\pz\gT9d<܊"@ќf WC'3$C.>Jۊg,RQD2$yj$DKD0p!L4QHM4}+h%-eAE@-1K>{1U"5T\85V ]:Xz(g,Pf$TI_;q|EvZ!ZwrzBKLdWN`lj&jKiflo%t89KP Jjg#li5@B1bTr8ɭ"fؠIPY1)>krxb5"XN|fu1YfYʤw1C ި}>0njJfm:ts+LeR3荷c, ;5Fn^C Qfo,kAL[i~Vbɭ4S1S&sHwxrL,'"L>x>å#L|WF QaZ!ë1zr3aܨP=QBK5J&8 9N3&x rtHkG; R2,IiL2ڣVu$fM{5$BIsi~%Qƛm.зBLz}³5~=?Yz8S"bGo(j #yO? zB"lG0qrmi}e!Iy/L2W޻@^#;#q}q6ɓ$\b (g-8w([<>>wcm>D#HO04C&\ZG6DuRL_&WUMu %>~ON>΁^)Fh$S=Dr| `#hExsACI΋o7ƂO111mR1!V>LpNPw0QL)sFUẢ9&A}٠io7KTDD7Fc6Oٴ72QT7V8[PM+# ET7#R E[_φ%!d)J] lbE{TG,V|AW!C`vhD8yGeG-}F&IL4ʅ#h {lC{60Gk%{{ ,js cB-uQ@X(h l/*/qh ü([c=꣊B3l߅HPR6(KfǖS0ifOvn@kktZ'g%s!}ű&ՃM8 mccdfxjwDN1:E{A/gduz?a:`qjhM1թӏl]_ ) I/G0 zA/y|(۽i\0ټOhcӗw'IwubeV7v-P ɂܥ*M q҉Qvͅ;S ēYʵEbPpT+Oٸo\"J'.5N$CܱF`;ѬO1u#3cy|'Rekdz0 fAAޑc'L{8Ņc";A ˓HǴ7Y0C zN=eoп8K|0m:QE0O$ e7 ef  *Õ * `&^ޠf9I+g.#: a Mig>bijZ'5U**5CƣtlM2eX1g^.2lbH?ĕC4j19FifTS#L1z]`24v3}\\hUPTL| s=awa.M v` loD7?gbA.O^}8ءkcf)A' ("PfsrA_NrTeq&M=BO zN &"`?^xVH#nx!r#Q6Gޥpsd6YkGǿpv$]U\`s6s7S%RㆽA/Yb!:{ b2gq$8FT6 N)6:VA' Lt\&<{*fuԨH4Gɹ5z9ՙ4o:~;f{'TsL䠻X@+4Iee&يhGqQSM*U SFDTf(H7i`F̆v/L4j{(KG\=XN..˅GHT ZLMBlR?ؠ#^ _P4;as[cLފ#TQRS4k-.e?@1g,'MX,;1ތC-1F[Eޠǩ0_c~%̰Iw6ŇӨn&-V@ͱTZuBfeՙq,hqk$2L9%^}dNwCa5bhS}2fC6E1div $ sbbnNh#L n.YɼE/f2T\+Cdc#jH~N]7Ѕ=.e]ֻ$6GhaUnjMΜX -Lt0*TOzsw #! rV|`@Co˵ãܛR((4J [nKQFu7+) Ņ933[o?p 1]KٌƟ,&faUcXy}Eh&z.XhpၨA?Lqδ>H Rc|Fb|d4Cs\_#MÇȟ}?9E>ɣlE1?~o5D+ä&buV!zSM.{y^rKE@6„55RN_&WU"MU %9q'OO=ّSG zf\{[B`oзhb1R&c &5-+s z٠&ff@H3(vf\:OD Frb)4Kt3 4$%5I#>LP3γr(JR&i(+MXKp+rccźF;x#y7[DEn+1XH5{ewc:6ckZt3 OON\s"0UByg#DpW{<&G2D. %{y(Z+A?~8l7xmnݺEG''y{r Rejr{lO%NI0^I GU^)cPug)%yJ*:= @ ׈xCy(v澒~ʳ2[-o!;%@2D-7YhHpr`tɭqJH[[J2)qwp\<ƺG ][:;"Cz`Jv5`7x+dpą[nn[&Jh<㔳F 4)0a)*Jܝ>DzYPjP~ rݲo[c^Y[$\\+_zNPAkNt-SjPvJrfɠWeb`v5(Q.qw다C*K4iniW&K\=5lߵ}5jv%aۖ 2,5xmnٝ ˣ{ݫ{P>;W 2Jܖ}% OyǸ:ºݸm nkY(%Pr ֐AbP+9Ny0()ޥ[~[mu<'\kZ Ӯa[o*`legoC9@'싩r ? |W^yw9r|\.155Ň?an׿uBgΜaqqd2?D>|ÇФ БͿ+Ç?'|Oqa>O7?g? HhH$B]Ci HMPhDhRhR ]Ht)Є.%hRC=M4MCMJ$:RjhR Ҽ1:GJzgnMk™W MhD )t] 4ͦA hҾ. &uIBvh]zM6? pes˻OyHaAiMIBC }? t)0fӡcH4k5)BiĒY#/e mHR8Bi5-7]H=‘=ԤM>j hБB|)5W4`[\}.ݱ>I:BJ&1u給 t!SCC8c'm tm߮ ͓>O+"uhty[9c ix%m㿥Q#sRwt̍ER"u .$A#d)}_pkݱmY6#b(5iۓ#7 t RA-B"^/*ٲObo]4G\;EMhHMiN;޺~FtPȀ7X9iy;yЄ;Ka3A8qѿc\s֯#ct;;qAʍa'qu坐tN‰=r} =pe!3{.]?1ó?ۦy&|O\p;ǥcOvٺtcr!Rrc $מ K~px7LJr.֕u)ՐR9P#4X ly3O)OC׻~[!r|c6t f?8Ύ!˞kO<ʹWڶtt!϶M;Aw&Mu4v?ȹ=ure4;_BJ 4)o ґxvhڴk.?y mlrpm)ЬA^"] ;E<ׄoK ئ[GÖprP!uI\Ξ~?RٱHp3|G++)|8> {\ ݫ\S;tƑX^̶e(8?CH&-4~whHiXR۠E >sbڰ9B *}u5TffNU-n-6`'gF\l;vzhnl5g_h+ȨӪMb-Ψ.+-Z"E&:Mn -f eJ EI&]~FfZP+oɗd.769C`{K|'Je0v dvr 5F'}~F)rm^oU]+5wP.)~ȑoQ{3D:h^^׷l=F+ERtӻt zMmVVYni [³.oKcD 7n+=.02%M d5}zNYRcnVx6UafJF2[T&դF"(l`1V^ߣT;Lfxj*~ר<^zu^ ڤzJxl).nC# ev n q,w(›Wf_!Rl #JM[7(uss:B7\/Qoi_j\9Coul)ϡm5FE&h*[J>[g2TVV7yWQ:56=o/nb\jS(W۠T2@ -μnJ"Nj+4rsgT[-%f.oSUx>- zcdb/)ҥ$zZUjtۂZvݚsdY_*<~&ze*B8Men2dE2Wyzn.fk봫 Inr&$Q$m\_#P7v4{[f#Sf-Kl[YnR)?Ik:oX3\V5I`fH;K0NY R]p*wEAh.uF{MDi1c*L Qm*U%kW V[IyﮐHh&ur!<;JD5Pv4m> +:k Jk8ZG9|`g.mPkhڼn2j.<5^6 DPMY!WI'{7ޥTڣ+j2b}3M*/ޤ*p>M7h{l]&.b˖,am1+M+MiH_-޸I7kPhiWj$T#n=j6_mq{j0FNO(ve3|B֥,vil ŋ1Υ)aۋмT6 _SXZQjH4.gyMبo߽ERla6tu6.ȲIPԍ3-̘/R$%jo^zP5L X[IZQnK]mj\nnc_l&nRѫ%Z]Q'*ԫbKfu7)sE!r7EhRE6Aϡ*yVP|- [אz2+ݵ:ݗHӫmV`%|Ç*(A `C-,#kÇ"CKj}h{[:z׻Ç>| q3> <'2ǟS}Ç>|_:G8YߜIt>|Ç>n}">|? Ç>|Ç>| o}Ç>|Ç >|Ç>|6AÇ>|Ç>7>|Ç>|݇>|Ç>|xߠÇ>|Çot>|Ç>|mÇ>|Ç>| o}Ç>|Ç >|Ç>|6M|BMr@(&#m&+ӔGKY,3%)2[`e f2ؤ-"Ba F& A9#cŁv u0IJ5 T?@',)1EjkeGL =z!A m$.'@]Ĝ2&4AIGhGpbgE&%LJ:#5c&Kt;tn+'S -F:mz-"Lϊ יN rYZ^qģr8Vz#{:4qTN?!à!D=c,!ѡkDh [Afz%e&lŧ,rU'2(X1FC4{,l&8XR D=1ALRcQJtz#yI@`dݴ4F` ctl iXBjJr&hJȈ^酠kDbauEoEM Qe8ONed{~CD i8=,~ |i,NR!:b ,DjkfLoa(ЈetEXHHW%ަ 3񳚺̰1^`>_w^x*f )3v,7԰L-ca./{bb#JńF2i y20DW- Ta6(y,Je*`^F 4T,ʎdQPWy=tsYoD&AF԰D_W>7[U\u?[߹*Y~wr{\X"̞ v5~#Ň|#@/sv/>=N.s<8H/$}l+if ϱ͛R{m̉{ k}[yY{)]l0^|3bt%c#ϡv[&#DΝN0#03v*^3C~={榞oXp+Ko; So8-W}v&^~q{<&_!Ε%~(oY*({3 qq=2G򞉯/+ '~_C.z/'ӝ;Vq>oލ=`r.+Nrj6|o/%+Ý8x=g33G_NVolsι}BKřV}G5w:8ZML6ܻxjW+ٿomw 'I?M1d |1J89^zMٓ|~+s{=^(Ox#UxnҭM?Ň3y] [啽̿_[OÝIy ktvLs|ow|]>Ou tKe2ǵ3|5Rz&INndbqj?-q5RDC[M'| ~㷿ӥ|>Cs7r(Wv?[9Z3¿ouᇷS^ǜn'Sfzݼ6y^~xwXEټao{=[8n1D%s3G'tlΞ%qtW_ȾzO}ϗAf9|pіEFok1PiuVrQ{3m:[y>5^$á#俹W$ddz2l/1=yO[w~'^`?Χ{_?2߃(l{?}2]s4*8_oqmtlEǸVeq5oO?Ζe0T1"v˘9N?+fża֦( L$']λK,0CLx?;kgd Op~:z3/%k/l9m;mO49No{|v'~Yb;waߣ=F~70rc|П3_NvvͰ%=umwƇFMcd_>ÆiM֪rɽyNw8>|^r;o+w5/y&/OPj't o1?d4cby<[4էɼnMW3ģs$O~3o=ѯ|݌\2;_?~xs?"7 M#|[?${g~_rbK+ 좒6 8{od3r+s_^\g_X"owN;d3,w''p3ҕ^ 0N9rM۹kOLT/aۤǵIp'vPNdYH9lO;^w0c<}<_oLk|o}ܴl/WnUG?|;Kw,})&vHޑO~}!?3~ʭ< K &'Ϲk<MD?=Oܳ<0p)/~t3ޟGR bNOagx}˻RW>6 vڶ%}~ufC\5?TwơX߿|yHO$x}\0ϝ>W'z'\DzvVnfSVW[o|/f;y?!7#YJ?>Vz2u_ο= :rw Cc<cu1]覰W_%fn\/JbF~zGK|o4/6n-?D ,3ӗ:3('7qKN;đ;O?_'R<+^_ wyڸߺ-t?]" +nf25ȣ:RqK ,a/16r+΍q9Ϥxe>WA~nG88kyr<~}8ڻgl7ڷa4<C>ě8/3߿xkk oːޕԽ3x:7H-\C[>͖ ?E9;ŋ?k1C؅cyg.}+mݧVHp?NiWp 惗3lxar.'#G nu[}f"qn|.k?N˫>w~k?Eg _;T#EG/s >7|?? |W1ds?3r/gp2wy̧?GߌdmMmnb[r_3 Jd‹?ashq2[_=X~r~zF5#]81<ꎏ8NzqZ։b9GDF.9%ca 3 D 2D;>qaPFP#T]{z' ]^FDuA|҉ ? PCYDB/}:=YjIDATAza:~80dHDN \ ċBTX'DN3ċ"\b|_G.pkCAz(7+pc$~^c@&z}e:C"T.%'W~B;JM(+ 8DND"FL\UNr"#@9>4J^k/35QLECƄNo'Psod2Q& Hd8n+T=D!%1+]CnD%QD~DZ%B D2@ˈ  <"lj pZl7 %r{Z$r=ݐ ю"LE"pb!q!va0X2]#r#"ÏC^a<\'E Mp(|# 4K&C|?2m_rZTrOXW#&2bN_[ FDZ%a5PN PAA@hk_G GxxaH=8:F;.*c<;ɑNkMjЎ"tAH"=;+@ 3' $'DNh=$ =b'&5로OqDKh(N- 7$ ˋpDC[D8tXxڃ8wk1ЋRpE=WD0!0 _ pLdԾr0&$1NrhC"/D.sz rQNb_XEIL&n~&9M8#T;^IJp KƸ·ݓ(7@; ^kb#tb+F{>xGI}`'q4N~u$nc b5 Y7AL=R"c b1z!uР]8>B7ѱ\xI~w]M oK%4WD\ȉ=0Q.xJ#$8'9Fzw"N^LhDu%ڴ\(s!2C+"tIx)rqB ~@xNyD:F9#Hľ(/E^uu<$riIloh$H'P( 4q? I]웨A%5x<%B? <In % B? c Q- VA+'xARxʣ$E/с4!väΎC"7C'k B\?Fwp7 BOto9EH" %!PᆪnQuAIlVB@5bIrRx"cB<%eK52_ {ųʻvz~3GZc \*֏y3境]|E\#ϐS_Hgb[+Et[ x`?eȏ)Y^cM?v:?XRP-w8 չ=#(uAl>l"Ƶ1v^o,">FEn&b{6 XxXďT.ͳg@ C/|M<˿/g3l~w(m퓟MƋ߰^ G[DϞO..ŧ, 9hkyDukM~ij>R]0#TBu\`'@qϳxQ@uYwϺ_:vrkcZY-V~A u.wųNWgWz_LTL_TGϸ"]? |ŷ:S u.홏@b~dA%qmFmFmFm7J)2q@R5ZkRa1tuoR!c:;;1͟_ܷFmFmFmVa3gΐٿ?wu6mbÆ !ykx'9wo}[R;v7^KE4I{z]@FpCA!j]FA 4Ok'IPoi*b-ODj FqeC>hB'-Nq4ƍ՚iJ1D]'h) ȤA1M@hbUFO5!h)Z7= m)[v]sM_jtCJ&y n8D#dJA(2ZЪ1lDcNUb$mmhE2sJ[?M55}T ^busjlF#0[4 >iG(dOZ^ nycH(baX44Y!o"$^4mRc{GX2qk4$j;B@5ECO"VME(O*TKϪỪ9F<5C5Ҵ|V4[% ޑ"nɠiES wZь^WEЪ ЫnƀҍoMt#fWXlr =[퉪_iċT#49J„N!BZNwjԪ'/ZsY;6U,zUg qWy7Uk"'M薌 * BčM|<!.R2 㰲ҺÆ ogii~/k3!EWrJT2" oe9: vsiXl" mufb!;ZS s%"3ns\FoMI[M̚nn.C]Af$5[klw( (u0`wF(X7rf2U:j9Կ!Ŏf&=l6 v{73+\~.<յ3ͦ d )JF܎睘 + /mO(] VQBR{ &]`EvMvv+)&=LmaV2b%f \{jsRFl_(s~s#16;ac]=8*Q6Y^ 9 s>: ː)N:'3tFu6P%GWX0Y@-P#Ů Ӕ<:ru+YYK;kawy#n<{gR)EPҧ, [(yx&f݄EzU簁fmhU3rQob7O ectR%8\twFMg1q- TIFx6n8Hh :X( 5I q7Ρd ݔU7{:³(LY kx!L9H#'02ufj{6/S[C %T. [FhͰqEh^} ^A %ݪLU Jԍ*blˆdvq_SN &]t Ljzi#NqLB֨flz€EL"ӹ@N,TFiy`)b"UJLEG-0*,,O-E&̆"˕c16`5ٍ96+\B- JıMV}Ql$g.F|22KWP$Kju/TM=R<ŵ8ņG?^Z&̆[V.ALvS?J*ǜ\bm;DMO}Cml/9*nKDHST8NE/ HFLf)[2KD4DkSK[D^?_&)8CqL6kqCR3y2A@\'21;CXHV@23̸[1_K_\Ddr,C]ջ)UY{;8⎀]!}nZyd$\z숺ȒI )ӁIU >z?V7٢c2[ْ?Cm NvAɲEeBX}UclqWYHwѷ*v_ V l[.c {9K9gqrSXC]fUto'ٚ&JtO[L dn<=MJ{ 䫚KF}J{J;uumSΐ6RfetfPAh#{Nm>K2K::T XR Fg@)o!Bgs uLP{zҧ͘.(:&izKMlqXLuʌtf9%q芪hCC`A!fjJ`h!۲4HWeXJG>IoC{)La =a [<Ȑ=Hz 2']k3k4,3#B,uq6:&|3 Af@Xru"<ЁljSoYy.lc'{1R;;dÆ ضMgg'aXd0M{wnK+d?v u]wX® 7V3V&w)t vsܱظ BS̩ALX x~63s%b/pr*;yxI*X8rލ2xj3_A:ed5Ô9-1ݛed85hzB 8bY`mvO~;p#Oe.l|=\[YF2C|{e<~dZ- Tg\yļ3Dgw3iq憐w0]ȣm,]>[rʿ2SEgNʻD`Y cέ}Llg)6R kj'%D9эP`c!mÜqކez\~|\2^pvRz0O^Y`zѷD|(v3 fCXd*nˑ2_!&q+},v0JY&3tҳ7{ؑ>•tEL0ك@7$˜}PO\A8"CZg9kbAs 9:, d}[q{R.ָ~ Iel?mm9Zc]MJvOW3x[>n<{9N֯Fk%SE%&V.^uqtfCd쿏~3%n:ɶsrd )]v 'ե U u+&vUORf8U<\˭}L/ag(o`S{^ĶM\88|anTo?̎13F)g>t-|%\S;M.U$8Ef|/{ )=˧soV s07~gٜc%F:Oqp{YC]F_Eg\Ð!z5_̼if%qIirRCSl1;J:\檮Y>ČOa)f62,!·I d]f#Cb8D0z#K5Af&!4`,8J1H~&KظR':cSt2וc9;'yz[?7=A 0H|5c'+!0rK#ҋp,M-}$ñ-iũH vz\KVOw61鼌%ك9EWc, 9G/li 3p'Q~us6Φ&fj9_NƬ@}g.ۯB0n8L5Gnϝף+,A!gM@z17఼&:$O˛"x>,}\~eKå2;.%+U%,/r>?< <;=V&S=\=6Gf'JtgQ䶍tĖi&5;;Aq.ƌ*p(Dp?0=L\!.26q{Nxؿ^>3H/Pȡ;ƻyLw߈"ӽ@k]  xNy YF*CGT{(.`=A풫iݴu1:oal*,@If>%;DFz`jM,SYڊ4b޲ * 3HwzC\|ƾvIn]>wžݘȥnbsX۶mcff3gP*& Cnfrw4jQzzzZj5>Opw{IRYa5k۬u{fVKvi5nݫ/u ͖5 Z׼ipk.Bڲl]+wZA;:l1@J.fͪlbsi^毭ĚͶPIKլmhњWy|+r/|w״zM[˔[3bԺGgkٶi "9~kŚ8j\fKԚk9n^ZlmcsA5l^G;k#} [rUOZhk_׶SDbM5km5iFamNksxfݱr:a 9vE5uk8M_iU{[>c۠^?,4cUEc>}w-[7/Sz^XXNi*M3kG]36_UZˮϭb]>Mj՚tyfMk-.̪a5oh=GH%KsV [H6JtҴObDqѰlaoHӦR$rK)[B$zoA! g6}on0z\a7 YuLlI ^6eSHص-x_;nheMժ_7%ғF뷊FwјB 92k)iOcmU26hQ5?Y'Sf#d}M Fv!LL$T5n%H8ThGMK| \%kxu:4_5yi})DzْtoÒgH0q hhpHhģJ|ɐ3uwIxW4hH3VOtoWhŲhZMd E D#Vl'q%RL)ВV lt$i\O٘l4ūM^;r5FoC48ūamhp\naE45>j.jw[FmƘ 54ASdU$jݰ E-ھ3Hx+hůhqQ /2|Ȋ!6JkrT3-]'㋆o5yK7's1#1ۊْS -Y%k|a759` 7sEmI$'%':Z^1Dϛ߈[ZiͺU^7TC'٨q\V|Jh-x%FʹFmдG n:[1Ś߬-6ǬU7%klmm>a5\$Vhpr/cDB8ۍZ6cE6hٷ[3$|vh4F#R UҚךy >|v#UnrښQ'g F I=;I}Ᶎೖ9ʆm\ÏR7j$Vs@'UijGZ17pWs!J!cF㭢U{ i"aN[xK5:[f]S 0 Yhl&5P 5͜ʏM"#3T$VD6xd,\Zm]K)WKwK\$;K@Ah-p,t!@קX>s:e2x83sY)RyܲOq!W&`vlaHm<ሣ8!:gCME5s¢сXpαR ɖ+Ud)Z%̔Iix+Uϲ$㊒[f$;*YӘg3b)3q@_7lyRLy1)!4.L0cDGO"KN-M2uX\:xe<%u`ɹE*9-p00N=:2DVP5EB4s\e+MQ\YAKcIrʯpdOZ8OxneyҝfxBT;e ۣbt)59Ef<:q&#5vyMYqpL΋9VBIʵ ,Q,x"q &sbqV.Fk|02̹F} G`'Xv0|URmyrd@RZ{"D<&3Tcќ'))㰴T-Ȉ S.#FCdtX87BX`8Ŕs\gdlP>bfDQ_řs)388Č"<48?;#"\)4'9,ʔb E+R[aGk,4EɄ! 8.91iG/⅚)rG<$zDQ`[L<r $s KO3V*Ɯ\#gYayI1xt\U2c&+c,zJ81=Ug(sIq6xДff8zdTs"7>V)9%E(WSTs4/SuƦG)9 +<2p|qǦuQZey4s̊PL(fϓ&fxq4͘sG*,Ԧ8+ T-f^ee9HI3<22Vfl`I(I}GSZ^pQʣca\9nN/qԜ8[g9Esg:8xĩzaJZ.18"K10c:Fx +<2²/1p ?cTJ89;DsST:NcKtU&I#}Y̕넣D*d:&lejOXLQ\G<>\r]nGbHgg=)ʴE[h2V@h0LIj BHL9 {$q|H* m4E#2%$1RiBinˣR(+Bk/$&F36Q똉H 4JαP)CurDN~CcF:y%b3N2T[`@XoQr4Zh 8B1J&hTyJC/caT?g!ZǢh#T3F*2}Rk(9NJ BiX*"2$FBAh ,Ddy+3c #L(q4"9bD@ BućbC(m$v1029rP(C !ƞHbeBH܈HmǘJLjO*LJH"9zO)cu? 1ˆPD E`XqL,q.&(I(7Zk嫖J5O/90Bk#9F,JqE3T#tL$GsDED2Vh>ZKBL, -4a &R5ddKGH݌q!2&ɘPnr$&[nbh1*[rCB!I؋  [HPId$:2D㈸?X"HhıWcHb!&y&nkhCa222X&o[բuL!C~y  "SGFL3h23dߌ;$UR:l" /qZ%Kb\o_5Mc m$%RKIW!;#tx$Bi&y triA2d8Qz"^%P8-9ɡ!Q$z P" Z"@i=&y\#-UR*Ѩ2+$J:o44jI/ڈ}8O6&HD!AC0bVDq C#[BNr ذG:#J{1  $d`K"i$u+HJ8JLj0cB#ћ'c%U+ 11\Z%Qn1DD(M20U]5R5zE`D n3F9XF_H4@IL'j$2E`8b5{ х2@f׫FIԑəInw"j 5!V4#Nkqh3Ɗ6Zcɽp[5c$¢Y] ИZR)t45J"Ho4PFǠ,s/$X,R.iqߠT敯zi1h6h6f3|5}OFmo6h6h6h66h6h6h6~^FmFmFmO 6h6h6h6 @{FmFmFmF?h/h6h6h6h'zmFmFmFm@o6h6h6hmFmFmFm6h6h6h6~^FmFmFmO 6h6h6h6 @{FmFmFmF?0O P(W} 3@k@J f Z*r2Q:&RoJ:MhHD$ (%׆U#U;ňH"Chjvt 3Γ#<@sUt@jE5q 4~E"PDaJ"PY9AR9 HJ֦P12 2(71cSEJB \11uD=/IG!uțe"mB b"̈0Ph Y?+"gVЁM>1Z Dh[y'/#@'5mZ0HK\*qS8u:X*&QlSJ覈vJ̑ 2mY%vsQt-p1c#2:'J[=6hPH\#&!/VMH#PHՉ IFMd*M:VHuTw#(4ɦJ*1#9U#b', [HROtF5lPL0b'SC䝈Z${D&H&(D伈8HauT 9td]Ҏ hrnD`D"U5q3BRlL *t*Ž#pSD$B$"`!c0#0&EB,pr` Œ@ 0"NŤj*EΨP2 &G*7#y1H @6'9>^ZR72Ǝb"àǩSOY|M`D)M M0=U%0Ɂ% /-AK]cI1 #Lıll27 =\z&mL )(+qg! 4OQI%R6 %AG&VIlF -A0|IVdDŒ/-8e+ eM`dkݐ\A$[ר̓F|F^Yh !"Ni6#`h+$XY,eM` BjmxI!v(x>"r@`I^HLAl#DEMlj1:)wI:H0Bk2Fu:؆$6y'FA4ڎBaPy:BS u#M;oZ" ERG8;И:t#)atE$ *le*`r"EǶ1aB)"b7K[I I`t;Q↞ Sڦ#xFHpt(AGH|g1EHS +UGyi"mZFe)钑5AoXAf2qYAKN1B)0ЁER33RP "FI ^YlҭASL@ƏRHIG/Py?,97F"2i")b! 6N!}( :p0OcPt"pS&)|B@EaHnZc`yRr b[ao`0# CduKI* HS"D2!9! $: Иu H#tA:{=)'eD籤OV.8H Pil%&@%kPD $`%[T@.7  U S72:A*#̈́W5l|i#U8!Ja1% Lv ܎e꤆3bj:t-  -tTa^XWRt@1Zj"aibg'uTHd T"q* A#iTl`hMMz\/-IIД"Bb!4B%MC+ g 6P @.]$SFKM^ר|QYj))Tcjv(DiĆPјD;:44v(eXQLo%V~!OaT"cEH(L^ p\N6V ID|JyRV[ ߷@җ =o_V?2W8weuT_wΑ/2x)=O s{G9T=-G{"fÇ~>WO̒\<߯{X ;NI>뽃睘侫 R:J}_f|θhR*du{5n(_i6+~p_H񛯢㭟e|G0\k>k_&kbv'wq lg۳~lq04];-|[ywWq{^槾;?MA5O7`nbϽ=}Q7;ă;ft3}|_ 76ȹ=,>X|#Q/$[շXz#/z;,mO>KCdV&v*uoKN{w?r/{p/]y 2<=^fd{Ή#LkMf^u4oy*|p=|֫菋 ]XtjsO\ýov-ӗxGė ĝ'n&y` wYoe 'x۷93wx7yT& V9HiK0]g8mX`t;+`ާ0v^9gt^^moál}KN'xjLWsj/ȻWne o" bċ}\bt ;C2fp__q8,~d+v_Iyp]U~A~L>/O<;+xǰ + N >Rx=5v揣PO\<;~a=Ƈo2u&W~2`;gpݿy7prwY&VD%p)zss#xm;?'~x\^˭_K_s*߃-r]eUv wg(5·_l?poAn&op|-=o4#7sʽZf7at{?P|p;=>m.?g<8U</ pN^4o67spؒ=sOLqJn})?QF?y&Ńl|tK|8=w?G1޺Ϙs96} ol8_r +r߻79}ܓ#zN}=F~z_a͋w ^'𑫟MxٶXwSxb̾E<y$%-Nsȼi3?>-vg=ȍ |A޶)8!,Gҩ :eq{ rg8uG;9#z~4[J[SJc77'Mw}'nTMQ=_fo?§m[=g7oRB#_ {y<=-Zݭh㋔y6W\r~ >0\mϴ9To>gҤ "d1O>>~nc)tCT~/PX,01}'cx'glϓX?Oܷoob~Qp[)bj;ϑɑVNyҽ$\o;/I]؈>?ltZ|a[ kw]Cru _p_dsb{WflOs5S\59N~8Hc,ˉ1?ƒf(Cdyp3?x㥫H{δO_}'N.o b~_y8_c^KW]fwpӼ.~ \t|Ϝ#~''Q mkM$W/*չ;fp;ЏqK8Ə\~)}3IDҰSh]2r\'LuhӲqU1.U- x"W1QOPs n'p]Z},.]cb7{9rDb- K~{a5]~b'fUmӪE\i-ʖWoь==٣wj&QvmO=: ![k6vQw&.ѢbW|KMK*}kS": Ojj~Ee6˄mg|f4 Zgt& ޲zM<^#vܨ1<:J#LG)73F{YY^G]&m@b7P*}b-h|\]SU1p.E4ԦC|T 00~܄EzK[ؙILS1Z{U&vLj]AfhDPF>näszeApQlbS&RG%0QkF.^kTi JfkN%W1Zmf #jWfeŴ;}R@e:MŬaXpK&NTi[0:j7(u8xb NG/ccz.͎ ʖQ 7إ1z-ڦձp nJj4;S2iDiK-tjIw٧bUn)܃Xr*^fDI!B>˶fuǷm.VM#pOԦMQ,|k.KݎA\n}zQNgxt&f@ЅV#LMӧaxRvR2SXijMqK6@fN۴iw.β`XV3qD+1}Agd(W[-^DK11[.NCFlTz>mͤЋP:1F,flۧЯУE:>פӯfjbC^]"QUvt,l⧫ęeJwOo%-t>KPmaw&a7?^Ig16mOЪduLKؠ1([Mìt&~Kߪ7|LJ4MVLV^-.V!VAM9/M\BdžH!mW2LKw f_=ç6p }0: UaMv 5x.v!M׵~MU*>aCp1^:t;&t&Qr=RwsHPg,V#.`t*]rLmkb6lc>G?v mVrgIsi2%ߠٳX" DObyU 켏/ӱ:4>L_¬xepAGv}zb: iVݠ7&V:55vcB]ªimTD?elz8Fl;d36BcڮOjb)/d,6 v ˬ %\@O$tm*FRu^c46~P1Tv6C_il`5 we[:Vb62~ǜ9n 0KE[dMfݦaMU,E8IE$j=ʚIۤH-n˥vB}ltZߣ0D-բU0"V'0&Ys3ߢ+DJAïg'c4N̄`Tp=J^FhfD 5]!WԻ1`4\RAHج/'zE 3Ww1Nl4.ZMq=VߡQ*\6nk`LѴY^ [ƲCU[=qM~ 1F)=qkΒa1ZpmN$TrA;1S+:>Q#Af4mlo0P}Lϋ GYm,6DvIMz-t5N8caIwX2"lP۸6f7ZtBl5+CY!LOk7jci &2e^EoPtAbURBhvؖFg`U|B߱ |V +1]AtpEV>[{w韛RX=$+IG0າו.?|"(1 9+eU֧Ea$0 F<{W'k5bז!)/IW.~ׇ 3$FV箭oFYHݏ<#^jyQ֑(XJ\O)Ҡ.:_[v崶ԏN>Q2P>hCkb;#}s4#?WYN?^aʺ>*sdʺvY-7BmxZz+WV3ʗVjNk˲Vyj>ϬϏfLYs}ừOc#zq8fꨡQ֎B(ke/7(>\=Rb^ b0+bm;;kh3WAW qL#zcXַәLzJ*aʨu0T gǬ[I|PIkjSF^]dFFts@eabuTFJ^3URĊ %NL)CimGmuXF{83:2N%XoJ˯2!qD"H$D"<8}(HRx@:&(Bq(zGǤ76D"H$D"HEwy'ַHR\|Ũ9s:gi4ܹE8c%Z9 yOb!1qv0tlEr2D$ʊJD<89#HD8@ĨI @a+້R++s'`uV'b"'''YQ}8$/"ű zV|O2' J'׉4(jޣX%+q<8^D+% ^-|OHaʼnU" JoY$A:ex'+DD@VzOĠi ep2l X]Aޔ|+m V'njdD2RVI\WM$rr!:J8B,PDİClʔqipMa'Uj?qV_$$;0MҩbJ#v$yX;{ת E)IվeUOwt6ux~Jc҂c̯a?cHjցWūɂኼ'6Jd.r2lPF.]1SJ Ve/l;V|gd; eEV‘JwV]((Ԙ={U,jvb뮻7rwbʜPtVƧ ?Q)~ (mj WA\豬c9'sl B,)1bA4Yҕ"Y/ 봋)\b!A=~w9G8aooU5(hcGZr!+NXQgg` fNDΘFʋ(N.c^'κdS=Zt+ìşC7@_䬈89g.]eRXN>8iDgP(4;x* _U2mBIMmg0zOqt&1&(..&q#&=SaYl,''S*.ޔ,,6Ʋ :&zy9OfTb);,5,ȄV2lh:D-L 45o3)eq|δOr2 C,dHe 0ENVk9!Ԁ @lR1 'E+'mQ]ڏN3^(|G)%im~TĤڤ=`}R Ŗ):$%62o6)/ʐd7hiXQҌ6F|KDz#c; QAVeq%!uBنO{\c`5bO'Isdk;994S̵\g G=ZA(yũ)2}RB(vt&vE7w"̉Iӥ͓,z8voU+٣bbAND{ z.˅I6(y`u}A$FXY3c9&X1f4ZH73l-C}fE!J+MbQfBTeX5FO[ַaY(&PabMw \C+/mph+z"ě#Bw$쐎B(bƣY̍nF!UM0A!MԦ9"RN9趂L=4ڼ@fb1mY,nIayLzoB;gWNSL7L}tK5dܐL'Em:EV1)!cI2nU!YdMA0/ҵvKጅIj$]yf Q<}b7"OwR+hEZ >Y/25ONj33E&*fT+X^:әjH[L`v6=4fLc.ͱ4qO0m5G? ԭ5zZ)LbKI嘤MlgYp2?GoLmsvu |rvF.r!ZڦMymRvkg)I1ACq<0OͶ`MNOSi&i8C ֌ˤGD1=65Muӟ&̄)8˅ r8oݖSɁ-#FG!pQAhM"n&"73A)y)(428ìgq)XP/t9NNydfV,LfPi8ƙoDW 3*6٢O0ٷQ55g( i<: e1Mpt[W5 x.Q<!! ]wW(&ȶ5)CR!"Z\?"K?G.N9{Ѓt kgt66s*U~My2O:͛ٽ{7b7i7?W_a=<`d2lf׮]d29HnDan( )d!{ #lл.~܀Wf۽=OWƯl`cӡ?(YτmcL r0>˞Lm2˖aXQB9 [MЁ6(F6ŧj4\s(O>޹9o8]Bs<7?u?{>vwH+KQkN1;}3uxt$cm5_I\#[ɣ{51&8f?ggqC,'w=?ѡ[H\T6\]ÉhAmc ڃ(w_>C݊8T.^{,)&a+s%{j>k9pB7s]<ǩF<6img5z|r闘hmh=FԜ`q ɳs3ıip~'Aoqοfg:ybL/Rէ) ߽|=M7%1wӗn }jTмʹA0a|by>KMr<#shJ$e vSO&i)N_SL/jҙRT axd<_=E#jM2( d%(ێ}X.LlgS)lnᡋp ܟ+k+g3pR qe쐊BnORE,eYT71exd#1_>.6#yzb+UmE?KwV>څ UOPyzٻŒ+y`\?IN0=OA\x?^Ɏ> nJʦR+R~jL`空[ȕ-&E3wk9z2sT6=D'䈶C3lxŦc?Az$2TndXxVejXEΕ cmYV6rǙA*;I~9uc;XMW"LE4|>ff!8[s{:0/;d\S[٬d^-q{% Q6)M䱺s0g6C'XLeyvS[iG'rCϲx _WUpwp7.-{)L/y{ d۞>u~'slNRq"vҰxn7sŤNpU l_x1ɾu.zKet|3~nKp)|)Cf2[xo' H^a}% țYsޠպղVd幣e`%a6ky]a_\>Vʳ>.#hܷT|P>YSj\5u=ZwF?#.\ķUFa g~뚘b]= e)r1[bǒVZ]Y[UwdIڑQ9a>VP)#:mؕ-##ⰕeENHvU#ec}Wh泤^ף:Vè~XVuvyf2^ `]>վ.g겑4Ҷ$Ⱥg2v*kSFӺHƞgBg:pI{t3l$=e錖 Wu]Yh;i1ZN veXIz(k5ʪ)#Lsau$?ʪWU\.KU1KCUBr;20ct*eYPK:Y]#2QβIˡɅZAцCөiSh*!'^v"M"h5g*M:hi*fS.RJ9b,vk!K.f O)NM֨ZIj ]PTN6Eݦ9Q+Jc,H]uheѨI=@\RovS]2A瑭{- aV}\}YDA{5ze^}U'Ujn^AY9nTE ˉ9Q镉ǻu8S8: Ne-N sȱɘY=% :'ܘvpZotP'8X2P2SSiZREUh6fKQ6+i3V,;eqFFcE`t'iX%0EY4ua(wkjDӛa٪spգ9xez2NqIyƪixJsҲZa(GiZ=2v(jJMw*,u2QS-Q/ T-"Cshʜ*]բ,Q77mzeR7)J̱ܯQpZԚӥ߫aK ^kYg٥m.ukѥWbrUAu:U.1/v|~m^ Rd:T)̔G?s,԰jjCV_2YT;5ʢۦكtcrT˥Xǭ@ kQ(4S_&'H|2jG]p*[mϦ jjԡ٪pߦQ9ii[: b?ۏX[.]V06nH)iV[deN&ed-zaW84h~'n4.K.j4:Mc~Jۢ]s0iPʘv;A'uͲۡi.ѯE,Zxz0r8%&TIEDrPū%X*aS bE-acVIe eUq8ERqk6hmQ8*K~L(0~yjI+XD'9 qMf?]ƈzV^<{A/DWdRvLZ>+5ZipY X]ur| hU957= Vդ121K=ec4V$j}@ЌjӢZ$EX*FI#S&TNhK=aqq2*)wkNv,+=4]_bҬ31HgN6i6;ORnwp]QS8ZwY6hTz,:8Jghˈf+-&h \/%TJ> fLQOjT81yAK,R1+,K؎AAtڧ8fX[=Lqnn> W(PlTQŭhT& c]jK1[q<]61fKX/nE=~EmX&6в*,wZR.QFX]*2f^$-L{Z;E}EN%V1}:MZJ-b\+&IaWG҉e"QMŲzUqKY,Ku˴3=*f5h>'Jۦ7hJ}I:P4M8YjxգeJ:vu+,:ݚYnҫaObVh%FoQ؇,5INDdaU:>tbR];ISb 0Ot9Rs7MJN#-U']:"5KƮX&Grn$DGꇔ ݦAM!L]*K&Fc'i*Z{ =b)yk/v*4Ktj6#ɺI5iiJhG[}*KVzܢ8QUNUOP;tM~0)rvNٜ$S)s٣Z 0h`{2Fn)NjILjJ~=o#"TJǦfjkwh,^lŴZ]XǠ]8j[*5S؋uZ>ZJ'ӥf0:yaK\霠^76k\X]2fZ/OQ8m1 ,5j,,̮nzTEcvj&TENnLC뙜4'h9u:sTS45NXmK]HߠWi'h)%NyUDԺ-GG`wN"eҦCӶʤDpQsoSoVIՒ0h{Y5cRZNA`-0j&nD7Ie Ic>֥ڨZ1|yz$UOk]"KNjGnC֡/1α*.mգڬZt [}2C^ߙ!ro.7>BLWxs{]2An5ͲQ8哔 ZǮ.b4|N):[uUщ(ZSxJ]k1 Z2Ҥi4L]UrۥhVcf)q kT.m6eNGgn@_Uzn;6Ezu!hZ355LNuS 񽘾";!=NTpQ5&"D,/ JqHC>NXdS)i&P^fY?FȸQ:WT4#z0 ($**F: L86̩#8A5cR 4'e@ϚaAG#X!y9W5) JiR*!j1*xEi -@&@Ȧzh+,)78/D"0 )7 JL:e`F16 %@}Rqi]"+gyٔPBrOST5C,BGB,w5SBR^DDBAP5rCF7l7)|MPP{jBGwWb )ԓFM9V Ii6AAJx8&:= 7(Bs]t?&u:LE+xA N?BKtL =ehi2Dg t=zk(L(IOغ>g PlS)z6 PQ4KdI* Y t{,R cD888:Rq3 B&a | cp/D% t"-T# PT0F !?S8&,|T_Ȥ0n(hKPW観z88d+ >㶃D@@ b@U'k 쌂 bܳuAgI"PpU#Hk}3>t ]xġFހ~:5".P"R(O* i /4"莂IJBE{p jL6fҀ+`jYz=|UUR &ydR"|](!!*a:BP!"rOPQD-]i "eM\"-"DNpE MuÈN6hm0A+]{W43A  ":"x@**>818E; "J6r67 z#X'VbBTRD>)`k(!]=XdA "%)|D&vBwC@.U$cHE""(&bfW  {U:=[M!A^1wQZB*@|G*i?o L=xB/P4~F@E1.P x="&P2~;"p )?BQB~B:uA;U@>yHQ-+([D rHG#pp18 u( T8Ɇ.d\ttz8(haI|0Fl8 J0R]Hwsd&57OÏ˦xX1w%C>z zag㼚rHp/@O 5%։ 8D^0 8ԈBY/(J8Q4' "Q/pY,|BE!;h>Ac98$4"Eu\@ P[.()T% DB!H Q@Q}_Y6ӐQ"A_ds]O eӨ;~f +J:Jkn7J( BTQH?58C7eAzHPB'H(JXdG*P<[(Ӽ~LfںVnqE211/ِH$D"(%>wO;ΎD"yNqH$D"H$D" tD"H$D"H.H$D"H$Y4%D"H$D"9 D"H$D"H$g@H$D"H$,@D"H$D"H]"H$D"YOįv&$ iK$D"H$#Ld&o_H$ګD"H$l"x߾ِH$C D"H$D"H$g@H$D"H$,@D"H$D"H]"H$D"H$iK$D"H$Dr tD"H$D"H.H$D"H$Y4%D"H$D"9 D"H$D"H$g@H$D"H$,@D"H$D"H]"H$D"H$iK$D"H$DrCp]8_I$D"H$D]x4=Nt0 ηD"H$D"H$uaHX D"H$4硪*q1EBaH*z)H$ tD"H^!F9:)B!dTD"H^CH]"H$ T8QUuhk64u]ƹD"H$1tD"H^gL"H$kiK$D"H$Dr tD"H$D"H.H$D"H$Y4%D"H$D"9 xݞ!axYPM4m<F/5\%@Ua ^FeE"H$D"yy]Lm0 (;6fen,TL&(v^BaibY"_( ccc텚R)&&&^y$D"H$/=ɫ!ċ^3 yƾ+'Ӿsq8fΝRI?~(رc0V#u]k S4YXX ɼ,m4TU"۷oYEǎ#罒!iCI jEQ( qBg6EIL"e^"H$Ƿ !<8uۮ};8ȑ#S(s(}0DuEYs0 j;v>><ɧ뺸KP} @UF/\.qvq2]t\nx}qqt:8r9.H$D#ioy[ؿu}7TiU0 FQ[oofϞ=i4>s=ʎ;IRA@:\.sm?:L'1"0.%hF'Q (;aL+m=)g _T$'uW]uQ <"Z aF^)L嗫/B Dy4?}Gp x7g{da_?lTG>+ᓟ$O>$b믿kf(ߺDֿtJ3Z3y$ecnnnxcp->,vA099ɍ7ȦMyL^`IqJx衇w]k`Yg PUur!JqqFؾ};o|/1יI D"H$u@~o梋."RT\zl޼o4y[J:s۶mc<UW]|_Du9v\s RTg>~vIӡnsmvKCUU?αcǸE]w=oqFQロbo}[IeY<|_fbb|>)g'4Mz!LDݻ9sNs}M&o'Ns7OrAah$'N NsUWq}ƨ\*e)JU|t:|IwsAZ7peLʞP.~W!mO|뮻VE> _KKK۷0 ygxz+^]׹kx9u-oy rxvɱc׾Fx㍧[7f|<\ve?#7pNb˖-L4M&''ȱcǸشi?0{n .`Æ w};vǏn9~8o|IyZ0xx|ߤhEwG*"J/~ݻwկ~|3\x޽7M\z饧g$?o}[\s5;vm۶qO}yL{VOo||>5_{ |e۶m\qqL<*'>>;4Z8y衇}j߾}\r%~͛iq֭[袋˹; LüM7_v{;vzgy9r{aӦMH$D"< zǜ\|}zE<#Nsc V͛O>'c6lzǏ'ϓJ+e8éSXXXrE`5S&8a055͛errY|'c6nЈH'u] ͒U$EQk`nn5h;ayd.bqgX,2;;Kߧ^fQU4'v܉ik^p3;;K.q#O|{Y'B l޼嗼|$+zl۶mw˲m[gϞBt]IGOXoH 7&4Gaƍ8eYl߾ slvz<&*7?A\[jBp4'N ϳe[oeǎú4 ]4 uBL$BA. p'e#ٵkǸx衇XXXsGѣ>Ά HR=z׻fLLLpeq9'qtD"H$WnӒIV4Mcll EQ8C6%N@Rv2%nR!Qq=J:ϓd, uW}=C44A KVځT&aiiij2qs 8f:0 0 ˑdpT*ƅ u]t]'NW;} r?8q/us!6o޼H=u7otȉ(NGuR^) DQ4ѽ說<!zT*9jiUk󆧥GQ4BXE*: !8q7n|^r1zd2|'"4%mL&C>QUU)UUG>5\Þ={CwuMKn! Cشi @E,--*w~Qa$yǎc~~~RBA\n͉/%qWo?I^2?+މqc2 >ر|3DJ$D"H^E4zwT1|`we~O; 14Mz$t/u&-b0NsqHV /7I<0^GeE"H$D"yyw\X_/R//WjM"H$D"y%y}mN^erz),+Q %D"H$dLD"H$D"HθjVBO|x-z*+Qֳ>φo>|s6>'N,4McӦMyN< SV`ƍ/Hvh6mn:|1jj5a˖-:~;X'wyyF1;wi$jzߧ\.@*:-=ɓLMM1==77ݻn5/U$D"H^8×%Jy{y{__BiǏ8z(袋N`o|<3~nn{7?l۶\.~v֭[ Ð??OO?#x.sssLOO311AZ`6PfJ^T*e\QNis9,//cRrLǜ  C.{wͻ.6m"^l6]D"H$wqGy{Vر0 h> m|SX,N9~87o~YVs4:3?3o,^aȏO|o4}0 qk_eO\yʯ gqq??daaNî]8pȶm=4l# '?I>sr>/M.i!KKK|#\.yz!>__󖷼}chF*~/ ؼy3ks!vśfq۶ݻ /|O~."_җu.[ncyy`yycǎя~y."2 lMU?i=\ yt::t{([ɟIyȜD"H$kģV%\?ߧRz8ۋRl صk۷o/5ž={X,bYQlٲ(HVT*Y/ Ul6K*`tEQq~W CnFo^{-AbI;0[oeoaWٷon y3F>33C|ӟRpWw<|yC /.{[o0]vAO}ۿ%DQC9G>__sa[[y6l%݋mۼyy{~s=^|0*0wa033OO a_N.ggMۿ[w3??V8H$D"e@fýszX$".BN:-B.Z/uե]vo>G( ^x!c?c}cllVŦMG>4[lTIzEIlڴ\.8s97qơ|!|gϞ=w}4 &''i&sdI$D"!qs5װc("Ͳw^a|/Pe2,ફX,b&{aӦME.B0.#ͲuVw155ylٲK/|>a<3z=wrM7177G5\C>g׮]l۶]ٹs' d2.R(K.[q3==-[TUu]TUEӴa\y̐ݻ?M6q^K:'~'ؽ{Y+]q+{ _\zLNNE~K/~/hqt]_pW333æMؽ{7W\q-fÆ xƍBo>6n܈[n.'Ob6\p6l_"7t7x#Qa6L۶fm\veCg?|`pV޽{9s+UUٸq#W_}5tJ'!9Dn7/&''< 2 7n ox{.LOO?l޼YD"H$k0ԒP}T*u.p'j*bqrXK[']4 (kjEQa>>Q7YuN4$Ѱ]g<)ߣy~kNNʝ>i9z|rb8ì{eBtRIhTo}ݮ۶G?]wo{ENj0 tQ\ѓGOz+z^_IM>)H$D"93B*̽t]RSSSk=<{E'zbGl[=iCWpM~n&S>9<10n`˖-CyHަ$7D"H$k0MN}izǔe_$m/*۶45B*q/:R_ ˣR_cY"嚚hq]וwoD"H$ɖ W! }Q+zl6KPxݬT%N;~ZJTU)kET*~.BLĶ$D"H$O:<>L.}|IN816h6J%&'' Qԟ(T*:D&!͞F1l6ygp]I: zIc8z(7o~.FBJ$|>OZ-&&&PUu檪d8pGRd4Cz=qt:LOO( i'}zN/u`&B%3~(y0 xyGuߏxXF{-[Hyr9jO=Xsmnxm\}^YBm2QqN1Mt:}׿Ne~~nD"H$nKEg_%Sܿ~!}Y4MT*/}JÇٳgG9qB?N\gjj i?~ /zgy/| o%ɬ1qq|AZwP4;'Nկ~ 6EԧxGxӛD\{ȑ#\z<#|#aƍl۶ G}w ,A$@S")Y*erOd'Mvdמ=gOr~39ɦl2ؖ=ʲ$K2(HN`A(, @>đcH1^sŽy~v^~e4 * ^:?OvB*hjjbppzb1Ѽ l6ܹCii) ijjb``z j'Op8H$IIIAm<8N~?fH;jLLL`Zx]F^^LLLp)ioo!VVVn._̡Cd t$ DDDpN:šC8l64 wdGvfgg̃2T 999F\\hZسg111@]]w裂Iz=rmR)[lA&сV%55xn޼@$# JDRYY8>5v;gFmm-޽  %%J&''dR\\$$$$D?fnnzgrr@3g0??ϙ3gHKKPT( b }6yyy 333upeqn0r155E~~>lݺvIqq1Zq;ƅ 8z( \tgy"III8dmm'O *%%%,//,7JEvvוj5LOOsU^/2 .Ioo/ ٳTVVohkk#** Z͵kHNNKgg'oXV}6FAֆZԩS,,,ֆ^oopzWWJ}LKK o&"fyWRUU%^_NMM J{ $%%+077 nI, \r ۉVHDvv6je_Ur9X,Ξ=8V9J477>DFF211A__V1‡6a„ &Lo@Srݻwzپ};CCC۬ F#G`jj*^ux<džuZZZصk'W"0O>HG}Ve۶mw!s8~81119sXc hFFANNo===ܺutv`q-v;=GO,&Jihh`aa˅J|GNgg'^/v0$""g}bRSSy癛cuuGGG۶m;QQQx^z=O>$qqqEkk+񔔔m6p݈b_?B"m6233ٿୗJ $==Fb1N222pĐ&;;#Jٻw/cmmaa„ &L0_[>@gqqQxi4)//h4RdΝ x#)**BRݍD"!77K/DYYPoR__ہΐ|{aayh233|,..2?? NN<N'~Z-]]] 1;;0k׮;sNb1؈"%%%ANMM o&;v@*E||$''@ \.PXdb~~^8d$$$ׇdugg'#Q(b|> ł!-- NٱcMMM42M7w&%%gb0B#'11/ejj8&''jnjS0 g&L0a„>UOkk+:cǎASS ~d4 mmm}vFFFGyDرC0V+-qtJ0$##3wX'b \=999 |WA__x^RSSٳgUUU$&&{nv;Faa!۷oLoߎdb=BAII ^8@~~>---XV~?yn7NTJyy9@>OUUttt޽{囒#Ɉ'..LFJJ TVV2;;VIKKCVp8dSTT: <,--1;;^'11Oػ%8ؠ 'T*)--E"`Xhmm%99cǎP(DtFCDDCCC$$$PTTFh4L&ӹ)P z0$22RSSYXX`hhHVVCCCDFFRTTDRRP )++#>>>F#:Tj5FQ H/==b`0멬On-q|366*iii$$$TTT '))"! -- ٌdT…Q*T*l8 ]v122"vN8`111t:^/,,,w^lݺ4҄0 4 رHDww7 sI&PW &L0a]dwH$f@džښ l6"""Fdd p8\v9w[*_}v`0(?RrqmVWW(..&//?fVWWq_x &L0a„ U\.rVIauC1 H}^ H$$_:mD"J%J P?CW< BB1ȿRL666F+jކ &L0a„)']񰰰@;z\*E7;·zU־t*q]?,{~$a%a„ &L0<^}+ӿ6oZ,Y/$xg-O>oSD8;o[{>+&L0ayO>==MWWNV |\zm||F\.rqqq8N:::X]]E111A{{;nt:ccc!JQ,6N/jY^^Shq!lh!㡷h^/---qX,LLL'|sss/TBAtt=X,tuup8:qqqՅH$"&&fS?)C`PvX,}6wgqՌZhZR)&^!#bWWLNNT* "צ&L&6$lׯ_r=0u џyfqylr_^yϭ[P*,--}] ၌owgqu\.HOOO(K'}'w$j|B6J磹Qfgggeea4Lttt0>>A!^ %%JEoo/3pсnGP]]իWٺuASWWG||< 3}3==}WhC9Ƅ=l6|LGGt:AmX,'?!&&F`6E$Ȉ=<׮]# XXXj[oIss3L&1L&vF&m2 JEffk̚gxxX8HJ 233D"ҥK Fe``E!Q 㴷gϞM4A,,,v| |=Z8BT҂f# o wV)H$f}},ccc ˱ZLOO %GGGx<#&&8V+(J@E,܌bʕ+hZƸ|2봴PPPlfzz۷oFCCp977ǵkװZܹjrQ\­[l /ҒP~/&&:vލL&cff^xhVWWA'2D"=?D\. T*eddOtt4nx+++B i^/v!b1nD.D"T*KKKbX~:j̥KzܹsK/R䣏>"773g055Ess3ʻヒ餻 | Ǐ:v;4}eeehZٱcǧ &L0a<>V~~>LMM!!// ?q:,//333Cyn߾ٟ͟@.P(h4V[YYIUUgΜa~~s X,'399墴'Np )))ccc$N"11qD8N^yQ$ř3gضmqqq\~YӉfvv^f3{GGGN####N&'O$77\*V>Jb|||p:tvvr rssQx^q8|s̹s0t:, LMMsqebccw222q?裏HNNf߾}LNN͛7ygX]]pǍ7HJJ}{qa=J0dvver9j\.GrUv!̫??䭷ɟ o>?"Hx Q\\Lff&ODvv6waݬ >CDD줡XƑ#GattXL0dCMM III'L&☞ ~q5D".\ --k׮$%%q!癙ի=z5v;SSS|Fjjj}//\.kV,Xfl6?֭[#)//СClzaC <3ގB* „ &L0_o>UGP(8t'N`eeGy1z-^/( ybϞ=ttt!OPaa!ˬ011X,ĠyXLKK &zswsy UUUXmHΝgwRX__;[tttP__^jp8ϊD"jjjX]]ȑ#lll JHOH$ѣGYYY!..z+W W^d2#SOQRRBff&O?46 M0m۶o}|>FGVqݬىN2=#X,}YVWWY]]l6 |Z-\|||ǎ;. ?Yt:t: vz{{yꩧ8q:Do0uuuBE1:::8~8Ǐ'::zSJ%,.."T5z{{mdgggFFF(,,'??Lƾ}x癙>ęF"w^=JTTwQ*XMȑ#dffxX__gppKNN{edd)D"@ >FsbbbرcNx<ܹs;wj7ޠSXKCCCx^ >oӧO룻)~ZZ?imm~j)((-[D"!99-[th4{9Cgg'ftO˷mR)KKK~FGGQT|'//ߏJdggd2t:b߾}LOO388H0p`xgHNNs%سgN˵izD"$ 2LP^rd2'>3 cxxwyGr=L0a„ ϧL&&&&$''k.4 ۶m$`ii)zo|l  22۷羷o楗^ T444P\\066baffYoh~7>>n'==ef3SSS,,,0??" BAZZLLL@__333\t{[zvMM +++ J*ռ۔Ann.LOO ;w$=={<`DT*E"P(/SsRRô`OD" &eR hZ9vCcs?)((@,t:Q(ر+!ڵ lmۆFa޽H$Z[[j3Z`0H? 033#J`0HDDwfmmVz=---rP(d2znn.Z {1bhh}Ϛںu+FQ1Lzr9$|>`ȍ`0GP( $I8g@.#1p:[`\$0$&&@zz:< B>~JJJzl6F#eeeXV666󑟟H$κ:7 {ؽ{72==M  22򞄂KKK͑KDD L&bsӉf^E sbb1bߏ'!!NKK Ab1r!?@dd0t:F#?~T!ڵkzY\\$))rV+ HRvƆW.ͥWRJ1 ¸`~?mmm099)F &L0a|j z(ɚhىJĉ a__ 76͌sNo.ĵVUU)0k.śbЧ|nb1iiiCwb"z`0(_TnG*Lzz(HIIaǎTTT.\vy'ͥ"(//gff\.ȉH8|0YYYtwwT*ErDT*)++C.3::ʡCd``yqrss-OP*N#**T)++ciiYN'"..dt:pb ,--o>VVVX, ;=$x<AmۆD"axx*njB!L9L&pPZZ*$dbbb0ͤRTT$:"\FKRb].]]]paj..d2dvv%RSS)--x ڹAoo/8pLbbb$55rrrdl \0qqq h4DDD.wwǠKREV\.'%%NGII r,v"%%EX"-xC{uEEZq04rݎN͆fh4p8!99`0(wf۶mש bill$77XLGGZǏc0t m6JJJhhh`~~ݻw JaFFFزe {z)//lR)TTT?OLL={sOETJRRJhD.Jll,DGG366=@0|-ʰ.&Jn0 "|>;*_/HN`Ph×iArssIII **s!:o?"!!B_giJͻ`0Hqq1q&L0a~W;' b$^KI,:na|R3_`?/~23)a]J($(u_a„ MSfYZZ"..`0HGGƢT*YZZΝ;,,,ejܹ2 0z"22RH~twyC}bֻ_̇hoogmmxN'wauuVWWiooghhHhjNKK jK}}=#655z^$J"-..D"all6 j:;;MOO܌f#!!EԄCnic566(ɟygXX]]%**7o {ƍX,!&, ͘fZ- ipzd2qi7UBRݣ2 \pF<ΝC*r%Cuu5 266&w||Vd2111E__DFFM7}ofhhՊ``aa;wp8HHH… B`^VVVjs^8  B$&&nk766x3W1pݼ3OCAߏVX]]ԩSLOO{zz&"fZ[[==fnn?tT*T*fggsPbseeeM0!W~r磭 D||<2!:;;3=4/innfvvVxw"""=B$i3}}}R^a6556L0a|q>OO5ЧYXXA&&&hhh`cc68y$nJF_F,DDD* ACCsssT*N>Mdd$ׯ_g֭BЋ 333tuu155Eiigˬ577˗j(JimmeXVl\vJFFF8ut/[npoK\\P'? oHR===,..Ѐ!22'OP(~:L&N:^'##nl6SUUɓ'vlﱱ1ƄƽT*V VVVP("66.^xRSSQTB=pV{_'_wCCCLOOW^yExY/((`mme}]rrr}6LMM177Gff&VDMM F&m2ggg룵X233H_Ce֜N'DDD0>>,o&qqq\tBN>$ji755Q]]ͱcXYYl6cZeaaALOOV\ߏdb||ښP]`Xp J/ӉNd\.:;;fQYY###B򪮮.Q(JfggpEܹCZZT@0??* twwooq:FN']]]3===tttT*m@7~VWWY\\˘L&l6ccc Dtt4 r5ۉ &''H$)))H$0L!JҥKP(qN'~f3466FSS;wrT*u333Ù3gX,l߾]K ,.."ɘ`xxj=BeZ-VWWᥗ^bppD* 0B:N.B}Y\\*_p8 ++ !? %+{zzz===LNN`ttɄH$bhhUbccebb4ͦ \|H<rbccl8666AHKK ϟGRqrrrx嗑H$ܸq,.\ Iuu5>(j~i 77W \.NK600@BB6 ^{5t:^MQضm `V+lll yw^|=w'Hd2ꈉ̙3bΞ=K Al0~_p8$""Ǎ7z kmtt/ITT2)n7TWW#ɨ`LIDAT~Bf~~k׮Bkk+ T*}]d27o$66ӧO#hii!;;=gކ n.\@[[Z VVVjr-;Kmm-)))jq8PSSCdd$W\a۶m;rX[[#11ZT*?._hիG0%% 0DGG 8EEEpi ~(J\륵`0ȅ Liii4773<Ç~HNNsssLNN@VV*"LFvv6999 Gii)DEEDAAcccz&77+Wj$&&v/2(J.\>X,&>>/R^^Nuu5vׯc68NY[[ڵk,//VƍBuHDzz:-xo *ӧOhfa||W9}4*O ||8??Onn0&NӧOc4%**J~6),v;rh4L&o GJy'x ''(<fq˅)J~QSSC `bb_+)FGGMJJ vy裏P*Fww7=ܼyEzz:=.]\0'hd˖-a=L0a">5Hĝ;w[5\."Ho]]h4=͛7z*@Hng``;vs$ ?<<38p5n7BwT3,۷o'99R| bbb~:v|LMMaZIKKc\.zO 矧ҫ Y[[*nRRRַ%xҬV+SVVZf˖-߿!q٭Jz-vMVVTTT֭[)**"''2233)..ĉ s'ikkc׮]8qB(#$UIKK#//8!333LOOLyy9)))B8@rr2wrl6 -y65p%d2~ETT>|!222x'ٲe }}}߿Ǐc2zܹz Fñcj|Ϟ=TUU100i deesϑf`0pu(--lٲE":D;|w[''XkR)RTDP3= tj_τ>C ͻ:JEzz:1$L0a@ojj!Z͎;"))Ii4rss`0sN㘽[Att4t:K/ʥJ󜞞^TVVO@jj*񴶶hh4@aa! J g^ }}}ֲFvv6tvv244@oo/fYo~~>###?\NDDMMM<466rk7 9{n*++ŋuVtٳ;wuVfffD j .̐%T ֭[ijj`0`4zx<rrrvnݺELL F&''X,Bŋİq%6͋HFFFymZinn&77\.|/!FFF8y$999V%//{L.|>=p0<<Kχ#::Bt:w令z=:@ #`b1QQQlٲXmFUUF"ZZZ8ryrrr6<ڽ{77n %% !_Fjj*mmm444R7 B F0?b 뙜$##۷[oa0ttvv255%|&$pp***0\x ŋt:*++l\t AUU*>.(((ƍ\r4JKK?$PYYD"a***Ƞ:غu+\xJEII n .0;;KYYܸq7oKYY\xh!L`ffFPF|Ċa„ S%sssÇ| 8vFǩL8߳gR;w2??H$' ++h8rǓIDDX,v;jSXXJbaaAPn зоQ*p1$ Z^hDRV%..^OTT)))|>HJJѣ833áC((( ##Y|> 9Bvvo?~taΖPRR"=HRؠFR$551ؿ?:Rȑ#SZZJ~~>[n%77T&&&ضmeeezh4nN#99^OAAVZMvv6İNqq1yyy$$$`r9#{``֭n~?^$pybcc>裏x};##,zdee ;33Brrr'..<, (\qݤp8G!++EAQT#lo>n7T*f3:m۶ G`@բh`0. B ŔjfϞ=OVjÇ),,h4211#<"sss$''裏rqRRRczzKff&SSSsN233YYYA.sQRRRfaaGNjj*TTTP^^Nff&6 VˡCHMME*̱cHII!11iK~~>,--h8|0iiid2\.Ǐ'66"##D azYÄ ay$".D"l6>Ƈ1nŋ,,,ʼn'v?3byu0 ]}nnׯ w&==u^{5?~Z>6"/SZZ{dMmm {~ P<ؘPСC/R}vvZ)k}}}=<ka|lllpI~ip8B(@eeg &L0a> B.j7)>@_[[۔&Iqt-D,--P(HD"DDDXyNХO'>VFЌ`0j%!!ᾼxޥ%!0T*R< bۅzJFk2111DGGo>xtH* ~>CJ0a  7&L0a~;DB1Хt @(Az UZ$B !7.//?/:O~n[Aq8˰[*.$zΟD"ٴ8OOTTM?Duu<_!k0ܽw}8I{P0a„ u ~( zm%qiaK$ SHHH#||{0a„ &LNBN!  =rD0aR~P*  &L0a|2}tt[n @&%22͛7X,$&&bZt o߾ (illܔa,333355E||}Br9===ܹsz=ZILLdyyFz{{ݡ؆YWWGll,+WӃ&~dO#J\Nll,}}}455 ֭[c0XXXի233Cjj*333zP?-fd2166v_YWVV0L_Yggggbb8r9455y}6 X,֭[f KKKNMMT*}%N}!7ɢ^/ׯ_JII jkkq8 ^/ofttxa/knn&22fffy&B6ZR)ZO[[¾k2' ~CccZҟ隣fP*,//k0]]]xaTdBB=(k׮'!!/B]]BBM&L0a„ yJKKrO~BKK F*5c###/~A\\W\Ų~CCCnq8B- ٶm'ODV ueu:ݦ~344,T*`ljZڄq ===L&t:]]]?h4Vz:_ 6ư 266F_'33sαeD">3gΐGmm-vy&&&cmm)nݺ%|wtvv.zRcee2il6ø\.Gj ׇJdh~aͱ._H$0<۹r sssLNNbYYYŋ(JnݺEUUoM0a„ &׏c-## *YRSS;w8Nعs'QQQ477j`yyZ0Fod2֭[9qFsvb1GBvPPVȉ'(--2^ܹBk922bR'֒^+ٵkO<`0ϣP(0رcGjǎ?~~?޽Dc=@o}[ddd׷>^za.]{gΜa``fy&sssۿcccg?c}}###YJ%.\;`g'PVVƉ'HII!\.n#Ɉ4(((`zzbrrrujZ߃nJ<ʎr}2rHdӧOꫯrMx/zDFFȕ+WZ:uJȨ#/"###|ᇼLLLG}|i[tttܳq\p&$ Vs=ǶmhmmO`2hnn&;;o}[|>ZZZ.Ν;DOO<8N6qqqljH$zFGG---TWWk---ܹs5>xwXYYԩSX,o`0m6"##jl߾HvI\\v z-x5/Kv;.]lCVmmm\t ZM 9 $$$PXX^g``zCGGGeee|;f1??K0a„ ƧJg}ӈb|>j??`nni=ʻK__Rb1JRxM^ʳ>;vywͥRݒaŋ'HC>}_%GܹsKD"l6oz|H$9"&υ =zT(۶m58rcrxΗ;H$"000ٿ?pxi~YZJJJX[[MWh  0112~_Xw!nݺEVVZdrrrtݻ|1?? LMMq1ۇ㡻[;N ?<< %&''Y\\2/۷{ﱱ!UUU@a„ &LjsM:;;İeٽ{7۷o'))F^/:d222HLLGaccJEll,N8s >OիWy1B% t:vU:::0L0>>__T*e&azzzlر(N'+++ 1zv܉r />}>dV+yyys<322BOOv3gpiRRR777B|| b$ bLE?Eww7׮]cqqqBVV@B`hhbbcce]YSSË/hdii χT*%>> ^/cGVs!#DRR=c1pD1>>Nww }W]$&&p8Jc2HKKC$m5W*lllE~~> s{bΥR)"Hx<zzz ͜n޼Icc#$$$pYڨZ̤Q>d2d2}]زe 388bnΞ=ZfǎﳸHnn.׮]Eh_FF455Q^^NKK T!9\hMLNN4ȣ>墧ݻwIOOR\v;dffMDDIII\z;w ),,$66m۶QXXH]]B(Skk+bD"SSS455100@||<2 (//GTDž [ӧ#!!aO0a„ &7OAw8ϓρ8DqZ-ϳsNXXXfw^2L=z,!aۑ#G1+++ p4^]]%!!ǃ`@"0;;KZZ%))) F#%%%e*++JLNNT*9v)))eJKK)((`ee(!6?VgFLDDB#NGR R[RP*ddd`ؽ{7) t:IIIb4%>>tF#[l:N9Bjj*  j5۶m#;;Z:{A$rHJJB> {w *HB`֭bZٳglllLff&b),,d޽H$j>tZMbb"KKKQPP@ )J0%%H$g9""NGff&vv؁Zfqqxz6XL\\=s$!!Z4ɂ7))i?sw zVV>Ezz:,..RRRBee%Ç1t:VWWyINN&++K8@,..jxHHH@P\\Ltt4>'x$RSSl߿,ֱD"!11BIJJb0(//'%%$rssl۶mc֭$%%aZ&99YCl69ra73[,^}nnN,Ez0== |)}GÞױƆ&L0a„ 399)8˅\.GnRJ?B~SRH" AM -z->|/4͡yI B )//By}ik&L0a„  .X^^~zx^! ۍm^jD"`L~I<^g񰲲rOmE0ex8Ca!&Z!7e_ &L0a„&rޯ"# P(xr/K.Pg6$@K~?a)_G{0a„ &L}^76~.ׁU\.{`0W^PO>88HMM z~?uuutuujfffW2;;hdvvV(e4YYY^4 2ZHKK۔7@?111Lߓe3崵Q__ 11Nuu5vN'7oޤCȤEmm-ZJ| |2:͇~( etA<44č7`0 ͛d27<<,$ eFplڵkn æ,!08&<.M&wgq댍B۷oh4Hgg'* Hĵk%11&d"33T*dq܅ p::'ϓ7oCZZڧmmm$&&~߭+r7nܠKx>hΞ=h4~LMMqu&''gxl\\QQQtuuqMR)qqq»Ғ&kjj---444Fd2qURիfaݾ}V4 *jjjzV+/_b`4ؠzd2:i._h42==Muu5~"'O$ N&L0_!'!Oʍ7|L&Qܼy^|EILL$::^zTnOO&Hnݺ֭[ܹs<#n}rrTTT|A0\|JVߏnj8"gϞ%!! Ŵcزe b9(//_&997nH||oDBGGLNNvijjBR %bccihh`xxXֆdqqqtuu /`0PT477388N/ )p$667|RΜ9Caa!QQQd2>Clׅs### Ν;w>22BKK  233H_WVVPTl6ƈ¹s(,,ܹsoJrr2aAZ__˗9rVcjj χH$bxxN'|>:;;oJʙL&C&p8cqq^ 444088 X,&>>`0TJOO2L{VKOO?1 jy)HhllaoC?6׮]cyy+dꫤ`zZZZ$''>FGGsJFFF8N^.Ν;hʕ+122BLL ===XVz-nJ]]G{{;UUU;`6ZH$IOO-[͛7$&&rYz{{ 11~ضmFhhhh ,// {졺mƩSP$$$j/~!Yb>twwSQQ!$nYYYA.Ȉp8X[[\J$0LzFFFybq@a۩a6ijj NNcyyyӳp``/k.X:;;Q(LMMӧڵ!P*DDDQQQ,,,h4666pDDD000L&DDDCCC {gCCj!-V͆frEvލT*IDDfۍH$140fSSS҂Fa}}VFGGx<ݾ})QT ψnd29v^|EZ-###8Nfffhkkyguuu5YYY:u FCkk+J6;22D"ٳ$%%q/IRR k}nn7oDP__hW_%==˗/{g\.QH$oMjj*kOcc#*(_UUUTWWO<;a„ y O=Jy"fggjl6z=[l&Ů2EEE;!!̌pB{MII X̣>ʎ;D&޽{A8rYYYr$ 'ʃ,--m6 QQQ(J"p 1 Bb1UUU<ĠT*!11'NJM PՔx8|0vHēO>IFFyWX,ܼyr[n*  |XVj|1??o0&xLj)0L( T*yyyt:RRRjIrr2DFFR^^H$baa7|XCKK$gjH$ljrqmN'CH^u䣏>!p&_gqqũShjjwA*rYnݺ{"JqrDEEq:;;9p"JfQ__OOO`UWW U ywh4t:.\yN>iii! 2??-///+v,..bXtZl6ߏ刺T*`~DEEqiz{{YH}d2;88Hnn.< ;wJ"..hz=111Ƣ鈎&>>ݎh$//vZ[[1 8qhz{{yx._̍7x7DLNN011l޴^GBB¦u$X,?wA$EBB]]]|Glllp)l6h2t줽5>C/~BWx7ʕ+l6311!)99#GBb1?cccz łFarrz LƻK__rfqq>z-8ꀅxLOOs9VWW i||<3338Nj5<#;v BWWzz JEkk+<СCL&穧'N 77vf3f߾} Iyy9O<v4 'N >>n9vv^v?bN8B3>AZ-YYY԰{nDGGX6]#!!F#111TVVRRR6|~׮]c2O,sAQ(ڵ I[[ۦ@ lf||(&}v222HHH@8Ad``7nPZZ*HAPLff&===,..xR^^Σ>zuy[ll6hgqqGNN?яrqqQ8v ٽ{7}b1@@V)..TUUa4IJJ"//rrrh4MRR|"9pvOVVp>==r*:999K^^<;fvv{y㟎 t7r#sDQd-{czfgU[-o훭]oojj==N%Q$&   2D@4BKDp?U( >>=9{L&III!J ¼Ģbs3lc%McL&[wd2$ɊvbΟk7v Tbm?{H$"#f3IIIbZٽ{7R\.Ν;չpo&III1~R(/hiiAT277"nݢO>^zzzhnnfvv_~J  366ƕ+Wqdff+u#nb``GriałG6 ' i?vN`0۷lFP*>|/q^h4Jaa!wvnD"WUNڝN'lذ^OVV;vX¼\tw DžBs#sss uVt:hZ^y$ MMMdff>gFZH$]ƽ{H$ܾ}A޽Kww7\v1R)~0`0hdݺu\~ 233GrQSSÕ+W'##XXXx^NNz6oƍF={vfc``@8ZZZZǼK.qܾ}C4%;;h4JCC[l޽{,--T*%>>E{{;6l )),oNii)ݣO͛7{^^^.h%ƩR0 Bh4J[[~JKK \~#Jinn^avZ9xmr-\~!nq{e۶mv:g֭]xذa۶m6l6܌j%??"ؼy3唗@YYk֬ 1fKɓ'ijjbͬ_:N>Maa#YC& ۷0.#Z_,--zcÆ 8^xJ oooyI9w:^n ՊlfΝBvNNJJE$$gzzZ0R)eeeX,RRRؾ};j4ૣ?c~~^ B?/,..222"_vMp#{b~~-p-Ξ=h$??.\mp\xQH$3;h޴i8qƆ p8|`vn:vM4evv,^~ecqq^x"\.KKKݻ"rrrJꫯ r$$$BX HKK”FtD"Y,d2nB1 )\.'--F#fJqq1[n'))W_}"\nܸ< :FCzz:2 ^f#33@ LɄl&%%VKzz:r^dBPP^^V%..<ٵkyyy+DX,X,L&iii¡Ivv6 HX\\v/}F#a0frr2p;vR|="2m&wƢ3V+$l6nx˧,++`0xسgpFdgg Yf !J dggh4Iyy9999XVHݲe yyyL& ;v@VHMM8T*;v 55ubFe۹s'k׮ETuV zW^y PK_ d"33 ~?~!m&va6L^CRΞ={0 =NII!%%4  f l5;;K~~>{Gbi8YYYB ##5kFX,KDQ4#Bffr[ӋT*rrr(**2֮]h$==LNN]vQTTD~~>~2֯_/(L, t233ƙ&x^ ɡTJjj*6mfNzz:L&!r#;;kײH\\糴).. D=C|vv\t:( !m޽T*lBddbqqDII IIIT*nJ^^,--n:!jǎdee%ǞX>n';;]v < q( *_|\T*6m֋~"dff,xw%7łjEV/ sfæ@Bˬ,݋f#>>N+BJJW^!--||>7ndݺudggP(0ͼ^Fҗl&??Ν;),,Kl6/ '2/YYYXv-6m"##C{1ddd}MMMe t &&&IFFƪ|(9!$ vGiisUn!ޞD pވX(gU}zzzOMMaXZuyrr . ݻ~?GerA._,xl6^|?"w]D"\~>! W_@5;R}~~^оqm!ZDLww7&r}kk+hN믿.R|jvT*f{D^^s2>Otc~q8z j?u!>un B}A$nc2@?' pFY^^\rZgׇVWSx,T&h>SzE2_" 1}KE0|"ϟ3yH$a{^~3 ظ4:B]*>ua#y4z5LJaև\.:w>uEDx<<<,H)"""""i# >uD#z4ET>sq_wC?B? V== ~$ȧg qlz',--v7>,//?jDX\\|ȉp8ykO|0k/D"KKKc4}d~V'zEDDDDDVTqŋbZ B\t  s9`ddjfffvS]]M[[D".^ȝ;wU]` T𘚹R֭[177GFFv]Gl8jjjsqqqL&ܹŋ1U{rr2;vV0iiiLnn(J|22 H{===\paҘԩS455ONNMMMՑ&Ml3=<<Ȉl$Jƹ<>ɨT*nܸիW r}.\|>bRڵk+cLPӧOr)ISqmɛo?4yffCq'OOOMvvns=Ahmm%))C>L&L썩Z"\FFFz`nn^, ~nܸ!({3~~^/uuuܼyP(jettjZPUUESSȵkאJ$%%QSSõkhll$>>D%}nnnNbUpNSAa^*… twwc0+vE&''?w_1NG8jA\DDDDDGQq@=Mz*`FGG1֒o[F᷿-k֬H$Bww7 _NqqPOӼ YFT2<>7o288H8nL&+t:h4>==B`ll. Ǐgǎ:ul:ڵk߻wbہPr9ΝgϲqFT* :::HKK׏ǃNr\/_޽{$$$PWW2SSSdddt:|2CCCf|>ܿQ#Hz:;;֋NCT |W\޽{šnhh`pp`0Hcc#===FZZZlF ac`tt hooJ^zz=t:q80 tիWioo`00;;Kmm-NJkk+mmmy wU:;;ebbVAvDBSSw]$$${^ʕ+tww3;;K||<  HNN?F~pc{n><&9V+ܾ}v 1+K 4?~R;&^zΜ9Æ 8}4guu5=66͛7'Rv횰i4Z-uuufyyYdOBVDOO 5cz?uuunf3--- NMMFFGGIHHXa~hjjB2::Jkk+t:$&&r] x<a~R)oݺŶmۄO b._Loo/8Njkk" u>^_Ӊ`  tG֮\.ns [uBDDDDDG1?ЍfZfffn7dddŝ;w#Á-;wfT*Z֭[Ekž={ 2rssnشi KGkk+P:1BT*elٲEq;88Hjj*G1::ڵkWW^^.|&>>^{rطoM6ذp8̑#Gz477SSS#׹>rw}a=`@Ѡp:8qB8Ƞv9| }Rk.Z-:^L&Em2vc޽۷1:;;K_khffcǎa0ycH$tttpUѣ'_*V֭[v̙3TVVp8Bx<^p8ѣGB @ee%ccc8tccc=zT0XXXĉcZʢ60ΊfJErr2999rt:KKK;vHIIպ:?***jw;$%%qubff~N8JI:Fȑ# 311իW:tCqEn7G%ŋbpp^J__R299)*jŽjXV2228y$###B푑***Zŵk׸wgΜh4233@[[Cq سg5h4XV"%%^/Ա~ d2fddlZ-5ks=jjjX,TTTǑ#GHJJnٳgqv;'Oy)x;w$!!N'C뙝 樨ӌa2Ͷ8/|oo   rj5r7tCCChZ1233C ~<6/s9_?n7bӦM<(\z(;pXx4|ߥ[nq allLFۇT*% DBH} K$P޽{ŋ>T h4J~~>%%%ܺuNعs'ׯGӑΞ={dbbﳰ eǎرNHݻ)--;v$###}van:av>~Ez=DawVehhFZZp2ŔPRRӧYZZN)++[#HgÆ D"愵Ìyfvf3d4 7hZR)cddx/ %w^d2qFRRRH${Ν-q:88Hyy96l 55JŚ5kXv-sssA_8F"`05hZ(/_f||7xCT*e޽Dd~~P(JbB>77' `Æ zDž>TG֮()""""E ^tcǎ \hD.K/}vөdyy4wZprz{{~L&cxx[Ν㭷"..4h4s޽cjj %xsb!?π^Tꢳ[n133__PPP\.GT266ٳgx"] V(ˡC8{, AJJJXXX#yyytuuAcc#3339r*J%CCC455+GtwwsM#cչJr$ RTx+))EǗd j:NZ[[ٲe :̆ J͛9³ؗR$!!Aid2῱{[+n߾ٳg*vHOOG*>˗B* h $&& Q>N[[?OX\\$++ Koo𹌌  6>.be֒y<@"`Z)))I222gBBY& vZT*LMM @Z4(JX\\DT*Ax"255%Ǟ !P\\YYY̠RPtww(,,DۋD"AV0all 2xnL&mmmO EFFKKK#jdeeK8`IOO'##cE $ k^V ep\$$$Fg12k`{x(--% )@c2|L&Fv)ۏY֐D"A1==Nikkcxx^na/ǓE__`q\9wٳ۷O)v; Ǧ+,--* ]~=`PXk֬KDBB`P8)))Azf0v/]D{{;v"++$r0LQZZg6w&ByllLCwX,dgg311![#??H$"c)((ĉz)**BׇC`6::*PRR",(JV+:<yyyA0255%%%h4(2 IJJ|0077Ȉ8h4Joo/d2˅뉈|tޏFT 6^4П'WES}O"t:te^xI򰁾 E(Zl+6m9{,۷?+a|>.^EEEڵkգ0:SNvٶm۷o׾'Vz477+]YA,]g`` hll"^{U N>M~~S^Ξ=,^t֮]{?::ʭ[w\""""""4x}g$..5;O3h4G",S)$$$|"%H$ǞF B>ág]/qqhH$=xO[s,';RD"pcy={?ADDDDD&z4#cBF H$B@ sy% PHȧ]mGwyc:yvnc5QL)|"Fl>$sϾ^k>K bq"OT*+ |Z\"""""_DbO{FQ*B."n0:H D8E.?:0 <^t ê{DX'nEDDDDDDDD>=x<>h@,//vW""bX"""""""""""?}#HzB!RRRhkkܹs bZ ={۷o^*AӧO311AVV*sqM"VU%riINN~P(P*\~ .055EVVsss=z󙟟ٳ444 ˱X,444PUUErr缰ÇX,,--osBPg[[gΜappP]{u.^@jjОd"))vΞ=K__B鵛7oCVV/_իx^Rl3=::ؘ$JffjUahZdj5\|%222&##Kee%X,Q*f.ZG(Iq]d2GPj< qh4455q cbbQ;FOOf\gg'gΜTfggywiiiA&P 0Z[[9}4G((""""""""rD"~?2 4Jk׮ nc8<999%33T*oپ};mmm~߿jrmF4eii3g56IJJb||Nlē:;;KVVT*={${;y$[l! RWWGJJ 6MP׭`x<]+BNNZY~388/\.'`۱X,ttt077RԩSر*d\|Yhnc6a||͛7cXp:ܿ^xe, ǎc͚5$&& d\rfz{{q\\zVL&.\@GGccct:#P__O[[F.~b0jގh\ca}aa^ЧJǩSȑ#lݺv"---BMVd2lڴ*6l؀Z:E.^Hkk+ B(577GOO333t:ZasưX,477#Ʉry1w)x@x"oeeeBYq1͜9sݻw k/ P(hllv#Hhnn楗^"''gŦrp:x<<HD7dǎb6IIIYQ t099VG\\ܻwO0caap8Lbb"~.TZ-L&cU Y~=R#@J$lBvv6 ^^BA4%%%[VIJJBRQRRioo' qF:uuuc˖-$''vZlJJ äsNhE{k֬D"̏fcvv^z$mۆ` !!ᑜp8Lee%rS__^ܹsիWh4r)8{,zf3@'O@ff&TVV299I(СC.vφ J$''c0H$\rEm6yp^xv===w^rPӂD"FHHHΝ;r5@<,..oRH$~_PYYVΝ;vRSSYfsמ"VٳgW\ JFܻwVL&ӊdfff!55U8,Ah4JKK NSN)8ڵ4W{*DDDDDDDDDJo|8pBիWtjV+O(bjj7x&&&C>;;͛73>>2J}7x㑺ʑH֭[)((7 Bd2gƍF(YYY2;;Kkk+T*1LL&XXX  ,Y- O&o|CX]^&''ٺu+V1 ,// 'V>Op>N.Oz(EEE_zغu+.]b``]v/zgn7CCCFa RIBBiii{OHRz=7nJJJ r|B룰|_ʕ++4j5WlOsW,:JDDDDDDDD.\ߦ^UTDQСC|>(JV+{`0v >>1<ȻK0|l~3gxw tuu}E"~,8.]DWWw޽{ ܿݻwikkLNNoqFz=IIIp1*++ʢVիܿCqE|>ݣo~J%B{7n`rr#Gp9~?ܹs"g?caaANJqK$ PrM.#HHR$ ֭Ν;8qyd2JD$`ՊB@v}6;v@Ւ &ռۄa:;;IHH@. 񐘘9>o~L&`sfggfffׯ˝;whoorJVYY(J, DfggW82L d2, ={rD}}=zOHR8p###B{QQ7⢰ax~:))) ra mDh$##t222 \j5op8YfBDDDDDDDD}HઑH$v|>255ERR999ѨRGPX,3>>$餦\.p8fʬL&FGG b6}vj5nFGOOpXrCdjj DBAAп)\|TJ^^'55)j5 /SSSLLL`0 1==LM%D$ZD!P((..Fbh4j&''IIIaqqDB||0/`'x^RSS|>NJJ sssL&\.j@ T*}$ 255jeqq yyy?#`֭rHOOh4 ^ hl\.V#_$33S sY3Lvd2zJRTP* (BDR^^qiB~JjjjOQAg|1>@>^Lq\(ʧ*}p:T9h4J8>+|\XXX@}`ٺOh4<RXpXHWxgp?% 2-&d,//D|/H1q^c@"<",׉}} gA"-{qs(Z?8?u$y>sstA\m!?/$"""""""E&f=-hBB\y qVh(B?*ܱOڃILL\X="=b>u+""""""""v 3jw3diifW(':?p8ܜy~ӟ7K("%%~)HLLh4ɓ'féS!;;Ή'}6F})U`0($Џo399IqqS P(P(\|s1::fcvvVnaa!v _@jj*=zAznn7|4OSSpLvHR(TVVr}PT\ts ?~\h zzzHOOgffr5… vB*#4sss466b>̱ujw'OݻL&4 ΝҥK\.f3UUUpez=`Ǐގj%>>XXX ''DAV(%WYYVJKKuJVyx>::ɓ'ٰaÇlذap͛7?I~mطo`FPpY^y*++),,$>>7nfcqqleǎl6<CCCܹl;Fii)z^T*&XXXh4>}V>Nss3\pAr Fuu5QZZJJJ>\.'11Dq8D"V@:u RWUJkD"q[lARo1jJJJۿ[_N'u֑ weBH$ٸq#na|H$bffy!*eƍY:Y\\Lj5ٔ̌IJJrfJKKQ*ennYvpH`͆T*yHHH 99VKII l޼g2;;Wu==/nJCClڴQXVfff(((fa2l6zILL Vl6SRRFA.T*"TJ0h4׾5??088(aǎܿGDDDDDDD &VWW3=={`0ȫʶmhoo#~BK/AWW~^ͥ9A}}=;w|j=_9z=t:줡s֯_Oss3/"ܽ{ݎf?!N)֭[,,,Ϻu0 366FRRW\bp ^`ڵ444_VK~~>MMM@^^/^Eyy9---bɴHH$!JQ((Jgr\Nii) p8j$ aL&D<޽^r`&ϟȑ#߿;wB \Ncjj ņ ꨇB!J%#;;?a0VxcZSNڵkQ*hZ8C&!PT266/JFٻw/׮]KsXZZbyyh4L&cݺuOxяY3LBu8Fדj4 x<(6 RH@bb"cccBifggC*%Yv B $N'vp\,,,FX,X,v;ddd^iݎT*%33O0F$ .Qz=iiiHRfgg%==](5==`@Tt:(J ~ZJebe0( |>ih)V+~ǃd"099 %%EJH$XV[XXtFFFCB8Rx$V1\.q\LLLV1BKabbBH'Dfgg1x0(Jt:~@AAs_OϋAJ왙F"`6=& BE X,$%%177d"LMMDHJJj2<<,T311h4bZWMDDDDDDD訠~bAaEdϓ g!f 'Qv\TUUvٹs:Yaa}5Si0B4%>>_]{R0.\  4Y矏@v? ^g!6wq\=#D( Y>qyA||3 > h>z,O7b_OK$TCDDDDDDDD r GrcK[RtUЇ۳yK""""""""_d>"q1A\.G&=);E qOYF.#H>qO2:nUCܽ^/ _LAt:'e?^-sȧZr1??Te֚}6^{ \Ι3gx<۷RZ[[l6|.0L|k_pp9{b?LFYY/#v^\.W_%''Fp===} ɱcHKK7`vvst:ټy3;wʕ+oPTT'[o~T;C\\7of~ illD|dΝ;Goo/7n_7oobn߾ͭ[P|k_ciiJ^/j\| 9pI O4꫟PN\T*W_%==*K_׾5A`Zbdd;vcǎsettJcc#ddd|566t:y7V{<,--ꫯ>^ӧgΝlݺu,""""""""?oo$ ^P(DJJ^__O4h4ʆ 8qJ%7Aww7.ϧl^kFii ;O^^󴴴}'EPP(q \.:::ؽ{7`$9z([nEDJJ 6@ 3gg,//sm^uPՌray饗;rK. 0L455,WTTCCC޽bdΝj 9vzaR nݺE[[un7?~f߿^^0466>ILL$..g܌^_ձujrs\to~TVVEEEP(DSSfn޼D"W_}'N~z4 Z9N'OBAkk+VqZZZrssWtwwsiIMMp8Lww7NK$OCCCdff ".\ܽ{W(1[;F%;FOO333dffę3g$55K.QWWG$+pin޼I\\PWWG("..ǏPJ0JܜP7znn~ҥKdggc4ƍ?~HYYYt:H!HCTJzz:Z2 @FFZ,f`455R(++#LVVuuuTVVxr v`0h?77WGVR"##C #ԂE.g޽t:JJJ1c*F8,N'===YF Fкu~:ܾ}-[F^^* L&lٲ <Ç *ޫEff&8HNN& qaj5LEE011 ذa `(++#..UH$q=JKKX, E}}=.˗/ JNW^l6_˗/cZ񐗗ݻIKK>F}6˗Q(pw۷oΟ?ϋ/ϟRs144lɓ\x[nKUU477}vhnn^[1115kذa. ZMgg'?tLLLPPP@yy9 BL D"+_ *+ىd`0C sss|ghhMrr2weV~ۋnݥ%9dyp9raE"?#`Phnn|ߧ;wD{{;MMM 8<Ț5kغu+*%~?ˏtUܹ!N'eeeܽ{Z?bJJJ$//|0pT$55\A*==,illp0==L&#>>V,. TJIIs]rQz=_G.~h4JGGccc|_'''4 %!n D"῁@P($xE?I(ڵ+W̎;tü |[tRQQ>X,HIIaaaF#(rT*ǓjΝ;wp:LOO &++K0&e2FR)_ܹs|MOOt: [ᾬ[R^jXVq\nR)III3;;KVV8NK/^]]Ӽ+,//t:Y^^_g۶mtvvP(D~~>###nx饗ꢵAFF333\zULG=wOf޽ܺuK~"կ#>>d8s ]]]\~įk+AKK 333dee\.cttׯp8(--eÆ 1<}>N' x$ D"F#N$^/uuutuuZuu .PYYɞ={y&YYYquHOO'==Fؼy3\xDYv-/~f#==}\|>Ξ=Ν;illd˖-@TyOtsss!J Ô^x~`2طoMJJfttFa]S[[^'++KFl-rj5^x/& =gxfff~_ė%H$D"J%p}QSS%;;2N'X,7pgϞU]k'v̙3455c ?sa~_T"""""""""m$CH$v|>vtX,(JV+2%IJJ`00??z0ARSSH$LNNFIMM^^/^$DX,'nʬzFP(#t9,,,t:Zt:=϶F!355T*jcx8NJ%G;0LL&\.vłVeffӉT*l6p:@RV{dRB5ÁN!HPT,.. ƑB1:;;? AfffH$jz=sssA, sss,--a2?^/KKK$''3??ŽpV$$$t:tILL$11)VxL277`0`0p:vq8?~|; }XZZbyyD$azz`0Hzz:KKK0_"""""""""-FGGvQ* U>@55bYF_}EHz8ҥK#Hf޽O%tw ߿D"!%% hϓYطoߪ }\@_"""""""""$ 333(2>(R4H$aBJ#K$r9 ♮YC"yŸqu< 2 Bz"OGl^OGF{Zk}O$JH$:>~DXOz݊|zV= F +<>hH$gH?󸶟X~?ؼ999_!֭[4|>E(o411???9---a8r NZ-mmm:tF#Gaff4***шwΝ;fx"ϓD"VWTTTxhmmڵklڴ˗/r8wBm񏃘Z߻ߟ1N<ɦMV?qy6o޼cp8֭[Q(x!p=E/ `P(.VUU 罫w}P(u^JUU===dff~pDDDDDDDD^KdG*|Rh4ܸqTJoo/qqql߾GG֮]Kii)J7|ܻwƐJsUL&7o$ ].xr͛7s5d2|>ؽ{7HՊfȑ#lݺ@[[)))l6~?UUU~z|>ͼ디Rx'Odaa_|Q0$ ׯg`` R)׮]{撞Nkk+l6֯_0⋔ݻWH?8wk֬d2 J>|7orp႐+vaܹCGGÇG8ŋ }__o& d2hjjza=PRRMMMf^=Xn6m"//FvSؼy3:ׯh8v۶mɴ@H$\t/Iaa!\r5kՅT*ettAZZZHII!))xzoHRjkkGP8z(---2>>αc844 ܿ `||GFall Huu5 tttm6_΅ f8ԩSܾ}N,//܌T*eyyYX[~V`0(8.]G* (..&##+W|t8o>#== n߾4r=ʶmxW8p!9x fyΟ?Oee%ghhP(Dgg'>Lƽ{8qjL&n7DQ6nٶm555ܼy@ @zz:\NFF N' 8N222󑑑AzzP! W{<<.H<|T:Z^5uO۷owyfn֮]ppRDh4&,R)\.+ z9|0IIIhZG211\.;k׮kGDDDDDDD %_pa򗿌abbWUnJOOկ(**i222x饗֭[LOOÖ-[>կHJJ"''v'''9ϑHwϣVIHH 11Jl6?Rjjjx׸{.LOOɏcD"[1!xlٲ\ BdddpURSSqMMMHR(++jimmeff,jkku l۶n_XX<^pTD"BWe2 j4 ֭^~^_QwZՒh$ RSS/ݻwq:x,ǎ\rZ-ϟGӑh2D.믓FWW/IOO'##C~4%;;d>6mBӡjҗĥKdt:]BBgll<8  7N^^󌌌 HNNfdddPXX(DuhZF#_WPy۩h(((* JxJKKټy3vUR): 8sl޼t:j.\j3+)((_2nrrrx_|\.\K/B__h4*DرCJR[[ӧyr k׮Ӹ\.l6FSN1557XB#q8V"RN'nV`  277Bd2!J脄p\nA+` $''T*YZZp$Czx^L&>9(j'nʬD" ɘ%h7 P(HIIvx0L`!..NT*%99YB!g/g>u >jh%?ʹ4Ӆ~?~D"y8# 9ϳ1#DV?{|ֈ[R}['HER=q3cD>k|D>qW3vh>!"OG("<"""""""""T* O-b%&  ^D&vuMFBgk+v]7  ~ʑ_L}~cs~{g"P(b\O 100 Cd?O[X|("%%[nQQQ;w0,--oS__R$--k׮qqFGGƍ8qnrss㭷ޢAPSSƍQA!~hha``m UUU9sN򘝝K?6l`rrCqe<999*ԽENNNp8Lvv6;w-[ ɈFܹsT4 Gٳ8󩩩᷿-B}}=ǏۤGjjj~:\x .O^^JrŸ/ȑHDPv:f~P 066FuuPVq{։Vݻ:t7o@||</_fllt*++ɓF\.$''9s Ofaa|VZF& mWTTzilllݺ/rHMMxBc {pjȓ9y$B \~v;fX[pcǎa4ؚyQy&vhСCܾ}p8͛ EQ'N 11]L݋P($?NbMX쿋9rQ$H2ccc,..r-yD"D"xwEEDDDDDD>\."cf~?24еZ-* '!!={p!RSSy뭷(++c͚5(Jz-^fggBTf^kƦMLLL~R = 000ݻj6T5 ۷oTڵkFtuu{n$ sQmۆbdl6˜>}kfT*}}}={E^|E! ..-[&&&hllCee%6<:;;1Ll6 [lattA͛x<Kbb"P/RVVh-H͛7uTWW#JH$Βo͝;whnnh4?0/^ƍhZy뭷2eܾ}VKJJs_2rijjjr 3gPVVƶm(((;wrIvMRRW^EVsIoNQQ& D"ΝƍۋL&Dcohs؈RۘfjlLLLϝ;weffLOO333={'OLMMկ~%bp1z$&&_^!..O$))oX,n޼ɱcHLLPQQA[[YYYPQQ(NbnnlCJ&&&HKKK.@BBc=C~A; N.Keɲbٲ۹]Z7+uW).-YdJDwA BD~3@>Β%K%55l#11q222Q/^B@RqU6mڄJjUgffdMbPQQVettm۶QSSC?}}}:uoNKK twws}QXXȂ cb l޽{D"$$$[o}OJJJ ^.]Jbb"@_ h4N~~>tttɍ7dttśoo>.^OKVVmmmnrQx<\~ABTR^^?bڵkurr.֮]… 1呝Myy9UUU8N.\C=hsrx'8s s}155x<7Ћ`ӉRDVj% c~RIWW555|[Bղw^&''q\iMRP(L&Q(aINNF4QPP}v޽{x11m|4%5|2(T+QiT<_4B*C[TWy% G?[9 ֫Q>p !&G*U674_f(H ^|Q#pKSo=U)T\;rX 5r~)! pw||ш Qm /mc5Rh.g1ve&(J52wqhX__#*D) j/#######e'k#wӛB  0s73Va0[`24H`䓝狆S)Fo/\0 ش||!acdQjp  ECE/s{jcz;|}/?cO\#ߔiUZ"$hUZ %H tjwj=XDTɎc"bBl5QLjT(X Q"(J?X ?H@jJ" KmS@T"RrQ*YNBV=}p4ǿAbBDcQB* Z.L(BԠV FD<"ŔIk{C,+PT*Ƣ;yS 1 %zRI,# TIc(it2f+ȷ@ATRfOJ*(Fܸ\|c LOsC#՜JdFa1:TLW< qL>T)TĄGWVw_7]sdeJW VQYJ⽶<>qj-ս՜;H_km{YiK<ɦd Z./̢g0k ݼ`$8 <9G|:~s74 5!okV[c#^R;%o  .h~5 jzZqPԄ"!*-&tܸ\^2E;@1#(6PLoRlĀkLk&L?szF0p3S>(7Jb;s f'q1!6q]牲'8sF„Be,㽶0j*lQ!*%qZO 0iM L+v&0YTI琙A na]:&|t;9~8XRE$!JJs6re S)jB)݃jh,*xFA'&(5ĄtGx\.)JRZbBLZ+ڨ6bXY3gIDža*2*OPYm!]CPdٓ,L]H>~W?Í|qog5Nj*`5Duo5+3W~Ν?DZcE_8u1{NsI6mFP8xڛXt~XC*{+eqbq QgdKLfYzrm`A.5Sh3.Ă'X2/r~gYx}<-c-4 7hl̋ /يp<4!N+JzJ5A9GA9q8O=9=jO0yiKTTlJGO=܍hTz<|ZnLݠb'sֳ5+Ts*\~>'OFRk;#:Ekys[r㭳-T*)}lk6Ǧ4m)җjJV>#W#'.o-]S]QYVlYlEqRL)<&ge&k {ZH#Ƹ^i8D^g/1!F>:+KӖRd+͖7ꬔ&2;H6&sɦdz<61lFQ7XԵqwo|i`A( S:k5a05}5,I>"[헥|m!*D9y$ʼnK#P!vBRRaiR2,B>4J #ANvdiR;5amZJKCT7ZJ A@D;*1ee8NƼczqfn2P[ɪUXuVPbM'Uۣ #######1mMQ yQ*raɉayrY$bN!"Dxlcd3&{ %%dZ3v2s%Gc1:+/xwЍ+ 's`9D% BIx+H ĴGI$ӗsu*΀I$GDnʨwI=7p ynsXRؔ3=g֨?XFݣ5fRͩՓlLf3mphHuN_#8Ũ6iEXKӖR[E,QjqgBI~B>=.,: dU*2,[ٜ! />}TsֱV';w2N8)yBL'ylcg&@qb1uuL'1| D8b) q0bqbSɍϥ DC"joDc)$”zUF#(8udzFkL],: V}Xq8+z$SldZ2gkҚȍElk6h#Wy\AŶb(8]9q9;Khv6{-V#Wy]A7yy^FW~˚5%hLd_>Lʼn){a%fMD]?,NYL)wZpB%y*ܓ--j-koSXts:M&&X.zutK"Y 4ٛD׉a:(A S݄#aVe bVd  c2‘#̳CPڕhoGP9'Yl:D@Gy KFsb²e9C`= z9sq«W_{,XNuo5\~ Xgɿ]7L[6\PMO~<:Qa5 -+c'˟ĦiwOR5 Ѳ$m KҖ!gs׶id~|JJْ9YΌ^'ϖǷ~ʞJZG[q،6 XtSD@NB-}jد0?y>kШ5>rPd+%?B3d=4WL[C_yǘOQUAEf }´4 4* 1'oi @%?]S[ɼy"F!7.Z՜?G,ubҚb;Bx ;SH4VUJhWЅ7䝞Jcy؜΄^Ǩ1bZ>񆼨* hp,<S);w1`H *L3Ąc$/`]:^* 1jsZ a\P)TL&Oѩuww|b ֱy7DcQF=IDj=Ho;+GB1߇ "jϘw o؋EeA 56ZF[c1i>HXO|!ﶾAmO0kڥ;]%8t5nQTĂ'H4$rDcQA>J{ a55cwY) I3Ac`?dX2YDUo\_%7> '.gae4 ! p~iUAx;l+”Ss)wIDbӱg{ϒAl&O,xF0uuAEpR΀BM'+J# LbRP4$)z:} Qj0jx/FJL+Ӗ}B)UMguv5FJ5o.̝t;puUk ’U^lPT:.";.¿PĨ_8& S5z*,1(RW4S*z^t*AjLlF5 DiL'83z18 MXT(dm FܯfD4`JNb4B%JRͩ| yfUbP*4&|t&XTr/y_؇شETP`ҘFĈMZ'cP44+!W#W˱ch4 jtXx:!V9-4±Ra~ iO`$8-sfzs/&K4xP#L E$$yCѐ4bZXdz-x(5<2=bXCt &:|s^s. Vf2 P@SM#Dp*}'uяM:##Ԝx7+cl侨BK W1I Ƃl!³ |YqmQ~w(/c¨Uj7Iq^gΜ~CA% %J4GqEΔtHx<Ϣhlͽ<,يͭXɛwnE=ggiϕ8_gJ3cK8xkل߭Gf;<|r1dAGrMk#^OK2b p]L&} 1 M8&CXTI 46]Y1x BIvO@3Kd}{ICXVnnܑ1b,I\B`7w1nGgѡ֨?dddddddddnKL0n!;vߜ,7)}~.sWb+ 'M4 BFGrǟ':###$$$jݒBPL߇j-g'pks ~#v;Brj2:tT*̗JEI |tm(PߏF~H$lFPzɣL5=Z^ |>b& RI0$ b2nD|T*Fvez=:h4*GImFfmp M:ݴk%1 tn8FK>zs x< 4 H$"bqcbHdڒ9#P*\9k4h4DQ^1|0@ L4:]6M9o:Hd:\^/*JZ'E"@V{}ׇR$==ǃZf* (--駟`0000^GTr9͛GJJ Zc> ~P($>١T*1Lr5hmm%77:O   b0$Y̽"z}ױ`0H(I3&KkM8tD"}5D|NiZiI,x G0Ng0099磠#MFFFFFF擡hHOOG.o+F1ۿB#9x 555$&&t:yW8FFwѣQXX?hmmeժU oPYYncǎddd{JJJ__ 77AxWٷoׯGR!Oޣdf3o8q,XcǎIee%{ٳzy78q'N`ƍj^}U<Ț5kPճDBDYj˅'99Y_hc`zc&hq.GV è.ŋy뭷FaZկ~imme޼yݻcǎQWWGvv6v_`X0L⋜9s JKK]=Y4w#mZbuR ohLRIIHZٳgihhDY4/ ̍F#./7n… kƕ+Wp:̛7OwCC_^/o{RINNnk׮| MMM:t rEFGG?~SNf͚YB摸.DQh?~'NPWWGAAFQR*j5۷j4 ۷C122Bnn.:fQ]ƪUX,or 7o}}}Kb4̜%X,ƻ˾}hnnMM΋/HUU~ h49~8:FQ.^Ȃ 8|0wcl6|> BZ?WVtO;wÇs9IJJ6j5Iiit>J%9 6mBHV(g?TWWs N8A(B0L7JOǏK/CCC޽~?.T^3tի B\t,7ɓ')**̙3V\ϪUشi4EJ%)))477c2(**bjjLRSS BKNMMa0HII!##crr Px,W\!//zP(DFFiii7]wpp_|Q|\xxǥaukzyP* p8& Fcc#ԠRغu+[latt9qgϞÁ磣W^ym۶Q\\,)ߣ\.6;;;o~Ö-[k׮!gpp.;Fmm-׮]gAZ$''Ojj*R l6,Bjq]GQbΝ;za^|E.\Ț5khoo`0p8LCC|gHww7 233dxx@ H,cllP(8`)^Y"%%%<444p֯_fŊ<XV~2999xqVXtl6 PRI$\cپ};4ٵS&ʒ%K8rr /0449V}8BPD)JJJXr%W^vp8(((`0P\\Lyy9^7JǶByСC(J~_rs{/|>6l؀d{.nJJJX|9l6ͩ) JB!wvvJk#@ee%'O_:IIIA6  188Hrr2###ILNNf``N4h49KُFTWWzAss3k׮%[ovbRY{rݺut:Y|9yyy477sqQTx<<o0 <s`zV+$$ű]ddddddd>ѣ߿qvڅ 9s?̒%Kp=zDmƵkhll$''xBCC\l*++{eѢE\܏=JMMQ*_|qv;IIID"^uzzz0 D"vލRdxxX1酅ر˗X~=`7xF֯_ϦMذazjkkD"TWW"Yd.]JOON 6p *++#++jz\x ILLdƍjپ};:NZR<T@TfIgݺu|>-Za``Vb6FFFXf .Y$3]O8AUUHͲeҥK}v0B!oNII Nƍ<,ZV`Ra4D";vjjjl\rh4Joo/3s]"xb)wAqq1Wرc Ųe$Wtى磨K^^Cyy9.\ b nܸĄlXξecn'..UVDII fTV\IP000@||tߙfڈƍٳ7np 8tWFThp~n*ŋ)..H$7P*+lڴIZ@ }qqj5w. ˅R$//1~mzzz{Xx1SSS;vTl0R8FÛoʕ+h4~_HkTff&Ŝ>}.|A<fժU(Jf3`C}Ǟ={h4ҼNNNz6mDzz:򊴡VNv؁Nc||NG~~>]]]B!i㣿_ϟ?>K.ɓ455Q\\LJJ ~ϟOUUppP(AѐB`Ϟ=(JFGG)((```@(ذas1bXV6ddddddd f\oY=PVV&YmĘX,F @RI/.ߴZ-jZRD_{XLr-:Nz['%%IbR8$uZhi7ShR^^O1R~BRD"H쇘9 tRxڣjc",2zbElf[qi|\|~v;7Jj+ZjY>$̔͝zINN&Hm牘lfJt9>.ygw06nʺF$`0v'??_\L(y3Vr+I{TK z4ZF#Ťk2 ݗb8Tf:&&{pW6UedddddvVTQ,IN`0xS*w 'aUbA|>)ʕ+IMMT?Kf*w ܍FbdFI,[+W:L]FFFFFFFF fZ PP(lDzdu2 ֞ LπΧ5O>˅hkAraZoyiL+h_C2ߤ}Em6kILL \Ha2P'AT FKoB}VT(DQ㥰; D"l6 Brr"[Jwh4OFRhrpjWpXϒ=ĘVF#ǀ h4D"/)########G>Nm~TL8rkѨ/NLLHAp055%U>g&HI^'cllL:b1Rb8䬶b1\.gbb>V(~n0d||\߭>z3addD}k IhTJ>y#KsO[☋ '''R4q>Δe8%ڵkns9io;b/_frr@ p9L__K}}Gi~f. "HQFFFJQZK`3by''' B={Çg `lllֽ|B444>1 ?XsllLϭ파t:v:޽ϻ檪*:$|ιmmcc#.]tChػw/ l2e׮]=z.T*O=?~Aشi/׿5Nl~雬J===$%%c ~F<쳄a^|E+x(f[ve.\K/$ex?N>M__<( *++;vPVVoi+ 9!N8+f]0bv^//7  X,דfh4yFIJkgRu C8*΅p8̿OE$KD1q:::|[;V)))aݺuLNN??rYzzzP<oLˊuttCXj-frr7nOO$$$pA6oތ`t+$%%#u|{?0>寧33f~?/2v"??_yn4bǎP(O?gϞ=j ٴi{ett^sӃJ駟fbbǏ344NPՌĶmۤR| b mƻKgg'yyy<Øf?Ζ-[n*"######!a'dXh"~Tvtty|r_Ƒ#GX~=|>Ο?߱gN<֭j[o ?q͛u\vٳg? ^F#Jkk+s=G%·mW|AlBkkdMq\={$1(--˗/388NUQQ͛~˗zx^~NoNkkd-Yr%7n=uuuɫʼy(//WRYYIqq1ɜ;wX,ʕ+Ynַf,^ӧOS__Off&^z^z@ O>(?O׿5=ne֭b xq8477K%J.z-l67opPYYI\\6l`pp^{P(s=GWWl߾]R#NsVLW^!xb&''ȠJzz:X1RSS%)) NMcc#K.eΝwun|ٻw/---T*⤲v< {n CCC|_ Vz'995kP[[K||<ׯ@ @zz:{/gΜaӦMlݺ]vVJ%))),\'Ok.~PWWB@P__ori<YFkmRRFSNtRڵk?39vIIITY  cZ:::v00k744H%A`[oa6Yhh4J}\zFlFZ-O>$l6=eppP@b_ _^P(x9s ׾5N>Ͳeزe ?Iss3zD-[ơCxGy( g?η-oZW* l6޽278z(7n^OJJPFFFFFJϬzo2zl6%%%$$$PXXH{{;ǎnۋ ==088HNNʕ+LLLP\\ŋl6Vٌc%$$pU K,h4:uիWdUȑ#dddI  ''|1^|EbݺuR t~yA6l؀ !!Պbtg]jO__6l6.]bƍLNNRUUg]O$155<@vv6j'xfƘROÁ!}"1͜8qLV^Ͷm8x Ǒ#G(ëWyff3_t:, dggMII 0<<ࠔtnvJGaa]Ivz9z(?wHJJl6SO@cc#o6qqq(J=ѣGٱc;w[E HNN&++ܸqzl6###űxb{1ILL?!/`Ŋ|_CUbܹ~op8ellV</:Nr]޶mV"++Ν;G4e<㴶A^^8NV\l&..˖-#>>fyRSSΝcժU$&&Ɓhnnfttf3P q'Wr)НV^}|x:Ŀ h4RH(UtRHMMg~˿dddD:8ڵA~iDZ팍qUn7/zۍ`TTTAaa!/_ttR|I%??&:;;Yr%XVZZZz\xZZZسg҆s稨 %%:իWn^\\LKK Ǐgdd\.iii߿ׯϪ1/######sgFx<H ${_.*455zjlLҥK1 233Dqq1۶mcPPPng``PWWWsA{1aB^7D"v%8駯˗/sYjkk+WRQQ}}} s jjjhkkc||õko=C~~>Ɍ288$99X,&] _~emFQQMMMT*͛=zS.f, Yj5@`V e||(׮]ȑ#h4|>@@6^'KO .dҎk7“O>BW_%33&l67nC,CPj [LܗL\\^֨j1f$6|>$G@||<>|D(dqL = j .\wG!55FV\ɷm:::|122²eh4|_'==)**rN-xݺulܸA?>&^p[W8}{RQqĐYp&䞔d"55łN# !0L3::޽{%CɫJa6QJR… ٳ~4\ҥKy~:n[z,_NǓO>Izz:&ӛ̒xO[M6Yټl2z9#W(Jz,\\T/bH$BJJ 'Ox<x"N =zt)ҥKrc۩DPSRR X I1Fٻw/(JJJJ>CѠRxWb``d";wZFFF(((`ΝTTTVٰa`7|&l"cZٶmuuuDQ,[!Μ9ҥKYf 'O󌏏Ʌ hooʕ+Gbb"6m֭[8sFZn3o<~?VT@Ѱzjiiiabb 6 (//' 100Z&11+Wr Y~=vξ\'&3gPWW|r#;;7255[lAVMUUF{BdѢEZ JAד,ZnbnbW\S}x=˅Vfz'6̇=Ḽ>oRy Hue[fZϲ0Syv7W625S )mwkqƹmُ[nqy4wظ6w3i0&՜ռ]q8t,L7-w/0ay晛2nz|c92^1jBHk/++I&wb] +Jꩧ\Y=>o 0 Y}>}埩|eddddddnɂ>11!CIĀOeh>GL틔8H,yf6?n)@n7SWxEO:w;Wc43g,wOI)}.ڂ.ym .<zL&J$ kb ߵ1_RRG\_SFFFFFFFF( G6ҟ{@KRrþS1_~cYSV2%1n|q_SFFFFFFFF揈9> x!H&''q:FJT|c0D"bR11^ f̵Z-.1A@ #Ft:tT*V>55F!122 Hr nzwa^1s' uCCC8No ߏj]B=zjjꇖXv203yQ*ҘT*Z-`Pz.v1 1zIx< Py<fg g%4ՑD(̝,{H$BZZXZ MO p8p8|gttT*Fo󓓓\.g: At: 0>>>kv:LNNP*LLL011!ksijjtJ%.oE[[Tdد;cccnT*`}I%Ŧ|웹v$066d(>O\.FQۇBŋ nE"~c@a4ett`0(S,)%>_g3T\5Wbccc/#####Edqy˗/366Ʈ]h4߿Jٵko6}}}sN0ho| r k֬a[\zft݆jkkq\lܸm۶}dab1>L?^g}AxX, 8p@IR]]͞={w+%inn; _Rih_|^I-w\s;LMMx'z߿͛7`^z%"<3D t: XVic(I7@7XqsIbXAb63g044ēO>`%$$ b1$hbx=F&Ο?O?MBBnP(D||NwJz{{ٲe >IUU6MZEYwvvoP(Xh;w6?^/ /r0L<9;׿5X|~a~&EyVwDQKII FQs7 SSS OZh$ P(K.裏bXhkkcǎ1>>NSSODrr2. ٌd"p8F$$$055^bp5cΝ,_\R0ҋGB{9*++tܹGJ*++wӚ)# .Vt:)RIHH9rgyF(@ K/$)ۢ M&~Zӧp OjyXt)6m⥗^s=ÇimmEP3055{M(//祗^">ʞ={B^x8uvbŊwp[ fpy233ikk#77;vꫯ[oEii)fy~Coo/]2öm())իWKɾfZYn~Yj?ђeաY|9qqqaL&K,vZJJJ!99|8rTk%K`, \v Af՘MOOg199I(G>| VZEww7III瓚bpp-[rJN'VUVQ__O{{;p 6h~+ ~pUΜ9CGGBՅVW^GOSn7J*jkk8ʕ+AiAl]P(Dss3\|z3|Ο?BS[[˦MXx1ǎ<;PZZJ||ƂnZ~: h4^/wn344DWWi4BJaaz3FTTT|k׮aq\˽f U)Dkw\\~7`0P\\ +W0L̟?2֯_Oaa! PSSʕ+tҽEcc#O6 },)ԢEZz233Q՜9sF0*))$\|Wl2l֭[`ҥ 8u<>,P^xgm\.^{1Z[[IMM;v0|/^,vKsjDذa?Frp8$''c٤F,4, 6 Ӊ#!!A'118[h4r)!H,JAAqqq~z[VVd %͹ttt_ JJJ>v?ѣGy衇C<@ߏ◿%JRrx^<~IUp8̼y?>N… \~ݎ餱^{{tRRRܸqAjj*pX \rl۶,`%TR\\$SSS8qBDh4`b1I6, z*Z[[ILL(Q^f@ii)<]O^sVX qFa瞣iii8L(~|R(iA ''Gy.>ڵk9u,^]v믿>=łdbƍ^JlFVDPTx<B@yy"ZrgRTT$mL&i JUXXȣ>:K1>FRH BYꢫ FRd||IJJbrrnFFF7o*N:;;!##VZZZ0L088HWW.ɻ|$&&OWWmmm$%%%LMM1<H8ԩSB!qJKK'NÖ-[hjjҥK̟?;v0<JJJt\Ϟ=˵k$eCwHtVTٳD"Ąd>y$Xa p }ի1 lܸP(Ğ={hoo{a͚5lܸy摘Ȗ-[hhh qez{{DPHqլZ+Vp)/_) `ILLdӦMbؼy,wFRoJJ ^W^+W7nDϟ*t/_N?CCClڴIrMKK6$3]ϝ;իWzx^***… m64 gϞERc͛f r6oLYY BJjF&%%l6mmm( x<7Y?-D!*++Q*YBΜ9CYY˗/ԩS`-Z$"mmm8N bJj\rp8̺unh$>>Y2Lv***HHH 99%Kt:)..F099˹ql۶aHLL$//+:3Ih\d }}}a0Xt)MMMaZAvmmmڵP(D$׮]cɒ%b1u|˖-$$$p Z-<\t|AٳYkע9qIIIPSS8<ϧK.q=Ż),,dݺuݻ&ykl2v;mmmt:-[F8q$l*=o|W\g!H`lݺNAדǍ7HHH`ɒ%( d.\HUUCkk+."8|0Pz,ٷoW\aժUY8N>`0ɓ')++cѢE\ro}[|>t:eeew /6MJ'׹OA&--M* ιWw^y222$+LǝNNNLiit9fkll6a!w{M^/~3w.Εo<)[xcĹ"###7YC?ug~wn2s=׭ϭ3;==}j{Δӭd(i̕:Fl(/s'#####eO2Brjl[R0VsT( ˭o̗[ggr[Amۏzɼ1\}wxb-Z$o7VVf܍B33EWO.Yw>W~v}a̍9ܹܾ̕ssΝts>q>~Pn7?l>h|ܛ[}~_4 |ݮ;ܾ g} ?a//2{qs-LMM}fnx1llθZj~]Zdϴ|Qi͓srX,7mL̵l六|ii|##########FP099^dtAtt$ \e﷘#agu@X}7)ZRSSr_6>MFFFFFFFF拃h3N[U*G79jqmJRᗙ;5bݒU_F뒌W1GYA2kۙd2RKuk`xAp`6F 311`@#=088(e(̵Z- fW̦f||\>99n~D"vnz__### 055d,.k NAt:Ƒt:F|0Lx^Ɏ088\gfq?z{{UgRv3|>x1|2P,⽽J,Xp؝9sNGcc#iiiɓ'INN瓞[s$rQ]Faamex~|ϫϸ;$Ν#;;CA`||\zkZ  k`:*ޣī{ngrrRp8f=c=1sw,q.b1p:13sJHVRž}e)MO +WԩSL&x7ikkcddbx .^(ڽ{7ՑASS@ V\t-[R_WqƏ$QQUwp}پ `{ AT%5윓K$3wskkkD" n ]르S۰q\\|s122f#%%~)~?,,,pFFFDr0HRa]nkex Z-TTTk3{9jkkE[[ͼkdeea8}4X,xcppD"kkkB~߲Abb"&~QVWW`0B@*vY[[󱹹I[[?&}YQ(<,--\.cllL(Q/IWWB.~@ù'<gϞenn99shjjd`Q(XVx8tlllp8t o~anL&f!^/~zeav\r(el6#˅>(J 0/>L&Au\(Jl6?RySӧOH$B* svq^ O= PVV?Ooo/]]]q N:Eoo/111n~_266 yyy<䓌GUUgΜtvv ?Ǐ#!!_b233Qռ?nkgggٻw/UUU{޽ .\]w݅L&ۦǣRXXX#MBP((((`Rرc LLL܌J<Ξ=˞={(//GӑL~~>/B,OII s hnn̙۷Nb񰲲}.\@ZZ{e~~^x^FFcyy 8@}}=dr Iz{{1 &''H$]6,v^Orr2q˔KVV׮]C&188X,trIn7DGGsijkkyLNNbZ/_& ~7xt|MV+---B-t n&''ͥ$ijjbݼ( 666~ ~: )332.]DZZ_WxW(...(,,_樮N0$%% /@ff&}}}z)..fll __q9R):HEE.\@*r9ۙn 27==]]]P\\yyy\|ly7"&&ӧO3>>`g~~i:ŋINNnjH$zv-ȐhAuu5ZW244D"l6 DtdffkQ^^ J P(r ]]]v222xw p[Wz;v۞y, mmm$''sI#K/(f͏cVWW9x^;k`yWtttVyרҥK,--ꄽ#"))1v;|_%==k׮IOOK_o&"Nov~?7n3;;K]]G孷"`ZΝ;'Լ˿KD"SUUw͛o)xK}ߧ`0Hoo/:apHw]^u*++ihh`tt"T*/"r;w!B>YnEA+PBAii)wFPPSS&u<uuu\rEynS__ύ78wFQP&Ϟ=ѣGS,"xJWP(عs'nML&rqi:DBB2l[&~tj5ViiisEZZZD#_giiIh_$1??d{UUU=W0$;;LVԩS( ^/Vj&''ikkFYY ٿ?7nf m6M%BwnY\\ʕ+FR\\%MV+}}}|[HRΟ?&qqqt:IHH ::k׮1<<{w}7%%%>|;v`2HLLEEEj4 ­ߏ餫dikkcccbpp}T*F<^xWtt:èT*׾``zzkq466n3<8∉A&MMM ,GMM ǏÇs]wQ__ϑ#G8p^z-fT*azz4 &F#A^y` {P%$$Vioog||Er J%N~vMZZuuuu]fRSSINN_dccZMTT Mr9*xaΕe޽9rN'b=Jyy9V@ @\\AVWW*&$_*.\fRҥKTTTgg#8vFRTTĿ˿gعs'eee9sRI(PRRѣGf [nCmm-ٳ(J B}8vjZRdhh%=*yFF9pj/&^޽{?X,o~lj'(,,dbbѣG9x 7n BoLfggQ*tww nllXL&c}}wyG0* l6 j'lnnB &&Menp8L&bcc{p8BV Fd2QQQaXp$$$bys!| BT*9rȶ!B>PAtB;v*++$++$ FCUUvDEEQWW?)4660v]Vs=BV]͆d??ݻ`0jb68===rHMM%33ۍlrUz{{eiiM:::8y$FѐZLzz:.Kx^ {Ç bMaa!>8 RDV#kll,ze\.pظz*333t:D\.v;JEUU?Ox5>>c=FCC~[񰺺*}سgSXXHNNIII7[X,]WMVVVM? D"6e*++fffF7MV+~B4^0w\Jh4 cT(T*HNN桇+ܜD".y7XYY (%X,pzQ*\.VWW1LBF%_Tc~_L&7DnbB >>$~awWdvvVe^XX`rrCq1!55Uɰ(--m[Up8h4<,-- 0YYY144CR1==MMM BѰ 4 vɡCb۾K||H:On}>0W}'dǎr^VV?LJJ (0@plezJJJ"66ݻwsAx D"qqqBxd#YYYa~~ǃX,FV#HHNN&66={paG}}=OfvvVh#}]cN)bbb0ͬaXdUP}d"s,..nrq0LF'O" [߿ o노Ydxx bll HDee%V(J#77lFGGd`eeVbh7999"111 1LTVV"```D )))l6v;fY`0x["D@.]D"J0GLFkk+EEEu]OMM Ga}}]җh8pV+"|fٳB򗔔~?Nn `0tww ͼ<?ݻǩS{e׮]477S^^NZZwuCCCB&bzoر6Z-6tY]]~4UUUddd===ձgϞbm6A4 |>!6q0LL ڵkA***->r=fb@uu5PTTDff&ZG}}p0dTVV n܆{{{9x lllk.a6fB>OAAOrrֆᠠy***}fQPP@ii)LOOswsNf3]]]u]ڵ ZMkk+=zTMNZZ2LT*`,)++\NLL ł!7!!aDDGG3::*<:$&&KKK$''SSSC__7/_jP(~¢r9wbcc\4 bXZZJoo/QQQG0d666a[·W^IR@ _:B΄v w'NT*bmKa&Y9|0)))r!233$ ${#c:DVV~z!g||ZaڱcR(((`llE|A*++ltttL}}=)))ĉ0>><UUU™!l\Tnd2CQZZ:?~".^dffFE!mV\E&In*++?Άo t F[GQzA6ޯGmV{3[ûru!{v־'~kkkms(buu߹6O\"PYYIZZ.<8~U誫o}fX9j)yyyp@}}fڻrGellD!ŋz}fy{۵.>Q}z<EEE8ŷ-'2}!B:N~/V\FU`nSñեn67 ~}+Ϲq~Z {~пU(BfYY0?;{8?sn瘷>} NtTJ(B&/}/|x~$HII@NNζyN8Oz^?Ϣ>9gqz{0|'O]H$D(Bn?bߛnq{zB\~Hٷu?/|q8H-χXral7B!l6P>؆ٺw[XX,& dD݇i'mE$}hZlݳ~{"D!B "M!{7PBAZZmVЏouqCRD|fyܷk}oĻNS"D!Bϭ>0``vvIll,n:HR\.333XVj5ni^;??` ..@ (JV,VY͏r!{'66,>X^/󬭭\.gccC(Av|t:LNND(bQBˆ/\innBRJ̈́7j8kkkvT*:yX,ޖw177'x^L&ӇJ>w;ؚf1;;+H$šK$lr% .-~Ӛv{*_lHOOMI~RQ<,BiV%++SٳdddGA155JjL><h_~S"ȏJ … {txlKKKT*tLNNV?tVVV@Z2^Fb+vgϒT*fIzzރY\\5ZZZH$o~ lK!B"Dun%*裣 q% kkk {9zsI 55.\ĄPQ_Ν;o*Ǎ7fQVV'!JRΞ=VL^/,//sEqM{1d2Ѥz~ٳg9z(`0H{{;P(CKmm-]]]<㤥ˍ7իHRbbb蠧 .k.MQ{S5ш^pXDVVV0|>R)M L&bcc駟h\LLQ^*!s{1f3W\_Faff7|1|O<رDQccc|lll`4 ( F#FۍD"!66`@&/~ 222h4[;Vga~~,v;F/v~EEE ,ˑFx|\MAOKKcXVhjjГVT 444K\\uuuh4&&&hnnFVchiia߾}HMM%//u\@ee%R>(,,Dp5VWWD߿TH$";;&p\n666OKK ۷yRRRzMMM,..b2hnnU233ڵkjAoA<(ddppݻ Fy[o[[---$''X,&##J9|0"jٳgmW_E, Q\\Loo/7n !!Vb1/B\~^xxא055E `uu .022n/c6gnnO{{;BD"&)G!B൚BC!/jh4ؿ?,..RWWɓ'rD{{;gΜbرczozL&Cբj9q-OT*J%8fH$XVz-nH$nx Q(lnn=`jz*eeevNqtuu9z(Nhd2J"lyL&5?z844Ğ={PT|ߥ7|SPÄoy*++_*l6<===444\A. {A׳g._E.w3sd2&&&2n[ׯc0P(x<j5*@ fCRP(dš|裏QQQ{p8||шL&ǏmO(B"PPP)))!&&'NPTTB@.ىVf|#Gg~yGY\\?'RSS|۞عs'>(^o|T*&** N8b{wZfggy׸)rx.]DRR===XVHMM _>TPPܹsd2TVVg݌ 9|0 |+,,,`ZÁR/$ꢻTo'x o X,ms)((஻SN  |ٳ={l3vMMMv  ~DGGSRR±cBPEOO[oţ>J(w*++H$vC=ĉ'hooʕ+466o}l6>,TWWoc&B"D|xjj χdaaR9ZJb$ djkkЀbp87=w``mW_}V]?OssׇZ&??#ԂD7e +~3 $$$4vHRD&q5t:ق d2F\\333F|Arrrt cɔ277Gww7>~1v;B^Gӱr[ƺ$  P*H$#e>cd2]:<44999bbbx<̰1ΡPJbazzpR(`LL r\ȅq)r!Q(ARRR(++\mmpE:ȈP>l ˤ\.`0z >>{r16776'CCa(ZVSYYɣ>Jgg*..!xLSS߿υ X]]}QYYINN{nX,lnn"J UUU3??&--L&& DBvv6Ԑ k.vuS #??XLbb`FV($3:t( `0 H(**bccERSS?RO.###`x<455p8狀Gww7?~Rvw}7EEEK $%%IY\\D"`2A8`0000墨={ G&!AR餲`0)!YO1*1rڢV1LB!ؿ?tttBRF!55ݻq\Lss *]IIIPTT%??Jh$55Jj5yyy(J6}ccm Ţ =zLƎ;HMM·ڕhZA! rssq\F!]8&^ӑ+NBl撗^gaad}p8!--bbbP*466k.4 _d||DBss3lllKll0[V׳w^bbbHNNh4222޽{ŋ 7QQQ D"Mee%*asrr!77CEE^)//P$t1CCCKssD3333tvv 6D!Bn[qqL&vw:8Ώucly`0[,Z[[YYY!::o~0A4Y[[ BdddjthL|[gkOGkk+˘L&;p#g!VeffX ϶VB!:;;cnno|E:B"D KbZ¥D nk|H$" mGm'qC̟H$BPPXXH~~>œ}7HHn.qD"!~Iɇf qwp»XbE#`kBOAAiIa$یpc"D!gH$X7PBqtÁ$99c)R+p%D"zOEΑ`IIIT)IHH.";/#l@s$%%Ѿ"D!B&}HWc;&y3??vV]{'ރ[ú1um>߸y D!B"|V3fq_[[Cbۉ' 1==qqqBiQf3 8p c...bQ۲vZG!\.>x]C||>B ::efff !xBBAX,1==$VFX,ޖw1;; z>n7JK-5lFղ)"HRJ%ZiVWWTZ fssQA7QQQ\ܯ\jԲ. ^/.]"55@LLLD5{%$${ښ LMMRb0::J  ..MƐJMcll,rbq῏pIVVV8{9l6fy] ի;w)Jleuu BhZX^^ꏇ\\RU&''9B"Dr+Y?PAdjjR)+++9s5())W ;3<h4vSQQ`Y]]e޽v}ii^xA<&!JRZZZXXX…  xr5fffqSONnn.7nd2SOOllP?)/^ѣBb.ǹzp(~0ܸq:xꩧHKK#//NZ-W^% ha``vſ z{mmU, @y)h4,,,A&PEz=qqq ORTTDLL;Z}G⳷*=== x \xRt:[@ +++( ^|E&'' 55V˙3gd2SO=`2~_ĵk(((`cc'|E]]ccc<󬯯j)((gccׯS^^~Sul:@, I&&&(++r!0 ( 677A* {M0d||NNj/HBB,//gfggⷿ-wuvD"* z˳>Kmm--i666?)^Y^^fqq'O`_GӱJbb"O<Njkkm"D!­+ EUUSSSr!Nl6D"/" ىC&Z̐3ܸqӧOr`vvVpu\OE7 q4 vzw[2bF#o&?qqq7=_'!!P(?{!^Jnn.& &W,ڵkf?AP Hdxޛ,Hhoo`0p= ;22ݻ8vgϞE4h~aK_p李|+zIMM4|>zzzHNNp\bZ/#Hfllz׋fc```[|իW)))!)) .p9FZRq1Ο?N&:˷mvqG|egg311h &aCѣGrHyy9L&cff! G|/ 0xW;Fuu\?™;::{җDFF^P( .KϐJ8!%** M^𛰇\.G" w舘ׯSXX(|,N'}}}D"ѶRn~>'V:;;$33vIff&>vٳ/GyRhll$&&Gկ~qbXlp022 ;;$a~ž%Ns|;-."D!B)ρgǎرL0T*ٳgUUUP__Oii)GRHBBJ>&''1L7=񰼼`@^x]FSSP" я~Jߏ``}}e, 3114&I8Do$bbb!~ŋK޽XLNNܸqFvv67455 4 nl6p|op%y 322"Yr9R7nJ^^^Dfccc{{{/~AMM BǏz1XVP*C\\w領v;bx~(ږ{aeexםvmmY1~*{("33Ub1YYY QPPX,.x<,--F~x[q(#,#@ @||<`0&s 'FKMMeddYB*k׮188Hyy9EJJ r ~?~ژ*8NTʎ;0ܸqursscllL_II ˗/@KK ^,~'666tRRR _`tp\tww _ JMLLvbccϓRD,VbffE qVj~t:|>F#"Ǐ.===۷Eq\iq!B"|N@wV+8qKgg'Jn(zcIDAT/| deeOoo/5554551==߿ > QEE&}cc^kAAQI]__'55`0CTu#''f`޽A^lĉTVVDUU4662;;T*bf3 $ 9rRzzz :nł\.'++ jkkIJJ$cǎ\T^^2dddgghعs'+++t:, FVZl6#(// ˅^СCL&IMMluql6 2H `dd;wЀ@TR[[D"amm{B$122ؖ$.>>^H(JUUrv;`PDIR TTT,'''hBbfgginn& 2??O||< *"HYjTPPx"~?SSS?~\ٻw/LLL QܹS8q200ݻ… h84(==&R$++ ZMuu5DQQ255L&@0.:D"vB" HLLʢ{@|p8\};"r!B"DKbZh4m[= ~HD UWpm:J8ki GPHC%BO%!%B"D!'KXH߯!bo׋؇M֤Xn[uCz?unJ[  p8|TT> 0 wd\W۝N!B"D(ܤ}B!Jm/v88ΏyuqDGGяv)pqp,G!B"Dtz33sDhfn>ܮw! ~f\#D!B"DcV迻qqq Ynv;UUUT*V+DEEQUUfC %|>B t:̤ &''Q(TVV~d0sss,..Fqq161)..r1>>餴$Y^^ {ccc!vGaa!nR1(*333jˑdt:t:Ť2?? $$$4TVVb63WWW3>>`@PSSݰggg1 455}9t\ oi >MF#( ***bvve`0011A||v@q<mmmաjygHKK#//>t:ׯ_>go-666$O_Jb||+W^GT_ M{{; HRֺNll,@IdL&wnQ\.M(6 Z ,R(>jk[Y~`6ٹsvJk2`bbgϞCU}!B"DpkJ԰JKKbqqD4ܹyyyab`X^^x饗~:n]vO?Mee%r5 466k~K!y,,,`Z^2[ɟ 333<:ptLOOS[[K0m |8&:;X]w݅X,橧v{|#կ~&)))׿&77JETTz}~?oF~~044D~~>X,ZZZHII~?D"a۱l?y cccw<[}}= ,--!HH$B&L&͉'׿5@\ot:JJJ踶xhllDRqy&&&X^^f}}TJKK),,4o~d2F 6{qݘf<ϝ=QQQs9!~("99DFFF):tml6N:`@$!J9vՓJff&mmmǓW Y"D!B P(8v=6ffffxz8 <,..s=G?`ÇɩSp\ddd477/twnfggp˃ [lDoVojW_%66 yyy=;w^WfYH$ҥK8Nn|>RXT*}߄"V, {/MVsƶ> C=DMM | _`0rB >J\\~L^j5. TVVR[[K{{;P(H-ejjGyÁ`aaXt&Q(r ^\T*E"DY__G&Q^^Ε+Wl6Vu[F#~|>KKK:t˗/#T*e޽GKO`0Ⱦ} ! B%>d2TTTP^^NYYM{Xee%7`Zy9rwz*"D!B"Tf~~DFF{%>>]v@FFT*TVVJcc#ٳXO0dee^/dׯOPYY3NUU4kkk,//??RHNN󱶶&ޛL&lϳ^gmmMpW*155Q9}4/o/]n'77uppY^xeq\A(BPls(B" Bp挌 &''d2 7N AbDQQjN8qGݿnܸc=&[, x^q:ܹFh6Z[[ΦΟ?pbۋdbdde&''T b޽8N^Jcc#8 )))K.m3RTTDRRڵWRWWfjjJr]y;Aѣv9r; jx~_ث=$CCC,..&?яp8vTD!B"Dx7}llL|>j|AHIIallLp7gff{ԄdbhhtN8磯‰'G[cЗ577Chk, JHZZEtt4fDn'//Iv;"lvΝ;cϞ=v)))*JKKٱcrVжRhfffWԡ!TV+"ATTfHHH188wuºd2r9 IMM%11rssINNMVVVX,=z$HLL<#)//' a28puao7[cЗ|]JLNNĞ={HOOGՒƑ#G())a}}Hĉ'>AAǠD"t:ɬh0L(JAILLTAZ ϡCHNNFeccKHdz屸$##͉'󑙙Iff&999ϣh%(ɰ5]*Nqq1r233IOO'##XJO`aaNR$66VH&˩z궭bapp<@ll,( L&9997L&Ν;|_ܮ:kkkwz(buu}_r.nSW\auu{="DG!B"|t%{Zr!'Q t | "H3D"afJ&BiiiPs.Iq|{ #|m z(rbbb](,D"C"D!B ºGE~ y^Fm~vv;nu[x=j$>)9}݉Rrt:ܼH)~h8!x<|>_D9!B"Dt:?r 㛴P(Rbog#.oqP(DjjM.G!B"|z[9rvpk?XwqQ: ~|j n`0(<'1w9 ~ ~gB8䣮'1 >rY& }"DYh4D(IP*lnnr 666HMMessl6)))nzzzXXX )) L:fRSSD۲L&:::.lt:INNbp8ebbhT*SSSVhMWWjK[[Z`0(܈-..2==MZZbssd$ 333P(PLNNn{" RRR0\r INN~677IKKC"~ afff&++Cϧ`ii;-,tuuLbb"rVK?"dzzZȠHRe)))D"!kΝbY?mv;*&`0(H$q8tuu1??/vyz=q~Ybcc E!aZyWȮE4[Ngg' h4 tvvrHNN, ɷT=@288J( r)nܸ7D*riٳgIIIajjsss Ɉ~FGGQTDGG3447׮]c||uw$%%SNUB ch4s |>T`rrya mmmok}>/"111<_\.=7y묯I v8BΤ۾ǬoSUU~*$,//I0$11΍7 d||FRdnnnAM&7nj裏9dLLLOLL *J8y<p\tvvLJJ FFFeiiN]o/%|QCT m巳_}o#D!V``0NGoo/%%%<䓸\.bcc穧iGGG8Fi233y*++ XMA9sA>&ak.N'gϞ>gϞVh4rEɓ˗я~Ď;0ͼK$|ӟru;T*% 2<<&ׯ_͓O>BZ9y$3<<` 999z؏=iii$%%X,6ifgg122Bll,bXFaxxl6 ) h4 _\bcceaa;UAdii駟&55~r%_ׯ"kkk$$$O y|(===$$$PPPp[.fXXYY!**YVVVo~Crr2gΜW^yNG\\iii^NyN8`~~ nOP7033<~PxVWWd2!p8B m 28N| 3;;+?QQQ$%%!p\b$ H$'''XƄŌ211v[yȹs瘛`0033CRRO=QQQT*ŋCUUt:$ qqq,// p\~!'VɓH$^Jyy9KKK ɓ'illڵkHRD"===߿^zRf166FJJ O=rjjjzbINNwڵk$$$$o֢jciLL z~l6Jmmm>^PfggdϞ=XVJ,//믳FSS Kz\.g~~Iy> 0g5H?8fbccv뙝f!>f3 F P(V w ann8$CCCt:0LOO333X,fbbABB,,,{ zsE. kX,|>歷"66S\\/K$ /_SN` Μ9fhhm2~`(zgE&qx A[[aZq\A'@*r%JKKiiiAٌ㷿-Pged2qhll@~"Du>q=qY222ػw//9sd iii\|o~LOO&pir9.]"11DBII RtGtt4 477I+ b %;; 㙚x***S\\<1;; єE`a… D"B999TTT099Rft:wIJJbΦiD"0::Jee%eeetwwrmAD?vq ccc\.ZZZzRtLNN233Zfhh;w(LLLPWWwۅ|FUUf 555)..F"x8{,">>/nG\Nqq1bNtt4V'|Lƍ7 Zb),,DՒ` ??g}D<nGc׮]U766!y饗hhhb(^ud2mmm#y7  HZZڶ 봶hfpp8$ }}}~:z r9o)++cnn)IHH`pp;w# 1ʹj;vު oׇFae}}]Pf %%%-Ԫ7ͼkp%9zzzdjj9.\ Ebcctg?5\SRR"̉bW^!++Vbbb7x@ 6 $l6㙛oojL&Z-wPTAmm-wOBAݍ`zz}{x<Ǚ{aΝ?@ RϹtp_ammMLvv6׮]l6STTΞ=Rduuatt0_ʕ+X,ș3g:iii!++!BR_"Fȋ/(#]9r'OdppX~n7k퀳nqq7|/}KnP(ī\.l6@^^8Jww7W^ER aBgϞs=ňD"braۅlR~X˗CII EEET*illdllL}ΰ,9r8nPGy:d2l6o5lnnVett{ǏSVVFNN ٹs'###Q^^H$BcARQ\\Luu5]]]X,A.ٽ{7<)))FX[[cΝ \.^ǃ"''G}6 77:j5?~Ғ0@ @ n%D" /}(,,$??zJTWWCjyW k><^ ~?7xχT*~x0 B<;;Ga߾}( 677 Ӊdn7 zUz-wÍl6۶~n7 k.HR222'++K(h41LMMa0#'>>233?m{h{BG#99grrssX0d}}ٌhdyy%';;[xGñ ÇEGGl4r/~ž OF&mz+,,$&&V;<TTT066Ɓ8qx^C=DBB'N@Ѡ뉏.Vm #` --VWWTTT1nb&% 7 Ob/|mAAnC,D۞~rJH$m}o_ÿ B75 m;ƒGMM7`F!B|A__ZV㮯GV{n`ddGBBŔݻIKK^P h4JV,..277w˃{'$77ݎbll N'~R Ϝ`ss*ݛ̠RU666Z x7xW(--bPTTOtsssLNNbZyZgg'dddp8`rr`0J6vXL&a%,''Q]hD$ rQQh6DA1ӱmmm<rp\d2zB @ff&qcddL9 L(D"966 i(b&''+W0LDEEQ\\DRQQQ&馸, tvvMjj*o3.^lHOOѣܹիWj|>^/z|2#ڵkc6@ @AAnd2QXX((V***h4TVVrqahhHP>KCJJ ===8N222@SYY\.gll RhD&,Ct:)**v/=GFFeeeLMM[o!Q*ttt/Y 🥦cj5uN>ngǎHss3{졾%t:TVV200oMRRVVKIIWի}033SH\V777qr5(**"++ Nښvqifgg[ޭ+HMfjjJ덍 )))A. ncjj'xb\.eeeh4JKK9~8LMM188dMMM ojB, iiix<N>2;w$33ӧOsu˩SNȮ]0 >}LSSjwyAꨨ˜?^0o ihh@";099Ν;ϧ6رc:uXjjjpݜ:ujkk˴RRRŽ;ԩST*!L`iiIu8#D!§177GAAǎ3>>NRR'N 99Lillؿ?X,&''㤤NopR9}u,De;"(Z'qLfb>7;Iώ'D-*DU$(RAс/Z"ٖ([gQ{>󤤐?^@ff&^ՊL&cttDZZZX,FJJ P|n߾-444yfJKKپ};ra^z%TUUIi.K ӥL䏴YZZZgddD"AZZ&IJBRw `˖-dffFy&nKwkZrsstXVbX륹Պjd2I]WWGyy ݻp8jnH˨SܓK,CP@ZZܹB&rr4UVV1Һ݃J5虙0;;KYYR=FJJ ~]oBH2liMM LOOw^)**brrRvڵ.\Tb4ΦWJA?x x^T*4vNnjejj JEee%ifffrvv{ uJ%999x^JJJn7,aɑ,&Uլw^Ѩ4ke hz 7m4%55%Guu5h&!]'!HMM%779<̴VrI/Yd---K/`_DPlnjldeel'l6/p*++q8F),,Mzz:---K׭^zi1B&&&P*RP^[[^GPPP餠}a4h4DQZZZ`RSVVF~~>U󚚚n_7lrss1TVVNz=@@T2LM/N'2]vsNNfFnf777'jXVߊ G8fa2p8377G8BVWW)..fӦMh9n~SZZ<@eΝHELj5DZ-kkkz 墺} ټy3Z۷oKnFÇb`b2V+j+FOuu5[l!++ Vˮ]rN>Y\\lڴ ݾ#?طoq"/yyydgg333)--p055Eee%;vpQ>|?EJJJx7zړ>77}gggX,}vvӧOK7vIaa!`z^z ~",SAAw̙3Rc鳛\>66lǯ}ffN.[ܹsn~l᱋D"?f̉'e[O7  ]w]Ai\r(>)))'T{2YKqW(mRܓ72=c2:)  ·SrQ_ϐh4eVh4AAAcccܸq^֭[twwʶm0RNq\ztuuIՊ.]ݻih4l۶ NSaBgg'&VWWyfY۷oָtd2:::ÔSSS8sss455I3Nׯɶmh4 qMjjjp8\~qnݺŵkפVvKKK\tX,Fff&;wf3=Crcǎއ>;wPQQNnff>jtsm$F\|H$BSSs}%]]]y>w󑓓Fy7FpNؾ}=M,$}}}8  ul6??磽h4T*.]DYYկFt:o.j5LNN~:9y$ͤk6>> 7ntRWWmmmR!^ʾ}pLLLOغu+SSSfNg?ObX,z=^fJ%xaBRۮ7dggs jjj[~###AY^^@ ۷|2[n׿5EEEXVf3r|ݸoܸ333B!^V eeeqY^^&55k׮111A<g``Ӊh_ݎNqF#&ftxall ^oMqq1ǎz:;;QT ruq:j?9}4jxmd=χV%А,33U&''Y]]1ټ.xstvvhdttZ<^\J_gaa\Y8fll4z{{`zz5sgpp|._"999ߚ"SZZZ'NH$ yyy΢h% J-.^HYYo&:N%m47zH  _Uڬ=0p4:غu+\t~eeeCSStuuIBPcRRRسg}gx嗱_*\.СC8p@j͛oP455QUU%97odnn[JT*}}}LNNH$8s %%%fi{r9=/"RvkFJJ nbǎlڴI;vH=c;w"9pZGQx FGG9~8>wѣ ŋ`nn猍 Fn޼||^PNGqN'}7o>qQRt233YYY!R^z1z{{).. RL&cǎ!|Gܺugr\{Ro>ҥKLNN_~υ Dѐ(^4رc\r>A|M 7oޤ[z~<Ν;;wޅOAvC&&&p9r_SZZ+"uҘ%"]CAAW_}^{Y<GA.t=sssLMMqa{=_J{ׯ_D"B100@SS}7Hgx(//QgN'17#N=s'??⋴ɹsP(LLL0??/v,?DPB<mMg,㣏>"sag֭?\~}MKK 555TTTp!^/PHQPWWÇ&SXXȞ={sKKK (**^ vH$`ff^{E jL<JZfee[O~~>׮]SWWӧq;wd֭,,,066RuKSSݤRYYI,C`X%++Kz~ZZ6nh4Fhll$-- Rd ^Ogg'^D"TK$b69}4G.300Kۿ TAA6sqYH$t:*++`Νl߾ŋ Bdggcq8XV{9z=6m"--FOOz^J!'O_ݎJK$шۋdtt[nh4"PH࠴^;##|>333twwׇ`l6ԄJnO,,,P^^<|PbN'7odppѣG9ryyyؓfnx<~D"\.GP Q*(qԩSuQ\\,U_^^fddZ ۷oSկ~fciih4J";;H$B zT*" ʊL>֭[TWWoAAkЗŸ}6V(,,d~~&Y\\vgjkkLMMQRRP*b1jjjwA r9lk0LA,  jzRSS KkASSSvjkkbӦM466T*$55}{RYYɦMزe |>ӑdggKX,VVV8t6 0 L&J40Lqjqi(--[r=hfa0kbشih ---c2X,dffHII vڅ\.guuͶnI{ GףP(Pa0X\\dp8]vQRRB,Cs!v;F/-G5fgg "L&CѐXƚ\ b~t:}}}ڵuC~~tjJKKY^^&cHII q8RTT YYYt:i eeeR\\L]]YYYX,F#l6Y[[#33&VVVF?s-5r4 &RYYɞ={v )--Ů]Vf  DBJoGiY|<ɓܹs|Q3.\ efh4KDtAAg4 E^ZMVVֺkmOle2Pp8L0ʅd2HDJm,LSKV:t|'=P(D$yۜ< x|CM"ዳ[lRy紾^jV}yy9R7'y-.zR  HJyFֲ>O諫_+@DQb3CX&Id4}q'u|Gg(" }aB!|>ߺOR"=_6LnQ?_|xZ%?HR\AAeIGȽ'H3LOtTL&{&Se2C=x<)Xu)·HqAAxGE![AP-L<׋h4J(]!b X}xxv1b1Ξ=K?YYYddd0==ɓ'n333ɓ'q\v|> c2P\|/H$0LR~~r۷9}4N{*=HZ<ԊO?eyyh4j|0Z[[%cZB)%yddDZM__gϞځq :Q۹s6>#^EEEnN<8T*it-N'?^/RuvwIN:8999Ņ Ff9}4l6Bܸq"=ŋR51OMMVr>OLOO!%wWq~:rm㌍jD!>3fggZr.^Hgg'zJEGGR9ıc(,,3;;KAAXՅV%q)]Vq֝ 0V~>'NpmY_]]ӌH׋/ɓAV=p8!++x<ѣG)..ް AAd7GD8s h:gRRRoAFFV x r 2Nn7hѣl޼u$h1FFFmFGGIOOĉhZr W^e߾}x<|l۶EZ[[18mmm׿?NSSvN2?룹Y*511R4 ǏS]]2ǎd2p8u Wrشir9zzzhjj7D&aZls_$kkktuuB c0x"###RN'XFFFΦ_X,Z-`47}jjH$dxx{6o̟goq8tww#`bb`0jZU駟HJJSkZ /^ڵkT*t:Y^^ܹsRyΝ;fa#;;V?N~~>)))?Ӊdbzz>^Wsw믳}vnܸ8Np8Ljj*'NZ& N'*K. XYYĉL&N>MEET*>./^yf~_Q\\LII >+WPTTlFVzsN4eyyJ4=ܹs a0hoo˗/OFF:Nomme׮]D"Ν;Ǎ7LOOt:IKKlٲѣGٽ{7jZ]~5JKKQ{=hmmw}Onn}`0( ݳg}#G0;;͛lٲeߗy{1tttp233`׮] f  >^D"HSX\\dffшd2QYY4+@__ˬR]]Zիn(**BB`||FsN477uMC.~vAZZ*_"fq!P( )//a<[n%HFҥK ioo "lݺ}Fall /,e 444{FOff&* NG}}=Pfn7]]]n)x뭷ٳ|ᇬ?a\r kkk/n7 jRB`vv#GVtFZ[[qب\R]]Mss3FQNJ8jL}6kkkq "!d2IMM{|>nߏjRVVFOOXݻwcZ;LMMSVR@ ٳgYZZ{طo=IX7o~8'5}rrB+Baa!###΍7hhh_zlo(  H$u}YG_oСCx^Z[[`h4x<yWhmmettF/餽RX B<o%x<Ή'z_yg~}]jjjv3Ü8qRac8G! 1990?W_K.q9 HD8z(iii477KcK$$ FӟDJJԟ|nn bddd(J._n̉Dy`޽~0rImm- ;;x<`ǎAn޼"7o$==| vKKKҺX,x s)xט%HiSSS\.f3Z˅\.'ǑdRVA򿧱 [QQ%%%vihhԩS k.z<rBl߾jn7Fbf3x<@&SqqпAxzJ%kkkdff;0Gh4o>53 );Ə~#i|q ?OO~۷GTOl۶#zСC8zzzhmm3iiil6VVVXXX`ddFGG b1.\;B,//ϳ}vj5rK"9fff0Ldffr}4==M<n|lΜ9p/»M~&?'_i ͊B! @@ Z<G}Dgg'jT h4ٳ&l6mmmAf3ՊbasRRR8t:NlE| `3DgRX\\duuK.122??QT,--Ii7nʕ+,,,pAV+px<}Ν#''|)N~/^dll?b0E~F)..ޯ{ѣG1 R\i4lTVVri\.=)DBڿ2 R@"WKAB@&122B p2ףϧiÃ'OoJ\.GTJV"?O?TJmll֭[;=0mmm\.N>.]bllWrڵ:D"A8n:gppD"A^^ |shhh@QUUEuut.$t:ǹu۶mCRXXȶmۤ"7OV /000 ͢//344|~z-dff͛7s5~a6d;`u@yy9wsN>M8jk.ꢰ1Z[[9uPZ$8Nhii!##h4J4EPHטh4IӱX,\p^)Th42>>ΥK;ɔxOq͛\z5~J9 Z8~8555;H[T*y6mرcIe\ᅬfjmi( cRͥB˻ﲸAݻwH$X\\(--euu;wRQQ kkkݻ B.Jvލfd2y)**X=aIIIAb6z'ܽ].KbAPzҟsrr0 (Jv;KKKdggc2ZTVVR^^Nmm-jn7ÇcX())zJJJD"hZETq8iiid2177GNN222ozlT*[l!==ZMYY>FjkkҸSRRZfEc(,,$//2d2> /@QQt %%q8xh4al6}SMנb1l6tjjjX,w^jkk)))aeeM6$f2߿łj%Hp{%}|d2t:j/Mkc.yyyA(ÁBh4rAT*dee},eOSWWGaa!l޼jʤ /@YY: v!XEEEA򋋋88B`~~b222(**Kqq1w֭[HE:ϵ5i|eeeITH0.r2331 LLLP]]--r8(Jl6nBYY@={PTTש 6 @jj*---DQعsz Fr1==&MVq Hx2 E0n7r=}ГرcnٿFoC{R}6,e]*l"ԩSwww,)YFAOf0-䛐xed2T=}AT*T*8  !DP(d${d20Jd谾0r `7[T*jZTAAATfggN ԕJ%jz(oM)httzʤ󯓆.<ıAAAxWVVxwD"466"˥~՗\_qn7x<."@AAA?v㬮2??/z<'e^/қ M   eDX,R_S w&M NAAAxqV+ez A|>Hߏ} !)Sg6}WY.KW[}ӆluvh-8$4jXx/nV?Yo5Y;ެltA'\pƊ]gIgFzYthЋ7s-+?1usPw3+o?|t`9آ% m.nkJ90Sjhe[]hSY%R;J׬`6nw6ns2E3&Si\Br9IxȒ3܅7ՇSmn$0{59؊.3bq m 宥e$%g( -髑 8q{6'$zۣ1U}9ph+Ji Jè:YS%5 ~ cml#vpYC{ʁbBvC@6i4B^PO7 @̲ x]($K[J5W, .c"8Pķ?9. Oѐ 9֧Y04}YbzɈ6hsnERgGy9Nn , hQPm,L?6m)9 !'nh;D5u@XaW]NZMCX贱 #N G*AI)dI#RPebȉ dG'z©֠); p5mmCUxTGjVGLp9"wD2ظl/Dmd7ֺ0?; W7ΛKI>bKGD pHYs.#.#x?vtIME "flIDATxwXWEB[DWT\H@f *jXUW%QXb ] ťـcPl<<2sfs93"B!x.B!BHb B!@!B!B!B!B!$B!BI B!!B!իdee.; 377i;ik!~`E;T٫oJ|\JE&MdgNBR(mjZv\~GG {,}u]+\VV۷G}ƣG]̙3䄥%7foe;:ĬYG&޽{SzubccIJJb4h}'OJߺu _Κ5kHLLxxxaÆ 8q-Zj9y$͛7=M ^e-ZCvZ@*U:uk-/SRRRd޽3vb}q+~G۷/EOZصk}Ú5kiLWd\]]G?h4 8;;3j(aTT[oooWZEVAceSL[nlْ]vpaPԫWѣG|(ܰ>[[XٳgSF ~ZhA͚5]6dƌ_Ӹqcj5ݺuŋ%ݝd릦 E 2ѣGccc+۷oٳ`eeEݹ{.999b :uD˖-֭/ݙ&O<ٳ4iDלݻǮ]JݻL&L hڴ)ǎCr] vvv 4HN_~I@@M6iӦ:tV˶mXr%w 777rrrKKK "55UYW_}E~jdeeahhȒ%K???nܸ,l2ׯ%?^Z sbVXA&MU[&&&VK~~> 2DY~ƍX[[ʤI8wѫW7(D|||dffV-6P|zĆʙ3gؿ?ofXXXj !333gpiݻ34`ݬZ8Ə)((G 2.\ Z**Ub޼ypeYqg~W9s u%<<VFaҤIl۶4.]DPP(1pqq!$$b+V0|y&JbڵDGGvZ._̘1cN:̙3wwwO΅ زe[bP Gy?3C ~#22pqq!!!x]FXXzzzۗu)a߿L%oߦG-r`ȑXZZ)sU_\m<3g`ر:eۙ7oѥ33fԩSxxxp1?3m4_Δ)S:t('O|a}^T[y,DZ"66VK^^G #F0x`HLLdJY. ח%KЦMX|2L8Fm۶U@PT8991tPbccuѿԩltڕ޽{c``@ժUi׮2RJ̜95jVڵ+NRoٲKXtgÆ 7''' 8q"۷wvarahhH~x!5jS>LI`>"K=<Z*s WjbbBhh( CCCe666_oѣGĉҥ{BĠ4˙3~x”哓9s6lm۶8;;+W J F ۷sss̔󬬬wU<T_i޼97ndر|wׯHUVٳg3p@+ڷoOBB_|EW {4Ü8q:>%&&2k,Ν;rss122(mKKK=TZnu*xQٶmے+WeΜ9ܻwrssDOOOI2͛G111|+1x̟?s-'O棏>*|FF[???Xre?fKvvv\vUsYg; JɴmVRRR૸Çd3yyyg̙Czz:ϟGR?ˍ9oȇ~ ί _P^=yhZRRR9)) RszڠAeŊq%ͫڵ+]vlܸ}TWZnԨQZYW[[["""ٳgeϟOff&PSoɷ%֜>}ߟo=z믿6]Vxb-[Ʋe˞{^zj6oެȆbjj}7l0m%$$ЦMd:e4M֫&99YoIIIƋҢE v܉FYfzjrssիR~ٳ' 4SNe__FF'OdggɺuHJJRÇ3k,N>MAA>ѣ\~aF[jٳ[ce֥K=zĴi̤7nw^e>7n0n8)}(-x:ЏdӦML4˗/˭[s}ׯOժUo[eΟ?φ (((ɓlڴ4Fpp0;v &&|ٳgrUuz{{d<<<ӓ'O_͛>* U"1044Ç >ggg6lȺuXt) 21c駟ViԨ-"//f̘Ac|/P7fӦM,_zѨQ>eYwֹiYu!&&;;;>ԩǎ#88ߍ1ggg>K<NJJrAƍysN>C@ x/_+;wN:sZ-k֬@yP͚5YjUzZ5999,Z K@@v|\64F~eT3<|BȱDwWԬYS]K-#$1ҙ 9 I KO@}|$SSS PT2$ӣ@y%=D߽U>:f̘!?TI ěbll̥Kpuu-s/ HHHPn`{:>>w+DR?&=%ْ,> LI#@ @v9Nα?vgv@R ,鮮_jigtAAA]L4b]֤L&-tAAA]MUUG(HoP,7> !!vEAAA.UU)aj&h9bt (e{I \<   "*ҿUs-|' $I C,1bV$65dYw]YAAmȲk:Ȳ<<9..IeQUmn[xM:ks9o3+']wIsi;Ƀ  4MGUUE9ߚ#IC4X,\ -2Y^MLfdY&o6fa9FŝTlMշ  TU$L&ΜM) AQI:qx<޽ظq]@ ӧey;[0h6躾@d&9~7od2:#ISSSOr 6 ñCiZdzOHkݻEgg'_g B~ "X.AK *IH$ $I`4ߑeE˖-GQEyfiT*hDUr]֠Nv;o%8SAK$A6_]wg  X Es6 PFff?~8NR_%xZiI]]-HI, dYbsbLLLRQni<+dY`͚vmr94MP(`Z l6Pqb &FFF٬Q % 33uOXv M "I2M;v}{ɟ < Br-hzYAbE=Y]dr[wtǏvV.IhL&d&ffL&T1{򠮮Йf.N]ktA4M'6l099wm,+o7*n`ٙO477~Պn[o=X>gddv*Z[[9v333H$_322sϽ0r3.},_%KP,{D") Eٿ?_e߾}LNNO<86l}3<<ߎa'?:nVv(lٲe3ӧOazx_1::Jww7N_ﯤNˍ7P-^A.%}Lk;]H$²e˱ZF%^d4Kd 躊$ җX,`tt,WwNx<9 2_X(z':eARV;L:bW^šC\s5 0<яӍ34~3gIShF2W~zdYqQN>M:Q,rb1n7 ,Y7¶m۸/|zP(+BX㏳lr G!'N`ttQUx_`L&S~$͠i*|Y/0KQ-\. `jYv . ƍzFjkk(RQd2* 8<7nP,IR*NIX@$L&EQf3رT*P(*MP+VpRU|Lf|>SS4xxXj%SWWGX`x<^\.̮]pLCC#,rJ.GP(j*t]cbbMػw/Nbɒ%`Zxꩧ=b1AA쀧'Uո誷@THX,+Z|]:gWZ` s4M] KLF, fql6+fiQJĉLr*t*_ZRf/*zd2YA***غu+W^ 5kְl2"---,]zzz0*++Y|~Y:TUKhll&Ik׮6&+XjX,V^ov0S]]ad2 dÆ466aXhjj˗QQQAMM5VuֲqlٲF:aʕ\~\.+Wd2QYYŲe=7ofݺu,]JWWW\qVJuu5۷?5\Mkk+*AA.=211`Dix K,S(cll@`͆d^0_6%fR$"ϙ̠ESSr9l6+<;0t]ՋMFyE4-Lhw d0ʣ UR'*ii./( ŢZ~k\u@XDQhtJeb$I rښ6P(D0bɒ%(4N) .K+p^7ME>0;*,(B2ԩ(NA$ir|ǽQ?fki:B~wF&/e0{3z(~l6+55= `K! .@" "Ipaf\>u YDBq8 :eAAAR:p@ 3E "AAA3rܻ2@7̾MAAA $,opsp;,{du XdY,T~AAAù}\RTU`0xYzu:ZI<P[[,G$.zu   n.IhEf3ǎ#͖_>00?l۶^Q$i6n_,OU+fqۻ   »9/ʲǹ뮻8r333ÇzEQp8***.|JDoo/=˖-+߆ /rxꩧ[M6qIN' dX,X,f3H$G?ݻy9u~;NEQfttKRUUuʐe뮻я~SSS<#ttt088Ⱦ}PUU9u֭۷AAAtvvr̿]42 l_ Qm۶|EQY1Lr9<$yfl65557 >u]~|Sl6i\Á._me-܂旿%oxrVt:d`4rJKK g`?G?Qr94˗/|B`0`61dYq\AA]b*v;Ӊr7iSSSX zc4zf^/>*z!VXA}}=ccc+^ WBuv;uuux<Efvټy3}}}{\veR(xϫ|>,ҭ^UUYv-D;3vJ?q:XG8ĉz(B]]TUUQ[[KKK ^{-SSS$Iv;^HX_f˖-   »D^E"BP^eY`0H$8feXl0( L& t<]*jb6QU /yᴥQM&T|>Fedypl6njeg2\.Wy2p? (/|t]'͖=b6ux<X,R(χ>!jjjp:MGAAAx'3@[;Υ^^8[Iz+Ϳ2Ug~ϵ,I( ߿+Vp8   rR0ݻPiDkAAAw7C6yAAA{~    ䷟    oAAA tAAAA]AAA.s ;AAAK*@rLNNb0\Rw( ;   ¿ F’$jvW-P(`immEu]?gY4eMS)R ]N4R]]drrl6[\ B8N$`0H<I&c2CeFGG1"2X@ l69۹wAAAKW;СC?~X,FGGdYl6T ٌ$IDQ$V~ֆ,LOODQ2L9eI󨪊%sa^z%.]8 [>o޽{gҥ<y,_s=WUmFoo/?(nl6?<bݬX ٷo/^BcN8 Ku3ϰ{nߏhh4oo ( 555g?СC$I:::yK TUEQo.Me P,}AAA.=*7n$Hp)dYUUktr14MCeVX\Q&''\uUٳp8̕W^I"e˖.x4q133Ê+xO?twwC=ʩS( rijjj(`RQQ`1.rvM:&P(غu+W\qNm۶Ƴ>f#sA,7ofӦM_s,c4yiiiaɒ%n7LA^xn&f3&|EX,裏Յh$Hzj>JQUϺuZJOO]vT*jb4fܹua61K>}4.V^) Y'NJ{   > u]l6smL&LOOuɄlFh|>ri&6mڄ(XV4M#dPE~_p nF#FI$dYwCkk+˗/GuD<]X:tC*uuuTUUN A#344D4ell Á Ǐ/a2 gΜC֭ѣtttPSSP(P]]Mss3(B>K"`AAAtIH&466xPǞ={PU}躎fQ__lFQzzz8qn:D"455a4pdY.?+t:SO=i =dE"ȑ#r9(---ر"˖-.tr299?N8 f'|Ça֭[Ǿ}ʷرM7D[[9rov&&&p8^шW_%s7b FFF8r]w6l@u^z%ټyA?{#/9 t   ¥ED"9ץs]]8 8ײ\ץ}ZU>'N_l   N.8HفtF?<{xΫɿ3T   OcXPd2yrщ]AA%NXAAAwb0AAAA]AAA."@AAAKAAApAW}b.nHHȲmw:hvpm p)PK"D}{ԩ  躮H$HӳAd6qEBg`tb4r}#2VI*"Jcr^D"/C4;VH<y&Se+۹ru@:4_&!L^7+ \.tt:,:.[ID<'קfSAw9tIHEjkkߑ +uߏ(o;MM8***v^%I" QO\.G4dr20;u@ `h4,TS|o{.!IX_pYeֽ3J$E!˽"dʋzr'IX,-/ī(${]Ni&tAAr9L&92LMMa2pH%I"Jf#ir9 8wdf3@`\.cjj EQpH`%I`bdz|JH Q-*UG[%ys]C .O[BT]En!S0g[6.w7 rR "dYF UU$-]!]8igffp::udWe$IBUE+RSUUի`(:YP(`0PM$av u} t[u]?AB M[J^-4 I.dJTg)t00[ OӴ+:i K+(YttU"$8;IW_#[̢!K2223Fz[ؗ5t`|.*1d2=9[>x\L+=.100@gg'6Grhll,v WYٻw/v˗{]<==ɓ'1 466R___]X=zcxx 6nX^4$.5kzul6ˮ]HӸnVX(/P(Ca"LrҾZAA ^ZPAvsof6'$N/zsA\l6Ν; ϗ@(MI(sSzFG-1!ؽ{7Fٺ{+2.-\UESfh3fUo㏗1A+ڌA7boF*L0*Yi4j+M&nW7k}k2U7/qsͳyq$~ 7<'7{9y$H|^{T*%J9~8'O$N f9v&N 9v'O,_?y$gΜh4SOFJ3UUBo|B>( F$p099}0P^xCQ,add>5_Aw)_ zX?~H$BUUmmm|N:ɓ'پ};\Kyi^y+󺮗 =07 ㏣( ---lذ||.CUU9©Sxp89~8*P]\e|LUU4M+ߺF\u}*ΆqXa0>+e;&L|+O =Z?ƫӯ2ƦظFRBn?M7sb'k;w0T4]co 'w1{10D7{g@͌Nh4dfLMMlr#2Ì|r^}U$I̙3\}ՋR{|'}'IcccR)l޽{Ї>hVUK|>n݊`_*c``j` +Lz 7܀/gOJ؅֦ib\X,F*io:`0ȝwO? y4E+`֭R)~s̙ ߹ݳ%4d2I<'fJ<'L˨P(; t]gΝ|gxxH$O~~s[HZT9Ӵ9pu T*hubm蚎Sq2d>Bcm\Q}lbe-ZQ^-l~]n###J[[Hľ}>$BL&tttҲQ\.G6E/=,+N|رT*U]uRT* J/2`GH$ux<Y__ڵk$Q(}}}fn6vKAA7Wu\z==w7LGG낺srJ tMTTTnPW:zԧ>,[ϗf6$Jzj>O{^Yٸq#---B!n4_=&InrܢX +X~=fUUq\aVg[edDΐΧ99MC=S{t#쳪s''9;7s4ttL+gOhWϻ|]Jgd[$ڥ$IZ򉴁"[JKW\8'O\.G]]^򴥻=t]/"0ޞX,Foo/333\yȲbWmwfzzb͛ x^hiiEQ$CljF266F:f޽_MQA| 0v+եg顫sM*Xob2pnMӈFH9g>dY.ʾ\J>-K $˜H@t( B} i(A™0FH_33Lf3:'gGeH''t0HMb^NNFd"8ְ~%.bok]6 ~"t]y<˷{^QUAkk+UUUx^l6f&) tvvz|>^/VL&B\.GOODQ4Myu]>K@EjjjY|9K,!YlnH$fo_f6I$|>nfiii)αZ'|rl66kR]]M**ן$I$I0_  R$yQ$IYN\* b0hjjzK_0sVfY0o@$h4J PYYy+gJjhh(hB@UU99W=W٨,>>>fd_{k<4q~; ih욮-Z|pY%mums'0J#k^&+Y?c>446xroo$ih/R/lW Γ) .xv]؞fm磣 .]{7sWQI\K+A5kNJTt})_%IbbbZ<.ҋ.LAA(;(\~w'Nۤm9D^,.B>l6/:p5Lwt+މ2.-^'NsE3ʨ^ŽG$fK?^BZ$IXU+ozka^)0K$-`~a)utca}\ci K?Iճ7bAA8s^AA^*z۷IlvS, yd2S{,l6N'TT*VoK֞=qehVD(cӉf{s@"l߳G/3IJ,QUKau``\K$zul^L$F8邸]AÛӛu[d/4KwSYRvIuT}wzAAw7ww%e\̠FG"8AA?BAAAA p[    Wn|T*u*   YvɴE$IR)dYrOAAA-$@ d2_I[z{K2$Ja6tz4 Iʷԟ=ro3"yi"~t4MCKuϕG].|AAx37~ -\}y\޹]EAxo:W?Kq}bRF-NxX,SUsQu$Id2, VwVc_'N4`ժULMMq=ϒdhmmg?1TUU066??B,8pb}Y~FGGYdI=O=?O9r$Inoγ>˪Ulw}\ve:u}{azzzBg?^ s=< ST {X2WO<tvvrQfYd Ng?/:q. &''wk(~yz)FFFhoo/˿ |%K0==Ce]FP'̙3tvv255/~ ^y( ?dϞ=y~anVZnE- \8<O=tvvw]t]Ǐ]vt:q\<w}[}뮻Xz5|XVl6y ô( s=KTVVbyy') ~~_}vhoo;v6V+|[ߢݎlh4rIN>Muu5$fQUuqE̻l2>055fڵ i6o[oh4ʕ+Zr>,CCCDQ"T+իW311?8p@y###|>zjjjsW^y%.I^xr444'O$sM7cN:?G?Qx.V /??b Jsssz|#aڵ׿FUUV^(A2 < gΜ!Lr\uU,[ gejjZZZvf&&&4@ @oo/vǏ{w|>z8N֭[Bڵk$ɋ]̂ %h4ev444Ê >|r}QdYfݺu$I2 `;v000@6%i\s ݤifffذa_~ydiw}b1֯_OUU;wdϞ=ZVV+7n~Q~aZEah?ϩS}}}}?eΝE eYl6 @[[nftR[[+]p,[ MӨaҥLLLp8蠡r/_jW/`8r[lAeo_Nee%r+eazzgԐNZttt(^A]b ^n7555徦FFFXbP__-===hF}}=<Hfcrr:\.W9n, MMM\.]ױ3221466bʷo߾UVQ__i455s=C=fc͚5q]wFف:DPW_eǎ9rD"?0b$HDP.&&&ؽ{7nݺnx<^`q_d1L|(Wz./ɔ={/g??A;F"r~ʙ3gr -IR|f188Hmm-{ذaǎ;o fݻyԧ>(*-T{M7ݴh~IBڵ^{{w^7̑#G0 ~|ӟ&3==M6Euغu+ǏpvZ>366F8|3J(B$"PK/ĉ'صkv"ɠ( ]]]\}\uUn? |d||\.GEEb_;v C&__p8b1ZZZسg?8tttuVBlذUUyػw/\s5sp-k.r'OGahhk݋b/fvZjkkI$xA~_ri*++illѣp8뙞Gunfl6Ei ¥/ |+x]]ccc<9s:뮻pb1xxꩧB,Y[A0d۶mi:իihhcΝʵ^[{, _x[Vx:``ҥs W_}5>;v066UW](B{{;< ?ٗ/ɐef>' rp8$ F#BX,f+&Ney MHR82 p}g%N|XVrP``0:dN>' a4fSWUχb!cZ'aywYbi***cr[ʷl^T*dbjj UU1LKT Պ[tE AAAljj ]\zDQrtnAAAAXx|]AAA."@AAAKAAA tAAAA]AAA."@AAAKbgB&&&Geq.AA)Ά  hmw[Iٽ{7'/8AAIBy|sB eop 7 I[Ns]]]|_YA!y>Or# O~AAApI6 y! )zQbgEAS ^@D"k$q|nb1rUUU;+ Q,~MAU<333133l6*ic]ϷvKWv; c0hhhAKwAAAA}!tAAAA]AAA."@AAAKAAA tAAAA]AAA."@AAAKAAA tAAAA]AAA. Os:#NrDX0VGfaM%+VՅ=9BvCg}T[j#tԳɱ{NԠWM2Ul63gk!`V5J8Rv䯣yiRdCg6`C&ƭ~ -o{8JBE{(fvVdcrv'xa}z;^Wa긌' 1%nUL^LrBcUq/웡u&ΉX#>6WX m˰:߅R" |?+r\ONaQn"b9@@sB\vbL)LjiG\>aMh%RpյTEn+';IJv7rbNqVw`|{ʚ~RM1iXq43HdSF8>ngM_eIjpdw( r΀썲n\UTIlbֲ21њ`<6'p>gBgbDBդHDLqidtC+@q> q [t4ni.%8#^7aj1K1.=Eh}u2>V({IUH6e"lÞ 2DWӴ\>z OA#kTΨ$g^$t)x֛Q*ƑR!nz}TOXzJ5Rd {9Tvsd\} IVIX,=1mulJ٨MDɻ 8LLIJB|$`Y)R=*zoT|G8uSQRjseWiKLQ2l!؜gv;4 "bWi93YWaCJb ֐#Fq+6#[4T6=&FA0@^yl,ƀnkpW)Lu G;{9Rn݁iYj E{;Hm'8*J_)bF;5) -f1T9M!ƟJ21Vά.В˂h%158+FY}tNbW!Ǭ{S=r/#a؂MͲp==AXI1%o`VC&SJqb4'1YvWt-3=hȺN ӌw`S׾%qz9jO1FczZC Hk0Z9?x G ['0yys2c/6 b=X#iVX՛#fL#j]م{܂Cb1X1L.Fl`ib&i>{3= 29F}5(4Ы=B2yl?=qp%ymi̶H/|-T# YkX0I6z i~r*:bSV c0xs)<.o z͇FQ9)BfV&2s$ڲAAٌ+BF Ka1یtGXE+H%]F*[VL|XF1%8`2L^OGNQ#^hL1HSzOՌ}Y/Dkaj3adQ'L KʹWc\5b 2wQ̡)v]ILFƱIf4+F]E'G5F]UmD^Uj{/@rOcO5eMpc<#Ԥ[xԖ݅pLmY:s;^W,~h:-7T9X:~'/U}OstyB0YɝVni { [xD'GPn67^n+4+'Mr4[io/aw}+_n̖Y~f%!V1J|ߔW{zH\MqVg%|p꡺6jo?ckg$dD-/^\oss,d;Esϧ"Gkohz?Kw:Ȩ6?uߨsXmU"ԿeTn`kdȍg.>!x;}}UU=~?J&&ϟ__1m38XDÏ—sq.^h/s|rt;^iI9j 7q^0#;?HE _U9+ÏH;[އw'^DƓ9mnO,IbiG۸kknqRsOx Fi;,Ouw1 pS߇b"dKicntjM#FOy3F_*FWg(+x ќgKyV;4yVeH=r+m˟f<LYݵ|led8tsl۱hpZx~}̑\4UhɯO!/~a5;x 7F}/wߴ/atb-=_?KW2^FC~S[/z)^2l"y=՘0me]׃t}{=~Ͻ*'o ?l}_/ ۾c׶ q"+tGX`㴣3}A^w8S'x~yu{Huz|s U ? lxx;?ٺUGvt 5s!5,hZ.?}Sc[y&}uam4N`8{njF6LNxhũĸ1*.cZʿ>ȞU0bRϹy4x^5>I2k47nj- sI;8u>N`Eۻy8bOOQd/'Sjǩ6'& UI ~e;{O^z=^1_qMZp(yhL{--q7.cg-\>1]J2v DfMIm);~p|c4yqW8ݸŸ>D!9'_'6ӧxN0S>+l%ck빣~˼Oѓ۸g?Cq)0xݕ+s-N)&N?S`]&xOjz?Ri;cOKӐPISHnwT$2W=>N|ܳ8}DF鏬"'leȯae$0H?{-ݶ39K٫1kK 4ncO|[|3Ro|_'}>qY kC aDͲ]|+|L+ ײ8J(~_cjTv&G = \-L^G1+_TOs)"? l9ȩKҺW7bղ-,= qKn;_~gS|j E^6qPʄrh mE*3N}@^'di SL" 3/*\J>VC(đ&ƍUotIôǴp{azD5-6-G2;FK?u^3}Gn7~b~=՜ltrkx}67;CUI4s_ٶЗHWy܏?Tb+d9=t%cUv>Zn ߏ\ͧ?H}%6pf/~+NHnNX[=s-ʄMCTGDo;ZjVęZV)"_τmE(`?-p\OJl~?gJbu ͙I'e#yR/i>@@='m)1H ﮢXblg;HZ >[Hz¶,?ݺ=̒8?kʟCoCր&3 VKWvdw9݄yx3S|s ??GG*N*knS==<& ޵Twp|'Yo؏3W(\/5|ja6>p/_,[E9CeҲ1|׷A(2r;ywEIQ@2 2,(wHȲ"t"!)쟤 ϥl@g?˲,Kiȳyn Ef0 )l4`ߒ$}Og瓕لϭl a64hZ IRdEL7;4KȒH"#Kl$2RNt$0[u&IF "(i> xv=fn.]E.$iv֡2[vi2A]?$e yg1ȳ˖nHsT2gABY 絴e_fZB(e ڸ>WO<Ey%e;64NiX(s\#u4m]n(}]y_$>FˇmsU}77}i<=K2ٴm|n'Iv)_VfrnWO-Im]bm Il;(ȆRPS-R}=}v:׏\](҂}}2D6ʂ|ZuiA9ɹJ#t< (ܶ,l;P$d]*<>)uAre~_wmoc\+ /8Uo>I'zҶ+2Z$46+ׁܱϗci5v1[vGJ8vK>ua9> #$}omN^p|#4Ͷw/l?i}WY;yidZ_ ܾQXp%I4~Y*̷9`|/q,sڳ sv))adZE.#XG-<*Iooc ٠O/ϗAxPVrZjܾr%-jË쾌cRW/y^)WR[ʻo(6D}sǼۈAAAAD.   7}{2yZ[[Q'O"2HTUUFIՕgll6*++/z   %MdL&b$ ^y/_iii8x ǎ_2G???r@@}U>I I: !Is,:sM0 $I_F׹LH< qvٿKH崤rR~/&~##-ʗ^z`B9kT^ zyy8?4[s].~Eϝ穔qIXj7:߬ [gҲ7r{FѹJ ?A_PȂM\ ٢b]P&妦ϧqVgQ~_Һ.heEf:JmWs~gy]9 ]\y;XP g=edVVμ`yW|A,\'i>ca-.ҿt]=Tn 58w}qͯ^GZXzyR#(7iQ[R6uzRW柈+mryMrV•Υrvj^*I_P:7}~[^J( ;(_s}|u0?,4ߪ:XA_8Jm}a_}ۣ,}Q],-41$ia-؉ץ/rsVK:ڂhs<{/ڢϳmu; -JsNuSrL*ͭ>d~_40?X;tvMZe^ϙamT}sۀTOr zy6~m@5 '5yw'~Zŭ]ZоKHZpxvSg.E F_N}4 .˟mW:C:u尠|]Kh,^XFs;r/ul O167w:7 H+|a^sx=zX,Ɨ%zF#~6b\D:638r~/| yB4,Ev;fU$݇~3^Hխk^}-b|pFoOU2f5țPtau+d jd EXm݃#SdZĤYJ_ߤ03vpz| ! iGp` Չ$qĶ+]x 䤅[_`Rt+#؋YvWR `D NJNxibBwxyg Bj]K[zSUL1Ջriτ /81#dqQDZ{Og/ްYUq©v+qI]0M0L`.a򟷐B[iHD1p ;҈f-LX*L=*G=Ǘ2bF29A7S+d5ɓvSy>=3sSQ5#ѡU<ڃ ݬ 0_BѪbi)y*Q"Cx~Oɻ*{֑/hR9j ԞB&_"!5D%FU+!+?ȤK}(kLZ#Yꄖ SqV4nņ<ݴwg1 -Вf4MaD?,hYDq md]F]q%Hh$|j:USJ!jNVaqptnQc.ܩGڙpC96]y#FT`BStƃ+WP1*N9yQJ1δJ^z[*i 2i&-ΐ1huMpT!I͇p ӻY`d3ݷRMT0Wvf{:)67$ݻ1 IBnZgt*^J^bKkWq$td YO4uKlj9 XG݌[JyP{ 6Hu>Qz/3P 1ҿUV4=pՄtI6 8H+nH8n$NQšWN|)z0uD t=Op Zlk!LzmHtb:Hz}?0$l%I+r;]կ=??̨W| qr&mAd'rJ7!~jxhB|TH8"rWUb31ϴԹTd,:}tdwr`:nkz~P` @bMq [`D/aXRQ08m$kVFu}íXQ Sطlkw$%[( 0H- ,;Mxl6Sqzd{ZEǑuL؄(}z scNb3-d P%bL6gSX4aL9NÐn4Suӯ^6D %lK3r~$iD,U1m 6fÌ&Ybl&;fBJX)TG{P:Ɖ4g@0J2쨜}pV!~fc}1>)c"Ҝ3du)o m jtz1Ƭ~^I\Kd%2ӎfHqiN]dI KM bIH&mU\男C~RLq6']ˣ masCDdb!Cowp̘7% śh-`8h5^y08i*gEN: q-xQW_V'R5L59 SV|t@r 0Ԧ6z&jb2f ̝btt~TTTP,(#L&EAQtou'$rJĆQs`x`7/ArWaqwTZG36 $] 4B誂1hhIQ[BVtK^%&P2ћ[ODdf"KHND w6K*љ#`WYkg2]LZF\=+BɴFcÈ>Ù)Y()Ԩ\$&*QZSSqt#X]䨓&Vf2օQ/2:4Q\,lգؓ:a5$,aHM6km5xyY?E͂'bI0QL rƈ7"ر-cLFm.c6RZBF7(E&%;݀dz$r̰ǃKKpаi'_%0)duX\AU֣'x04ffьfsxsJ_ġI9mਥ|Jgf56> 栝[8#2zEљ%r-$qXD(*S.'$mDv[ T:+B}ZwRUWĠi670RGe:3 489B3)J j$ckIuQlƨjHd:=5.tESNm݌{\f[$k%N3VYd^ZY)y/3X8 Q,A3-*Q4i'3qI.25_;ޘF9Dá5hFq$98f^$TSu܍#$UpD](M 8[,& Դ%8L8CTa !c8݀E+j&FSnɝ 2PMbg|`#3&rvd+''GJ ` W7C. 35=Fe2.xvRD5^|i^j[L2$ 8$6b#np=3GcLnT5QdHjSLb 7̘Kq#o\ʍ!6Վ_ N+8HM1;).QiTF5)՘|2.@vHuZY2J0NvSphd"ߌ:Am1@RrNՒ l"f33c7ƙnSQLyؕV yWI2^!`RL-RњUWXr:eG%8QXNh8ESt2SFD-*'j3X$\BH? N%Paqe_YmaBUO7f4Q]dșe(Q ێRVLhLUZd߂Ee,ÐQ٥?$Y#rwOhǢd.(2"f:b{^RQ;IBtO#ǫLZ8a2$>xT63؝2V"whZ:JF6؉rGo{06+k1A?fJzF6QFLN 9Y#UN{M,UC&HŪ'L: a_",05:*{g(kwO I#24qzrZ$j.zNcH!šn1Lh":};snjH{#c>ݧwJ3 ϲd>cBβ66stz*wS NƊMuI㴳XC7ѧݛ`)ssrȽI4lݱ g%.{FKJ/1kH)8GNqqh$9I1Qv73ȑtηY~w3??eYC=se.]ĝw\ ^{5{9zsssv_2%p FHae_ 23W!Ht0H1˯ w֍AR\A4HxJ y*+F\\gKpS!7_z厮 >/מ6- c+_qqVHoN/zY렊zPr,ux{?gAU``Y逩nK=7.LJ>i8J1"H\Kpq@C<66B l,AQJxu^.T`CPJCخgw?Gtp3+_/9A*TA  zM{> |wKt~-I{ j`KxoG,l? :ud$=@?~#rC>?fgc^TlCڠY ?A 58P^b׼?53TW=7Qt{svvEPn$ >yК28TI!<{Fףۡu| ڇ5p@ynnQ8ޞ?jz, CG5TpT .J f*?883o*LJ8û?,??K/DP{yӛDٳs=} ;s GYZZⓟ$ӂ"D!B"D+۾9~ ]}{߁Mx{{!h ”koB2#.@ Д{ }=:%:C5W4h4$RhH)RC]*w$BW4:B_uW"pBʟ'⾆Ghoj&$H &$!ݱwέ!]RHtʯ T:Wo[CJ.@*5Iw )RJ$5<=JԄUH$:p(DxIE_!ѽm)htol)k]s@V]"w^%uZ0RsׁB\+Q~N$h]׳Ώ :5͕OjH\;J B 4CURd3$ ~b =n Ms1M_ IDAT ^ʍk59Bˍkq뺤pכ tn2<>QW:H?ָWx> ~<h^\%>t4 2y/t("k_|a+BJN4|_" \&@HЕ E!`kU?hB|vAI7nKЅk777/z0l!8rA 8+%<~hu$_. "Q+t+.\ 7Vy tK5`##4mCսix)t R*4M:}@|ׇE9=]׼Lh BJiC\ՓGuMyH<]*w,ϚR= wOϞNh=}jCqchҭk}={yQdt=OV.9En^+ƋeIQJ_BU>"/wH71szy_j}{B6"zs=x/{{1 xZlyBe%/G(\(RJе`H7O E>VT㪗@գ^t_6#!o:.?{ J<~WJ})/%p}={f.''CZ&ΟJPR4;I4|YA>E`EB &`Y8 عǷ+t˿uR{#\+&_X檝]r=f|`S̼"44nNX;eG0*Q-D/o(]nubZ#@IJ;Q5i7 ߡAq gߒm Rm J|a.M+lT^)sXAjN rN[ù5zvF\RQtDFfG =Eξf_f*${XɯS܄}Y OV8[^n#1Ymh(SIVxN׫tQћl-Ő-(|q`^dk67kYW\l,>M $gyXd ^< hҪ.)7;uQs}8a5⩑-UKMoq^9NQѨjqLMc$R"BAb_Ryg_k;4{5 JegEFk":1 ~tsTAz:7u4ЗMD,k9PU+ uniHEsMLbFg%*;<*.3ըܲ=ROv {^<_OW v;gyJ!mVW`Օ;äha+4^\y-e *+5yoda2֮0+lƋ{%ʹ j^%kp*,Iu*}?oWYtK#x`wkY6i`B Ee3¥|ծQɆS s\ߥRjbBD7Sԛa&Rg)^t:]\8maBgVe`21RcAoҨo-Q쵞gWcn:bF̲Q+Oj2r6*/S/( Z$M9arKu* lXWՎMj6Zӷ>j1>mRz*fJ?DdwD'SP:v"QIN0UE]FJ}-G0y}6!Zd%%ZAH\Eޤб_2޶ٗ%VkO".FjaL)ctyNr]kuKiŒF{E]͛gZ4u%=5KDr#ѝX+;FE<{ƈLaˤRk龐$z9H]&=FnQjټxksWR4ZMiF>QCO(ζ.ild#WI\b\9}3EZ ڪT*FFF>ckk=Dj3n_7ae=AoIgU}W {Cۛ58=`녗jKx}C=AOd3q9Sp {MIu;CrKCIgs8.)/%Ɛ~oˠşGHwHzPcD=~#A%&=q}{0np+۳ lWg7\<}  q Cvz}OA_7yq!jO|zOrm,s;.­v nn+àgz*y oC (㷐RZ'^У|ys{ MPʻ޿&ej^ 3?_25Mxz{PI9h}+J92/e<5[g4OR?DD;H5'o}{8];w Ջ-ND ~ g6s| =A^=z]ǿ _CˏR؞M?kdWA?O!/1j^1dЯ|Jp؇߃>n^b?O:|I zm3c`->3O>s_<*NɀA~thNЛ:_G"҆ǂ WEo/}&A/rkwP|{|'?Z&Q:=1ߗ߾@Ox'חz|<)|?:_;s*!^t@0w84{?A\%x^ F sr 1L ?OHs|$S`_|ÞmU>< A4ɩ'"D!B"D!m=f-D!B"D!B"D!B"D!BC"D!B"D7z!B"D!B@x@"D!B"D!!B"D!B"=D!B"D!Bx <"D!B"Do!B"D!B "D!B"D!BC"D!B"D7z!B"D!B@x@"D!B"D!BGiLx!B ]{c4'N5i,8V"#{lhCXHd."n%-t"QR&Ի38GZ9>5%87NIf[%Qe!#Mb]IxLJLG4j$5leA!0DIjanjQFѱ2DmCg(qفc%Y6hhC2QT q"v0c D-.&B򎫌 7'(Nm8[A65_R?W0]a}!Ƀyz=J!''7nPi-X<=9%V3pGS:;$HNp8{J"E6IGk;Nr$y&2ٙCe:DACЫM(xR"S6نȡ[ wh'hf%,1^ً',퍳lމ2tFd/nB;A64c1h&9F\/R:!7I6DbFF1GOFZds1],Ob-1[^+z'!ۘc]g&.b1(h=JԶ1BdtDMW1b1Ӧ\ i3^7..ccOױ+ctdrk1Y#4znv^"'V줘lA?J:M<ڤ9ӧ['uUg4FYʮoE/FNlcK(G1Tb9J1Chv2hN4>B.ЎEjc$SZE-sNj?miwqJ6S=4ÌZ-VF8B$7BMq؞ӏS;e"KIŠ HV#h "eh1V:9:6G/#cw,;LW{4G(dLvNkޓU73mz'ĻЯOE1htT/N5H7spݼr8F)1Fc:)ZL1E$1,=:)AQL!LS=ډӕEm1gp\yf Mۜddvjo-R6gГ-庐0> ]P[SfH;Ƿ;Gi 3IJ dRlTi4V!6g)W S&7%!+S.BF (r3ycJ4ɨ64R6`rG:k# -Ti흠0\g*A+A3d.*cLY܇P0OB0 b3+Q(%iQJ쌣: t.F2)LU ucA&h}H5ЊFi:FxIyю3i'(*mL 2%rrNR=`D/aKI=[Q'f 8jD3w +a1_8$Sh8 n IRo J;h'%Jwh&#LvB,G$ӍDhw&2}2^ԒtUg~m8=fv #*Hq4r''8W1*8'3#=M3T= Ma2 :ǪЏ(M &; :6>ʑlgw83NfoMaf1=h4.o#F9F"%\%OK; `>קItdJ%ё2Wfp8Y)2=CVyN Ƙsuʉ=]gӧјc_e$V=D=^ Tfˉ2Y5!Ӧ;ndqJZ *OP'ή6{QZ VL0k3TJ'8FeI;Azr2#,-[[NRI`Ggv(UN5`9QE,Q)iLrq$)G,BA+C7ᐳDZ>q{so"LD%Ci(# X]-rKc,뤺6)O+-?zѭOӶ3(3blY~iN7wƓگtzD.9)sST 'Ar3HEts" Rz'[)zY*ҔtDjq''qXqqZ'Jݘ`l/Bs\Fj&#V"B1)5Nj#TI11EUİ+e(;i)ϓHT1N䱛YtF-ͬv)f;{? e/$_ʭ[,DB(??O8$G16=ݯOsG*#Ӝ&Gru{1,xS${.ȕËt8u?J|o?awyz_?|oz[(tt49::יa.qFĈrg 1S1 ~CU|eZͳs_jGb_a] K=ʕ9oo]5㽿K컾)œlop~?ğ~_KI\j5rډMN| wػESKQ.1K.Qw}(Ŀ{q< _T_=>0; ~|at_MQ x܏?[=Ͽ1_aw,C>N'~Q~?߬&y.WY8|so0qnCxC<˭qo{ ȋW~?*ѯK0?|Mk? >Gߢ5f9g1R'W "]"\;G:l™Ye!go!_~}?}%^='ɇr3GY}Gxe-H$syz_羏w9'>Kxj{7{ߪK:',H>C="[dk3cD.4 ~枿\v⣟ʩ\F_?QSUS?[L6yn+Y~}◱r4w}ER{Η(ih*$??E.Qz~Ƚ=O;ocbz+1i|<ǟ`~/Mf&n1_mSX/29Ε3ݏ;YCWwM=}L ~_|z@~>5ӟa6yۗSz{/ڧٯ]?ߘ;KG򵷱|8uaL|Fry8s$<=Nwrs|G 1ڕn}zԥEC*O}/8k|_9Lɛ}| 9Y^}y^M>xx2>D}Nes*{GywVn~g~:{~/|;+OWv#wf9lMpCY-;WY؀ 듿JnML+Ǟ|w>{6S%Jo+'>v2W0Lr_Dw4?}#1\!MOf٘c俞z֗v_便o_<ֻL ~}]?w/.?%%'̳c[)̭ü2}|lS9c{;<7;^;~(!`NXSǙnr#_f(Z5?%n]XD>U0#QP$ٹAoqu/6*Vu~Ow~2w=1˟)lr!o2֯x;)Oǿ\/V>G_wJiWor3*"Ѿ?>S>"GUOrzʩ4/|_D)op\ٙ{O4@:Fa[اvxg9A8]~^rݤbzdS4l3gN1bm1T>_Opa%PNϿL}[z`S,{H+M^E.o1s+z3w.x2V;},n(¡/xx_mcOҊ9wr0}'/Zd“_|;񛳼{q>u.:Vʅ}HØGx_22W+z_?Y>\>>G TЯ|0[,m|]ynxk >*W'le >zTߺ'~z|'%lf'y,!~~O&__d{x36="¯|7akD+ .X[/&_?Sy&߹>fշt8Кt\8?o{o޲NI1'KE~Ǜ^ǟO'8#ǖ;57fIG{O7N|6io9_?ejL{X o>6P5MR/+3G^6ξS=n=?Jlq㬴߄UGf Eg>ǿi~љ3J8//|uz[Ǹ;Ex뽟<~wGO5楇>~ڂ|\]ykr?~9r7o3"=ibsl*07K>DʃkeǨœor)f}Nқ ~?Nx=^0'rNE sh ~ܦoϐZj0 [59(ww!:c oANܮ~B~zP|[<-^·+_\d[ew:x`oԷzo?8R9uvev<5sg[1N;}n^;Lf;_ 0j觃f9Ԑİ*#h7w@C*X9ܞӾuq@gñ6}:r ymò tùvXo5q{n:9gmrm[!?;ԩs0to7!0ׅA8j(v\<6@ m/< ^׏PHiyq׋ҝrC8\d֕Tnik(7xJct8]*P<-%J uˠ Qx@:>r?KPp9:d* ?f מU#ҍ p }/ o!yR9 !? S݄WAׯ'Pe }[r_+pP|%PrƪS{3 `B)/ }z}Otsb^?W:~c|b??6h8Cš^V?w)ù{pn8BCgM!n)M90 —1n~}[re3CIWʥͣ|a~9“ch!==`/=zҼ{(/NU︯kCSy x* lܕcPneqFsl? <}Hoq Y!t4e`﯆ ep$c{Cy_5AC:]vs??`8#nxbPz}Ja|(o?{)38_5;'ZWd9CzJyVp8:k(pPbV1 m_vU~~ J)N8~666VizT*ŧ>)DZmۙQcyzQ $acGkh秊KQG[E& ʬMs̡ FIm"$h1Fk@͜kwв :YEwqէ=gCd2vKC9F"MP>CZ4.6IrZ5r&͇6& zu 7Nb@;c:QbuH'}sݓLwthvnNbQ-@^M3@V9|~֢( T#wb*!Sie9#D FZg8Q6C]Nk4n< `y˕7s.ڳ]IK!+w")%2l'5#lBB̤ӚbD#I~$ (4sG1S&wѻs΋1Pg w!fJ8[.`V'%ɮE12F2K9`8C쁋\m1;F MC.t8=z f(DiuFEMcy*íQ њqZifq5v}{Z*B6VG:IE*3X3_<ROvD/iܷGcT vii>t骠W9(dWQ{3o'ڴ LXI4r̟ {m6uFH|KgF ٌcW&xebBbs,p(Z#V0u=@cDS7H6$ ԬI99=`g\N'n)${ wZK.yR[,x -ټDxͱe[.'4j GhgY:gmY^nūwY"}0Nў4(%Ӝ: VSj) cCcܦL0k`Z1&MTHXgOlvXa;:Kx8U[# hb06sHxr\*(fk6<ҩ&-nOz=K[8α'u^<3Ϯ7cܪQ?]A3%g%^C164e‰F2Jx>#я"t 0PnsI.L8č)^|g!n_9&r_}Emd+2q $^ӱ3bԖ8Glv5IK&XlUN#{1VL{'Z) t9SϳNJn6ߋ!uZ҂Cj7{ 3ة>S.ysF87z*Z k'4IF{]r SIh^~Ӝ_Xѩwp+z;⊼@**ʌpw9=U80HZ#:IGhȟV1>>N&AA,Cŋyԧ>DpVJ!o xAKaS0ƩmF֐GQG[&Es;ypCtTLB5G[jĉni*마E}Mg=#Ch(&wN[_l%Qd%rD-oI'-|w@`Q8RZ 44N0jS=ڡ;Ӧ;3!=FtmatGtq9УzފbΣ6ahaT/ȃ]%lս816C8¨w@|M$3r樢wBqԶF4X$ZST%cK8)t:Z;a߿-;(LM RNg4N>y@'#b*NnicWljdsMaݣU)+<ulѱM݇,(ų!=fǹJ3T{F$APD aIl`73 ^}l'vMU4aqIl}3m>ӗҐf쭼wyLϬTF7_X 6;C)&:S0G[ٟ7bm8vyΎsPi/ &L@?G~]>͑&S[Y95h#gxqNy4g͑_'O1L[[ݻ7#~xɂÕ#I&qJŚf661;Y{Gh)1kq;,1۠X +S_RdV1sw~DT:f֌;(fԚsLXpLbfWΣI5ҢKλ)PN+e1ۢIkЎEg-l||0fiqrtd5ÅM wX*L R-,#-1ҕM#;zpk~[)ZzCŠdWcejvҼå(Ҍ$ C{=J%%ڕX"  ǙK9qlf}.IkN/'MjT ɹ%9A'n1Srx1ڱQHƨړ(4*S#{t=J铌>bL{@C>EL+θ*s򺢞?^OhF/d"=K-.w;x^'\cw" 6˜jsYR8rd+N<>*4KEilpu0Y'K_>Ⱪwrv~GzvZsJB7kR)vm*'[XmZp=nGf(OC= N~)<*[[[ܺu 0x;OOw9ƍ+V4 jpKT ` *R5( ?\ *!d{Yp@PZ8^PK a(we<[1(+|@^W4(CKrCgX^,JDdw%Pwpk_6~V亝nteWs*_ȁ\=KB_/P M_Nyk}9^lP GP_P%=޺R2FS(_}:bȾ.|yR{'~IpAg  ~_P =z@/ȩr`? Ç|^x7?~3> B??fjj{~o|b1^z%fS"D!B"D+۾}?O|g?q@JD Dk(M"4It@ MMCjMJt44 .ХDMjRQ=F ihBIDGJ MJ5!BCWZ0@GCH}ޛ[hBG&ѤB ݽFMse)$t? W&uIBwd}yM> j+NpuHAiMIBC }? t)ʡcH4jR ҵ# !u^ʕAt ʨkHnD4O/*"uhӯ <-sޘBD\Yt7_Io)t;9R{sH݋ {qPq9K_r?k gd[\&]&5.A <~hAә.$Bz⢒k;t!֗Axд .jBC4 ;|=ࠐ7nJ Z|M{TBD9] W ntU"_B_ M{yӕ|oOsםtOߞ^˿?vqc ?{ BJ7f Ћ{\~ռ8SBӂ&.B?ǥO`r[:.qcät7,O{.~֕u) }ޏ )<Ե+}kk\8?(Zۧ K<7}5i;Ot{^ݯJ ӷo ehyPӽq)МD:x~v? "^J@Ǯ:R'"=i#^>^XJww#ҫlu'gy|m%_uc+^BA.B*/񅷧GG9۵Bz4Kgoo ޹C@Jw%Ł?_s:W-w#P9\8^FVhZ1 ;V)cg`Dld,Q٬ 1A/(Gȩ ӪKbuoQcȯt].γ;RaVnQm<,S,Qm\1Fo,QEl([m=Wi,҈ vt U m^"L%iٺds>VflbL69Vf<h .tIԚhyR"z&7Tc5;$ln-ٔFk{]XՉL\аKݡ~m{ڹy.jת{ WIĔdzFSk 6 Wt9IĻn2ҫQ^b$wQFg&[=j vNbIU lnU_u>'VيݭPe\;_@lO(}\B4n)j=^?"Vl^@tx-R|krk6fyRR%cJ+"֭yڝdYZߣXql VHg"[4 5^~٤/^lH~ +"zH>fqWi VoPl %&mv [W#o9B8>c2\_Wz-NSțerWtE^Nvkt-ڪMis66ņ$^&l\Pis}&UJqR] z˗yY VIjG,_&xܪg[ݬaYlzu]">Wؿ֡\SQzD sľκubQYcyZk ]v+5 Qɪ5"rNZRmW6k5 1<OW0D=Rn=b+[t&-%zk9J˫װiA5|dT.hwhf^b$J6x*mb.jnB-v1o)ԯCO(bsyJnQ`Ҧ[S&{7ڔ{3ؼzv۬5ꊍĵUƜ=z}]*eUEjMyR7٣|Afs K&Wv_ڧ 7GSD5 ա{5J7;FS<(R"je2ϓH {Z/FY*; .wtl2XMvTj\"kz8zN+}rV(.ڥ=*Q+4^.lq] &T*hrR5BT赶袳ג^T5.s|J 7 k# 5ulm-sI)*GG.VM{ $@YYdu:s>ƚM:,nHϊsi:B4G( qӣZJ*Vq*vO|B>fhW[ycj-Ȋͭ uE˶zf1AW^xJqYbJ-R3UezɕD{9uB %Z֍:V69+vZ qɍ|Ck8)&V٦P3XR_nRαSFh[[kA$ob˔UEQ$d}%uL 1&*Yi Ŭ]`!ah#cUvfJ' (G-8ZۊՠcX',䐑 :)f]'h n =%cƘXkMrP"C_FPV>Mӛ2TQIJu(IFYDu`buҔI!]J"LgWEzd^{ ]Y,DempEMLqDl &g_t{;`(Q NnOiv7!uRMwϘL8teBRg>ڴkhO82];M3'Ard!A*8$XNgb:N?Mx}2n|cb&{%qyÿ,_``f-AtIIt"e)r)-%ʬ2\\Q䊢h` ƻUMYU=pz}_=ӧ+3#n\56ZI:K0筧;?FqN mhD"9c2MǼD},P*w]xMMY1=+f4ӲKzU4[KxkXOR2RUa2.D-:YE[E.!^F=QTkյɪOSᬭd "!tYbr5rZǴ}NBC-1W|܁ YL(%aWc[3!}JgfIFV <)͒T#~Q\G9b?(rD;af+^@5lGp($ڨ):dE;ol#̀6S,&ژgB10VX%hYOKLj:B@>aQb%D9t)BLçh5+|b"Gƍf)<^ hJqTZ ],Ћ mVNv2@LH#BTT4E3%=JB.5TI5laAX$&2Lj 2t9D°9UleiO͑ B@ teAvaS(SaB'{ lfP>D45c&E^Wi3v7Ah=vKxk%Ɇj%!52&6]`*ك@$:ɪU3Aax;2 #f,s/ \8\|?z /_g0vD]g==COv^lqξ}7gӹ6K`~ec.==/"G{60I0\SK7n|r ypHc)lfkV~ɫa&: tgK(Yvyǟ׶q|Ι 7PU72Jun#># =Xs+0u![3'[<} W%G~t 778a"+?×s/-w''L󔼊? &9>~#ߧDzbksRYgs|d3Ypu _Ͻǹ{٨&oo|'78Կ$W|i+)}&Q&č/O|dKy;9\uc/}桛M5sS@%ӌz溸wv^/;<7ۙ/n#LE;]7+fcG#f{u n6zr~>{/pu>ď7f}</$߆nygcu_{_-w⭼ܽ;y:U(É\ltg7x#oT_crN~'_}Wݯ_w~EET|%f߸He_wFEGޟyx#;ߑvy][__ ,A6,Tq-bl?{^[8+'|jt>? Pw"feȭK{[{~ُ9Νv-Ӝx/uY80fcczr8cpq8ka2dwp~2/E{ϒ6-gfp\i= _Mzmu?&Żo1 g+F2kK )=Ed˱M߅% {9v5!:<2in~W~4C)Lj2VKqo~@>_dR[xpx?!Q?̟%G{b#{"9?Ǯm~&M4WL_y9+yxG 㫘lgNQG =箍]}?;+Sd l_Iv<Ɖ!ԟ>WWA\A9i1 Up5>NpEq}|aiK_m׽N.1O_~R&wq2ڋ[|2rV ^aT&g̐6O?X]2X6\\V|u+k~S&znyRӷ0!ÿs{xKs޷箏̑7~4}9;9r毲ȗ'ݼ+3{6z ?ɞ}îc[$oO^w۫pΛ9q?ʷwyo9_?5T:KcK/Ɲ[NjCũ/KyY|<俒ݗc 'a_O_IbVׇGャclM#y&~s_Pۀ!"gZځX?'\@W8yyMknnCܛ} of,@߾vcK7s9xY'O)N2=QK1]iߟe}xjbˡVX|=0G~;h.|'%W~](뱪nI^d̛3[d'M"aӞeǚ\M#FylGF|\~{sS8g^ʇ. c/pۛ|b=A$|f,d?5$×{c^adfsݖEMK=C|l q7w8xm'F8ڽ{d;۵ +Xmמx._~lrڀ>KCܗ;>xWo9O)U.ԁ9;?[7lf||;N_xyӿ=7(u 7I WsS~uR|Gywq+O;]bsi?AnOY|SpӮ}~V~7ˤlѻT 91s > ?+f)jvn:?Ovc:3&>s~@p8U5m.*`1&f相-x|:IlxGHr"xi]oḠywřO)A9Ipe6=ņ':wa{W e^ 7SyJXoy b=_&aW%tpp]oQ]j5qk)=?C熄I-;| q߅>~DE Po+"'4\ "0$t|O$a^"( vQۯ~M?<xx&اk P xDFNBGy.n̍\y uQ+Sȏs}!5a%ܘÚ' ]CaԹ^1xa<ǝm;A qxMY(8 $p (w"\G!.'CkAC!(a˨=ADq2"B nk8ED& p 'L_z|(ssFઘw\?e;\pg!DED"!CaRsGz3=A@<ׯB^Ċۄm–WlO..~5e?=bWn.>DwV7gp15).UnX墍]pb>gWÏgɩ/PXqót|Vz$Vi6e/!.hB7?cqq xNWXSgYe|A*e."H's^#BXi l%KwAROPţ9r泮N₯"_:urx+SYJW9-~A :@UC9\=ꗓj_LTl_TGϺ"]= x÷V:OS u.h]\Un~|()~j^B -B -B -B ?T*EmmmeZ&LQJϖe(} -B -B -B -j79s \ݻwpwn:֬YC__AWzs񖷼1P,ٲe o|I\tF#4~/@?w ]_"XBcjFA wI=ԫe^F#Z%Hb]YO1F֗\Ht?Fg8TAj0"c 4Fx|e+ B Q{{î-ZXQSu{HZJ @2^X![v]c _jt]J&~ ;D#d܍^^JcA(2ZЪ޾D}NUlĺmnרE<c_ 5|T ^lUcjF#0[4>iG(dOZ.Z7=RrI0M$4Y.o,8^4< y f$ 2VM<ƦThZkyѢ9Ɔ>حR}]{Gr[2Qs$r6@ jGD|M9 _֋nRMTUwUcx+b+4}V[%uޑ"jʠiEC1wZш^WWEЪ j݈z.{ ˱b{6':c/RRʆ$t z VrF]7:R&kc_Q5DzrB́umX4A$.nr5-WDj#NY-nAeZyO xuy|Y؇ 'krdcT+!gMnT]&!9N:Fz9T`c=jlr2_5YEV/<rmDM]躝uBk"msh~F5\njND+䋹᫺YEk-G3?ŊTۈF g]7}ru$bYU[{LSh!z9fy!{#FchwVsT#q>Pe\.VhZ] Z6Ju>_vhn/fNT=ߋ\-w#ΨSLce{x^OJfV'f.^YG渖馌|TWU 5F=mFM<ΆoB톣ЩjpPc,Z5ZzsZfm: x~!t}:dcZ.aHR-K='ɩK@ .W4kBK"ss>W`h'Lh6VY&9\rX"ʗxf+NTa6AUd1337Γ2FXm77ʡ޵l ̷%w3bL0xz`2E;vqJĠKDRj0%'Ȉ.j dguX'KWb8TnNlϳ$;'vDf6{ KIƝLbSk'"] L۸"s: EiM3NT9A"EjiAa~=RD,T6a]fR UZ%8kqwe9=ÄN>Q $=z]p:c:I[y51oB#k\Bm9O7lS 3DfrS.lc@0FKxz\U2;p5Wb^c"ˍG(D)Fhepw*EHChȋ2~.m;'hO7\?s Ls?7r/iFv(F$Jzb(D"k"[ H6Eڬ-w }'yR_ˌX'dd~ibTG9ؾ=9Bbip6cϭl_ 5J~BE1}))7b]· Iuα!.RM# sfvOi$q*=N^F*QC'd1Zo ]@E.o ].AaI~CD~ 9;HwZ3! Fq¾իVDbD*i#6( }&=blCI5'is5\.tgZoMRũ=0@cQMYn/W"*2c,$LrSW3ۖ$rHWPa8ӏ#ʉ49c#|MX$,20md;ˬw5=Qv=XʗEdg ] |iq>ziXvelhE60b0G EJU =Et%^'ۍGQY2bj̴͆y,l(ۘOtCg 8rk$2%_JPld,Ioɥ,*`> mی+YgvXlȜG Yq&Tˆ[w6#JU9&=vCX5޺f.&1>Q*$UN2-h%=g*]"7jQ)N\Zc0듘kFaAzmU~<ɚ.<2#}9n)(fOHbĖi殠,`J.6w߶&+seyoB=y9KNb4)F׳K嬱9̵ei8Gvl ykeFB7<c[X@) bȀ`E^f}~'ĥlr\n*8[OMrt1LdC-vrl,S9{gq]6DS||';9N`.%Ɩrls7(Gڷv&4W>םdS ^g9:~R*%K;ƾKj(dJ.aew(7a]sVu\:?H|qxnbc;_'gYgΆk{Lh칍+gIwcl h;2@~1 {&~zT:`|@.7,Lg-tlj9xy{^MOSPݼJu]# v\^vPaRj 7%l;9r3EJa7\Qȗ q$V{YM1]ʑ.:{ S̴ظV{7aqi  FWR(H_[?b~}DߩLƮٛxԼ 4}sx]"s؂Lqrl ڍ[OYEqM.\|[Ng)|f9,FO0#sk0Hr- Q:dRB`Ls ?,:3zY#fؾQF)>GTs+SO]\>1~Af1rw}>~[HgEvCs3wa^t:ʺg:9]Fڬp*]g/@ĭb\wJ쎻'Eg|Di0M6Q* |R>ť- Ѷ YmQ%}\ p.%$W$hʳ[L!\Pr\YdbtO OUuCEz3xQATXucn1m6L\RtYt%ZNl_۶bcm7O3"kT82`3Aaq c٪-$͞g#˖^Ln# Wb9@Ұֳ $Nk &%h% FěÕAkLrF9ɣ[6nXb]02)t(^fX\1Emd93Xs+r]`lt6O=&;qRUAuS Qp&fIڶ@&<<佀K+CZ,R䝀MӓlsY0$XK-bوpmÞ}c;V}ӦMLMMq"A7s]w$JaWU>Opwzb׬\f.\_+l.i޳fK fZƒ JWip+nB-/?ivdw܍{ՉͥӍ%HZɺJfY6R₱4nXcs;@3by\CƲPrbˆ]/gŵK}k}Wx2UW,wkR?[+ZKhlc|*6uA4oXhyn.\McIԊk:n.GPyܺq2XrһK2?1-F]U>r q ٖ5b㡹T+7\z W,Nl~W|tWުB_-,1[lY5cB<֌7]_y +"~ϯޔIHMo+WƯȰ:6jOh士\ɡ%\Tu U6yW:V-7'M/k_W.lĊЫj_/"ʜ$VRc+U~erV-m_im c6y_/mz؎R+yךn+O5g{Z`uJCizU+J4W>Ӹ֨2WZvuni\,פK7jB]\kq4%Ϯ*f_!^Σ8;+l\zEpUc`yJa6G*i -|;2ݨS/nFO=?+rb{4bv0..\?y!\^WJ4x1wXQ_5Is|Bx.zUXbE\Xċe>{kš[:WbF>]9)Zm6^Wo~4ٷok֬!b񆓫>x_|~xx#G~z׾\.LZhZhZhZ?]JmM7݄˲uO>o}+A`%^z)Lj!E4!dE_ C )@C  )%BJB M&a:w)$0҈1BJ4@qH0R @H!CH$!EXCF! )m:q6d.o} e^C 0/!$Ɗ{gq_96c[~44ڈmUPaX' vulh7uzF4lj A,i !D )|fVVe6|ChYgȸخf}LiguِU L F,ul׺O4eF~ĺMd<S4dV~]KH'!>v00r6d2VcCV)\>em ԣ5c?Y'Sf=dsa;e&Bc@*KS7 ^S*Q>ҌK.֔A* Iݯ:Wy?lm mar}3\-4b_2]翆nbu31҈eMݮe3,cf_&QEq\<` S kB<" b}L.󧬏Q6/S#Ruh@Gc7 1[+bQs0u*bϳ]jV36C1&eb-А1noY'/6Zm-eBXK˶4b^n +\~C. +cl9_IJbHMRgFSq[ ҍ:q~o#fd#f1 rJa Q%˹d/F"F-w>z̋mC\֨;XusMe3?>/yB1nu+'1_kvh+͜k4ۦ {4QvC<܌)VFmQgeYΉ\oJVpY|@N+H,sQ.) _05Ʋu>~}#57bEhڷ3|v/M3FsF69@}w#enpʚ^Ǭg F q=;q}쟆P糦1ʺm\Rk8s@'eilG?G81uYYXa1yVfJ٬=40-urEv^^5*[F]Q 0buY5ǨYsFidžr}xc*b^+fm"sAo5BH$.:Ro8)q{ju2^:IMMx5≠gfg%s8%¸MU(-*Ӄ*|">ӳ~ک)fgfp33$,(fGIF,r*>1{INOPI08;EQtN.2 r"G*sE,CHcqr9ƽyrisKyivR!|R^.0Kg.12rtr;‰%V)ԦU3̝^HcO)2&\hN8k3R Lg(+BKOc#4#ss)88EhWg_XUcrYb)0+Xp&f `O%dUy'XjHq 1|W%|ƼT是rvfĒ}EnĹ8Rg)̏S^1S@WR}K,1ENǨG3CTd9SeY Ɇ>Jrj~α]u/MQy[sR$ѶB X$-O8 ՎS"%cKg>SeB,q}I¢MX!Emi{g qlbaaf샜Q%t¸d|I15{t9I86EIFX(3Wd,%ƐObT8MB:0 )ER:񱀑 Kgֳxu9-0W;O`s-2Z>μ%3?E- 2'$(?͠70jE&33V_,hXp8^:8=5tՅǐ~Ci:*CNR n1Z1{񅓤8F&,f(8 1??` ϒKOE:R\TDZ X9Fr`Gʌ'Y9p!J,9ӔYF=0BjRUU#T<ԬT0%U$18l/bxӒj; }# Kɐq0apQ+ Eqe?yܮ>zfBZ,29L#' 0#+eJK<>-03w /#i (cLy9ل3qWOcE  tI2%=Z̔jm :$CT?Y04J!&8|hr7x Odz.#AP}9>)K4E(e-haaU?A*>s!>I0UU"ڨ"4B#2%$RiiˣR(+DkQ/$&F32aP 4ϱP)|t|DCc:~b32T[`_Xoa|4Z` Qc:">JRQ*uX:Q_"C4E:>G Rfl/3$@2փ QfhD|Ĉ2ѡ2@HaD Pڈ*"Bad|䈡4aRmB*=1ʄH0c_$:a*25?t2+!B=4ZSG#D))a`E0ǹ$0tjE 0Z"@+IX^|laF|,X: f8%}H>gz|P֏搱>$ ʐZ~%JHxh- 0tH( +PHUߓ%" ,"u#J@ȈHm"DEV78'Љ!"@2-0d@-Q@0H)*4 XGWK{ "(}~̑q,D} Dc aO$H nOA$㷭j<&ΐ?̼ VB#@d4w2Tu #Gf:͈tSWH߈c *^sfoo|&Jh?Kq80B26EǍc8 c/-dD(7y@aȐ0JС'B*g)ѺDeEC|!Bh"eKgHD)F J0DD%L`*_A|bQj|<)(blUB 0^ dT+(FZƹ*,MX'3R(eƼK[J,:hL#|a P1wKz2j9o$f qd f̟wB˸o DD K&#>Ma``s^h$4IHQ*dا4,¨ss2D4u?1Bmy &:g a8W+rձW9AGf3E6~%|4 cJYͽ J(~BIJJP:>UI2hboĝRf?)F  1/qZaP@I3W6c)vS8+IF~<_PM4㼉:>4 }k2 W/Lsm(DڪkQb=EA L -ᣴVq\F<f* ׋u@K+o4kI/Z}Y?O6&D!@C0"VQC#[cBs ۰G:#{1 1ıd`hKBiuˇPJ(JLh0##֛c%Y+ J`~}1hKzb@(e`j?'&2f*(sC1xi: TIhi~j\Z~ eguW0#3 QX#ӌ(aWCD@+mڨ[sFNkjDm:j~ֈfFNu)BckI (+; "#@EaJt; J333C[[d(PJBkMT<{?o#NWk1ZhZhZhZh8oZhZhZhZhZhZh~КB -B -B -ZZhZhZhZ@kB -B -B -B ?hM[hZhZhZhg z -B -B -B - 5AoZhZhZh&-B -B -B -3ZhZhZh~КB -B -B -ZZhZhZhZ@kB -B -B -B ?0'ZRx@D[P^T~Q%Tde TD, $gtP|R~Q r!IJ-*0BHHBaP9RA0P,)md(Z@hM&ɫeP#aTeZVe;TdC+*IiSiFjI ")|tVNH{& [bZN jdB3K" D!A$2^VH, KzDh-gɻJCrb*oIrn@LBd BDAG QREh?ACTQFz&NZv4݆ a8(!v"S#TdyJ!B(*"G[`cJ?]ߢfH㰔*HЖ& Mט:pu- S!Ib$u) ,2>k*$ W.> dHF9a',^kXDE,`E^$OW&ot6J.Du=IA% tBaT*P|υxQS:I5"  rT 4ER: ByMQ󿌝/cцbIw5@F7 oѮ*T4#ρe}{I^4TZIT:!TIҤK/p Y'B'Cґi"I"!6N"=ethaIA@!R4h$Mx -<$)  BB  OJm%F ,%RfQAN,XDR"]0H;C,e8"E.c $HBG9 H%|FӄnU&]X #"5\ҁd)LPX"2!e I1&ݸ0EÌ^ p9Ԛc;V̓40O͘k(IU3!m>(DB$Ne=UQ P#a$he}RjLTk`EnNT\ ǹJg!26³ҊH"#v;aIr ^'PhT: +DX縘mf#iD6P#JhjnfҎp{9,)63U #ˎTA BaDIH%SpU%+O6r3 1w Q38:Aꜟ,!͘W(c$d4oEH!(h!Cix$l-B:ገ! CD {7%mJ!-.4VC%IG)TP(/g$&ڣ :{;EԽ|^O} #{o,[󧿿W?Ε?O׼`PD]sJ-O*o:>l G`nd-E,<nqf5ow_Ƀ夹7]K+W\N{=nY!&qՄo.F|pq_| ,' 7_IoTioa؜8U&~ݍd3osY>ּrnkN絟w)o,ʧ.ŠuЕ" K`DGx^]t?Ӄu!^8&|;|5;Ay57#Eti~t/yt`ӗ3Sގ+# #}5,Lၽ {q{#gJW3?BpL14v#+y穦,6ns'[)~`Ҿ)|dnЛ'ybl̜X:"o2n|r.U'N^ȋ;N{1]>rl`t=Qgu{ WX2oC=}<1>fryۡHж,0}&?ʏ/ m+3|kxʽ OqQ;Lo\K{9ygP_Wnf9}]~h5d=pwr7n;/o|_G?5Oi=m'&f]sLl2x޷ۏy6wbpV;awy|=OVǚquk˔XoMSXr8Hv Ǽ(w4_+=*oӝްa~N3kV~>cKs$ˆ_wxj7}*s1{9UusWr&Xswl8Am3gp6~7~_E{ >wva#b\7/|%[}SL㮩2n P8x+o5Cdφa([ },UJGj&-l9 H;(7Tr~n⺞qrk;˸~4 4##7O1 ==N200`x̷88 n=Zo{?Sבxd/n˯TO 7yd6Q~_Ծyi{.n$Ll6w "r\1|nvį7|6Ms {ig'cG:Y֝/w= UػX}<~xu?}m2yiѻmMk*SӋz3kLNF,؂.r,x%R !z(QhVK|F<,D+Ig)̜T!L:s+jEbcě( Y,Q"(I*BrʴVV 2$e;RB4LWa]?97T=3=9i43 $5ج&~Į116k1$3BaibOʹVW@Tս&n\#։*,t=TP \:[fEkc:-]bѦZ$٭b7S4I]aO`\Ia֫ToKt րep,SjPr 'a]phˤҦ8.ڄ2fQgQ;I8T"I{$$\rh(>дF/h׳2B@9&p -"a9[nP;xJNޢ!%J&Z)4,:& ]a&FT|t%(B~ѩ8ԺlJ#0#T ߥpJ B 3t "ݢAsñ{e0M%&Uw+) limڂ%`'PtmJţmKj]j%.KAT;4.RzsZTI4:~Shԋ4nEӅSu5M&FNųu(YXV)lSs%mF6ajJe-ˡQP8ĺ-vYRi;bf`ԉa4j;&0ծp,sɤө6% IjRovqMEvYob%Z U( u0M' *TZ& [8^F0YlԔmPtY6C -֡dQk GQ!YG,vhwj$.n5V"Wtq*fn٣ݩQQ;t>^AX_"*t AlhǍ b֤MHS4i*]JXltvVvPV6ZMB)km&Y$V;FШf*gm_z?+!yog/F|V>$KKauBWBYBqe%װ&?|"(+{]"z,rYi).QȷO<s Zɟ<}9k߯eKC~* e0?bྫ뛁tV3PZJ^u*2 Vh{ǣz_Yե2Pˮ\6Q'J_JlcU]\371 sDž觩2aImi5Um*l [.܏>gED?"$V`Ev^]}Vꐵyfm~D_g R9_+D}l_.+z鮕Q."cb9ݹ2^(M`{>:5q%5J2CWƯ dUc*K"׮ =zDY=N (ߠ sC(c@=zHߋJң\.[x]կz2s ~YXN)x+z.C_)\LRn%Zw,}B'EtD4,'BjA}J*\PcENVeUߍ[܁ep:] Du2ny޻[VfS_Cb sSYu<(58&j }YRVZ=V__?WVŀN_5bMϕ/2[OU[VA27JEsUr5[/b,u_{+c2?󪩒"m(qaeJOm;hDu7h ߫ƙ5,*|+nH({V~~]M$D"H$D"xo0u] 8x0m( a!u0 Ol$D"H$D"D<#=._X,QUbllݻw3228z|{ٳohpSTغu+o~uYg:\[! #_3 D9*Fng}ǦP;+C@@,!-g@C9R MD).߿a"DJ  ˻]zFnHa,υ+YΟ eE {Eð"UZrPzǗP1X6Nҫ/ rG 4 JރP%+a^% \)]'SYG D*b9w-J/~?'+\9'F4zɄ6 a. V/oJT6Qe #y C"D(+D.&"9 ] `] P2.2EnvS_F%/Ǣ/Qo(aO\:(@!J/NOS,wPan9ျQ׎Dл.rZQ!%w詵.v~ .[i~nĽc%XY>\ְw{s {y^V"dbYY PUʰU+A:, w9=ϋ2Qe/^(b^q/zu2_1Џ..<QàןDO>+m(D_"eYBDw U'joOF% QCey#=ף1(aؗ߾H60 ,"@%wr(qQ/P,a, ٢L4) Y_Bt+j}A Qp=uyVJГH52<ؖ.ɡ(bpYp@OFTp͂~[,+ E@O %QJ_FD}_n1 ߛ,>=ߠ7VmnMe=&V"X̀ ~(h|4'`༣_a3{(J#%\n(%koD4oZ=+r +2JH"+_"\ KWD/ =ҷA$sa؋З~,d20wY~R€HF6蟷"{aoݱ;Q](˲TYNveR?GsHRC"iXA؛G*eyl #YbW=H?B?"N+W+GWB޹0r1_}Q5@FSo%ѷ2G Q)˲.SU?*ԩS| _|'}{ٻw/Z;v?|੧X,PYXX_똞殻n? EGKndhY]&tE Ʋd1 $]HbzRâ>!R,7kZAXRBx% 9us1db ^ nsI?lЭV5 )E\酯r>ÌA6' 5yodzo6] }J#sr#tB\'m &mM-M`nNHtlv4)# tΥISZIr 1+hdBcmh̡4Tafc]<+V8YAN4Yi`[i ,LpnlINZo⌚NݙE\0TJ odÄqݸ^ ;s x"ïtf#[ަ)n8ޓ^aθ;q o3dNf*qNl‹:ENͦٽNDeﭛeva?sz7~NbΡ.˿fVP$'ٗx%X<{Cg NoN04ě*.*;=Ǯj 609W`J8[Mq47(vIV!}DJ&LI֛^W;v^Ԃ9"r'nG}k+oc/?_呩lr9xJdkq,Էvi8l4J׳8dlCչsFJ8ܦ=p`v9>3JiF撄 ,\dkvɥ9g; ژ`Axu*ň)6[E o]:'_W;cNXdyd(%>9vuLt=žG~ i 2K)2/1#3>u.;şn1Z֡E+F;וp|o}ˤî'i[,dSv.q܃ck~'Y[9F,6L>A3#LL΄\s7.Qp'Py8?zpçr̖ <aqq95 #Ae[Y}M&gXbi/2k\<ïzg< 4a!;Frx%qۓ&3>Dfb>7wnF{l 7l[{qP"SmidZߕfRfxg/]+s3[EfEo vq|^S.w`oD$, QNf̮#<0LM1b:?jdna]ɥ5{-*{7n㘲^M8Dt8Jw{MXs+B69?xf,cӜN {t'Ӣ@gi+am'scxI4sϭ6'ݷ^ko&,v`+0_OwsтKWS᪣]6 ˷w#&p5îGCf=_qrr#Qgmym|1|?Q^LJ0Ɏ1 o_^G\Xl7wR[0]Ε/ eh7fi HT FEyf_U@iP]x[roSĚ0e/KXM$?ßO-xGUE˴,Au 8' VeWwFw [[ENo"Pǹz<|z2$ ^?űͷ;i/ncGxdr??B*aM3j,N%طP%"L)\ČiLP㉍_15;'h*\~hxh_9o>y'珽֞ V y<ws~5umk3R?7dۂ3/ +U2ϻ{rrzvߓeww}%>Ely+Sl130sʻXE}˿͎9{'Fo8L?A tlt~'Y̌PmlffɣSw/bg?u|} ٹرT7[]2qlfgٌo'ZVdyuѶC2ɺwY8a+EF8ٹ_n;awP')vP$F?8LW]x`,(3_I7|Sf,; _GW [-K{ȣ3KBAo,ǘ(xfT>M*]cDԹza8mo͓9>IaJjc 7|Ni[>9ΦcLk "E43nHmeҮ@rb176̭q|a>t3$*S(ؚ՝cLZunfo1`{B5b P~>TC!\] :We"@wrtW7FPgl{L!$[H0)={IN.-t,=MYTѳLP;[}KQ\ng15ʮ~,rg=L|w'g(Cl[v569<LjdR8޼2;, 1X7v'fƹst)LN$}Wj|7LlNHjHE$gO6O.\UE8w{7 q*4q-y4ERsxF7>|3[u φ/O)>́Y1~8WĦa -[wY_)lPbm0l0qj27K3:qB3\.ϵH,ndOg#Å^ϵ>==M>gii ۶ϑ#Gx׻(rYZZ",qwPVoڟ;V$ {A,ry XqS@7z#W0pՊ\PD8v|`-> ׺9ȫRU+F 3~n4+bMdumzi}'|n]P"N䂻JBҏkXq\qU^qucE. o^y}Wq3EXiƨִ["MƊkhߝlٍjE(*K\o;T]Cw'\qo|[X0Npu Wy>rb~`}@aU_l.)q4K`Y+ʊk/+`UFb٭tlr+2PU :[q ]y~,uM.^ JF̀a |Msuo`֗PBˤX*Á r4յ5ǀ^ F\I1 k _9rAaU CBeEbPǮv@zQr/XSQµM]"](>P/-YZw rhȊ;rz/\-}_eQW\sW :KB]s:گSnIDAT.IF6DP PViōƩ0\M*`='#ص,VѪ:ZsWeFecr!2gW.\v9L+qte(A#d7I(\} Ŋ ư eCGz$VpY^i\W3(XT-1TI{g]OVˮ(\XZ/3"]FA/\%Kb$({20mEF`ee #b|Rޯӊ{w$+؊Tw^n^;[x WobX78[Y\& Ճ' j+c954dl@x' 2'S|+vN/((bf de.TU1D^?[G˱< B`y뇁rSeqsA+}{d+ ,뽞Y وdK ulxF/wu]__Nٻw/LY41awilٲu=Yi\4D"H$D"y~^vJ$9@4-կ}2 B`m1 D"A2۴iy{ÐL&0O#*Eoԕ~^̾؁B ƻbK(:hTq,WZd^~|518c/*Vb/^V i_?2ƅ˧ q^ȕhʎ܏Wُ[YTp QYYYX@|~^ڬas宰^Vde`9~WuVoG_o-o ^>ț2/.67~Y`]wE{PN[ H(egufp4Sd! F?.Gt@_AY=u*~qp=0Md/O7( ``̹О_19SD{yݕҀ^=ϿPQ/O2P@Yy7YAlj*CCC?tR$S4X8S)TAyF!7%J6z;Qho.k3΢QT|EIsJqț:Xp :U&FDDšXj,,Z.ym4UE¬jaFFvviSYj.R35Aвϛx-ƒ@pjJ.- T:)%2VRUt[%:yB;Xԙ6)%+$~IX(9n*1j)̢h8"ArYT\niV B`PmZ̙UC7^ñO,h0J JER-]PPlx*vj MδZtKj62v VrAa"Svk3z&(-:u0OV\XޢSP TkwT &sF.#tch݀FVFlA `;1:ezgk$EڍU4IP VYXU^ RAS,P+Yo,].`*Qm1߭RKxAx4[,-uqYBF3DKܻZ2sMPktRi* Ѥ٘]oqZ3Nr[:GXKѩUyډ=fb.-ҬT=VdAAjxZj(hF n =: &: zʂJ pyFH֤j:dmeӦAPY;9_V54Mvv#M%_O6iXsemVQ&V VZ%OJqY'iḻ.Qbci*slQl1 ;Oj1gHVNV5L#) y*:ѤX/p&hi)Kw (5k(^yl!*ySF|In䉟i5b.MlrH|YDLK:tXZRik( KK̀!fVLr &JSd,*8s/5),X%lx#IYAAWC3E MCZZ uIsncH<Ó(ZF:դZ-.YlizZiv1+.J#< ʵ2͢hc5:8JYh[iSє*MG1X2 M74 .bHSpCriK&su&yVEc٦GWUظ; tQ^BjCCChs@-p6j7khɒ@Euډm#  b];t]L%kD@5xiWx $ p<8^xy(@ = cL$ 8((K@F8:x n&K1$6Bːi**A!h^H;'CKI3 r \]*1֓B)تNĵ.Jx ]8F x''mpNPTXd\ WhX"Fs-Wy@uBxfo#GgՐLAƱI>FJ%!~@,tpUGWuT!~'Z\EQp$ ]X"domn;LOU0q 8&KN [Th$8zc(vՊk!^Kb^@C(t]= $ Љai: a"4n#(NKdC:Vo"B,E'tq$.i&mlEiiAЍ)!aCj7q*!t*Ń^B*.noQcqЧ'Є%A M &P1 +WhJ\[@B]!(C7poW( KT) C-L cXq(>q׃@!ˠ ЎQ-IM+(HA/rH,Z:VMd]N,N$}6x?ք(h~@;#~a\o&gkHv@@^ cbZ)4 f7Ϋ1v wAHhP~@ Q|@PM@bES.PI6P}!it< K4RB!P> CuכGA@9d< GXPo|< <4'Ẹ c;8qE׎#N k2BG^o\ !B| M:Zߍ&^?K_5b.h>@X:n Ϗ޸jFMCE zz&۸h_i(AHL8=I!)W肫:m=FHJ`:) ,%x$l@(x^#lgPTUFM8L@IMv b>dQu Md%T.Bu ߎcB&1Um|<Μ9Clٲx<~I۶9vzHQX6oOW6EQPWD"H$ZEq-YÐ'N0==M.{ډcd xG<_5BjرYI :~1&??ʵmA-.9# *sziڳ[IMp]/֏"oM}w^<۶QUD"ZC1 8ضM&qA4b3Η>8u>|t:/ٳgI&A&abbD"H$5.}Qt]n.q|ᅰu]!X?<]W;IӨzщϷmb6moFu<#LR(W֭[o Cs __WHA+_K~boM`"2FF{vBcdΝwI6/y pNq>?h_z\y ׼~Q_\8=a2==*no+_Ψ^>fffg˖-LMMaYVGT~uk%D"H$/Ok{7 ^WrWJXZZ_2ir嗳qFjI&?#۷og߾}w}5\8|GUU^גf9u_=>9~g͛7l6j|_jqAQUӧOsind_zhfqq]w(333|vyҗ0T0<<|yB6> fEQؽ{7;w?p|aȱc׿N2oԩS7zЫ^*>xZo|#gϞ%NO~l6뺼o橧bÆ u#L>ouh&> Z !;v`޽vp]+h48~8wض?]wEկ\.to{;ƹsH\}x~DlR7ߌ8|_eii|>ϡCb=z]׹kxx[O rD"^:~a:2ϣiVi|_uR}D"s=={n;h0Eo8m;ꫯg~gt:9Wyv?$a|Zc=}w0?i>|m۶qa0l.bnnO~<yn_,{ᡇٳ,,,peq.lfͼ oG!6m\uU|ȑ#\yyro~gjj{wn˽"G'$ Cضm333H$D"< o/322Bi^WCQ.4z4d' fffhZ96mȑ#y_5bƍ 6nѣG;BJBQd2b1&''ru֭Z>7ok%NcvߕR7#v nАh||+_od۶m)TCQ*PUd27nK_xQLdffd28D rc177?xs Ձg `ttl65\Wy[ʷmΝ;x_u]6;vַŵ^j'`rrX,roرct]6o̾}g?˕W^I*zqׂ޽{yMV/5Nw~<\8qd2i cf&HR955ia[D" 77 0n\.fazzT*??( ozӛLMMqΞ=ݻ,Gb[l*J$D"Ȉz8XKea6xX,aM"h3P4mY!0 uI&b1,q~ h&qEoԣ7LѦqaiXXX`rr*z;5Ǘ2ar90dnI@oé [a\dJEuEz7ћD"6;w{}7qu]|I֯_*zY~dQ_4;t]_կܢu]4MEiGa=$TUQ_bw] J*m_t4!ΝczzIDՁm L&1M˲$Uyvxt>1:vE"?Di#T*կ8nM"8(|:D"H$ɋ5BHX4:~޼333}b;~}9;bKKK(W q3g055oN< l6R)&''WZw}_|,--R?Swc_{&cǘettBI$D"H?q:@ӡj؆R0sYh=q| '(b6]ujt`h'kFGG_T 'H$D"'@1'đ[qٮ}^UU qeMt(D&$l6qk.:gaY񼺾G#EAAAcQX'UUW}|0x>OGem|ٖ;*K(NvZV=a'j>/T[t3`xaIY$}TQ MD"H$Kt*sa!B aY֭{E[sl6crrgvbl޼D"ӧ!JqIfgg?NBUU|'pw3;; =hdGI?zN6eʹm*;vXeEWtMQ 0 }cǎnfǎkp olٲ咎qN:EA46nH6ԩSLMM.2;;{ËgrRDRa۶mi0dii 0زe˪O'D?(k' C(A@:f׮]躾J~1xv<[n%_mHԖmsi&&&{O|߿wbD"H$0 %355>8O(333={_ 6mz'Ǝm|ogllY~g~}C$ITUe˖-/"v~\wuq=SO{n^Wm6,JzN$ t]j1;;K<gqqzκu鿙׾Ƈ?a&&&?wY2A0==0 8yvB~1uOX)?qۿ[oqIvM7ĻnDo...tT*qw򶷽 LMM]ro^o|Cncaa|#ٳNOO]`;ۿoo,1MqFGG?c?o߾|MMM122¹s3>>vTUehhN,f9G>>rv{^4Mcy `rry\eƍ!G4I|Ct nw]A^4M8ԧx߈eYxGy}c׹w\yvm\ve;w[n\.sN?//qFL&o&6m̙3j5qWwӧԧ>5\=C>'J>=L!y?)?8۶mh?`ӦMϪ~ |?ooqUWO|cǎqIwe>~zj??裏++LNN^r@$8ë_jFGGG?JPm<ò,6n__O}~p ݻk>bf߫`qq"SոxG8y$YZZHRaߤjJ?̹sؾ};7p'שضlڴ={pQI$yqF~~;2|Sbƍ\ve\8Vn#]|ӟfTU>jx'Wʉ'alݺn__`vv^#,_ 266Ʊc׿λ9ZVG?oo?I<>_җضmظqc} r[lmf3rض]wEX/9T=Oqnv9r_~9׾5OÇ8kyn(DIr8'8{,y{M4###|.<~~;3Gw}s*wAvLOO~AW^IZٟw'?;CD"H$Wndnt<>::>|97Nvs}oe]G>N8i>|EQywJj}$Ifgg7o+Z>66F,cjjx\.ÇÇٷo%g Duw}R)V_XX7Çٺu3Z_? `J%>3==y|5yM_FFFXXXczzLd}!FFF"ykxOsСU25nxٴiWt:rE׿k_`f ω%׿NVcÆ EJ$D"H{xGTZP4/^E?`"i"`hhX,_ζm۸랷 qUWPTf޽5\7x: lFQ&iD+l68ڵ 6066Ɓ4C7}{_i&L<gÆ \uUr9j{!Jc"hC1>> w>e26l#Gطoruoeݺu$D"H^Bض0tX,^^g|BjZ5xpk34۶mߵ!YoEvx6[9:v75_tI(7aQ?CoEwa;:o.k7 u)YB8e.(v1a$h;txmOt~t^$Q2 {ؾ};Ah4{tD*\WtAYA})Z6(Oσmw)ID"H$ʼnl'emFGGW/R ].r[  !]_3x]Oyco_ETE{ KJI$D"H^:am~.0Ur<=B^7!`[v_^2z373ם>!ܺVNOsuǷ!lncn篜!s;f񛔭RT]M?? @<®]lJo+K_D"H$C]v7 =WބTv^buE^^<凼&}y|}_Ys~ ѽ/.־kr\fm{4_r>yB@,J8rrZ]13D"H$<9GBHh N]W/@lrvQꜪzImz"k2Mͬq~dNzOQ3klLv415ݜ!$Z󜩝a,5α,k˱>Ccc=7誎+tMFf8^>N.c"s9}l;c1NUOQ5lXjKu :.{ 8 F~SJ qyM]u˧.6!llM$cI~/rp px؋] ;9 ֣ b:7Dz#utצ4M_ƶmh,I-xzUJ|ڝe(9bǛn~+t>mx7mxJPdgWz'7xl<˵W2I-(H$D"yx7q5uя1]O} ៞'TT~_c(1ģKrǓw=oC|kyo:y?_g侾,;whQ`~3)6e!p80ussXE\ tR_{^4n/oͣ |W=?1=Qaf'WLPͿg9Ǻ:V5|kc67K.7S6\1};1~_ O}dNg׳g|n0#vbVlf^?h(/i8?qY^e yGbyn,v!$e̓'9[?;"5a2ឹ{0b(1WNCӇ8U;EZO3 %iMyL6r[fPXj/Q5:?x(wvƲaK{ฮ@nt9$DPAa$͌=z^w][.z=ov֮um].ΌdRً}ɋ> Cۅo36GTD݆#$iv9ww~ rM Q>xp@(\*^/ ]G?B.VVnnNיZ¤4aR 0>"Qa3i$!ʄ=T"eտʙ3tv24©S$QUH%RʓijxqV|6:'8Ţ+٘A\SHہJ ۘH$Ѳs{OQQh3O;3vgqmk8sr_#V <̂{8yܣe%NxU<~vg,FƗ(4fVّDB CAh-Dh+2-+vQ9HrkXI#a$H(/`Gl6҉"<< ,3CB/ W}EE@|qK yZbW.v`hqhKs$NG!$M)/|?CҪhmG.+2fݿ6] b5C,$M C8SSrL9d20+ī{m( d!ÐEES1)MFTr"PTF(/xsMdj(uLJg1*hZ,: I$2 T( |!a‚N&1!7>b D䕴WHP'04\&'a[q]c 4mn!?F_ǭ[(d qJ= ܱ 87ye27&n`V)O*'ID>I̺{Hcl݌>V&& q6$nG1*>R7oVٝmGP3r0 80(yhj`G:f;PʕS$$?'˔*V7T;f]tS_i$Ә)T]*&IN44}yg1\#^.m&QH!Mh'""""""""sC#Gr G_g-FC OMz?t9,zYIadi\S.ec1dRR61'ۘeG%>u~lKHc(I,Ag9]-uF5ŦMx^z*+^v$9{P(?n1&,b[ [T$Wpkøsxe<8v]v0v ]]#AV|+{I$CC>@1wͬk"pv \8Qh.lYZm̦}Ie 8Hӥm.VGKCp `P:|ɕITrL滨E'ߜ)?o9KޥuH$=JTF\LrؘXD 5b_sv AU?oukGq ut7oX`hu~tq² *F&__k|J\S6mc٪Of~DϷ8i[_+"""""""M#( BfffH@PN/}ȃp8kOV%HR1_.=&CX&,f}yG{"K%_/ڳDL PL($bʃèQE#$b/JnEDDDDDDDD:HRt))zw\AD"uf_n7nRDVlPT6vY[[#!!nc2P(^N_H$ bqx<_|011A  .a?37p8|d&^'~^DsU=j=EDDDDDDDDD~x=0G!?;D& ( t:st  Rp:444|!OF.P(M\(\vjZ0t:zinnFs}}}af3444 1LUdllzFGG1x^ܹC?333$$$ ˙$ill NRn@(h4 M.#?wm"55srr\ʉZf~~&fffG.300@[[RJESSRi|477344$9Q*dNz*X,j_pA+˅Ncnnfӟ[[ ## }~||qU' Pؘp=-&05@kk+ >"""""""""L8~d(u?>::Ç ??ryٻwS]'P__ W\!>>X.^HKK {avvN権aLff&ׯ_ooظq#NÇC||>, 1::ʵkרB&Sv;466b0Vh}su\h4 `%66nfgg uG*244FazzJАp8 v.0V) :c4H$J%CCCLNNV l6&''q:¡e z\\cccj 68 n}}} "jeqqNd2~l6v*DJ 222Boo/TVVp8صkǏ ZMrr2OXDDDDDDDD+III\.0eeeu*J8;w|DXϧJqq1Fv܉`VKcc#;w$??qdllT*(JZZZH$$%%F{{;{q000fC&Ibb"l6f3۷o֭[ Hؾ}/..uVn߾Mll,oǎ`0011w1VWW),,-H+<wa``I?P^/ոn;FVVZf||>FGGh4qFs77==͉'=999\z˗|444T*_2sssjIMM)~_!ɸy&L&޽F`_222T~ӟiӦ G   T*Pl6nܸԔ`avvZZ-jFf3*G"Hv?h4sUhjj HQQ8Nv;[nҥK^PPc`^%"""""""[Qc˪,8}4iiilٲמٳ|{Cծ|$ĉ(JVWWldffرGp8dH$d2𯫨ٟ 3gxhnnW_evv˗/c2=4*VVV8|0aEl4y)//'77~E^/===TVV~H0$--T*YZZbuu%{J(n|vD½{wwYYYamm ÁD" /ܸq 6`0xרիB¢"^ںONN"H=6mڴ.W$..}o 7nHee%6o}[8pM"(ᥥ\|TFGG)..gnn|كNܹsL&o߾n100gmmxHKKcaaLmFbb"۷}a۩jRejs)))ݻ!tzzv[oEAAiiil߾Ut:@\\$%%q!ʢ" 󬥥~~VQTLOOp8|z.]IDDDDDDDcEFFFpA100$_:?O'77ۍ륯I&&&l_5jFC 988"222J,B/_f|||:::gzzFll,d26l 333,,,r>o0xW0 l޼7 r sT dHR {"qiiirH$ hnntC0D.t:Dqq1[x#~\.KKK}vٴiz{277۷`ff桵LHH N&&&d{he>;@NHHuFXL&}}}۷7oOZZCCCաT*1 Ûo [gHKK#-- 믿NZZ`( ׇDP J1XVNy{ɉZfnnTJ0D*RYY)x(++b6),,D*H__>B ++ LjjLOOc2Brt"qJNGYY䰼"VJn7SSSXVrrr"++KHyW)**BVR ***(++C3??Mظq#6lrrr'99c9Ĉ}344˗\rss S=RM6aÆ,կرc7ރ.A(meeBdZ Oy~ @ cH$5^_&yu!˟G\\;wBNkD~9y#*^WZa]&uVBDh/T*~=^܊|5hOḲ.X\\||!_^gmm ߏƼ?%xuukNo>T-Hxu+H$BllxV!8oZL&{3/*=H$BRRc="_woQ' BO- "& k- y%<3},px](K"OgD"~¾z` < >00ݻwYZZ"))鹆>X}qq7nJJJS]'Z\PMCCВhyy7oJrr2.zzzzPTt:z{{ihh`0^x۷|>jjj"$7o$ RWWx<jkkb|| ӴcX_w`0HKK t:bccuMMM8, 2L*Faxx'^OWUgff}66 ٌBF4 wޥ~j52۷o311ARR>۷o'@tJr_teV+gϞ% \>CJJJ~c9N8AYYS{qPj\bzz7nݻ a0PTLLLp-Bкg"/&w@Fzzz'..~ݻB`0i+++O""""""-|*U"JznPA_XXO?{>ulJ0Fj5׮]={0??0\r͛73>>ѣGINN&33M6ɓ')--%))~V%--MPfO:$XVR)+++re<O~.]q:\xIoΝ;wOQTՑOSeZ4y100nֆVE&!H02::2qqq211A81L&G?"55NG{{;/-A}xxz{{`0ٳg).. 7yMrVINNi())N`ΝdggDl\zW_}VիW墦RݻJ\.T*'?AQ__OII߼y|=\.:fΜ9Czz:K.199hD'۷1\zsss ns!AA_ZZ⣏>B"wwdggsU dbb, 墽ŹsZϑ#G0W";;[|!g~YILLD.sa!2Fq1AmjjB.s=V+7CJJ Ǐ'000%sqillf̽{(((`yy>7"JYXXVVVh4ܾ}^aY]]'? j&''IHH>h4rm㩭enn<wF"/~ &99YÇhhhEN>MSS ,..RRR† 444PUU%xWWWΦ JCC:r J%cccoY^^frr \¥K̤Jŏ~#JJJn377ݻw477SutttLvv6>Eee%fB\.SSSF?>ByyyD"޽+eiijrssя~T*ERq &)):t277Nx]]jHNNFPRtuu Jsloo'11Zصk/_F&W_q=|>ziӦEDDDDD^_DAlY dzk׮=r rssټyC-GGGp3}8ĉHR!##˿СC:u%AlosŢZ[[ٱc333\|8l6qΝ|>9:??hii{=#QPPk2^DB?6m⭷">>P(Dff&{A*2=====t:rss)((Ӊgeee]> p-&''ywq8x<n7nPRR^筷k\RRŸ韢Rp\4r|;)qqqݻp8[+4RSSf144ěoɾ}0 ;(MMM\.B kqAZ|߄r97od֭\t$$ ,//ۋΝ;,//~d2HDBEEv"^wy"bH$Hvۇ\.vRXXHoo/:Ce222x뭷E/;;~,mFUUSSShZ'??tz=lڴIPҶn݊xoo/q!222gyy2?@ ;Q([oaZٻw/l6y78p:|8&??{R͆J6L&a>B:n|E1;;L&"_~z!??7/Z٪RR݋nώ;D"ضmSSSx^~nHy{{;MMM0Dn2$HJJbzzyFGGl6gd2Fk466*TRRR(--}fgg'UUU߿tZ-;v`ӦM QHDxʢ@Z&#HٵEDDDDDD>*/j~MOf=88Dя~DCCIII,//v!+juwwp8زe qqq,.. mmmtuu̙3STT$ԔڊZ&''X^yVWWYZZrt:appqj5hZjF8F?4˪T*E.{y deeɵkp8B;1TJGGeiiAJJJ0Lo߾ւ,yHKK \bzq8 }vٰa:033Cuu5MMMϯˏVQh0I 7o>SE􅶸`0H?\v{t:qR^^`={KKK 3$IRhoog߾}455GOO =wލ^… =(_ѳ*_5"Rnܸ{( .]999c4*&u:~N=&x#IMM% Kww7wajj7 |ڵ5H$jjj?8L577ڊ Q]]2IIIB!RRR466244D$fnnn.@ @RR[***P* gWYYUUUh4Ξ=KWWPWڸz*HaoElZ[[OIHH@R"syyP($@#))5RSS# 8Z-twwL^^qqqBD"!))UaiZ1Llܸ۷Vp|w,//SWWݻw$99Yp8D"֭[BMEE>}5lق`󴷷 sCX^^&>>׋ld2=<⾲ Rj}ly0{eeٌ!99Tiiih4t:rZM0$55i Jyy9%%%ebbbAP[oBff&v*JJJp:h4~?6\[ERɆ (..rXZZ"99VK||YYYβsN }URQQAAA)))X,f3:yٹs';vtzIKK#??%t:FQǬ,"IHH ##{ARyf!E,> I$"Fߔ|7D@TR~0Nhx^n'a~~SEpg||X! Y]rz~c!HX[[=tӈVe{ZVWW1{<!?_*녔h:All@DDDDDNT ẓ. YYYy|BQ/^Ix<Bк}9{(/?O^/"Ҽ̼Q$ EgM\\^B뫎#+Nr{=- O!""""""|>bcc3iH7BܥR72=v=E HHHZ!""""""""<^S7o@`]Ee_Vs^¦SyW“UXg/F(zDxz088`wFmm-###fbccijjΝ;B ׯS__OGGZTJmm-äzR`~]Vr/^t 2y) e. Fe}~c8,GeƍO䕟'###Q^~?ra?cǎ mk׮j)))G"zzzP(ϭ0ׯ_grrMnH*苋|>jkk|>?;Nn߾MWW{}ܽ{!Pմ266F0 N455ӟThBwwf*fooJL&`0 ɸwt:Z[[ILLb?.ƒ ޽{`0XZZ֭[HOO݌hhhz{{q:vILLD& !T~H$K @ݍfiل϶Lll,qqq}>==ͭ[p8NOO>Al6 oߦ9^yR)fFGGL&ZHGGɤ GQ*6 Tӧ)//G*œQT?,.^H~~>>{ &''ioogddd2MMMtܻw^ J׋L&ppUٲe 8N}6?Vj222V.;wƮZ[[ĐƍLOO Pd||۷or###d2\3 Jv:?҄ܾ}ٴi 7wܡL~HKK[xJE?a6gzYF;>,%%%/{ۋ|!tZZZz/V]vqʕ/| TqܻwLFbb"{ԩSD", .ۑdlݺz[l!ި"H$ﰸH__EEEܻwLnn.6mbppW_}V˕+WZx<$pr9}}};;‹GBBݬB!~SYYqqqqilBff&GOOOʿDB8faذa^Y^^FV3<<̟ɟ0xښTNLLӁ\XX˗ٿ?+++;wt:0J~ȶmg۶mʃL&c||??~.O8x `P(rwqqqn \."CEB?رcF9u۶m,,,ݍj?/~GGµǙ //O0044DJJ |;KFd2 333;v-[p'Ν;oT{D[VTTt:9r|'B!Ν;baeeZ8~8w'rm"^< D"پ};FPr?Οɟ eP(ٳgq8>?#0kkk򗿤BAww7'OСC=ַDTڊB|/OwիL&=֭[lD"Z[[}6pk믿ؘ fY\.:$ :tHP+++9~8x<yd2===¾޽{;=z]vH^裏=._D"P(x뭷a۶mLMMG^^GP~w^/RIz=uuu1W^E"Hbb"( 嗿%۶mC.Juu5.GeϞ=ՑիWЀD"!P\\LBB2o,,,K~~>Pcǎjq8B!ܹC}}=999|P__/qTƇ >}a?g?ߦ%ٻw/HZ gϞoJ%7oyY=EDDDDD닋{{'d|p=zb*++? pe@K$AQ=q`)HOOʷm.\ +/J_X,\x`ǎLMMqe0l60gϞ%&&_@xh4o{ݜ# 8pb ٷo. χT*exxr*șdgg8p*z=iiikdee1>>N{{;˄B!n7CCC۷{jaf32>H$ [nef"lٲ0T*np8.oVVBII ^u<:;;vsU***x2e)ٳ*bbb;200``߾}lڴl0rСCdggyfn݊nGVEVVX,4 j)..eFFFgMII v"55u{F06mBPPVVIOOW_%??iؿ?w^j*r9333d2jk[@F甕ERR2 ɓ'ywQLMMa6e@@0&$$pa<qqqd2TUU-[_gvvKZZdeeE10DqAFGGٷo"U6ŏ P(1;;믿 lSZZL&cÆ ~E< "H0LIHHc077ٱcqqq3??ښ<%%%aÆuk.^yg۶m044o0 BNwll,psDx7_v<|uhnn/eLF" yPT444088Hoo/JU|> ),,dϞ=,,,xLNN200<RWWǑ#G`޽*va3ڊ^'++ ;v/2==Mqq1GhZ o2e2RT[|p0yyy444RLD"MVV8N'lܸAVVYyTWW\@ryFGGyw!ٸ\.v---\.VVVy^")))H$n޼I__444`2بAgvvAv&Agg'cccdggseZB*&m޼Db!''Rɽ{/gRd2A^311R)|>233YZZBѰHWWFii:%"Ekjj>++ VUP|ߧNGYYK/,R)0??bATrixטt`0((RPh4lGVqJ Avލ墵/J  M*E}}= Ee… `XBXVu#`t^v|>֐JBh[nQYYI\\,i&رcg?HRX7'99V+|p69C177GZZp#G`ַ܏.O?E"C\\ܺ.\Cq|>Ο?OZZPfΞ=K8&??NnݺE__{h*H$=fsjR__$^;vzX,CVV--- jiii!99YZf\8Z[[x<5 ɓ'9{,.333-/"""""xlNRv\A_[[cuuEIs0VU(&X\\pF#T*b`l6cXذaPYY\.gnnNǷ-eee;wRPP- 6[2z=qqqQXXHEEBT*EQTTDBBp7x<`%<7\Nll,III$''jh4Bff&iiiB-y7hd۶mdggc2رBy0\.GRQ^^NBBNݻwSPP@("33L$)++cǎBZ歷89Z4VWWg$Jjddd^r "= w^JJJDff&YYY$&&b2HKKcƍ3~f3[lYWM"X,IKKsKKKo}te2lٲ\z=@W^yF"99y]\.'%%U6m$mۆln޽{ZQ9999HR^/999t:DRRR0Lb2HNN&554HHH %%Hjj*RXXHQQ kMnn.FQP شi%%%Ff`t Q8NT* PTn7-[@8xW!99\RSSY]]eƍ gUtNV`0F!>>H$Bff&,--)jr2ַd"??͛)//kT`bXGaZ)--^{ DNNEEEJbiiP(Dzz:VlFVP(!//Uv-qrrrBf'5Nl&55U< TTTQ9[\\`0J  ++ ge呚*̡H0䰺ʮ]E" Jv͛)--E׳Bbb"z9222ؽ{7٬ XQQE:`4&++bmFzz:@d6o,=*yyyzyHdiiIwz^!E/,,|#G#PҒgZQQ_n>333$''?>`PNdeeqOXXX={<}^/BCAAKxQ}^P B_31|8p@(D(//_W/Ν;iS/D"F^{5t:9uªԋkkkB>x4q<E%9 !ko+a41ңBkE*ϯC@ &66XZ; T D"_y|>L&CR FH$B @.mDDDDDD>D4S)1P05x'~ Eվ)/yO< ~y~Y9y~?nF"~#sƟQAczDU H$ۯ _urP 2ZK+__y=xx<~ nH$ ~#r>"/<YwCܿDCܟwp(z!`LCE^b7ԆgZy̿jxu?==QOxe?ϫ$GzE$rkz y\.C?7y<;@jޮςryOuh5sB{-VñNjl6Luu5BΟ?lvsIZZZBX,|2. *$qyz{{ILLvsY*- qMʕ+cX\|^ ܺu7ovy?.sllQRSSx=-,s{_DNj5\r~Ν; y&MMMt:$ .]|>W\XBxEΝ;28qP(DJJsB<6}yylܸ7ra6m^]P/G{.:Nd{.3??vl(J9y$O011CY:;;:ohjj%|QիE?VA9scǎꫯ K*~]]]ݻ`1F#W^EVHGGٳ 2gϲeOHJJ"++H$˗yٴi\z]vN0ޣZIJJ+tV>VU(ƍ7xg?߿ÁRϧ~ʡCH$ 9uL&a2{(kkkܹsG 0,jz444Ӄl{DZ-oߦN>33T*e||nF#ǎc֭:ubQ\x\BLL .JJJps%MӃ zoo/wޥBvv6ofrrt:Z5fvs tD"_Noo/Z|>XVett$^/׮]qv-(Nbbb}6P(u NHkk+ Ʈk-puuutww Cbb"555r0>>" Ȉo{p8ǃ 55)jjjXXX %%.aύpMΟ?/->ihh`ppP(Ljj3SУVKGG}}}LNN(;ߏlrxz|>bbb!..>FGGٸq ك"""""""""OQFknn&&&Z(99m۶{iZR);w8J%l߾BA$,Gr***^ݬet:*7oсf#&&_L1$%%t:vj6l؀aΝj_NVVJ'jTUU YtWWCJa(ìp=.]D(ٳ7sa7Jpp 0ͤpYp:|/U|Sk0Xt:٨jRSS)((tbZIHHJRɴ -Hѣt:fffvxp\={D"k׮ ^ߣGp8X,HRL>|EFFF8|`0& ̧~\.>`yyy ޸q ># B!G}ccc9sfݜv;W\ҥK|ܺuv%>>tj5JիW?gnܸAMM LNNr5t:)))zGyh4r)~3}gΜattT :l6TWWȉ'q8QUUFFmstũSX[[cxx=->|J$H)(/ſ<ѿ B:u ݤիWYYY! BB_u/\ܷtwwSUUfʕ+\.# rI4  (**f]$!11]vQTTDQQ;vR ٹs'fp8Lff&7ofuuFRaZZp8z -}^p˗/=&'' B%nܸƍh4===ܽ{WxD"ͨǞ={(--]wJyWX]]}.H\ w===LOOsN*++jw^222%aꫯcZ}l6Qձ{n.^j<###x<zlݺAX^^FR ֍[*TVVp&&&XZZ"==:H$BBNN:,Grr2x<OAAcccd2"`0 }nʆL&M6X\\|fE$ pQvM0SQQA~~>ccc}5VRRBJJ P(Ĺsx뭷쉈x>S.o[=x>o/dD"?v;+++ܼy^ꯐJzzfggy7F"/_O?%99 6$ܺu>۹pdeeڊl&==^w]t:2 Tʑ#G8{,Jq<wahhw2??ϙ3g8s ccch4VI$R)H$BQQ͜;wR)111H$z#JQT8Nزe z͛_L<˗/ J L& !Jcrr['%%Rx7l9r .xUmD"XVbbbOE*rDL&cffW>~Y<H$fgg)((… \zEr|U*UUU(Jؼy3%%%ܺu۷ov|$  {nEqeetr9p)..&%%֭[CHRRW\U۷RȠbf _TT999 H$ff3ǏR, wΝ;a2{=FH$Bcc#'OD& *ςH$T*+WpfffXXXŋܼybRSSH-~?Lӧ9r*g*s"""""""""/ҒJ$z 422Brrs9~mmm~, %%%ORDR eee(J@WWPVKEE㌏#J)++Ba1LAJc0Trrr9y7L#˙B&l6djj DBvv6\.FbXYY!##C(^ kbZq:HR!<[bxSSSdee,C*j```O~~➝MZZڋV~f-!!aH$X,`zztrrrp\v=__TT墣BnڬMOO3==\.'--Uj5>FB`nn,999_D!%%E(')..6lpnR:;;zE"T*z{jjC"LBB?GFFbjjI֥B>cxxBABB\JC^^ /C.阘`Æ 0D^O(F?111 , T*+++4773>>͛Fc6k~\.?d "Ʉ(G}}}LLLF|DDDDDDDDDLLLu> ɴ!D YA*ߴ̨$F%Μ9[laΝ/{Õ AeUГi`0ȥK ;;~h`:HKKOvK.D"aC^^n" gϞgzx8~8oB{"""""""""_ryaH$Bbs% NBJQ$ KKKB14H$"~<< NضuϓH$B۟%>O×d_c/=ka|>< ole=cccdB]giv +DDDDDDDDDH$fff4y ẓ.}y}~^K-B @"|| B,BN`0i"`t`Bd\A8 =>N e!HCܿDCܟ|FK qLgy9DCM& r=u'auuek:Ͻzp' = ~_"NEp\_LOO ?`Dn޼ɹs'99PJ4ǏgvvVinr9 7orUfggIKKcaaǏ377Gnn.\xw"IJJsΑ`U;vɬGD0$55NΟ?2iiidzSN%|ĉܾ}vrssrssŋ aZ9sJJJX]]ܸqz, z^B(&&&j>z...R*?NNj5CCC;wnP*\vk׮ >jkkszH$ٳgbzp Bi|+uagϞ;vp8=,. FwOS*++c޶n磏>bOڵkDy2`J%//{dž P*AܹիWinnF9z(wޥ|x"t9{,SR)sY`xxKbbs^r,//|>d2Jr>}XmۆbyT=}}}" 'p 6n܈墶?1[lxŋرT∏'P__ϡCx<J||>Z >>>/,,hĩSطo'OTL&W^/b4QQQA8*ٳu z[[7nܠ4Mٝ;wcll ^^su\hZ\.մĮ\BWWk׮$8\ x<._LOOSSSٳGPЗB.駟L{{;܌^r166Fjj*S__ϝ;w%KJJ d2bttgRJ   CZ[[IHH~?ܻwJdjVVVHJJ7o"H333\| 477311|Wg˖-rL&} J%AZvtjZZZP*rINN^gH$vN>Mzz:KKKvH$d2Ν;\B% ܹstd2G!PTT\.gyyZZZhmm壏>b9wOP(1G \r~_ȍ7 rJ% ܸq^ÇD"ꘚ̙3( ADd$&&`ĉhZf3FX>c9~8X,d2 {vii ɯ~+'O`0P[[Kgg`йqfAm6=zVZ,fffhkk#%%ZMNN ڵ J%(>&&&&ؾ};;vf=oDHHHXwG`FC||#(//[ZZu(X/ 8s NJJ }X[[N-pA/lذaL}}}TUU111Auu5tuu144$$$GE}~ILLW^!??B6oތ# ɘ&??[O$!33Rhkkc~~qHHH 11!PeU8 p@e||H$֭[ pM*++QT eee|8u2p8P*+ D"j6oLee%n@ ̍H˹ummmͱuVQXV!Jn388"R[ne͂'dBRWWǾ}pS^^8Nf3RH$B8* ajjWNj`0JYY>Ffffgzz8Aqlp8HLLdrr>[nDUUjRSS"'' 6PQQ26 6m6^Ç}vJJJ"== 8ٶm |[ߢN||<2@ '&&szZ-ȐVy7ƍD""p/,,P(ضmbX ##~@@UUv9tܽ{Dhh4b2mRp\˜c7l߾o-ܯ "HOOgΝzJp8 *gϞE";lqycnݺD"!''RZ-%%%LMM̶m2O~RdƍX,~_֭[9wԿH&gdiiIvH$,,,z)..ftty/6kќ^J%*NVVV(,,$66.B388H0DVaF*RPP NOO  JGղ)))155Jbmm ͆` //fggdfá@Nrr2v~ARRݸnZ-\.\.׺bo T*c*F<*@ ^IZ[[?vZx<eb0::J  ;;1IOO'%%dmm]4]!??1v;q g"3 0A$s"%*YmɲZyͺݻ-_U[[]۫9(bI$LHD"3CH$bI3~o>)t\.4"ىh$''Ikk+&T3jFV"##b¬ ᠽRI~~>J6~?vRRRX,DDDI[[z=r4 KBr1::JZZ===b۷ohvK__244d"33AV+/~ ֬YCRRyyy\l2p\a4Q($&&}6PZMvv6ܹs8233b``HvvAvikkC.n'))I 6Dzj$>>;w`ۑa0D#&&ѭ:YYY$$$ikk# QXX(n sN^z%RRRhnnl`0NXֈ#;;k׮Q^^oM\\:99Iff&f.n7L&''}61110887p|(ӹs.t  BVV7Fgg Bހp8LNgeep8$ C\\vvL&YYYtww300@8&))Gq&!!!!!!$j8c d0 V]PпHtƑ#GlXbF:ti (艉tc,pi ++{|>:Ė-[8Yf*"C+!!!!!!!4yd F&vE/'ɰlYq2ked2G>v Y~a&&&0\1 b<\.l} ÒRţ[$$$$$$$$$> r):pI g$B!Cƃ[~QCϧ`NOCKO^yRr+!!!!!!!!! == PK}R.{`0L/urP(|z^ Suqx>bH%vl6nԔDQBH0dttteq\Oi_ O)|d\.1nرcTVVu`~_ oiiСC444`6z_%)++ԩS;wdhh8z(.]B&Dee% >>^b?$99)~S[[K  ==z:8pUU{$N'w… RXXFƍ:u"9rٷo̟?p8̥K8yM].Lccc=~!F={`{_bANt:ÇSUUh|ɩ)"##g9rAGG7n`֬Y\rǒkjj~(7nLLLJQQ#oL~?@Eyy9-Voo/1EEEq_h$**RJKK"ɸuGq:$qQ, :tS^^N||<=zv9r*Ν;`llGRP__OjjKLMMkt&''9vx^niP(fypqgŊ$?,j+Vp5:ĻƲaC\\ .h4rU^|Ed2nvMnn. Gnn.@sQ^^ˑdoW^x-Z|Z[VzjQ{illF#֊[ZkRVVӧy׉ɓB!z{{)))7L&ϟO444ENN󌍍O(vB,X@yy9jbL&S{~7gϞell|v??8vͼ8pd2^`Ϟ=[4"##ٰa׿K2[Ν;B`bbbvCٺu+EEE3R㔕zYjj5k׮B\rxa0W\fĄ;$bvv6ܹ|HHHHHHHHH|{0Nuu5 OQg~d2 , >>R)Z⋋Q(aL& .$F!??_*\~@hl6sy'22e˖Aww؆L\.Ggh4ʘ;w.M0$)) V˜9sD˛2R )((`||k׮qe:;;)**jnnnĉqq5k6O>/---OL̛7UV199f{d q ̙" ի9s `ƈd2(//gʕQWW9r_N(ҥK 455q-:Drr2Z%'}6:={v[$/`…t:233رcf(((`޽x<\.dllRJJJ8}4.]vS]]db֬YB!)..*Apyyydee\.eNzzz8wnDl6999dggSXXHFFPB,nܸ#GĐp8 }iRSSl?:3P]]͝;w())ax^ ]]]:uN:Emm-zER0_?YDGG}v6oLUU@z9t_<ڵϨ>]r uuu?DYo7p ڵk$$$>/_vH## ~z~ӟ2w\.^|j-dŊPVVFww77nܠ Ş={HOOg3 瞣 aVIJJd2dee1w\D7QX,dffT*p|#""[#d2V+Z瓛+ҥK\zUP($f`6)**"11FCff&nB]vr9^ܹs5kjZTƺZx<Ja۶m( N8N]8h4011\.')) LFfq)ill͛x^;W^˗s14^nܸ[xq8ܼyX4 ?fllnB/_f( &''ٵkZM6Guu5QQQ_5Kccc`@דKRR###( ~3Kr&''4''p8, Vd466ryO^ABBBBBBBb@0fϞͬY[CǠ=zݻwN8~ AV*?]]] bcc b<OfRRRy&ǎfٳbJ%Nիf{9Z[[gbb۷SWWƒ%K~6l؀Z&33HٰaNT8qJ iii2::JLL ۷o'22rF znn.+WD؈fC˩ctt/_NGG֭fjIHH ;;r&&&XjYYYOORNBfXt#jinnfhhzfϞf###"vͪU200;w8n Յ刺k׮Ott4VBCCk֬!&&FL}}iZr9nJh4\xBGGk֬!""ܹe͚5z<_ի`xxW2{lQ*L&L&x^~d$''CBBBBBBʗAYV$!ɰX,x<fϞ匿 M@(ʬL&& ._"*VLMM1jBFzzzM999066L&#++KTtƈ]' hZ&''&>>DFFFv344Dtt4( Q(3@ b.Ė&%%a2a``I2220 b?Z8&dfn"##1Ll6㙘```^OZZc/+'N,\.rrr0FZjell Zdjh4twwEFF6i\8fhhH`cpp$N:Jb….V҈ ( *P(`JBB RGa2bddDrr2###㨨(L&$''ׇ"55 ;Cʼn###.<z!XM&.n$t:p j0}6*Jػ}6> ===x< y~z{{Q(t:Ŭ2IlX,>gl\.T*yyyדģW4B$j8K d0 Votip> .ܹs?k׮Q__O8F/>$2]A|())=rI5kW6$$$$$$$<}||I233Xe2Gt8/zݎZ&22K47߂x<bbb[?e2ztӓ&cZ}`#ϰ0JOL=&)PHCI%$$$$$$d2;AtN4;(V*~OۓWa, I7ZG G= PKm~RT*16aϤ:,d.nr0 @T>MBBBBBBBBn?1қ3bk֬ԩS199)f>}4r_|N8$-bŊ3gΐĆ 8vgfٲe2)n߾M||c//?~ l۶M?BJKK={6)))|lkk+Ν#??p8̑#Gر~JJJB$''?.KHHHHHHH<|nx(**Z{zp8(mmm[3磸rJ%999XVXv-~hٷo˖-CPSSC||Z-FIIIT*Ɲ;w̜!s2~Ξ=˪U3=dff7nܠ;wtRJJJHKKCrҥdTUUqeJKKōjYt)z.]J\\TVV=ɓ'ٳ z~: XBR>!G?׮]ʕ+ ~~ar1^իq8\xsnݺEuu5$&&rU*++Bjj*vrssq8TWWyft:67np88^/NVK(" j* peFGGfpEnݺE}}=---8>E; r), wxp:$ ØffϞMFFyyyrV+)))eRSS\r P(zn#|nߏ^祗^B;B PUUҥK6^Wtq :Z-dddj5kyyy |W\R$??ш"77{ǣR|27op8HNN`0&''J%t:fo||Ą(3FA&ITT}X|9UUU\~%K088j%"","55(n6 El6/Z˧ |>VXɓ'qa&99."""x뭷|8q_~Y*t:P[[OSHMME-n(=sh4*_Urssq\(J yup49<]]]^TΞ=+nؽ{r򨫫C&Aqq1TL&ΝcϞ=lذJ.\dOVV7nx^qx:ȬV+ɰX,x<fϞM =nerr0L8N1V׋1_Bdd$Z^\.h!VT1 z1F!--Md2RRRXVZ-`rt:h4x<q )) \nG.Oexll *Z#""$ jr188H\\FQPfmbbh1IIIt:1>QaDballP(DLL )))2p'Z&11ɢ5zxxшZp011Z>"""ıT(b̺d2=H8fhh$~?NSh~?ܾ}Z`0 Ɨ\.bbbX,f ###LMM\.tiq"##>DFFzevc6'""Gtt4\.RSS*D囆vy j &`0 np\.gpp,0 &&&0>>(P ^WܔVINN~oz{{ d2+Dh4nW Ln'""-?doO׋y(9"ױZDEERaѫ~| _MM2JBBBBBBB⛏L&cttR@ =>p\K$)JCr 3^+QK?n_!)ӒP($Ar9P(x62T*gH?  2졯zIw]ܿ [>N'QQQOt%\.'7ՊcݵB;_8& ӯ/! m~a~$UX@(vYdpp񥏷Zaلa:;;Zҏ/fLNNu<. JJB&h".\ v\466vZB dddg-[FLL ׯ_'>>,^/ǎ x_dXVvɛoIeeX (JlBFFQQQRhoog֭o>z{{Y~=̝;.7oz?ȑ#b}uJ%[.w^gxxoVݻXG{{;`RhT*Gh➸ r055E]]񔕕opΝˢEɡ+Vp!.\N… ^Nlڴ R)M{SSSDGG3::޽{GTR[[Krr2}}}ӧ'77w͛79z(mmm$''s vP?tuu.s\`0IHHѣG%v)))d9|0---|.~@ Vej9}4fJ%cڵO-BBBBBBBBBBzQ(DFF&ь JKKbshJ9d狵322$==]Đ bu/_^gΜ9a… 8p((( 55A fBRqV^Bܹs,]xtl6󉍍%33AzTTTn: =RTT,^r줬 Rɲe˨att7of222(((@qQ7oVx<z={}n)))3::JQQfχ~Hdd$hZz{{IJJ"''N(IJ&̻}6B?\t ͥKHLLG9Z|'$%%188HEEҥK҂"??M6Ki.vʕ+\~I:;;ٰaN^X~=|Gbҧ=|_95kspE{{;dBד%zHHHHHHHHH<;| ~:/"֭k޽{پ};XZZJGG?JMM  ~}f $z@ gɒ%_5 .nuoo/˖-˗/sujjjhllj?srJ~?t~.ꨩmØL&IMM%;;,1[.p8'55(III˗/399(rFFabbADDv">>m۶ֆJ& O8˗RJdB9###X{v z^~?>X={67n˗/j*JKKaժU|;ajjcc=VJZZp8h4zd2 t:݌,jLN>͖-[pDGGhDPP(PhZJ%Jrrjf!1 h4l6熟HHHHHHHHH<|n Bk׮;w477s96mB7a||NGLL 9r&IHH=Ŝ;w7npUHOO//q8|>fϞM__eeevϟϼyhhhߐ,Z2X,455aZyhii8o1<<$߿jd2qqq+())a˖-?}}}nRRRf[Ȅ/ˉDV٣5 ̝;#G&3 d21^'&&шٳlڴ7o299IaaSI?s 'Od\p\"##9s :@yZGGGQTrI\.3'N`͚5\|e˖Lrr2VZ-x\'*,,dll|F#.\s-`6ٺuXQs~mzzz"##sa0ϑG(bʕTUUV7v/L__JTe9ruuu[۷osp Z[[9v;v%$$$$$$$dVU4d2, ٳgAP`6k _˅d2x!jE/bˬ vEtR:N8~ZMbb *8B6 C.J0::*nLNNR|XVt:qqqr5LMMZb\pll,jB0DѐL&#rD+bˬMNNzd2j.Xћ# łL&By. TJF\.N'f͆f# v;111 ~?.h1QQQz >>^L5<Q l6{=^{5vc4E ?<66F8&..Ctt4>@ G8fllLaT*QQQLMMa0t:r9^(<PZQQQbA0l6K|Zvc2X,~? x<S˺f#22B @R7$$$$$$$$$^1R8S d0LWП%+IN:d͚5?a+AAuЇHLLa.^`۶m36͂ ϟg``L֮]@qմ!0lڴIRt gGcIOOzx^<J)DDD|LCN1p͆`z*QB{?_v^U׉all J@ =G8=sLF8& =ue2'L&vVLJ/rJEDD*ꩌg8FThD FߟL&RƾqqA ygva3qϯ@>Uw!|K|3x% gZc x0@@a0*Y @@,#sM?{eL#~=}>6Aww>ܹs):;;gD(zbm`||9_p;wr5e2SSStuu=V###_x*xرT[>QBBBBBBBO?B@ @||<555ݻׯX'UrUvMuu5111]VR8z(ǎկ~Egg' ,`hh]vqyN'ٔDO,v;?Ϲq`LΜ9þ}&??_~)?BJJ SSS|ǔRZZ… jk.-ZDmm-{d|>{졢EZZǏ> //{=!t`rrARRRø\.>cٻw/K,!""BL߿Jr"d @ՒȮ355EddkGrQ[[KYYK.ٳl6N>Mrr2qqq BUA10G2 .bv1STTHč;LÇQTFQ!?>|xr:FYNO>*t:IIIB!>#_΂ O>ڵkvB=:|[^p=&&_׼8NXxckt].3|\ g˹x"Jٳg ijjbڵd2222a޽,[x0deex8z(MMM̟?իWپ};sa||{;P]]J"## J%[l!33 PuV8|0ì_^ŋΝ;,_(FGGdӦML&!))~çY)--ell ^Oww7޽˗/ŋinnfѢE?R, KNt:BTj*>̊+>S piΜ9Ccc#tvvr%u ^:::l6öA311;wp:޽n7.> ##c08x o}zzzCaZioo'33ST|>%%%2::d?7n`6oKOOQQQٳ۷oIII߿g[QT>|X, x9J%8|>w簾Rɮ]#!!JN:(R8=== 2<<, x"k׮={@ ŋyĵ)33S.!!!!!!!2 G z{{zh/Jbb"Z~ϟ!drrp8Lnn.3j GGGBGGDGG@LL\t HQQP$Ν˗ٵkDEEIJJ 7yP{7n`={+V嗒匎2gT* .Z瓒蔔YffTUU y饗DKBƍ3{l***e˖-qY~ӟrʕ'2_Q199H/_hBZ-[p9n7rP(ļy… ߏb͔dijj{Ajjjhhha._L0W^tvv϶mHHHĉ477p ?YfQUUō7hoogÆ :;;)**b۶m$%%qm6oLQQ477sg2+Ԗw\qX-9_IDATn7>|cǎ} ^rěo͛7inn+WE__wΝ;tww355l`0͂ ͛7hܺuP(DEEWxָ[oP(p8=P=j͆ yؿ? =pq/ZaOuu5TWWSUUETTMGGi)V+A,6oSSSܹxyijj… TWW/s̡i3}cijjBVo}֐.ǎԩSh4<_}!rssYnfnl2{졶9sa(--EP}vzraz{{ټy3աjYt):ŋd˖-;v+WP(x<vIMM ,Y3gp9V+yyy.,YLFFFp:t:, W;w066ҥKcƍ8Nv;Hdd$[la qˉN#:: .p V\ٳuw@OOMMMܾ}9sxHKKcΜ9={e˖r'p8PT444PmvFGG'3k, Ν`08c#KP, /"رTz*366Ƃ 룸HZ[[),,111l6Q6233gѢE ^ʕ+DEEaYx1*IΞ=O~o|1=]se"""xWt"// ĸ+WȈOf:;;\sDYY@p8XjK,!::Z\"""8w###lڴħ=\ji{e2ٳq\LNNETTcm`5LLMM155%?ƀbˬMLLz ƊqFarr@ &v*&JRBl6r9( ~?V(Z-NR)*kDGGj\>Ú pSSS\.BzFjE&}Zx^;Zb2kBzOdd$ߏZ&22ǃVbو`0HUrt:1̈́a&''\<*1j<NSkP**$׋3 rec0CCC$&&|( |(nFEEo6>@_"** \$^Xd2>H^/iEݎ=IbbbPl6j5z^VK(bbbR)OoohIj5FqF%*O 0]AMb8? +ˤ?66Fss3@nn.˖-Ҋ`\,X@QQgdd ֯_/VDxV[AHql6iiiO^ХܦPT\@Vz|jtO-s}8nQt/Kt= r\,vw/`Yʀ=x^~cDj CV?~Q*O-$dDEE}yL'""V(]###B/r_V? ønt:r5GبUn%$$$$$$$$:d/n>׍gB<o4]܅6]EM?%$$$$$$$$Jc z3exq!$zغ`#xk|?uPQQ}'`*7%$OeUL((~F/(//cMhkk# )(++p~l ֭[bB.1ςKMq_1iooҥKyv8ӟ BeeeY[2ڝ;w/~A{{;K,yL/7vaN87all_xbO(++fGii)III$%%f455Μ9Ccc#DFF%8( &&&p8  Bb Mo ^N8AQQ B|yZVe֮^ݻK}}ᇔEzz:ǎ̙3۷;wʕ+L&8!2k Bܘ9z{G`08o=^/>z^\.*Iy:;;9}4F goyjçw# 8geքLc200}XrEll 0ww   ~\.vIII(sݻgϲk.immI\.^|ᇜ:u$ ͉'HHH`׮]t:IMM?&22Bl& 199G}Dqq1:P(d8>jjjHMM% ^|. >CHOOGPߏJ"::Z\544RSSCrr=Dnݺݻ)))ʕ+̙3dddd2/KZ[[$99YTwލdǏs5222__e…ݜ9sgݴɁ!>>^wa>Y?|ܹs璐 3}6y2=Wu<  8<}aΝx uO.cX~FLL O{ xF2eb4Yyy9Z>y=ɬZ:ټy3կqׯgÆ \pP(DLL ;v`jj_Ye˖qul6lYY8r9~UVQ\\L?UUUի[QL&6l )) R__seˉV+~"ϟÇOOYf ?o'|۷1bDkLjj*\0߿_2o߾Hqq17n`rr322¡C%'' .Yv-{s dffJΟ?Ncpp~`//fvs=?k֬… ={[H8~8>r^vIbb"l߾z0kpM|>˖-#77SNzYzn8UVVLww7~^|Ez{{%++{SS֭[sqA/^̅ p8,^\;dɒ%fvM^^?cY?괵Q^^_& q1n:tŝ;wpWBVtRl6eQ^p!zr /NQJMMedd!~_n޼)nnݺz sZ-eeerzzzlر?u122BNN+V 66VN>c4y7X,|GreF#.saZq:XVvލf``@ <?κuZ|BWWuuu,Xv-[$''+((ro>V+lٲ  ؿ?nbʕ,_VQn#""Ν;3gg&::Ç)++cƍrqF)++cbbFKK ---x<q_NUU ۷sM)((Ν;j͛GOO}}}dffuV~ߠٰabo޼IYY:^zjn߾Mjj**/^^֬YCww7O&~ziii7"##ܼysQ\\L__ /rY,˗x g@NJJXSqdz(+L&#%%!BT*L&h)l6s 1 šTTT`6' ̲e˸q}CCCDEELRRcccb-ZDRRǎٳd2J%Z`0ٳgYrX8>>-BPV 狵p8D+@(5kfc۶m000 $$$}v:;;ZKMnn.EEE NAd2^{n}iZ'sFGGioo'77W.%33#G000W^`0]]]lذJɓ'5k7oޤ|>p`XNBRR)))DEEHIIF!!!RISS)))̚5ٳgvZ̙>h֮]B?ڵkxb֮]GGCC&ڵkh4RTTD8… DGGo} R۷uoqqq|>N'dddkWzz:iiiB!RSSYx1+V6z{{h"JJJp:311q Faa!/^?f޼y(J~?ͬ]\ϟIIIѣ֒Enn.\tS__f㭷BOBBʼnQWWlذR)n T*JKKz*2EeNCVZł x<$''ͭ[l ܺukF0111`6III!>>~Fb @ѠDw|Lll,uuu ZfbDeibXchxw  |2+WDPo}T~رc===X[  :N1ڬ_T9>>Α#Gvq:Hd2g ŕJ%ϟ-VB!*A.KWrsws2l6x7`׮]bHlقJ"%%V̸Mii)mmm~q-5  JXn2&&Ft7LF1rJ͛w], | ˖-cɒ%8qWbؘh7bJ^eVZ|*3*[na6ۿ[&&&eٲe|{#))q xسgN;vRD r.\"::@DD~FCLL zRFaddQz=&1\Պ- ȚB@T墯Oђ.\#**JܔhnnFPa1Jp8̍7x7ټy3uuu|-[сDa0j[n%==&`泷VΞ=˥K]u:'@ՊnsuuuX_x/+03GNN/]J%M/** B!zILw th4BX!FRxP*\K__jJ%CCC 3c~^Jkk+\IHHHHH|]o zCCG$ΝKuu5W^eyz z?{ b+ ~_2<:t!yv Ŋ+eZBV\7n n:bbb~+J:;;5k6 NGBB$%%Yl/^V\fc…300FAV|rgѢE p8HNN&== ӧOSZZ\.gjjb:::hllD׳vZl6U.\HQQ3g222HLL֭[\x򨮮G?MMM5n߾ͶmPTC^^ʹ`6Yx1OԩS~^z%DFF)5kWf޼yx^VXܹs8^xFGGill%Kӧॗ^b֬YTUUq5VXA^^}}}̝;W܀74o߾Mww77nlfϞ͜9s(**"..HJJJ_p-ZDss3gϦ"rsstvvdqcwddUVaZٻw/[KL[[̛7JN:$[npo>:::tlذ+V1**JV;#VIrp:fQ>CDEE ,B[N 0<`Zbjj !&LHH@RDyq:B!zavŲu%N'nD01˜ """{N@ ZsMMM!tTTt0zn1 ƒbwhLTvxB$** ߏDT-ܿB˵gMw* V+z8B!\MkAߋBxM\B+\.Zx ݂7F!))I\z(ZV\ Q( +~Ϙ.rǃF筄ēW4B$j8#$ d0LWП%+)x<\kv8? +,Xb---\~V\9 .3=K.>K,!##㩌׉ !SWWG^^CRWWGWWiHܺu랹8 <}||FJJkY^˳F(=VP:CL$$P>a1+$`Nx<;v]--LNNbt 1 8QЏ/je644`Z~ WٓJvvv288H K׆Zjz\~]Gƍ_%b(';jjmܸqcg>vq8-nLNN,u100 W73}w߿ºI'wBC^}HHHHHH#a^f}q%Z T*:rrrX,֭[,]~vMEEPZZʯ~+IJEg?#????~3228x ǎ֭[V#GgܹCjj*NݻwSVVYlZǏG|r\Ç6prFGGO>ׯ+fr=fjH `rr={ÇYtXV UN/~;.]\.ʄ2k B8q> .p V^͉'l`m> s(̇_?c.\xOFi!k6| r!VZ%Ω'*Id27RhiiҥK,YD|?55l7,~A^/2L3 f@@ka1'2T;Nv܉l3h "c6|>~bY)YCا@ @[[eeebB{!+|8$QΏ;F8&33>Y,q f֬Y>}cǎQ[[K||<===0} ~ǔ200@ff&G7nPPPpO) o2_}k̙3Eٟپ};# ~̞=2.^ҥK2׳}vF6n֭[97011hdժU$$$Vۿ[*++x"F۷os <@ytRRt:9q###$&& /PZZXr9Yp!~!-z~?dhhVq8ܺuz, šCKη\.jٴinsΡX~=CCC|?*d2۶msI~XRN`xxrq /J֬YCEEccc,^X,)xebxxEii)fx{98 W' 6N:Zf֭܌^;GabbOJJyb @0l6300믿NLL 3&&XΟ? .B222~:n۷c4ٿ?^u֡9s `UVxbSE222ԩSt:ܕfߦrnjrf---۷ "##ٺu+---pi$//nK#@^^;v  lܸF6l@cc# رE$| ?Ϙ?>֭K.qEHLL>"##1h4* ,X@iiXG~d2+_uVj5O۷EylkjzZ&66[Tccczjժ/}xܹC8BALLjʕ+,X ÌsΑHvv6~46l@GG>DEE Ąxe˖GII Oe~Ξ=ʕ+FF?˖-C.o$!!~>|_+]]]lܸ͛7v =1BƍTUUQXXHmm-,[k׮_bZIOO'%%Et}qkk+)))bm۶qQ[%KpGڎ1V+t:?ƍ?SQaرcWw^bccQ(8q'Nn:6nx`0ŕ+WX,\x bcc#))ӧOvx"/^d|>X,z^{5Z[[fttGQ9O?… R??CRq%Ybo&Ƙ.dgg`jkkEKi0̝;;vuoŬY?2z=MAA>]=ʭ[(//͛W^yӉL&7ߤk͍78{,? kFh0߿&ыjILLdrrrzzzlϬnX0 |͛tttrxWh4pYrssy)--n5͌Mh W^eժULMMll6ώؾ};#55jjjbxx5kPۇdsEf͚/C=q?3/_εk!99qݢe3\'ߣOztuur36>Ė-[err1, FqCC qݸ\.ۻKrJ?%B#""pv16xz{{EPcccvteee3(!!!!!!7͛?~>O>\N^^#C^RRŋnrssyXlBo~d2عs'DFFٵk arrr!rrrغu+-=}>vڵk\UVp88uFm۶Q]]M 2>>΋/l͛1oe˖1{lϟς (**"::Qjjj0T*DPTb6ٸq#׮](ϟϝ;w )) MBBsΉk* fzrssb``@\d2\xQ~vZƸy&V9s0o޼}< }\ng$$$P]]ʕ+gjj/ǦMX`gϞsddd okk+twwSPP@qq169scd.]Dcc#k֬a޼y2o<,Xܹs1ʹqzzzcppcǎn>,^IJJJHHH`˖-D 1󙚚"77TkRTTDgg'SSSÅ %>>^RP(\>;&gg:2L~-p;t̻wzQstK/)B{_8`AHNN&--M|獷|>-)uH˒0ן֫5ϒ.%? ~Ym{}6Sy=|qs{Gu A"R()l-efdZ$of^%+$8,ɶ%Q"$ QH^{{p6Sz$ٿkw{~wzݺ߭?%ɒ9q{'qVV @dd$J޽{ILL\b־U4A $H;h1Ymq݄=p^Dj5_dDb͑4}efJ0̈́?tKžƣ(_8e]hhz}O_sˈ ~Yw+nMCA3MA $FU*gӠ &pg0DpVO[ 6vk4Z׶GJw!<&yi N#A $H A˧T*}f÷P(D?ς\.h&_%)V(b[%{_WRп_$H A GR4v1 b(׋`=*< Ϥmr8/Iyc4ş~?f1h4.Zbz6^my^Dۅs昝 ?FѴbZE…,˒v\.@ł^h4w&zz*׋jXVFb(.Kk!?իW1{N'KݰX,466w_^,hmmezzHs9:%OWWwmba~~^L&Wzfgg=p}w1::J__}^x {h4.ٯw1ģ&`Z;bffYXQr A Qs4kW^ϧ>j<"Ӭ566r1.]R$--Yn?\rELQN֯_8555|r***W_% 1$ ={v-[&8z(p8_Vˇ~kƦMɓԠHHHd2?bى` -nbaaX&=z$N8AyyZZYfmppW_}+WzhϱZh41B|>.\cغu+'Nh4R[[K\\aaabQ%B…n緿-b@ ."m;1ƍh兼BeݎRp`Z7 ;B³8q˗/G.t:h4kHhhX9!B> 441ZWiѥG/A,8N1Cf}nIC}k.?ф/3a,D\.6M\﷎b G*B/z{{fڵK2[0fƄ^N 336rjjjaŊOX hB$w!6 +w0466fqOZO s7@T{UpsIsɓ'E&}sC A x4k^RRcnn.455QUUݻI*.!mee%W\aƍ Dݻj?]]]ڵ'xg{bl۶.l6pyҥKjX|9Οٟ_k׮k.222իWZtW\!::SYY7nȑ#455QRRŋE?Vχf+W1;;KKK Fgg'~FFFÚb?h4@דOIIɗ… zj^~e֭[Улn}] ==(L&BCCl;vLe]ZZP/J'22۷c6x"lٲI|M</"466{n<gΜb2Y??RX,2==͚5kȠP=Bd2s믓ϲehoogaa 6@ee%YYYQYYeŊ⺀VMM ۷S__^,{=BBBؽ{7ro[ (++fף3gΈkmmZͳ>|lv` ++-[OOaILLdbbÇ~v-**|SQQAII iii`Xطo111{l޼ZMee%~r6l Ε'N000@FFXv-e\.Bl"Z֤tuuqqOO/IKK [lJvfqY1 _^$##^xAlѣLNNOxx8O&''JKK;Gpjj*+V6^Wt.]DCCFh&&&8qn<2339qєЀ^'22R,nZȜ;w֭[ɓ'g^Jyy9~Wc jU*k׮eٲeXV;Fgg'6mz A @SRK"΅t:v۶m{dy1Ltuum۶.'**NeD"5BT*UUU ]ٳ$%%"--3==ͫ !!!DFFyƍZ*>cM6t:`h4|>LMM1::ʖ-[hiiA׳zj<ÇRm2==ٵk.Y\B\\wŀr2댍q!mƍ7?r…G2d"))8~mϊT*exx!~E @To>0b]vaz;V+h4N>;}HLL !!!G 22ӧOӧ~:?СC8NZ-/ܹڸx"dK̍f3Z^Oww7zLZZ]HT*T*BBBxt:}6|vv1֬YCJJ &SN166lF,F# >]]]8|0sy y稪l6}/H$(%P^/W\a۶mvˆ$** ܼ`=s vb߾}={Yx'ZLOOS]]w[Ҏ^?cۇj%..^xnM7CHRaaaՑKBBpS]SSáCؼy3@g2==Mjj*p8HOO'%%B:D8:u͛78F#O<TWW3;;+Z,zoJ"""`z A @ _Ujtt_SRRQYYɳ>Kll,!]כoL&H$¿aW\AV뙞楗^Bbۙ`zzc0d$%%fcbbF#VB3::4uuuܹT~mGNNǎchh~?笠Fo3-++3==Mmm?K\T*5m?!(V' >>V_,_ ( 3x^rrrd[V}c@ @NNO=UUU Ŵ2** F#d2 i@tEe2|>(j5NbxxH1`έP(p$%%SOݖK{{;EÇF#JIHH`ffqǼ_%\+fN111l6bbb ("""AӉ-Xx\.ԩSb BLL n[O̤FCXXsxX_||#wƍ?f֮]˕+WHMM%66NǡC!99%&,V+nLFtt (<-ƨq@~ߐ-[l6399^H0GtLF\\h$;; i9EP|>L&(OOO.j}>|GLNNϋ&¥1xSOQPP@LL ϟgvvLv[mu|X,XVjn/˜ ~Z|>ȁ$H A<AommٳLLLn6}h&ϋ}+++illpp8ͽrUL믿zyw@T8vSSSdggseꘙ!++{R^^T*e͸\.{=ضmk׮rqiسg ~1WPz*))),,, '99/)++CTsNv/ ,AV ܹsT*YYY9==^OVVV+V033CFFxѱvZ)++B0 F!//ٌ^GPȎ;hooʕ+zjR0!!A4vSYY^'..LFvv6c6bٲeKLLD$/_fjj$6l6md2܌nJJJ6ywyVʮ]իlܸQ訪b||{RTTDee%uuuΒJtt4===222Bqq1XV 1 T*˹r ر+Vի)++hnܸ:^ϹsQVV̙3sNb#**J;phYYY$%%qyz{{dڵ|tL&*++Ek׮1>>NAA[lazzv8gV\)wnn. ~FGG$$$BJ]Sٽ{7ӌL&[NGmm-KҸp% l6Yv-b\˄{E/ A |%A +HtRXX2 Tׇb-A377F!$$׋s Z(A VPTr\~QpH$L_N -j#hrnh~Br0FGhdnnVĤr1Bg}+S8 v;6MaC&** R)jz51S,@  N8 pBsDpӊl67YYY}|7L144jx^$ Rt֓XRSSEMbm]\a~հl8ѢB)Dy&[?s'5-M+A3+HĽ^-y)%aow9(B\Bss3 ỷ;Iol=5ϋ ,Ǐr8|;/=x}BRXPg!ޭ}=<<ׯ_gŊ sݨT*Μ9=/ߋ?w m\>:33 @FCnn7+? 66V;ͥ;Y= $H _Vf3J%o>gbb1z؇n@ p055‚TGxd"`0(ׯ_x<ա멮c/;B_|.ҭ bűv8\.XXXpPUU%fZSq5`ppv:;;xvuu1::󱰰@]]ݧ2wݷzׇdKi.DПƸ  $H A|ݹ:_WJ_&''5kPRRBuu5###8N~nfa0"""/RZZYP`4j>^9B `߿ǃBpjq\( , ~h&&&hhhTnujсlF.Avv7:""b>"\ ѲJXG+¦MP\x|ѭa4QTt:ź~.]O?43YB~k#<%&<<+ t9=] ,,,P^^ݻj= $H A|S@/--WԠzjN8AWW#KyTRRš5k8{,ׯ_ ]*o>4 H__v⩧~~OfcǎܸqClht:\.xp ;;QOʯ~+]ƞ={P-[NCj^Jtt4V|[[ʕ+JdddFaf.^lM@x===ٳ~Z-rV\.k֬addz CG"OSUUΝ;q:444`ijj"''7ϜIFղf<***dӦM$&&رcmmmhx"O>$8N1`߶mXl ?~$H A 5j>!*L&#&&e˖>CBB]v=p9\zTʪU$v96nHdd$fISNL||R)UUUKCgg'}}}Fjkkŵ%HXbO=iiiRICC---?&##L&l6ömۖB/,,`XHOOcppa1% pYmO~q88p"jjjXXXrvG&ITT:N'dzl2 $H A pOՅCFaٲetww?tH```_~rs|I"##&. ӉbW^A"Zo˅nۭimmʕ+444(,,HXXv!&&&HLLDc4bժUy_X,`0z_g׮]#)((Ʉlh4RXXjellvo޼g}s Px^N'n[J"$$H:Dbb" ?=V\HAIHHT* TM^/pyh4x^V+ӟ@t:Doo/gϞERa0X,x^ GR EVrJ{14(ꫬVӧOKss3׮]#**J+)))~FFFDׇo-DySRXUVc-nZZӡj }qCBBP*b`=шjEբRgrrݎ\.pg?`4v#j'!˄hbsssϣT*Q՘L&fffB[[6YbbbKG$H A $D"nz .뉉fGyyy"ǃVҥKaZq8w9vBL&ȑ#L&lj3;;+ϝ;grr\իW%33{n:T*[lvs vEYYXNZZvMw9~8nIOO,[plBaa!aaal߾K.188(JR}]xHHHĉԐƶmPTb SRRBHH<6mO4^r%V-[ JA"b!??;wH]'̓immОcZQt:l6ׯ_PTT\.'%%+V022Bii)r,e@*200@VVgCxx;7/_VXKqn'11UVݍ^'++˗ѬZjT*tcٵkaaa#J&//D6lkظq#v4 p|rr劸u:Z^z=iiiNjFXbv]v"bccr h4 #77D***P(߿(1$''SZZJss36l.HdrrUVQPPng]0jIHH/bbbhmmEt:9x 455@RReeeOyy9W&""N8 ?8IIIm $H AL&~xM. L@b0D;uDNB~h.HH$6a" Z똘Z*~g͡h YR` ăT*?#iLs|>Ŧ\@udw[.[Wta\o@ ϗ|1vFll=Y&**J i̓"!!Dr۸[6]]]bZp[;//Zt:󗬹;ShᠫKP¦w wnYВwww%..'Nvyg~Z4 xBv;~c}uܺ $H A0::**ol6T*Ew];̞|1 A]\Bso=**zнӳTuV^eZzZ: 㴸~W¸sw;]ܫ-9AygiM軕q-o\.F_\xf!m@w[v#DHzK.0˗\=yuC*hַETTԒkl5/ $H A|9xP6 <'HpݸnBCC͆\.GR}cB-R)j|14jr9YT*Ւ WzRc||YZp3mlfll F1::ܜ6Ld~~VfcrrӉVjX,&'' bԿQ^dn7.]BpeRRRS(@YĜ ՊFY"_zUtp8h4, ~+HߧChh=Mv;.\ ==w^&9322>=}Xj. \Eԥ$ 4ozzZS~? qa~~NHHN ;)1,o&ᄅ199) _r8>VKkk+'O$;;{I_$vmY'&&0Ljn7cccFT*ZOTp8p8nF{FTP(~h4v;wܣ $H _.$=Oaa!pӟJrbS[[!''U\ɓ'z*UUUaxWhiia͌s5(..ҥK+IIIbڮ/+V~3Jx~DSS˖-ӑ9rsaHIIrQYYICC}[lA[oouVt.]"$$sl6p^~ez{{!33 fłT*vhdffSNٳgYvx!ˑJe}yBWWommm  s~ \xTJEE;wرcL&]Fdd$JFP`~~qna6x<=zQP|p8jlڴIz8R)& RnQL&BBBիb2PTX,1w7 *L&NC듯*~qRSSq:L&|>fY[nff׋Zsߺ΅Pl6  `0VJ 8veeer<gϞ*222ޣI?r}Z[[ihh ;;_Ğ={䥗^-[066&7nܠ{Z &&sQPP@dd$p3*̌p ˱Z( n7333x<4 6 ^B`~~"^Fzşۅ@WWo,Wo6yWikkcddˍ7o4LLLOaa!\t+Wz1 ˴MAA>uuu444`… \|PA $HCZ|>q::u Nbb"˗/h_,Ʋ~zl6===_UJEVV6lJKK\7o&44UVɩSذaKff&TTTrXbRf X|9sssTUUtttv ׯcZY|9999DEEj*1imm ǦM:OLL0;;K||==͑#GP( yyy8qgffQݍZߧA$ Νcʕh4^~ehkkCPΝ/ǃCTG1>>NLL /(t777sߦӉRޣōO>,,,j`xxZ1{zzرcΝ#))"֯_Occ#aaaL&$ yyy{nV^F.˹s?ۙeǎH$fggYv9شi:ٲe/s9rrr8s ?'fffbʕ\~+Vॗ^bppmmmdgg_D;FKK Z[oR N>Mgg'N~Μ9‚?"Hh4|ǴJ?1 YFlŋ?LYY zٶmUUUh4R)%%%1==MLL MMM`0wq)BBB|2'l޼Nss3oW A eA{d%UUUzIOOj>jFFF{r4 uuu(JQˡT*ÌBrq)o.g>cb /\.W_EףhD~ٱccǎ75W\aƍfQ 8Nj5]]]}v233yJ+n|>Ǐfv[?/÷mmۆbDVVsruebb'|233o .<1QQQ0H$Pw^^*jT*`ǎ=zÑH$\tC/CTT/qIQc]SSCUUO<DV/ Rh˄q$ DGGƥKp8?.z)#66W2;;fbv <]o|p@ {/8Ź\[[Kgg'!{~bccի;TUUQWW /s='F%##I]]EEE t: ;wDӡRATRZZJjbbbJx<Y~=qqq$%%q:::}OPSXJnӧOcjf1CRpX,399FHHڵk9q>ZM}}h1L&&IJJ"99 Rm'99Yt֡`u!,IJJNDբjE0t:tV^ȃe $H A>){<, V׋dbbbK.Ԅl~$q/2ddd$TVV"1Ehh(!!!?qtt4o>Q#j4E JEBB555ݻgϒikk#>>ۍ";;9#"" %55#114Mkq&&&&FN'!!!ucc#x<J%niF#aaa3TjՊZ&22Ckk+r"T*ɬXYVZZ&33\.g`Z1==-*l۶"%==@ @~~>6DJKKaffLVXk0L$&&RTTDXV*v܉jeǎDFF2==D"!!!<ظq#mmmlذM__bL&ݢ^btZבDFFVeffoߎT*6l؀㡷RIaa!IIIt:bccallLtn@XX~M61q5t:555bʨ( ioogpp;wKAR`0P]]˱l9s\.GPPSScjjbbbbpqqqݻjkkYn\.jjj`լY1FFFtl۶ FCuu5ua4CRqFFGG')) HSS񔔔!唔PZZJyy9k׮eժUKuu5& F#8T*.]b``8 '==x穫#223??Ooo/L&ؼy3k֬!44*ٳg}}}|'ͱ~$H A b.1 zB#t:Es%~0ݎn'&&@J$Oܹ91Y&\wNϾ߄鳟V{=onnN4?M۾L,΃~xLOO%@{ϸ@)J}3(x./g|  jp8oͷoş;qw;*N(餯߭]/d]oݽKݩw{}?} "w?MJӽ~?>>O{iY󳬭ik A íE~|'ۍ}D"jbٰX,ߘn0O|>#_ł¢ [3'>gzzAVc01n{`M A $Hovw6]а%$$|}Z} Z-!!!_v 1GND"Fq"X=Rj"lN6 A $H _O$4V-HRR9[?k9_5V})̣/J8|L:yx,^_$H A A}n2F.Vl 0==L&d(a<[TS ZfttTeT*ebbZ-jO^/cccj|>LNNɬV+Kdaaz=!!!x^bL&f133CXXfav;aaa\۞g4"n 388n1RQܭV+CCCfJrJ%CCC3??/h4axxx5f.!44 t6 ӉJM`qw NX,8NF1eRdbbiBCC{Iڈ1@CC8qV$آ‚X[gppPbLOOzh4~(Ol%3<<sssb #G`2顡?(J|>FFFp.8ҵ1??Oxx8466%p8*) \r ѣhZ'33\.&''7n\'bAfhhJDD팍zCڏ'Nٳg ٳ144˗ |'d2.^ Fg"qݴp f3O&22ӧO{{}}=@'O2::d"%%eI c0 19211ܜ斖N:%fAX١!ưDDDgjjJ|eJ$r9v gffQ^#\Tn4f}AA\.aaab0 $HǃDqs|>7D*.>  裣׿[~rAU.si:;;9<)))\.^{5ٲe ;wYr%W\{ի_EEE  DF!&&W_}._RRRp\rf>#mۆJ7୷b\vF.]Jj_@ @XXZ_LMMQ]]-!^,/,,077'9/faaǃL&caazHhh(]]]7!//OLe0j_X@onnzV+Kq%蠫z4:::ǃN_իd_*]vJ%Nx<9vrj1LK3gΈ}P(x6yV+Z6 ,Џ9??}vݔ3o~ҸqGahh%QO<)?|2ׯ_?zbZZZxׯROL)H8uoommm455!op{{{yٲe Ǐ'++ F}}=%%%?~rjkklڴ#G333pi֮]'|BVV&ywXf ( j5}}}b \Α#GhjjnL&crrYz\.N8oIYYj_~ &ۿf!JȠ'Ob4'22~ӟGXX7\.'..3gŋ"""IL&x);;;4jN}]Ԋsss̠hX,\r69"@*RxwihhxT*gΜyA  ^/ vpTSVp!J9x 2`rr۷saN8'99LLL//8NvMww7^Oss3YYYx^J%RRItt4LOOWWWYP &aaab>h4v~?7ofǎ QRR">/""χ3g`Zt:NJJxq1/}^~e6mDAA̐Z>zzzhkkC&ɁVZEyy9O$ Wرc~yǐdHRBBBĺWUUB^g||Ccc Auu5*xRSSnR(LOO/gZnebbY!33Sl044Dbb"y!## vh7998iiib&''bxxDBCCinnF*zٹs'gϞe͚5h4 GE3::JffmWT,=UUUHRbcc- Ogg'jjjb#A =Ubdɡr^{5>+ .j)++n` \.jrIvMddx>sqh4 222O~Btt4EVR pߵk壏>n lܸQ4[|9. ͆BLMMsNя~NWvq8 Ç|rxgl6t:ijjb>rEdd$"99Yr ^ 6py<*W."P*朕r񦪮lYv-TTT`4E۷gA.#ˑJDGGB]]ͬXB4jKRYYFpڊe۶ml޼233ٸq#EEE:uJ\ׯ_nSZZ֭[`y_G۷ogrrd2@˗/s1rrrܲ>>|~N8AYY}}}|ϋ^pW\zדLQQvM6100(tuuHkk+l6&''EseIkk+{gahh'NP[[l&99Htt4kttt`0O=ڵk|'X,BBBv.\`|["<> B***P*|>9˗ 22nn7?)**wޡ'N tXf jjjX,~JKK%Fx~[;)**[RVVFYYw聆]vrJv Xj8v;wu։s׮]}vXzS\\ƍGL&r}ڵtttp9xٺu/K111yLII Gy1c8}4 hF#:??&337xC:}4IIIQ*\v ֯_}rss"77NOEEсdqe֯_M\db]ӉL&3L $H/НN'  1MPxx8n^yf3&裏bΝmnnɄhd~~gh4JKKf sssXVR)477.GFFvQAV_]]]x< rikk+W[oe"##EFA{6 /i_ѠRD_4/j"##bhh&+Jjkk!%%!F)..СC_sGG/W&)) 4 >,.il6---lذr6l@hh(f a``y\|+{{{E9QcpY֭[Guu5˗yfrss裏VGӉcA&zrl$$$Aii)G.* '<<-[PYYB*~~ӟ244YH%77{&!阙BANNAzz:{J/ Dndd$[nex%{ߖ\.?8999$&&R\\L||<ZDxx8yyy|["))Yfffl.]ZlܸQ=eP 6m6~?\vfBCC"55gyr93V:::Xr%[n%44Tz1L7n ##A6nȶmcvv%333 P^^ !JTTwfʕH$:::hiiX駟"##|XV ͛Yf !ghhHt\`X,rVXAOO^x> mDh0n_߻S611 n Qբ[HHSSSz嫩I `~~^lihii DFFq;w"IHH߭$!!l.>8"""gEEEp)EWJEKK ݤcQQQ_$H An>7nl6x<={ D}'''p Jɹ@Y/L& |>Ν;dggsuZsN֮]KLL 6mr&&&x),,$$$Z زe ]]]ۅ P<2>>NVV蛹aJJJHLLdƍ }aaA tv)ٿ?˗/G"@RR۷oGV/Aw:bhbccNyy9 `4ٶmjl*ʢfffؾ};z1B'}SX[N6XBf0zxꩧZ9sQvM^^Kinn&..N'񏤭BP&ုT*ٲe iii\|JJJctt2/_.^h4h4%j4r9zٲehFBDD11157>.Kn-[F\\dgg.B*f.^HXXO<.|><(K$1(ZAAccc剱4\.Q\\餿Jņ غu+yyyddduV`0.\ $$TՍ7a233UyyhúueaaLt:555^ZX,\.֭[\.299̤Y233ٱchqFV\ZMbb"b]˻2پ};6*8|add\lB\\/_&11{ژg߾}Fۗ$))0$ $$$Ӄb]vQ^^Ntt4۶myFRQQQ({-HHH`۶m@zz:G*bXdڵ?^nl2ill$~1vNN. 1AZZ^Wt(Jq:ddd&~E[&^P|>BQZVVڵkŸ")))>UV`ժUX, #++ RSSFTt:1Lűzj-[˗f߾}tvvR(-- AZ > yĝN'kv;v]|Ph48͟p~"L&DV}+iqG4QQQ_h)1b'?$&&&rʠ͆vc6ʬ[q:\GDi3|Y1WɄR$E4a4Q*5O AQQ }+fRITT;:z d'M|>k9_5͙wR --T_-GYf_d;(66^xA ,;:Nȅ@_TDXǼDGG(JT*f /K{~/\|Uz/$H _3E~ϳB$cAVWv8X,nD"e[,f݄|yr?X,^}X,4Nk4""B\7|{`Mٗ $H An M@ >vA˙S|SBZ-!!!_v &qqq 5qnd ϲ $H A (ԥn}YMiN9_T_ i:yx:o!8~Tnŭ3,w@ ؇A K̓}aa1+̭- zX,ny@AB4sRx<"""rn7\.ӤLNN288HHH000F@L&7n &Ex<`0\.l6366FDDV+HRq.p%<<\8d``SE_w\i-n2d2qe2*AV#e~~^L$ZVs!`MH(v_<8OOOo3==``aa>1Y'!zNRcaav&&&0t:Ξ=Kcc#>Ǐ!F_$fI!22BA `ppPL8==M__2~ܹsdee=+QVVGdzdjPUU3n}s~vq\.t:DL&enn(hkk#33S,l6s |>8zzz~ɻn ###,Ig;`0ۂ ۋ`vy!E###a8wbf[G>AƖ $7~O_x^׿5RIjjC ۴m۶OU r*++D|>ׯ_g֭LLLPSSC__ rU^yIOOrW^!,,0"""/uuudgg jRRRzɱcرcJ_׼ر6:::n+#HHNNW^yї|>334f(ZV6fggq(  v^}Urss allY¾4k׮]"""x饗p\?|&==qRqU:;;LЅYd2, jۍ`wr8 p8 c~~^|'\xJ%ⅇbazzDhhnjjqZ-ɄJbzzFhdhhTVS91L&CףRcttTucGٲe 1&&&())abbIBBB|LNNq4 SSS JşgffZn APY,r8N^/QQQbv;\v/ϛoɦM8<_q.(J 088͛ ׿5( RSSh4ggbn_L&._LQQ8z a4 322 [wfffn<###vnd27q eNNN/333իW)((d2j|>zzz⭷"33Zn7\xvp$ uuu?Xr%Z avv/SRR[رJfzv(J$^}U#33 1Gh$??9l0B"Vte6 V!!!\. VYq^/Ctr\ˌx* LDV322`/~_Jjj* 'FGGOsj5:1?l `l۶_]>4ư|'DEEC~_y"--H-j 9|#Cii)| 200T*e׮]O~~>#RSS1ݻG0L:tǏV`ffxx뭷عs'/^$22j-5VaD\KK h(((W[nejj~tuu166ߊQB^lJKKt\.}YΞ=޽{t|>yx<ZaXx"wn ]]]]d عs'EEElܸ.&''QT sEzzzHNNh4200@mm- Bt1zy̙3TTT XZk&ZTVV󸣣ӧOOWW ݻÇr!ˑd 0<jb ~"JE\Zp̭"ZOln7SSSKw}6l(NLLzrss|,,,뙚l6!Lb4EMk  )) E}}=###dee㶠@ xnZt/IY(8N¸v7nGPЏ4ؼy/Eww7qqqĐO?F$H|t::;;E"6l@xx8ׯG.3<>.^NOO333fc||,oĄx$H A|ZǍ7Dӭ2, }}}޽V>4667o2@Ŗd\z'>>@ KD_Jp233vp\e֮]Kbb"7nS]]< //(^JII ׯ_|._LDD撒Bhh(k׮nNB, {^n{z$d$s9ddLfN6ݲ-ٲ%YDJ"$X@Dpd$S}cS".>y>yT6mDOON¨Ν;vIKKCVJHOO'<<8bccxONGUU]\\dݨT*Q ڵK7MHH>NJ-gqF^/mmm[cۑB&''dQQQHII 6l`pp}f`0`ظq# `0(>L X,LLLmشi锕QUUZ`0Hjj*--- =.e4پ}pX W"̷l`0{nhoo' 8cccݻ 1ü]ŠKoHr(**w:8Λ;evvț~ٙ䪿'l6wH+8 ު˗Vy~?uuuX,X~6v'&&hhh  زe=/|=n7>>˗/3224ϓ2 `[Ӄ|/&IpB͆\.GׯR]2[0šȐnH$AGOBRBҾPlBk^^G!)lH" ~ZF eDEEM07M #,,iff&:D!ޣLHeq wFyRDDDD%d>AZQx>wm!H%BRw+E2acii{ZBOB?[mKׂP)GME!t-Gx<͡P(>= qPJgff~I%[IExwGsǥoȟ,o&rg e߭Z WPˌyX=gfqpT*4773<<k[}nnV, w\>Ziv;VZ}Gt:D׳D[[VKxx8&N""""zjlFjÁJ>Q*,..:`0H___&Fww7v5yw8N.\@rrrHHH}>===!Jh4u|={.]hxq\rillw U^9~1V+JR(422W\!++Z6mA__RШV׮]?dzz~***֬+ Yz**SNow^;n'++k@X, q݌cX(;r|UDR!iR)VbCV?r+ tFWW,,,//$''P(evvN˗9x YYYDFFppIUD(ѣ?e߾}LNNNkkpP/prx ^}Uӧiii'$$/ =l6oRTT& .}ttt/K"##h4FgllL(i6lDGG3==-}ZOIHHj244D]]Uc$Hp\tvvb2裏()),DDDDDDD]@ Xܹ@FFLNNyhc2]呾R)>,~aqqR{9}!=gttt1)--%P(d̐v_+/aP(p,,,穧ㄇj|P< }vv+twwjq݄Oqggg줧͛q: ھRTǎ#11sIQRXX(dhhh`˖-TVVyz]_"`x饗0R\\Z`0p̙{[*2>>Ϋ*Իnjjbtt2]FNN?7_Pxf3v H$HR^˗h4477}%{xq\l͡T*d2122B0daay& 2<Kaa!ϋDDDDDDD:xw299QR)UUU|[B*uϱcLjgXg>矿Gx0dddהo`Z G& O<?g^/>.m F!{D"yx v;z~ӧO366&\Ӽ@Ro| jqq1T*.$ XVv??)W\gs~7|>"""ZH$OEE`ݻ>FGGﹺXn:¨⩧bbb!t`YXX`tto|޽p!/ŋYXX@"`2p\?:)))x^牍%//[tLBBeeeP[[!088HTTPPP@VVn#G`0LOON[[?ۍ@VRSS 555 srطo۶mcttzEj5O<'n8pDT*O>$Ŵ`@$+AQ^^N  &&FRSS  oQXX҃^""""""""L7fc||\FGGse233i6~1͘Pktwwo׋T*ehhłlF*|XV&''faadfgg"33YV+pFGGZӇb=ڐdbZIMMe``a&''ȑ#|Cgg'SSSd2r9X,FFFbC|_۷Mbpp׋D"d^2ZZZ! Orr2 p8X\\iL}>d2<HR40L7yEDDDDDDD4>44dB&0 ,..nݺ5:AX,\~Ls=wG^r9  MMMDEEATTd2l6dlBUUlٲ`0H}}=gy TVVRUUd"""_`( '!!RIee%dgg~zL&`NDDϞ={Φ-U*ժp %%%PTj*++q:XVGRQYYNcpp0lܸuPȞWƠ">]C܊P ztt4a)**"66$rssQT`Q(x<\.ATBJ,. Tʾ}(((v3==MNN_XX *RF#_8Ƈ&1CCCS^^Ά `||2\.Jb q88v,333FJPՔRQQAZZ۷ogvvݎJkk+<3RQQAYYl޼EZZZHNN'h4IOO=yy BHZFVDdd$_WP(444011](((BaSՅJ"66{,ߏkID"yEQZw<ʘەmH$ݻLcOEEaaaHz?~/|G.rAph4EDDDDDDDB6ŝv y<fggknv#^owhm Kp WA8fggo:$p8>+6K&QA* [J v?U""""""""K(|N;dA !Jמ-q%cdwGsJVq*GD~?U^C݋:=""""""""""n6'<z At:.+W$񄇇3==Mww0捍XVbccdLLL2Z:;;Jye[a6innJ\.>Jѣ8?(Vfqׇ^'""b;'}ԩS,..b!..1<ǎCףhִ iHMMg1񵵵vǟ]^^VZVL VfqSFFF +5쬐=}"d``@Xnׯ300N쉈w3 az-^/eee\tSN΅ X~ZijNne֮^fɓ'hjjbΝX,:::ٳTUU˛oIBB`^pTTT"66B/K~?/^$-- ^Ç ))$l2裏طoR7=zݻwߏbӉZ_$,, RF Ʊc(--1bffZ-(GCC999\rM61;;K{{P:;;q\Ff@t'Odii*++0\iOMMEcc#ќ9sz{Gp8%N[ݎJ UDDX,ns4RT*DEE100@@ @RR7ٓ!J gddD(kF0b_bbbhF@W( T*z %BFD"~wl6III JɄD"!**JPrAR) M?XV~300;8tj _DDDDDDDdXs`0` 2==(111l66o޼fh)l6UUU}ANN455DQQZ>oߎV744}vrss`00DEEOdd$ׯ_`0p8hmm N|C&F||<͛tKKKlٲ\ ,,Ο?Oll,Q\\LBBuuu_F@7\|3g088hnsE GA"֭[!))w}Lƅ l6sZ[[lT|ux9vUUU7-n/":JJJp8~\.hp8 a[6st:yw(((ˌիWٽ{I:g?YYY:u j<DFF ZMrr`OLLk!ɨ!%%'OFkk+|GDGGFyy9 PH^uJ%&Z&&&ebbٌb… jJ% oT*ܹsӟZMLL Nŋ466܌^bX,lذ'NFx^^/"* OVVzDDDDDDDD܍{ݢ+hsss8Niy:L&_W^#Go٧q>C uwC ydii1ۿ[mojE&!Hdxx \|ܐ766m6, t:̙38N|IIHH&/^d||E:Ğ={07ܹs+DGGS^^܈3ꢸ~$'' ^z{{x<,//yxhhhg}7{\XzD8o}[[NNٳaH$T*|Ivؚ# `ݺuSOwޛnD/--)**;333LOOΝ;h4=z^͛W#===xp8x^lY~=111x^ɡ%{ k\rFJJJB'''~:۶m㩧"//6o|EP'55 '//Ox555ŷ-imm%**IV+gyVIDDDDDDD3 9faa%bcce~~^E/7 W^%++ Ӊ墧1FGGP*T*^/㌌x^&''X,X,1LDEE狀QrssimmeddIZWBAvv62"f3fy),,nZ^/?Y\\`0rn7 r}]Ο?/LLL@ @rr2iii$%%㏓|ѣGIHH'? {'}`@ӭ qqqAZZZٲe |>d2rDB0dbb5kG!իWijjZDDzvEMM 999000ŋDծ Qy'1\zuU·RRR08pV˥Kx~:sssAX)--A(,,DSVV޽{̤ffffP(tuuT*ŋvJfbbIf3,<,D&Q^^k~)qjT*jTUUp8Z<㤤YCVJܧ vG߳2}rrZ" H$Jv#Y^^&--!|>rd(//'++7"H OBrr2lܸr, JAOO߿\餰8(--˙!22e"##)--ET2661 ͡T*lJ.ɈbbccQTz l6xFGG --D6oLII Z,v`cbУabb, 1 $%%`DPTšP(p\$$$|6T*ˆ!55@ll,f~ݾ}ĐMYYIII[t~?sss<Fz= r (++caaD!^'..$*g}\Fh4Rjf) LFlX\\dnnN+$IIIdee111Aff&m6 PT$''I~~>唗SZZFaffD"TXnRRRBqq1YYYL&سg~Y#F.\eY\.EEEbχX}m Uxufףּ>00ɓ'IOOgvvDBvvM2;!XqyyDBee%d,uEDDDDDDD=L&$6 \^_^+xk=>s?hBceZ>lMDDDDDDDD䋃D"rqG@DDD|ٻa$!&qd} \0 M zG#CXp,//z*'6og~pY^^xp:vr|8N+`e˸n|>ߪq|u,X:г~|}ޅd}Ynz<<,555rt:nt7e>qjkkz ~.^H?111,//sy1L$&&"˙/_fzzxҥK8bbb|2XVF#2lUOchhAo{0::h.\ Tfggy|=2޿! #Jb0::ŋQ(:tõkd~~'N|2YYYu~?׳L||<+WׇV%**jkk"11VṖt{ԩS\pRg`:33`3+jjjbP]]J?f!Hz*n8N7 |fjkkw$ իWH$z:::hhh +UJJ }}} >44˗2穩jJyy&&&HKKe;v;###tyz\|T*0&rV+C#JSS B(k28qħDDD|.5DR »}7///S[[NCPFcc#jZ uuubbb|466ֆZFR>CJ^^gĉ\t[>ƕ+Wr~:uuu jimmqqq)"QQQ477 ckk+Ǖ+W0 EVNww7JK.quz{{jf^)"r+&gx^8y$MMMHR^JUU՚m?i9s6vuGYYf@ @uu5:JijjbΝ088լ_Q}] ={eݺu,..{QZZ` ,,_(JΟ?OJJ 111LLLhD*4۷`0o~ٳgvYZZBRV+׿&--A=== [ZZP M( %0111 /Z!zS:Q* 2;;Kww7CCChZ^}U),,{rEfffd2$>}m۶!]V311A[[EEE   X,A$ mmmx^zr477ߏZfllLbbbXZZ r9gΜ!<<\\.'66vC*y<Φ͛7MGG* R |>bbb&v-Yi7551>>Ζ-[Yr92t[\z$djjXz* B`,,,,..}9.]ľ}hkkQ'::Lcc#kט%>>LW\!++ DBgg'"**/dBVۋJbqq={088Hcc#8n7ΝRvt::;;ioo'22@ KիlݺU\0f HRN>ٳgIOOG*R__/i('<׿ׯVٳlڴ{Bf3dggs 6nӧpSO=bJp{ ihh GSS hZF#/ d477ۋ_D&..N8`[ZZQn7~ **z{{@,-- %HCyBϟ?9r7rIRSSYZZڵk_8Ο?OBB`OLL`X(((.j5˼ ai4ڵkd pĻK\\111v^~e裏7ߤ ũSdדK/F̙3dggsammm nBf烃/OLL mmm j|444044$<0tuu133Faz=ׯ3::<111Us%H'? r^z%t:O&55^{ ^ŋ'O^ .B(ziyq8199בdj:;;imm3!|>---tvv 3g̤ 60<ߪKR$ Ng?7ofnnN0/^Hbb"ӧO˗`0/y^ZZZ= dΝH$0LTUos***=\.Iqqq,// S˅BAxUJ sN' ͡~Gll,h4^z%RRRhhhn/?CCC/R\\^'>>^{('%%vo[rrrx'..Kdd$u,"r߹3_EEEl޼ [jb0ּ#)))ٳ'O5R)rֆ'!! INN&99:;;H$lٲF `rr*/<^xFFFP* jՑkO_|񰴴(dggFxx8}PƮk>wBÇ#** \(JRSS'==N:Łl|| 66?ZPzrR)$''377Ǜoɞ={x7طo-""B"=zM6q/N'|Ǚ"N7x^u3Ο?0SRRr~HR /""BT*%** Fdd$r0 RT*EPlfyy7x??gyyf~?тZV300@SS[lN.^d'n~~022¯~+qvAxx8 ~<ٳg=JoܹsH$v!$ KBFWh  s߱cmmmb6wҥKՑ&vٝ~;222b``C ϒcX0LhZ P(,-- sVؾ};?яhllDT|g0>>o6ٹs!!![oeeeɓ uFׯI}ZZZ~ѣGGP044DBBQSS??sYH$HRKtt4===l޼LFoo/o}[G?Unꘘf188` ;;[hdfQWWΝ;OO8z(111:⣏>z{?[T,/2?0x),,W^j8~4WTϳ$ׯ\tuuٹs'W^ʕ+z'55UP q5yW?NTTǎcyy~mlaʵ7(#G<)lBSS۶mR__ϵkאJ>0+ǙZ, 22Rx~Z[oWUO $ >Z@R&'': dLq{Y#{ejjC}!n6šCΦJ|K+%F*233#(` OO<^ѣGɢٶmfj cccĉ~|In7)))?9477ٹ; 8pRxDZl\.$ [zX~?ܹT$tuuh&77ׯ /cBҪ o`Z롱h~i._ٳg+..ÆD")Oxx8%%%<$''cQXXH?v~? ccϳ>KDD Ʊ]vk.㙘< O}v4 <3100@CC6 '!n7- ب׾5v;׮]CSOQ^^PŜZ, =~\"^ILL Ťǎ;c||Պljƍ9pFHoo/aʹقgr155,tuuzy稬$,, N'\.`ayyyac=Mee%[n MDY, Eh _Wزe aaaҧZQL&U^ҒP !::\Orr2zT&??:--bΦTJKK , 333111ߦǑH$t:q\h4LKK __3gaٳ-[k.=*wCzz:< ,,,ɓ'fӦM$&&RUUbݎ#,,0ͫ,CW=$ $''}Mx?ϳaT*ժu #9|02YFFFOOO^{qp\<qqTVVc0%==\gH7FIDAT UUU޽1l69V+<#r9@iX,0<<ݻٽ{7J,z=]]]a^^a4B;ʎ9Vc޽߿R||癟<|wzzz{{X,hZQTl۶Mr5!0wu`0/K0 Ga$ xj~z l6f3ttthȑ#RPP ۆ~:BfT*DDDi&ns:DZZŵkLKK ?^) [*"ɐJ233iooܹsXVS*YYY"""O9{*ބ_פ%<v 'r\\EFFRVVVTd2aIn)_wFsԄf#,,LBNGqq1۷o_Q%<<@ |  ##~ʅ %brrOLFee%:"oߎVe``qaC+WT*1aYHMZp}QQZSVVvZ9tuuGxx8:Lӧimmj۷o|+A͑#GP*H$˗ YիdddV̠RVERQ]]Mkk+tww#lv?3HMM%11k׮xjfݺut:֭[q,.. v;`P35xOʿ,T*N紷/`Z %%zn7*NxL<33#Uz@:u ,477p8Y J 55Ǐseʨ#==իWjB"%%%oNvv6NܹsP^^N\\iii۷OP$YYYsIڈ%lذ%ZZZjHRHLLrpu?NLL ,--cZ)++h4r1\|477sYIKK###CT*l6GNN;wיz{{Wл NGnn.vz.\jnI-.. x(++CcZ#33‘#Gp\䐑!xo뙜UQΞ=d"==7rQHHH ,,bcc"11]va4IOOGpڵU  ߿ꝑ|>qݜ>}6nNBUU B8 0{( %11 nʦMc```b4$azzZhPQ]]MLLM7V>N'uuu$&& \\r+WT*XX3n[KKKRxy{dd$8p{Zflٲ&Im0'_׌#ˉE`Ϟ=_%W^ezz@ @UU Xz=`Mkk+W\att~nED|f .z?O>{ +cm6$"##IJJmoXlFll,Id"%%JEtt I$''399\.GVDYY~zF.O  j51ٳgx^Ѝ"JJJ(..p(JtXVߏhd2aٳg¼^h4 1yz^85v?Nrr2@ @PYYINNqܾ};`F=;uT*YZZ^|r !),,`4B*b0LsN~?d2yAJ,,,+x4=h)""B\kv` 򶐼7..NhRRRdaaMjj*F$Z- ǣ0rdee HNNnJKK),,Պ%##C|i4YnvArr1tDEE!HXnB ( ?8_b0zce Nchh\RSSbrr2ۇnDnn.HILLDVLaa!$''S^^.111ƒ@tt4Zzz\.Yz=^uQTTDJJ#::)nJ~~p'F۷Hө `ł*$d#n:!Gh}&$$RDL&~?+''Gܾ} -MII!55bOFFaaa7=ccbb`0HJJBV@\\0Z$t: BΒeJKKO_LL .K?Bʞz Hjj*f͛7STTlfzz׳~Usjj*III$%%piFFFHMM ILL Ja>^8HLL$--UINN&++lm0 $%%p8lh4{+"r71y]"0;;墨6~ꠇb:賳]}~~cǎ1;;KAAO<ănmsOMM=:fyUf൤ׯjO1yN>-6l C'렇.]TwoJw/0L={`0\.gΝCmm-|>o_ ;qI1$Pf??zMR233믿ƍٺumK.޽{/OO{lˑ#Gp:gVY"1NDBee%wj?fzz8 <[yrssrI, 999l۶3i###:u ݻYn=C0w_A""&IpB͆\.&!niN',//sux% sssDDDVơd~_\.ɾgffjXk 333ޓ tx-t;d~_H%8NnM`ÁDV 6P Pտ *^>a& pCr'%B5R'z84=CB-߇Q`͆B*/~EqΆf oG"p>dq.u(EQZ_ľsNv_11;;O3o> Mb$)=Ta?u/{ xwSj/&|q\_rCY5C/~<ϗ\H `yy'k}|r=[WFe/"""""""V|f.^,\r&ZʌWfq7L;w(..\.̥KX\\$119N:%Hm6/^Ht:mmm\xQZ7_gΜAr8~8~ٳBݐdSN#d'!(0<<癘 !!\N__Ν2;wwwsEl6D,OOt7$::CQTTwNJ%ZZ[[]S@(ʸǏjedddzzzkM(ZI~?(JvNZ4 ===By[hooGR1??OKK bҭ`ey*g2>ӻ 22wBT*x2UwXXXիT*o7$--S9?X,| 222:u^xua8~86l )) _BDA~`Z)))h4&$h;{,'sαgf3`&Q*KF/H~~>NJ}@8ۙBx6:::(((͛73::J]]jzQ,YڧRٳg'""WaÆ54ill@MM o6;w̙3\.׼vZfQ ]]]P(DR177P/nĵ K__;$nA@ww7q5!??t:G[[MMMx5Z Qj7`zz|hoo7 11ǥK!!!qⷿP.t599Imm===& d2~r2]W\bۉĿۿhHLL$<|D믿NGG/2? a, :~{rI QQQzAEruNf~|OF.htEGGZnA|v9|0IIIl۶`0H a8}4 |_8NyWyWj@0vC%M2>>Noo/?y9~P nxWz x $%%G7e&&&&~ ?$,,OOhiiEbbb4J_ΩSh46_4{9o/~ d2dgg3110SSS P(HAAz355'`ݺuLNNb4yꩧdbb,n݊ZfyylcÆ TWWSTTDVVFB@ 33 _"ɜ8qm۶QSSCxx8qNff&l޼͛7@||<{L ,""""""""rϴ,~ry4 r9|0,ɓ'~GllS oFcc#b۩n\fv vufffصkBqjjjr 111LL&z*twwsu!ORFFJ}!H2L.LLLPRRBٳBL&#""`0㹩_я~h䣏>̙3W\ajjJ8$77^͛ȑ#?"~ӟ{{2wKYYW^СCw`DR)555O4 v@ @}}=CCCtwwԴ} ɀ ihhfZ-444ܔ!2::Z/"""hhhf }YxD.300@GGDEE!HA8epp?BALLp%Ʀߚ&zЀN#>>^PzTTHDDGdf3|.Us!P(\v ZMqq1: 69}4?immezz@ kׄd^4===Ν;h4N I^^.]ŋLLL&ILN)"""""""OA󑜜L0$66ZݽUM߻ee T*n:+ckL&cnn\A~뉎F&a4Zt:bccR~~gzzh|Ifii۷a;vFVii)( rrrϧ|FLFtt4yyy$$$t:ٿ?yyy177Gee%֭)ID"AVͺuHLLDѐLAAؼy3PPP@jj* DGGDff&6m"++K04+cГQ*DEEq7>tZMrr2v]THKKd2j\\._ÂP8BArr2z^Hp8HIIIVVDGG W*v"// HII!;;TIJJ")) N` Jvv6~דKff&vrss#661Bn1`9xꩧ+i&|>yyyFRR*`(&77"##)..h4t:ٳg$%%Gll,)))deeaΦPsO||>Vmh4Fjj=ˤYFFFξ777Wp-+)ׯ_'""⮪L&&66VQWW0iii,,,p)Z[[$G""""""""Z|>pevܹ+ Prnٲem_gez=NJ {la9q ռTTTĩSرc|>^x9< =ng$%%!ˉtRSS?套^ٳJTTX,JKKQ*Jyy9/yyy;w@||Mz0dqqׯ399Ncyyx\Bss3===qu6mD__|2BکS@Q[[ƍhM]]F._Çٱc.\022<&5)fQո\.N'~W2>>Nxx8555 b0V+CCCHR\BLL ݨjillDVt !Q b0tuuQ[[Cp@ z= `6Q*(j<^ߏ\.DGGr 22V8կ~%R[['&&zzzJt:q\n$d0djjF6o/b֭+,,,EBBš+yYXXc3͛7SYY)tGGGu{n;E*}vP(DFF͛AصkDEENyy9قqUUUh41.|zz:BXXXܹsL&J%8NoߎR… dff @yy97oU*EEE,--o>d߿Lz{{o{ww7/ 3==͕+WFbƪÇT*9tfX:::x饗x~~zx fff_K$ywh4LMM j`x#9~[_ aaa\z6hhhc||̑#G --Z-{9|0*099H$-/DOO׮]CRQUUEZZ/D^^۶mh4 XV4 >***d\t3e2  tBΝ;)..o߾9ۑH$T*vu똝]vJ,[laÆ 7IH$\zm۶G޽P(|2111ccc΢Rz$&&aY\\$..l4 iiiuV!<$//Oyٰa/_JZ~R)TUUQYYIJJ 111䰴^gݨT*y!66шh$!!A8H=s 333|;ߡfb wK^^.\x#""""""""T;dÅ|Z4_sE$ 8.^Hoo/ $)@SS.'O$<< `0ȿ܌ejj FMM ݴ??!JrI{{;W^bOT*%,, ӧIHHB8\tZ[[9vddd7bucccIMM%::|+h4d2R~?H '++ NGRRkL&JKKoWΞ=ٳgPPP0.\bsrrGRQ^^NѣSUUO~vyOnYnuuu[dgg`$8s Zf޽fL 555k֖.'++'NpܹJ"a0bǎKAA/[Ro~B& xp8ihz{9^ K I~'HR8@0@Tdz*~ |ۚP{賟]+~<u+""""""""H$TTTzC.t:o `0\.'&&6>$qY-@GF=(nYIyx% UUU볜_,=o<0/SEbii݌5󱰰fvlO'{Chnf>n7""""""""w2!g)do)qw\LLL!#^d I?&t>ZZZZ6>2nV JJJZGGiii QZZ*̫׋Q&%**{~ x{2v~F#Vfggo+TTT$zoP%O2}a0@ @{{;iiit[r߈o~np݄ B!IddM) h% u/-- Dddu +> 2::JDD2P{ݮ[}OfFaoWIyu{?""""""""wK(S=b!,,찥%ReqGP7JR \@Exx8r|j܋|9!"##1LNNRQQ!aaa[nw5>xWyG.#έgRzTUU *곷S @ jr@s `ii "dkz S^^fCT _Xr"έ' c߾}ڵ ஫d}]&}v|>~ _4DDDDDDDDDDDDDu$$$7_8n%U1n.byy׋`~~A=tY""""""""""""B(`p,nMI7]sU5Qp<辊|iQ*7PɃJ/""""""""""""""roUxȽC 2y tH6%tEXtdate:create2019-01-17T12:49:42-05:00:b%tEXtdate:modify2019-01-17T12:49:42-05:00K?TIENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-plot-cpu-1.png000066400000000000000000000247121414302661500266650ustar00rootroot00000000000000PNG  IHDRqsBIT|d IDATxyxTLBBH D"*YԲXBYiP[T*P~j] KQA ժ(ECId|H2yg{>+W͜3|Δ<9g.2}42,L>С-Z؏ +]èqvޭ]v)77OsI߆gi΀ԧO!PڵK=hƍ:r-I[V޽{l@VXX(nnAEIOC.$qy(+U0j,˥k3~KRbbTJaaauƋ$KRFx:qd@v$&Fum5Uь 8EkWP7 R̨P1)o/_ZBOomܧIT҆!AK^w^6%x$e+uKrHRdx$3y:<''G|sJ1,8N)3I;ʌﭵJPW|r?ѣڷo$kQ+חi[n_|}s%%%)>>^tq8p@;^/\Gj]v/yAiiiS˖Wi< }M҉Eo\.5i.]h񊌌$:>-a֮]^nԩ |~Q@w5B.K\.YǥӧƂ ʵSNcǎ۷Z h9r4i"׫SNyS,8ur jeO'iӦJNN֑#G?{eV=zTM4QÆ ^kV)((ȿNvvUXXhӦMjѢBB x}< EEE)?o<1B| ͛7ktv'.3rGo{C'NTFkt=5jdx䵏sN^? GG5zrIKY?՛7oeϘ|2 ԦM-_\FV||ƍ/˥(?~\򊒒ڨað2m( :*z#jժUںu$e˖ҥK'22W^={Zls)$$D9~%Gϕf^ t! M:Mt=ZO|>_uv-mYYv%`nsN3_O|\㩰Ȣӛ>}ZW Ν;w^hСo~0eggќG8w $I={TBB֬Y5k(44T@QQQUtuC5+?:wl-YDԮ]2mBx.~niˮ$3= &*::Z|j֬ƍ%KK&T|]<): Ԍ'f<s=ԠAy<=O9sF 'ȑ#_4kɖRݺH* #4ֆ hϵ}v\R֭S׮]5y$NJq\N7C|%¸{%S/iĻǏkr4aD+5u^ziBB(<}ZvP>W7ok_^A|;vr)4K,$$DgH*:;9s+u̙,u|㕙K(11QRѩ\wu:vXNH]-Sq?ԬY3=Z~֯_/˥޽{+.s_t;55UǎejѢEz$s裏k׮:#ѪUiE?нWzUX.mѲe$I۷+;N|92Җ-%9ںuZnƍ?^zi:w-[(99j9rM>կdKݺ7>׀~},4N>r ٳyQӦMSl?U^SBBBBTPٳ:}7VDDDdݺwJONG+,,Taxb!8sT.ۭ3gN]g^W (<\.NA͕=*Җ] %av`'ʯ@HJJRZZVPjP'MOf= 4PӦP4kL9ˏ\AṾGy rgO@]vթS'm۶Me~k>*ӃPԩvɬƍGڸqcu"<@hР+~$n`،z8r*3s9`0Gx#<s9`0Gx#<swIwVNNN*PI999ѣGiӦ* PqR?<( {J{=fNw͛7kرj۶7o믿^f҉'$IFRLLbbbtUWO>z7$I_}bbbfFFF/Vk^WGVǎUPPP-cꒀ-[jv~zzs233{nG?ҽޫݻwr(rJܹScǎUhhhuSjȑZ`v鷿F_r)88X5< ۭm۶y?|n&]}jӦ(_`J8z={4mڴ2=_TϞ=kV?Ν;W1uI“ ^v㯿<ڷo_}M1cƔ{s)jڲe>s=CŎzq׊+4c ٳGyyyJOOٳꫯ^.Kcƌ?[*??_;v~;u]jР b >}Z.Kqqq VPP$飏> .6*lٳ*,,TNvu)-Yꢀz뭷tA 4HmڴQjj^n2m߮[W_}RSSկ_?=uVZ=z(11QC~3 0@ŋW8ɓ'+%%\IJHHМ9s4l0 8P&M+5qM>կ*Té}nr=gÆ ޽{{+I?w$)**J6l(sT Ԯ]PKs9`0Gx#<s9`0Wdzq@@-ӳg ?lD1\U#{@vJ=S-s9\Dݲ\ktDum@ eT=Mh0FGK]m6jJ111F#PYѣձcGsӦM6l=C̔$qr\r\P.]rJIÇre˖bLOOҮ]JoZZ~aÆJJJ… *VórJܹScǎUhhhwQ޽ժU+:qOAAAz뭷M2EG_ƌ1chǎoVVz'uk8,\ 8z={4m4O2E?SOcǎPrr͛qs\ VTTO.ۭ͛7Wx^̙(q;s"<ǎ?Δ)SԬY*Þ={'^v+VQ*[K. \=u oN"<ڸq̙j휿Ӳ饗ԼysEEE[nwVV%7n oN"<7o#v$)..Ntȑ+;j(mٲEֱc_BԠAI)s-XTTΜ9SӧO+**|"<4~xuM>ƌc:ۑ۫m۶Zte_x)<\۷oajUx.}C;*""Cq׻~n[7o~Gx@;vTf4c EGGO> ajEx_qv҉'ԥKmT+ 7hĈzյk׀lV+ ;vLW~?"<7;xz[oUO?tv@mPkSogGwy̙|&Y TZrC(͞=[۶mӑ#G3h֬YzqXu!q伺ow]/̙3yfׯBU߾}kNڽ{wFb p jڴWz@u37{w5aZJ Õ?eggwոqJm.b 4mTmڴ=ܣ'OG)q5A .rPsԊS-Z]7w}JLLÇxb\˅7KIIQ~r֭\.V^+V &f#|>=j۶ڵk'|RO<&MCL՚y~C ѐ!Cʼ>PD/ "WhJUOu@Ux 9`0Wju*ƌ9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0GxL{f uIDAT#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<Wvk׮ 8# OϞ=5Zs9`Ro+;;['O xj&M(::ZIIIk\YÓ.˥n)éҴo>]s5]kMOյkW9So>v,^r&TxsI9ȱ BeSk޽{~^puVlj裏Cwq6mƍoq}:t}?ocj߾ϟ^zC4iΝ;_'##CFR֭լY3_N8:pFVZꫯ<f<0Q-yu7kҥ^|K!עEhܹ>|?_zjMLӯk9vV^qM0A+VcqW)))zxٳQ͕KBpG9rZղe4q ?IffZhQ:W]u p5h@SNDFFjʔ)rG 67߬O?TS4#*,,ըQ#gϞЛo)I5kԸqc͚5K%IxP̯,]TQQQ%IFRaaV\Yl͛_#GʼBs^{5hӐ!Cq8urrr_R]vUաCeggĉubccݰaCH<$]*33S]tL8Q!!!LT'iNvv{<-ZH&L?o߾b޷o r˯KN$sJNN֪Un:AUݺ,ɭުgP6m.yܹsk.[NM6$%&&]/֭~y^ſjJ-[͛/;2 PZ6lЁn:og}-[/_\6mRaa^x8p@C /߶m-[&׫?X˗/رcKFqw駟[o &T4+PZwun >\k֬QffN>իWkԨQrGNRVԤI9%K'Svmr\1cxqFnSAA}QeeeСC/@yUT<_-խ[7?^ziѢEu^͘1C ZpV\8 _jݺ&N[K¹뮻tau]۷5qZjƌ3g*%%E]ts=[S]FFnF 8Pǎ 7|Sԩ5sLy<k͚5PnԲeK 6L;v(wxL_>OLL 瞻+==cኋĉ>*iӦiڴi]޺uk[:u A[>sb'%%iŊ%n^`J^ ˳UV)''GÇsU_ԧcE~i-뾓SO)$$P}:VVY{.ʵݻwWb4Fxjf_J߷رS7L땑q?}rsF>c_?NwnU~}#{|4z\.kz嗕FEWjkfJ}߶mnWJJJ]3IJJСCK/a*ltUW[{Ue#zKK4z5jHtAa*mqoN9SVOJ*99YG$\_~i-_\7n$hB]t)R';q]^W={Ԍ3ԢE +22RO1?p G?g^{nRuIҢE 5by<%|-{eQXX(]`vUXXXm:x|}#s_KGyf(swRRRSssspBIRv*c;9Zv:4v8%$$(;;[>OM6cpIτ*ßg=ZČz."""x7s),,Leܹs5lذ.Zr8>lB{ю;~ں]vJ* #%&6Pz;ڸKm޼Y˖-իյkWM8SS(.ܩV ??.g߯pl7??_~[ݪD߿_ (˥c)))IFݢ_TjǼ^:+){q| XQF;ciZv:vNV }}%-ӿ?}oÇ_~Fn[7t|>֯_+V/wg%믿RTT=JvUE`ڱ#KRtM~Xs|SS}9 .PIII֢E ,԰,>^xWӏU@E|w6m'|RiiiJKKW\&M0O|G}5|=J9yԵkWhW5o|.R?z*)xWF۶iŒU|>M~O%Y}kÆmܸQ[R ~ڟW/8_\p6lؠJ5u~ou(_K]ݧw@u6Ç@͛7WLLJJ YstQsEERll\X.Gvbvuȡ^H4?Jh޼ ]/C X8ղS0<,sI_Xm'P9[hݺujҤq* OLt=}:y<5DDDq5P4mT ;ʷFṤ{wyU sgOvsڴi +?F4*HHHPΝef=MkРw5k{(! ""{U࣏>o70Wnrq=@p8s9`0Gx#<s9`0Gx#<s9~ٻm۶)//JωSjjj-8Iyyy޽{vZ p#Lڵ￯ &h۶m&BA_^rڶmf͚K.߯HD%&&sQ^K;%&&/,ͬ,%&&*### {ァEZbdn׻۔m۶闿ƏW|,u]6l̙TĨ]v{5|pz.K_NnmڴuWsU6mԷo_|>9s^P=ԲeK{T\\1$`TVVFu.뤏kx7P_~a|͊PII.]ÇrI& WXX$?_@V=zT%%%ܹn: m<@( hx*[ڵk6mhԨQzk+zH7pnV{5jG}Կս{w%''koZn:-X U%-[ԃ>Ao߾0a5u '8 ]s5UzNzz.Zpq$iǏLHR||ӫCx$k.C*>s9`0Gx#<s9`0GxYfMѣG[_ַoߚn j⾸VZUs`0Gx L\ E綨s Otn u޽JY `B:׮]AI&Vtw+;;[t7rr)66V]tѲe$I{҆ m333S.K[np֭ӥ^z)%%EͫjYϲe˴er-;+ԪU+}:px 魷7i$y<}9rFQuUWi;wsu*Չ۷O_ceI&iӦ>oF7nI\>tRy<uر޸qt/u]7n6`ቋӚ5k*;;;(k8-Z_|Q͚5S||&OUnݪ.7h@999&Lu"<5krrrt}v$I&{vÇkÆ ڳgۧI)~qqqNjב#G=vaW Q'#IcƌQnOkȑIj߾ڶmEtןbbb3c%%%)66VTxxZn}m_xڸq^u /AUgvl9)SOiѢEmٲEo4m4-^w\;vfΜu֩@_~>5ϐ!Cv5c kzW5a„@"`΄Gzꥉ'C2_>H;vW\ j*))Q+G}T Ұa԰aC 8P\sUx\Ro6lo]O<񄮽@`*sxO=TP߽{w.7Oh͜9S3gά~/"~#!^m!;!u3`0Gx#<ܻ̅Zҿ ~60Lx#<s!wqXST9QڡFy҈BHHmp H8k>uC;vꫯֻᆱ۷kРAΆ,4;w{ァTt'nuV8p@]t 6Ku69ɮ0~ݻ5gEGG?~l@Pk<ϳbm޼Y=zDNS`oٚ={vB]H'/??_7t$S6ٰaRh]$b\BDHK3*\I?G?:eZnyq>:̱)5khO |+ֻZ'gRsԹ>}uzxzMbz]zRSSՖr)4[`Ά'Ra8+Vaaqh_@_<]{{qo.&)7!Ά-TzبD)\ b]MP‚5L'x巎sbWkT҇B3uLo'ntmڴIZRbbшT~;jĈԩLܹSW^ye}Ν;vEu:<˖-Ӗ-[t-(**kƌڴiݫzJ^{@`.O8?&A׫3f(::ZSL17+SvCcAM>]ׯW>}߆ w?kN111ڶm[:1ٷo/f;&MRӦMk} pC.L7Vrrbcc5f̘o:1㉋Ӛ5kjرjذl7[|ߞ={j4_ջᆱ͛7A5,ubYf)''GwlG*C>|6lؠ={h߾}/7kܸڴinM}WBA$3FݺuO?#Gvd̬NjI?j9)SO馛nRllnv%''kϞ=Z`:tpk.ЯCر233O{C7|Sn[ݺuҊ+trx$W^8q:t`:)|>s=j۶ڵksӄ uh:3)SOu߀4`JOܞ owm!s~Iԩk< 9`0rj:P1`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9S IDAT`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s5U1gGZs9`Fogff*77W xBVFSk^Ó)˥+2 m֭uyt9 P9>U׮]8YѵkWT5N3q@N8) P95s6~ pz\:l r* pj5fEjٲel&Ux<֭[ Zx̙(-X)**ٳեK%$$e˖߿V\T*(xы/ ^jРAZpf̘ mڴI&MҼy=<eƓ]vi޼yϵqr/2u]u嗫gϞ裏n :TGV^tEg9Wy[nڵK ʌW^_ոqc5h@7pOղeK%%%wOXbڷoٳggϞر&Lb:YYY>|ZnMꪫҡC8vܩaÆUV:suw*//L%C͜9SWX'>?O͞=[V:gСڽ{wO w:s~[={T6m*<)))Ѹqe}4l0=zԿ޷~}GZv֮]ŋq_~jѢ6mڤݻwk̙ ѣGշo_j˖-/}vO"<0a}iŊ3fرctWR&M8z:^s嗫GrG͚5ӨQhѢr(66VÆ _KzZxƍW5VO9眣(&&F뮻xyf:qqq4iQzt5?ΈJJJ4{lկ__aaaѣbccoJ~EGGA/pϢEnA4|phٲek֬ ޻wonӫ<@ TK&Mwߝr<P׮]վ}{uQ:p {;^z˓$ڵK))) ;aۻvRvvt7n"##w.W+^iNnnRSS{<͟?_cǎ?}r޾}jc'[~9p I\pRSS|r^ZFRDDD|kru鷿ԦMr4sLmݺUWVƍ%I|'=ߺukرC^Wnw/ZR-~TVzzvܩիW? mذ}ɒ%ZvJJJkΝ0`Mxby^}Zdn Qzz'[oiر: ԩ7߬.Lʕ+ÇkŊ>|ѡCԪU+5jHh…:թPc_\.My<YFyyyUTTx@999|ڽ{w TUOI;|_ݺuSRRO>ٳϟ_w6mZlyiٲek>hРA֭[kܸq{uuUs7kϞ=袋Ծ}ZNe_ۭ˗kȑ>}:t.]gѭ*)}.++K_~}bћo,uYɚ>}<bbbrJeee[njѢ ?2Q+\osrr +22R=$<t6+TS.衇m۶`4-g<ωΦcET;<|r\|SHr|JLLp^r}رYˠ|>l٢ 5*i۶222n::t(c IJHHP۶m+\]i׮]q5N_`0Gx#<s9`.\rssU~}97p͕ӌ'=]u@lJKK$$i)6'&yMrIENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-plot-cpu-result.png000066400000000000000000007463651414302661500300620ustar00rootroot00000000000000PNG  IHDR 6wgAMA a cHRMz&u0`:pQ<bKGDtIME CQIDATxwx}lb{'@`T$Zc˱;vMO{{ؾQ,۲$U)REb'X+bERrHI<+3gΜsffH;v<"   bL@ @&Yyۤ٨AAAwt:T IԹy{4T U}3 ,kWTAAAxJ$ T{ Z35E<1Vi\(:ς   fHHWϷ $$'4PfVdnZBT$6hm  -TdYO79-.IePI3s˕=i$!I> Kg$uwOM!sW/2z;$e7JmQ>y-7[< mJ:FQdT$w4WURIeYY^L&C"@#2Dj^O15|:;: ;y! ߤiΞ EB.>H͞#nT~?fÆ &ff9{FC[[hlٌF P1ΞcӦhZTUEUU$Ib||-@UU'觵j2t~l;>> D"妲"?_&KC}]S4.46  O׏bx>Bz=T)4 2|~j>>_{R#{9dbɒ%#U͐L&q=8N24ǎ"9ADU]$IDQB$QXXV}GJB,]ځ((ӧI$E4 HVK:عi?+NʝV#kcq D#!:A7C$BEybӦM>FFF0 HOD" . E033(&FG?+xX,B'O2<R4h4n7t:F#ǎu~KB!Z-DQ, `0^AQ4TTTN O`X2<<̳>ˮ]hnn__juTVV2>>1==M]]`@ !H288D(l6(2suG$ #-:0?A:;sYn7կ~""~_0;;K{ҹ $ 33ʹO$!jjlBFFFh4o>篈{^jHRn`n ,X0xEj2 x Y/ OY:$sp?/z9vDԩTTTjyꩧx䑇;X~=7 Ug?÷- LNNR__(iii.F8}4Ng1VeM\nI$|ȑ#LMMBqq1AU_܍!~W_}'NFq8twpadYA ]]_|֬YMss3dhh; u]q뭷pQ|#ꫯTn/Boo/mmm166FCC:tB;uuunqQ@AxK2X,N~@zF#Z*)**BAp$KL4ٌfo߫TVVh90 twaڵ455kF#Hә DxUW]$~;uuu8q{riF#g1==hxfbX7#< 3 Ha J `|>z=G}}=O'͇>t6 UډD ]|5krqevZ[[yeT*E,:>`;xgep8/eϞ;ټyL+:777sY>inn;kerr˗GGbe_}U}Y׾JeeO>kRx'N2;;K<ٳՒN "I{ev>OCCC~D<GUmV|G|G|Ml_}4ghhǻ8s4nx1jjjjvffIRTVVbZX,lذP(DA Î$IQXh޽gYz5ivɊٱcz (Š+X^vڅ$z=^x!555l6^}U֮]f(GU3NZ-6t:Cmm-/￟zjj$3ظq,O2::Ʋe9t0gΜc)###zEgǍnh4V' s'uS$vUoL&fzzh4h`0N^Nh4^/N?c&G$4:6^8&^(}UUDsffYL4h4|K_d/ݧRiVEfMAx[T5l;\ylݺUUYv-KJo`ɒVhkkCQJJJ蠨%m\224P]]C[ےCԂ,k׮[od2RWWGss3tvvЀ``ʕ_FQd.;n'JS^^AA Nf:FK.f|2"[XrDr-_IG2JKKXrZ[[Y*D"jkkihhK;(,B(aŊz-x^2 ]w[lVGGRV^M:ᰳf:;'d 455R[[h tAUUjjkkio_JqRF#+WdÆlٲelذY0-tv.`p8YJ2M6f0477q:;;A7P^^ /d˖-4N/uAE4h4ZdYZX NG0d*x﹏,$ d2szNO$FQdNyVUf 8&Y>W:z숚VShuZ;>w¡(utA'Ff.{:wxR)TU]udy-#f:ΧJP%\:ȲL*B$EC&M;NrTVV=/366F]][z5]I{gR^^<+$   /+ eg|'NZ$ G<! SE'D<`0ca6ٳguuut:Eo*dY8qi|>N3ZV w殮%:$ID"~a}Q}Y)--p[:FrxY"7ZI<}v˱X,HwMmm-v}sAAAw]A$ ߏf_"zSN/ng׮]i Z[[/xE]$Y~=۶mCevIaa!$199?N:f߿GGG1^z%N:E(wn6ms=0uuutvv"In]vJشiK.`Y% (B__[ne޽8qƍ7ވ,$ ~_䯲_y֊a   R*2Oĉ0>> yEl6O}t;v_ P"-[M7đ#G茶\.7x#EEE >%IGyKXVz}YN'WfӦM`XhiiA^$``019rP(G>K/Doo/EQftt%KPRRrʐeO~SSS<455188Qt:Moo/W;vƷ    ytUUiiic{3 b1v;6lxÅ(W\?a-GQdYFI$H͛1La0TUv>O} ^O&!c6lͲ,c2[lPZZJ" F蠾>BDѠjb1q\AA]` 0X,V+voL&F񢁭v*++q:hZv;zݎᠤGye˖QYYX nÕPU***(,,DQL&6͛7Ϛ5k'LOWw8 vt:ͪUBu]466rWb6baٲe8^/gΜ!Nt:/PQQAii)%%%SWWǵ^pv;ZT*œO>޽{ٲe.  .&|ETT*` LWYh4B!f^хqdYFh4$It:dh4]$h4Io~. =u^DH$l6dY&(((h4e䮚bZW0f9w/DUUbXczUU XVRdqaX   N:oC/8Υ^^8[Iz+og+s?wj[$I$I:IJe0bx   »vEd.{~5k   »&]<   RAAAA< AAAA~S"@AAAˀAAA2 tAAAA h.uG6jAAA޻.=399FsYe뿝(_l   . Kd;e%I GUUU=,/_ns+2Lf:] iy-t:oAAAEAw222B*$!2Nb``YFD"@vaPpsI(h44 ^A0ZxM ib&H$^G$~?ps=ѣGihh@ey~?h4TUDt:n'裏rq^~e,Y8?qݬ^nvgɒ%088H*/_UU^/ 033C&aݔ*CCCa/OOݻ'Nܹ]va2Xb7n??0d2/o|zցV)NG0qOyz}t:/   \.:=k.|>\s ]]]|eÆ ۷h4,d[qFz{{+^xD"ѣb16o̦MXv-[sQWWGss3@>Xtn^|En&z=:.E>JOڊV% b >DN*ʏX(ɠسg/ ' RQQh{ٳ(²exyD" ZH률^QVw1<^AAzn6/ގNc||i,K~:N^GpjO"p`Zٴi6mBQF#L`0yT*Ž˙3gji~?PX,wUU BBtT#Gp1;F:"Ȣ4~?L\.|fŊjjjjTTTPXXȉ'e9{У(>,L!ꘙaΝaV+P'Nձ{nFFF|,]m۶f, ^{-o=woz=~ ?wsAAA.?}]Z.0<_@p- &qeB!8KbW/7L%HF/u6AAA&}Hܹt= B\^1vs[ /WTAwtUU BDll6RPd2g^bj `GeF#H$B$yj=P_F&! cel61ojz P<ĮO\OYi,ndC: PUFCII[ovvp8|I߬hZDQ(*V5[ID0$ d2p8) ;$IDQRHzDQ8L&l6STTU$|>nEQ(++ 8rfgg2^/EEE;vBѠjpzYyY~0҆4\C$a1?gM+ޙvn%ITp8Lqq%=0UUU KKMUUZ{UpBl6v̝8d2"@A!\<Ga6ߑ(V:d^$\.H2L&;f<vSZZbyG_r ׍hwtSSS(f{G+IpݤR)t:SBb;LڐF53wI9W3(r)B*փF0e7W`6x{9V+\!2^-i$IzKWHNd`X:dp8eIHӋW%_tzQj4|/$EQt)Ib]  7]t<([(w`}isi٫LI.dJg.T`ta~/N7\/_&ɏ PB/L+T_.}EQ.jFEMqz=Ki6q}X*F $##!CF;zx:(OfPQ|.Zdtd|ҋLR>|iikkc||#Gdq\=z5k`8rn[ CWW7orq$IbժUٳg蠾>C188ba֭n9B*͛7j!n:8s F9x hիWSXXe֭t:?UUUtvv.Mf07]v~ZZZ0L[ʲ́(((#~ h2Xn{|3cxx ֯_>p&''Z\ݎb1^y(6e˖p8M&<#[T*E}}=:._?AA.7͞={{] ~Ҍb<3DEWoQ^b1C?D"FiJD*o=O f߾}hf|re[ޛ*UU7sgsE|e3M&,Zc-UCՎT)CG dP֒kЪZڬmrDWB&!:Ғ/qs<=I.cH$BUU~ӟ2<<,vvD|A&''l}Ç9z(EEEL&FFF{F}0TU׿5~ݎFASRR8?<,xя~ă>wCرcp=G|w}~TU%J!2wǏ_T7d O~ 055OOO>~ÇD8z(]]]D"^/OE4r166F,ԩS?~h4ԩS000Vgͯ/N[2 ۷o&SSSd'xEQGͷ ǓO>lfrrx^</"ǎ#J133?яxf߾}ڵ K:f||=14_A7)_ z*>}GII ܠBz{{aǎq,YBKKy]xU据I.zo4hA,㩧BQXn]Ӆ|/\F:ĉsNf3 8NN>kAUUZZZwn/Kd27*sKUU7Ŭ1h5B(B\COk 1)&nH2B" qSMG? % 5JJMP_HIduߎbJSS[latt6عs'ǎCsrС|9:tFCkk+bو;vFFF(//(0NIp8LLL( ͔QZZʑ#GkQ]vё%bժU?~<b0EɄbnW_͟@ihh`߾}~,c}222B4V,X)\.&.mۆ, 366FGGPF $100W_h;˵wrT$IDزe ;X]m,9p8غu+}ky{R:IҜr暛ѪZJ uv*L닙pp ӡi, 4YxqEtE[1&ԌE0A<jZ$X̏Q1ʹL*f۹먫0h=t]]]y睋F F6)dYÌ}4c?0H+VO|qag{rdYfxl۶ N$r x|z,\ƅNlܸkעIXV~w7{sD4Y(jke~ ېU9{j:{_y7IICxƂcg,/Z=^=oufnog.f3DWlfʕ`ĉ\.&&&;7|s>w{KcIظq#@<h~hUU\ @ @WWW033ÕW^,l6  s߷oӤR)6oތn@]]}}}($I;v`0茶1(`ڵou  Wʗ寜e`|+չ{KKKioo5MN 'opaa!Ns7]  J]tٹi>bb1"$ITUUn:1 M7w/q{y]TT-N(..l6nL&G$ ϛYCKO*cz`]dL M&t{ 0uL%ph0g$8>=8+ugON4>Ɓ%Yi^XmVRD"fgg!  (//nc0mIRZZn0hlldtttիedd2n(++m6q\[5k^bl6ioogʕ477366tzj8tnBz{{`0P]]a֮],a̹e^,MRD|YRYYn۩&Nc6ݎdBSSSCuu5d|vÁnh4ۚN#LiooO&yu]"xKLRAss3D`0ҥKl|>L&7p#J7^O(pp7SYYI]]]uUUUSUUEee%^L&&UVQZZJ$ן$Iaf0_  {Q$IYN\J&hysOhbTUU|UXXHqqܟ{PRUUU>@$IJJJΛ 7&N322,ԼcOq뫑5|#d==f-u>_8,=%N`!/z d>[Y>TUWen'H,RU5_n_خ{ȓsn]؞fm磣$I,Y{ڛU+ 8/tRZ.AAWЁ|D~w$lR) d7μFj,'cG""[Zu[{SseN.#"Nbd2| y}bYi*i0" l+uhP(tIqɔ\IV']CAAX:1Y"{9K ͒Ù/%UUIg~w᭷?AAAxzç66}ߵKԨBǂ  G/AAAy_ZAAA|U_' "ȥΫ    g}(@$H$,XVq    $I" DqX,z2 $ԟDܻx>EBd2TUͿ/<=|yTUurA7~gDžoQAS0'^(ŬoTU%{_WrH,[+L&ÓO>c=ƙ3ghlldzzw/SRRoF]]@ȑ#R)xx9g}_8qJ0?ٱc/L&^z%~_fz{{~륽=Ë/H ;w}vFFFhiiA&E% az!~iFGGiiiɓ? Loo/s/2 z)np: o|v&''wÇQ?γ>}{$ ?1b͚5$I~ayhiiajj{wW_} $?ٿ~G}tvvRPPpZAAoγ>$---tuuUUihhW^b`Zپ};կXz5rwb wÑ#G0L&w^^/($w/2裏3ϐL&q:<ر)N4)**l6ӟ;vى^ϯ,xuq%̻tR>055šC(--eժU d0Lp z|R .hذa{ǡC茶|_c?̪UxHӬXEQp@ z\uU,]^ڵkiii^`jj*:frJ&&&d2\.8}4}}}$ ֮]nbzj&&&H&h4VZE" _bA.sZ-[pw+066Fcc#UUU~tttO 2W&3;; fp\d2ڈF̰n:6lؐ?Ydկ~E `ڵgOgg'F֯_Occ#=<\{(Ž;d2ڵ^n7 6ry|#$@eFb  l6 ԄbÑ"+`Xt)L2,Y޽{yl6DUU6 555t:TUjhpQ$/2 zEQl6 oh4%%%a(--LJ8NFFF@S]]d[]$PSSCmm-;wGd2rJ@Aǎ#Lk{nN8A(bhhG}T*hdrrj$I"LNkk+۷EQXz5{kkkKv۷s뭷А>wNyⓟdFO&ٳӧOkꫯbZg?>1d2b1"~J2$Hzj/j*;ccc[Qٷo]]]pԩi"H) :t;vO~,kfggyt~rw^N'?ȩSBXV>a4 L&_s'/| x㍬[SN]0 AAx3TUe߾}ݻO}S\DltM$ +Ç9p??oĉh4>O4X UU)))c֭>}̪UЇ>^R>ϐNx>N<T*Ž˩S(,,dvv}{fuuu߿ziغu+x<֭[G:f8p6عs'r xqka&UVQ^^N(nvrYɓ`6ٶmڵ UU1L- +y<o䇂WTT066? rwcsN}Y<lݺ&n7W\qhcǎb կ~Ş={H\{c|0xFoαch4,Y>H&\}8vW]u۷sQE]vXdA r\|_ PSS =TVVri~l6H*z)C87R[[kezzx.֬YCyy9{/ N-[sG޽Alڵk9pǎjx݋Ve۶md2}Y\.z+6m@ ˩e߿L&CKKKj]|p^$^/6-AUUnwlD033L&tEp8}3,L$nV+fP(V%L0LahYH,^ȾnF8F#xǓ_  \H*H$$bR>ȾUEd2 JJJx<"IRC tۍF(e!Lb1LB!z=drL&S\F,os'shZN'>X,_s* 9T M2DeJJJ!VY9nw---EѠ*pVKQQO=Np80 AFc5dwe@ @4(T*{sނDjh4Ih4y^cK   ՅtnAAAA ]AAA."@AAAˀAAA2 tAAAA ]AAA."@AAAˀRgb&&&7eq.AA)N/u6A=%pm} Iuco>>O.zy  o$Ix<.>STT$XAAxȲ7ٶmEEEo9:@㴶'':+ 144?Χ?i.uvA=ܹmAAA2pY& z! )`QRgEAS4 vm?CM|k$zl8KnxfƢU] {F*bjj24n7AAxWI$P^^~^@ X4sg^l {FJ tTUUQju ]l   oe#}AAA=AAA}B   p    \D.      e@   p    \D.      e@s3p122S>=k+܃:k@[|gmB+1GHwNV`g"]M0Z8l2dNIFm%0utꨚu1m*T27X 0Ƒv'rL%Ț$X:_7g5a?}Enp`Vѳh9}g.j(V3XY2ơUc*V}O۷`MEHHZ" ;:9NL&X mK;f rƽc&ΈÊꢦƐ!R FʹTB:nXhX)b"A;iA養$H5a;&6N,1 iiB=KN'8le&65!|&!? [eAZdzxMFE)Ծ:'qi픸JQhZ@G z3mj8(; UGɔa FJ)]J TA3QF(Qq܊aa?3R M# :aU B24-Uxf"i]9J5<[Nx!2(LRKШiJ:,u3-I9jkCѪ(ݬBg5+vS=6,ex܁:̱$i6p6QBH#*e!b"2uDd#xBR3X:L4X3$*(~rR ݅ǡ;}\5TL&NAUG67iOenoQg=Df iZ+a4Pes9x Q+M!tv1jhpZ)0b.W``ɤą%n2]Bş(i~&gͤ)j gZ) DnCj`N6VDfȤ-ǢcKdJ( (wu"t$gMiѷ`g$KAbBz/C>H,]g6jG7m%( j'*fc %"v;zqMh03Ɗ8^+Qcz HH:|+J6L A*%Q&ub*$+T!uV (0xq7ׁA&`b?xr$cLjS:<$(#f:)z:dƆ'SIb6iq)Fhŧm$5*kB~LǸ#eT.DıwPP8,JL2n1p*Ʉa\R1Ft{0/"Rdע'6Q8吹]]&t K4dB_ѧ7Ռ$j zǎ3cp*+ühk Ƃ#\r2G4^.==l_d3N,kB_sӒS;/WLr)e:*'!g޶̞uN]IM9^Gkͷд:V CGK<5@YF)# [ X,m ϯ?qgvJ^0Q-۾sk"+抉nS{_Zί=cW1}p򩧆c+tҧòKMs%7fͥ^σ`O@{}oZ{o%WϨ\Ų2q~V>m1Y1?-.)~gݯ܊&&>ǟnk'k+-yl q6?w>JŋUFy;텼aF|3p__?xW=i`Չw݈}'^LU;ߛᙏȜpQ*#aL/e}6^yuδc7h[ۨFG/l[ 䪙`31~pugo;vRr'#ӫEIi~z3#:A>>O#.~VzDF?efcfBm|<;C+ɑ]xu;Bl2H<sr 6?knJ~NYQ6|_} gu :l2TdO4,V>0R>)@/-5?1T^YR G”{ ;oUXr6Ʋ[/_sKodd\y9v橫1dh;Op*kޣB4|KωT e8XE_cv5}\RTLQ>pp~~S'[hftb2Ѿ&(f̻CE][u1?˚M7Q]C?n}/6ïsCM*T?LQQvO^[\7FϚ~`|a`0q\a+W+7.+%v~V?AWaYP+'i$qyoB>tA([=D⯾e;WwUXON qEQYNX' C<2݈>~9*~TІfT†~3[1Y3?lu|/G.7?Q#Ŕ7;ngn៿6#|79\Z>*J0(Gh󍳣+1Ox5o_RSxelMʙ~=$jN7ai<_>~_'?AݟYr Ċ ZmLkh|˗k+ʝRk) 䑪Htfߌ8Ɓf& odk3x5TղgF[љuPd Wws@^˝m_e?FYF{9C_j 3x 5Wȕp^3)HM=TEڏ?PS);i. ;c*9oqߦVq709-[E/;YUGmCGO<ÃMv fc^K+0VLLs6VΌ9%ǯG> b |=g{=A4FLa~bej([ _r1g$]ϕkź0=>H<ơʔĉ`̦M[6'&sc(("_|X;[N eT<|,͡zko\_zbG%Km6nOKOR.h:WǛR٫C9Lsv]ſOT? r-A.}_T4 u l 'Vז޵ :&3xRsfZV6ܿ*҇[i=8{iFQ~]Kտz ͍/b:]˯\_xS*١++)Ç9u;q51J'‰b^tUs ͺ#)~'&V zC+h,} ~9#%G|ͽ?4~O~w2u( QtR:IלLzIN=+RjdizL'~+'|ZShl9b{oJu77u|puQ` Fa?Gkʱzd<-/?|/l1Z (*%^`6iVQeIz! _}#i3_8 g?Gh|bKCɺHKo@c{3@2I" HHs#wrwEIQ@Ҁ 2,(r;EEFV$dYFAQYNV$$E~$y.Md [edYʦ!g+%(+4$eMGQ9e> [乼g?OVIلϭR6 IY̓,ͥ /VB$YAe?o9,IHYiH2$$o%"Ht)Y "(Jvيd͂:ήGUlu IyϭCn}%%[vi2Aή2r~e4rv떍4~s(#e]e e B^PGV.E|?c|H>^/݇_osi+ڳ$)syʦos;I̷KyG˹_~?p_$eۺD6an{$ γYru*>Tܶ\NO EZ^QȚ~CYߙWs}_~.-(|?97]n$e~=ۖ%YɶEBV|_-7[o}d~'$난r%[s/;671~yL$ yegO ߮qenەeL$sen6+ׁ4W|99wua9RH6'/8M.'7r2su';"͗,W F7*s/}~ $)ߖE̷9`|ϵq,˨sㄹm;U3_q"4H,g$Ϸ1Q秗 w<(+R?͵sen_M>ޒ\[ k`% E_dꜹ}D~6ie(J0w+W܃.      eMqÜ={D"A}}=Ӄ,455!It~?h㌍@qq^oAAAA=NGii)@P(īJGG;v젮ѣ:u??`bb'k.s-AFUZUKIR IR %U5;s I ҜN2: I]'u2MV=w )OJ]ߤ7**Ң|&$5sVpQyI_ޠ'JٲTU+|-|T A~stM"*-(|٨s3Hâ29.$IUi,'fϥʂQK]PJ|}Xl> gBR^ͧ|K 3.ՃJ 5\YZ\˸$sy̵l7+u-hVo96綑Emt.?r.(QI}d/lQ.(|SS8':Pe! DnYmdQY|՜_6`*+|o 4Aܴ綌|,W,j/$-g,ősXms~a҂?.SH ]ϙk]]uqekEe#_^ rqmWoWIl/.\I'6zv.E6S\9Mꂲ!u+GI]߱hDx6a~}V}Ρ?ԅ#FsYP=}~AC߂X~]r{21ԱdO&3W/uA4,;ۦ^#Z©TuOig綍\mR~>iOSP#-l*`YVXvWw8\.n҂=_B҂>sa-̷^:UIz.uő;hZU.scT/Y^^`cڨi}/u~ە9ο:~]9,(E:_3/,C>[j7έ H+zN^9!'O$/};3m۶jq:444㨹 BUdw'Nt$ VfUEAp=Xw9Ngr3vFz ʯRvL:v7{]kc0HP*lh0C*Ѥ`q?r1LK)בߡ15l x͜߂']4ݿ 0A5F['CagPt+}]bq.2i,g#9[fq"~$7cfHX$К,5*NHAq'쬋VjLؑq҄e9(l͠ONlHKh׷PKP S`_oE 8)_10&}%8O_ˆI mzxnc-h$qȇ8g LMQ#j\2NU~&ͤi ^f(+%n AQʏoh)/T.9f6 l~$΋7h19sFG5x#JIDQPlbF_4ݥњdd:W!10u#qE2  ,KUKxhlK%YiXs-¦>^]Z3Kɘc{ q\A*R3& L4#!JY æe(IqLy 3'WIm{t-5U}Jd[`ֳvX-]U)u)* V"h{xz#)"+FZ`ېM )';̛@gў? qZ2!3mqq f֝r3R/S ̌.Qx$WP*M,XSa&GVJ[9,c̖EМ%4F #g-4A&&5\@KMSi-Kcqrv(Yz5 L Л=㘖HE,LŸ)cX|f #nSO2e3cYx}K9t]&,6L/ .P;H -GQT˘TQ4ZxIluitS}FˁI PbFVkt1-lɫK))`HGz:te.+eqmiۨ:#T(%FϜuf{Fy%5),I2yj UTKk|-T J(w(θqwga /%QePDiYәrRx!LᠴsfVpYRLrY#X Ǚ^O}jiW5Ќ^6W=¬-EȨ#ӌ@i\ll/m5B'=]ds&Z(&qf a~Dg]GcZEօbh,aB|u? oMҘ&%!51T~ x gHkUK X4Gm'Jم1Z (]k4TzBre5ϑrZa&ųABu!zm ilIgZ[FfzhuQgb,Ra' 2շ]Wΐ.Ǵ $TI+2DFHA[?Htm-xjc$X1FFZK_%vӍ9̨N| +A:+B!-h{* V9A`E5k&t0ZP/j@է:=V<'C"bqi#M0k`⠥D(Gf{X CxS%ԤIn9AODyTK'ڼb"\#02ڨR[Ѝ[f Wu/O.CD6Ǭ ivQ8TӛL1( *^ i Bv3Z\=Ac| B`YBS-5ӊ⦨Éa-'P5X'5L(UCڇI<ҏS;I(j({1ѣG Hh +BF~ HUc7㫝%ୁfIkdasq51Rƺ`D[zYCZ %4Uf[XbеuF|3Xʆ%q.$0M67:CtaGf=hz) Rg7RYFAze 3DgW2Y0'~]gG$K9X^G+ 0rji+"dk  ,x2gkx5ԧF]’ќgtevNU:yYrݴMOh-ɳ:*N]hAjj T!uZfTI%-~>;;hDe ̝btt}sJHR'I$t:EAQto$/CIX7эq*3&IT&bv27xB]FhItTxlSN9~z  4UM-LsT)IZ-S͙.! OS&Ҵ?U셩bw%sohD&lPߤ 7u+-$:dj;ΆDWNtP$[IƵ$Z"Li=#)N@=KL9jb1K@3{|$N>B`:mkňhmryVh"tY%X q^)GgbN)plR :>fH4C<%7 $pш@-ƌƒ q*ZePRXB MŨ,2cFfk2I8R@E(\%5g]آ6h]%Tgr0AAX;'ɏQ*~I&L.¸}a5ԬQ 2wu],X BKQLpmΒmPV)S}g&g~u*8A

,׮]#550vE\\rRV%11$&XJ&JƆ`AFFR??#&&nR.%"""""""""_,+455a6__w؁D"_񐞞Nee% LAArY.^ȅ HLL|hRΟ?墫35_.癞feeJzzzw}}}=.mmm Z鈉arrSTTDff&.b0<< Aee%۷o'p (vFٳg)//p000n֭[ r- BT*E&!˅d2R)v/bX@`0*MMMVUH6222@dcuut:6 %e~~9IHH399*'>>-h1 ,..2$b`05NZZf0 vIII!44T v BBBguuDL& GGG,FZM @.t:Z 18QQQfT*@qRRRH$LLLP(HOO,Wx^L&?;;ҒZ3??B`nnN<> %--b}U!fۏwV~y _hOjrUl6Ga_GEP@7 5zP@jK[̤v;BOrugyF$>,|O"p:\."##?߮D"jR-7Ƞ50D"amm D"h@eeuuUHR7_/Hx7/χf{蘈|H$,,, >.XA.-?'=ͧ`u/j=?i6ތT*Ⱥ}X my慈ȓgVB 22K|&{LIqq1UUU(ʇܹs ߁㔒Bqq1RTz"""""""f*\.d2v;999ܻwANNuuu\rx4 .\[ׯ_T9` 22lFFFdDEE[o{n233E"lv;FD[[6 ۷s-!dǏv މpKIDAT #../r!JQLKKPVVFUU{pp^ym&ŋdgg A.]( 99YHqUUUÇH$矧S8HOOghhIv*ogݒիرN';q{.X,n޼ZF&Ndd$W\"""(++cppGuu5DEE"## VgenٶmXVVWW\|cǎm6"""scxx:ta$ SSSߏ\.j~@***0qu%66z.XYYQF#466bILLJ>JoQRRBhh(ddd088B`0PWWGAA;CAAprr{ 2s3>ӷ p^޽{䰺8vRż˔R}=))"""""",ǚرAs866,O?4rt:2??YXX… Fl6sI`ffׯcZoZZ8RSS?SgH$vڅVE&a0 n0NcΝlllOhh( Fkk+r|:nݺ 6mxhmmeuusT*۷o!!!QVVIIIddd46[rOGDD088Hxx@\\ Aee%SSS:۶m͛S__ݻ1 "˹|2dgggYYYAPpܹ'>Vnn.KRR ,..RVV&̇G#Hpl6hmmd2KMM#3<ܽ{ nݺd4z\tdwAKK )))8pNoMtt4TUUq$ ;w ĉ1>>\.G*288HYYpLVV뤦^g޽zCѠT*µ aQvv6VK.144DWWSUUT*EOll,AVV@rp\lllpU %&& JKK'::AXX;wի*QQQ\zZMZZl߾̮]ػw/˵7n011Abb"---l6:;;{^*I\\G>&&&b޽666XYYݻLק1 ٳhX,n㞂"""""""_A>V@X,={Cw^Akkkx<\.ӉJW_?Dtt4mmmtttNJJ L/u&&&.]B/s9N:Enno 444sT*Ֆy'''ioo^?k&ׯN'q>X,!jhZfggMlzz/pv͡C"!!_~Ʉjeccv9F?1CCC,--CXX'? ===BxߏGNYY&]vqE^/ǎW^a``- ,--a6III!<o+DDDDDDDD>-g``|;|'==ݻQ*7 ##k׮oȎ;z ݻw͛oZ&99QTT ͟a~7 Z{µk^ν{mmmܺuY/{Twܹsl߾c2hoobP[[(?Z[[9w E"`|t:BCCnS__ω'Д'~o4}}}FDDDdff.XN:ʼn'XXX̙3dgg%bիWl7|\\\rp\8pmۆT*e~~^p,dffr\.NBBMMM,,,sxPT$%%V埣__r9Jz BnGPij>Kvv6 竪8{`➑L&7 r~_1<l.,,'kӬİ(DkI0ͨjBCC*A8~H"""Bjj*&Iؠ%'' ˂4Rd$ \.r9vBBB ezz#lllRHKKcccY4 ,..,h£rV1ͱAll,111BCCCQX,"##q8H$j56 J%i:;;/FvE*Jtt4nYXX`mm ݓDP4V@ @||<111̰NBBxf#&&@ A `~~x<DGGNuuJ<jennFCRR?@ll,x<JfRR T*IHH`}}(666T*݃./N-~d^/&x666 ::ٌ%,, Mtt4v-waaAx6%'' Ʉ˜"o~6IKKC&aX-,,`HNNF.355%̇pL&vTh\QըjYYY`0"R)Y^^z Ea2X,ƢX^^\fffpݤbXѣ|}}BBBHJJB&1;;+f[ZZbffÇ }2772dIOO nqqՊhܒN8!fjj RIrr2m6 *<Z-?G/aWWWQ*DGGoQ}eY@<oZIl6JJJX[[ѣ>*Y@TtX(N:pPVVf>f9xcב"[,VWWIII*.Hp:\-&ğ͆R4VT|vOAUG֮@ QQQ&pRCq>"Ϸ% 7D"rS 8 }YHRR)2s rt/oj?59BNE>D" <4Bxh^GI0 C7r}b3>Dhjvu*x^N8&"""""""""ׂv>)tIͥ?:ߛ?ןRO鳖 /..~sf4\x<2;;㞑~~k>=?M+v >mg雏'iO>HW:77uߛS}~T?!p:twwrggg`__FDDDD |!Hp8B[nqHNN&44u^u!oEEW\ayyLΝ;GII CCCdff穨`zz(}gΝBߠ}GG.\tO p)_NII ä{&''cqq .P]]!99[n;^>ȧdVWW't:l6 e֢h b׮]T*jjjr $''ťK 11˻KCCrq5˙%--MHlGҧ b5??O]]YYY_ e)Qǃ)<3gPUUEEEpHKK |>0#qgccGzZ666IhiiL! u _7~?sYoLNN_{a6Y]]exx4˗/S^^NOOnwKTT7n 11A:;;4v˗/Rsm>2D&''9(JIMMER cpY"22j 22p._ccct:)**"!!ix oߎl7ի444099OLff`I~Gyy9pmӅk333׿&##Vj7oKddg_UU$999LLLpe TOOgΜ2O4 qqqܹs"{RFFFHKKʕ+HRrn7o& ***())atttaܻwsq &&&سg~;imm222hjjΝ;dffիWY[[#==#Ν;,//c0p~)Q~ 르v;iiiqYFFFdyy{&PRQQh\xY233ޣ]:{,ըjq/_fyyokȣfu\dw?V@z:TWWSYYIBBj˗/rill$==Gb0a׮]ѣGE"0<D"OO&ebb{v{.NB.VH$cbbbvKR smmm,--QYYRD*bZŋ477Gdd$ zy&MMMDDD000oVETRVVx"mн^/veԩS\rǏsNiiiw}W_}qYXX9rt!:$QXXH__2V222hmmellv[*ϝ;w~N:;;wߥ$z*CCCFjjjgcc$$ >?X,&997ooMHč7X[[C&QWWGXX7o$99YHUaƕ+WCPt:9wCCCL&cvvٌlF.377G__;rss`jjGgg'fyyo-kkko%??hhhbcczs%9Z/ș3gHNNc۶mKa(//gzzO?Edee~>}Z0yyyFmm-1LpI())?)z.Ϳ7DGGSUU~3z)x<\rbbbؽ{}>żlll܌b(Jٻw/PUUšCgy+W{%77nvw'?!33J)'Ovsu9"յk(--%**;w[orя~Dbb"!!!$%%qMù>ׯ_d2vBJ .ى$!!K.133VennɄdjP(xyꩧ0`Z1L299"dff2;;G!66T*7n >>Y'44^ݻw)++CV~`cc˗/Mbb")))ܹضmEEEܽ{A)))[8Nx8l6cX DBnn.܌BAuu5())Ase^xY]]EHY{|>ݼ\| yWijjB&q-rrrJ%h_}***HHHT""""""m v ?~\LĐKll, 糼̙3gBV#Jd2 =zpш``yyD %--M8-b۶m,--Fh4 ݻwh4ڵKMT*ammhAcxnBMM J d>$$8.^<$''ښ@Rd311N{ b磩 ׅMLuu5 S]]M `߾}466(F XvIAAv hIXXddd,.]">>0Z-ٳXJ%&%FFFdyy?ɗAkk+K{{;###ֲFcc#$$$ln||"233inn477 hmmmdddpQxw0 qMjݻwKpߏL&@ @[[۷s1>>NUUٔJW>Dmm-+++8q+W088< 3::Jss377T*ettۻ%H0F4066ƅ v^SNQ[[V} eAnn.ɓőMDDgppK$zzz())!##-9DdF~~0bxx8фh4f\Baa!fl6رcuuuܽ{7or 4 WNff&.98~8󢹹Pecc;vIII9s/DZZQQQq-FFFd2qf3Bz"!!{ {AF!**gϲJ||<;wĭ[ A&O?͝;wXZZѣnBCCt\x%ønz=999t:vֆdffq8rtttݻwٻw/,--ɭ[A\ :nmmd2@^^h?Oۉ;vl߾<, ddd{nBBBFVk.feeχT*fa0HIIq1 ԄjeqqT*3L"ٹs7K?#KKK>}Cw^III?! p8èj^{5ZɡC_044f۲!8·v\|GǏCqq1333ٳ8z(wڵk[ְZ,// QQQn'$$pAZYYNXXYYYjh4~!x\.GR*6 F^^hZIHHJS|~ 0 HRx<8N C/YYY|#$$Dfhȋ/(h?6-u ^㘘q\a6INN :Nn7{%66$##G }?9::'OgÅBg?ќ:uN0n۷@۔J%O=/xgd>|}aZ5P(8|0%%%q!ܹ BvHRyW{4 'Nȑ#(-nZ-333DGGc4ijj~|>NFUU垝ERh,kHMMR\.rDnguuZMtt4N@ Nc۶m_/C&~3h4^{5oN?J$RSSx<100ݻw>X,XhllWRZ[[&))IOO'&&F?$%%!BCC '""ݎp~2 T*@ < XrrrHMMÁfCښ'** :. N'FTTJRFVfp엵G&%""""ܛo(Jt:Zƞ={hooWz*333ѣ_OOd~:׮]ܹs'N|~^uf3NVիP[[Kll,o;w^x.Z[[YXX %%o 8J~~>n7pmhkkh4/sM:;;9x @@+--6)))444`Z)((… lLrrrvp1_.|=H$JFȓsNA\.@VV%** ɭ[8y$8xvd2z,ihh ..p!==2qqq<8N.]ĻΝ;6RLMM 'N[nqaZ[[|333,// }[oQL ]tt4TJvÝ;wt+fˆ%,,LLh4r-XYY"\BAAyyyXVw3 dee}>|B&&&&66"x d2-.Xw例+l2P(p """bhh7nӟTXro)@zGff&Gq9bcc$##~pY***ַ%)JERR&BB*Gff&DDD믿GE& VBACmm-P__/` KV+2|>Z-iii:udzzVD"aΝl߾]˿Krssjtuu{n=)Ξxt:IHH`nnNcjӟ{b0./_fppΝ;JNNVXCRTTEJJ nB((( ))*\.9@s}^/y&NvS[[^e:_GRυ 룣G2==MCCl߾gyeY^^&99@mm-NxdDEE sGo>r kkkDEEa4ihhf:2۷S__ϯk|ZMZZ׮]cvvl`0hP( ER!PT+f#>>(q:?~WѣG_r^}Un߾ͯ~+8|0&?x^~ӟDEEDp|뭷'ϧ}t:N>(vСC_ B!􋈈ȓdeeE8juN';v`aau~I4Aͪngii0Lg0 ZV}N7aq88bbbX^^feeGDDqqqAfYHG.3;;K  <<\AR xK$ x n! N0ZfaaK||r?%""ZVbxb{?IXV$ ,..G^OXXs!( ZV, :Nf3 m*l6ñ-Z/ ǃb`0d"44X&''N<^^4O zÁVrQ*,,,Fqv_|^^^CTTCЂnL&^~?Zÿr^/&Ih6$&&Jcc#?vزNLL srP(DFF"JlZJKJy&C\.666H$h4bbbP(nv;QQQ,=m> !J%?vaXP*RwSSSdff>a||DBbb"'Ow^/7n`aa4~鯼$^ ϚS"lt|S|~v@Џ>V+m#-A"|<1\G㾿ȓI0SPF0%?ڗ &ğr9 +lRFarG)qiн^tM ~"""""""""ltG*7_zdϠyM766&L0R@ D}&NSz""""""""""r\& .롊u @ d9nu0RTa掛͟p[?a|ޟ`Zܧ_%>jyO2_^8$l .@@NIX,cSίscrrؙ2A|SQ(Ae?>Պ~ D"Dƍ\|N cuu LII /_fii,{=JKK&++vΝ;ǵk'++gr-R#ܵr9B|HPP(())ի"7ؽ{7={jiiiܼy? !z4WRSSlK[[>NǥK(//g~~~K $穫CΙ3g(--eϞ=T**++)..d:::p---$$$x7HR8Ю-톭 r!ÃYn޼Ivv6R=I#ׇP]]Maa!F666x9s7oRZZʶm… ъ󑒒| ,,lob0>wOB0fm ayy2҄ʽLNN&d*W^%55el69מ9Y8YZZ̙3׳N-?BlK$*++q:>~?.]BmGM6F>Ar97n 55Uԃsٳj<6 /,fUBCCz|>jk>V@8p6ƍܾ}DJ%eee9Lzz:Ǐ`0`0طoDGGRhjjG?޽-z0*---9rwfAUTrA논?|6==s!bbb$664N'gN'|[bǎc={x"۶mr9sy z J>}W_}>ٳgqR)geeedffsN/ B(377Gyy#l6 0ywDܻwOH/Y@d߿^h/"<۷^Ogg'{ٟ277ݻwyꩧï 슊hhh#G(,wuuq9pՅRqVWW,e``DY]]孷Ra-//v BjN*++vqqqSUU%ZoHp9 p,_fA/&''yjJJJsQQQl6}&&&~:===$%% c588ȅ Cf\8FӧOE{{;:3gMbb"333\r~rΝl6Vpp%!)**211baii oM `0puJLNNK[[a7>>>{G}}=aaadffx*855SO=T*eaaNGZZzq8{T*x4V||{Ν3$ 8iNLLRRR#33VK||<т樱v!"ۜ;w\NZZssszaS< 5( (~!!!rifggINN&!!BlF#JR844餬-|ttt{n=zz&''Fd2100SHKK#77pJJJ0 ݻǏS\\&22/>߃5rrrgjjӧOFAV͞={%,,QfffؘsY^y&hb8y$dee}JEOO>1\@Z-w_fccAzz9{9a}őAjj*T*v/cccTTTαcǸr 333,.. / |"##yill$**|^z%t:KJJXZZbvv^zsI!ͥ餰}ꫯb۹q*&ٿ?*.rrrx爋'11E׿5gl۶_|Qt///Nvv6XVimmF:;;dݼ+O~mۆ"'']vQ]]-F6"Hسgַ??Vٳ:u\۷o8h4)1;;ӧ9vv ~3772paBBBxׄ9N)m1DEE@TT@ |>`rp:2t =..Hal^/v!I. \.'44tfsn_bXfa6͹Zb#vbbb0 n|>III"Jwu@kTWW399RD½{X__b&iZT**J8x<\. B|"##Y[[#""HDD(JT**dffV@R.W~?`hh+Wͭ[!gRIVp85 $&& ."""""""ME"~^x6-ǚe``Ohh(Ge׮]\.RRR8y$֢jy駩5^x"##qG!!!TJ__T*z)j5ۍF2BCCq?͂?r3g#22 Fj%55{qu䰲|\t{sNF#O `uu$޽#33z8x iiir^/L&Y]]СCܺu;w숈.]DKK }FCCL{{;屴h4b4\&^:Ç344jڻ0v]^JAL^yW^ Mڮo] |!s]9σiHE@u*677!2:t],A^Ǎ7h4+A(0775Z˗p]333ĭ[Y1887oވ)F׮]} ,,,Ǐ$ իPU_~ą@DDDǁi"Q8[N.ٶ-wI`Yl ,i"ϣj!"۶a4M Iu]^zq`Xg:]uA:I4i7iHkׇl6=i4 jQAQqx0MSr"IXYQ.j`Y-@UUX8|=Q/Q,r91<$Ib]Ed6˗E뺘"}_Yi;5LMM}1l}}}j}Rܕ$ 8>ppp _0P(`6|߇i71*mz.MhD(fhZ"I,pG\꺎F\.(jhvtI:>mxrQ^CQ1&m[EQP,y\ׅaHA@ل,0M!"|>žd2rmA\.#Ik<+"H|>0 qpp8ۋ8uۋzL&#z}1,˂i( beQ92|BAajAQ|MG$E( @\* jiΐZvzi<=硿VT*Ae(Il6En"""&C֫=oрi0MXzG~pp\.Rԑ1}8cYۿ H9ݖi_ge9>qeNʆ+e-פ&cw|ZG~]Ӵmgs;g}c_Trƻ"""""""#8eYVwa{ a+r:Az'fL4t86i'v9w1 teޯ11ia`gaWs[;IALoC q5o^zC)|ٶeY\Q{~۶apExǁ~R$MӤ۶I$x>L$j4,ϯ3b8,@ <Љm_""qcYǎfɸ\&TW$??t;]{-C?;wdŊdeeycǎv7oH#GpM+qݧԡqI[ ;΍7ހq0 dZǡz̙CeTlʤ B")S*2v:R]]((t@<2tuudbz{(,,J8yM^^.yٙ75n4];fܹFcL&۶سg'//O9DD8KaD" aPPP"LRA,rr8x D7"mnp8LN??%SEQ~?Ȣ('zqGVVDDd,  r466q7GKK ~Àv 088HWW9\n:;;imm%''_ w}7yyyALUtwҥKGCC`~?^1M^6#hoo'77Mww7x^سg/۶mcҤR x<D"188H}}P^oreY444'#ڵkY~=555)SƳ>ڵs)d``$M!rssqLO>g> àP(2tΡf~'dѢk8vpQbO$27DDD.0RtvTN?0XK҂t7 ]3-⽽:u ǃa{ DTTL!??P(Ĝ9sm6x e7Tt}EDjd6}}}|+o OVV6<Ѓ?L2o5k~C ?ǘ4EAAUVeZ!BmBn6MƩShoo ˑ#Gظq#MM|.D"sB0@oo/{aPWw <k֬硇;_W 9y$3f̠|+̞]w],ng))_rtuuS__O"?î]8Ŝ94i;wq ަH$׾U6oD"qv؉i9s&X޽{hiia֬Ylذ/_FMM ۷OSS= eee<㔕Mӟݻwsx=x~an6o}[8=zys'NP]]MYY;v줠*ϟǶm۹( ""Ŷb8Cߡg(^,<STHqq1 7%0L"fՐD1l̔)8vz ~?ke֬nB$D"i6Dx|>f̘YU>8M,cppB[zm>O|۷nmNww<̙3qmƮ]ʢCͬYhoo3 7to6Ϝ9sx70MTX,1~vkI(w7q<裬\y#mxL;ƃ>@Mlz!NkJ,ˬ-yf֮]?=STzR)8 '8v ɟ UUӱ,`ph4alڴ 3c ~L/x<0Y=C=е:xXhjjb߾:tqJljⴶ^::Nq)icR)x ;PR2X,:J8PlLEWWEE$͡4n۶'.<ȥpسgͥz}]\\-N&;;"'JYS0bmrssIR|> 7`@d2eYL&dܹrxb.ѣ_ngnݺL=MF `\{2ǦDZY-<@˲>}:ֽů~+f̘iS1 ̟?^{naizjZ[Op5رCQ[|>.ڵ3yr==L'""o雺ThŶ-N ²Rghbn71fez2|>qСCtvkK$&++ ccS)  2k""rIg(.)-|o qk;wT3;wSV2o<\.R\\ܹXd 'Oƶ-fΜٳ:uL68$rOGvvUUU0i$-ZDuu5~%KpQ]]MM,Ne`A-=Eyy99x^:::N7󒕕͂ 暅SS3%KSQQA$믥څ`|˙3g/bJ,+Ō3L>jYs& xb>ŶmNn&x.`ٲeXMQQ!˗/gѢk,Z_Y3>}YY~%%?S2}t_I%Œ%KXznֲb L 77EQTT‚󩬜m;x,_y摕EMM 7ܰE1m4|>?[7tg`YxlED*bY'q=1lX9g~I2ĉ8qNz}G>77G82)))5oqIJRN<';; ؽgc9)<^ĝP0̪xWf;xr8 ^zT*8#f]۶>>teeIR\>c&T 0pPޖeeEST].`uzB#3Ӟ}z_n2PF.pxhy^{""2vmsA8>2um!Lxwitп![0zkfggQ>yAw?2Uȥ1 ^usms>7z1E+{DDDDDD8tuu]z"2z{ژvbӃDeh*_{hmi #bW @lkʲwb^fy-1ǻ=x;KOsyc )D9gtNwh,`xܵI:@DDDDDD.{֏KefZ<\Tphvfv]ʼn'(..RG) 3\a@r(vwGیъkL&Oo;4 f8qZ.=Sرc}uoLرc;g``|[l!S]] /4W^ᩧdggKqFz#oI?ފCr_$ΚC$ /rrP%0{R6:#Pm9S X1=@co AwqȲə}A8_dڵSVVFQQQevgGpa088?OUU>,e1 'xӧSXX8bzՂn{1|>uuub_˲'>9s٢nN箻4Mz- 0 'O/cY+Wd۶mQ[[ԩSy饗9yxLjD"\vE0䳟,[lwѣ|sѣ>|ũShmmeܹd&<ioo_~Yfᅬ²,=ʲe˨7߼a""""""2!;ٳ>Amh4J,+V\p'.O|<؏4M^/xD"a\l&OL `iǺ#<wO٘x]&E0e8R6o%g$Jr<\ylxL"^<x˲S{78omSRRƒ>g?YH$q"̘1#sCvx[*ʔ'jFϴB!rss3 \fF,X,q'JL&~C=ɓϒ\QYsx\""""""0x<ɓ'q/\,0bR)\.gD===tvv_6$a0c hoo'PTT4އMDDDDDD> o=r^l>W2$''3f8NfK3cΜ9$ "sw~w0 &~߰i&vMUU,_ 6o>*++[JDDDDDD>;GB*Ȇa`&uuu444`"p8;a\.n7n^ Bx<8---B!neM֖'77sg>}:immeR)X|9+W'""""""F__9q̛7{Nn7&MK  8%%%Y~z!~?]]]x^ D"L$//43v("S]]M4駟`0c=FWW?񏩭9pp>U===R]]eY84mǓJz]-' rQLXw'ˣ۶1M ǹkhmmɓ$ nVmFoo/r `r,XpVwxǣ>8|[ߢ O}Ǐ0i$z{{tm&eCe޳, 4L` 8ׯg֬Y~k|k_-[P\\&Lr뭷b6vbڴiTTTP]]O<^K(bb1V\ɍ7HoooixXz5UUU`5Wk."""""r9g8>o+Wy뭷hkkԩSR)n7$ g֬YL47|,lfppl*◿%mmm| _`YV{,/]soai 0gP=MLt àI&eLw}|>>OHVV>|Rsa477sQ~w~۷300@ii)sΥqhnn⳺b1xyG8ph4];y^1 1H%h 4tw277DDDDDDd:$qg.^li6|Yy`0H<g̙g=>N c@2wm!^WMJEDDDDD>;@:|뛟ks=>Hd1٣{XQLtO3D(\i\.BӺL݆G ,޺;hW c(}|ll500Mo 7tqHRcJkF&nAA[gyXiYx8934Kyp.e z"l8KsowQQ yi~ c=i~n*`eUE|n󒻝yڍ7LF/""""""#]e0 i`..{1OAց~7y>7pM H9^ܮiv{LKZOTXCEDDDDD>>zs<,GKqwGisݴ9^O Cz(n=ԀXK+[h{%nÝ(Hl65[tln'^:fqc]a:kmw2yI6nXOpL(H89$q%>JTq3'-]'3˫2 M c8rH`08˳]nY&Tn7͹wf1=cy%y^+ٹO=a }79fi]G圊ȕqq H۶/{G>@ @*" L&/+?Ӏe#O3 L/L& Bط{O#{J-op<2`6a|>m>n\ƼeY ǧadggXv)--vth<>.qr~n"`N?8C~~~;~2 A?3;;|ȕ5jnHT*Eyy b8CII .3 g eh h -ws4ˁTqr)<(NoS1l2"/)xޡuڋq/=qvx.\?}> ݍfʔ)*0p\1D9l8 Phv_kj9}:>J9RY(@ ^oٶ]DDD2q^/W㡣K  à2e`4D~ ( ̢̈́p8?+ˏM 2999D"@u2Ow`AN$n)N08v$rrsjArPnR^wLh4JIIP]OLu˲.i8֞L&줤>Wixpea;-'ùNg]ėqLzϊ0h"iYc .i[41 ˲Fr2˲F|nw;kd2r94 }/ϧ|48Q6ay޴Z0<;oDappM6qwz3JwM)ﺺ:JJJ(--ͼ7T;wr)jjj7ommmڵsRSSCWWw`vEww77|s&a޽\.oߎa,]bvI(bѢETVVfʰcoƶmmFNN_=x]v˂ 1cuuu444PQQ%K0 R__ϼy󨩩a߾}fo>dѢE#nx8Lx_TB$'M/a`'e8}zSL&Օ ߎ`C=qbM M aP:uݻwraΝO|K]]MMML:EÎ;(//g#GNNgf֭S\\̍7H[[˗`ƍq̙Cmm-ǏСC,_ Z[[ٷo999\wuR)}8K.wy!V\I<g߾}s8[l!++믿~9Lrf۹G|oɓ'gɒ%8X{H$B `… M& :Θ1כ۝\/OKK K,aʔ)#Ν;)++c$ mۆeYXlˉ'Xtiٳ3fP[[ ۶msuپ};˖-󩮮""""ԣ=Vww77nĉg3kDFތlہeLY,Ik(vΙg$w6rqb#tCeM$Sm"(%K0w\>yWN=Ce1]n:̦6v{F=c=w۶=qJxYf h۷_`0Hcc#۷oĉ$ ?΁hkkx<ljD"JmA%<SO=E2_WtuuJ2駟fqv͚5k2466_X,Ƌ/mсa[[.]KK o&yyyF`7x#ss'9۾};/2AyljbK/DOOexذaTz{Q{?X5Bm| d2+墾_|1crI~KOO6l`Ϟ=R):;;iii?!֭ԩSlٲۋeYkCxg?? POzjo~vM]] uuu< ӟ'OP(O?ѣGy9v[n7IJ,LӤ'|3`YO>$N107:_nx'y'ijjʴr/@?_ms!^u^{5^u<^(ȴ,x<>ԭ"s%fq֬YCOOϘnP g6>Yfe&2Mʆ 6m_gڵlذ!^1N&L;r)y|2e dP(D,ckeƋGQ}]Z[[dD"yo~V:-ZD(slxnF<f⦛n罹˲|qL>=ߎ;p̙3qqCWWSLg#`EEESWWG8fҤI|())0 <wy'wygwޡFN:Egg'|jjjhnna=+Dz0l}}cqQ-S)|綊 pԩ$Ilˢ&x+*0#';**;LYe6>=J^[[<ӱ,,.***2ߧUVqeYTVVr뭷fZӟnχiQ__Ç,+Wr=P\\<[xVVҒ91|_{w}TTTJ:u*> ,m<˗/s2{lON0\w}730 tMYE*;CQQ7|30Mgy.6l;p\\.n7>D"A4_|P(=0gСC̜9$ Z[[e|3kZロÇ`y"{Ŷmyyihhnc8t999z'>'hjjc-"""r.9C4^`ǎ̛7UVQRR2rxH$xyy+io~C"8g3M+no&_o×EK;//bP(sEݰp7fOʋ/8j~:y3g;0i$H$ Ioo/̟?BZ[[innfٲeF4ʹT3l֑H={K<.3rwRUUy}xcˣ>:@ /磽Fz/ sϑJhlld͚5<#~_?Oٸq_a9y$=g())!3PSSõ^K<g|3a͚5̜9~q\}n[m{(@mڃA2꺻s(w8uweqkE'Auw|77MmwvrD2ُto[.(:-[Gɜ0O?4\s -nr444hll$H''Ge׮]8+箻{_w}7W U9m7|~9?OVVi&-[r/|K;g0M͛7D(**δRpM8>>74M9pӟt\LҥK1 V9|0>￟ѐ>ÿ1鹺;ʕ+7A2dL2}gwޙFǛ~=;;{wYf5\b CC|_4Nftf bǎcɒ%aRGa֬Yc,uOΖmٸ |2 ڂAty54PǢbwuv48Hg$¬ϻm66dHamC?6m?!<@8۷~C=.sq;iN477H$_zGy~z{{iiiaڴi>|N|qz{{ؼy3< Yn.9spB~_ϓŢExyihhwwI$]`0Hmm-ǎV̙3/^̙3/\)o~s拆aFnT)++c̙3GKkYVrzis= ())13hHRw:يϗnh0~Qo\wu̜9|ӳgWO,k}Cg޳, ˤI=k۶0 N@g>LL65'}:1x\˛eggvaҤIL>Onn.$ӧOgʔ)pݙtﲲ23u/,,̌Nu3gϧ<,`0HNNR)DQMF0$ R^^Naa!~?Yx'?IQQQfI7G0{w)SPUUYαr*++2e ֒Mvv6K.,3#=+|("77OII EEEB!^`ԩ̙3n,Y’%K@;$F{2bʕ̟?Yf :u*z+dVwyyypRZZ[ϧw֯t0FY~%YK(rL6[xĉb1*++3K/F&*((`ҤI dzl%UVVf~df-UfY---ɴiӮ,mmmi9Igtpf ̱gn xap$OrUa(Zzt:qd輤_s#jO/f4 ܦIi,ƷV`EZf2kcU&JO2weM4 #3V=ڞ~==rzaNyyyFY(Hm/"""W9|L gZ9S_J9999WX,ӂyH$2Ky^"G%? y Ik^~?D\_D"|8^/99Ü9Op=e;ZP@nNq7 G ӽV?O\7U?=^DDDDFyp#J$L^vn7x^biM^^pp8|QU窿%xF>Wrmg&8///5w,Ti#``(غ'Oh"1neĬY̞<Lry5KP ]DDDF:g aw"êpW1%dfxK>,#߫%>;0S`,""""ۥ"""""""-{Gh px*""""""򑕓ڈ0 0iq"""""""0 fM |q](,, m6adԟ9sHi883r>m8Nf fnOu2 KufӞ3^ 8gZ33M??3>L?D"3y[w<? o~~bhOVVևvmfռK:t3gr)~P__ϢE੧bݺuDQf̘oc)--ĉ?3UUU ooڵ ˲(**geڵ$梨/~ V^͒%Kp_|W_}fΜϳ>ˎ;2e x~~X,FUUazj|M/^EDBo~Ckk+g|'QSSѣGλヒ梨5kOPYYIII |f>,O?4˖-OxbwvEVVٙkZ__3g?<< Gaڴia?:,YB__/Yn̘1~_~0}txgغu+&Mx<9rcǎQVVab1,:+ ,_*ر2.]JSSm'?I>Ofkʢ x<κuhjj>0r \s n+Wl޼[ZZ(**⮻ʕ+!`&˖-+_ СCTUU/}x )((_Ʋ,?Ζ-[hhh JfŊ|K_bǎ3c OΉ'(,,fҥKX @47ޠP(Doo/x[o z[xGx9uT ---O~Xd R)^/v?06lZկr)vٳ?#.\Hvv6---ڵ/| ڵ pM7裏{q fΜIeeezX\\#$7n|[o<ǡ'Nd~\&+++R\\L ,QRRBKK |>NJvvvoɢE2e m3m4O[o /\MFAAA K.q~_sˌ3hmmeڴiKww72ydrrr8u.Vs/@8~8>,μaYohjj_b$I6nٺu+7o&??}k|sȑ# m6~m/F$ -[c=ҥKٳgϨeܷoW˞={zdSNG?---$I%%%lذYf1w\vٳgswdn```iӦȯk2e W@p8Lee%k֬aƍB!-Z 7;ԩS<3ݻk|,7$;;m۶v>Or2sdggc&JVVL2իWn:۹;ٰaoFfR@ i8C"<,"w}}}9 à@ apLn7BfggO22i$3k ޲,zzz0M33iNww7d44iDM2d``l qNR."Aqq1xP(9k%%%eFɹED%JC"0 &MD*ZUvׇm~JKK!bEEE{(cYݸn3T*izqɡd2z)((gĶDQǡB^7Lz|qq1>oL`TjDVZZJ<|LӤ?3_YQQݙkhYYnqBH$P\\mtuuaYiRVVF$F RPP@" qחKKK a27҃ mܞ~a(**ڸ"""""""eLcrztq'kqRVsQ.""""""2(@L EDDDDDD&"""""""t =8vSNa ""r\.,b|ضϣ>zIO^b˖-|_88A.]DDB6\ƫ"""q]DDDDDDdP.""""""2(@L EDDDDDD&"""""""t @]DDDDDDdP.""S$#^‰ m:'qm;wGf6`}cw/&8Ǯx 󖳓8g7S&N9p4uN#C]t?j=1:MN۝88ltA?~"""G EDC pb$73NMsnpv55m'm?M %[7WO8&vyYy}L:yyivv@95vuf0/;K ;mW|ǻ""f`` /lw6cWGa{n ɹn.Xv'Q7G#"""C-"""""""t `]Cǎ#H0c \.G4Mf͚aXEii)D"***2۷q 4ix[DDDDDDdBS 륬 7o7|*/{n?cSVV?#ǻ"""""""Ƙ000χ8^#zp۶3߿oww477p ױ=HIDDdBR}mm]G;A"3Jr߀7JjS=" ͙€6]5v_`Xm۱vB| \.|(Bsm. ÿOsY9ش87xy41hSNk?q4hrle$)ZN~kl~=4C~9A_49'¾BODDjPF!_3ŇSFYw:u*_9r}}}R)L:Hzq\\.R*h'DN+""R:H:M`lp{ppcy-dp@bu8f7r  C MNovӦM5L88ƧO>1Ή+z, f8rEsa&BzI3t>f;j&&8iq\}W憈f6S"w<ϛ7kײvZ***HR$ /_E`(ߵkc޽̛7/̙3پ};7n$Q^^>u E""ခ vq%r6.Lv2qqzY5td968&&&nÅs9<+}u]{xϟq̲/\"""E&nc 'Oc=͛dɒ%F3i-ZD(bǎr-dޛ3gVѣ rM;jC6u;RDDD,TWW;#[neD`r曹/.s0uNDdB3LV7eڐNN?P)P묁app.W[0EDDrf9@)=yta\fWp.QNp]|n:hl:=2 \qޑ<&6]6E[DDD.eċ~/AVYy:8L$bwۜL j6ISI8DhOm&u:J&lwmdjʼ7`5m<]NBɳOr*gvA0Gr!dwt´ayܷogL=Tv˘?&v}QX͛=gÇsaR}}}ȑ#<8t\[ZZصkרSpz;w 6m"HH$شi}DDDƓt fG{4%6d?ǁ/FiOmgKppwZ?3'^8+O# VǙlR5y'W[#+pg71$ypp'[}5'ְ'8'[ۢFkrYM̾&7-o# 71qEfv~^8\$a{z}wG4$֎9sYf w.jx<3O<O h4_:t?LJڵkQ%/R_9ugğfAO>~"""=39#_ᜯ8#3=ݹy)/qF-3"ͅJ18W..8sc3Z/nݥ;| gϵ͙_jEDD&L EDDDDDD&1wqO$J(++0 1 mD"$ g:::m \.Xw+""""""0=OKQQSN%Lo2sLǡ˲xGٱc04K/ۿ[JKKǻ"""""""ʘ:˿KrssI$]3gr뭷O L2#ֆeYc.ĩ1JDCg`c!E3$Z[j+b[_q10Ifnd[;Zp6aRqYic3hr$]A_ӑ5j#lw?srl~(;.wJ;}V2`7e'har+1IWj?}V"ߡϪ>L LN$7ptgճ50))XǶ迌,ϪXb ٧>n#21Ϙ?96鱎fʔ.WUG"y/vј|Ȼ: Np\X/""+c )**"/o0 ={vyG,w8ư axE8c?+Ui[|<f3N/֖ l#.zKΤZv8+x#`c79 8o8o#+ñMEuLuq$bMu#ߑuV{#M<|N&ԎG!01;iJX9bއ9shTj/RW2,wcq>$G/iqcXG:.Su4Hbd}vK'""[35kְm6ˉF$ nL7͛7sN8C(//l8}}} ɓqYQ42G71P9qf.npa: ~z_8=[ \xpF2XbvstW0V@7EDcfL4MƗe6me˨,fҥtvv_I&qwfދlذ͛$??.""""""2ayŋxsy׾K*Ӹm1M0&lN7؎}jm`JY8C2z7Nr.۶HRƲ'L9m&JxvgrD"m$I,u~==˲28ΰυpl<.cDeXE".W&D"A*QsGDD0 <ϥo Ϭ@ @QQx׍hro."r5pڂ ĩ>\&6owEǒ+}1M0JM P ssCtuo8:9sg öm>}:@LӤ3fJ8p3f ??ISSe1k,gܹ#;Q5]n[ XߐW̟6a9v ,L&1[DDJm3g:::enT۶8 )**qs x|;<`NDD~llvwܐM ˙x-aʬ,MRR0og.ׇw=4˕0q3^(a4LGR~s6q]r:@wݬ~xCDDvlOpBnx~ 1[Vdhh]DDDDDDdP.""""""2(@L EDDDDDD&"""""""t @]DDDDDDdP.""""""2(@L EDDDDDD&"""""""t @]DDDDDDdp5m `Y pq|$I,gIJ,nw+""""""0H9LK/qrss;w.*SLR$=;vرc|_իWό3xG 3(ȑ#lݺ??h4?>wy'X`YYYD"2ۗկ~nr}QPPp[IcoD0X؎<ݴ )"es ; {I9]"Hp\5幤,wtt0ydz\.6oL(&D2ۘ۳Flذn@ 0$ v0]vEDdlll3NqqR]Q{H9$o!/"""rZ3n0ӧf9BYYpd2ɍ7c=fA)**l ~FVVsŴ `zRt,/UDDDùuL̙3yx饗p,Y2rrrpZ-[FSS?ӟtfFCee%?<?0}DDDDDDD&1ir뭷rJ9>//|+$In. ,?!eaƨۏ\tncǻ@pn7-\}4 .gJBax޳^7M4/z {ۓO$؁ vHM=]Mg/ey Atl;"a&Zg;9jB&q_XLYM MT4\cSPPκ<&txƻ""2Fc_>ÍKo?;9œb^r""""fi @]DDDDDDdP.""""""2(@L EDDDDDD&"""""""t @]DDDDDDdP.""""""2(@L EDDDDDD&"""""""t @kBqH&ض Hp4qq0M3m"q|>awEDDDDDD&1m~z}^//r+P\\ܹs),,$Hpw{ny_jx<x]DDDDDDdS~q֬YQZZJ8f˖-p]w?,8qDf|n&m)**~S6mu."2Et˶ǻHg1MS^,\} gh)@oiiaʔ)̚5  n77onM,0].~h4̙3c*\4LvFˋ\lr[ d m[􎅃5Eˆyc y2^{vD"X=rrrx7ٻw/eN~~~fX,FII gwéS1c* UTDD8`;.|DXo1}Μ9tM'?!''瓛ԩS`ҥ:tq~w~'}{{;*`3f0y>v"""""""ʘt̓>w܁eYbq{1EDD pIJ{IyLxCDDvle>.>;]sj|+WwQDDDD2q\DDDDDDdP.""""""2(@L EDDDDDD&"""""""t @\Yx`,e )"""7.|tח-b]DD{kb\ЭUU]]DDDDDDdP.""""""2h ȇ0 4Ɲ $]DDDDDD K&twwxpqmP(;k"""""""WX2d``{d8x{6 EDDDDDD0Myy9>/zn6 0 mƻ"""""""5.||>_&8, ˲gm]DDDDDDC`Y۶mcR)M~ZfMDDDDDDC`&555Ioo/s!++Ղ.""""""!).. _pLQ.""""""!q,kF 8X삋HaH$2quzĨ۝~ B]'eYh1O7;C~~Y}}}g5]DDDDDDD.h=cM("""""""-&""""""2(@̚U(Hr2k9ߖezǻ"""r\L4M qL8DDD]DD*v]‡r2x< EDD2.""\DD]DDDDDDdP.""""""2(@LYSew1>ixH&uq?.|[\.Wf3}vgxNRʄWivĜ-""""2^>z$!8Gr[4|ez1MP(D*"]<x= F+afe]@:}3'\TKQ"""""4 0 ~~LA2q^z^sa?JЀm̘17!z50 xL҆;Ç)//'???@*kFd^F$ 8$ n;r'F1qqXl999z466E$!77I&M杻y׳o><z+\s D˲2d0zҩT 3_UV֭[yzL>UVxHRdeeoAuuuɶLJ2/mXɤm;mۼ`6r˄a.uKK1ϝa!}A_'//o138}CDT* <mH$FÑ^[ϛ^`_5[l!Jj*b^T* w,n͔t+pZoKSO=E]]\O|q'wvc^gްI9Sd{q{$I:믿@ ஻"Sw1݅k.ǡ|Dy0/"K,3}\lBEE̘12bXfeYzxL&3cEDDDd3@ORlذ[n%KM{{;k׮%h"M[o vYYY׿f֬Y,X-[FYbDW_}ŧ>)8~87|3.v^z%/QUU]A/^Lyy9.z3?VzLX^^N[[[&STTDEEV>0۶m^l.\HAA  }v0Ms2{ ?[deej*)))go-[ߏ磷CQ\\̧?ig?yyy$IxѣG{!++C;h۷ۋa0;ҁ7СCl޼>8uuu_۶;" eZ{8@SS999\gHcydժU$ |M9y$K.sN<+V`<O^g̠< k֬//9.~inv/_Noo/yyy⋴Q[[K*رcp}zjB^+V`[n9sp]weر9;w9-[غu+~O~ܹ˗sϱj*ZZZ:u*v"quױ|ݜ""""9z<~<r!^{57 J1w\Yn}}}b1Ovv6_ר,VXŋٺu+L:5ӺۋcΜ9PUUŎ;x<|swߥ 4 C? ydeeǹؾ};]]]~C(>o6---n)//DzOeY~<7n1vxn\| _  k./Ƕm8q+V`ڴiڵٳgj*˙7o۶mioon#77;wrQ󩩩r}y2+H8nVZŶmIJ,~Zf sa,]n6-[633&әI&Kر[nVjjj瞣H$͛elٲ|V~?̙3Yl000@2dҥ477rI曙:u*c׮]466r /_TUUq}w^B0}t/^u]o˹ky3 Á~m^شipM6Ν;9r̙3FDDDdݶLKƍYv-ضMNN{U_ޟ}zsLhf4iTPClj뛂8yS}牓urc߀1`0HF*K{9gΙ~Ό$HǏ{^owq]wQWW4* @jj*z^Jߌt:p\twwQQl~dvvߏFc/jH$e~~Frr2l6tdfkZBnZ`H n:l6$&&^1ϱuV+'ǔcf3399``~~={PRRJ׍[yGhhh_?UVa6Z\u2Ŏt8&##DvC=D(" MYY-"Nx{y[1J%s[lARARR ),,$##od=^APpSO=%mݱX,( YbIII IMMo>RzXz~ZZv]ڲ[ iCDQZmx~gN'/((g{ܹsdggSTTģ>Jmm-$$$HLLbinnfppP:FDld>~.W_Fl6n::jG$TPXX޽{9u6lXDkcq;$%%hD"vZ-~<999kzj um_<l2077GeeWO<;Å شizT*V'-h%͛xB!)ҴcegHS*C{cQlC4`0T* WARSS?ľN':N҉A j|~Z-:nIc ʟlܸbt:STҢc-Au=*JZ0}.Kμht:EA`ll &9 B5066@ZZ\M|/?j~q7h4 k*q%s%`>Q)}~j#ek>??`0Ħ.O_o166&E?,/oZ쵥L?A222222222AXXXr}fq) iԤ㏉A>_m!A潉Yl^baaXL\\n[ҟi1TX\NFFFFFFFFAXZqyǍR|,`0h "ѱ䱅gpIDATB!"|nt[ YHFFFFFFFFFFFFF@vedddddddddddddn*7y\=V{rhh4z%.'VV2N>P($՚Yj|Qv+########sPՒX8 bY+07'rh4t[˸~#p80L7AEÁj/|A, b||xt:U' ^qU9ADScc( A@E(JR,VIT.y:]ccrT]X;W-'Y|qe>Xd>? =KŎ}|:/6 wU]EDQD&&&PT~RRR>h^M`~~NRRx<4 999t:z{{IKK`0Mff,rP*D"L&'N 33|;1H$LNNnY 8usW~gAEH$BKK n[jPZ|̏~#Z_%{_Cff&DQRSSZ  xtP(f^دq_0׿5NnWN':NrTGGGYXX 11)Z1-vïk~_gxxGBBۿ?eee}%''cOBBvJ8d~~^9ϟkTTTPTTēO>J"==q(III  BQTa2228z(߳eL&-u?,^k_O>$۷ot""F8yΟ?=܃磧RIff,]ioo' ri<=toACCzFFF_G:::~Ʒ-/zq8|>{1 ;vF|>L-7nOOwիַczz"7IVVoL&J}{dgg=UUUh4.^Hoo/;v`ݺuU0::/KǙ[twwꫯ266/K (ww|{ra0HJJooя~lٲ__ٹs'PJ%ٔR[[K/ďc~b t:DRZZʃ>QQQ?8 cX|-w?\n{W_}rfggMCC.Ny:::lݺo|ḩXUX|%hW==ˬ/KVVPyD"D"(lFrF޽loA4% -SL\ӡhFJvxz|u!Oh4wͩS%++@ t /7222__ׇfrQXXX`ٲeTWWӟo~|ߧK^^ַ?cΟ?Off5AXF@lfNKK G+_tL 婧>ׯ'rҿH$OOʒ![`X%0??/-|vvb!pQ&''Y~=??Ekk+s'Oŋx<G?555>|dժUA^}U~_ȷ-iB:$, 矧~|{h4b8v˗/'/~R[[?owJJJ*J!ɰn!55'|o|DQV^,Vg?/?8򢊌̧XVn7yO=>>ZͪUh4G!D(((`?JŪUP(O<9233o~É'dffJEb{v;dZ-@l֦MHKK斖fggc٘ĉ={VXA4`0͒T*n^u xo.'"<쳤T*|X,Ν;ݻ׾baժU[Z[X&}k Ɩ__9~8V"//C_,Faynɶl6###={T۸qdL&"qqql6~mFGGy+YrUvgӦM?lFGGll޼шRnK\9Bzz:6M|n?f*%io9r9222jǏ B!Ǘ }>|@\\Jٸq'&,8Zǚ5k!55e˖VYnt:XXX@V@ BDt:Wl6 )..&##NEE*+WJo?D"Yb4q@~?=[n%)) RI `ӦMQTTDaa!k֬`0PPP@VVqqqTVVVYbϟGRϦM[9^V+2***HOOghh}Q0L*P(D^^-"-ի_VUUI/Hum~_bSR HKK#==RV^MyyP?dddD`ʕh4-[Fjj*z[rJ&''D",[D~mN)ZI]XX RUUEZZFGy|***h4jJKK)))AѰj*Z-YfٻA6rJHKKDJ}2LdddP]]MYYӤKFFFFFFFSpPF^_rp8A`nnNJ ^, If@ @ ڽDV|∟B8ۍZK&)j؋s^JB"a.>?H&!!~Wi24q_>PbdU ~rM]MZ$NшF:ef?c"|y^~_pi(N8)#F$YR+b[ ۾?k\F{({w+>222222222WG&''QT%ނ 0??F!>>~gWsУ WxBL&GX-V{~T*WfÎ;QB~f'NLMR}}HaZ-,|z &########bvvNwTvuU CE&&&Z71R|>T*էB80;;iG!K'_SB\\_ "P($;Bp#|z|WWu(++x4 ׋ZF000@kk+`MMM~|100`@344D{{;&I\ b41F1tuuՅR\7zttzFFFX,T*%!!A]\Y*T*ߏngbbfAb,CzzOԔ&f'F9fR Bbavv&LUU B~DQʋ.ftt0 HqqqjQ P($-H$BggLF---h4L&nwBgy*Īp]zWW=p˗sq>ᠭ"zzzbΝlڴ /O?jp԰vZJ}llW_}FkR8q>4?+"T~璘ӧOX,<3~4 ZB!?N~~>eɸGGGpDR 0>>C0<<h&&&gy~m^/OR8tżksV+pY()).-MLL}v>̉'BN8 /-[0L N<Ɇ Rhx>Ή'&>>~8iA={0==Moo/g?pi-[+0Ν#!!#:|zjj*^H$9x ~Ky睬Xۍ l۶zM6'0 dggSYYIee%ϳyftAlL&ٴi5MBQjQVVF]]TTTOgg'6mjRYYI||<555lܸRHNN&''aΟ?VVK}}=t)//'77'NPUU% 쵷3>>l&//FAA/^dڵSZZJqq1gΜjWVV288H$avvGn??( JJJq ~権1D"ٻw/ݻwÿۿatvvZS^^NSS.ccc R^^~Í|JUU -[Fcc#%%% P]]M[[YYYΒٳgYb{!PSSC8;tgaaasQYYyCtBCC;v`0`Z9quuul6~m4 N"==ǏIgg'^W~2==Ͷm$gyff_(Jz-rssimmvinhhI(_pET*_X,~ I ^G;/2ǏgllwyP(ɓ'IMMedee_@ kRSSٱcG?gΜ!;;wy~?o&^ϓѣGʢ ()))8N-[FKK EEE SPP7I4GyJXXX q&&&Xz5UVcoNQQMMM[Ʉ燐Nr{zzxh4q1$Ν;Z+h49s `Zy7P(;zivڅVn3::ʮ]x".\`ddB 蠤$龽 Z daaߏ륢ɓ'ϧA8}4+V`۶m߿`0H &555B!?SUFFFFFF8ڸq#===ر/ynvobrr7xF#Ë8o=5] H{ի{c#V+@G}}=vrfHwBA}}= <EJKK9tV^"^cǎ111Omm-( FFFXXX! D0u]Yyo͛7sc0җVejjJ`1|+_P(N{%??_Zjoo' QTTNwwb=::J8GjFy1L[,CCC(J< wJLDVjgϞe||c;hjjb,,, fNf%FR?K_q}裏h8y$(&33χjb٘#`(--e˖RjZy욱mK R455c=F}$ h4)?hP(T*~? BʎSbddQ\.YYYlܸ8V^MBB]]],,,|r0 000@?|>l6~d||_3gPYYI(" /]w||L&RSS LNNJbIzz:N^avvV*,,~p8x^iSSS zy줢`0yWXr<311RbqFrrrfK,"*JjQ(bJ$!55q: ǟ;wiB(J\.cccynOSVVFpjٸq#`qXv-vi 9u'O$++ Icc# /QYE͆(ttt0<< e%tww300 *"F͛7xpсFJj*Bl6Wf۶mMww7>o3RHKK… }ݜ:u"??h4J(bڵhZN8Aff& 裏^ApP__OSSIII"iZiHrQ[[ T*=.\R) LRR؝h4fffHNNFE.^hDJm) \.999ttt0??(dff~zbȅ x<V'4v~~z, [neBSnn.V,T*ZQfggm%jII yyyKGJJ k֬jvZRRRx<(JJKK),,$;;M61>>Nuu5:~L&˖-CR166F~~>477hll۶M]<8]Pjl6J˗Rgttn sQzSVVFbb"TWWcZ%]tHLLdppJ,v*b۶mXBfNNN[la``h4Z fgg%AAfVywQ(rrrell7Rx<444 [n1-[&锴aZۤB`aaL&&&dݺu؈^箻"??UVIbߟ ْHNNZVTXXH\\;Acll1n $Ѳ2N'III S[[+[<)ƈ/ڹ,VqŋcQtuuI6I}]IHH SWW jkklKf[XXd2}BZgϞE祲_2?U")))\.3g066l^ 344Dmm-N mmmRvj5C+VoffD9[CFFFFFFFczTA_& QYYÇ9}4~-[SSS~F^z%~_}vz=.\?`ڵh4%${;&aqsr8xx[oQWWǖ-[)9Buu5⋤HUUN_~|PTrطoҢî]&==tDQܹsرM6P(x".zlƘٳ|>f3?Q*L&J%>,z#GHe>fffc2P(na<Z^FGGFtvvJNycc#O?4999fxlFA`ppfg%>>zyT*gΜAٳgctt\zzzѣ_Ry8fp8L[[R,ɄarrCccU\.j288(t( j5O?Tseݻw6o,-V300̙3[BA$N8~mVZ%Ø|^z%x$!//fOgq߷ٴi$500@aa!V>=wqǎc͚5q(rU^Q1Ldggs BUkfggsrС BO(GZZ<Tw~w(r(]g``V\(hZJ%$''SXX \L&z{{ C=D]]H?륥`0Ȇ x|сjtb2<455QWW'K?O(,,dddłj>0dff  ߿Qt:rJVZo8VZFj5zZB R[[+կgyIOOرcRǭ 444o~zv;GI@T"^z%)ncnn}xx8?$O0::Jss{ѣG%=%%|^墣gr]w鑑\h˖-[W^?E"jjjX~=vfff^CP!ϓO>Irr2.۽^B:^aϞ=Hee%DQ֯_/e"J촴% h~R]w%-l*JYv߿ZPZZJii)999ҵc k|A~HNNf͚5űn: PVV(3==8T*frr!Ξ=KWWR}9.FFF$zxg9wx^~?0440hd2 6P((LNNFǏ~#|>dll>fggX,Hgg'ccctwwvzzzo>vɲeXXXBgg'j8V\Iff&999TVV.(( ] F"233ioo̙38A^c{] èjN'OYY{MM8}4O?4B!)]`0(-JbXp\rq9B~~>mB!iΟ? NOO':FQh4^Z?\<())ԩSKQ\\Lbb"6l`ժU?~5k萎ttvvvo=<Ft}Q(~_CCCJڵ{RZZ㡤Vz-L&*! a ҹG1::fXd={=522222222{w0333Fl6&V4IC~~>t:Y|9EEE[VXAAAk֬h4ֆ#77X*p8fj{GGG18NRRRK) zL&~F';;>BFn:AkR0n222ضm P__bATd2rHJJj|z/_hdxxロlzzz{怒`ɸZ-F L&)))v&%% n7SSSϳm6IOO'11ߏ`bT*~III){ЧP(a VBmڵkȠLp:jxDQ`0ȃ>HZZ_"q 011Abb"sssvn7zP(R$>>kl㡭 w܁nuQ\\LWWlٲ>'--p8̽KNNH,ftt%B2X瓚Jii)YYYL||>>~:ǎ'|rbw$رc"YYYlڴg:ueddddddd> IAq\h4%!x8Q"7 Ĉ!’^e1ѯiCiĈ0l̝[>91;~W@57Q1_}.@ey%++Wb6<(PY^Iqa1 ynU[[oz\+J:&;xyJ* blC6G֏Qr 9̇q|csirDDTq6m'cc1QϏ \!*.ix{wgQilUf:D(Rnp>W߸{ )0d?-}A:O"lNEȷSW[o}|" Og?}SV7! ~ _⿉8P:1_ ov>$,Z?b&^qk<'^>]|*(J(EC0y~s>Xd*ťlh修UJ1-j^# ?mg~t22YhUZVfĬ5D3cP 9I0&PTAp HRúutt02P4DtMj31iM\,\[.c1',N[͔gL+SWbihb=Jib)y<{)@ҳ6c-l܀Vsn*S*I6&5El4B*+EC>|`UЫ #'a`9@tLp\\?'ǖCyR9Q&ȋϣ$^G/3o|aƑk%sW.,~I_Ik"͜FL/|jI2@$ы,(O)';..^C!vDx^YT$W0~J'[4{ a;;FJqw;ưs> MŋB>ׂomܑs;wtbG /!ٲRJo N˾ /ߑ[|lШ1aɠ{fpY~~E„B&ݓoK6%"ehw% 1k#q8]ԎRXL-q'?},w1{#D`kV6fm$٘W> Ae_DҡT(yb|{ݷ1iL _ʒ  g=WjN%ٜL% BE(hf\&wE~j3ٔ D1j6l$՜JIB Ye#ۚլZKyr9 AA![6O'SЫ'cTYٗ;U UUܙ'q|k=hRUtNs#j-9[8?zBePD'/i'MUgu\[tM)uT$UT(P![ 0a9BIb ee:CuZti\7% Q\7ގ$XŢ5y<\%.c9s=Xvۘ5fVF2&TTQd/b77% R8>p2ncE f6 %R'Lm0除^H\L ܖq#Tng7W_F`֚Ɏ&ϖG\hp4EhLQd/n 0@X_(voK0Ĭ5 SXȀsvo@,Z =?$A(vhR8SEl/gBM%x}<[B R1Jf\&JA`GT*uz=y|K$!͜ƗʿDL2r;(}itS_wsnhQ\eN&+.lyc1gS&7v]{ f@ErNւ(dZ2qT$W0рN#H3pôNʯr|s79{)_," DDBCd3wTS*O,{(QTeFp 6jN%ǖ}BMo#+.;r^J"ךEgz(_NE_E)ʝe %+ _8Q1J!<[8sѷ݊@]Ӽ6?!Nq!Jmf~wr~<( +BoUiv bӋl@$yV~ Kb AoilsơS)S7VǾ}zgQ J?N4%͜MocY2\=s=tNw*uVȿEkA)s6aWzf 9{3-S-׵ Y+.DQDT3WbMr9^$͔F(7G#ÒAw ֐nN_Q)ttpf $ѫxg(m&3.7ti޽qmM_YkF!(H2&ke~lI@dUQ)aQ*K[B5RVQcDT85F0}s}46 yyw]ey[ɳQ;^{S:g:&V&NJy{ryrjk8ycԎb֘qnٍ7tikƸ{}Ge9(mt.k*i;[v5o+l7n5dL3$#######t͉$PPDr\2fA7N3fY26"bgѩt6:+8Nz;6ɅIڦH2&aYѩt#s Z[-6*}a~GF7XI$q8 Z)Zs)/ ǖm;|!Qiȵ], λc#՜ʊ'9ѩtŦ z.&/>\[.+SVnIg;B`yr(O.'NwnypAdwh&|stusph "Hyj9Jxi O0D9ɤg@$@t'ӭMQ;VK\/tvP;'gGBGow7/|Cff0 L.L^rq yp\a!/*t) t=Jx#--tvػDlyAuVq.9Q4* RK5޹^4 a? ( |sUz&DT zhnwhHP!F#deaҘ߳! -O3g=|`q8s9f 2uR`'NǡCFLJ}Z.P;^K\ХSC fokI%&N'E C  I5rz4mmhTc""km3m<ɔg9DZƠwi4 $in}1c1fq0t30/CP22mJAIKd3hCiA/99>x hGLt8ш`G28?HT xf|3O6FTT(Ϥg]äR  / uT*lLx&a|aρ{y<6vF\#*mz0: + "Ir9HZEka}IR Ʈ{dS2'N5ۅ`la Ol7-S-L6݆;Ƣ yQ0 r(5Ϩk$S)93|.|U%{ JՕǁ@R^_wpH 0gG˄]UBK!_N|e֖A]"J->PjU.v~eύӷӳ:s-`偢H4&>΁W*K+ĒL|J,%5Ҿwk߮+_~U߫r5w.ʴJR ]*U*[x/ ^}us:藫_^{{|ԣGuпu+>v\h4TB$NEJ-)+w}BD(v8M#XV<s#ik?p AApN}‡"f'#!"D]" WE#TUfuɷd+šK‰1Eih6znZZSaU[o>bMV[[Ƥ2]O}E}vvITԇ! GQT:A%P}>aJ3Y|\vA}aZ%&͏!_^}F5>gG7h8Qd\FFFFFFFBn_A,{^^/ :333k}ڙ`0`0nvW>Q^/O h47e(2>>NJJ k鳈}7OCCCBז +B [O8~ϣ(PqzaСCh4v;>ӧOL||MKK YYY\x3gINNcǎ166Frr2n;iiitttpI>ZFVGFFƇOEww7IIF}䘝F9v}}}$$$jFKsjjT Ǐ5p1XV(7/%yaa?w 0>>J"… 뤥o1#L("c0vM|| @4exx]vR0Lűw^eΝ7v{%)) JbA044Fl6chmmftwwX,`2njj@CCo6zQ9x }}}8q ./pE$ /t:I?_Ajjjd2aٖ>Ngg'v~|K_СCK"v7^;wRVVƪU/N|_R;1gdtt.?̾}p:LMMc|A)e`iii[Kڏp/yfٳJŽK8&//??ŋT*V^+p4[RVVFII wy'  TVVrwKlذP(D__333tuua2&77&@p8|#(rQy' `QffflFP(DQѨt/_ΟٟRp7uLW#''> v;TUU]1nRB@PRGQ ̠P(P*@{{;^\DQDt:imm *97;;3ϐ8pɩtҞX867+V۷2&&&سgǎrR--l ywΝ;Goo/ ~cEp8Lvv6Z&(YYYhZrrrhiiYm٨"..˗SVVƁغu+pKuM&uuu.i?'''3<<ɓ'h4x"$%%Mg~~|[JN:ݻ),,d|| /~hoogǎfoveddddddddn+8c1Lw-EzHHH@ѐOII TVVMII Z $:,xf$z=)))Hrr2Z4 bRRRxO~wff-[I""333$$$\q|>JV{x<y,ZmPT O}ܪľ6s$#######yFAW]Br`7@@ Hz >//±qzܱݿq~T;0A^5E?NDQ$ x GQBUύ-*,^i[@_(VFFFFFFFF@5g^}dOJq>)Nq4KqS#MOq$$$e>)22222222?^{ sD #/_#TWh4D}}>~fO-wwwohHJJp뉏'w^Ν;GSS FFF8x T*|>{d2'!++ BDqaHLLj)"fh8<ǎcvvtfggٻw/t:ywx"Zjkkywݻ^/w瑩NR>q555aRRR䆆K{{;h4i8s 'Odaa4:;;9t399oŋ8c~=3Vb---f*TŽIRRZ3gp B6wySNqE, ~:;;IMME'33A$o&󌏏Mnn.|>^u>V텅L&u^ć\Ҟ%UUU)ݿyYXX)/VqVj%744ā萢:ϟrI]]GazzZ ########ѹuǎ# QYY޽{ !!#GzjF#(rAn݊R_d߾}l߾^ϱc/~AQQ:~LRSS%hoobp֬Y|Yfq!F#III455Q__ϖ-[p:\.J%{ao,?p/+Wvs!6oLVVJIصko@uu5鈢({eÆ jFGGlٳ4":F&''Y|9)Yb4ǎ#99$iJH?3g`2PTD"l6'NIF#Νh4ʅ hkk#!!&~i0ֆn)q bo~Ú5kx(++nc4y뭷(//T*hoojsϑKrr2W8={FҨa׮]l޼Ǐt244DbbǢ|+t:9}4maXEcǎLRR>#G044JӸnN'iiiLOOs1FGGIMMe~~cǎֆ$55ÁdRٳgٰa8q@ d! .e:uVv;LNNF@#ϟ';;n?7P(D$APWWj҂^ɓtuu >}zj5O=344ɓ'D"vN:Egg' Z-m$(QWWGNN v999XVn=g2ξ%#######zz X|">??O||<466())! fnSTT@__ccc_RIkk+]]] qE|>vvvvZ^&&&p:< M6b t:z.fETҤ+V@skk+nիW N:ECCf-[^_g999ѣG`0al6h^͛)--XYY&rq8(J\2H$/߿H$ž={줮'O/ /2qqq,vBӑ@jj*{졧+rŮb- FՊJY3h$##bN'$&&R[[K]]S__$]عs'qDQ$..*8(RgttC}lc?ܹDjjj8F>̫>KKK /^$~n7JR^ϛoIWWג~tvv+B47 ?Op\ىf###vSmf "*sȻ˻k477V%..,fffصk6]v/(j|M^|E^z%vlٲՊh .p9"1??/|`Xzq{oPT.^ƍe߾}|>z{{ioogO[[>,322Bwwm*JT.s /̪UƳxL9rߗ"±c" JFFwȡCp:ꫯ裏dk+ 333+lݺB wd2m6AFDQ"騢($9lذA*P(M6@4%''jn7mmmLOOۋ` ==tۙjF7^F9pnT"ppI0L277CӑFj:|l=5kPSSCmm-+WY" ^&33 qs]wa2'55kbIJJ"--4RSSÇ355Ev;ɓO>ŋl6GGy 鑑\0uuu388Z&99Z͝wIBB---j t.8/~ }}}h4J%^Wrva͚5hZ1 l۶*)*l0K2==JÇiool6s]w@$ATJsT*ԩSXci1k׮%99DQ(v vǙGVK N7b4ˣ"N:ٳg Bddd044ıcǤ-(RPP@II &% n Brr2444hLAl455-Yl2n LFFTVVr)V3g`4gΝBg[a41 R6ѣGy1133áCؿ?fNǁxijj\V,333~Q)..&>>Ft:hZdffJ #9###Fl6CCCGVVZ$Cee54̠1 \p\xQrDiii!`6Yb P(X|088( 㵴P((++CVS[[K @ղb FQSVV t:1͔ގARQQQ!9 KAAfy i`ffFz1gcb.DQT|kv}v^AR)III244D(ԭRPPn̿,eRSSeddDBFFeee 177GNNx<((({"\ saaA(677 l^V}w6P($Xn7yyyx\z^VVV!CAZ-7o& ㅅ TJ?hM6 VnLFrr2 j䰰@~~> )--ER ; qs8;;^GP&33k2kCCCH$  x(..&55t:u '?? an !JIKK^ X,Y\\fQZZ7DDDDDDDD~[򬽟5J%fy] /ϫzB,A q9N*++q:ڵ><*пHO@O$QIGGx^k`xڷE."""""""']"KqD"I,5% `P8i'1H$BD!yP_Xv~RH\qB^SY"%\SїM:Fb<.뒈DB('( B! 4?m'uB8^|H|1O>HP(q"`+)a}ƧB<"""""""""H$"K} xQ)χB@TD]]dggc9s KKKp8U(!ŋIMMh4%U;}4iiix^?NGGh]Fcc#@LfT*|2mmmillEVV022BVV>}*Tڵkh4222g}M$As9vM0*.|2gϞe۶mx<xG&vIKK̙3b2! q!۷J 33*Ґ夤,;v 55 7o׿5;w҄vd2n޼ɽ{NC. 0L III4662<dnn,loM8hZ:::8z(`0H]]dff2::۷孷buuU(022Bmmݽ{[n !/uuuBY>B5rrr+Z7tvv255s4 YYY(J֨Jpq'Nb̍7Br]v;dffR|!|7//RBh4|屺ʮ]0455)bٿ?*v;7h aΝ\t!illdbb3g,X,^';;B! qĉ쪤]vP(0B[h4F[ 33|>PüFGGe D"aaa .$̞={z*X _XX|ZZZȍ7X[[cddw;nyyFb8N^|$&ɘݻ呚JWW0Gm6vxO[[ܾ},N:dddp]*RXXqL&"ʢ:::66nHrr2̱c"77p5ϝK.۷YXXnsIRRRr ccc,,,FZZP6h4ܼy~m۩cee[na4ˣ/2??Oyy9*Uf3㴶>JQ՗_~Tʍ7(J<3,//seVVVxߧ%>p0{y5 @@HK/?6߿-[yM477fA3hT&nbuu .\CV+Xx<Α#GO?i&s?m}~~'Oo~gΜ!55Ç0==<۷oG*FFBvcVͽ{RRRBii);w$ dQRRݻIII!͛tww$jTV+###˞VHK.xIDAT$xݻwX^^;vj~$`0P(ذag8SSS {RZZ*ztww =Qظ(--eÆ ,--QVVFYY邋bzs-1WT*F4c??&''v&''a2A!J!//}ń-[`48' /ggXV^u(6t`iiY4 c6q  <¦VeiiTOLLp޽(D9rtg쟑GRRz^{={DRRrN233?0zܾ}GRVV&X> X뿦 OGG?D" &֭[ܹs\x< 7VVVbuu[n:::8u===lذH$7͛,--brrEywtha999,x7c֭-HP(H$d2r\Hl l޼Ξ= 2L8&a!@.p\o>z=F|~mrfggP*Bڵ xODzj5/2;v@p)z:x.$3[YYaddLAA2ifR2 (J!_ףj~F=x<<~VWWIOO'166館\Ąo2 \.g~~ӉR$;;A ^Nvt:zq\jLLLɿl6,--QXXHRR deeV%))K'_5e, KKKLLL J),,$99`XCR"lL&ccc y.\.CCCzJJJXXX`nn< dff`ƯP(:LVWWf~~^feeRjp-RIII 2q򘝝bVYZZ"-- PPPjzD"X,=<""""""""_|?kkk;*пL蟅@eNS}uuJVWWٷo|yT<*П cܝN'W\vٷo!tyT|=V z$%%=&ПD>QMϊD" qYń8;~dR):egmg x<:g% uJKBdߘmZDDDDDDDDD~sH$b1f3rx<.h? NAIH(XH$Γc YYYݵ`N'@iDZOM[܈|~eD#`ZFP餲VF#x'OrM)((@344ĩS(//bz-F#zK.q ^/999H$0pVϟOdu|( J%7nLOO2ǎc~~ 6LUUMMMH$innٳXVf3^z <oDQRRRnrrr۷9uP(7ǹvvrrr񃃃B&cǎq-zzzؼy3ݜ?!RJueff,o$v;w!//+Q2+1Ot:;wRSSj\rk׮xHMMŋ\vF#Hsq}qEH$<f]Jn7twwi&x<_H/ǃ^=s-z{{q\ܼyĄPIDQ1x^>|(dp0HV˝;w8q,// ĉ'dBO~B)K<޽{T*:::X,B)UUU\. xPTB `0(x?ʇ P(Dww7p-[py^/TUUqh4477/F9~8---Kjꨪ@ @mm-/2gϞuŋvv{r."Q*BɲP(pكD" J~~>HK.qemۆ륹W^ybd2HMiipU8= |uuu۷ZM *l6zl줺ݻwsbPF~.] ۷oڊZfpp,Jvʢ ??`v#Jׯ_ Fׯ_V_t:1̈́al67n͛HRt:UUU~jJ<*Я_\..p z{{ Bl6nݺEss3lڴIT[YYttt`eqٳgy&x^jjj"==VR)>diiG266FVV&h4JSS7nH8e~?333a|>/dddFcc#JFr IܹCFFW\add>555r5JKKIMM%++x<1Q^^΅ X^^F*rĉ\XXȦMD"dddV욚4 &T^/FJqc||q|<.]b|>bgyZ|_$444yfژg6<tww;nee8x<ؽ{7۷oŐJEii)999VINN&//K.p8c׮]D":::sݔs9Ƹq%%%244TW]CCCQVV˗͛œK$;wH$x<={͛7E{{;nBVpM233ټy3F>|(|oo|26LmFZZnjHOOgaaF\BCCM8 TWWv|eHe/^\j5>3ϰD]]333 ƙᥭRɑ#GB,--=vMJ > KKK8q{n]]GU[[w菄DսGOX,B{gTTTp-܉^m3go\^/'O$''{x2[nE.DD"~$6oNaa!%%%TTTTBkk W^yD?F| ͛IKK#55 cZlHRQ(GKK ۶m#997,199WKkk+_@.|>tvv?я8x iiil6&''9vgΜ`0FLLLߧsmT*zwM[[NbjjLsc㑒@uu5h4F#uuuRd( d22cǎ1==,//cX0 ( f3ׯ_gyyB-[7$%%Eȵ ˟*"ɘAbg2L𠩪bjjJP*ڵ˗/siR)f7xi6o,yOKKLOOFINN&==K.T*ݻGzz:nbrrߏDѰBFFP, 2a\z"9~8BB^Y """""""HN`vK@ @YYLOO`0qrVWWdi (KKK / A뙙nf_5B,crrOaacI> ݎFA2<Fez=hqd2H$FGG rx=|r"_._y< ?z<GP|lDzp8tqOԐ8.$2c0#99Y-@..뛈o˅JZޞxq<n7`P-!`0(iiiO}NT6bBF>u/EEEz/.fggzt:l6Fv1)S$ vh49&qG/?<mZWr9s ͂/cǨƍD__[nEPt:/dBQYYɵkׄl8a7`jjO >O(S[[Kuu5ccco 6mbiigH4%;;F;FZZ d{p]^_YYImm-Nsj5kkk>}NFcq _˗p%nܸAgg'7oDիQ\\sgΜannB<Ν֭[L&\.'ObPSSC4pM|͛7,p8cfj# :;;9ugDP BЀ\.7A8`0ӧٳgj;w`Z'sEٶm>6^}U6l ԑ.--lذAxvRÇ#׳o>a0ʸx"VBqq1LLL3ϰa|>(v`0p JJJD|LNN2??uFc֓OD" F#t /f2Dӑ/{.*[DZX,deeQ__ŋQՔ 0Bmb(ΝJņ tqT*eeeH$4 6|l6>< )))r!J%EEEhFܼy,VVVk׮1:: 7n  i&XXX;vAaa!J .`Xظq#;w… hxwb_l V|, XӧOhHKKfqEZ̰cv؁nG" J#//+'B% >M6a&׮]#55ueuuGbXܹsNj,mƍ9vsyz{{YYYaϞ=O-Rɑ#Ghjjr!ˉ㴴PWWGVVֺyhZ87Q*jF#.uVRTc^XXƍ),,d۶mddd`4CRa(((ҥK pYv޽{#GPZZJ$ARgq:撞ٳgAPPQQAAACCCtvvxhmmBٹs'lݺ1FCii"&HlP]]ܺ'mƎ;px>NGGlڴ]vq]Z-~n^ʏ~#f3ph4ʁ߳m6Z[[]?q###?}{deer8~8%%%p8G&^gaaA(ϧ̙3$%%k1<x^fffx(((`ddF*n[*--q8O,K bx1"㔕qb߾}\vq8=UUUnX"v͆fCQ\\Lff&>ZMrr2yVWWQ(BƍDu3Xb222hhh{پ};Pc+FC$!D8|0 @۽NE"Z[[ٿ?2 N'8.-[͛7n · n7B,URRT*ehhF H$B0Bt: G޽{j0LhZF#PXj7n0;;+<~`0)jq:x<h(Jb@ǃV}up:lٲRN‹ZZZ(**d2ݻwq:ϳf#77ш餸l!gaa!8N^}UZ-l6F#z$(,,n7'N ''RɆ *AjW"v݅jkk><쳟#eK. Gsl۷y%?S\.399ISSCjj*wh4IZZ9tpjr / @ww7&+WCfǎtuuQQQARRӃL&###CG^^Z-2 RRD*hP((J6oLuu5 tBu,#%%UF#^F{9U& ^/.]gݻw300@FFNJn eeeJ[[H$Nran7:tm_"RHOON^~eFFFbdddDJBV~*++h42228tضm{[p\l۶۷Rd~~1ytC"ꫯm]xA^ʮ]|b2d;vݻwe{9hoog߾}v~IMM_W+WT*yW1f˖-zN >Af2ܹӧOTTT~.]Dgg'7bTUUFٿ?pM46IIIBB!Ν;^… s]1LXV޽˦MHNF/Hp:,,,YzQ*dff ֈgb8 W*( ffflGχbz!Xv4l bB$xd'VfeeӉD"!33$LZh4,RTH(6==M0,I>JE 61AJ#y^NNoZq8j!>vvۍL&#++ Vn,2@ FTFQ*1==OJ(‹hdyyP($ܯ%55u;oY^^&a4dyyÁb6jBYaafff-,,`6v`0zQTaR`I<ϓgnnNo;;lݺY<VBA8޳d2㤧 yIJJbvvRba~~/yHү]/׋b&w$t +xur===jXXX@V 6~?~_I5fqqQfbgeexXXXh4hX[[ZfaaAXkRSS b2P%Xz=fH$$PJEvv6NߏJB֭[g2rrrg~~ݻwY EffG'r<ÁlF& #VdtLjj*FYŒgee֫X,FÁA.2Nh4bf ײlh4ٽ{G/)!Y[[CTb6>T<*? u rQ]]gę& /@uIKK{,QVCCNYp"RWW <:T݉ǣ]DDDDDDDD"WVVp\Ot=HA!&Ӟ'PZI#Hp\mw"i'{$ 4O>uN'zBTQ<B !J"_m[(`0c&"""""""5@"\.Dx;2LO=or\H$ _K`0]Il&|럪%))IHRR闾<=Now|[m,j'9r@?꺟M8F?zO}c4H6Ic99,Dܿi!?QړQkGa $l0N'[W{tD" s>Dbɏ'񻉉 X[[O|/O3w>jv1"""""""~L H|D"V+?G&<'N֭[t:R)G\zR ]]]WbܻwdF#.\OAAp8,OLLLLLr>.>BB*(((`ii`bb͛7ɓ'' y7IKK%%77A4l6sY^GKFFrw}˗/e8UUU099IAAtuu2~:lٲZ?NQQIv ,//Ŀ'^yƍ|%j&Nw}6f3:ӧOSWW"ܼyOnn.;`وF:uFyyyBDIAЇ月< NQQWbDppqt{4\pAqq1ѣ PPPw֭[f9<.]"Okk+'Odttbx뭷s(J}]jkkdrEjkk౵e'XSNHii)jzjkk9wc* TVVP(|TUUBMM ԰iӦOp}n޼Ɏ;>3+.X,D dBE* cccD"***8{,*{rI}YnJrr2ݼ|>N:Ńx饗r/SRRBoo/?lذu]*0>'GD"aǎܼy\Nii)>^f#77'OgF#]]]XV \xvmF ݻlڴ B`ӧO /r9" h4466w^Z-j۷S]]j%## c˖-~xgRXX(DR)NtttիW9Nyw{.}}}L&N>А o&B!6 |QFٰawbZq{GUUyyy\xW_}A"XV233ihht: >|\%N:EGGrv222q\cb*>|(tvvb4ʕ+l60.\լ%O766Dpt:N(viN8^'99JZZZPTl֯Op8L4E.[o̎;hll֭[k.ǑdBYF޽{f҂Vp8Lmm-S\`ŋ9ry@VSZZJ]]sRSS;~ZZZh4ގgll_~gϲk.RRR\x۷?&{{{ioogxxXvwttO]]SNlfzzZX&''9{,{1 tttT*innF&m6ioofFGG9r< F /Auu5SSS055ӧ%33A.\,2fX\\$77._n'##7|zń(**+WqFjjjGC(7nҥK\.8s o իWh49s>1L댎bxPy";Cjj*ofԄJE.\j? \N}}=6mBVݍ`aaÇsyyw~@GGPRR^Ν;ٳTJkk+>,XK.q5_ <^>@PwŲڪq\,,,022" k.z=׮]lbF.^H}}=dddPRRBrr2]`0đD"h4 @nn.!h4RXXBu"0͛l6y&OFTR\\ %%e,!Ϟ=KKK J|4 x\8h$;;[ad2:A:B ''g]GFqFܹ&&&ƍrÝ;wXZZˆ tTUUaZٲe … 8uSwajƍIMM%[ojIKKfq)IKKcnn ***X]]jJUattdff^4558w:?~t~:===l6ill$77={e?\.G&qy DѰi& cuu͛7S^^"aR)CCC(J(,,d||)\/T*%77b*++?2 BDDDDD'>/iiit:\.<`,..Loo/ܽ{M6Cq]Z-nߏBs)oQTTbFlD"Ν;̟ٟ r蠾??h4ڵ5۷o OUUKzz:+++=z nls<bPRRBVV ,Tj%X222d``VXZZB*VQ8n7*[~aqx<8q/ÇQ(?&{GII >D׳ƻ/8FA0PP(1SVV?Occ#8p:&''9p?x<9s%p:8NEՒjT*j(Jv;kkkz6oތBNN ֵ5&'''55lA(( T*:n7m۶}%7B,T*Z`0Hjj*9997Jyy:!Y]]IJJBt:Z$%%z aXbx<[&1N'R\.'6^/L&J%kkkV1LQ*$''''$''311}lf xH$B8<~j5 JKKt:>F$)annnf˖-jJ' rX]]n6c`ɗdL&a}yVWW|HRz=F;vQB^ZFp:B(FՒlvNvv6PHD"~am`0Kղe_r9*JD$l6˅# J0p80L( N'Fhc$b x<1JRh4*H$fggvvӉyڏW300@SSp RSSY\\|d";;H$OSv;vb:::rw^oν{222(,,|sss\r~_Ç? \,_geeNh`0PYYI__ l6x ˹~: ܻwyrrrO~& QVV47nrcB/HIIW^y.Ұt:yℕ&۷j\z$ F={tb1_HOO_ȄpW*BpEE<|PD".%%%a41A]Çammҧ]yn޼IQQZt:sM\.w令$ bff|><u/]immeϞ=DT{/KKKLOO eJKKY^^͛7 X'HMM套^X)))Bmh4N#++yv 'BTRRRRdee,;T^'==5\‘#GhllrQPP.7hblٲSNq9n7r+WPVVF~~> gq_ ?h4רjyb`صk===_5ݻYX,GMM /yyy׿(J|M|>@,}]nΝ;DvKK +++R^^NOOgΜpT*T*oKii)o&f!_I,J%)))p?N,.Z'O[oQQQlGt:j5ܹs/Fם;w/Ɇ طoܻw[uV͆Zn etA$ JRX%LMM100h4JRRHݎD"AV$HMMpAez*X$w. Hrr2~ea%+aZD",--`ZWf3 Uz=^N2yǙ'==P(2 */w+~f` eѝ(ͷBh4b  HJH$\.,h4zjD"O=K$n7!EZ^ߏbk4R0 x^j08@ f# FzRRPNJJ :H$"jZv0V\.XVkp0diiIؘb T}P(X\\$ Fu+^/`łZ^ޤ$H$B(`0}f4`IzHRJ%G\ x͆L& JbrrRț6t:L&+++B! +Ͱ% h D1K7Ejj*jyFO*ՊD"tzl(<&0??O,CR kأHmejjJȳ~l6xQYxTxTkkk\|)))yڷyT$Ӭ>??OZZ:x<֭[n^~uh4J}}={Vo|wbb[nŐ>|+  YP> n[m:JZx4d7F5O>ibqVWWINN~, G!ϟǸ&IK}Ix^'"""""""""Oe '菩x<.$["IO".^7RH$ AYǹN"Bx*ǑjQX߀SDDDDDDDD!H>G/Eu~ld/z|{"i'K""""""""_gJ%pox\ Q%D.:PHF?v,g!q3 D[j{,{#ȺsB!pܧ̧ǯ*U^{t|cǼ|~㌏h9b ȵ|L<ѵkyD;,//y~5D+~w裟y|'O~VaMycغs痈ȗg?_&~H$|>!{kd2;ԄZFP;P__Ouu56mJ?gׇhDVsQ.]ۅKVeaa_ܼyNR%+ x"}}}122¶mۘĉz)((_4l6^p|\.W%fN>͕+WDpe|2Ge``Lr9ǎ۷ǹp555PTTݻw9uw%##[oE]]MMMl۶W_bL&c{H$,//p8HKK{bqG633CmmPVi'N'Nz=ǎΒŅ r ϟ'%%5=ʝ;wHMM%99.^ BDM|> z<Re;oݻY>77lj'ؿc=bT*"??J%'Jp@@(&p8L$<\}}@IPw}4h4ʕ+WBVVVx뭷hnn&VyvΝ; EEEA}]QTdff /rv;G^L&7ޠK.uV8w< ٳgexxO xF>IJMMET wDž lt'>ChZ.\@OOyyyz(_Ɖ'crrݻDZc루qO59z(vvsQh4p1Ν;GYYz~ygeEDDDDDL\.XLh dBU*еZ-333B3gΐ9~8bݘL&xWp\={q^|Ez{{q\K eUػwPQ~Y4 {졪}}GFa޽ܺu \NYYh>o HͥSNgV+}}}O >nJ0޽{|[ߢ Jbaǎ9sZcc#r#GLcf޽;v`jjQ>̎;\.}Yf3wޥPؼH[*osmژիd2A =ݻww)));%ի477᭷`0 HpwA}ԟģ]*RQQ磽tnݺ?gjlž={(..h4rM4 gϞe߾} %ʕ+Kii* ىhtrIzzzHMMƍMII ccc;wnV+cǎӃÂInhh  144D()\.Bi7xH$dF4 333tuuՅL&#++K_e׮]ҥKܾ}9 ++>x" 477c2z*mmmB!:;;cuuJW(wuzXVX,Fv͝;wFٻw/uuu>|;w(;wѣɟ 8NhZ, {졣`02kkk8pZillG?/_&--J?'1??OEE6mB">D"p0;;ˑ#G8s }~, lݺɄBÇٳ/ """""""?Fh\Wl60B}׮.vڅFڵklݺ b%%%dddPSSCMM ]^^P HcmmxHFzzz{.oF"088JW_}n^/?)..&ǡC~SqUMadd^Ν;ijjW^ahh>|ȃ>sss,,,Oyy9;w$77Rjkk Ôk100@ww76lݎbAT# QRRBff&}}}>}lj5jnv-dzz <|/> `Xctt0j.@vv6;wӜ;wnz8㌍ xll ÁjW^!_˿\v1<̙3|&//ﱿG"G?`Ic8^ZZZ}6zG?`ddDljj1 |> [lOOؾ};ON._cZYXXfڵ xS^^mfHKK#''L!^*INNb}Fjj*ݴBHJJb߾}}}FVWW9z(9999rD?OD"LOOhmm0a2`6)++>ujψ`0H( 峼^x<ΦMxuׯ_' VQLj%??ɄvzlGbHT&eaaSNOgg`qr9rJE h4b4h4(J !o"QAFFJAT*)))$''LNN\rU\.@@8pgydQՌqIoRXXݻwپ};?я󱴴 K8&;;޽{y'<ֶ_~b!DV;P*|;_*v<{G8fii Ӊ^`nJtrssB hFx<԰$ӧO344DUUϦW% v@ @YY^M<')) Z@.c4kO<GV '|>:rPTUbeeh4L&l6#||>, x50f A.Ys8L&rp\[[#P(0x<~?˘P(b"J1LqVWW H$RRRd2"nF#G?dn7PxϚ |b1z`BX$ b\Tbۅ2k>Z-ܓ\.' ˅G}}}LMM144ĿwX,V%rH$T*4 np8,ezIMMxbK{wIIIt:"`P@UZ-A8^WٌR$zp\N4E" BLA<g~~4"0btF1a4"Ʉ9i4Q* s OZ\.>Rz(J!NT* Bx<L&`Mrr2L(' cXd2aj~aT*<`iizX,T*RTXJ%Zp8,p8^/É6 ^B!a ytN'FbPHXy&'--J*y(mmmx<^xd2X5~?z ۏKZA~BuZP044IKKCP zǂV%d F'U.'s{~^VvҜX,hZ1OMM'66Vř3gX`X,q}|bިpe˖2222222_Bgm6SSSh4bccgx=@蟇PDil6Μ9d͚5_+P$@_c>44@FFk׮/PB%KGr8y\.z=jO`04AP(P*(/u|uP(LNN>q<i~ixAxx> VFeS7.Rd?7WzuCn{k@@x… :tya4֭z6pyR}gg'/}Hz8tǎFGG/I[[K,l6{n.\yyy9s7$'' @WWrss'? 7o{tuuQPP R=z>6PTڵd ĉG]]臨d&&&عs'gΜKrI~moh]`0BRX,l6 X;JEoo/ǎH(+իW裏/^|N<ѣGihh 33QyATw^ʰX,P("mnTQRW n3<:;;ټy3˗/v3==ͺuHHH [P[oQUUEUU:uJDO]]/_&>>~[z>} >h49t/_&<<'>C tFÒ%Kp\r?cN<ɜ9s8s jkk),,1< QQQ S[[͛Q_=**^~I[[ɼ455a۱X,x^vIKK x^~md^OXX.׮]h4rnݺ磲vIKKZ^/$''s(bDEE8Z|zX,PSSCjj*CCC:tFΝ;PWWǮ]D˦&{ ;vj5aaaٳJ4 F?JXz5qqq( Yp! ZJe麟WRUU%R8pL&=zi222PT\.:D[[/&33"L&Gab.ٽ{7 ~?ݻj ߿r*477Acc#;w*MMM߿jf䒗yz|۠3^룩*+Wl24 Ofb\Ξ=ˡC$..k׮`ƺt:?.B 55A/v"""0L455QRRh$..H񛲲2L&~RRRX|9MMM{( RRRhii!%%QR9rgϞEV(j5)))tvvANNȓ<88Hii)pwǪףR0Le tttvZ"""`֭\|/^$11۷сjepp^x\0?~d-[ƦM8|0@X<]QTܹsK4t$&&Oww7IIIKnn.@ VQPPyb||W_}B}}=ݬY:::ЀVeɒ%KO%_̽Hlݺ"ذa#// ;͛7ihhxgltww388^gǎR[[8?Gd``>˗ٱcpAOKKcܺuk׮ɲeXlf?E@bP^^Ν;wx<x _3???x|>Ǐ'66ViiiX۷PTT֭[f``K/ą $%%qJ%FN:EMM 6 Ν;t: - e͛Ǯ]D~SNEJJ 7oK.KQQ@^hƍ ۷`Ç)~kka||_~A]]XVxĢyIOOiuZ< ITTcccܹs+V0::ʵkר'|;aժUr㏱|;yA8ƍ^JOOܹsinn&::ٌl&<<@ @bb":===8` ^/x^l6. DA jZO q2_-B,>>۷9w)\.jmYV,q8N#<>fbbH׈B3Gs 6mիWQRցR Mvv6˖-#**ja2<^z1l޼z1_Y,\.xL,[l**Jn(ҥKhrƍTTTP^^$~!J_~Y[||<bϞ=BB0 lٲ/7oLDDJr}/366 v`0^Gל>ɯ_NUU^s璜LKK |;!""f IJJ_bRXx1TWWxغu+9rB:īz_?'NǏm۶ٳqN:%\:۷9s 9r\:/,^q:FVXNn~z^/{h4ra^~eHNNfdd<;v'|‹/L0^LOOPv?΂ 8x wP8lgɒ%8qN ٴivh4?`0ҥKC׋h4ս{2<<~ZMdd$JӉ$>>׋n }14tbgAR;#jE̽J"**J3v=ɰ"f0 p8ĎeddzصZ-`0Ԕx`zzZr/IDATaDD rN^ Έfn7FIRzؑߢP(h4 04PxAq:8L&zDDT>χfp7_0$""@ f! KXX.Ke]Tl`ARRRy&'O?!hZǡ` N/-<= q?+B2 inv9TLV9ƍPYYɟٟ q1JEBB(J^/ZV'es)F^ƐbpwzJJ‘ΥT*|<ҹl6aaacbHo%X*J>s:nL {vx<{< BkE,nσ~>i4h%W? tOxx}|[P(FT~q(ב$7'&b425|}6"q*ꉻ0Jq7Y|Ok^oIˮ$4]ܥ2n_|>2|}PBo쑏yؗ>ۍV8. ߏ^'t: jt:JRHBGF:F WP$4HВ 3&zI)qBEmIfy^!g0PT\.஺pkxx8aaa|>Qp^HN1ކ>1Rz_T*tBrƨZN‡>o<~ikk#..R+HX DT(84]rB!RMFFFFFFFF櫃?I$WLGBBW\'? p7N{{;;wZ`ٳ/o>.\hg<3TUU;ILL jp%zzz(***R}gg'/iiiaŊU!I1>,,r)\BNNccc˿ ---,[~>#3g_dRRRgbb'wݻsFQQ0?Cgg'jvž}X|9`p_N^^uuu:tJp8޽sqy-[ɓ'y7),,$..zKRLAV399d2)χZO>"$}/ |TTT鈌ߦ6 8|0'Oʕ+3<<BV~Hge}6mڵk1}v9~8cccl޼VV+< DDD0/_fÆ "]dK͝[A2T5 &kR]]Zf…hZYv-" ؿ?+V ++vL&sppY`>F6nȼy0 dee|r:DAA0ذa999h4RSSaŊDEEի9u j*dͬ\R]T]FNN3P(MMM twwsY^/`> .W^~G ̙3V"Ftt4nCqjXxz˗z'--˗/op9rrrp/2===԰pB8u7o&**~ٴij+cGEE{GKK jsΑ۷͛aZv0ҥK?~k׮ŋZ\|iz|'9#C~UjjjtbZyqI6l ^tt4SSSvJKK9].uuup0 "VeѢEDGGsx7)..oLj̓gDFFtvvRUUEpeٲeT*N#eԩS^{5,Wslk"xuTTTPYYZge˖- 255ijj?zՊ ;;^xs9>2.^}bbbwe܌裡WA=AHLL$&&$bbb7v∊z-  IMMe֭Oz%%%^۷o{|> ̝;f顧^'::{.Qg@ q<8Nl_j رzN>͚5k8{,,Y??`0sN,ˌcKKKYx1vV+9|~~?III,XSNQ(<9LMM8Fnhkk.w%>>-[`4dÆ DGG3<۷oq |0䣏>V\yO z__ZX;J= >N?DR144DNNUUU188HNN=~V^?5k֐og`` |ܾ}0>> /hdϞ=\viصk!L&/^A233#//<ǏqrssV"fAbb"###$''P(Xr%ܼy֬Yngl6f3ehiiaxx+V8ddd<~|l6.\Hgg' dzyf<n6mD~~>ϟΝ;رî]z*ϧRnGDAUU455jUrq룢BxsiXbgϞe``-Z$\hz=:NN'\r;vVBR`RG F+Vp5AVE7ny8::ZwaaadggpB-Z… 1LbѭG0>>Β%Kx<)########Y\VUlQK].x^<`FZfzzzF6imv,$2p\BE;A+INx Gell N`r dI{zzBJ",, ۍɒ@Z0$<<\|>T*(B*9t:@@qn-T1\P{i'\jIMJ'Im%)KǨT*ƄvhY6( 555 7B@Vjzj$.jp`2zvEIJR2`W(3T񇆆E=ߏJі}4>/`AD+J>OO3gZ,vF#B$N_RHTZr\>bq8LOO !z2Hs4΁Ӑ~Ȳ!Uy|z{{&lh4蛸 `A"CKZE0J:),%.gv$C~m"-v~SO[-Il6 o=e}|ro|yJ踸/RO:Yh >>UΥX; 6MZ%s?i3N)Mi "**оMhP4y^"""VgCZAD t:{ɕ`0|k^zt:z78q:k< xr|>bbbBprq+########@]7}]ܕJ=n_6aaaxmuRoIˮ ) F oaaa|o)########=1Sqx*fgss3'RWNDD}h=q955%BzGEE>Upp.8I8QTru1kLMM;T}6RI"} B̛Ҙ "ٳgtDGG?v9l3PnݺEmm-r 7nܠ@ @YYh+);iޚ=2{%:~4 I1cbbBx^"##g\o``F#@JECCa隣FCss3'::E@; Jb_tȎRn055%QcBTJI#011!Bz_ }ƥt}i,~&''Xl6\.׌`}.C<88ȹs爈xb3o+Ez}}=?O(,,]vq\..\ٳgYr%Ow ILOOvEKHJ^FCGGcܹk"@СCTTTV7իܼylΝ;ǥKؽ{7IIIo>0 Ʋ{n***"//O,Hɓ~H]%]yT*zZ[[)..Czz 1Į.ʕ+vȲ )[@(ҸVv0|v@ZI=ƍ444tR\.br83Ɩ>OPpYbllHa|>FRRwAV@ Qv4ϟgjj/}J/~*Ǖ+WHHH`TUUp8appSN҂fcѢEbAQ7Η.o6QPP 6ln޼8;wKrq"""z`D?PVVFgg' jZZZhii!66[oEuu5N| -~v;@>:9w˖-cc4ٽ{7 hZxż^TTÇ9vMMM 1t\.xjzTTT000@ff&"DAZ|Gsrf,\.&''裏())O---?g``@<b@hg,YBrr2NSxޛaaa:tA233\"era=*J.bK ( VUVV)//'66V,YGܧ=(ew)Bf?ϤW>,OK[oȝ;w(((:u7nPTTDSSw$$$zOMM vL}.\@[[%%%q`ttT(Jy)//.^(t,ˌwy.]DOO?~#GHnn.b0t[>3كb_Wo*@ Xr%vrYx1ҥK 9|0 ^v; @EE. y;w"͛/_ -[~Fss37o_?3V+?ؾ};6l]///'<<\ AΝKAA_B??288H^^pW)=::RL&aaa+tttv1 hZ_twwtRV^˗sf3F[rH(300^?FRa?#vE~~>%%%455aXD_xl"l2VZTDQQŋ֒n?o6.~t}]^|El6ǏtR]]͛ɹgg, 7o$++QTǩSX`7odx^^uvIww71#//k׮O"--N<~_j)--Qx饗8}4X,6n$w!;;[-> HGG֟ɟp1p:ܺu FÎ;cll V+/̙3g0tttm۶'ڧ/^Jŭ[ձi&̙# ihhd2QSSCmm-s!22Ry7O;w.Vȼy#,,=?O(,,R^Jaa!7n ==+W㡫.q|KK ˗/'33~[x?Oikkl6smj5;v`߾}jrssIJJĉ$''yf~_0o B````0ȑ#GXj& |6nȝ;wf>.]իWIihh`͸nx<+\v)z*whoogddRImm-+V ,,[nuVZ[[ioo'--[RVVƆ ƒ%KXn{wT=zŋȶm8qNROX8v%?G/6+WdѢE3;wsNj5>,)"=h\\]/R裏hmmx|2/_fǎX,Μ9C||<)))lܸ7 f3?~_R[[KYY!zzSPPݻłׯs~ŋ̝;}~?6韨ǎҥKaZ-gϞexxX?VZ?͛7U]]r)####dxOXxx윜n߾ʫY|9'OT-ZUVqU۷`ʕ> l6)))$&&hec(.hZXl111DDD.~siRRRHKKv⭷c4dΜ9b`,Z2;J"**jFh\BLL DFF288Hoo/k֬444vZ t} m6suFFF -wX,l6<䈝T/_͛9~8b7if͛_(v;oI'== rsso4ٳgJn?sW  ##_Rw`0$!!jjkkg˗dFGGٸq#˖-… c beZ-™3g?1&1`Μ93]v;.]?˖-CRqqIIInٳ\vA[RTT֭[Yt)fHFFF~0*ˣLII Ӕ͛79<_O%u={r/_d… ;wtf3>>#dժU,Xg}FCLL Lgg' fQPP@ZZIIIǣhh4deexb-ZYl>,6mbٲelݺR6oLii)ׯ_ŋ 144Dll,F(Z[[9rPVVl&::~:$)))L&ƛEjj*ϟ7nX,bJիIMMM6188Hxx8.{200d"&&Drr2VU6 ¢Eظq#uuuLNN299Iaa!۷og zIMM%''˗/c6H?lݺ}Y?d2qEN:EFF?t( /^عs'111x<t:񐜜Lrr2SSSHLL jZgHLL f`0HRRX,1| Gtt4QQQ INN&55*2$&&hl6{?11QߔRRRp݌\255EDDTb4zQ(ܼyn EY̙C~~> .jfNvv6^W<{ff.jx^qnJ% Ŗ\nh)Ν;?>K,sfZZ/a ](=J>?8ii@PhPT̛7իWsA1l6IajL&U,\kײ}v F(kkk+6m"??_]M7LLLLwǃRB !!( 9ZR{z,Y‡~H  //9֭[dddghhGXsőFooba||AFVc0LtvvىV%;;aqH wΝ;$&& }4͌{jl6Gzz:tttADD38 ;WƠ_vӧOc61Lh4.^W_%%%۷oXt)z5k0oE|>#V~?| p-''j˖-CTvZn7{lܸ|磿L]F 255Ŏ;`Ϟ=p8HJJb8NUUUL)(( ;;@ ǩg||Dj5t:$!!JJJ j+VPWWǭ[gڵ\.͛墿ZMLL K.!V^M?$%%xRƠ_pn7vRr [07nDVIEE:W_}U,QRRŠ+xx8111LLLЀfctvvXBvXl1,ZիWg!""ӧO}1`Paa!266&+WAŋ @ 0yyyddd 㱲UnJnmUU46mڄll6Kjj*fZNc֭XV.^&77WxMFFl߾tEy󈉉,۷op8(**"77W?,XFٲe 􈅠͛7 9<n޼I^^999A#??+WO+WCyy9/f(JN8ATT?2GZZz&4C󩨨 <<Onn."ѢEn233q8SVVJb||իWc6$>>RnܸAgg'jRILLa\>|~t:мl6ׯc2z,\D۱X,deeRZ" // Ԉd2dggsmZZZHJJbTTTNmmmbqOzVK!5gFSS˖-cpprJ%K,lBll,^)**fAOO X`qܾ}۷oRxHIIM6Muu5^Wg4ikkڵka 'O$11[ٳgZDcc#6mbŊB1//-[ɓ' ر9sPSSC[[۶mcRVVŋYv-:u ˎ;ɡfyJKK1\x i&T*'N@/NYY}}}رbqKcǎ yyyvRSSK0VFFFFYbVU,+ p\ @(JB2ҊthL(r -  w066N`0(<TB2F\W7 5V:z<{iY:F&H/r ~ZBQ`POrW7m,HR*iK:ppUX,_֒/S$ I0/)\FHR$q! BǙ4g! Nrە~txl`00RfSYYYr/k&b%ԌcbbʚqKaaa\v!jkk/vwT*}}}Inn(c&]01H唎!}ORݤϒXt~e :QDimkVիW1L"fTTr?c\_Cwߌ, * lw$X:KIl 3C{Zt_HuKq_Ic= t,CoT mG:yuQJLW۷oC{{JMM%99}pT =^ =F/r~=.cr3A!*###mwFPh4BV"q_f{?,]TW%_DZ?tA  =BO2gwvg6E zd2u.T~sfC~Xw[^qawArrcC_触a-?$eA^R~#iQZQ=9{Μ}a]·15쟵3tKѰ}vX,B&66}}P>xfvcWO;q7:ddddd.젏 w'VH%""3DŽ* v;aaah'[xzK(ؽ Iq_6 ^T622w9B_wGvF J;wso:_6.79asW ɶ-.;蒛$p:LOO"<<Ӳ}Q(tv7iǗ;'?]V3>>|~ߟw~zP(~*FKוUq~R|[-~՞R}[frr(T['&&x<0^/6n7@ ،x &&z<&&&? 6M(FEEzZ~Պ`6 ILL n<66%**(&&&&&&f 9wC- SSS"``zz ZSSSާ%%%|r}%=nP*ET>x<Z"|c\\{j;Ok׮hYiubމ'BJ%111̷Ykhh ̝;ׯ&Ǐse>#.]hɓ?gҥK޽B||Lee%dee199o[nܸ!R8pܹCII /^__HII!-- ܹsZg?cll0"""8x \zbg9rqRSSQ*ݻ>UV 9|0UUU֒OCCgΜH ȑ#\tgϲpB9Bmm-̛7V+&hZ|"oZrp8݅it:mmm|GjV}*Chz;FEE`(|Mihh{kkk%%%>vŕ+WPDDDp jjjhoog(Jv;:Š4kR4ԔP`@ @RR u{%,ҢrT*9{,dddT*ZB\_Ӭzyr ^ ZZ}w8}4k׮%,,LKFFFFFFFFgI7ŋsmRZ444zIMMf"""|n%99A b픗P*_IE`˅"!!tʕ+dee0cattG ϕ:6l|-bll Zܹsٱc0z=>/P(f||NhW^Ar(,,d۶mdeeqQ]]+ !!8^/T*_u֡jbPT$%%L]]CCCO 222222222_5PW,]͛7V),,$&&~Xd SUUE]] ϟONNȋ\XXȂ p8b:`0(gE9u/?v:n\.6z B> u5p:###\v._笠y199`Ϟ=ܹs_~FƲh"q}Ӊȑ#\|W^y7xټy3\~0z|Gtuucǎ{% AĴƢ  Z^騨Xv;pW`zz^Oxx8KO]7|RJJJDWWx^nܸ?я((($ZZZhmmh4x.zrgzz!&''b|u dff+Ή'Xz5ϟgdd /ݻ^5 zkײb 9ϥ[hRɜ9s8{,[nE̿HRa DDDXjc|HHH6 HIIƷ4\.zzz8qx<q|xh ׹p###šjpn^{DܹCTT .D׳zj,X@xx8?<:tK/g\v3o޼{b9z((Jy7]VT|LNNOBB>}1::F! rRSSC}}=̙3[b Z-֭o>ZZZx爍~̤@ @gg'K/طo]]]8N9q0L&W\Seffr-ΝKFF8p@ @OOYYYDDD̈A%//ǃhd2aHMMEղb iiibn:~?s%`6Q*$&&RZZJOO[~f3III?^YYISSҥK̙3M6VDPsQPP@uu5fW_},JJJD^y^ҥK$$$pUbccimm% 200f#%%Kn'** LYY+V 772Ν˒%K8RٞHp`2fR!őK|3`v7eC0dpp$ 7*7np!~*@P"w)((K.7ttt022;w}'!QTŘUB1Ϟ{~sW^ =) -ԾHdtJFy(yd6fv}KHe}s6%~}еW-"<:2KDž~ mB1s;?~:=)gܯfo_amesJdع uv0!A{%xP(Gch;~E&{fcZIIIyb/ #r* jVy\5KFu'r)z=j,ry$ WP(p|>#########FP`X|;蒈XBB-| 1R MDHuqĠhJ]%.'\.ddddddddd>H4J=\5FXoQm4FzJrKn߆>6Eo222222222_$mA/v;I `ttMJJ ~|>ZDZ-qfxx@ @bb"\.'11Bl###x<bZZFp݌c>O\'))pVȕu%jԃx<bbbell A|| u婩)FFFP($''@@Y,&''h4bۅ{}pp`0^'11"v#""=zzz`|tDJVIJJBR>7LzFVc2t P(HLLDRt:`0`2(U__h$//iW}Z,Y%**Jx`0O `dd/$&&j4p066&`0bnFp~fpp+W>%CݎJ"!!$-- ׋V%))鑽U '33a칟@0.z=LOO |$''߷eddddddd$Ms'ի|477366Frr2.\?˗c49|0?غu+eee۷O(t:vɵkp:RfYqvl6 BR1ZѣG oMMM]~;իWinnf_F_ %%%X,~_0==V`0pD}ǜ9sAjj* {nV^ chhh\_ΥK(//1gϞgϲxbN8!7|gYlLNNhZ^/`8DZlB\:/zvEaa!X,tOe704իW9wոnF#o顶<\BCCv"55۷os)P({܌&''GtT*X,\xRIvvn'""˅vQ*8N<\.7$77V;x v&&&p3ƈ&"r\LNNxdcsfM2V+aaa:tK.QWWGFFwᣏ>I7y&R[[˕+Wϧn͛GWWnl6oMcc#H &m6X`0p-nܸzT*t:EV OUU ޽Hzzz`rU˪UEPjBfCxX,SQQ'++aq:NΝ;Gcc#/_:ٹs')))X,vMSSXܒں?5/?%C $v;~sarrrxgyٴi+V@`ضmzٰa]]] R\\Laa!7oO>L222Ƀo>JJJx8x ˗/G>R#HV%;;UVq /&::6֮]KDD-bΜ98qUVQXXHOO&9s0>>ٳgqݔT*illB)..fѢEѢtoߦq~?j>n߾͉'HMM ݎnɓ288ӧu6'>C xV\غu+,]K۷ٺu+| /"III9sFӧ),,$++y=7oʕ+,XQQQr x"*Zr Z˗/Çvsa0V.^H{{;uuuLLLxX,DEEw^뉊"557P288HXXgϞootttڵkYd Otj ޅ 9~8|{(J:::?RSSN###cF'?h.]DUULNNfΝF:D[[nݢFR$//ZZZزe .]bhhuֱ~ze˩P^^ٳg&11s5)**bʕLLLP__OLL ɜ>}())`0N[[7ndѢEdffƋ/ÇYjVx<n7;;Ɯ9s{GFFFFFFkg1Rfl477'0>>˗x8~8CRaYl f>1~?;v;wsibbb0ngjNGUUR4p vs y! Vo;Frr2l6233?j5o. Jʼn'(..&33S\ƍ<ͤTkgϒBQQZfٴip7rSSWq'O) xW'&&}{ܹsՊᠦEoFkI||< Yt)̙֭3~z=OEN__׮]#,,):DXXdee… 9w.\`|| EEEbWZ4l\|[n P#;;bV^MVV~JV\J"&&DGGW^}{)N̿ .]JTTjxùt^8,X0 ˤ4DGGX,Ft:Ly<@zl6v;> ez)axxRl6.:hjjBRIRR.$#?ZZZq3?8qgϲm6 @Ipo~CXXk֬!t:•+Wz*.4233psNz{{ٺu+*>Exa I睚o>پ}۹s'7n$11bv{a6yg]Nh4 wQ鿈r`0jTTT!QϘ %%%+O]wcɒ%Ӄ^?!4 "`ڵ\NǢEg>^bcc)))A׳j*.\HTT=;v /HAA. ϟAOMM.v!GArVT?~A__(:rSSST*999\r7n`ZgeŊDFFvZ<N>M LĉرVÇpYRR'!!7nIRIFFbjr)̙3GtJ1蓓Ů&55innXV֯_RJ*4/^ _AHLL$--P:ڰ8N/_8uuuzj&&&fʕjz{{$&&_~,&''fٲe,^XĠڵkjϟO? _8. |1w\j5Vt) bhnnfݺuv"++kF~sFnn.>8xmH?%AVO;2 d2ܹsYx=Xl麳~m(ݯ=dcEш9FC Ti7G|1v^(sأq(,yy> Nv|zx<|>g~1ԷS6 ;T~B_ql|bIrC/f';>>~S׷iNܿ-󒌌̷FӸ@hNJ" p8p:LeK ߚaB(z T(Bi MR"M.o)########( 8t'm(JJC!|龜T/8zZƱ4 zo~O峼=T}rrnj5!22KGGLNNb0Pո\.f3QQQl6:::fqtQ"##Xrh4Ӄ'""izDDDxeddNFattLxx=|Ν;  ff3jz bΝ;QTcX*}}}( z=tww c۷p`0l6&\&BUDww7$''?r{z<&''Q|ZK*SSSDFFT*Ej4 ]]]3>>.rwww311!ltvvx;:nثn W/I~]###1zCsb\.:Doo/YYYOmA, ጎru:y<&&&*p88Ǐ'>>jFs_7.}Ͻzv0h===BU><<Lww7FbddD_p8$ HXWWG0'[;wEQ(TTTVQӧOjijj"--n7'N ##7Jϙx8z(ofΜ9$yvwGv0d``Z-ZFWWx{^p8DFF000Ǿ墳SE01q(}}}c &.OOOl6wABR¡CHLL3u|I|7nW~yQ[[ˡCl6NMM n?dʕF8smFYYGAP`2'|3zaVXpx҄荍TVVR[[n'**wQ^^N~~>7oޤ> n޼IYY7n)~mzzz|dgg4kn}Djۉrah4XVy뭷yq)q80>n޼ɑ#GxPX,z^$jgYV|~b.<<ݎl륷˅`<99I0Rq)_)&1{jP(j[x)((@BMoo/.\`ŏRݭVpEZ[[Z$$$?^s̡'Or j5-ncXP( l602}[oEgg'---̝;Fxx]vxbt:X~= ++ ʙ3g}6ccc$%%;w 2H{RWWǵkz022ZFCuu5ȼyHLLdllax<ԟ%%%׿_QGG׮]ѣ;̝;]vq-jjjFf#22χbabbѣ!.. Q(J8@^^Z(Zn1FExĉ,_\tߴa.]*ƒ@ZȹsGa˖-Ff3^fOOoo/LOOv\c6}}}LOOq\`2pH'Nxx8fJ%AV+8ccc(JƘ`0`Zcۺ<:@NE%[$ݎ8L&Nv6;3lv';u'q4{Hn\({`+B(wH[v\%;yآx9s_9wL&tƵ5Q1>O2??Okk+Wb``k׮QTT|2---DGG“O>VTq췶RZZӧijjFFFx饗?O"|Izzzhhh //^|EX]]h4twwS\\O?Mgg' ٳgC?ett|y{1vETT/g۶m&B"\37ГqAxo'ȑ#ܹKwq  r&''!33߿nغu+IIIpq^yNy뭷P(;dgg*筮 _򗌍DyyM5У㩧bqq&f3ٳ^222Mrr2qqqoz_illz)Y__χ\.矧\ܽzG?bffRɛo$---$''K/122« 477p0R[[KJJ ={:.]"::TJkk+੧"--:ZZZϓb… ^`zz n[@|>6 HLL NK!%%tjkk\*< PZ-ow8ٳS\\\. \7Ժؽ{7`0kFee%))),RbyᇱX,8N^/l۶Gy\h4r"(644`6ٶm\p@ JEܑU(Jɓ#f3UUU;;8qrΝLOOownW("--t_Ç/^DTqرI._a'Pyy9ǎc޽466vEUp},rN8T* jQXX Jްpܜp QYYIQQǏGx(,,k׮zbccٺu+… x^T*mmmQUUWUFNm޽Ǟ={dtuuMtt4t:*++y嗙`zz;vP\\́&''|+vFGGY[[;)}>vHnxN jTVVTUUQVVFii)Ga֭|LF}}=O=h4ֆN#''+=ݻ}mk4- BABF*I$1իLNNښoEC{cm6Av!:vIuu5:۷i'( mpjeyy*4sssvFFF>6Jh4Ct:A pn7b޾fd ǒR`0`2HLL怜L+CvEYYgϞevvV<̙3z1l8&&1V+kkkB!ĝBl6Ν:III#Jx>>#G011o:w}Aݴۼ1=55Qfff{>(WI ɸ|(J% .8ɡVWWȑ#TUU޽{Y__7dff;3h1LNN"ɘŋjN:R7pzILLE\%$$022".r9iiiLLLPVVFbb"v:"1##V)aرbZZܹSKzebbb(..&''vF#YYYtuuP((..d2@bb"iiib*S688HYY,744rroqLLLPUUNǎ;eaa;шNq999AduuA8y]𳘚"%%}jȑ#fzzzdbxjv%j.w^RRRhjjBVsIrrrdrrSNrSSxx1=z,l}rn^O}}=yyy8p YZZ⮻"??M{{;f֭ dddс箻"//9q\|yv;d2q]!B>>IdeeEt^c }x<<qqq$ &iӘp<÷i"|~~4\.bdZQQM!B>ahNRdtƐ؛ƐOrVmT*233IOO'77KWy|oe;? fP($*% B+_ &(:kt)))d2Krr{rUĭ[M6,?D֭[Ű~בd|_%66VY5͗;!B~?xoG>;ˬ|Zٟ~~Y]]W~_>v+Jmޕ _'p[U3\Ǎn|a3 }Pmmp^mՂD"p}VV"|I?B/#q"DE"eF?zXfnC||2h4E"r!D䖆$=mmmSo"D!B<77~tڟylf3|[՗R"|v|Q͸N8L8 fgf"D'~fcpp\NTT`1fff0 ~z{{dyyh 1bbbuIbttT Un7|]b-fT*add@ `1 |>FFFFѠVŲ3ZVT hX__,: 7`aa^VXlttbbbľDݰZht h,Qcttc|>.*AVVV0 d2d2Z-v]gl0B0??h$088,QQQ3ߪ=k^\.n##|UܣXXX`qqшnvveiiIwfqqA\.FCoo/E,fjj }}}LOOc1 \zK.733C("::#1AxW0LܳzpzzzG&111k}9e0>O4>{Y\\dhhRyE;v^ Dsssd5׭oR_ bوamm{9233J\rӉlljj";;i&&&>?^Q3"*===b9:@KK o&* 4n󃨩#LOO366&~CkjjtjL&WPT6> c"De瓨OS)++ի2::*i.^Hyy9jz>==O?Mgg'X6Tr9ϟgllwy$ >,mmm8pjkk[?NRRXڵkĒc?XCZVsEǹpK[o3ϰo>$x;Cvv6CCCP[[D"`0I{{;ϟg011)//'**j>??/֟ X,]X&''Y\\P(cqqAaii @ww7?k/..o2k477c0 .\@~~>O>$ a07`hh)ڵkܹL2CYd2. Zgee Zkkkbhaa%9{,.]"77RĄp\p8t_/2 ^x477OOOMMMɎ;Dkxx^jjjBv~iZ-111_}UF#111ttto-[W.KS^G.PVjbT*9{,Z`0`s1==$*{'N`2`ppaZp痿%ssstuuusgΜڵkttt6bxǘMezUhmm%%%7:t?***/"---eI7t::ܿo駟XvMMM߿ifggpvQzy&&&PTaQThZx'477?ۙ#X,>KWW뤧p8hhh`֭"D;'1?Ѷm8|Kqq1۶mǹ{v*$ "u @RInn.7ԩS?wT*%%%{シb]o~X,_N<;;KOOEEEAT*2 ׋Rh4կ~~\.`V(Aܕ^uZ-<@?'sAx W}Y222HNNGt-uߑ& Ll&==)<gϞd2o|Zc4ZLOO300 FT$%%q}ݒfܹ֭_]4&r9yyy3 ntR__ω'<?~\qqCnRN^z%lB(w`hhhSJ~~>6 /p::t˗/055LLLPXXf{jRx&  %..MEEELMM1==`09MwXΘn ̃>/Lll,2VWW9p[nett={``vvTO.\T*,.lyIIIA""s=<3Đ̙3 ;sΠG}˿e`cc#Xz!^bpynJ0D&[os"D! uKl{ ϳJ0Djkkٽ{7kdggf|;<~(u7|Ȏ;*R^yN<).|7Sx+JY\\$33}{dgg_Uoعs'ǎXYY̙37k(W^!77bR)׮]cqqcǎwDٵkprĝ0 h{ٲe iii<ΊƎ;xᇉSHHH@&Nss3񔗗sN\E&{˕r9r]wp\477#BbmoÁ\.)`,nĺ_$Z-ZVɡ*++{"555d2|>:t{266FFFUUUo H$عs'շL,wAؿ?KKKdeemP(nCߓk~?oa]vDqq1UUU( z{{| hii {nرc>(h4N:=CKK ۶mӧOp8HKKBz{{׾m݆R@ @cc#kkkbj\.&QTb{|TVzoVIvAZZ[lRsfXP&xhmmRA{{;> > 111Cg۩… ;w@ @nn.z^/ַW;T*hP(Hͱj7T/444k.)))aݨjgǎ#ˑH$PWWB[BoPRRL&c|_gll|>YXX >>bكVȑ#<# vZs=z9rSSS֊W"DfVf~~n7999:t֭[cddAyy9~D6Q^ĉnw]ߏjeyyOܸ{Z ؙ -Z< 6V aŃT*,,,;CCCXVާ<;; Vsصk p%~iv-4Cffxe*++߷\RDPB$}}}8N$ * BA}}=dffJHjj*Fr[O~***0,,,V9q~ v;~;IIIΒECC $''t:!Y__ EOONagjjsmc6ߎn… TUUQ[[餠m۶QXX믿fjǡCF"1$##Hee%ǏG./T8§' 8t.]!J;M* 1<>& b4q8 033lb066f3<BӱNjv;]]]fm& eggVYXX@pw`hjj"55'OߚRT*QVVFqq1}}}d2p NaanwF">ap}]xn"D!mqD>7NY]]~?\gt_>qk'l뺙*R};ᝲaA9>C/V!B"DؚN>Š7;vx>uk"QQQY!䖆7 qfG!B"D?vuoE{˛Ex|s .D#n+y"D!B'>ɚCUm`bb(annшRr100@||>f#&&cMP|###﫝a1??"E7*6.A.3>>."GGGLgg'byfff8To*:s5v(uX[[ӤΖuۨa,,,ߧA- ߏbAVcW֘ally>V:Ggg'===Զ`0?OBB& ϙ3g0CGG8}P(G~o F2VuSѱi>cjj Ʉ\.KXo+++tvvfww7L&d2### EUN$f!B"||>CCC׿&PVV˗9<+++(SSS<۷^3>.nX,b1soyy*8T*o&|>aq:z2;;_"SSSg}~YZZjp80x<|>* n?cx<\Baa!6 Vj% 233<=ttt޽{fll3gpal6CCCu.  n7}}}1==Mww7:L=`˗/̙3g0ڵ (t:F*xg泥BAzzxB7#Zb?zv;DxWX\\dddLVVVPx~㡦b^x&''ijj"&&az-y?9nzx'XXX4]FCCCCC yꩧp8ttt?ʕ+DG!B_R>s=)) M0z 8SO=Ç)//r!H8z(팏#Jٻw/V1t:999 xxGyg(((l6o2cbbtLNNo߾ aCUROII mmmflقdbpp}a4)//d2Q__޽{),,b`6djj&T*EEET*ۉ"99 JKKʢJn?V^Ovv6111BUU&" '??;wR^^$>Om=::Jnn.۶mCr5&''9tb% ?l100 . }}}^uVVVx饗C044Dww7ӨT*())fggzRR077Gqq10999y$;wcǎ c}}C} h:::xjDEE/B[[mmmrPT;~z9ۑkLLL033vBII uuu0>> ;wlžz*JTT ( DBKK ZZ[[fJx:;;IKK㥗^* b]iVO?ҒX=\ FgTΝ;"vn7)))?F.C(faXDa[[ ٟ׮]CD__PRRdbxxSNq5VWW9p,,,Ftww7\x\Ξ=RV3<#:555jjkk??… bAףP(8s ^6:8ԐιshM??Akk+ΝnsYAŋSSSCrr2.gse222hhh@Պ3gѣsi1( 1??=ZZZDgן韊sGa׮];wN wŋ!, pe{|KP\\ \r? TUU˃>HEE.kwlBvv6{/x<B]]]ر|@  99'N`4|Nll,%%%TVVRWW'㏏rEjTJ{{;w}x<VWWA*ell5BjT*X,//Gy8^-mӍ!&&EJ%Ν;duuUtYZZ`0gbb\ΡCb~A]رcǦI% QVVƉ'Dll,wqEEE ͩS8y$St J  墭fAbXP(vm߿/eNsyYPP<?0{A"AUU999t:?Nyy9mmml۶={ ( R)rBy')((v"!!AtzijjbbАp \.n}kG}uJ%<㌌E^^۷ogzz"򕯐N0fffDRDR`0Hnn.GA׳{n.Z-=Ѹnrssٿ?LN:%;:uj|ÎRSSyۑrR) ׋D"A&T*Eї|">O<\."JJ(Jq? Z->K+FCT*~"D!BȇNifffp:w^ ;v ..!VWW)++c}}L&''bT*L&'>>Rq7h#^IZqO>$bΥjevv7:$Iv;vƘdii%J5e|il66 ǃZF1LsrrO~(--oϲuVqL\\\.Z[[bx6Yqa^IRљ IJJbxx61SP ɸvdggd8Nfggd2QVVƝwyËO~BII T*{*TUU"rӱtvv!u:ZZZp8b1;;0kA@ղw^n7555ܹ ),,HL? &>>\D"a}}Jjeyy\L&;v \*q!yyyye22L{](,,d۶m133C(l6BJJ 'N`֭#GvB{{;_J11Vh4ׇ j1=nL__IIILOOoo,..RSS qm1<< n6ѰbE"PXX2.]"##(R)1112<fݻwEvv6B344"\|Q/l6se)**btt+Wl귰H"VEL&t211Ass3˘L&zzz6yyyS[[KLL IO}}=IIIl6jjjX\\d֭hZ\Bgg'%%%SWW˗IJJŋzTVV"Jr F]] deeex"*R</^bl"D&!cccX,d2111hZt}t:v;dddhL<---t:N:B=܃l6-..ݍZF.sQ*,--a6VPTDEE$ TWW}vөFpbLNNRlJnǏG*R__B@ETlf X]]EVʊb||*oߎL&$P(瑐 Gee&p88r&4L&. l6wł عs'Avɞ={0b6j 뮻477t:;p;\j+>ߵ5AJgsùC@SS;wnطoh$u#:##IVWWd2NCS\\P)))$$$`6ߗ10(JB 1 T*qr9ǏgnnmFYYrlzۋRDp/MY!2DHJJbhhӉhX,Bt:L&Gf0hD188ÇINNfmm_죰#\t $%%RPT\.rrrزe [lahhJKKIKKP(DNN(fV]]M^^}}}XV;FQQ2$X[[cii***t\.yfhh=Jgg'PHJ RRRJ⼦jIMMǏj^^^AIMMpt:뮻|$%%qIv;300)++#==~2339p٢ߝwIVV(Vy1 HJJRvMvv(z XVNn7 'DqQt:p[D׿@~n17{cfQK"|E8N"D!B[mkZvBEIII7O q2sB܁[)~m!"D!B~;/="E8i?ʹ>k >-c(˂~}QfQkcAxEm*!B_v>TjԄBewvv2<\.l$$$o7ԙX__'!!AT}6^xd2!(q7}"D!B'QqP}||gy@ @yy9ϟKGGϳK/āj~ Њ j&=СC6YvNzKtrAaqq .}vyILLk_|γ>+‘崶rx)--/###bmgAhllc߾}HRZZZX]]ٳddd0;;< x<Ҙchh+WpA&''Y\\W^ѸcccH ^T*X,>b{jj Dgg'=zX,|Ge>00bł`={\x r9h4vVix"d/뙙ʕ+(J Zafff'$##JEtt4nQ, R~ yDGG344bA"lZІ$ SN"ӟAjj&g~E-#:^|EHKKkONN266v388hD.300( V ֠ߨOF*"x^tMuu5on]DZ!t?zzzdppd~_N||< ,..K[[j3gYqfNz) HLLdnnūFFFF0 RIMM EEEQ[[Kbb. dhhJ%> :zM&^.fffdֲsN&''91\txx:JKK1LAyHR,~Wv# ىNٳFx'p H8s jg 79AСC<<ڵ_x^\.o?3.\ȑ#R>B"|l>5lطo811A^^۶m}x";w$99&Byyy\pbccbzzDoq***6]7##cǎoΐJ /)g|| n݊ T*d2ccc$$$ r t:h(©Shmm Cww7~={_U8z(:th hll6Ώc򘙙Ac4#;;)VVV!))z//DEEaZbxxt~s133Zf``7mp߈[m6Μ9ܜXY.;>F{(K4*xx"j -Hqo|;$AVVc0wyzӧO˗{g7]2^{5JKKl8tB!^o$ebmm9w_Y__r8wzd$III466OWW[\t \9(A?mmmHRH$l߾ߏT*Lg>A,//cZ|2w1,..255EEE/_fhh\ҒnZ,1闿%Aff&G f1,--!ɸioo޽{z*׮]#!!nL&b`0H}}=8^}UL&KKKXV<%%%=zW^y.LREy@ 3gHKKcǎ7<4 pz*J,p4DTTNy*rz)Ŕ-B!R$ J9~8mmmXVq9@ R BwA}}=KKKߐB8 wM^^eee;vY:::{ajj&bs"bL(B&A*r!x 46#D!B6QY^^l6}v v">>|>*--ymۆcttNGQQ333x^222w]LNN~=\v<^djjhZ4 c(**"⮸Ncmmaee$`bbYFGGY^^`0 244%##ks=Gqq1&IIIt9S N Bܱ]iiiS__ʊ8dba}}BngbbBL&%%%q4ի,bIrr2o6 BJJ "gÁ7eB!hll$''Fgll1\.&Ttp8f4s- V2j5CCC(JT*LMM188@k׮GEEEbdwArr2;v 662vڅ\.7dhhdeeB{{;*?66FQQqqq\zN/v BDgg'H$VVVaffYv;;wdxxzZ сn p{e\|Z.^H?:~ϾOo}}]tTUU(++cuu_~s1;;Kee%@ʸz* ^z%yعs'r|ӼPQQj7_fuu2p5~f3<3466oc{)M}}=Ffggj@NN9rM?33f#77y|MQ9ryg||M!B"|^|hhZL&ZV9uMnn.)))jJKK)++#??;v#l8q|رcFGG2W{1{vv^ 11DB?qqq(CTFFFcccT*IMMeTTTCUUBNBaj\.1/** =zDB{{;LFbb". Nl6Zfmm(x>KTTP(p:8p"III7{yHL&c}}TʶmPՌ{nHMMeddDqnR8y$ ׇԩSNr8= \.1GR&ObuuNBd2F!==$F&aӄ0L&jK2,bccIKK 0T1XՒ )dgg`~6标X xh4䐞dAJJ 111L&J\\a6tlٲ ***())Aѐ4߿)++󑖖Fbb"qqqzzL&YYYsc˖-ݻLl62[G?Ǐ/~c(--1>>dBQVVNczz#GI__h#QTVV"@戋#66$ w}73>>Nee%;vL֘!%%drssettBKnn.VIVV)))>|Kll,)))lٲ\ʊy+> 1Ldff2>>%//xl6h4nvn7޽ݻw. d2󉋋m۶ߓ.D"AՒOee%:h )))b뮻"**tILL[bÇ9`0 p=N###f3[l!>>l***x<OffoYrr2Fv):ݏ?NQQPAYY155E0$33M&KSSSvmv9ufYLx77w[֛VAF#GEVߒ.fŋC2228p@$L;B"DX,qban('B7D »ᔟ4 ^?I-TDr>-GEqAot PSt8E}=nCʻBqrT_tnָ]@eYwCoC"DM?.3eR) <12ZF @BA`^~AȈµrP@fT@@#[" y/ FO1N>…jzY #)2XVK #3DLJ%zsFw:B"D@VmV7@J$9]g yz=禧?A$MIafn%-A8ʈŰnA ':BSSk;<*lR)_I/7@HV33g"D!BCÜ>T pimpm=|cI7 ޟF &z1o}J7?x{ȤR@Zqsƭ~9xT0^Dq~7|<Q$sm"D!BPl iF#f3=lrW*i!(TPj`_[#Nlz(DqBYF#KKXv˩X`wP!4`%f3F#.ssjv$'v>7NdkR:yfN1haau$4r9Ut!{Qd ./3LEb" Z-C -/ǖC!p|lKK#J.BP(MH -:qEҍFJq|4Ѱ+5D~jxt:v 7὎wGH\Tצo l\o7JE^'w|If3`YV}>$&n002ef35ZggILIA!0=B*eoZYA6`~V7rm<·wJIa@.v" GFC Ie2R)f3@6 0'6¸8q BT$%ah5) FC"c++vU*RRpF5"D!Bn1jeE+boz:ܖ޴4Z^^T""Hx\L*bCUQ ےxTB*E)hYf328I#[|MhHxII(e2㹿DQƤ`Tw۶W*h8UP@I|h/Ɍ!hhv6NOBYE![-w03X^/`LFVˣeej2Iz=oSYE&p #yyAֈj9L*EooJѸ%ؓAUZ&jq8^dR)RSٛJEer2I7ٓɁ,*Eu5Jv/3-R7߈YE-Sȃd-[?$+&oUV9CUj*Gsrؙr}aT1֭(nd2vr8'T8R)X2Fnͥ,1)&YYT&'('Z"` `D"۷sI Z-A8&+&KOpVZ-޺P&#p 3r I++hH"J.mߎiCDR&CL& -[18ᬬȳ!B"D|5";?OԔͤiv$'ɸ61yf9TCKK ¬Ւi4ղsndE}Ƅuû/i4b!a\>29GGH$N^mvD[,.,\A 76dY$Z @ bLJt4v:9IP6uŠRQQ n7RO !.[_G"8=ͫ,(Rln7cc\ǵ yD-Jw۶QϩRRBVL QΔvq83hWUEğ؁V@)W*)bC! 'ؙJ^l,2|7ssׇnG. 𯯣WXX p|hJd Pr7ympxVWMO}H;!A"1{Kr*( h@F22 :*lӱ͑,vÿ۶oTTW؛N@g3Y_cncd2QQHI$?YP29A=d [fyXT+}}4MOW¸8mݾcAVȍ^LLPf6G}"D!-mk#Qb ȕJvQ75EF]$GGf4hANR&B'tɨV(xYq)ù,; xUoӿKe2(.&$GEä\{w֤-92”y 熇Wq׻n6]ЫT|k ,."J9QPL*aHŰ{$n~B< .HXZ[a\ZaU*r9PK,gXzw?asy| PcfchqIIU*2*[23I^b54 8v⣢yz(^ 6=(NLdoz:twQ0F))¸8r:8Mq|< V+QQdĠ邀IakR*w#F''ٙw}d u.,QCJ$4 H؞,ލlXtk\*"<Ʈ;7̏ `b^`ymM<1l7S- D!B"D<`]H) .gaU n7$  SSrj5 ^x 剉d l1Q- ^u{ٝEEL9s?1(;v#%yJEJEyb"YF#&11[L)C^l,%f3QQ4]_'F!Z"I21҄VPվ}h4~ ;RR1ȎakR,zKKRQwPdT  LFIZ퓛 P;9~LFӵkn&``GJ W3y5*fO$^xLF8EsϚHTPRywHp8AYGss\[]EDDDDDDD0_-DBgpu:tB )LNrur`8diMc }ӻʴISE$`&+HP$BJEJŤ+X(W&' ZA/LH V תK ILdD K,d #< }++ ZnlйL$h$ry|we2~?j%L7B)Ȕz%czJ$}>4r9O~?2 o0&O<RLDss ~_l0`Yq,{<=~?-f].V<Qd$k$TNMvcܼ&O0H v;Z;B׋K"Y¤V3vcPQzVWqd$$ey$``#JT^+J6|>T2H$#\_Lʤ$\.TY779;;tNL$A~v{ "&LAxQꦧr8N'K}>܏??tLj5IJ%SP%9Y%-V^6? ϐ~rbQdBr.I$Tr9 ndo 5VVmkv;FY;鈈|;19L~n@ L&CsO vd==X?S}J \ wAly{DY\+y~[>Y5>Ěr9R]#]R9yB>2j{Lc$k4Z9߻~y\r+"""""""" wIIHύݠRQPXۿ&]fh}&͆VE=O򵵵&>$''|Bc+++?CoM|>7^DDDDDDDDD;LY/CB>-%'" c@4rr#"""""""""/p (JRRR|466OJJ Pk׮(h4VWWy&yyyH$illD.T*y&hZc(BsLdBPT*顱EFFvZN'YYYnnݺEoo/H?n"99$''|2}}}D"F#---F1͂Kb2P(ܹs!rrr蠥OZZ444bamm+WYYYtvvJ l6#J~+zt݌eut:hhh`zzɄJf"0A0A׭-&!!E x^z}.&H$VVVߴcXHNNֶ1L&hBpV zߘG"$&&>拈| \.h:equ06jkk% ;`ڵkaBgϞ7dkkV.\V[!~p88}4$z(vHuu5DQOFx^"7xM ͛w]o~<477dEBBo6@SSj |>.\" xHJJ?dtt˅`O>^OQQ@IT*j5o7np-FFFr h4455qu:::p8477smq5558Nz{{ۿ[pܹs:N8Nj5SSS={iHNNLMM;RhllW222"gϞw.(DΝ;\rY vdzzz|2hz'd*;v`߾}o}}tyzzz޽\΁0ʹ`0رcX۷ocZcffL^{5 Q( q!~򓟰ATɓ'9|0:Ll^@TŰX,k ˑd߿R]cccl6O,CӡRhoogllD^yvލBfM4L8Z[[Zt:^|ERRRFhZN:Qr˩S0d2ٷop'ObxxX$K$=s1ttt((oӼHR ;w\^'))jX^^̙3OZvygxW1r JyJ% Fj8u*f~\.ꯃD"W k555LOOs-ywܼڿo餹&V+?N>M0Ez=F=e2j4imm% RUUE8`0`2qMMM8N}|>UUU-axxGn7/^ghh ~ӟY[[{MyL|/?P(D[[Gns%fgg!p?vgQR)hT~]ikk3gPYY޽{{q]ƿWJPv% h4ʹsB,..266FNNWOS._`mm?_LگW233O??OII p/"yWZ̰~f3?*++YYYX,Fjj*NRN8% Jb׮]KL&(>|`06qz=ߏ e4Q__fY]]%D"aii ͆hDaيF<~3Oa| nruFFF8vGeuum(jLyyrP(̤bhH$` 33rY[[ckk +FV;z2331]`M IOOGRjErϳk. q8ra 傗A,rJB8T*XѨP`0P(h4\x^!g*YYY t:z{{y(,,f 8y6RIII HR, zǏSRRBL |Xb1$ X,T*2 q@|B؉\.G~i$Ff]!#H0ܯtH$XKH$@o!e#7[ewoKN`0K=|FXN" qrwI>V B#[DB0iX R]?˷ ]܁vq.wqԮ‘H䉻a!w]DDDDDDDj_D7^I8~yQ<<+B|&aq\lmmaq{c}~S!z_H/_χlcFXc:::\N?!J~Q,dee=xKY,'-D133õk'55ZMSSo& YSS2~jjj ##`0HMM (J~oj\.999^$W\aΝYӝN'X,z{{|_D?zw{_xKvv}essNǝ;wV rex홙yj5555l6fggsz*Ѩ]%ZX,Bb… EVVNֲF… 233b Q[[!##Vn޼bAqMimmE"'PFh4055ŕ+Wp:dff F52Irr2.^rssV9.^Ν;|v#33<ct>T([uXXX`uuJMM @rXsfffڞLh,7Ftwws tR]]*njjjDP`2ի$'' </_&110555\.hiix<, \xD"T|ARSSү 񿯮bXʕ+tttmsY^^&##LF{{;H$j5ׯ_}ۻ曬p80_KZ[[QT߸j8555LOO!$W`ǎB!n߾Mcc#~LffftX s'FIMMeaak׮177GVVxZ,\..\`ccC9!}'hIDATX&''vkkks}0 LMMQSS|>a?OAA\|Jvv6\vIL&:nrܹC  ##C3#":YܿPAw:444 صk͑ٿ?:X,Fmm-'OD&;'jkk)--%--677qTWWsaT*60ǏJpoYEa6裏Ǐrpr.\p\O4ڵkٳCmm-?<999d2V+;w2E|%^/6KKKTWWs KKK$''sE, HFC__V;wX__^z ~;xQ(Be2mmm133&zr9p͛7jhiiajjh4J[[㷿-zd2=w{d2sss c4裏x8<>}rqFsNX__ڵk m ---aXÕGM*ovzIJJIxwIMMETb0X]]ABmmm|>֭[|>RSSilldttLl 8hhh`nnthiiaffӧO@vvp%r{VXYY!!!Ekk+KKK?~,P֯>\.^ܹsyF#`PAR)oi<r222tvL666ɓ,,,D$d2Ν;`kkҜ/^СC瓔MMMBff&pax뭷((( ##အDX&''S__Ojj*466CRRCCCܺur.]Daa!o6455 裏e߾}c6B"(Ӥ}6|>B!f0&---tuuH$ܾ} B. ߏxp$''CCC[Vlmz{{;^ &''_Lss3###$''w~Z-$$$0;;K(j5r***@1??/% Ez{{Dף멩jR__OYYuuu3;;Nctt@ Q*,--Fyy9pàr95In7fuRRR`ttD"$&&LGGna^BH}}= tzzz_Bŋ۷-jjj0 z;wFIOOd2I4bno>8s %%%c4Y\\O>a׮]xH$\zF#pPTToAYYdggVRns%JKK2. R _rr2mmmtvv r{{nΞ=&''En޼#))N +++p8HNNfxx~?7ovIKKFf#c @.Jbxxy˙_~p8 IIITUUQZZL&8@GGl&//'11,DQP(deeǏjBff&v&''-"]]],..w^j5P=[oEzz:}}}!N'99瓑!)F#1EEEz ""hp:_YABBv)\.F#(--% ~L&MMMRRRB, ###t:#!!'C6<pY~0f,bFQSWWGnn.)))dee= np8,L&t yn7W\0Oftt .`Xp89s{{ϳ/27$`4 ##D^^FLf3f$R) |,77nf'T*eccVKRRtttᅬ^jDHOOg߾}E9fff$rrssl6 kkMM D"N>jEPTT b1^~evp}HFFŨgvvsΝ;\|Irrrj$''㡱FZ[[QռLOOGD]]󴷷{N,c}}+Wd2, 00087oޤM~ߠR|2}}}{j^J__}@`T*.~˗qݨT*R)>˙3gXYYfqiZ-/_W f``:FGG={JN+BFF󬮮\r@ /"b||\hooo//_Fl{_p|YL&7n`xxxhZ>#OO… DQ:ݻh4j9x h4dԩSX,Z-JrJJJb9x R~o%@vv6{$,--1>>Noo/Rnd~~AJJ 8uꔰyWdzz,d2؈jeddL&'NhR^EXywD"+<'vӧOhgiff͛D"{=T*CCC4552/^joRΝ;9sF8Ν;'gϞfsN9N~>Lbb"h^mOP(aϞ=j B`qqNV+mmm0FCVH$2::mmm!HgX,N'333V)//qd2NW^yg}!q݂@?333) N8!|C"|eO/A*~W @N=f-&''@"pAO7ot:ٱc?g4 6 g޽ٳ灃488ȍ7?s"L$ 4CCCdee/tٳg?C W^//),,FT*ڰ|K/DQQ`*z=/2,,,pFFFܱ19b6y)++#GqRy***8v&X,F^^0<<SSShZwdd *Ž<"HD̰FAAXVr9`p8,Ν;O?ŶşcZǩ|"b/"hٳL6ZrA8z(Q)`6yRq8477 ֢|ecc)v-Xs ER8x ǏDسg5l6#HbdeeqqcccA666D^Ozz: P*H$0PTJYYvî]0LdffRPPlLNNYYYdff pɟ /h4ܸqe8Ç1 _immehhLƋ/Ȯ]0>;vmFNNF!x33CYYǏgssCQQCvIJJb?禸_|ٌf#77={EZZ( b{ÇѣG1;;jZCNcr_RTp9d``u=>?9`0xhkk##Hdĕ2S^^.xjo?+CPH$bannD륹>4k!.c`!{y0];>2LL&`28p*jߵZ-:^/x㔔pn߾y&r-=x{\.SSSB477se)..dmmk׮Q[[Kbb"EEEt:jkkܻote󪻻aq\~z{{9r=f$(i& B!(;LLLk׮m}bL&~?7n`bbBP(عs'uuu\vUj5nR)SUUEjjuCDJfŋ=9?5\hnnܮ?YˣFΝ;vq/ s!pJnn.JH$BYY/~! TTTkIqq1 C4%pM>c, cbov:;;wЀarrs XLxb瓐 (9@*nVK87pڶO;A ;vb(Jp V+1==͑#Gx<\rEwdtt&\.W^NP((((@*Ǝ;v8vkkkՑjW{f'T$!$ 6 OEE`-Fbw~gPT%< ΒT*exx-,aˬ9%`h4hZ:::h|!c~ݻw3??,2gyFHb777Grr2pXK@P-(wwpzLOOLEE.N'2FFFz( *++Y[[cii DB^^EEE͑-N󱲲Bnn.2 &" QR z`0HJJ ]]],--M~~>BL^'77qB%%%LLLt:)((x`GM\SSSByy9,--Caa!a0 PݻwfBPfmyyex~r9jo56="͡qdgg 1p ~1 qaat\.hZJKKY]]r)="(ӬM^^ccc~, (Jh4B!222p: $|ZC$Xuܤ_cZauuUpdggߏ^9am1 aRRR'//OȓwO333֭g  cccDQ &!"YVA+$+..fff`hhe {A233CQQ2H$kkk䐑!oy\Awn&`P zB|㡢-(((TNLLAyy9Jnn. $''?0kkk沸(X ISSStAj5jZ5XXXh(++j\.( RGGG (Ja IRSSTRQQbnnJEVV} SXX(弼<Ҙ!<׈g0??dl6 ijl6^ʫ*$gff0066F8p>vy2-k4WA?Bq_I0$ Ok$DH<So"'C8& >Dx=$;{7C`Jڣ[Eۈ(""} #jϞ=B!xP*lmm=;)X R M1˗\ QDmr B'Iy."XoVDDDDDDD䇃۷OEFj/Z>3v>kaN'~M J rp8>w=F8N$"""""""}*.q//}gii5Gw]p|m|Z;l}gpݔᩍ￯B(" >rE=DccchZK,)=MLL`XXwP!% ,--QQQ!Zx2}_z{E0dhh;v|}DDDDDDD~D"u:BX,&]%e/InGV eu{<wkE<)}XL(#ɞ:xutTzT}>ldiqBqgV\Jڞ]" J>o+BII~ME~Ĺbu[w\|B!'x?>UУ(8Ѩ ?hǃj~ z4%{nn7:NʺqnEDDDDDDDDDDDX,F$A.K/q Y]&q10Hd _TDDDDDDDDDDDDD~DQ222HOOo~o{YTн^p8>P(&I#dkkH$"Yp[V7WmnnR2kpNNw_ ,4""""""""""""""""""""""""""""""1XDDDDDDDDDDDDD)@TEDDDDDDDDDDDDDJewd%tEXtdate:create2019-01-17T15:20:20-05:00AQ%tEXtdate:modify2019-01-17T15:20:20-05:00s+IENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-plot-task-measure-preempt.png000066400000000000000000006102261414302661500320140ustar00rootroot00000000000000PNG  IHDR 6wgAMA a cHRMz&u0`:pQ<bKGDtIME 8 [OIDATxw}{"  f ˢ$'> -}lg[eS:HuD9 H"X`,6as1;]`X  ݞٙvUW7x]#B!B\ahhq*D !B!ٶMss etqYg P(øhT!B!m$qx]=i FW@ Ϯ4鮳B!B1m>^ʛ"R\C0b(2z iB4(ť3̝`gzB!>_ Dk0J:%avFUS'M)RO~3[<^W<2FקIsNNTLy|#JL\t q4mc#G5Іaa/q80Ǔ^'=> QqC!m466PZZi4551cLH=׈R[*( ۷ogժUhl<墾p8Yf5.k4@MZɇA{{qhZ8,Z59zsΥ DZigs'glZǣRQQqRySoY6==]T@<>GaٲŲ,:::q\dee5ljhD ̛7/HkD"Aoo8Ν;?>YYYC!YD>#D)E8& "77}^ʴ,`0Ȃ 1M4ٿ?x;..P(ƶtJk_URVM~7# xpB1J) gi<45+`pp|>JA{qB 1<(7t3nncCʕ+9r0/2O>krrr|>n7455a&vl?Nff.^x<~v͛)**fhh`0ȑ#aȑ=LEyymsQb8YYYD"aY~=6l`-n yɧX5exx!45#!3348~cyQJqh##Ŗ9ahh%KHoo/ ~LN']_~:;;6EEOnn7pC4X.\W_Muu5]]]?~0y8v ?3-ZHmm-xgd$wg]_P Oyy9n_~gy+WOO?ytttPWWGkk+<s?!>),,/vY zzz9rx||tvv1wؾcb~|>`Ϟaih8ȶm1 3gԄm;ڵf͚o͑#GYb9gf˖;vz!JJJ[ٱc!q_ꫯ4}|{Ck8tS3fPRR¶mͣټy zt !8+Fc$?۴N ,vر& ,N]$lHRpYfH?JӣFpK/YfG%`؎C<#OEIXO|uAuu| //_0 FFFظ}{o#wW_8,]$~466rw0{.Z:::Yx1{G4M-~zJKJ^|%,"g^"XF9P[[mD"R,X0:~w~3fGAb1f_H?a_@<Lq9M,0 i&dl F\!$֘wv}ϟOff&yy\FNN6bRgvq)++%''˲ӟO[l&''L,a$xo6J)rrrH$ضM^^99$q*++7o?8?>yyy|>rss0WTcYtcY6bQ}"( cn7yyytwwaYdggŪUddC)EYY)9'CY|9uuuض[oҥK7n4Yt)-СClذ^@z㨮&''>K/]ehovjjjxͷx'  .`z^}UU/Hkk-f۶8p ҂4 ֯zs6 !bӣu-+mzgff86]]a~>۶N'uO%Kq\oߞ3)J)lqz?N _kM(~>ŋI8`~;+e&-ƶ'~ʒeքB|"Z'"֭kנK/e޼XE] ͛KUU%Iqq1 . yYl8̙33gUUKO6<$p饗rmedf̘cٲe\y3f`YTUUa ,䮻lx̃`dx" ={˖-p8­ʕRXX…())f1w\.]BUU%mQWWG(3fPPP a9!.]mJ?puױfjkkq=,\˗cyX%KYd +Wb֬TpB*+TUUQSS (**ϲeXj%k֬o?… Yjbɒ|^ Y`>8+`Ŋ={6_%KP]]룬7|5k0gll۞Bm?ށ0Ԙ `!SO= F[[==<oz{ `歵۶̤8X@a$'U;v~mmp}rwFaf9? !br\h]<5:K;jYZqqbOӶt>eafT>eY(0M۶tzzz|t8lQfa`' >Qnj⚱{,Y^v;Ü9s8RB!~i}Y֯_ϑ#G())!???]TlrO?ҥt J)y駩'?J)yjjj|B!B)=J)6^}F 9r 6`6W^y%sΝG])EWW+W0 z-rssQJ?m۬^͛7300… 瞣k IM_VVοۿl2LӤ_|p8_ygD)Ecc#\SZ{ywٷo {!''n 0?O[.B! ] `<#ٳnӁ3k۶y7/~AOOMMMA Xh_җ9ruuu=zn& N|*صk< ,Hn`|r ̟?o}[|_8XLrrrҽ͆a[ᩧN麅a<nbmS[[7̮]xO8rwrwSRRB<'Yp!uuu ". ׋&JB!B\&H}>Aff&YYYdgg-܂8tvvOjˣBn7yyyx^ϧgyEQQQA[[[>//&##rrss1M@ @NNW'x+VPWWG"_L߯;mꞗm\r%Az!fΜɺu'? YYY,Z|9pmSXXx0MrJJJ(..ZZ:;;!##c:Mu `###ݢ(*#kDN=V@hFvFx^ eY$ ~q]wQZZJVVgB!Bq>MÉ!8f].t4 <6{NIʘ N~;'*K)E"`۶m,ZL.B!9+E(5~j5!B!7W4:!B!_x鮃B!Bg{B!B!8W !B! ЅB!B B!B!5,6ZB!B!>.=сuAU3g&eee] !B!FJtO8>xOLe% 222Ck._k=a_*5 qS*Tc'+LudumD΢lLeNKmR?9TNT;@s⹱ەR(>MB!Bq;m>Rnw9{3sqR8FkMFFF:h},irZ0 &//\bǏ MOOH2<顸x<DZm$QZZJ Hqn?:0< ϧ~[rW xxXjYYYm$ lNbpP %{໻ \dP'dl`Y`0<RvA_aC^ft (F2X`7;wx}UU&=Q rs5̙C(G)1'Fddd7]8RRy٭p~ /xtv ("Ů]&6_Z Q˥3g::-[\h-~h22lb6c z5Kظ\F>2ո08x 7O 499E<YYĩņdPY,Le-o_4FNUB> e?LlB!B ŤQ0|<tuufkx<Ӳ,\.q++4M~?0<!K.;f8PBRɑ#uuEEL3)(Ф_(h %B|!v#jGYZo/6\GiF)N @.H  b;6 %B!2=J)FFF"774gضM7݄֚|x^Ld8p4Y|9f``jn7g H+>p8qcǎQ[[Kww7o###dgg ٳgXAjkkywhiia`` p׳b k_;˲ظq#Zk:::1cw裂z>C"~;J){9H$Xq裏ꫯflݺ5=ik _~.Bg{jTP^DɠlZ[ 26X備3|>1ZQ^dM(hj2YbhȠYٔ$пHDi6[gxΝ&6W[j>EQk-vt1l&F~dAv*dKp.B!3:"f?s B!BL/׹gqh'B!B\d,!B! B!Bq]!B!H.B!B\N;IXRl5>y~ub(a$+?wN.8sBDž >/T!Ǥ֚`0H8N9eYAĹW"++ 0X윿'++P(D(:oǟ}:`8筍333SJPcA64nii3fj_@k墸D"L .l0pZX)fxx >B!5a"cYeee%ȊFw8dffRPPpuUJ100@oo/iRZZzb RXX.'kr1ZӃv1aoXσMbl!ncV/VJ)L$M)eYPTT47R###TVV.Mk\,E922Bnn.999_ؿԅ3q$@B!Dڤ\,񐙙y^@n:;;x<䜗+! QZZJ 8/yb1z{{)))!++륧gpX,>etvvb&999%RJۋeYx<3Shohvwe$kS-T&sAm 5:ހH"B@;WμsnTs fgg " @k}ׂm(Ϊtlzqwww!ԍ|} @)m㶛>m;.+}Ǟ. 4h*ȐKS!O⮵KX/֧Kk㠔:mJ3J}[Ɏ)t*9A0YgcJ SKoiY;mk`qbbvC)0+{{88|ng=K̎ iFG빼`9:iY۷oٳgS__O{{;1ccVXANN1]6Pk.V^MOO[lA)%\BAA۷ogdd%KPYYC$a֭B!V\fdddrJR444Hmm--ȑ#8p%KP]]ٻw/PQQ%\ۉD"]|@[[[כTa*]v#G0g{%;;t`70 lBFF .L~cSwuuqA\.UUUTTT;v`&]vl߾AJ<رcTUUdضmeee,]4׶m`Μ9|G?~ 9pyyyXb\677{nYd MMM8p+VP^^[l!Hp饗rغu+Xe˖QVVFGG۷oŋcl߾e˖͎;b唔>0hnn\r9޲e dggl2ZFٴip-ZD~~>@D"3#6l@oo/hGx(n'xG222omᅬm388m8榏[)[ośoޯ~lq z/ݻ'`0Hoo/?0g?cppgy}[o?~]v /ǣ>J$wl۞BOOOtvv{/ir}kc``_|L:::я~D?}}}ܹ˲ǼtuuamI8p'|a~aB裏Nj/Ȯ]xWرc^`߾}< 裏~3FFF/Icc#vyWٰa}}}$ :OׯN?6N$bt`1v9Zd/3ayrr]4 7aj #nJ%CX"F pcōfR-[~T%ffޙ! ,v|H+Ro)r{ ;+H_5kk֬I)ogضk&۶mr1w\عs'===TTTptqm7<<[oE(a  h|~1 ҥKKҁvuu5+Wrquב 7@QQQO^^MMM#>Lkk+}w>HĎaYiG,\;lsS^^8x^nmSYYUW]D"lܸ/׋asmիW/}qw줩 K.d%H  pw`P{gbٲehٽ{7K,_2;noo' f͚hlƲq֚|֮]˽ދalݺ_Wom6L4M\.^x(>}öl[h3ݔJQ([Dw[ v1#kgvx ˪#`Ў&̢c[ mMpy F~.)rOϓO>u]Gmmmza۶mڵo\sjdó>455rJ/ESOaYMMMw}amFmm-ׯ?hA?p4QJ{OlF̛7/!–-[>)/,,Dkͮ]9sfzn---ض͌39s&J)nJQQ555444022B" /֎U$F>ٽ~!G{9B/Yx1K,wѣ x??;?Fk /OH$k_qoiy@)Mٰa?DF k.Ν|>wA04MvM0񐑑Y!|0SKArXD=թ{KJJ?>sM=QZ۶_SKLq3FOnhh(exSiV|thP(###cWJQYYe]̙3|75VjvTm"??smx_OqQJ;a= H/6]RC'kcχI>&c(ρ F9_v)))B|>3gd,\0pG"ZZZ(--妛nJաP"-Z@zu"j~?-JO rJ,YB{{;fٲe|>,ˢ |>2005kXxq:,+}u˲ͥ"==//*l&33:#zD"9sy呟O^^~?Zx<[0ϟOUU8CQQ.1MCYYJKKQJQPP^q 33%K`ϟϲe˨!*͛G(˲#++x<μy(..믿Z[[1 JJJX|9P4[ÿS2̚59se]Ʋe˘5k ,+VP[[Kff&xo9=y[v^4,RnF.\ٳ `rrr p7^ [nrQYYIEE,\@ @ K.$O ?22Bff&>B[n!;w.,[e˖1cƌ뮻JrrrD"|K_JׯիWS__ sW*^/EEEbY7tSuYIO!B500pʷtԸ5`DV\.gLW*=UeeY?q( ===RTT4)+5QReee:@$HP\\Aj߉ƶmZZZ0 6{{{;t\yIjlvƕ>McYqN,6z#5C2PabD YM~**b ogF7DÇ85ZbJɡ)l5Vr{(L_SO4 uJ>cMTR j3]RY0:A8{;%ucl=Y?Qo'zrn[.B!&0a:B9KMeY H$ι.l<Oz2s H E(" Jn{s6>e8D|qVV@`j@1͆7ih?/> 0U|/B|arss|8\eʶ?bS1FB!835\N$SGC;rľmkc*N >R5c_[S'=M/LB|ZF_'H}A2e9^*N-S{cjB/ Ѕ<u9Q,F<7_Gpzxn_p忡f}  _FSIl_~yq (_}d w`\q"=F^-x31+p:^'Ewc5}x9I> u\ <7=>30V9v?0} 0r]mX{~ *0ta/8ø&Fn9t%a_H7w#W~{Jy$? ~6ܫ~Ħ=2\xn[8H|cTf1F~%O- ;(:qc"\KVEt!Ĵ8O^=\X8qA|DM!y8NNLX{;8Q98]a֮Ɗt'( q:g^݀z7OV:܋ӵ=jcz<} yg*ibTL28Sto6Fv9N1R`NsLGA'"P;M=cNFq:vmӍ $ł81rg1kNbg>4Na +:2_, !28Oc eՉc(89q!9HE *ctȻ:D 3]/5vhaR(e&Z?RDžB)&E|%N 3ߙs}yZ2+!3ƿY|nߓSѮ1CS-gyjO{m!BӒw!B!pzoo/PhC!B!#GP^^NFFƔٱcadɒItww~zXr%~!۶mn;v}v K.kW^kײtR:Ć n#''g\q5'N/5I'u4I&G9Ҥ3&qe=yE4ϓ^JO}S^$m/#ŧn9b8!ڔ^^u"Ioo/z+e 6`&555yf(++?&33noox#++ H.l20կ套^;f˖-\~̙3Gyqظq#\uU$77G}S__BD+Ű78dEd w'3v,_d88b&FWt2i L ѝL' 1Lgɥ 7g'p`graґ`0pT'?>g'L2{1<{2U1&1?nlw?VF K"«P7qY"a`& /#ՇbOn'b^8x(_'3D00xA >\Oq{` tw;|Wt{V =0܅ب@o 'bP"=`0=׃ [(3 V&j$(TĂvzS08Q02&Ȅi9BOߔ~{=~~{n 5>lٲK¦MXp![oexxzy6mDuu5eeeիW~֬YC<ByΦ_~***  Xf ۶möm,ˢ]v@ii)*̞={\1F܁7K?Q^Vo`~84ZP?^NY(5KCkqr"X+gI(:-PKnw#~xb? 7 }bBDWWDї|?E#GGPM[$ Qp \/p^O(3NuVK\_4V5( OyQF_W\:3GooE)z"ߘjb [.AO u݌϶~ί': F?J)gAZ;ب'PeG?'v,F'N]yw P8-kpΥS5!3gdTTTh"=Jkk+J)! 2w\|>===ɼy(((`Æ 288Hgg'RN(,,$77M6Dعs'v p1կqFg˖-STTڵkl޼,(**'`޽ qQ+ƈӍMl8O1bz {G'F@нfS#= 3k `T6'P{FWD!xѣAOm00t7O;1џF\^+#gNSXv;%ٛx;A7f2ۆ?c`2*T̆{R DxKd'RgPlrͻZ2} S.c|;& 2r !.S Ma. ǃm~/^SO=E?x<>nxרફ"C]]8paҥ|GZr>c(**¶m_@<'Yr%chhj[1䭀j9ܜI2.w@uJ sSgrrjN% 7)LwqI7+ FBcQJdV1ms jܯ'pY>ٶ[Mr:{8۶B\lZUUߏ77!??ŋ8~:JJJضmyyy^D"yooݍ!;;@ @aa!,XVeVVVX#77o۴IEEZkSP'33K.˗SSSJKKP'9仜8G闐chFYpEAFj tmz?+T?/a8>/!ؔtǓ pҴc222 粲ғ̜93Dγvd\=O+0o޼nwyGbTLF> "ToJFa:{YǗ4+NLsEGɣb g=h^|E?A Qm6n~-6ZMPĊP/AF|ǓE(QaDe!WD\bA׏..^=8qo2(mfm8\\*ǡ6?y=ڵ]8\~JmPٳ5k;-[ctWE-$ k:n6Odh'W/k>?)4dȫc 5oI,(ܟGFul?MӞRw*LoֻJbY:As16h(B hz=Y<ױN@`J.m>y=Ǣg']ibYXS 0?=]!>mZ3a]e|W$'{SlK O>Q߅e;'Óɟ՟) Aq+}5Ao|.XEB"7zL"VK^;=m%.ngZ?_L]$/l;7=cƸ}^C pB!SZ\_JBs#B!Bq]!B!H.B!B\$@B!B!. !B! ЅB!B B!B!@t!B! B!Bq]!B!H.B!B\$@B!B!.鮀B!.bZcU0Io_xQtW7'x \_PE]-\#=/r>tc p}np'/yە]u!t!B|rZlރwgA; |yk zp8q>>i'x#~oCl sbہGB"=B!87Jۤ mNC).Lh^4yLs'TeH?B|W!B!s>22B<B!B!.j<}׮]TVVRSS3}QJ1k֬I {144ĥ^J}}=cqUWk.C<gZ{n yq/QUU5m.B|=y1ꓦgU!\R>44Ė-[5\}~n7===x<***c߾}JJJػw/999]oɖ-[/裏ꫯ棏>`x'eӦMܹ˗c,]}Qnno!xbAZb A~>w\aLhmI_ c#h=>V1FgZ'PXqt m0sc(jx qP1CX8AО9DpsVq&(/BT>ܧwww_{uƍimmeܹrصk .dƍx">CL$??G GaѢEl۶X,ƺu,JKKپ};|>ٵk###PTTq*mF ٳikkc{.=c/Ha`mM*IǕ?@ῴќd9ihs鲫y,r?n\pB\,`><}Μ9Y[rJhmmE)m/6n܈i,Y:֯_Oss3Oqq1nFzX /@({ѣ;<ضM{{;^{-;wEGyy9k׮套^_rzZi& T!9ꡇ븎柧*b0ússqYUv$s+H *Չ }m C<|Rt0GϋqEh XrEqQr+?\.R\. @)~x<fΜɋ/HOOa`. 5 RTT֚|6mDmm-]v^/^Luu5OXb---̝; b֚[n:RAAA[*F,^xϥBqҀ61NcV9^vs|x+hgBN_>3$m=Wqjuc`0 !.JSlR^QQwߍ,͛mdgg3k,K8&++UVQJկ~V.\Haa!999222׿΁Iwl󑓓wO|%{^(**b…((..~yB|Qljné_29y,sf: ˱5 8af1x=MYfMqr]x|gnii!HLx0qːJ$nb$Bqf0;b^鮒L #ӏOF( !Ąd1!BQf$eU!lͼfrR!S^!8,"}۩%@B!B!34x<(ZB!B!yf&x^lqAk X}t!B!S0Qd B!BqA]!B!H.B!B\$@B!B!. !B! ЅB!B B!B!@t!B! !\b A翷Pոܟ(R8y i1<^*w/y۴=xk(Az7y ɜf9?t[Kja?B`N&sc8qw44os(r=wP5>kآf,v]1*SW5Bۏ)R|O=w-5D;Cn"!wu(Rg׻D"X *oc~8(wyP˦t !]!.`PGQx{'m'Z\Ch !&;shk[Je+C/ZszM@5%dgq64ybSXGLoVaLǚ^O# Rxۉ !3ɽo&ki.ORz%\7mg1w9xhKmDBU>aZ'(]!I.8n$ R*1]N #@j|>A}Gd{*NjsdѼNGqۓ(1 dƗFWj:GJ7!B\t!B!pz">!B!vC7oLUU555Sާ哦 ر/^Lee%޽B/_illDk̙3Yh;wK.>LCC,^4ͅB!BSL)@B:t!,`0jCqq1;v 4)((tR~iybh"\d  3=-bضMYY y;w.<_~W\O?bѢEBqvFcO|Oц6r.mPMmjmA' Y7G}[Jq>z\N-:ym8U(l7<s\}dbC}߰ѦF+G7Lekt25Z'+y7Iѹt!b0o䩧K/H$ѣGYx10 p oo}a8:hۍ!裏RVV֭[ ]۶ߏa222m|>(**kavZ^xz{{bxx5>o[!Ί=Ȣ\~p6#&@׃&dEKר,?%6'!vpG=xOcs]7'WySwc' <욑AWhGc]<@C\h[#>^}##pbuC-3~;eߪI0 `U6qeq d-TB6;k~$YFL'-MKty2:~o#!0&Tlf?zʍşB!'3]k͜9s[9tk׮6$ ZZZMKK 7nD)Yd 6m^>LYYdddcq.~_ ᥗ^4Mz{{)..4MFFFؽ{7>j|>< /, aG!.Z]JO^~k;rVn&׮&v3tlD ։,渮0|Q:8pw+%G`ѨkRkz yg RE=ZEN$$Ӥ>K,I}P%>Yk4+Wwґ؎.׿/!B|2S].J)LLN?WVV;Cgg'D"Vk|̙3)))!Hɞ={3g .$//3f0{lJJJZp%&8%%%477 شiV4M222Xp!dʕ88p@t!EIikeѦm 39y43H=>nO<0ZM  mz倲Ѻ3C:1zJS"=>DjlZg|ycn4c8B[5z >-#!R^ZZ7ߌoKuu5mSPP3ؾ};tRbJ)n9_NEEEEEضM"1xߏp 7Yf;;ٳիWseH$kO*A4UV׿u<ȍ7Ȋ+B!B M)@f,\qi?ikkcxx|BL21˲PM9#RFyNc$M4n4i:i>3+l #L48k>F$;v0phbg %]<0G3P؏ʂShii&9e(D9L+?_m*>].àp8́|>lbZQVVJ)!??2 zʚ;O^{-=BLg΂loе8  %yGAb_3hɆɾ9+W|# 7\o̓7 jj!ZSq(Tp 9Ice oO&-R9r /ę(.*c˧͞wm3e3ofsl̥&5 Lve]hPXXrǯ[orr'۶` ۂoZ\f[rl\njv0 Xq oځ],9ɶ2]PPaLضB! ЅWOW0Os xǹxxkq6@?fpPs{1\O^D)4Xօǧ#Lwj^Q: 5.@?-oy* ClH5 :,҅<8y_c.O)@?R>Ǚ䕟Y~%Wnvxϣ2X|˭E< Эǹϼ䖜hLς/XRO&H$a֬YÇe455@EEuuu=z~͛Gvv6]]]455QUUEEEtB!B1)XǶm0f͢@ @,M^^^nNVV3gg!s#G̤5z3aWW;wdddz?)EEErxޣ.^zR6o̗e~QYY믿ooI.E@TAOKOb:]Ѽ'Sk-{9zg.gk>WSLDѶҎgq {۠s3A@g(9,Z`%@h˯p nチFvEa߲͝)aб5.FT ˮg7id9O ~C759>3Y?Gc)"fD'8"(t6ȫ-k?67fcAig25oѾ+@ۢ;ߠdMpo-YW wگqplx!n`9m`\Sjn h 5'(#]6]pTLtŬt3iK!Bs1qjjj~UW]EKK MMM$ (?Hss36m¶m.]ʚ5kعs'D8@mmmzMꪫF444L(fdd;O(p81:Z3sL^/555tttsQVZ5-84j} o< f789@7lf/\Hf*kc7Md_Mvg4 !&86QarTՎcAYW%mOsyɛG" "j+?% tEqݻd9 qq iY r!+cm1?,W'\"oY}K&ݿAQT.lSuuHePt!B\kzbm8aǮ]hkk#H_gΜ9D(,,ŋS[[Kaa!gϦ,app̛7J z뭼;qeqF.Rn7Ŭ[dfΜa455… SikbF9r>9/2N,ih Z'/R|k. 4j*mm0p%Sɀ[f\q狄nj bt ZChdD ħZAGBL$`zԹy @5VϬG2h3_.`phD"AOo/>3 )̉Ny E4n <(fq3+|#dz1>YU_F:],A H"%I$R%YlDZ-+''7u&qbGv7ɊdI$KVDw.zb{N6| Μs,B/9~^Ѡ}u.~um6N m ژ~l:z0&x,JICPE"7zA.K8'g.;00bA+ã(,3>>N fZyݍ4­IB!J؇{[U~ KG_ M&]D+ߠbvAWDBϷ~x<у.\$q`h_:ŋK= ܢdY&))f]tGnn.7z3AᦐJxHII +@3с3gb tv?   AAA& AAA$鬟     \eH˅NSzQ`AAA* b0zpE.   WZl6w    \,O|ETqAAAAAA& tAAAA ]AAAn"@AAAAAA& YCC̼< .a̜l:ezd$*r.@}Liĉ(^f-sKf(Lh1Y8]+,ñSgJ~^LIĴso  p{= ܴ:Gd0eO`|v76n܈h4o|^zH$8O<=zFCii) ,_Fӑȗe^{5&&&B|$==FsA.,}v$TD/lTTDK@DR!aJ:{%e٨$d댨TǟKHaFAAvQn'? ֭rhhhvLII ~){/ 444088C=DOO̙3F7 n7n%KpA'??^ G!--z۷~/s AXSM;w`cQd_U"=J|̳Qf HZ@7D1ڱ3:%&T (] vGd0}L&oj\顪(2-p~cgo $$&!" &~ud'@x$oPIHD|7_ 0a2Z UID|Mu:xvˤHt5U|:qJ X^˯ zDt.bTHLX\Du1~?c6"Ѕg o Ŭ ܚBQ| f3bIDAT:шlFFHhnK$ARa6e>x<$$$0::J4%))VZEff&jH$_$==E1>> ͛ille˖a6ٻw/K,5ka۹{oEUhUH*yQf6W/t{K|L~]`s=g ­@%Ш@4I1\CRH! 8AɀvW/JHH`h4***0dffR\\LYYYYY}:| FGyM6a2yGxbؾ};֭c̙|)pC}\P(D\\Y\.t:6 y͋Nq,dffRZZJaamWؾ};jEABƣIctt2AQ$YbT"^y1X*d*ɢ aϝZnZYpu-Nу.7$I! THCx DE%\$1p"UDV (Yfg_ϿjMEEōAAi]v{λ(nAюֻYbA8RAAAn"@AAAAAA& tAAAA ]AAAn"@AAAAAA& tAAAA hn   $Ih4$I:k"tAAAA">p8,S^|hڳ#tAAAAT*V^O4%"Yd"@AAALVcXH8ݻzAAAD">|*0\ˋ*P|7MKH8Io4rInG˙[ejzlC|}L0 Fy]e&_4zebUw~co;@{GO0@GoAAAUT*PTQRRh<7z!~}U>ꆓ|$_-;FXpS>%{;j;[l|9_]-,m8q:~oቖz¡Hg:h}|.A?6xKá%}h8MtĖqߵ#Oz^   ė%y/HqM(e9ʍP 2%d2h@<(DExQ(ۯ$W۶ 9*;IRK.+>Y/\n3K/\)y%mHeX,D"N ~[FCC}~"Wpǥ$")(P߇_npIB  jf{)a )~e`(- !ACahH) IGI J=$ Jj[PD!\\@k{B(B' U @|8 aDEB(BCV_ p3$?Em!"Fxh(DZCֈ>"A>$I" *qu{3\%!O׋BW0e0,3$5Z+Y'e<&YEwű(VpHL0UjG 26"Hj˸(Dž'5hf 풀dK |otMa,F#I(|Aq"r16 J<."\IqqAn HJ5< .2)St叒l$^b쌹Q9Ӗ{.g6!_`W]g~zWOBB| \{A[ݹ25s5>c.gEWu^v7X p\R A0.   7   M@A[P0DV*jHNw7SAK tAAT*2,Sf_QTȲ& ­A p ~3=V  btAA  zD.   7   M@   p    n*pH$r7PThZB2/br?zQJɢ(pRTh4$IPLz-  7m{^<,.ܪT*z=@ u:* M8ћtKjffH$@e"Ȕi_s86g$I$$$˾Y\x}  T+%IB+Y ##$P(D{{;,3}tt:Um8ײpv(ӦMCߔz+$@ @ww7&I|>t:S$IW'H$´i0 g,$n7III9v gY1+^J:Z$2ع%U  ܊>3@Ȳ^G!,HFF7±` 매J墿y89VNy܆B+эỵѨr,n&XZFV8M -}FeB2 V?&s}WeY&D0 W}P,)&dY+5+L=$hyߏ$IJv}͏C@y_(R`0() )b:#@@NʲVUwhۍ^gbb8(~`z/泥ⳮ?~\MoMoo/iii RXX(  vWw{qǎ|'`6Pnc7}1FYBJI0$oj=MÇyaxx|T*PNGgg'[l؍v>`E||26e"//OiFF}tt6>vLAD"ʱTTlڴAD"dYn^h4OeeQdY&%%~r3O a4 @YW;$%%+PRRVO5}wN'o999)xllh4fS ~jkkNG0T7vF"}0u&$I +w^/^L4壏>bƍttt0m4vŖ-[we˖-SYYO룰Pa6n܈b!11ɛo]wE$Wӧc4iiic餤011waΝtvvRTT<8D"hZ|>YYYf㗿h4Ν;;B8r]gj5cccwb8JΝ;illd٘L& Z^6nHrr2۶mSPb$Iʿ3. ­=p;wrw3w\&nӦM|>̙Cnn.۷orb F#.sA|>-" aj5?񴶶tRj5}}}||+_!??qشi. 222Pմƚ5k;w.۷o' ȠW;v`{;x<>|7H\\f"11BUUU1>>Jbƌ+7YcF^N,EMM < : <,[ ;;rJKKodnqF.]Jqq/IN.VZE4d2|r^yseΜ9L&&&&سg ={ebbnZ[[?syjkkYhc=. ө& w醴o|J@WW>}:xmOIKK#!!y1<<믿O>IRR~={wӦMcƌ$a6n܈fܹF~?pV-[F{{;zzXnFMAA.yZ-=N_7222Bvv6[l!3c ضm<@mm-qqqEEED"-ZDEEl6,)))d2ѣGj<ݻavիWc4 X*1 <|-ZDnn.Ǐ{wٳgAii)nN'}}}X̱chnnbPTTZQa0ؿ?---g_ޙt$4vލZɓ۷<|bPVVƬYXv-SΙ|%IW_}LMM CCCg㳆 qIOO'--Qt:ze륣;3!Qլ_ݮ innVzeYFՒJt:VXA8_={ӑezYp IUUUtuu144tV$Iۿeǎ9r'|V\+**0lذ>Ӊa͚5SRRZf80_줵NǺut:u Jhd,[1WBSSmmmJvJb߾}裏w^|>ǎԩSq:::cƌAA[yh4Jaa!7={sYjǏɓV FJl0j 1 $''oV2nߏG)c6c7ZH$e||JZZSnٔ)ҔT+;vnAZ2F_G$-Z7 )39T+Jl6|ʍ8ׯrX `ٔ"<67|ekPYY׿uz)222~ڙ܃>g?~"R`$%%jù3{<Γ;O7 XFeFaժU̝;{Ǽy3q6Ʈ;Hłftt:s͛hDRqq໰իWRh:'?@$ c2hkkρݻw~j5?8@DVVYFSQQAYY2<%33ZB ,p8Lzz:f}Q__O4r]/vcb(ctKYh4XXc9(YbddJKK?k֬!''{.1n]A[ySܣ(`0ҥKc֭QRRBjj*###h4SG.]yYp!iiit:F#Ț5kFdddvZ>C yyy̟?͛7y摛;v#IqqqRHLLl6HMMb(_؍w~~>/d2{PշL3fSܝhZ^lBUU+V^x8͛jшjURz=6 Gff&Fd )))X,0tuu)]w`:Hjb…۷st:imm%--1vڅ$##>`JdŦ_V}t$''DXd NHLLdƌݻ2%Bc=~)v>k2c ^~e={6ȲܹsŋO~_ ʌ3eӉRj^ }'vZn & xb^/V RZZ=Þ={eioogɒ%MW]}1|I%FX/Fa$$$(yAy(ǫJrr23fnZ,eƮK/EYYHJJ -bÆ ̝;8=Bʿ?Beu:L# p+`y$I}}}XVٙH$B__ʍXMn䞵si򲟵܍FCR) ~?>q̡Jvg\=s}g~~l9I8V2XHɎ=8׾STMk[/  \.@Ճ].vJ"..@鍻j2-&.^lIN#>>^y-322rQ.Gj4n5YGmIII vAAnNNDVOI=s|MV3 ! wcx-Ҭ'  t   p3   M@   p8KQGAAAs͜3%@MrѱjWZ)6F]}Γ yo<­z  #jmrP(DBBeϺ[ ä`ٮksO  !!>r0 moK~ϓp807,@eAbb X,7zSAA뤿͆`P:lb3 z9s&~sэQTH,DQjZl%Z=&/(sܮarkӭB)0IեqBSsꎝs1;mŴE6&GU*y-  3bqqq;g.2,#Ih4~?׬7/N8݋8IIIсAӑ`Lhii!''G q\j"fݻwúuZ ;yDpO~~>RTT4%wN߀ڕȲ,DcbbBiwbb"EEE3O3mڴz~vAZ[[qh4rss4Bl6rrrzxq1bdd7}CY2mڴ)?;e.FL&JJJjSΡ3mNLL`ۙ>}:z=ƟGchkk#%%W_e̙|_F]  z裏#--˞7@ϓIGGM^^UYy>K_1jM7M}Yo3g?#K,! og1cw}7322@e ZENNz^XVgv۶mG?"%%D/0<(H^OZZM׫>lۿ =jS9>$%%111AOOjn7999+Ƕ?9>f͢~FCVVDQRSSB!rss$ ݎF!͎;{o˗c6oy50ַx駹q:Ȳd"!!_|Çs}hmmEV  orr ۷x;o9y$mmmFzzzͽ7{կ~ų>SO=pxG [[O8&J0~%K?{ ,getvvL>aihh?1fZ}hoogllG}s8z(mmm[,Z={O\\??S[[lF$l6?^N'?˻Ft|{cΝ_wJ]]---|_dڴiG?"++ RZZ LMM NjjM N Yj6pOnn.y뭷xY|9eeeٮ B|>%W^y~xgwy>^ye/q\őw]~Iaa!˗/痿%=o6PRƩj5yyyr1^u~TTT`0ؼy3zR֭[7 f͚EOO?8vz-rss={Mw?g}o~>|K#,IbvǓD]]۷o_L,뮻LpXD"lܸ\e?X,MF `||\ys9ײ@ ;䮻"..J}}=w{ѣx<ϟϜ9sя~ٶm/$ ;j}YeBl X,f͚/̫JGG}L&V;w2{l0O<7oرc<||;aƌ,J!\[8}x*++)//i"}o}8c׮]TVV2}_?`4ehh_~ 0*srnYVzzz8x ʗoɒ%9i0D"Z|r=vZ?̜9yM9gcmLLL`Xt)?OxG9s&yyybZYl& ZMRR+۷jc3xebu b7okrAA>IBO+/|ŝ>__|HDBB:9sPPP%KYaɽ qAYYZE)`ۍVk_s%R"i O0l5ky)E|A҈D"QQQ@ @gg'~zիWZ&tR(..;8 %!!9sjh4yYteWnAm4?>$&&bX(//g֬YdeeMrr2_(..l6GGh4BӧOH˲BN PPP0%;w%h"y/J!6V/^L(--e̜9S ׭[Gvv6Hl͛N F#Wf޼y D(++#%%O?+W*Ai&2w\2331L<#0k,t:ZRf̘N^Ovv6wq1JKKu;oc5͛Grr2̘1CI}2dgg3|&==뤧% p q݄s Bt:FHCYJ$ƔɥL$zϜ"+6}?JurhZe>XzTl{jؓ{Qc9b= QTJOXs'?(&99}{ݱά"~Mu3JD0cX:'b̝I$N'& NwL>gNw'|ly~y^^~e??PXXH4tdtD")u1\sfysm9zPfN  &Ih4L&Ӕ{oIGa٦v=^ ϡP@ lvK_m\}}} ٿv[W" uh4Wa!`ddd(LuA]AA[(ᜩ.Yч, x]7>V|.CՎc WYRD8Vk/i+ 2P($ρP(D8  p|gs _׍xo  IWW%ώu;c-\+ 7 AAAtsOVwK8&55xN8F#444`6km6LB!?Nkk+hxinnVAL4Fz=zz{{INNFV322Buu5͆ᠶp8 3ORR )bоjooޟ>!,˵9k/Q<1LQSS0VFCgg'NBRa4 ZljaٔZFqJ;W捷Z  Oۍl`-[PTT޽)s\\Qg``s+kg+NILLDeNl~_vٽ{7eeek8NԩS455QUU 11*:::ؿ? .DVO 8  @UѰ{nؼy3iiiT*};wUUUv˼y󨩩W^!##|vEE^{tt߿6m̙3BPdjV+qqqڵ,]Fs {%!!H$믿Noo/-b``0`۶mdgg<ݽvHV%]RahmmχNn300@4_df#11P;SNq e{_|EZ-6moөV6_|QßwV>22B[[l6e|MV^ZW*_)M||<~.եv, ,(>]vaX) ^/ \.V+@fhmmD9 Blٲ Ecc#Y"bYxJmm-hT,990{J tQHLL$ "IZZZZΚz)oo)Ah|v;.-[‰'x/Ƀ>HQQ@ZZNASSzN:œO>y#w*++Y`}ݨjt::u V˲eԩSuV~a\.1jzg8._~ 9s&񤦦m6e N8ѣG;wݹR$s=Ox xT*###ۤm6z)۷oԩSFg֭,Z]v1o+VqQttt)**`0vO>t6mė%~qw`mۦjZ Ν˦Mhhh@R!''ZͬYhll_  `e͛7jOhZx<9څB!zRr`D"|Ǥ``XtׯG9gᅬb! ϴi ̙믿^w,Yvă>wߍѻIAvweƍ̛7`0mhhtwfddLp8B!F#䥗^bh4j%55A^QQǎcǎ\oo8ps!  `pp~l&##p8ࠒBt:tFWW###*|>~0::JII2^}dd ~?cccF`hh.&&&x<,ZF__~nZ`0H(b )4QTȲL4%Akk+'Nt*C1<< Bj\.}}}L>ٳYvu|> /@yy9:Á^gɒ%AN's]wP\\… IHH`Ŕ?y_ZV%m<DHII;P^F`@R)J;eYF!I$''SRRºuaJ-JUU4FZFPTTDRRK,aٲeBss3@R+NdffŃ>ӕST`(//DףhsOz&*;O>`0{Cϧ륢ZZZ;w.XV*++Yf 999:Vp:TUUvlP(Dww7ގɓ?tJoDVN=  AOIIQRưZ,\SPP@ee%$&&%K(++SNQ^^βe& xPJa9Jj4)csrrvC)sD_ct,=zɄ^'..aT*.|WR.ϟOnn.wu,SUUᡇl6ىNcllFGG̝;Wn:e|F!0sL#33իW344DSSzHee%fV\Iee%:Xt)ZvJq~?h;Ihlld̛7׋lf֬YT*!??LZ-MMMX)clIJJ"++b5k)))dggjE1>>~Eycc%I">>, vTWWƪU(++ ɴiHJJ";;ZM~~>gϦ )++̙33gnqf̘Aqq1f RRRhmmE$M^Wu8NIKK#33dRRRh4R顨,l6zj%hr8ш^WzO0CCCdeeQYY(dffO{{;deewɬY qqqSYYIee%s%11ݎ&DHOOȑ# p}QPP@cc# bŊ6  A#-I###>^<<###]Th͛ 33/~7z/2,ߴS[[ @\\+WoHm۶q)~m8  ܎N3\.t:6mʰsFB$ω}ƕ|έR-Iz#2̾ZŬ'Xoi$I"%%E3Kec"2̛7p]9{]VAAybK9AFFF(Օnߏmn'~f%IRz+].-bf0Q ,xt8&׆(VnxxF7隹Z7AA>n0.}g,c0ȸ )WRRoe+)M.\. p6.\h4z vtً FWsAAUSSSLLL-]SSC4%>>=J"11:=J__iiiqQINN& )sWzTqMJRR%bNfɓ'+ő#GXˉ'hnnd2a2hkkŢF~;b! reY^__샘H$BCCF tvvZf``#GrHIIall#Gly㫪|ѣG $%%)M՞B`L[[dgg_jsuyb2ѣV'ORѣA\\F9?h4SUU%%%eJ)[la||v 16 rv1͗ϧ~JIIgwttcf̘1e}۔h>kU]],?g\Ruvv*״K5::ѣGU >|:<ʔG  Wr_0@pcz=yyy:u dff_I7x`0Hjj*477c9qJOO6mb…t)={غu+.͛wAi:bʔT| ǏgCCCl߾N~~>v?!sto*Qk4;bÆ ̜9Syw^6n܈bjb49toK,Aӟ^Ͼ}`wߥ;3^^z%e:/K, [l!33SykwGG파 ihhl6R$$x<z=mmmFijjRj^x󉏏WOLLÀkerHWWvx饗l|'2118(,,dtvv 6_|Q srr hhhȑ#$$$m6x V^'|㡹Yq\X֫obӬ|>C+]Ǧ`D(  ٽ{7z`0jvS]] )) Omm/ x< zzzD"l߾ŋ3::< S__Oww7VQ&&&Eӡx!//Ob`D8nc0ժL҂V?).,ƨEVc6ijjn#IqqqJ&,˨T*ZZZhooV222xj*bٸq# OAA8 /%vF111AUU ,P6|k_?1---$$$022B__@;;~ c݄Bs?~K2{l~t:/WR hmm󑙙ڵkyyΟ|IZ[[y嗑eロjs:;;d޼yȲ^GVAZZEEE jAz-ٽ{7O=vn޼6L&PmÆ   h4(@p8|Cϝ!>qqRSS"y$&&rIJJ"|L6;vSOoo,_Ď;Z{9s0g>SZ[[h4ىbAR1c 2  p]01a裏xrrrX`ɽ===_=Yyw1LLL`Yx1o\.~߲rJ6P,X_2+p݌D~2OZZO<{족(,YZ[9sPXXȺup)*++j%=܃hp011AMM VRfΜÇ 000pdzKÇikkrxU*ٳ2عs'[l!(x KggA$|I!,ˬZڔ<˖-SeJJJX|9Nbhhp8(6Dz{{什/~Z BAAO<鴴o>~?HnYnw:nXXmll$ U/~\.HA $b (j,͛GNN =wnX9s8pGa̙>ΦM%;;[IzX,v/LII P~:DssR}3fPUUŦM !!K/q! z~须~L&fP(DOO]]]066ƌ3B200 twwc2|G?pɓ 2|&11Yijjfn7@Rf3###x<Z[[b``R, MMMt:@yy9Z)mjJNC$%D"p8H<9vN0ZIWW3ffQ^^Κ5knd1^P(뗗 q8;e޼y$$$l2fΜIbb"MMMh)ceY&%%Y8fq]ww^0jzʾɓW,+i1R\\̚5kHMMASSIIIٳzn7:nʹ0sLXhK,!##:$%%Guu5HD4%++\222{p:/--f1c ֬YCKK pJۧ|8뼽̙3SNFEE***Xz5ӦMĉ0֭b$==1f~?:O^^B!t:^QQAaa!-RF"z!f3ccc~V/WTTt:F]ǕҲ2imm%//+V022BOO QQQdnzj̙Crr2rwhvzL&٘fIJJ"!!<ә5k 1>>νKZZYYY(E̙CII qnä_4y *p8JRY뮻={6~df̘JbllFYjfYj1LHH ))^ (++SUaa!iii̜9 0ͤ`0|yw9bEZ-6te>RRR0466Ŋ+9s&x<MFZZ 3gaX3gf"z3g*kcWW)E z $I̝;ŋz'33B1 ^F\$h4bX={60>>YYYTVVz%++z{{6mtvvdJKK1L`41cTTT0{lh4$IS__8?yyytuuYXlAAA?.I###~˯ƋyЯ̥̃p8ObЃ[}``σ΃^SSCuu5,c2{ooJ̃. pV:rtL;1*F}-A0PǜK|)X!b0Xt}+XO䕜'#?op`0xS虙#˲2rpc?g Bx+ھ`0x B眵\IAAVqOMMp8HKKCV9|0,@{{;@$8vn立dG1'trP(DUU$''+#V\Q__OUU2%8{ebbtn7ԩSaXhhhD~l߾:(?~'NlK$ɓ?~шh233h4v߯㡡!K(RMgg'񐞞N[[JR} 1}v9]7*߿ݮ[uuu9r9vMMML&j5炙TZ-۷Mzz:$)U'oܸQt_^ĪV#Gq|>:^Rve]k߾}t:,^appzEs5L~ZZZ. 匿ddYf׮]8qMff&:t,  \ESɓ' BܹJŴiӨ__l /`Xغu+żۨjrssΦ Amm-v9sÿ˿066ŋ;طo`jϟp'Ov 06mjb2رcǎc 7oftuuo}vy1>>{ǬYHKKCp)0ׯ\ @vIKKSvwaɒ%j~ӟ1 6l@OOwy'ݼK$$$N^ ++-[Njjv766@'OZF$V+'Nq  twwFFuu5?p:=z($ITs>jD"{=oq1<ccc8NMFss3㣏>b~T*p8֭[eO?2^u}Q^|EVXAgg'@KYѣGٴiK,! {n.]ʻK~~>hA`0H__?0jǏuV x?S7ob4q8htZ[[1LhZT*:锖[ogg[u>vJ͛kkkILLr!IvDjkkVj)^{5/_{wT~122$IhZf͚ŬYFb6ihh@$JJJX`'O)  n.8= wgbb^rSN}g}={عs'####ҮXPt:4≉1 W:D}}R1[V+z,$%%q3{lJJJ#IMMM̛7kגD$!??˗Rpp), p1N'`u׋,۷/2::p:`Ϟ=̜9֮]پ}2cAVV_Ws1C#0w\xۊ+[Ic^v>ȬY1N:uGPAAFEqw2::Juu5EEEY3gEEEtuua6yǰZŠ+(**:yyydff訲^ҥKVZʕ+$Iɓ|}>rFq8z.\… !11"1,[+V`X{$I̛7pQfϞ͑#G'p8aŬ^B233dbbD{1&##+WE^^SXX<8t|_$%%'d۶mtwwO6AAƺ`ꫯ}vcƌdff2<<LLLp8ɡ'N0>>NJJ [nW^!771(++chhӉ?k3g|G䐘x e**)ڭtvvOOJZA0T^gtt `0c||~Nc޼y8csssx +MrHNN󑞞Jf3Vd"M__:LVVsQwh4t[N)jH  ;;`0dbΜ9t:?zF̘1Bzzz(,,dٲe8L&fϞjedd{r222eqjzJVVddd`HJJ"??L r&--4(̟?"f3^K"2NR8nع;w. tRdffRPPJrEYYw}7l6{PƠ[,RbSVVFNNǓN\\H䊦sݘL&IIIժ>gffRQQANN䐕5!V%%%EپQ={򷄄RRRsd˕}\PP3a``%KPZZJRRǓ9a磽L/_NZZYYY+*##9srB׳b Ҙ5k aZRpzZb!_nn.SSRR$IaJKK`0R'z] yAAnGJ'\.:6%㹮c3c=>s+1L7l^M$FGG1}fc/)~?^Γ1<pXyR+_h" )c%Il6_ԺChNS'28tm:n:r0͗4ܕ$ C 8,  |>IDOO%s}P8>ok% |auD[L17`0H RWw&Ym 46>u]w';?_J^ BAA=KytV!2zN=W/=6R.:VvRܣ Oqa2s)  4BFBДK ϛΪb~a\q\Z-2>/jjH$rUzcւ  p8oTسgdddhB޽[allld׮]ȲLjj*`tvvE?;wT~)ǏLػw/$''_VwNlj'طoddd066֭[q:ʴC{졺j={`ٔjm۶alذjeCqadY&%%ea4ٷouuuhhkkSd``m۶HOONσsNn7444{n\.RD, 蠽ޟ.Qq>vvI{{;z=ʁF$$$k.:DMM T*vI[[t:Z[[ٱc.Lez8e*O>(dggԄ> %%c/l6f{UU555t:Q^x<7a``KJojjR2jvMJJg߿2vBػw/3gμw1~? 2Z*NwY;vJrr2,i&=444k.+ p* h4޽Y)((ĉ'?!))T^|Errrؼy3EEE{fʢ`0HCCl6z-,X@ff&Voݺcǎh8r ,qYkhh@׳yf, :t'N|r' a,X~!iiiL6 Yٲe /ra233Qtttj(++Snrl'55Hss3|K,AViӦq%xٶm===yttt_ Qռ⋔eejXj5Ӄȑ#ǣVeiiiall ɓ' p INN^Jȑ#477cٮ[&|>Z[[ijj"117x3gP^^`@V~zؾ};>QILL䥗^"==]2Gr سgo˗/g۶mtb~a:tH$B4e߾}v233immUf_(q֯_z$&&288`tt:0LQWWǑ#GFk4ih4<9y$6СCaZinn$ ̛7?`8+xt8߿>RSSijjNWED/~";; zz, `&F#]qjjjj`dd,8x p#GhmmER땬p8ZMww7k1o|]  |]N~e˖ F2::JMM K.EFBB<n' KEEp*6hl6sQ~?g=uwufq:lK*UVz9|0jT/_ᅬ,ʼuuuTWWV;8t@,X,˘ft:UUUD"V\}{QٱcHzcժUٳYjXVz{{ frss;ihhɓ477D8&??xzzzeH_TVVގ` ''>bv;?~|~my^z%!Ihݎn {ƙ ,V&YP9JTZdbg0pgks|^pK.t:Gx )..ʕ+,--K||)--eǎ݌PDDDDDDDDSk~?/^j+P^^n322>DH$g?ܤ 7oxl?O[nyFbf8z^>#JJJi+?~G ƮD"ŋA!==YYYayys@HُɓܸqCt:IHH@VrP(Dvv63euuUh`v9fSRRBaa!*~R)޽7xD0YYY=z@ Z-deeۋ $P__n'? ~F#?;755{nt:?яhoo//ejjj=X\\$66o޽H$B$ĉ,--188D"AkqC4ꫯRXXnv><))4222JD"R(8p2VVV'77'ORXXHJJ $'' 2:}{ HIIѣdggcٶ;'' zzzXXX@"N#Gc+za<,.. 'ܤCXٳQB%%%Bz~t/E HطoʹSZZJww7.`0&:tcǎEJJ %%%x< h4cXxWHIIjEVV~vfgg?~3!kky|z=QPP t$acc?U222tbZ#11Eijj޽{ ){nx"?"ގZpN[[ 2>>O B!h,Q-ɓ'ILL󱵵wܡ$|>B8p}fgg9z(tttJ$LLLсC*T*H$lmmro׮](JQBDSTDhDdHRR)r|ۋw8&//.q8HRd2A^ޯT*YYYa``={/g jjjo~CRR`ĠT* B!v;ȑ#LCC t:h4pU^ :^B8;w_BN'wݻB$> w.<XD0jDHLLٿ?deekFFFnÇٻw/[[[L&r9:DP*|{נ Rip8j% a2d\.$$$O||>D, cʈayy^/DbccKNcΝHRt:ַ뜜NIQQGamm@ @FFz"L&d޽mkFkV+ f233IKKxa^]];˜r9 ڵ#Glfcc7xCtNGZZR jAqq1EEEdeea6#55FL&ga}}F#GEbb"{!޽{IOOjjEQhBbl6޽ , qqqf1Lnرc[[[ǓO~~>٬rq0ͤj"Q"?~Պb!--m\q8(J^{5V+FVWW1LFAA]jR8~8d2rrrHKK#//O{Y7%--2V+j N V+x^233)**bmm'Odd2T*ΦB j~RRREVc2X^^F&|"7:&Yj%n[ȏnnnRRRB/Aw8Ht:nWt:)--^{̼ٗ(ŗnل.ϊn ߏD"رcCfii[nT*رcMLLPWWovz3P۷o366@jj*WYuEDDDDDDDyA菳B`0l+Y}Ann h~ss |n!ZYuC"rP*vIDAT4H$kS{|ϵNA\\ܧ}D"uBܨTfĆB!^/pDR|sGY. u~nt$$$|c%o22O;P0 u~߿͸lj6G 7X|e/*FϜu&e B ILL|w&b73@">h4#}q8MDH &(/5J?gv T?}|^EDDDDDD|bdfaXakkj0r-Bfjkk ##Yn޼)))T*A{pT*}bbjFGGINN~pBAtRQQ$33jjjhoo'66D:::h4 ݌֨ 11˥K$c0}6# b2dOSSh4j5uuutuuMLL ܺuERSSYXXGjj*H:%JOOuuu~A,:nTݻw1Ot|Goo/~ׯZ,//S]]Moo/z^1::JZZSM+ . ΅ }'qǹ~:{999w___͛WVVxw|twwӃR䣏>"&&FS(3;;j%G?q>jjjp8XV>0 OևR__Ϯ]j޽+`0ʍ70jAN`0Zt:dbb*<###TUUgϞϼnƨfyy4VWWÇLO-d>KO5ЧP(Dnn.mmm$)) oMII dggs5ٱcf͆\.gllQf3o RL&crrA̓ ܺu FCrr2tuuqIVVVX[[C&qU*Zռ{ݻí[8~8d2ŋ Zڕ`Ϟ=TWWc6IJJ6n!h' 4f3PPP@ss3 >|Xzillbpi͛7X,Bn2twwp\nz{{1BzoWW K -ߏ\.l6??Avv6 \ÇD"wۼkU1u:+++4773<<&Ip:x<R)7###cihhÇ|>Kss3t:Ǎ!޽ Y LLLO[[ӽST8q87 UbffW^y8N666tttV&~TÇp8f188Hqq1 LJJ 455޽{YZZIz=.f.r9R__fCRIII }}}HRnc6e, nzp\߿;w ;wQT*ն~^nRRR!&&~cΝ\vbFFF"##˗/sQjjjZvYZZطoCCC455Q(WFz=8ILLdssS_JJ N&7ػw/)))ܸq2"++K-}wˣdn޼)<6MPZYXX`pp2߿/<~zd &Dn筷b`Z1w󑝝-B[&))m/ҁ@?P($ ܿH$ӧ֭[PUUm}\z>X\\dnn}6?n߾M({=$ w/{J_:,//zPQQ!D|{zzbaaJ666>Ӝ={9:;;innޣ7n`ۑdVꢭ,JKKqF#n Anppx^^^ H$8wKKKT*v;jN޽+d555q}.^cmm-at Qh;w1FFF8q Wr5ovHNNb@ZZf3Fd@I?{_ŋQT\x%F#~ ccctl6\B8fqq˙%77JEff&΁G3|;! ׇL&.tuu177ǩS8rJd2laΞ=Koo0vܹsӧO###hnnfee~dDDDDDDQ|裏ѣ\vEyPCDBd2?H$uu ? äWWB BTUU?<8ٳg)++$ɶ၁ !m2P(˗Y__gbbRSS???֭[mr^{5QSSC @" JH$Lvv6qqql6ỏ_c~~>_ =z+Wp8H$D"v\s1x<,..n{|---ӟ<9իWHRΟ?ϥK|r ill$##"B!V+ k.HKK rOBBB0y-l8p:a&&&p:Sh4 F@uVWW9qGP088V)))aaa[nQPPn#9y$;v9W dyy5T*6?t:t~m4˿,{,ǎѣ1>>nVKAANS&&&jb`6h4R[[Kaa!,..-fRӅw!j5r{yD"+w)8vp1JJJdttQcyySNqaT*ӔpID"dddo>IJJbcUBU;jwuuq0dggLVV&%%|{/8e 833NN.Z-j<DZlLNNC`8q ݻ!Jx"qH$BÄB!111H$>^!H`yyǃV% RXX(8|WWWhtnt:PT zqΝ興|Tc333=z} fAA~w}u233ijj,//ɵk8}4*1vI\\HR8oee%PYD"]]]Y[[Azzz?T*fw]H$rfff&?GQSSS?~Ap}P*|> R΃Fii) Z-FZ-B=D_£/EEEs5lHRf3˴ _j5 `8>|h4D"233@ L&35 n8Of?ةS:O\<.]ի\.L&?яdTns-w"Njlf׮]T*CTr=VWWzhhh@ IJJ`0PVVFVVTVVrСmx"d2L&<ݻlnn~L&F} L&eeeT* 9iD"d2ܽ{W0xwIvv6zRZ\zC!JQ*JCT='')v!%z^xgggvHkk+===LLLZ\. g-+HMRSSY\\p{nN8s4ׯIAA F#J\immess"ihhrm۫$ JR١RP*߿7orevTVVnkq'hHJJ".._}ιsZ=zz={j#њz***cvv`0Hjj qeN'999l6l6C"|a[VV0> RxСCsC?:H$IIIh4RVVV>-+ݶr9;w$!!k׮D(**b޽3o-XJDA...KHo+**xl6d23::Jvv6 j%??Q&''H$QTŤßlYebbDBjj*< ÁJBV`дHMM%))~B:RF*k.0==`  ߏT*%utt˅N#..NhĶk.bcc`eeN޽{q݌ǎ;p:5eddPPP DIII5EEEB'!NMMa0fx,..R__Oaa!V'OLoo/p,46o0عsGY]]`6"--MxNKKczzZ0 O%}M饏ϣR-X,n󳳳?i,..b0dcZ}ӉVessS0Zh"6 N 1lnn288B`׮]0>>Nqq1qqqD"R)1r9 2<<bۙT87O%++ưZv YBQQˌa4)..fzzM `׮]B!t:bmmT233x>Nff& BvyO ^[[CP`0/?@6yQ|Q:Q5?&/^äޮ_EfD nل&J}}=###}znDرcǎ8fVx:ю?""""""""//@___''']D":G}㬬P(P_˦`un[hi E~ɳt:qD"8NFsomm 9Or%M"ڕ|kkEuD"f!H@?@pBE `sssMB9ב@ }<^uX'B0dkkk[I$! 6qycD"|?j|~~:ƾϺDB0|z$BH)pD~o/{}^jAZMq6Og}}@ \A|><˾ ?p0nkWBl6n7ܛWSdvv ɈG%㞅-:ssslmmm""""""""?%Z+ INNjfggIMMEPr pjkkijjBѠh< TVV2;;KZZsss\xKFFSSS?f)**ÇTTTJzz:RTP033j}t\tuu/:h4q5HJJBRQ__O}}АW^e``@XƍD"a}}J%{A.^bpjV}abbm?/>bccb|c:V pyRRRHII! c0{^> ž%{pTbzzrfffHOOSQQA{{;hZܹCMM}xxWb`uurX,P[[۷h4zD{UUI\zNƍ|>RSSH$͛7 B&OF&q=imm)UUUڵKV}=Jkk+ܻwrss%>}rpϿHX[[{jv磪f SO{{;~Ҙʕ+LOO>{CQYYIff&X,݋dp>|ш淋7|m7!99۷osgN}P]\\jRSSJb066Fww7'N j\t#99,B\x={NCC:YYYd2<& .PXXHBB峯]vaXP*n*++9z(R_Wˁu))) j#cX0L444`Zioogrr7|,bbbhhhԩSR[[&--%n޼Çzܻw;vpu#4Ҽr %%%s-VF#j۷"bbb0366ɓ'INNfvv,fffq QVV&CTOc߾}ꫂ"H8x ( z= ݻ")))9rNG||LRR%Gfn7<Jž}Hnll,ɴBrr2&;w 7QՒn_?~lǷ; qe$ 466j~:###twwz .033Cyy9őŋhZիBٳg_z s~~>'&&F>JRܹJ">>^Zzh4a|| ?16b^e#H룹4Z----pmFGG|2J /{GLL SSSH[na4jrYVVVp\rVۦ<66Ɲ;w|2uuuQGBS]]ÇJ={!\NJJ 999p=222p8D"6ץ;vLHonnoop8,//IIIu?Nii)CCCpN̑#G;vꫯ x<F>|RD=1@ 萟?!ohh 677Y\\NɓBVXRj9tFQxF333YYYa$%%!gm__ϟGT b||B?N(beeEpP* J NDL&~SN100 %CP`X(((N ӧXVΝ;w9fff~:+++ܽ{1O!ǩSXYY!0441l6'N`2vs)/}q1\.ݤs j5ccc\.N8fxx2;~lll,fW2==O j{<Ξ=Kqq1122BOO  r~ӟGTJ8\~(|ycbbdkk D8xn7gΜȑ#޽xdߏT*ER ѬH$B(L&Ur9J'|/տ"++Y0PHvDΝ;9x ~_pʄa * Hrr2=zt۸Y~JŎ;!55UhL~~>zxRRRh4x^:;;9r`YZZbff͑#Gػw/9:>ĿLgll ( ?H$˅h$55U0j5[[[w\B!>L~~>KKKdeeqaB`lGhdt:tXV9uԶhTAӑO[[v">>^VBR!H|>\qFR)U("66DO|qeo륫)X^^~ُWO5z-޽:BVp8o~677ʢsαD^^|D"GFjZp=>JJJ>S:l8r177 uuu 7C0dttGww7455aLii):N .]ڵkdff?t:۷o311Joo/DghhFz͆ERHssxőNfaamH$/Er\prDevI{{;/^t"ɄD#\Fauu6>V%>>;vt媪*{=QVE.3??#Z)~7nrdXVRT߹s/eBT*e~~ݻw3::JLL fU 6m,Zbb"G!&&JNN:F#### rqbcc1 T*z322p\dggVkL*=zz=;vFנFu Ty$ ۜDӧO`ff9faz;vN>-<sQRR¾}p:[(J:DJJ CCC=z2***Ç3<<~;, 9sg2??O||<ϟ,x$w}Ν;Gbb"SYYਔ匍 |733~߰Bvv6YXX`ddDHߏuCj5lnn211AJJ=STTDuu5'PVV&l6P(8>B7n`dd䉽\*Dww7###ܺuYa>LKK |ƿ7F D{RPP3ghnnȑ#qR)Z$@lt"ʬ%%% M LMMb!==׋ -- Ddll @vv62Y E 2RRRp\$%% $;;NBBkkk'RX?+H͆l@r9H$/:tan7$%% L&D"rrrz:Z]]h42<|o!5FFFh4177 ''q:bZY]]%11-yJ\ H1(**V+$%%!̳l288N#//p8,8 ߘ9rrrHLL244$!zލ ߾hobY]]ETbX^JO/!c㬭P(0 ۲K?@/))yy}tУ蠯P^^ R"_&QeGF= 1P[[<*4G ټ꫟D$uuuar9K @d."""""""" 3za.HP||gOH$+b~,G}H$lnnHHHRr?qYD"\.!qB29#B%Z3%Z!l|QD"R tm"6y,D}|xqG_y#:/6 O OmxC|}<~̗ȋZ"""""""""_g' H$BLLVKDS?yC72= =s׋L&ק'..onnWhWEDDDDDDDD^g[/gA|~ٗeuuuי@ 󱲲r=~?NSLF n8N1@DDDDDDD?ѿDI ܽ{ &&&HKKpϞ=+te{.W^իW~:dgg366˗#%%B7gcct$VY[[477c4+zz*++%33ӧl`۹z*MMMH$a</^$99!;; Μ9Ý;waΝtwwse\.d2aEhip8hmm%33+Qw]'!.]DOOIIIja}}$]FMM  tfZ----\vMH$BSx> "N   Vʕ+Op8Lcc#:3gɄB!HHH>zayV<}}}H$>|ĘywvJ8~dO}BNNQPPݻw裏0Lt:Ξ=믿NUUiiiד1LaXÇhZnݺŷm.^Ȯ]t k׮p8̤C=K*աP(`~~^N8&111F.\H$455LVV`ׯSYYɞ={ݻ|;!//LF0$33SXX(8.]0eeeR֭[>|Do~N:EWWHcÇl6>R$33%%%{v"xReصk WNAAsssp8&$$0;;& Fsr9?яG"oYZZݻ߿RO~N' J%EEE_%xtnj5  !hg/ZA"Off&N|rrrHJJB* OTD"! B@b2y{R.?ffqq׋^'%%E.XZZjgQ455"xV+uuu>q?֊ &''QTs-N'd2bbbdd2N>,333bILLD`NLL wfjjwFL&P/}|innaV+VEn߾>ݎV% 199L&#++ D8~\Nnn.(JZ-匌yyylll0;;V%33U $%%2*JH_]]effdajJ2 R)* ۍR$ hcffMIIIϳEzz:x<f^$^WH ll6"FL!*h20LBrɄD"aeeiIKKKKK 1 BnGP&jRԔo*JТM"6 ٌ񐘘H$ann222͡P(bшBrBd2,B-&JRxWWWJXV|>G(͑D"h4bp\hp8rP*8çYKLL2g$ hZ&''e H$R)z5?괌7j233q8,--VbӉF_ff&`T*& ǃdnVƲ$ LRtriixbccq\$&&233#dβAZZ~# s"""""""}> -S !jӌ,WWW)//gmmcǎ=*e2&陣nj<HC{r"y@fN5233_؅K$677}fD"D U*K~QDR|qa$ 2p8dss/Ftց<vIHHx.p8,K]"H|lmm}MDDDDDDDDD"aii L\2E|j<˸uHk5O_닸<5 J^~RF|xp8/28?ٰ-l68ן*yI|>t/.tQ*DX\\dss?rX[[{ٗ*"""""""Rt}>gkk멟?ѿH$^ իW"==Jo6HDxr kkkdeeq]999 s:;;rjjj+xFn7ΝA.Yz|͛7`bblye.^Hcc#P49}4&Ih贴įkRSSx<򗿤P(h7ovҌָr h4Z-ϟ;vKSS ᕙ o61>>O}}=ر:Ο?Ovv6zq ,..bXy>RI999_:h4GсhDVsUnݺd2Q^^Nuu5$$$9wL&t:wܡInn.uT*նr<{nx<$''c]__G~a!!!H$ +++466bXD(͛ 677'55+.A-{LNN'&9szfeL&l]]rH wݦիg\DDDDDDD峱ALL BFT*E* OȎ466RQQbAVs~QUUb,=*:egg@^sYv܉Nf(,,Ç?sm;v젡\NNNn^?N @cX8<DTJrr2YYY]Fcc#{} BΟ?OAA>I>A~Rƍ HнH7}>n:::HJJ_|2;wdΝddd)//ZZZj={Cbb6]*r]jkk#77>ٻw/D"𱮯Y\\… LLLCCCCT/cZ///JFFwre, .beeFuu5555h4y&T*oIBB^hhh 8wLLL}x@ohh@gg111AUU|>f3466288Ȏ;̕+Wx&a^f###*:::`0pn߾dbeek׮111!,// N |>ڢ%666zo~f;wP__B`~~~!EDDDDDDD`0'H+Jy(z@"Bdff266fĉrILLdΝ$%%Ȏ;eee!;; ^il6睛cΝ۷#% %%%eZj ƾ`5V+,A3RZZJ$!11TvJ;vE||ݻw@jKj%!!ALh42>>ΩSP( N }68N(,,qS\\LCCܿ2, 999( \Bbb"EEE۷OȔPT|/{FFx<HLL$syj0vf3r666X__gppfffƍo[CssspQ"pNlj'u@Kw8s!ZZZX[[;qqqlvvmߋ:."~8y$111->vM^^N82D8~8ZZZȑ#޽{cxx*\xn&&&Ekk+G%  G/^Z[^W+0<J%?_c4࣏>"99^{{o>())!##< }Tj'>8---\.l62 NVeqqU$0/Dž t?`ttLƏc0 ܻwO~~?$''j)))ng~~~{<j5ddd C"ڊT*% /t, dddQ~Z!MIHH-k&Ub4avve^pJJ H$666Zdgg9>B@Thַ2RFFF_8N}DBJJ YXXXR)rXV+LMMoILL FJNǃ9R)~_x62331ͨjF#JZM||<211~;hӑn!.Hp8Bp8lҪ֐JhZX\\$998!j4IJJbyyI8`0Д-zzBf\/шZfff+Dcbb:F0DTv#HZt:QZ& 1??T*d大zER1??O0$55L~BAzz:l64 HL&.Kx D"xdVKVrlnn AP P(3;;Koo/֖lngkk 2$%% /+p` cZ\.1~<FQ/,,RӉl6 {qqBrP(űR$66F\\~X!y#6 L `ccChLҒdBJZfccCFQޞ"ԼD󱹹A*gccR``kkEa>p:`2PT`0X[[CPVWW`}}cǎcǎ} jLg6fn7n8]^lq]DDDDDDDDg1Пh,Hr H$lnndY[9Zh4GS~~Wc\.oT@*RQ$ o_{Lt\D{r' H$"&/\N0ܒLRLvY% ri/kEr17m_&Y(˅ZL&C"|od3Qg—>766j/5}ccN'HRR WEDDDDDDDD^͑4>O;ƳHv{|{QMOs}5F5G"fff57'Oښ eqBsssx=== cٞ><|t:q8BsςfE^~Dp8bllON8fzz`0<sss?fgg?uF"|-~>/:n1gm< BO<ϻ:twwrbqqqqtvv yoD0|ٳk̊|3?ѿDko p@xT7n8Nrss9s ׮]cdd\fff裏hiiAѐ+W󑝝D"!Ptuuֆ`h4>^ u ^,//[o155Ν;Y\\ܹsȠwL&XXXFFFioo' a0x",//#Dy]..\ۨjZ-~!޽Xjkkr >d~_v),,d||w}Z߿ݻy&gΜ!77WБ[&100 E`>^Ǽ*׿5kkk055ř3ghjj"&&d*++~:gY\\bO ###ܹsD^S8u͐XYYooth4.^H]]nlR)?#Q 闙Vz&&&P(BWܹsdms"_,@`0-eqqӧOs%Dx!qqq;wO8F|b}W{?+++|466Nffnٳdgg3;;KZZrعss_g0w%>>rjׯS^^ 999O>@?A$ommq5?1vsiP՘Lmz|2555,---n"?o ܸq'rqM233 ppMEE嬮><+.\ IpUUUaӷ}.z]Q㸫 ^իWIMMݻl6j5ܽ{8 ݜ;w`2`bbseew}]v ㌾VTTx(**_Cvv6\pF~~>֖h4'a}}X@/*=ΧH{:EEEQ__jETR^^ΟٟQUUddgg+`6Q(h4Dğɟpe fB!XYYÇ?$*^y<ϟgjjSN=W@t~ijjt~:fawwwSUUl6SYYɭ[(`JjkkfΝlllp%Z fhjj͛\.'++ /]Dww7III$ Ν;Goo/nÇsMjkk|$%%qikk#))fn tFFFFp(Jjkk1466r-\.B6668s yyyT*z=455ىNC&q9ۙԩSQYY)HkVVVjGѰ,,//#J_MM GÞ._L{{;j>#:::p: /^4&''pdff 2555LMMONN\xIWW+WpFFF(++ctt;w%533̌069?S_Nbb"G<2x l66MPHikkի<|-z* a@&Jmm-~Rɹsc||NvIKKp0772vB! {{PԐE||ʕ+ tuu1<rssٽ{7tvv\~TTTܞdv;"R".],Pݻw388HQQo͑|L.^(zioomooo=팏pBq8oDg44# Qz-|A,XSꢡ(^/=?OIKKD"֬Ywj\.|>^dnN~;F xwٺu+%%%̾kkku'rs}8ԩStttMtBBw]nܸᠹ'N"Fظq#[lڵkB!lw)..ƍ9Zݸ\O\Z6322srrHLLp033#s ٳg^{\}Yz{{HJJڵk FJΜ9Cii&N(+WrQ***PըT*t:FV{OhӧOs-p,~ӟ t\r&Z[[YrgHD7R~irHHH 77$Q0??_D3( z=?}P(HJJ"%%p8Lgg''NFM Ybzl233TTwC$. BA\\&Ӆ?1VNG\\:DHKK# j!==vZ/^ÇikkCד0Ǐgff)$IBft X|(*ln fn'--mBsBbb"vF^f||}" f3 ,@a0}("G8 ^rJVXAmm-.]"cZb8Nimmr111$''GYǃlz^$, EEE"Dn\b9f1穩F!kz^όF#O<YYYBjj꼵Vll6 HII<mmmHDFFptwwSWWjejj ߏd";;4HII zo=wpχnJn333#}l6Gf 1çE N9Jwd믿NWWZ·-G!..%KpU~_a0())a"f .dŊ//deeQ\\|s9‘#GX~=͖-[r 999lݺcǎqU֬Y$IٳGxg|I 9uvuω'ܹs_ׯtR}q̜%3kZ^bccch4B__LLLp(ok֬ĉxغu /**"##ZFFFD",]QILLh4B@\\XZdbڵ;v1 $o .Ò%K(--JKKcpp#GvINNE}7իWsyz= BaPդd^yؼy3 %_PݎRHբQTL&,Y‘#GصkNSCuuIX,$$$PUU%$ _ Bjj*vpVUVkFַ5O&.^墸"FdQME$VZȈs#c||Ξ=ƍE ƍjǺI0$&&bXD4ڵk9w0ܒXf8 U*$''qF>vZ 'N`0 ޽ 6055%|JٵkoYv-IIIG?bppϳuV_㡬L 122B8FaXذa 1S"T^Nhll)o###RD>JKK۽{ xGThdڵ 2r*K΋R ))W_}P(Ŝ{FW)ˣdBr3ϰdZ[[կ~la0dffRYYɕ+WBԠT*qI^^"499F#n7>,P>~iqFN8A$a\|_WT*VX̦$J3<#RHnܸʕ+ILL߯b+ yq7;gx6MvIDATi~ؠx^()))zbz%..Պb`XpXVZ-iiiT*\.\Ꮂ_D;r>Ӣ8>OxV& BhZ222p8")55U ^SSS(JAJ399I0DTA IIV( Pddd Eei$I">>dqIߦ뙞e֜N'z^xx 6 ۩%KlFbZKPSscHd3c2;r縸8N'~E8#1W&<p=huO%IJJBшy<|c)$IRro|033#R ѨX[^dL&NF||OZi)JZ d2D_SRR>`ZINNMLLt z=IIIE,=C$%%9D"t:L&hR2"{kZ0333|(IjN0vfku^ LMMġ`0Hի B(J!$''xFh41^. `6Ed$ J  ##ߏ$I?fߏj{|>/y'&%%P(̌0:M&vArr2 BkczzZEt:-GW}+b0:#V+dcqYw>_pt:IMMzqߏZFTqq\ FeT*qBFF+@k1aa={5$$,+w3?>@qI,XpcvsQx;] nܸ"Yb\B$N8ҥKLNLzf_^mEQ xG ¨5j6l@^^nH!b!nZ͐@s`N5S* n/jVGoFF~+PPΆg"!'sjQRuB% Iɮxb!/ v8}=w*F_aNQ)J\s.g'ϢR|V)uuacFC`Q`*ęO-' ͙i63AiVٜ:B>;D(EEd297ysb!b!JOsP*P+ԄaVRITbi8:˲T(Q "E BTRH"JB9;s5*l]B$.Xc %QfۨT(gTyݐdL¨121/STϓ-'ϹZO)JD E%TYkJ9mcX? 'OJC~B>};dvzz):FPPPw w}d'd|E S֑kΥ{Oaϟd}*0esujzVE#BJMJ5)">K% m].ثGwQD:^̍R=>"DQJ Dx]<11ϘC 1C _Jiyi?UUB>:Ĥ{x]v6g3`ARRِRCp#}>, S/]~iv?w#AF|ߪFcǸ2v7 x)*S*.xFyʫdgTS$V5Rvr|CWhJh#NtD)K$J f^Xl%GY&9 HKkKaq씸 T<8Nq]$ᑢGt rW BhTjM> 0̎Vy{|;f/y lsϡUiinɷE./*g-g7Î<[,q;ťK&l+;ȳt:jku¢0$D>'˟t}o G8mI2t1U?,0a6O:QH `=#W>+IKdHx֜t g4r窞Rg7v2{%˳ő;sy&΂bL!ݔί~--P3>ͩK>:zl=Y?/X]GA1QRF5~1݁V$x$3gś1L=Ӎ/NfӸB!/iqih߁Eo0}!> @?--zl=YJȭ#^ܵ#A>+69t&8MvRO0dI^/,|"Nj_aZِp4̞{9뭯SP/sf|3Ba?S%$s n5?]Szl=,J_DV|g2w=}W@ 1C 11{4UUjѫtMwQRYkee6!ƈ} I$.]F\s' xP+ԨjlD"ƜcC sI~#՘Jt]]zs3uf 3B\c;qP\Jt΀ v]xX6o`?(JcM&g [="L0@n•/k_# 1oϤw/>\x"= Y3g >o=δgz*,H_@X3)Bf|&gΰ!oy y'p8NNbaBR )$P[KS7p|댻imLxR- OZSs&\nrr:~i4:/1F041^f|3%QXHqb1ɥd2H4$ohH#By y^g_pi%ϒGnB.mmnQ _eG~;uuzg- oG+6y~1dkևZYY+X ק^{dsz RMSxωHPT;y y8}2JK(O)2RvEV| S>qftLwXchO]`ARIs}c i C!j#Z.k#-[b1?SQőf|TTkΥR@MF :r,Rnb]L{ɊϢ84* %Khnqpd2Gy<,kRN#N7r9DOgߏo6lBY1IVe"ǜCQR[Jpv,QRȈ@q(S)&Ыgm{fz8;pc3Aү yq]xfLS\Bdvo˟)z pD}"x.\wdH4ҤRq/}w~B1{9 ,,H[FaAn%_Қ1C 1dž$I"'!+~k˳SX̪UZq8Z#& o˅ hgb4J &q)bS=s.tfJ#٘L$~*o\yj9߬&;o#SRca۵mѨ5[´]˺unmcgNJJH'.6F8NZ#J)SSGyJ9D1|^*].- 2 JJ1 \B`C7q\wlf|3w3hd9Bs$Acp0흞[`=Δ{6bLA$0HքQct8x%WŸ, #?RMnB.J5khn$nl>)Qj߅Ik"-.m#$t*qȯithUZ jzRC6sJ jk٘GA0FLgaҚc31WpO0  ~ [ m. _<}>f.D GÄaz{ge1Zy1 OQ(QB>j=Q)N#`Zq8ƥt }zP$D 1`(5<#"uVdem$H)BK!M#MB>l{8M! . _譣Z ѫv ;{7=dVWlIt'9 9;RM14H5QjЫt I(JƥVaĽ$$ ;s1`3AcMxc7ÌoP$<3cPH4$ 1kvsmICtDQCv|6 ҿ;)I* .^"/!HMF w#vE)CfxqJKQa 1C 1Ƈ) n܇Ik\FYbVg8Nl}l.L9JÉ,X’%5FP'3Xc܇'D'No8}1O~B5? ɐ$8xYRx\c|ww9}[9ueX,SC!~kLZHr9l.L.ơF4* ?\Cf|3l)΃,\c]Z%K83pB7Iqb1T<Þ{9}~ فhѣy"#|ǧ%?d;Jƾ}L> 6$ FD FDvOȃ>ug+,xm,ϊf7̆NNz'Nc=Xt'os7nE-zSq!( xttdLBҡP(l0Ɇd`ufJ5h & o  ZHBEo!*EgI ,z Ih]-*7lHVR`!`1 $|8#H`4Z&QZ ClB[[Fa?Y^' v Kȣ,(J!/*j6@8/#^Fa";N!_$(/"CÇ0L" Ikp yP+T:W-xC^Yy4jk"&'O3B# FC$A}(F1̒ZQ)Uv4J Z7[Y bQjA,z8|a4* vlq#ATYviOȃAc]J-& φN#^# hڀ7r1OHPPN~\>5zS4yPjTVƦMg2& B7A!/x](h[f3$yQ. _ ,b!b )sDDՒ4Ϲgȉ_e L?8w\pa?~|7k.?7 Bs|A0㙹'y9l_dhrw!6mwSe|"i΁7!|0OőmFA} vĜ~nFퟅaA?2 x獱x2A ̟_Y>;dn;ϡ,*+0e^ isG?e|a۹DϹ$"R$ɐD9{v Ss#ph,"ѬuwˑS7N&ѶC|o }i(Q!3tIe.S4/<;E"+6T:us4p0# auw]gVK }w:>GyQQ0o޳b,!VwZb!b]|Ahl/Q)J1dc2y4)/3!*E2~KҜ:s<=_vD()tip-I,u %-is}l}{ʩ}%]Ec=g_1oQ6!b!b4JQ[t;04^/^GJRʧU:cEc4O(P0=3`h`rjKV{_F$-5INJC 1C 1@!R=+UJ4: _$4 pcViT/jVP$*R4hg<%Im_}jT_nc!b!b@V G#~^y4:h4a|>>o6\$͒C8|yA~xN8& {$Ia@ % B uq4H$;] 룞Qy.3Fbl^/@@# λFѹr7 011s)U$ʕ+477ϹZuhTiWW.]qchh:&pLʲ;W&(vSN122D>Rsi9}4\|9y$VUm8xW|RD{EQN:nϟ7uYW.}}}LOj.ʹ2с3_!ىnƍC͛;a$ׯs;wQY {kˢnz26w.BG]Is{[oνN<}1C 1 OB%Çٷo撐fB ??;vpW_QZZJ?vܹs"\x۶m8qIYY BFa^yΜ9` ;;whh4ݻ{WR\\Jgg'˗/gddz'Ob)--'33L`v/%%%vׯϲi'&r1(//GoH\\&7|={l2zh+W(((`pp_WLOOpBzzzx7̙3TUU{njkk룢Z=ߒ$DfsX 0*\.iiiEPe>8QT {QYYJ"FWW8ZZZؾ};Νd2믿ΩS#//p1vAjj*333l۶ .ba߾}:tP*n *J߿OQQWۍ4[IKIlk9saimmߦ<>>22›oɂ HOOƮR.?c.dYe%!3sBHtWFryVXA$28T*Ž#*J<; P(8s ߏlBs0 ۷IJJhGbZ)++6c4F[n˗LzRRRسgGtRRR$Ǐ!-Zh$+#tS[[磸X\Fzw#)).TWWsqBY;vЀ` %%~C111Ayy9*J7J|M.]$W^ɓyzzzx뭷8vOf;(JRSSٹs'OFՒ̛oѣGlQWWǻ͛7)--E׋V1BΕJ%333x<._V x7t>PST 9:xxשk\͛7g&&&Xx8w'&&x7())!''g޺Fѣˉ|oY掃>]7={]vqINNs ˹my\A#suzettݻwSSS#޻sw7699+B}}=pvͭ[^{/M$'999ܹS}*++x"۶mիayW8{,F$|M9j&m˗)((t[oqa)//ɓ\~RFFFxWihh 99^k&y~~>_$v-`0|/bh4*SsPTw4M&֭MUUGlj5uuu_%$''sUٰaYYYa4qlذR صk7n@߹s'III_{f͚vnk&$$~zΝ;JbѢET*nܸ PՔPVVƻիΦT z8pnjjjB\| `0bŊڵ2Iy7ZXRIMMիW7 P*r`$&&zj~ 6ͲeصkUUU$&&~+ ^z%hhh`ppG&w\x&RRRx#r1m6D"ݻ&z=_5еZ-˗/'p%8<8|0555]r._ƍٵk6m"99'N`0ػw/WT 0%IJuujfqHh8v$?ѣG)((^#//E7o?~'OdN8Khmmb҂CPp!JKKF<+܌$I\r:)((GrYJ%{SXX8 ϟg׮]GAA0"qqqٳSN!I߿Zv;.\tFFF466RUUE]]333tuu{q-222x!##FǏs!]FQQ埻),,$##k׮!Ik֬T… HFa׮]tww366`㔗saz{{q:pYyعs'=zÇq۷OW ppurss9pܸqj/_Ύ;9$''<͛7a۶ma-[Fyy9Ǐ'OsN*++9vuuu\.󩫫cbbK~z~?~B~ߒí[gTTT΍7~X,:tG(--ʕ+zΞ=ˉ'|2:@ Mww7466r(,,сb\r a*JZ-o.]bpp 6pyŁhwq݋hСC s).]`޽\|dسgW^%;;ݻwBzz:Nnܸ;wvcZEhiiFh^^O&-- N'ںfcҥ~Z-G!##pIa444p\⋴puڨ'??]vDkk+&1&0007HLLTTTp%zzzr[[===<=z :O~.^ɓ'yҥKLLLFٺu+{!..:z=Gf100@GGiii^{ZM{{;g&ٞ={xpMbb"ׯh4]Əc8@\\G?pE-ZDAAN"322 /;Xx1\|F#oQT^ZVC 1bffMMM /_vj* SSS$''Irr2333<h4q,o:Z-őLkk+/k EEE qセB ;;1(h4RRRĉd"55W`HNN&>>^ӤRVVF$!++UVqU^u YYYܼy,ِNnݺž}PդHNGJJ CCCINNFAz*7nDד)6FfÆ L&v;?8MMMtnJww761x JJJ$!!Cʕ+ٴi'Ğ={{{JJ *VXArr2>`0J, ܼyzzz&;`~P*I]z^x%L I999A~_P\\L^^v^zx"}}}h4jkkrʼ{TVVb jjjuVcǎ188f;/l2ڵktQYYɕ+W8vmmm|EP044$6ȕȑ#Ay9<>11J%@@Dl޼N>M(tQFt:jBZ=Kf67 >>D+N&EQ$$$˭|ȣRD"uVy^b[z" +d@TB>MKKOLLd||\H%$$aFJFȊLJŖ-[fQXXHnn.333v\.qqq222Xf W((J&''9r@ӉCTW*tuuYd ?0###Flx<rss BLNN266& Y @ՒIBB +FP`ZٷoN#VP@ ݻࡇrn6yᇅZ,TknGZ;_ZtR8 p.|Z-Jχn'jEшHb/_3>Z&;;Պnt c_&))DQTdggp8a zy\sS/C 1×/#6]=˗/GPPZZ< Ǐ'==7ra:D8f֭\~;wΆ Bt:%vbb"gϞ~X#~ȡ*_׌p8̶m"..@ Verr"Ο?O]]ccc#xb|>k׮% }v.]ʕ+7 HDx.]D$3gƍwޡ… q\"nk.-,,B***__$q󉋋VtwwSUUn'..tFGGD$VZٳg~:]ҥKZEjYz5׮]jl2FGGq\dee #GP[[+r,X[vlܸέ[زe >P(<ӔM}}=yyy"AqOHH`ttVYh݄B!B!.^(>+!7nMMM,Z>INNfӦMjjkkzlٲeavd…>}^ټy3999466288(Bͼ///'77#6˗/fq9n޼)IMM ]]]:u|RO.]Dww7>8C=Dee%Oh3V+233ٴin#G`0x'HHHȑ# Ο?OKK Wfƍb&dСC\.|I9uׯ_gӦMZ7npJJJxGPT:tO>)橭|իWBlB ȑ#D"z)2339v===<,Z+W@MM ˗/СC>}ZLMMb!>_|ATWWxh\\Ó^dFFz=`ǃZd2xh4Nd2SPۍ^!0LC;>>>Vjb~eLYIb幐~_h$vj$QA$7F"_RQ$t: qs\b-wtt099ɓ'7Aii)^ <Arj+`@׋jz+N^vV?RAףR!8h׾v:y?/֔1ZjyzJεTJKKECmm-|h4VEj5:Nn}!̽-$\CT /k0DVYFBA0,sV(B}x]Αf/=tq۲w&_P(£I-{s=@OA\\*}ѐ$ Ӊl ̱뿜zCorʽ%ybuWC 1dr;>@å%%U"/o%$$^z$Ac4h ?~aJOH!&$$|y1|[ 1C 1C _{5TR}1e7Yαrze6ϻr qp!1|?C 1C 1W2=]Q_B!A2wc El`0BߏR%ThPO$$Dr8lhmxIɘh,26I~y-B!1wk^GV>zB!H1D"be> Ayqn7%%%<ۗ$K$e0P(Bf *JȇNjZ|,#1pׯSUU%b  \k.L)|hZAr%:Y'dfsl6***>2y`  @zz:N&(qM)**H YzA^*Cw<Ʋ!b!b2k… 䐘4Rm۶q⥗^!JKK`޽w̙3 PYY)X~^~eΝ;Zr^FWѰg=ʥK(..fzz_ܼy+W2<<9}4S[[o~233!/~ ʰ?nbrq:;;o͘L&L&o&;wdʕt:vchnn&??a~_199IMM }}}?~'O`vɓ'줪 F3߲Yُ͓^TqP(*A0j>Gee8 BrH-̎;`0/LCC]]]paN8o-jپ455aXHLLdΝa)++F]x}!}uݘL&1r.|#I0b۷o| \|.&#|r~y8ç\fM6eYTr v+W(--eddW^ydW^ĉPZZٷo7nܠ7n_p8LEE˜={O~~>۷o12sd.LFtkk+.]bBeH$"eYLmm-۷oh4299)ʥ9rSNg-[hɺ( B[[:,@ dꫯR__)--ѣ[oaXP*K444jINNw(YQQ3c!b!GIIIlܸk׮xСCܺuJ%gΜ8q\~l֭[Gvv6t:ۙfӦM311ASS> :nsNxٽ{7k֬^APjaΟ?ZNǍ7ذaZJٵkWxSSS),,pYx1p+WZZ{R^^Nrr2/^VVFBB466z{瞣ZҥK|LMMj*Yvmܸ-[޽{&11Q[Poo466:uuuqqqkP__OZZhZΞ=Z@ ޽{tjxFUV hnn&''&R[[˒%KX~=ݻyIKKNǁXr%|]8y$W^e_n6x^__VK.qiB( ~߉… x^ 1 o~Å  ¥7xD\Bq_`o͵k?wΝ;Gii)7nd\z~:Xnf_Pb!b!OOcdLajj*###\.-[FSS>e˖F&11<#$%%}vZZZD]Ѥ$ ꋗ+g#''GN4HKKIX`* " шl… ,YBBB¼ǏAQQP\z!nݺ/,H+JAzzzj {nJ%IIIbZ-_!j$$$pO9ʕ+lܸVKJJ W\!??y}F#B ੧q&''9}4<쳌p8<3Q^^NBBG%++իW裏rA$I"11wD 7odڵX,<oX,^Jvv6̕+Wf``ݎJbLMM}8J?!d2µkF˗/gڵygg||<=n'#QH8'\.$%%144Y~}?$K]]$QQQARRG~WD"$%%pu)**bff222D" Fjj*& y$b!b#Gׯ_w'k׮9s * 46-ZOU皛ٷo=0de&9rsωPM iooʕ+׋͛7裏266СC\z^xшf# ŋYj###"TX~1˿Kikk>7D"TVVk׮|I0ͤHFFHD$aɘfΟ?OssJH$Idggoe||W^y n:0 PBMMM]B׿uAEE?0Ph!+VE׋`˅tvw5x> HD~~>}}}(J233pzRSSaJba˖-D$HKK#11L, H*lBcc#uuu}5 Iy:FFF&##C>99)~?cccnHIIaddIBBW̐Լ9vWi;j.dJx|h4O?MNNN[dihh`ɒ%<|>>L||<_׸u`ppT.]JKK .]bÆ lذI;FNN6mb׮]fI|$Ib֭Ajf=>Nss3fx7)))s {1VXAww7Okƪ'C 1C 7>Mf]狀Zx3$I̷Z2[Jt:4 p/JFIGy̽^+A29vI!qqq~Av$3v|> * FC DGFQ}C0*h4GP`0<&r޲읖*˹oIR_2)R$>NRRZVT*Q`'O&,C$@T /y.jgk.|%[fHHH 33S>( Aԥ~ǃ盧0zR)t,u<s=Ajɂ v8NZ-IIIh?@"qi1@c\x' rJ222w?1'B.]$YYY,_ ~ BLz!b!bAu:=wP2x׋绣z92..f#,`0`4`-ˉ `XK? '&&<_q( <~sb!b!m{|ۇJ (_HVhauo9Qp?CU*Z6f@C_1C 1C 1|`cqOKKp8 + P(@RRx<8AAZ d,0`z]I kZ|>(#oN F\.<F5y<j7n}a%d~rt:q\>S__ _:_&ZTp->r}%~+W|w.t:yB%dFAV+uuu OŬp\Bݎv.\Vٳ( ]0hӧOyA]u|CzP&{FVh4:Ċv]`$IwKf$I" r5]/WrPtvvY(ŋ! > HMNNGD~j:]FVV=<H8vxFQPHMYn?Le$r=~?N%k=zqbϕ*I.kb5s#俇#11uC 1gOC8v deej5>Ǐb :d" JDzz:*Oj$IBVsMm͛7IJJ"K/qy^/eee" @>D"n(CCCݻ'Npq֭[Ǯ]8qMMMdggsi 0v NdjjEc9B[[НSSSFz=~_9tidffFn#o&D"RRRpݢʄZCF}>v~+Wq}5~_1==MMM@>乐<0qQΞ=Kzz Vy Qx^1.rd9r_훜QϢEސDD롯_~˗/OYYuuuS]]ͅ xwx"YYYx<^z% BdeekqizzzX`ǎc߾}PTT*t:f3/S^^ݻ9rW^ׯm6.\@rr2/" 8N x뭷8~8,Xk׮orEنv;۷`ʕdzm6J%/ob1C  t6wt\睘 3 z@%e׎퍳gS:99IN&lq,ْmI%K(Rbo($: z fL`{w%KdsD̽ovIvv6gϞe||D_S^^Nhh(===DGGuV E*ގbrQTl۶ Xy@?q8p'ORZZЋ=>>;wR__\.ٹs'j<֯_Oii)ܹs(X\\ܹsblKkk+eee̤>lqAo~b!//,z=444uVd2gϞ Rزe .YnJxx8۶m5MvBc4pׯ388HEECVyhmmX~Q]ƍ7|pI"""X,|477HJJ܅(--eyyVinn_:}v233d}ZLyK?KKK(Jz-"##9w7n`yyĉ'fr w-^{5:::d޽L|BnիWiHII!..tdeeC]]v]<{<z-&''sj .˩SH$HLL( ɟ qqq9sqݜ;wn޼tuuŋ bJKKyQT \xZ[[z*n"..7|7a^Jpp0=ׯJIOO>9lBYYvL֭[xǘ@T233CKK^q #**3gv\.֭ JŅ  \b*++LZZZHIIΞ=ӧFp)\ﯾ* g\B||S0L˹sl077GEEtwws5ڈ .(nܸAvv6׮]cvvJ]T*Ν;\xVéHll,W\!66V,kTT;wL^^p2ҥKXVꈉ7ߤTb᷿-~;ZZZhii7o~z^z%:::hooGRr w7?.t:gΜ!//W299NS }6><v5Hxx8o`ӦMH$&* RIee%%%%z4͊.]">>DHNNѣLOO+x 4rAш DNrVo8HR4 ĥ%ZZZعs'p֯_Ϣz͙{91 qu׿dbrxgYn,!![rΝ;@XXM~t:, ޽NjWhjj"))d֭[GMM LNN2>>f#44~AAA 344}?_^dBBBoQTTDll,sss꫄x"::ZW<#''[efggٷo%%%c0DM̊z1LX,֯_/^Kdd+=55RPPѣG)))СC߿9BQQv***S?$99@ee%1>>ΩSXXX >>(1}jj* \v.:::OROٌjl6n>mE"##Y\\H~OOOgӦM>,^*T*.+Ll}>ZV+ST??B@.3??ϭ[x'xghkk#&&tl2CCCnEbI9UբΊ###,--阛#::Zͱ" سg۷oEzz:ImvIii)IIIlذ 60;;KDD #ɘC]*\.H$:;;d2144Ŀ 6.ʐ"((tbt:/V#\(+JLS驩)N>Rk3ͼi&d22$;BF!èK׋D"jǎbZJ$((H6 x<J5BP J),,dǎ<䓤o233Z^Q|M{1RSSCCCX,n˅A*kQPPr\\"## cfvBaa!:J41333(C, ̐Jbpp+MR)F###8$&&x9LLL ARRxYxHIIa~~ fffHMMEш _ۍN @X=**wLLL`0 l߾FCNNeeef._Lff&۷o… \xZѣGɓ qvͮ]%>>RQ @WWG%99+$zKR^uL&vo311Bpi5/333sJJJ bΝ,--;ξ}ⷿ-n[u000#Gwޡ*VWWz9t3g099Ipp0鴶'ORYYItt4CRdLNN~zv;Zhfm6}6sssܹI^^Nqd2zbqQM˩cii JQQcccܼyvڅlfff}!ɸs7n@V3ϰn:&&&$77m۶<---X,s+\b &===X,oJAA477޽{h4\t GAeggS]](FQ[7odrrP E  $''vjdnn(**BTeegge )) MssbPPPdppq\. ~&&&رc+66͛7*ey&j o.v9B&qqqX,%++}1==MGG"wcΝzGWW111vYXX 22V ;;I222lTTTvygٸq#SSSáC Ɔ XnIشirA/8ڵkL&222$33tJ%.jn7n388H__;wܹHRRRػw/\x(>,ZXLNN&%%\B ++kv8RRRĀB=¶mcjjinnfttTJAA$''VQݜ;wIBBBX,(Jz)HNNfQTTDhhB`,RSS$22ZMKK VR)IIIvyrrrqT*|>.ØL&JV9IDATѣGimmeǎ Q]]B`ӦM)ȍF!66Y0 $&&&tii.P:th8x ))):+\t:ioogƍ۷ŋIJJȑ#sEv;Ǐgݺu455Çٲe 333\v7F.\/-SRR~:w' //O\mΝ;x< O!r&4]!Kiоf{|> P/;55^ygIKK+ 8IzRSSE|-XnX1F#Zu։m$qƍ0,wG.q'|Qcp8DFF}(HD-J%DEE,˗/3==K9 ˍA+jV?W"^ oAso07XQ.,BW["9 "_dTC~/q_?ljTQc w}uƿuӿk`- uWB{ !|oo׿NZZKKK2HLLXan[~ɇ0?IX]k.ʱz?sz1&ȆY<@|T" {_hWL_5W(|i*견8߅ }_8ԯy Z~PWu?!**#GF_ģ`Zol-yok? ޳V=2.//377'nC '|[HC(I X" ܅e_$=}>\~Qdt-??m]XX wsVn5ݰ<ݫAjX=|ue9x9suZc~%A2QsZ߿-.օʺzYFa>~8577'f"XkA$r>k=cu|#@=9s+$hyyFrRQeA?+, Jsjڏ_|X5k(4C >s|4 @_J4肙yaq8bߧ!T*!!!k5Z=8l6 GXX#8/v!; @r HT5@W}h{g|M\? *L>z cQSW6Ok~  @A6X_hl6FQT+3"W ngggdr1nGVĜN'j,f+F⾴$[+̃+ , sss|>1mT*xۍhp80MMM144$rQ__OXXؚd2!H8s{gd@@&)uY\\aZGf.A1;;KGGKlgaa1tbb^%B`inngb0Dvl6CEX6 tvv~2rĔ}K?]]AttCIww7&Ykqhnn!P`Z9w6 7PT\v K[[###XVnܸAHHXVu>WN-F[,T*Fbbb{90Ll6q~Z͉2|>v%z^1MZkܹsL&hjjB"pBBBhnnf``x1vRG}}=z.v3==<R)[XXc2]lFqpb~!Z[t~. ш<77/CBtvvp߱xp85(8NW@}X|>^ +ET*RPH7߇ٳH$ZL&Ο?8&IRi kq\bvc`0`E^‚b0b`Xĸ0A܇ {%A X&d2q/x0,..ޓ0@OSYYɍ7%**)~򓟠P(HMMWtvv/Lccgll˗/s qq*F荍;w7n H2>jIMMeaa^z1eɓ'cpp\***~F||<|?Oظq#ftFO}}= B__oh44 ؾ}; _HHH`ffdjj-[066ƙ3gݻ ~_qyvرbRd͡żB_* ~!2g ߧHRR*ܺul~%4(fqIh4x^Nn#Hfjj>ҵb}tt=QQQDDDpikk#??\{ǯkvڟ/]244DEEb ӂlzr>B{T*.' ]Ht:E_007غuXO\N}}=333lذAyy9 ƮiIxgyy1g.,,m66M̍;۷QT[oEEE---dee~.K__eñX,L&}]mƕ+Wh4+5yd2UUUL&qBx_Hz=.Z+Q__Oaa!Gl6iJJJ8}4 Z[[?k׮Lnn.v]r 뙘 ..ӧOL&CP}zQ*466r ZZZpݨT*~_ ֭ߦ&qNX,+dIx.ᥗ^"44Pb~Y8***8y$&/--Buu5R__D"ArJJJ|Xތ x7y&Rv; ( /~Agg'qvn2*ZČv3gpMx aǎ;111+444CNNgϞŋ455Jhh(7W0JjsD"eW!B`qq)Feikk>Ell,.]֭[˗tb(a2JHR୷";;Rb>,}uע[n@OO6_!l]]^pHJJ n^{[nvIKK[}b~~^ .066Fii)>O/~ %22[neVp(f+q\L&qEGG:hkk_}Vkkkyebbb//p:dddpN<)h4:u&1bߗ^zSN͛oɆ 8u 0??OFFF/@O'9?Jl<K~z***j,//,۷orgÆ by}󑜜LFFƚ76mK.޽{?vccVۿ[9pO=.\w]F#wfc߾}twwyjkkb~[DBjj*hZ?c0XV233D200 4'''9v׮]ctt={pHOO9}4jTXM&<7oD"[o~z_'?V˦M8tNRRRHLLD&1==;#!..{wwlذ7Me$33ٳg9x rmܼy͆Nctt#,, ͝;w8q Ij5)))ܺu\fffxH$lٲVKMM <3+ҁ.]Dtt4/D[[[jx^q\t:~iЦMhoogll>ȠVL&cll^:;;IIIazzq:;;dddv Ν;)**_oرc{x<1??OCCV{ZmFtt4xhwuO~^unܸA||<555l)fffRPP`T*19s[RXX۷( ۷SUU? fh4x< tvvCvv6׮]cjjj9}49sF\lقngw qixQ*TVV2??O֯_Odd$W\!**|Ej.^Ȏ; ﲲ2J%ϟ'((__R__/^d2nƍˣ:9Bii).\ѣGQ( w7n022Brr2l68kVéyfR)$%%qpTUU177WrH$pevARR'ODTchhh/z=;w_:7l]]]޽)N8hdzz۷ގ餵+Wk҂ ##CT\t6ny7N]].7R\\Luu5v{]TTĻ޽{)++cnn6!!!m69}4O?XC---( x'ַEdd$?ٳ,,,ydeeLww7}}} P(p\,,,Fgg';Zxq @Ϗ8VKgg'VRpݬ_%jZ?~\CPƍ%::Z<оBOHHtvvrO\9NGSSAAAn5/_LYYaaaj$$$n'99{+BVsU233INNԎw>FVs &''_\8ZZZعs'Fׯm6 |>s1==MBB3qpp 6AT*N'UUUٳj5'Od``+WTVVbDGGz_<,Lؼy3{!**J4|XQ**aaa~zt[lA./AAATWWS[[˱cw8p)))ܼySN7n`~~b>/fY4]tw{)))DEED[[\~o}[hַEbb"MMM|jd2+-ˉ#&&J,T*xſtvvreݻh4nV+ᢆwn`[n^]4Ouuu|G Hhhh ,,2::L&sן>}pW_}:N8ٳgAV鈊jk.^}U"ܹs%6mZs|]]ZGjIIIaqqf񐐐@pp0FC^^< tvvLSSӄ?Z|vرcl۶}{nx)((СCsN{1 8z(O=aaahZ~ibbb #<<\Ԕ yzxH۲e \pǶm8~8p]ve:DLL̊l6vsUHLLł {;vPUUEHH,--Q]]&// 155=!J9s yyyt:ٰa\t ,aaahA*crqqQl[GNNF.3<<,Z uV{1._<ܸqz>HKK\pRBʕ+TVVg;jE">rj5&&<ZL&CP__Opp0+PTT~jtuulٲp%n7\vMTS/FCRRUUU+>|\vSOQUUŅ HIIE.ut:ٶm՜?)r9[b |'==ŦMؿ?o} JwwXVLFAALtTVV܌OOjv, :NLk?z=X,W^>+WSO==;vLt[ III(J"""h4ϋkoAffX bzzz=2?u8@/:<{OCCCSSSZl6322h$""8 d2a2tىeÆ lڴ &_O\k׮qE?NXXp~ii ӉbW^A"p!$X*o0uuuu444x!//l6o6>Rz=_׉ 22,EcGVVuuudeea2XXX ::-N}}}lݺWf>oEz~2==M?UUU4662==LNNr~:lzt:p0==-Z0LX>G\\AAA IhZx333ʼnVvX,|,..jzŹ9Bss3UUUb9=CPc#22>ڸummmFq \0l6y饗tڵ {*7:u Ipp0;vJyyydggOVIOO'%%{N<lܸZt H$X,ч_V^p紣6j`pphf3AAAh4j'aqh4l޼hjhy$yN >ΝcnnNt`0044DII VHmm-7o͛{nd26l ++'33DBOO+d}Jrr2oؼy3ZV\ۃQTrqlٲBv "44T>/~ Ľn'??it<+&.HœNXX:Ũj^)..f޽TTTԴ^.\`bbVb'RS.jc%}]yꩧdzĸ$%%$a%L4pU$]{7oޤY„CJ~Z$kxH$$$$p5Z-7n޽{я~ĺu8r?)++[Q;wIGGsss߳deeof㡠@Rn233Y|YzTTN`0055EHH ^O^^XV]FNN[nʕ+\|^?NOOOfrrG"Jywuw&//ׯގjpv .( |>/_299ɺu먫Y8r۶mCTk.\.@>|p}<cccpm$ 7o!=Jdd$.CCC\.LÇŋ qvm6nHRR޽lBCCٻw/r|/`%N⡡T*FѯR4gLKK^(--%66HN'pw<==͞={ "99|ذaAAA}v9|0FV%,,P|>G '|j8y$MMMl޼FVU&''X,+?Mt|Ϟ=477ZsYYYv(**Hzz:X4 .KMbccihh2IVe222`xx$toqq(lB__{MNNFx<Ұ޽~ZZZرc;wdnn*<ˌzHH---$$$PSSdrssIIIH溺leOS01<<͛7)))aƍ,,,l&%%\#==HR)sssdddVQRK.;y󦨉x<<3lٲJ޽{CBBɡݻw111PSS#jtfggQ*dddNCblݹs7nV)--\.B }}}HR6l@NNSRRB||??ϱcP*̈oM6QPP0jbJ%eee!9x VUygžݻwh|2Z\tZC~~>[lׇ^xg߾}022Bdd$GTjl߾pQ &55xDg~~>p8x[o111؈SN@^^|X,&&& w訸oܸe?4 CCC{n&'''&&Bcc#aaa8\.Q($&&QQQrnJMM ccc<MCC: ź剱mn7###$&&3g|;v,FFFhhh`SXkkkdDGGsScc#SSScǎ󄆆.^NNNDDDh4[n rrrزe b] ##N1vP(h4p>77GLL̚FYYddd\.gݺut:vCCC;v3==MYY#$$Bff&v]t1(//x|tlՖDBy(wA dzHudd}@]FZMHHȊA?<8Q/[a:U_Su]xFKP KF#̓.hQ~SXXȆ HJJZ>v(/ZI&<<\E?Ţ"66vŸAn…1PAj[ANN']]]KAZZqqq!Aך7Bx^&&&BP/r#ZlDDD-ʢn˵x'j_ws}(nwc6?6k}\0]]roVZƃʸV[>I9|G, {97LL&#;;[<$v>q_՚!J!-q_/ʛo)Zܯ^{T*fu{d~_9ZZZxKFZZZL&cdd1஦?//rhnnfrrn~uLޏ%:;;q8|>HOO_\?,NJW/ 'L=ZozL 潫Ym9ezZ_k3,?H՛ G[뻂o>KbbhaouãbGͧϢ]kAz\._qat///rVlLWʽrjϓcG"tqo-Ɯ\/ ԖyZyF(Ru^KM@ֳ?oìz.RE}k_>}P}>aʻV?7kcTג3 T!rBJֺ)_B~A$77WS8r\+QZ{kק!׾"233W9kKTJHH5݃x $~g^|u"@瓞Ѡa6D"rrh4BL&* U(~[KKeӒy`v gy2E)lQJH$DO4QcW0 Z/8~Xkr0r湏;w{F?ϵӪק|ZO_3|YwV|H$L&5q5A4yk?>tшJLp_4Iߴ!F`YSrp ?2 @_%ǽLapcF[ܯڡRoAF>z B~ @_>eA.,,`2h4DFFsssfa0Db41rX^^`0 ɈE&t:FRo`r'U}\f3fP"""ĠE!!!b4N=T*f3h1(avvV P455sFl60LbTU!w%&&Tnh4 f155#88XL%h"""zddy6mm(DEAH'ȖT*\h響)=VV3==-F7w:bqZ-,Bll,:NtbXp\DDD`ES˙1g?,..277GHHQQQ+jG ::.fjj BAttt P #i֢tTVVILL ccc_5*~_Fkk+999+cIOOgbb*jjj'55_[naYnRtEx ۱X,_+n̙3455QYYIrr26W^y6v8gϞ.~:?ω')) 6~򓟐dp8(JBBBimmnEҮ.|M1hHH'O7ߤ \ίk:;;%..s&'')..frrWR[[˥Kؿ?/9U\.b FRi"""bQFL&1Xww7o٨T*AV?m '!!!477mDhh(/###ד͛7iii7 !!>.^H[[DLqT[[˅ طo ՊZ~u*BbCѱ nÁffff yge2tRx7X^^/|Y{wGK}}=]]]sybӦMOdEE555TUUW^Ibcc9͛l޼/ZΟ?ŋillDߓ/@ '瓤Y{N(J^|Eܹƍ"&&COOo-|J"==۷:vڵ"j?ׯ_^?g޽+4CPPǎCPӟa3<ٳgz''LOOv8@OO"jnnFq\r1e\\:o~,//fnn^>fAXX~n7ġCbzzݻwsaHMM?'OƵ\.1-??%$$Edee8>'Oկ~Eqq17n unBT܌D"aÆ :t ͛)..twweϞ=x<?4Ӭ[_}}< w}6mDMM >, bpdeeq>X^^ȑ#tvv"ɘtNrr4B+WRp88NJJJŋbmDž={8|0կogﰰ" b$娨(݋RfQ]]Cz{{b͏y @,\vjr9))) Ξ==u8zBCCzaVAPPTTB0r%Ο?޽{Š`BgGXXo#xWp:HRΟ?ONN)))݃ ( ~m1Y.sYfffPnkkcǎpu Y^^m|>n~,z=7l6c٨o~x^<쳤BƍQ\\̮]|2`yPJnr9ur\%5586oիW)//gnnNKK eee>C0h4Emm-deezQ(bjY.^Hhh(6;#ly =z4p8H$߿4>deeBzĶ6L&vjjd21݅ (..&**J|WHHHq.Z @xt<^QQӧ9r:&&&~: h4L&}}}N#--V+A8wwwGRR+s'>>n::: ϟʕ+<㄄zYXXfaZ_D.c^/v]4"wwwsMq:$&&fctt#G JfETT8N<v1LoT5Wլ[N,WEE---KhPՄvFanniN'pw#T*q`zzBBB駟~/~-[Xn###~=;wRZZZLƭ[P(dff v!l6L&1 i}> ?~Q.\@ii)͑ǡCHKKwd2U(zt:{a2sss+G~U)++,//?;_SS;Ç >>:::H$_߿ronn6`jtqm> @GEEq%f3SSShZ8@YYѢy2UUUe*** 66#G000s0<t:qlݺ'X~/T*ܹsl6ƈ(z&##7oсl&55Cm6Z-;wrp{1z=.]266FJJ QPP@kk+<sill޼jjjP9r)***GRF?ݻٸq#ڵ \}aau։(D[E__fݻwJLOO#JILL)ؽ{7SSSCbb.>荍bZlݺUtIX~=eeep8(--E&1::Juu5zgy`ٸqs}н^/DGGAxx8H$ v3۵ZhZ~:R2ӹqPYY6m"77WtQDEEcccddd#lٲnJnn.JY>667nēO>s @2I|%fYi;NrrrDEDr_.<~߱v"##h4* l ]U+:!o4 'HZ,..RSS>??Y P=]> Z-%7#Wӄ? 9y, ,͚bjlJR|>=rGD"aii\n @|1H$L&T*Apg>\Dfn{ЍFUH$LHHl gYOD"Fuy~hN? @H$\.1@">CAPP}|!_%O)ѣ: 鏲 >=  @O|}Aa0t#HzLMMh eaaIbccLMM1;;B ==%&&&$''rVINNGKz`ii2^ h$<<.^}UfffӬR]]M}}=VN/~ F#ׯ_'++NoKrr2TVVсFRSS͛7p@.iajBuLnGTbayy17KKKjf32 ÁvRxWq:NjFoT*eb1~_NcvvV$p8p8d2~O;Cww7fl6c0կ~ŝ;weӦM_K @?>Ij>\.8ܸqT|>===,--ooF&Ȱ0r9Ԅ^'&&??ŋhgJKK8|0:c5W*ӟI3<Ç~%!!~LLL ayyjmm%==ۍB ((BAXX|t_a~~|>gΜS!!!hZۋ`ٵk555fv#G 99^x'NJsboߢ1LDFFvIII!11q1NΝ;|;_fǎlذNfffBR100@?#JIKK'x_PP@II .\M6!H(**, \.'++K򀻖'O-|ZnܸL&#++}|\.ؾ}u:hZQ{r>Qr9ed2xdXVΜ9 C*|Ѣ155DDD_ݎ>`ͤwssso-ޞc\YYܜh*\rXV)++crrׯqF1w?> y6nHll,7eqq͛7)**&2%xIHH@ H#&&"oεkX^^FT#+ iooѣW^E&7U555ddd֭[r W\aaaχfdd2 11Z[[WXlիjof߾}>}Naa!RIVV^q !''={jq8|>v;l޼#Gp L&ܺux o& hWt:th4LCN#88Bң.r @ω/]ć~Ⱦ}PT⡳0Lc4&((0 .I|s``۷oذaÚMJJ&t:rNP(x<Fgnn@VSXXeqqٌhjĝ;whmmC4; vcy嗙d׮] ƍE^Acn4X,b:;3V+CCCFǙLѣp%mFUUf7sN2339usssoU*111zGii)t:R Zh.q: cQQQܸq4:={PVVF||<D}}=P[[Kmm-:t!]j'$221֭['j>艉 211SO=ETTCWHŖJTVV,xx<\|%1gx{{;^@FF--- `ZIIIalݺHv؁ŋLLLO騭`rrd O>$?6mBЀNСCLOOSWW@R0Ύ;%>>2/YAw:wͣz$%%())appAٳg* j5TJzz:6md2133޽{1 K||.>팎)mۆb\^W8"ÄDbb"Gehh{Bj q<,,,۷9r8 @|$>, yĝN i kGFF^1\c!@P/,,PUU$*^xK?g44X*444p~-͛͛?p)..~dmfp[ @/z5( W|xϵ^׋'"HIJ>!|JTYnݗ, G8X]|DEEo{^zx  cYHA\ P! @{t7:..s-D>tՊ\.GT~e6B  #-HDpp{ @|T|>V{u߭F*$ AAA%?s  @@")/ d>l6v;QQQ}vvZ ^3{ttgZODHM܅Z&\h @|yncNv}>}i=ƗaySxϣjK!ߣ,CO/BJȵ-@ |}GGG3==M__NPю~xxχZfnn^R)!!!ۋhDcannNL&cllAd2}~~^fa+ &&&`yyPl6\.BCCYZZb``qj5*IܹCHHJR, j۷hfhhhE}WB@T288`@<8NX\\ǃVl6 ravvV9 CRݷn7,//ׇCbeffFBh4KPPF|(===+rg ,--qy"##4z`6|?Qᮦy``LT*e``Q ^(aaa?BJ/!… ( €ih_8ș3gD*299IUU)oߦTz*5_C[L&z{{illDPP[[833ChhGXWn*3gunbppdnya6>8n޼I__!Jyo˾}v@chhH/ P*LLLC|L&$ 333LLL󄆆̝;wX\\Dӭ8y<FGG 88+WRdii n7AAA|S@l bX|\xQׯCBB0 zh4vFFFuM6122;whlldӦMΊ>k-|555Dhh8M&e~mvAKK V^Ν;9s SSSOww7gϞ̆ attZbg?rҸz*+^ immGoR\\Lxx8~!o:͛7|2K/ uuup hhh **3K @ٲe oFP̅ ű?illDV3==2qqqdҸ}6uVW(..f~~qnЍ TJ%YYYLDD6m"<<^vIhh(7o&66Jظq#Đ$d26n܈\.HRSSILL$77lGzyWz҈gݺu477m6T*233CBB⁺NGnn.cccɯ~+ %33B!ĉhZ\bٳ[oQVVƭ[jرThd֭zlقJ8?s*++dffMss38^{5ra0P(a4rWTT`ͳBRr \rRIbb? t:^}Un7aaazJ[(J~c9u6*]mmmwE__KKK۷gjjQY}?ܾ}Gxx8,--Ndd$/^$((7noߦdΞ=Koo/DDD`ٸx"Β_HT*ϟfn߾Mdd$gΜIHH`Ο?Oww7fY,XZZB&MJJ ?dpp!ܹÁ(**ҥKDGG{177G[[ܹC^^UUUX,jmmF WUU"H$X,;Foo/mmmH$oNee%999{V1_%8N:::я~`pp# @'9?І2((rvͅ p\t:Z(JR) 3FUUR|;Rp͛7kd2:::رcA$ /^$,,b`e렠 f3|Gti""" 7?яHOO^jɓ')))4E6l@jj*'N8nn7---b?\,..Aii)vɁz;N< 6l7MqC?22 uJq5;Fff&k ȉ'xX,x<$$$QܹCRR^D"**JfyÆ X{9d2jHHH'$##Q.^Hzz:VO,KvwCqq17oȑ#|k_7nh4.KKKx|,--vBСCFyy9AAAx<WCoAqq1YYYd28ىj}M$<<ǃF*IEEO?4:d^x@&!ao{n<---:;;jb #''[RUU֭#-- N'bLƅ 3Sq/DkAR:ꢫ^|>oll$--!rx)zKcv>**m۶Lss3ƒJxx8iii<ѣG0 M?\rCLLxb1)**r裏222ػw/ZB0 466277GAA HOOԢ @<=**Jr BCCٱc۶m#%%EjZ[[)--%??fZZZXng||j<ǎ#;;Agg'%%%I{OOfՊ%--+$zKRAbbb|\~ 1hph3LKKK$''k.nJ\\eeex^رchZ:;;J̐r\4㜟'DP^^.'::"##9tܺuK)))h4Ѵ^0Y]\\DVAnn.###"HD1n7T:::剚TUD&}vz=ddd 44D """$** ^F!))+ȉF!;;[DII Z7n0<<̞={غu+[neӦM$''SVVyZ&>n&<<\_{} Tv޻$QT/VeNqlM&77w&d{{kgNb[f{`;@ AtXnc|f4})++b||okk#44[ cǎRP"B\\۷bz=nlrrr$%%Off&2$*++Fh4<WHGtt4;w$""BL&=' |}pp>JJJ(++#**G}4 QQQ¥e޽( f3:2#,,*++cmm| '==6mDee%IZZ}}}pQټy3[ne~~T*|>H$B --!ٺu+۶m#==]k_"p\XXr:::B&c=F||x<ضmL&)(( $$ ***tݻ5_:( :::ؽ{7t:HIIGkC A $G㘸KfH+H08?¯Oh$,,l]4F `y稪"//K)@VBq3;;Pfp:H$JKKHYaٰ_9$H A 199).OY+C<s׻΄HxWD"a|%&&BlǑ[gf0P(deexH$DEE})$[ A $H/AANϵ. *q7} p8d`.D"I|ZO}h~?= 6qyp\.n;$H A a }#}~BBBDϳkkktj⾸(29yK$jP@r92^FGGQ*DFF;E|@ެ$n"77 qnX8}}|>-e 8V?вdjjE4 AD>;WVVxw ի|H>4Xy&ׯ_G&q)d2 tww¹s;wFGGmmmd2~m_Ժ9jz?FFF'11fffFT2==MwwzXcbbp\tvvw|A`rr#kn^]cjii_~Uǹy&~SN!Jy&jzzzp\j<xw==={By"""PT-kss3cccavvJEHH磯 ,.. Jnىl&66  $H/' wazzZr#U\۷$&&"J9uٳ9Qj***: jjj'JKK1ͼhZbbbP*2??ϥK())a}}=2ù}6:vB.rARzyטf֭X,FGGƍݻ^{ ^T*%--uil6jYfggJ,,,099QQQLNNrEyטa֭&-, ˗/Kmm-^Ctt4.>F#N EP Hfzz7x۷Vy뭷xg8r5552;;8YYY7jR]]M^^.\NR8 $H #5ˑ#GxgZl6(++C&188B?)/ "rOLL011Vebbz)16lذTUUqifgg?VcHRzƍy'8u~T366o[^/<===25507nL&cqqj5O?4_v[Ë/t:X,x^"##׿NWW>DL&#..!//C100N'W_%##ĭ[ؼy7Wg^x[NGuu5,9r~rrrˣ+W0??੧$''0>>NWWYYY;wR^/( F.t:v~?###  >r |DDDOss3V\NssPd|Y$R)kkkO(9}ʓO>ɉ'ֵ`%ǎctt]vgk_~ӧOaaa=z6}QxիmcZfJ%fݎdbqq'+ܸqc=FDD)--&997ocJllwBWWäSYYz~?===DFFrU~ӟraX\\$##., yyy|>)++#99_פvOP__O__ٳa/A +k~._RdϞ=8r9sssl6aVP(x<_%0oF*RYYɷm|>%%%x^?`6+4IRaFO|y^Ν;GBBz_mDTnyyy?1l6:'Nxܺu Z``bbt|>))),.. ի"HP*RVVF||<.ܹssss|>RSS 233ŋ$%%dca"HEs1 |;!66CQTTD__oz}q!"##wT*]~:ēO>IJJ АpIַc=Z&>>~^-n|&99|6mDdd$>(JvRp= en ۍ\.ٸq#bMXXXVv׿u<444 HX]]bݻ (Jٿ?FsAloFEww7CCCLLLގjP(dbqq<]]]1??=J|?$,, ݎ墣 IOOb`لsJJ [l!==7occcDDDPXX(eeejeΝlذ2***c޽QYYIyy97ndQUUEQQTTTPXXH~~ cjj D…  cǎ444go ַ8t2 L0wᩧ^>O?4?񏙜ۼ^/:}k133C^^{!&&48@ZZ999]rss T*x^\rG}QT\~MHHRP.P(APUU޽{J(Jd2Z"$DGGGy&鄇#Jal68K$ޘ6oו?8 @&T*%55VˡC$338vMUUgޮtvʕ+DEE!99^^Ǯ]r劰T!J<d2r\A777344Dbb"!!!TUU7 {1v__DNNmmmbA׳{nJ$&&f$\1Ě#FP#8}"QZZJnn./_^w;33j%77W̅c&''t@p|x 󱸸ȭ["44ɛoիW)//knww7,//a<}}}˿ YYYDEEcΝHRpkx=>>!r9KKKPUU͛aVgΝK?޽yP(<ގ'$11X$nbbӉnG"[>胃d611Okk+ᄄhD&aZ```@JJ ۷ogͤ}v~?MMMl6x "## $$D93LPZZ*cǎN]] BXӃN7PTf36mBFRR===sNr:tBAzz:111fczzJHH a0r9~v;|*DZMVV8hZ{@̤8*++Q($$$@bb"Z'HIdd$l޼LlBTTqA)//gӦMdggSUUu_A3;;Kll߀g:+.HjٳZ-ZNRqdrrLzz:t:j5QQQ$''P(HKK[,++Y YYYűBvv66l`Æ a6DV\.'))͛7377h$99XlDBxx8(JRSSEߏz)**"//^f#++*e>5SCHHZҒG[lh42>>NRRZ}!H1YYY$%%1::JBB %~\.Xc۶mB {kbaeecǎt:t=ze6l)**0LH$%::Z4Boo/vbR)n< &-- JEZZ)z"={BRQ\\4r]v1JVVֻ\R$==PfJdPt:BCCIKKCTHllXJ%\XXX@&a6QlٲɄ^'%%FGG`ƍb{<\.6m"::JJJbhh^ٷoV"""D]R)KKKtwwAnn.۷oGR1::NCՒBTT7ni&IKKcvvD?l}a6X 0ZhdFGGcݔ G%33HƐl޼pDEDDp8z<裤Ldd$T*YXX`dee,=$$M6QVVFFF;vnNll,ǎ#..xz{{ٺu+ddd022B\\zhi7 $ȗ.1jB"`4q8_[[cmm ;_o%Hx< ?s$Q-wKtte'=w$ Ηy$H A֡N\+4qd|?>/w࡛=M܃ $H Arz0x R$H??~+R>~7r} |P~?Nsq;] A FqOHH@ qqqHR^/~0 477===033CBB Mkk0(NFFF}[@4sR0j񬭭DFF222BGG6p*200CRCOOh^~ #44Nz=d2fgginnjdǃFaaa;w0<<‚܌` >>((###Q A $'DqPe_NHHOOT*T*ƍkrHHH %%ENNN L͛7)--%44t^]]͵kװX,S^^Ӭ544`Z|2pZ[[ٻw/ټy3khZ֭[Wex C. ϟD;555\xhbbb Ǐh< !!!ܹsHR)o6m۶a٘ghhjv+HæT*{ll ^"n>JH$4 LNNJHH### ~?LMMh#==($&&#,4[@`rrn&''QT'66SXX 'NKmm-LNN277GFFsssp }ݻw*SSS{x x"aaabX}1:: (, fy뭷سg"FEJwHR"""W_`0F^CR=zFfn޼\.'!!6PEqEʸx^)++9rifllCaXX,TTTf+^p+PZZ*rbH$GRax爏'..Dfffthp\0==Ffa2hmmÇSSSCHH$H A|CUa0p8z˖-r ?!/0* 4nBoo/HRj?g?zd[[;wdƍWbyyopR)GCv$=ʩSٳN^8"L&cllrss7lC>z^._bff"##9v~! DT*%''mСCpL&555"M-=>,6NVGVVSSSfn߾N׿57 gvv)IKKvrx"ӄ200~:9rO>!!!":T*%44*hoo+W 'СCϳo߾{&F"3gؾ}P>< 0??4d2~Pf9?KKKB^WƜ>}łʛn>f"<<".]NEDDLٽ{7 c0-..FGGIKK!!!ܹn ٳDGGj`0o>16k͏cx 4 iiizE0AFFFlٲyFGGE&ߏJd2 ehEEsss8NN'Rq<#H$fggY[[j277'o}[~c41moocǎOO,..k;DBEE SUUŻヒD"ATk.:;;)..&;;AF#7n'`ff~dx<R).1xꩧ`0œO>Ixx8SSST*^/F_w]A*266SO=Ejj*رBARR"[C A y^Ο?/$;w͆`0L&C" zG?ooƍ={Dn~7T*++ヘ7 ={o}[nʓ'O SSSddd?`ΝX,q+#tel©SDʬ?*KKK§~L&r!JyꩧZ֮'&&cǎqFrss9vKKKGEEO>$111x<8x aaafVVV&&&JJJhlldeeCgH$466ַbf$"TWWSTTZܼy+W!l6֭[j}>VKBB~JJJu===lݺ"qywJ%DSSv,!!!ٳ-[0==NcӦMdddPWWښ~?[nXKضmvR)~iIJJHfɁ ͅ{srj5YYYlܸhF#CCCTUUt:Z0::JWW<ݻ rrr(**"**GraX]]eyyBww76 NǷ-C*o~IKK YYYi& ܹso>Jww=|>RLB}F& ˢgtt:)**BV+fYGȑ#lܸ JKKdΝ|fffvuu??SOq FGGYYYayy)z=555xd~~^(?h $H A|P^ʕ+屲BZZLLL`0HNNbp%L&)))zưlDFF\.`0033CFF333\t Azz=-((/PTr?< dgg```)&&&DFF 8,--QXXfffyq;499Idd$v_Wft:v穬d2111Z300 CCCt:),,$22шfcxxX!{DVV%11>NAAb9Mܹs=GNN. FHHŸ\.VWW1 m6(//GRw^R)%nN,-- u( 6oތ墾Jp8deeFAA555X,[JE~~>qqqرC( 2GXX aÆ ߿\?|>\. "HNNV+jZ QN'O7?΅ (((`mmN'x<8}PrŋaÆ "ڣ>._,2`:u ,p8hnnfΝm633`Í7Yz dqqQNuu5*JEyyy|>v;CCCzy&bٰalܸQ;w/Β{ A @xfffy)--%//JrrrHHH`||={/eeeر\JKKe47w[X=33#'Z-~DP8ӉRnRIJJ 7olH$8v,-- )))yӦM,//9z(aaaRJ<#FfffPDDDjBCCIOOgttbn݊L& !"""##jƢR 117<CjIJJ">>Axx8P(Zٳ":sIu~$nъ BCCl߾7t:Trr96un>H$l&66x)6m$LgӦMTTTEgbb"( f3G%44V˅bpAii)2 RIbbvJnn.RT"̤͛7cX'%%VKJJ *p8rBZZZJrr2,--q h4XVaPQQbaii$4 N "##RgϞ=<$H A|e8>,$ FqgM0'Af.\YYY<+Cσ>;;{<7oޤ'DGG{^nܸ 4v-|vynwKizz4<>CP~PQχ"44a7'&[S#H A199).ߏjET ut T>O\.קf_%mQ|WCCCٵkqqq_ D~e~~?EEElذue"`UP|e۟F?7O/qs@&%H A2"HQAn[}^w: Qcp\8Ώ/Zi@@Ϫ܁~\gmmMx^}L&9~: Ok} $H A A"p8=sLv_5wLMܿ|^&~|>1q2q$H A %pI O_!^ A4~?v}]Zŀ_a>57G%Pf ZM $H A>2=!!!1$$$ٍ|>j5ccc"HDt麺:j(J\.w!<<BACC###v$"W?HО@4sRIoo/2լX]]^ÉFE;֢Rp:\~]DrWմ'륣V !LNNrf3Zjjjp3;;evvFCMM KDDctt>Uz(299)?www @dd$uuu200@dd$2Z&&&jL&ѾӤ"D`muu ji0??Nex?v;7oDV1U(z_~px<曨{"nZZZE7(uuub ^ZZɄVk"{cc#T*権f ּqtvvFtt4ֆ%66qz5Eq5\BVVp0>>Ν;w?~FETp8ngxxnFFFjr|2oߦN5LܹsNLWWqqqF^|E$ nbddr$&&6 TWW}p8cttx ===!2t:IHHfqKRe<V里U@A +ljzGGn7o"̤_h4yP\z<|M iiiBMNNIIItttpIv%7npn7l޼# )wYkooq%bbb͛w^eeeK.QYY'N 11L_οۿQ^^bɓlܸDr9}}}x<Ξ=Kqq} _.R[oΝ;d<3S[[Khh(?mp:l6ǩGauu5N<ɶmh4=00\.:::¦F1, 311磧^Oll,$Xkkkq~V222!""A!z-v;( ihh`mmMb{QT\v|^yd2uuu0z9y$TWWSZZ*4:uJSfp:zE I^2/2dee&s=Gtt4׮]###YÙΝCVׇ^|>VVV8}4wfqqvnn^zRY\\sO"0* ~;N'jd}]:::'!!˗/311ARRW\^> ؈d"!!)=E}}}X^^ptt4Bt:yH$ףRlHRL&+++TWW2ccco͍7=ܾ}$_``||eVWW9w z222xPT\zLx>^ρ8x Bip8{* $H _H>T@wݜ>}xvٳgL׋H׀Nl6aii ^E"ݟ\=[oENN7o^z|GX>|HR#==?'ԩS,//9r>;w{ny<Ϻ \.geee oٲEΝ;lٲ9#Gظq#>|Պ@"088Hyy9G%..KFF{E*233lhrrrˣe\.V0==SO=dZ7&m6lذJ?.~0L QUUPAkkkruؾ};,..2>>.mmmXV=,,;wRQQ<BSS+++x<1nJQQѺqPna6$''vERRMQQ͘L&aUJRXXj%33cǎc=&,wƩ=.\`߾}넿w޿&vow]>$~ӟR\\}m6}#>Ctt4iiiSZZʁֵd޽/.tHKK#!!rsstR__c~~ccc<ٳ,RSS)**"""m۶O,,//ׇf#""XV!=z._Ljj*lذ rrr1aR)t6nHVVO>}om6ڐd3&7n7&R}D_.'NKEE&Y81H AK/ĵkHJJbiiBX\\dii aFh6IMMułFaӦMjL&Agg'tww&zΞ=Kjj=~Lbb"5:;;0>>sD`+^0L&*++ l6cZbbbp8l6fi0 [.&''fmmM+JVWWZ2<<,nINNz=KKKݷRLT*EPa@iEww77nd2T*|`6FCAA3==-jaa*ߡ?##1222D L&ٸq#qqq|!->O9322XXX李Yݒ9ZaaaJX(IJJ"44T :4{awb[VoH$LNNJdd$* BAxx8^fffP*DEE̦M())Jr9zRɱcDŽYd@XOIIrMp:裏 :P `0ˮ]0,//jBx(++#** xϲ!;;[]4 IIIjh4őARR8NX,>|ILLMEEDFFƮ]CRRҺxw6Q*dvERRHRV+w^TT*eyy8ֈ H{Rhoogǎ155*<JTdNrr2IIIT*BĮ]LJJ IIIvӦMaĸ !66BCClMcii{|ܹ;H\DDZY]]lv;jZy)))gѣBP."<999`4)((`֭ddd>(IIIȑ#-$x9pAa9z(111]nn.dggRvsA233feerrssILL$99YD|O 55CZZRÇP*KII RT݋tRXX(QRRBQQeeeX,v;iiiBAFqarssdRYYI^^RQQ!+8@tt4Zxj*ݥT*YXX %% HOOgݤJLt:qqqj&x 999,,,PVVFii)NS@EE.(:Drr2111XV}QRSSd~~[aY]]Eӱo>RSS vsQHIIaaa}.@"2 $HAfa?.H08?ZyЍFW2hyf3Νh4RXXȣ>=<賳"Zq===_պׁmZ:zn߾C.sZ`n?,Wۍ\.J) $H 099).ߏjEThֹt7p|w:,K$n0 HD&$$D{Ͻ? . G!: 8{tƍ!溺L(BBBp\X(h4A>:؟}<_dm$H A|Ȧ~x<|Y?z nxrmvA6'e!Op8XYYyhi~(Dwu? w#._Vg=n $H A|q;?H_ńϵ🖉T*J|0_e{'XEbn$H A ^ߢO4;`}?~\.\.~*l{2z7>Sˋ?g3?EZ&2Ȗ[Nsɻb\.ͧ1^/Ny0ݔϧ57}>ߟl_uw8/%XσO|σ@?8{t8"-➐@OOoh4n0J000͛7$$$PWWǭ[N'W^%22ϭ["<<\D;$7n`||JfT*iooΝ;X,t:KKK\reRRRZܾ}ˆ۷ohDpƵkh48Ο?Ogg'^ijjNvillp¨4r9ܼyEի8Nt:\p&&&477K||Hvmbccx7N~7nVdƍRjn7~ vINN^,@__FofϺ{k׮B6Rԏl0c'})Gww7555|1;;^/DDD|lHGG!!!}_`~~ǏSVVYIf?N^^=T\rLvߛ]lF}i-7:::lZaqq7n000@LL}/+W0??Ozz:H[>~7|R),"??Oott7nt:Eܹs(JN>!^/'N ::iE揙^Fuu5DEE3JB/ى` 33TJww7###b2v333$%%8ꢺBW_%!!Jj2<@ss8'P$h4oRTTւfΞ=KTTgϞd2kk`m0+>n޼ITT'' (Jn߾';;v_X~Gjj*/_&''SNE^^ꫫMnn.p8p;v@@t2880sNOhh(.]"::ZMcc#mmmݻ%fggxKff&(J~:l۶ ׋D"azz&/9s;v#P(0DEE(2azzzX\\$>>^OMM ܸqCo~~%f3w!99_~\"i{ J><L[[ B3ۋJbll Rܹs\.n*!}wh4bX8s}WrUZE@j06 !Hկ~"55uj46oLss3]]]DGG3??/uww)kKGG---d28ul6jkkYZZBӡatt_|5222DYn8؏r^墩pBCCq:477sI>* 1::ʮ]Y_.pXXH <`xx\NOOEqq1===T\bDMM DEE/EssHf)kj5}}}DFFb424>>!-,,ISSPziiia``YVVVāΝ; u1vFFF0 c effh4HR!rU&5pqq:o.bBhh(3==M?,--T*]WJ @LL Fj}Z7!99ׯjf@X7(**⭷b˖-"{ll,7o$==/+"?,,8ܹ(ܹsVz*iiixl$&&GCCD\baaaX ^Oww7d23088ݻy t: BAKK ꫤp%JJJpGll8uttPPP nr266Z^/X"##ettFCHHtuu>9 2L̗8~}}}ڵKXƝ\.… dH$fggYXX@0<< ###HOO($&&S~p~<88HGG*^~JQP(v16z-Zb-.."HappѦ)))⋤pe8<F#Vk׮R}6[lA&k!VWWill\ODD v0ٳg9{,Ʉp&&&eLbb⺾r( r 111ܺu\FGG /@rr2׮]#55st:277Gmm-444+"Be``qj5fvfgg466255%F}}=vjjjZ$&&nNsv8{ Lrn72q6z*yyyR;kSSSC\\W\`2ppUj5դ?d^.Mb!2210pn$<<ioo0hZFFFahhH(~?LNNR[[+[ӃL&cÆ 9p\H=<222lܸ~"##) 瞅y ,, .pa, x<4 tttEWWD UE`d2yw,Z 餤!rWWWh4\.+:;; t2==b!''E:::!99 6`ddDG[@#V\ghh]vRϮ]`ttVKFF I^^tuua6Q*Cdd$TUU^`mm ݎJٺulӉd|n7f-[FRR͔RRR"VÇJ:jlذyꈉᥗ^bϞ=BYYlBLL ,//377GFF|֭[磯fff0LX, cnnJEuu5FǏG[[kkkx?)t@SS$&&RPPH$8;w۶m ьRq(8q8@6l ++KË/T*ejj Dᠾjjj{||<:UUUb1';;8ٺu𩮮~6mdggH$n߾͕+W`Æ ( z{{&::zt:ׯ_'&&̎;PT6[oF>11/Hvv6 LOO344YYYBEmm-ꤽZ͉'HMM2Ν;Gtt4===122Bww7UUU 멖l6^!oxqFHII!<<BYY]]]ܹBCC gee#Gp Z-?{X,IMMߏB +++WPRR7HLLp`۹r z|tvvcgddd墰ׯPژgd2^G466VIIIv EVVV(,,.T%Sl8Nٸq cBCC11<ZLҥKAGG&rssyDŽ0}UjkkZۿ[Z 1w^_.p?я|@IF1L\r*.]ngvv)n7J\^u4 blW^!11jBBB0 +WhooT(j~k׮Ν;wfaa:;;O?1??⢰Աl\~D ?O;#L&ɓ 6lͩS%..˗/ܹsHRN8AFF/2444hx" X,^Jrr2n"55W_}xjkk ܹsjILL$22zVۅۿeuuq,B!]WWGZZ7nܠϋX$44ߏFѰD~~>aaan?T*G&QXXd)Ějۅ\.`5 ?~\*_|뉊BAkk'? |>rrrx0 Յ… s51LڵKX d2:::p\|$^FDZ[[rQTT$ <?oRRR.]{ՑH$H$|>o6n ̹_<䓜?ǏرcBcx޽{9t.\7_篬`2!<|X(vP~?---,--vōT>5++#Gajj vtb0N팎 ƎC*8K.^ōhXXEEEz{ʱIζmشii@0*,,diifpp,8@FFH$:DiiX^^*#<",9wDDDz\$ ϟ'::4~?^/js#!!xTXXȎ;x<,..YXXcǎa{bMOOOMM%$$~ ۷#J}.Jǻזa>F*r%YK7{8ضmZh4bn裏eEkoFF,W[f۶mw"HD XʨdzzMYYyyy,,,w^oߎ^'&&FYWgGtt46m… )P@=BJbiiI|~wn~(*++ټy3###SSS)((Iv Hظq# --;vpfqQlقD"!"" >uu.Tf\.벲2v N>22MQQ?hhh`zzF__cZ޳2‚PVŞ2==8BnR)㌎RduuToNRR 7`1R F#}}}bZ}ࡡ!, R=Fa||DvEbb"su6{1Dӑ#ֲm&쎎D+JEzz:999Tu ))IdwN<c?T@y&bCgmmMkl6x , 455[߶mvn7CCC?'44Tlb ..iii!,, *MMM (?τ&t} 7 Չg?cyy LMMcFGGinn&%%Oss3bۑJBIrXZZ~322wll '- <|2!HHJJd2&ڣ_Wİ(Xrssٺu+ @STT$6Odd$,,,PYYI oUUbl }]_<111LOOISSZF#6#\\.oYN'.]⩧brr^/ Rt)c_@OߏL&#//OĦZA||<۶mPRzehh֐`)H0 \xQ6/..Foo/B=77 Id$-[Ţ-Q%DI{ %2g)H[{}9QƌrhlldqqQUtvv// $uVL&ERbXr ~Ν;Grr2ofLv;---᥄qܧRA>GVV*cǎ ̷~|jgffb4ٵksq:;;a޽DGG+R}2>>N]]Њ@ 餩sΉV "11Cdeeq)Z[[N8AVV%=z(n{K^gmm-.]"$$DkkktuuITTHln&""Ngg'===|>q9wEI7tww騭h4 㷼_fbt*WVSQQASS'O@8KCBB(--رcTUUJbrrYBGJٌJ3glV),,SNIZZ6~t<Z-?or466RYYI[[_~%TVVt:9z(V*󩫫ŋTTT %C ر#G6QLMMqj8y6 FQ8oҨի<+' P/D666ϹxHϘNӧOseѯ8yx+)*NSD6]âYh !33/BAA&Av;:̈́8u;<%%%[yJq'$$o>222l6GOOl6t:eeeqiVVV+//g޽|[JFDDB]]qƒDww7$&&E4n(++֭[Fa/..bZU(yaaaBfqq|Z377Ǖ+W(..&))zY"_?DUUfy˷DJzz:dggZ!,.. 0,..Ajq2kE<\."\v G.CCCdfft:h4=֠{ $''p8XXX //OS300@HH,//?9RXYYahhVK\\YYY3;;Kff&boϞ=[tvvr(++#..0ܹs^OZZ>0}6CCCTWWkq:R\\z ӱBpttTIxx8寬hl-A__1-))attq{>P0INNˢ/Z,z=o9pIIIرih&..;wJWW񔗗[Y|**-vz=8h4TWW JEW"--^!//o.``ff$PT oOQQ@mm-qqqTWWNcmm$~?"mbb1)/N4 ٳG);vzCa~~Pp:ܹPzzzĎKaa!BBB(,,NaNGRRj LOO'v_GFF(**bffF)y6 Ѿd IeeMwwAYYFAHHHX*)fKKK,--z"**aL&q7%@hnDDD.l4ett-¢~Eۤ033zl_w#ԔK;Naa!t:"""ˣiZ[[裏X__gdd+Wg:::D%$$^\z㾦ffjsssߏ`0-P:;;ٳgYYY$''3>>NaaX#,--cL&țU,|>UUUjs\ ann~!&& )(( ''utTWWaiiIO6ř뷤a(bL277iBCCIHH%OVSVV"YYY]31)j999eggSXXᠽ@UU*l6UUUĈ-뿒@zz:\.n78jTUUy&DFF/uauuU-0>>NNN}9 2004t:ѥtwwFii)+++b=YUU%:d2155l&77wKT$7aǎSYY)* &zzzh4FD(,,,jq:ᳲBFFcccdee"W555dXHJJt:QRR"Ⳳ5撙~,HQNKKYRaZQ)"~jj 픔lfzz4 q}>--)}v;!!!b@ϛgU]1juau].ǎG~xQu};ΊEw122UACCZ)--eOt~ .055@FF?^i#ixuЗ8s ~Cazz/>ոx<={V:HU*|ٟHO?lE[Ϧ%4Vz*ݻwoIߌԩS͑B__:?P8G… Jxx8?ϷҶ ;!8؟5ǎ?V'))I4+)z"!yt-% 6G_FbM{X@___Q~(. |XVz;N"x<"DUlEiɣhܖ w V/W@n`xA!DwC+Ɖ! t:33_5v?“+i%iD0bx~xD}WY)9gccCj]ODDHr\ QeZ}i4G.5cmD(J?E]eJk>͚YRDSˬP"vEpO%OGP?~VQX]]%<<|^ފГ_HE}az{UQ^,ٓW>f?ޯg/3M^m{~XvKRHHHcX!>*I?c@ qޡŠv|>L&OkcEK$D"H\plllleH!Jgɏ 9!iO0նM6o&w ^KזD"jho)Qr%}> tuu(Cu:s |p%1N'gΜ!22FÅ y&jZz^@t:pP}j`nܸ˗"2gΜayy,l6.\^d03g_}bWzIJJnf^*v$;;N Β uuu8Nw)Q-11zZ[[$11(qdrrl6lw_OÙ ի477z… pMQaRRRXZZ{-Qcmm֙BQ^VLlnOO zx^|>ٌˣ۬XX__O?%??4t*T $''srǑ#Gσ9s- oum6#]$$$8<- 'äoQ||$%%=XV>LUUՖ4`0HCC/_frr8sP;RL|077GZZ7nܠ6Q* y֭[;wNjjH$ɏUQ]n4=낇蓓DGG܌'//6>c㉋O>zrrrd2Q^^NRR˗/'OFFkkkvطoz~^__QQQ\zݻw?K\1TZ-@xx(wšCX]]nj9}4vbuugϒHvv6@z9Bee%>(aohmm%33`0ȥK$))UVVVyu~ SSSʕ+LNNb0y&hlldppw3P^YY^Oqqhu\.ϟ4jeQY! r9>jjjDEy׷;??Dzz:㴴 IHH֭[\|uhjj ~?QQQ.]Dqq1466Lrr2v˗/3<LNNEEE$&&יb7ߐٳg)((?> GEECdd}Uٽ{7.ln Ź 440ػwPZMJJ7 99NcΝ[f555DEEa0hiiH:Dnn.aaa"g:읝b0ؿPrVvX__'66TqDzp PT޳9z(v7np9~?_5tvvGarrcǎᬬW_J||<)))9sQVWW9vضH%FCOOz^| '--Bl6)))phhݮ?~L&.]DOOgijjbppsˉ'Ǔ!`0( 4BCC9r*(BCC||gbLc4\Bdd$'NѣGsΖs^~f|>ot355E0$66gω'X]]%11 K&''4k[[IKK ϟgddǏ7oɑ#G팎rY}8nDDxX[[q)9u466ߏ>rɓ@tt4sss[ڢ{vv- mmmĐhȑ#XVqmj{n ᄅGll=NCVV:uXK:::8vќ?^uuulqjKXX455qqVWWIIIAVcZ9z(=VINNfxx&V+iiiԈO-㚟'55>q:^g޽fggv|wDFFri3==M0'??_v###vvW\d29L"H$,*j;N ؿ?_5sssX,p\~ ~F/K~_Rhjj믿f111lPTTįkXZZ'tpp-H\x_b|s  ''\p4_~%/HNNj曼466zQTjT*6rssfvvvTTWWwV{OdA  !!R\\Lqq1yj)JKK9p&`0HVV5558f3 a0HII!55Aq'Q}V( ??Ν;~Q+teeffׯc0h4On8t&9FFF`~~;w˞={HJJbvv^{-Ο?Ϯ]μ<1 jac6YYY半 22d1 ڵ}㡤FGGYZZt ,,,011(_9Q[oEAAf9~Odd$Wů~+ܹC?pNbb▶TڬJ~?NS[)zMJT(**"//7n011V"H$'F\j5Z)Ν;Dž HMMrXVV+v&''y1ʹ +WChhyqq60+B5p:ޕzjF) )..3gΰ$MR166"##Z`fͮ]0$''SSS71BBBh4BDIV;wصkzD *7oungϲHCC"ܼ~*N8۷U(V~g0z\z۽Ii),--F!55@ ɓ'ikk8YYY,,,pIqmW8NŎq0?~肂8p ݓRy݋` ;;;w288###Y]][ECn޽ĐȮ]X,bRTKX,[cbbnn޼%@3 ;<< v؁Vǘ|wI>s뿄Zb4z*XV 666طojǏ355Eaa!qqq)Νcttt3HHH)=޽<Μ9CCCTTTp!>3t:;f.9f˱X,>|(bbbhllo󑜜^{<7?lv6a49|0[a wa񓓓=l%D"y"n%RTZS}ii EII ]]],//PTT$©߄%''G*!qEDDhQPP 6YNEEcL[ZZ",,L"choo󑚚J||<"""عs'SSSLNNEbc``@t::;;q\zv܉j%""Hoo/rz=l6"##j222he|dffRXXb!22R좬`r0&''IIIfVڒGGGtuuGaf}}!4 dff222률[nay*'E񌍍166J"%%nݺ4沶999`W땝Irph4HMMevv$rhD~AfggIIIa``/z222s|>rܹsE*++J"yql.p8'!!ZMZZ@!Q沰EFFFHHH 11u'Rf3\p_WE4 ̐۷aeeBCCINNfmm$t:ETFEE'x"r:111HBBfMQQ`%`0(4`00;;hdmmt|>d2_eee155jEד#", ###AJJJfcmm8z{{1L$''(b<aaaMQ{=^ZZbxxNjKKKc~~I055Err2t:RRRX,q:f(,,vߏ磸#99(OɃcaaA|/##"FGGHp8䐑e||-iAFhh"55U|nii LJJ yyyn,tWF#t:~S%D3==h`0l=l6<=uhЋVu2W GnZ>}Jmm-d6@:芁>11͛7?mZ<ϫ륮BVV999 >xz]FooYE UDqjH$D"i諫B0NՒn 5rss_؅T*N'.K=q"f/ 1`0(B*bɣLTTC=O ¸ 8EQco=~P۫ӠTNz^D"H$?JbaaAD;v o;@]{)/ǃv?Pո\zۉJ|G'+GxM/ pY)W귊p}lv)H$D"<EG:!!!lll;JӆE>.Jf'!$C#lllj^m qWrRvT(!ϻJ$D"H^\.l/p:ۖ Y[[>(gL&9x| eH$D"Fl6n7:`0(~ndpXX=߹G$neePQ{\9p8D1ɫZh [D"H$D"y8WWW9v^|~߽4XV0ʥ.H$D"H$΁@Pkz sNv;⤛uɏl%D"H$ ~Z-o6oRj!['H$D"H$:@do*f@_[[Tp:x^ױZ~Zݗ"H$D"H$/%j沺]v[__Gs-enWD"H$D"H~SCtE^"H$D"H$~iGD"H$D"H$L2H$D"H$%@D"H$D"/%tEXtdate:create2019-01-17T15:56:09-05:00v%tEXtdate:modify2019-01-17T15:56:09-05:00AIENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-plot-task-measure.png000066400000000000000000006063071414302661500303470ustar00rootroot00000000000000PNG  IHDR 6wgAMA a cHRMz&u0`:pQ<bKGDtIME /&+IDATxw|}<,:B${DuYmE_˥9]ž8?ٖIJeQ%YEHn}g~,v }/pgfy>3όziB!B8 8ShDt!B!W5۶ill²,ܵ0.˲W eW !B!xmd2WoXc HZq31MrY!B!Ek۶QqXw@)u `7 2>ᴊt!be5a+0Lv Obt3QJa&mg\5{ҔR(5vԇʌ>Su.{s{(c|}4J>ϕQ&gmrSݩB7ضicvR\^k0CA~~>1qH$x<^ H{L[d1pD"<؅\/B!>hlۦ&M4 >\Ao*pO}5tA300]Xz5>Nr;w.HG~:\.p ֙穇Akk Xv n5ZkR… ZƉǙ={6UUq;6x>;G^No?u<#B"ʊ~CQ˲$??@VVG=v8,]~ zXE{{.rrr8USmu*뜝~Q#uvޅgΜ9/FZ;$Izzz)..ql˼y͕B!΋֧!J)"`KReYA_iɡCH$xQiq\n7dbtZ_\^Lyq> ҏᇏ@pǃ5`BPJ *ipk20OSSYYY(m dhhnrr1M]]]477ۿn#77`0qJcc#l2b899s BA`ǎVZؼy3?k||>/YYYnhhh0L</ 20Џeٴ墧F<>{kٶm%%  q?~H$Bnn.CCC?~P(D___0Mض͉'Fhllg˖-̜9nJZ[[y_/Iuu5CCC K"$`LӠ}yQJqDP8s%uΡF~388ŋl_:EEE?%2oB!Ĺ)mՙ~ab˖-'ȧ ˕n~!H} dzvTz`zH$JEE%yyB!fϞM__.qc1h2Dr7B8|u|󓓓ý ֳyo ttt/~R[n~&Ă 2e ~`p?'G_F>я P]]M"g?P/~ wo-CTTTvټy3O>{/V|$?vMFss35k&r);nuI$|#{n:::={%%%ڵW^y^"üH$Baa!Ge]IMM ضCm^1c Ǐ`Ŋ̜9wpIxG(+ĝw~={pq8GMOO/_;w.WӧSVVΝ/ymv>KB8X,N7֩@z|>n7U<@QQ W 0cLrrr!uTVV6YYY9r+W2cLyg+H|88$q8x <Äaq4l۶~^/ɴi8t>^Z;b1/ 0}+Vo>vAwwA__/۶mٳ7o.`۶m޽ɓ>|f̘A[[wׯW_={6/; IJ,b8cڴj~a y0 P(o믿>Ⱥukq%KgϜ9znfΜŽˍ7H{{-be~my&M*TVV쳿,8 'Sm`ph4R7|1m4~ӧgFAq沿g!yCW#YG=lfmN(c&H$?7Si\cO1L} Y,ۂB!.4޽{͛GNN]C 㥬EEnf~ )/D eٙϧ`0`Y^e+($Ilۦ@ d2AUUs?9?ϧHS_YYeY݅eTTTx'FcL2%3aN,ˢg3g0ydL`{XMyy~<y̟?@ ER\\̙Xt D"Q>jJY`!ee̟?rfϞ͒%< ۶6mpS2}t?fϞE0fɒ%yqn&֯_Ouu5n |rlۡ+Vx"/fժ̘QԩS#`*1ydNʼy))) ҥKYzׯo?̂ Xz5eEdey),,fyTUU8kײb Νc̙Yŋ3e,y饗Y~=fĶBqmv\.7FLx< g=0 d2AKK ---twwxG>''K84 [kMWWmCGGx߇a&U{ֶp{܌9>5;`!6Ft,H5kSO=ENNJ)멬ocZkf͚)^/!dz @ ~+:;;9L|lxϗ[$񐟟&c6|Cwgq{G?JYYDxl~Bই`6˖-# #PSSu]GNN?e…ÇmiTTTPVVFii)TWWs7A(";;n7eo~zAB!B?#*, ˲ LfW0p\A999x޳1 ۝yrH&x<$H$3]8zm<2mzyC8&H0 P(-;2ҽhLy("'''\ٗB!B!qY!B!bI.B!B\$@B!B! !B!WXdٰjB!BuExv\+Z94)//B!B:k$:3v8{UV2$;;iӦΔ9aNsz} qQǔ'|G72;:]m&G<>JJN~ꧧ>c1ԩn4|}4B!Bq59kC?YYYL4 ۝٦|>jjjFKH5ٙRBkMww7CCCO8㴵P^^h4Jyy9HwwwSZZJ" ۶)++#778&Mg8n7mmmnPJ144SQQCCCR\\Lnn.hvLӤ۶illĶm^/z4v>Es`}˂`P3+5:@@STqho7H$녾TM^&>ZCK֩}f>P(,mj%n)10$g fq0PJH$mbO=7`Μ9}/_Α#Gxپ};̙3<#,Xb^~ekZ~aYXo~޽{YdIf[oO?MOO%%%ضs{9:bwijj7`̙~yemݺv*++yWٹs'կX~=999gm$Il4M P (T/}W˕ T , L N04<⥦!;[߯Km3TÖ-nu.&Ov7yi7'Nk~c/mm۷̝i]bGMy;}&ZCuu*eY]nv'햷t3ɿwhA(bOMZƁ$wy'uuu$IgҤIXm۸\. (,,|3OOB!<GNN|qh[ogy֬Yñcǰ, jzzz8tiRRR'?Ixsۍzq //^EljkM5\ͱctÜ96 ՙtw+&Ov39p=\\Jb-Xx˵^KQQX^f͚E8gA)1gbdgg5ɝiL:kRRR88o͚5kFݏ~6a7ߜdr|0AGA"U֚LbOz!S\;LRS㐟iowh.$[B<Ν.vtI_.^6.wL5n7 (^|эǓij~M 榆'gއ>$דKCzr1ɑ# ΤIh4 uƭ((l 3 gs̖/B!Rjzu]Jgg't׋aXb``D"Aaa!yyy]kb&>q"$Ypann7m300@0$·mMƂ Z  te{v۶H$B?Z~zh5kbZk e]?ɓX $I:::H$PWWm344ŋdkTzm;fgk Z[ aMVx={R&iq֐H1dgkjj'Kk~[7⦛deiL-$ǎ4&&eO#;BrP ŇP/=N[!BqUtPɓ'im6lnCkMaa!~J^/i2o<>i,_cǎϔ)SpTTT1 #s{#?ldpu6k2wͺuvQRF)Su14dfbsOEN:vq~R|.pCAVI;;muyuڭ] ー2l)&-{>rOtB!BTcU:gүG ԜzCVDxދD"A$9F~,푈M:; Ag? ;azO/Xe\>md>S~ϱ edHKOFn(G;cԞN#B!WNwz ~~g#_wݣN7hjX42>5[S^Ϸ9秧K~mc3^gbAxKӜm 5 ΅B!W^]L#|s~B!BuY\:Zd\@L/B! 3d !B!W ЅB!B+B!B!@t!B! pI.b]krnugPZYnJcs s޻eU+W 9W"9_ΩB!.qt5`H$ r.%`Y`d2ywv344D</;a%/坱{0e8%k㜜|>߄+x-[hhl_> àՓW3?ָ\.JKKkh4J(++\.D"D" ;GkM^^^wjbhh^S!֘RH$eY_ +ׇ֚K޹8CQQEU)E?===ɤI.x3DQ%-3.\5ݸ\.n9G β2u)D +*VP^qiW+i'޲,B%%%Fw< QUUEVVe妵v/ B> gH.Bq#x^W.U_:4zh[ \EiiO=N˲صk̜9sݻ3g3gΤ={b w獵 6d^jkkYnl߾˖-]v Xx1UUU:DQvA8fժUnmFvv6VB)ő#G rq>ŋ2e ر#u˗oM<sײ~f0sN]̚5 ρcənal߾l,Xy GnwvvrQ\.'O2}Nكi\s5dggk.kx<|VX1 ٷo,^>̊+  }v$+W$;;m۶aY6l@kkZk6l؀8ܹٳg3k,xװm 0gΜ3L<?ikkcժUioo'//KRPP֚X,[oE$!pB 2&I|I,bڴix|8w@!r9kȀzG:x_@|\yb1{9"Ȩޛ/}>K,_$s婔²رIߣiӦLyn݊s߉y8]DzE1;i˵e򙙟!aF +ٹY^ɾyan\|GUVJ707v37o. Q)űۡ]|;HV"1>Hс֚G466Fywزe ===b1N8OS]]]WH< /vbϞ=dpp!~!կ~1 ˲466_D"Agg'>(n{'N xٹs' *Kaa!>Mqq1X~xJ{{;?яBh4[o믿)o|o>(H'MMB! gp{2~ӟӟ'Ofz/4uÇ /s /pK۶M<'Hw@:ޱb16o#<͛NOL&ٻw/xy9q`7|^xW^y%3d|8L3D|kS莦/G(byr]4 5`jl#z'U*v?Şb8~ϭR]$$>< Oy+@"aiRo%ו$$9wwڵk38f̘3ܹs뮻9s&mz:ujv܉bh qKww7u],YdT /9rCCCs뭷Zc``0z,Ye˖eLy]]]fX~=ѣGba#+FNJSS M4%m8z(Z7xX,;ñchnnwa߾}ۙؑ4,:먘 pw3uTlq7SQQ8x^nn~?mSUUƍ3h7x5kz1 B?Α#GmuqSTT4jX={8z(444lٲQ;??d2I0[())\l[beee^ӧaÆI\J)Z[[ ì_>3c$۶,kT 6`;v%ݼ+ܹ41M˅%HF9y$O=P;v|>|z!@bw-bǎ:t[nn#GcϟO$q>}:`٬Y&S^ww7{eݺun<sĉ nk!Bu}`OkM4'dΝ̝;[nLwz=ag #q g 8G=^:H}{GoK"7z-O4Yf 6l /v~+8B!b Űm!BPy]Z}FyGyꩧoS۲9s;AkP<[)*S@o ].v3ț+MP)bZ4hr\ChAomk5ek 3},+^c9a禛n:aΝ}NlxꩧzUopB~_aY l޼|03,>;?hA__H4QJezGoڵ_5׿5Zk0{e͚5%//|* ܚmӧSSSR;vPRRԩS9rPd2I4\uH<'e}{ݷnǹ33rT@8-bţk8q"s!HGG| _ݻwfӦMdeeq7gN&L:O|޽;4 !piOG+?΁O~w32:V;E1uT:ߺBwO}SqɌNA/X,Ogz=|m?A$y3w3;0mۘ?C{U}GrbwL89pH/-C-D{XT(uG;.W::ıc+ǖ-D:aҥK3oqwdÇ@mm-]w6l aB444A]]477}KbvfܹsY|9```J{ɓ:tχi8hv9Bnn.ׯ)--E)Ş={ɡH$¾}FlޛJ)/^ɓ3Ҏ?eYdnoIwb͚5rQON<3iӷuh3H Oo;2¾}8y$#??tuuq288i߿cǎQ__ԩS `s``FbDB{1^~e~룹gmۖ1}}}}^˲#??Ǐؿ6l6z! uh߾}B2f &Xe֬Y]]]\wuA  +++3z`0[ىeY[ >}:;v,sAi޽ 100ihii!}vV\9rsկx</d6m444K/a&gf…׿'xbvOMMMr>}:[l vB!̯|+w% 5r0Ͳ2͛ٳ3|ֶ:= 5DxԌc|tڑ-],#EvvǯkΚoz{m eٶ㡤3qRY02˯lP8++kT/x e79>Vm6!0ahn͑#?AGH7I+IW;ACk&S'ғ8\=Lh?X9KYT@eH$(**"2e `r ʼn7eee466R\\LVV555,Z dh4JSS&Mn999p.\Hfu:2e > R^^N{{;VbŴPXXHII nF*++zXł (,,DkM{{;_Eea˲2-P,H$i|*++3 @~~?zk=vzA ;:cUUTUUQYYI__ ,YleeezVP(DNNYYYSXXH(;A&Oٳaҥ,]ӧg.tMTUUF~uwwn:͛GGGh2F+Vdާp ^IO!BƷtԨ5/Őd2Iss3.)S3}~V^TUUUfYQ3:^ډMzL>00@2t|jcm455aSLdOl\?dד8S)Ԩ*}*PóZmFzwT>j)7Ĉ|3F.6f$s$DF5OJzs-.7}AP)W=۞~=>RQ^^, /ֶB!ĥ1wכ{zzmto|0w8䝝s)#L^O$xQ_\=H䒖^\ң%&ES1M➩# ϱFgPJ}L.<᙮), ^:A8;-}cd=^?Vo.K!B1كd&8:B'K Xd+rd&S؀0 ~?ayVw{kO4Ɨ q2]6s1b(>KG^Md3JgqFr|9 Χ. /k^wg Kq'2SJv 2]!ėcͰ{%:6( g]dVm!BqY FWKU3H`~!B!_(B!B\A !B!WcV=#@O$]W!⊔^&PAhBK";;3QRp8aB!.ſWV?^Xc sC):aÑB!ĸRtww,I^% z1RPPpI! 2H(yy*褐ap2×K|GB!)OVVV85!||PiQ*B!Ą{xwsM$S!B!B#G> ׯ7B!B!Ļq [nAk?k/B!B!Ļ0 fϞͬYp۶mX,6fz ЅB!BK,=R*3{zd29> !B!X2%4.> !B!idgg Gt!B!]bFi/weB!B B!BqE]!B!H.B!B\$@B!B!2o_ܫ-X0*N aU2q-t*m㯂R1u)p-t8\ϸ1t/w3،{'I U_=^Y@Ƴ+`|/"?Z$G60/)ց'\`Ϟu7q_$F<̚ϾO{-C p\.:!\Ʈ{syǪ}lhքKn7n::܃u^TscC$SNb 7c"0]SVcN]'mfk.>wޡ.|B~QPQ{'TCzЅŮ ^tV:ԉsUopb>JgLZguo8p]N8"DӶ3[wǶ#^B'B8MX}|K˩}3Ӌ5>xiZOh8}'&O;װnۓzOډS Bn|+7q[.wӈb{X絟Ӽ.8S&>2vn8X~*7m??^Dxbǔa98>u !t!e{}ե0A+ÕF.+e+q]*5gT.P e`gk?Sά{L[*O)P#D \ϼOw*KpyN$o!;:#c 2pq*oL\PF*!@OS!B! pz("_B!B!j=Ľ*N:}0 3f_AV\ɼy8pvnZG"`Y^{.֬YÌ3hmm_'++nBwȁJ9^lO8\ЈM*_Ũiy6 qɌ^Q '[jTY䗹nB 胃l۶!Z 7܀vo㡲BOvv6eee8p@ ^˦Mⳟ,l߾֮]KVVjFD"AQQ>G}??nw!;;瓗/Ky뭷eʕg?_"?яHe鉕1)rM(@cƍtuuo̢Eػw/466o>,Xo%8eeeۘ ~??Yhv"suaYL4;w磴={044DQQ%%%ncΝ|>gΝx7_6BʁCcl~".f7q/( nhQ'"Z8*rlq0U"?Tsz@ۨ݌,:Aԍ8X*JoD|}C7Ձv,}]ޑ*ߎ2TEѥ!Tq'݌ _MY3y6˨TmÈ?0fh{brrqtOԍ[}oV,6G> CEdYC'<My9*/MyW#pUFU96oƭ$o3ՆEs?wo{ P;:U+s^rl s`s`?HcmXu z~ !x>k,֭[ǎ;khhhm}GSSoixbyhjjf 2cǨb6>,H￟ǏkO}d2Ikk+7|3w玲 {n k7 opx^xعs''{L!{#Щd̿|n@: ޑpR? 2iy.efy/7\^\5K}ҝƈHii)yyy̙3qeƌ/34< 'sK;z(7HAAAf[II %%%/_ooJD yu۫he=v⼳w+9v4y+2\4l yWƛl]0=5b0:Ȗw^eg{ch=$gZ\tT yx?Au:k6{޿J}0D'-ms[}2 47Sa8W[I96Ծt]0VM0'`Zk&OܹsߕUJG 2rd2~^zűqрτ9 B.lschl_\:W8 4oM ƍۯκyij!ǗҊ 8CM] Zт/RTrjZ&ǝZk)5(_qc Mjdpcpxo/`%l ,<7S}y (qw88${̲,>iH&cNT>44㡰=% o$mKqtf20/M;+\5&/p!._k"V>MKa(E??f\m2 >Z_ui p _1ѶB\ZZk\.ׄ:r/$@qnng$}t mb~֗^L \!K7mB!B!. ЅB!B+B!B!@t!B! B!Bq]!B!H.B!B\$@B!B! !B!W ЅB!B+B!B!@t!B! B!Bqp] !G}3'nG䍝mE^@wC ?*/܇cECڤ[p^ىyqU0oZuk. ! E0 {~5 5sJc8G'Z1nZ%%cqfwa? ן wB%@BB!xwL֠i wzv}_qAiXͪH #u>B'/B!Bq=H`>!B!vCܷoɓ:uiii0 ***M ٽ{7`%KPUUESS˗sap3fh"CWW+V 77zA\.k׮rB!Bq pG200@YYe144Ċ+(((ejCii)999ԧe߾}-Z˕ a~''?dѢE ضMee%l޼P(D4W_eG?|b a6>jٲe _=w隸uOٶm ,`ڴi\ !usͧ_Mho۩<>סiYG')އ{]+Ο`ٮsaR9Cd5B+E1]B)_kVQQJ{{;d2Vk֭[ a̚5 ә9s&eee,[ ۶F8CII 'O$ [ozjL3o.]zϥB 5<-56l1 P뗜 ck\8_kPBFkaIzyԩSmBjjjصktRbJ)>qq֮]Kee%%%%8C2f$I|>ˇ>!9s&X~=+W$Lr72g H0eV^"'']s)B\lz.tIݞ(]!!}Jg7)#PXXx^=z-[;;w> JL!Uh(`-rCجKЊݟ嶮?Qcw}+aW'[73@!Ιd2Ivv6Z044㡰pԶ^f-mzɹvѾ /dcB!Aќ\z: V"||Ʉɓ>ٚ*\}B!%cIfMKoYDݲ.Y XrWC!mwh"~˱.wuͮf>Q)LGqjι̜-}E{δ$Inw"nZk">A ] !WQp.dROO;be, M!8+4),,b6dȔB!8+R= ORLs!bF|Gt!BL&B$@B!B! !B!W ЅB!B+B!B!@t!B! B!Bq]!B!H.B!B\$@B!B! !B!W ЅB!B+rW@!ج$I塓ݿSJMdɤ#6]nI:dŎ\z #DG󬓶5ϴoQr$GCDAAbr5.P#@5G9:59^ЁArK.B\$@B+BRR1^IԅH8SXMjx?+2ՈcFugbcW#릮ȳ&B$ !B!Wеh/q!B!WuV2eʄE)Eaai(D"f͚Eaa!דϬYhhhJOcΜ9:::8qeeeL>B!B!ĕ`Bz<!,H$̙3),,ǩvSPP@VVhϧ\f̘O>I88;v\1T~ww7B!l]w݅륷^{y144o~ٶm=1c='={ns!0u ()=|/4 r6'>1Gwj޿QT^glSQ:uo}GI,#z:ݸG!W ---?#Vb̟?Nz=ʢE8q===7o=?PǏS__ϭJ8z)n7\X*>Or ~L&qN2dp!6nHmm-s=9]wRmrBLmߡ+%nQpy8Y ,.&v_%×M =HONrrzNXF\ 8,uO=o돱mOXpO:;E" ߒce((CHҘ48ؔ X !W P]]̓>HKK 7n,"qO455ob6K,aݻD"A__3fPPPoƍ3y1B< s>p8Lcc#H$3TL>ïk~ FdrB}.v?ħ?@njiTO28 bc_%LmCrtf9ݜ;r 1n;HFe@B]ikt |P8sȂڠ@ktL:!N,JmHޞZ]},5[;- SA}&UFU(&SZjq*Rl9XL7ױ?*vuHliǝC6V?'BqP`n׋aض8AAA{d2R ׋֚w̚52b!;Ɯ9s~z{{yٶmX8y$ضͮ]['?޽{n Hp̰x˲hjjvS^^}Ǟ={X|9W-*S,KUB!%40ܮ[@ 0*M}}=X W&m…,\pTz(iӦQfuu5_Gd,Y2o1@ >Q׬YÚ5?sppx<~[!&P${F$/z Tl:s]M hǦ$:0~r0'ч3[n \=A $1usY$77]C^B.TkrXv.>_cǐtwuqJ L&%`8ĪB(Gnn|*#u D"Φ_//yp.z%:!8oMN, 8IAj5Uw*蝕$MC)q:w)CZ6pv ~Iׇ ǛTW<ϗa>/`QQQqδK8&Oɓ/w5B\AGb{|IE.w3CCa̙|/ ! ЅB *IIDQ& ΅B޸<!W+ι&B1& ЅB!B+B!B!@t!B! B!Bq]!B!H.B!B\$@B!B! !B!W ЅB!B+B!B!@t!B! Bv@YI8fMS.2e+|9+&M}Sx|hHS0]w!B+ !Zl9"ǾESo%zѠ_?Z_3Nx@O(?MOcE,jK͇l^5?Dm_eLf};obI<(WY)F)B!O$@B!B! !B!W$nΝSYY9}BJ)ML&ioo'SYY'FNNtttۋaRZZJgg'P* .w{ !B!cPnYamxBVVdeeQ\\Rx?q>F8f߾}޽ qF~_MAAwu?xRRRr\1L`P1Z D;~]h*WkplZq2pl5 Iqc8팓]ot'>M>ulmN M:G3].;X.mRQThRilv{!Bw˄f̘1v;̟?۷saB̞=͛7sm8ty睴%K8|0b1n6͛@ee%hkk[PP(ٺu+}}}lذ%K͚5kؿ?s=_5 կ~ڵnrb ˦mC;O!03(5ϔc%ӇW=G\ch Ga$%MQsZ-3\8z]DXIMMFMVLa!s[w*`Y@AIƕ0Jk;dތZ\W+9n80,7tyy/ `\̙3SO=/~ :;;)--gձlٲBq.ҟstU> i;ƒFf΃#gXf> N´>:צuAh:.gS]4 }6@T1P`ܓ>D;b\Pp{j$ܟa&f#1[(qj7l`44sSt!B\&|zNNGNN. ˲p~fZZZm0FkͦMp8L q(..&??o \.m ~@yy9\s tvv<ձd^u,YBVV555~:ts2{lǎٳg_BV(k<=vRgZT*`%†OIƮXU;T.9 ׄvmjB*2NQG<Մ3QoCP(L}vS!B!:L@ Ep\,]***={6ϧロRWWgԩ̜9k֬!SQQYt)HF>OƱcpL2iӦO${ǽ /@nn.7n$HPZZʺuD"۷!>OѣG{aΜ9B!B1M[ooQiN8Aaa!,Y d[.D}_ѢEg9k,zmƍlܸqkG2/,,;@I&8w ! ,4.WʡRx"2F~*dи.z ֠DRc8 s  ÷' $878nJ+4v,, bbi i%HZN[" 7mcvrj`(E"qDg B!iޥ/? @ @aaye400@]]@3f`_Crpgpòm={a[qYܼȸ3_ CL;yqJ5ǖy{plZ.HPv d!wj8 o"waۛ`m>/=;Ha9DGd%6uV4h1j֠/AWIJ8hsL!+eq}ggLA^^^۶qqZ388H<=% ojkk0.òGB|h1 4S fcxR d8+8s%}!r"^6q2󛘦9K۞2yv/M~o}Gu߉I#i{A]BH@6`:l%&$v6Mf7}ғN16`Ӌ({uFvJqc,~V$`[[RuAB  ##\vttK I`,Xp7CAۿɚuk|1 |2}+A|X,4 `P΃ vE.   1׋lF]f    |ƔJ%d"@AAA ԥRMAAA"@AAAAAA: tAAAA]AAA"@AAAAAA: tAAAA]AAA"@AAAZo ¥N1I?|r9K/ @Xr$47FAR%&$DBABxr%L j%L!9 "gq@Ty3A6W%ZTAA(u~s w^r6|9wKxpZGݫ~:ƂWN+>~?pϣ^v/緩v #9yY3k}TAAA.y|||? 9^y/H V9\oK{~[AAÈ]/6M^l6c2qu8s>t~GWAAA>=xpt:> $ l( 4 ǃCp8h4{n7oFRaPzyX,W /(@Asx BIPr>IO  J O$pK AI¯Ptf@mB"P$"(  A}Qbccq3::]wEss3Q]]!55y{QUUE\\uuu8"==Q:;;Q(vmdeedYl ?]չvZ\ከ +[q}>x JXc7&S=NA.kF"##`74>< "IJ!V*F ;v 99N4 8 :FIIIq8h4lقbڵ:شi۷%K<`dde˖])ܗI -qBI7{φ˭s6/=( 9I@)5'9H (Ő AK* !] FP0o<ˆ%]7mľ}h4^G$*IDATh4Ann.:{|={NGNN477SWWGJJ ~;֭^CVsM7 ]ryYz5/frrg}4-ZtO    \d6FI0LDEE]L-R>?700@kk+q9|> T-^J] ~@ $IT^/J|S# V ~]u+J 1 o>} |6؇S4]A47+x9ftA'DfG.ߏ띓 =dzzF#:]C h4~-[FEEEˆhyŪZ }f2aȕRQ~_pQ"@O@pZ+I xLX% LxU؃I{ǘz?rAA" x}Xpc%117~N[p!QQQ]Z_-υ~Ѓލrdqdž<[!(MAK(+Ȼj_4k֬a͚5z3Au8NrzS>W饗rm̻`   <,      u@   p    \D.   ]AAA>c$R$   gt:|9s:>#tAAAA) bbbj``}6   gLTb0~8ߺv/AAA*AAnT[P(8 $ InHNN&"" W8$ Kww7`4gŹ&V.F In~{thHKKsl%Ic=~t,$Ifff^#`*B*<<\.l$ Rx  ||drhZO7d= Jrr2C ¡`jt=$iFFF-v]ho.®뽢oUssu5}uVTSTx9 /+j ^W^Q*z{r`0~\ IxjzÆ GT^2;qǎCѐɆ P|>e޽P(P( ކ@ xC@{N `ʕ]y]Ԅ-$=tBG:F$Vٳg|X9 j5@3g uF CO {Cx,X>ODDn{NT* XV|MmFll/68 wQQQr 9w^Eɕ$188Ȏ;p:TVVl2vI{{;l߾cǎ҂Ffll355Ell,?OLLpQ6oތN^x4oOܽ{7rDXX455GWW h4rEƥ9# yqV\IEEzavލddddo>Yz5aaakRRRBuu5N*<JM6Igg'+V@T2<<[o__jd2{n)//'99RIWW]]]lܸ7| ' ߽~F#)))lذ nsI{=̟?6ȓ$ ƩSZ( ϟS0۷06l@mm-ű}v^~e|0fX,hZL&---rmCxx8< x^oNmm-yf®1t::u Ʉ$IQ\\t>܅-ٳ@Ӊlw!--, wfxxTnfvҥK9}4{|>.3;@W(l6y/~ --rΜ9l`0HTTlڴ8y/jP(8v111lٲ?DFFC=ğgXd +V੧ܹslܸb^|Et:JDww7GJUU n JKKQTtww؈b133Ç8NΜ9h䦛n|+O\.x@aرc*| s(**"..Fv]]]`4 ))^x z=sLMMq7f`z\aP(+W299I||<---hZRSSq:X,fƍ  _(ZQl۶fx ZZZx$--{(,,D`6q\l޼z=I^^~*9q4ɄVpAVsr&&&l6XnaaanV^ͩS@ӱyfjkkߏJbzzd~_o?jÇCtt n7;v`ҥw}pYc69y$TUUٳggÆ LQQ'O~, ì^Μ9C{{;>o}Y&&&8p7tիW9v]]]p)j5_P'AAՇ@\oSVV&Yv-gϞ @rr2aaasP* t:)))-HqqqjLL .\.###\.4(TV~V8_LLL[ʍF<Tbb"rA?NΜ9 cccjz]?$QUUŷ-o>ƙGFFb4tgʎ;tʅ`0(&T)rc4y?-&?ɗ݂>gݺu={Q~`ժUv&<{k9''o}[_|Qb] : .i\KTVVr7˕w055$F:|MlBff&$qYbccIKK+f369=\Bu[V9ӧ9}4 s1=… 曱Z~}Yd l޼ jΝ;GXXeee"I)))h4C?~9'>>^:0y>2-4^բjDDDaaatttߎN㥗^l6 ]A/8z(x<VXAff&>]]]$*Tz}tŊر?,]D4 aaa$$$044Dkk+7n$֭[y뭷tdffxbó>… `tt Μ9Î;$ ^Obb" h"""h4$$$`0TIIIrBP0++e˖fraFPXXMrwapVٰa{ԩS^ycYp!(JˆkZF#NˆCcZ >>PR Aq`:*JIMMeҥ=z , $&&b2X,$''o>습kiiio8~?˗/bAjj*rJо\.}(1ekk+foR:::x''x!8@0-[&$$^䊒$|藺;vrXd g޼yLMM)//opCUUV+wysA > lٲe1޶mo?8 K)'Ћj-W~`(**"##1 oGQUU믿Οg,X ..NXbdddPZŽ<\ÌvQvAAd6?txp\(Jy%˅Fբhp8rPa4:vq\=T%,7Fp8r!FȅP7#' T9CI * ǃFapppJt6{od`^ YYYr*ݎ[v;:F#' CJݎZD>ֳuh$'SP\\,I]!K[[rb񐔔4W땓ߏn3}Oۋ'33sNI/P4pz>p8HJJ(Jy̴pJtʳ&[0U[[NH>fu:vILk WYxm>LNN> _p}z:NܹCJ+Jyz5{CAjZ>ޡc-tAAH.I0111r+υ7:0)))r!RgR.se?jk%0<R実 f ɽk. .}]BB= >@'&IBPAAƗ.@azz ;^YP-iKW<=n_B,4bdd7JiΡJbff檬#o E|~  \K_"0JgMT^v_u>W#$Iނ  p=   p=Q\W   pD.   ׁK%AAA)C铦?C٠4aShKٗe?x^T*5z_u+  \?n7jZf'=zDEEa0Ң#>>f8w\n{h4tmۯ_vݸ\+N>l&""`Lttrx0 zSAAFN'7؄fZx<>s٭KtU$Q(HD0$T*必\R*s=Ba=W m0}ӍB90ꓞy rSs]s!vڸ/1U(:m\hгEAA1]X 5H˖.A $1::JrtZBXVbccIHHݎF!++ NGWW)))z:::HOO妦&Q*~"""8tvm{v .,D~1DFFfcjj9A]賳Wh=p~߮$@~l~GGG'W`\zǙd޼yrkJ`009k t' @p Ps ڎl VnQ\n'>>x)--k_3\AA o0_WHLLe?4@xg߱c|M~ߒ@d0v$I"55U%&&F.)t<?>qÝwމGՒxݵϾNf3w566|{fppw133=Ã>Z},ر\.8N0׿ǔWbb"111'..Xl6(J!==*;x7?> 6mb  '**?@ ??|ro~2z{{o~CNN__/K"""P*G?"33nL&wy'h4jjj⥗^Ç322^GKCCHhdddyaXOJff:@F??q~,Y~F:::g?,]"vI}}=w` tڵk1<裌v|\.222x'y饗xGYj_zq:r!z)FFF0L<0O=z`0G?bzz^OBB~3z{{eժU/2^ǩnJ%q?_Gyrt:{ARTTmƷ-ϟ wu K/AYYuw.nCϪ'|W_}RGmm-Ӵڊcݺu|IAAn -L%hpݗ̇N688HOOl222zWPXV022N4@_LF ٦P6sNFA$4 * ͆n',,0z!SUU$I=zpX~=G̙3dddv嚎3g3˗388_nbbbp8߿^fff(..fwp8o'OK$P~DFFKcc#k_L(G__|WJ>O{̛7"##C>ln7VUԲoF??9MMMz>|v;/fg?رc|gѢEx<^}U}Yx! mt$$$`0?>O<O?4===|G?p|s=ٳ3gp]w[oK&-vywK )-Z?οۿ1883<]wEbbTAAAzbP ЍF#jE FW"KYYhmmERh" wߍ^d2+¡C #==]>P+VhLzll,DZ-nLyz+V"̍LMMѣGZ055šCرcp\)JR.wttoxHLLvwO0dbb?O$''T*q: V^͉'xy衇0 ,Z]vh"JJJ@`v71뮻x衇 ?88/~ <ȢEXg' O駟f $''7kh4'**}]X~=[n)--e…sоjZl6F+V_;3R233"&&[npJ%r%Wh#551spu;$::Z^& {c߾}L&jW+  |$I2222'P\t:}N_fD$h4,Xy|XjvkaTTK,`rrdQTUUNj5<n $MQYYIdd$҈eT*.\('}۲e ~233)//ŶmXn (Jn7+V **|Xd z\222bj9y$*4lŠ+>uP7~xb∎`0PRRIMM8󉈈//QTx^rrr,`Pn ]䕕̛7oN [QQ!W~wC\\Ǿ~].MV]ݗ-[FJJ QYYIiiPvmIKKc…h4INN&,,uֱpBϻ˭ʚ5k:Nߙμy?>ZMQQh4-ZV%--%K`00L)I @Xp!qqqPXX(w} --ŋSRRIII|$))I/AA > Ƚ^/9f$IL&kWsj&IpݸnyN>kvBh9͆ZN:H_ {v+j3Z_hB!w~=KOr>jC]EzlY$ ǃ`0\tMTOO$aXG\=] -Z.t]/O<ѣGO~Bnn.@BTTܣ#ϙ+G]s/ o{=]  pi$166J"<<|N[$V+8o vvK~ni T*/fw(@Jx^\.Wu=n*ʿ#~j$''˿Zs*ʄ\MAALMM.ٕ}zzEG0dttuC>,t:QT7DPw+i瓃nr>W"** k! bz"@z|+~  7yQr=**uv;C Ӛ$,,u z~v2::h3$%%b/ܘv;Nk)  礯ώuɒh >sfg8o7 K_^h:@|t%jlG(  _NLQwÁ#!!AI 366FCCJRlhmm%..GSSDEEp88s ===LNNb4^^淋>bbb>QmÁZFKSSfffra4q:477ۋ^',,~ZZZy<rY:;; DFFN{{c烔.Z[[jhZZZZ"..R$uuuvF#f|>cC}cMgg'x:N1 WBIxx8&z&&&ARKss3 0hmmeppNJqF# Njr>.233CDDU - 63yp88x FrB]z=CCC<( RSSرȋ󶧧GYB444RnSWWf#&&`0HKK t``fX,xA""".jRWW&&&g륹aKKK ᄅa2Ibcc$NyZ@DD477vOnAjgPh _6@?z(۷pikkG?4?:Dqq1z^x{-[p!:d:;;ioogΝ[N7'@FGGcPR8tٳD ogΜaʕr)8r .zdfyFp1FGGٽ{7rA;vT*AsA^|EVXJw#G3CCCTUU?O||<111 wޡ@f~?rP(0tvv222D000(@^FGG?Aww7DGG. .4;@olls?Zݻ)**bttQ^|Errr8utvvbZT*ar199墥ELL̜233CTTccc 3>>Ntt4;w> 77VK{{;DGGcZb`0@`ll Izd21<<^xLa``k6tZ aaakLNNn:L&]]];v<9cު7`rrvrrr0L188333>|"^uF?b9~8Lww7޽ד:'HՅVE$ZZZlDGG311!/711$I344$'sNJJ 8t:<O<0Ǐ')) ׋Bfp8fãx v;'O'x)9BVVfy_|QTfq!͛GCCݻdعs'###|w  ܈>M~kƍZvN8Ayy9J6T*=/`ttyT*"""fjjxno^dKMM ˗/X,ONPm6~?/Z}vx _<~֮]KSSq``vוJ%ͽދjp:{-y444i󑟟φ hmm@VP((--ɋZO|>ְ̔0b``iK||<Ν=[l!//vhii!11łlnZ-{zgѢETVVoߏRDѐ@ss3j[n>)**gLOOoEXXqqqtww_wC$I7xEؽ{7wy'mmm 2>>N||<dggˁ_D$f3˗/ro& Juu5Az{{Z;wロLy8@llGFF8|0 ,ݻwSXXll6322ӧ1 r_ k}.fKGG'==]!sAJJJ? Xd /g$&&x(,,DVC_cǎ}N:ʼn'p:[L~N||tvv244ٳgٲe :Ʉrk.F#6 χl`Xp8L x9vM^^aaa(++cӦM<#TWWT*y衇o~Cgg'[nę3gXz5yyy׿n 'uS`={VYr%vrVnDk4yIMMezzIl6 R8Njjj馛.^׋V[>BΝ;IHH;V;47ݎ;/ٍ7`0z!;;,X?r+@cY`%%%s͍rv{9}TTT`.:g~̟?Nq8ꨬ-%%͛7]N'Ν#66R***8v8]ZU(;w6333ttt1|ՂF#k֬gϞ=n^Ju9^4&&Fjp!멬$33ǜs299ɱcx<z{{QT^o~Xx1}az9vUUUnijjn"rssDSYYW$Iutݜ={VM6 r pBn& )++"ԩS,^ロTڸYbgΜ  |>l۶ χ易˗˶m /'[VaժU:tKyyjAP(P*\.T*|n7@V+x]Kτ1o} e^{{ x0rW.0:tIIOO''' 288(h4.޼<Μ9S=?~ zx<066###?%""d|>Bjj*.djjJXt_) ꓓr0Lz===ׇfnSUUhdxxE?rԚET2==-6Fغu5 pI{1JJJh4fZ-˗/[V+MMM|tRXb6(-[&ǞRSSjٳX,yfGG===Wu r-v:Ē%KnGqq;l6˟ ;;xV\ҥKݧ%Ijd2h[oU.Mss3YYYx<V+ r>PaXb޼yF_F~GRR&vBss3&I^6??ZyLBoժUre¡Cg…DFFrajkk)..ǏsA)--epp`۩@VsaZ[[?>TWWsq(++]O>8\.=J{{ljj̙3j.Bl|||gSSS8p!8rWf``1^/'N`ٲeB aLOO{n222( 9}4LOO ݺ`cccCnn8ɡFۇN*-駟TTTm9x A2c.&.]ŋ7o-hZZZX|9S^^NVV˖-c޼y c2زe fHJJ7dtL&333l۶?mmmh4&''ILL$ RSSCxx8Z^ ihmmj]of/^LFF7|3`SNaٶmh0L-8nM_IPZZJjj*n:ezHq\l߾[7JxjLt:FFFqqqTTT011ua4IOOh42==V|>SSSZiy=_fXd $Jee% .pQ(r⩬,nVqtuuj* $IC||<###7ԛjMjn0Xf :u%KP\\L}}=X<V%33>fff"&&4""" +Wdll RSSIHH 118gB-\L1h44 8NXf .AHII3ą=s A\Ҙbȭ vmX,IHH+V`222hkk#--իW$Nm۶F 6PTTDJJ< dٲeߏJbdggb˖-qY)++ddd NMMvZ &77b"##p`ZIII'4p7b;$22JEXX ŋ-;&;;,j5z^󩨨q0 dddݰj5۷o'##CaPRRBzz:gϞehhիWSZZJvv>^~祧cioo'%% Z[[1_tP(CLL r/ @oo/FDZZrFss3,]Q6mDff&.K2<Luu5=Мp~#G022n+000@uu5@R-rM*gnd_yЃ CvDA/~BFqNKfi xmCmC]??m.I,紽}$ Vŋ 0곺N>zB zaKsnn.DFFιO 999$%%!Is~cIyy9`I au^kZV!Z-@EAAn,R]<ƻn91Ε333\.N |v8ߡpF9Nk\nI`0ngrr=Mf %~ La&^ Y=AAGh'ͽtQJ~e>I]܁Kvqn<_.  <'.J_@W[(+a1g]c-V"rO"4 Z}jiP•~Bng^guvÕlu}|Vj]g͇fqOHHgbو疮' 555( y:4Bmm-IIIx<Ξ=KWWQQQhZZ[[GTʟ}||ӧOˉ.fAmmr5==ӧXshoo'<>ӧ|FV+մEcc# bbbƋ2zPSS3KTT:Μ90')Y?---_.W_}Kfhlldbbs=fuviΞ=+g?wh49C$.,2S(ngdd|ff^zkklv+ٳᠦp89s"##<8}4DDDS={BATTyA:::8w.K^OMM SSS$$$Jrr2$ ihh<3磮&$I088H||<˾OǙ鿼^/uuup̩S ..Nl6sFVH{{;vX,|6hnn&""^Okk+*799ɓ' 3< 1>>ΩSs79Dz̙3LOO{ED믿NTTG͹sjDFF^B, 曔\Q/*t}a0.!}]JKK?ѳ~pp@ p.]]]vRexꩧ|dff+wgg\VgzzZ&mbbSNaZt+gq>.+O{{3ꤤ\_'55hΞ= @XX477AΜ9^'""IN:1115+)<|0CCCddd|fǩCQ\\|ɿfN>b!>>ckVU|MT*<;5==믿NVV֜a*`4?r s+ oZs࿦-ɓfz{6ܹs򻲥Zn7qqq q{hHfffgm0:yƈ>6ӧO344Dll,,?|^FGGyw9sKLL v^?'@onnf``Z(++r4k'N`zz={Ve׮]={UV166FCC۷ŋs=GRRYYYKrr2:CCCTUUAw__gϞ%--?Oo>rrr q:jIGo8C?ጌS0x<-[NȮgϞ'? iii0vbɒ%( x ^u֭[ LKn08uO>$DEEBOOzX,y~^Ogg'Ԃ;wDr>F0sa>lI  h JEDD\U͕OIFF/111ADD p ,Y"_<3SPP@CC/DGGcy'0!WOHH@ӱo>ǚ5kW"==9S鍍aZٹs'aaaaXPմ3>>oMii)/26Dh4>477͉'XbSSS444 vpa2331 s$I\.9oeOf܌f#??8tuuIcc#ԩSTTT`4 `ڵ򻣦;wP(8vϧ{>ᅬFߋVn:;; ˕CCCr0 #͛vgBO< C`9l444`:tW^y ~?uuul6bcc<f3dٲe{OӡP($&&f{QoͩS$>>^𘙙avjj шNX||CTbXX,mmmr``FGGF Sj ԑp8hZ|hnnRFVKWWZI~\ZFv;ryXTʕ.0 LMMQWW'W|KdffRSStnqt:~ш餶qj5|ݎhDKS_xڈ ))I._ξC恁&''1x<꒧: ]U$:;;1 t:룿ZMxx8rIIJJs,%Ir9~!h4qq}$?G8bbbwy$AAAp>hlllؘAdd$dgg=܇mWWڵd 8qI233ٷo6mO266N#-- 2ef:N~j|5==-;ddd@ Wqbbb2p[[TUUP(.*Hę3ggOiii< >,@l{Æ l:uJu+B-[ztvvt:IIIa֭<{/<AV\I]]=pB ZR)|Lmmg<Cx^^'N`LMMxزe ^-33;wR^^'77Z0&))]vo~Fq\x<y^>9 ,YB0Dד͑#GxFFFf|_T*1L8qKP(PrIv;j RUU%?233ioo*xט7oZtcqms/Jkk+sv^~eϟ^,]ロn/_?ƍ`˖-rOA@xx8k׮edd{s1/_o3<#v|>9!ᠽ]䋎fΝw}ڵ ٌB( .h4266FOOoGVo>Y7̾}(,,9!TTT`o˲en300(.K~B, /" .?FXh'N`ƍ CUVy8:::ۿ[ZZZ8}4 ,-JEKK |__笠z&''h4,_`0ȓO>9'ouu5`8N?… zrv>׸8nv8wh4iii111lݺn$Ibpp#Gxb凛oyε裏o|}Cqq1ܹ8q4s'O߿ $IӔb2X,LOOى$IL&l6.VIPl޼^ϹsZFO||}5k|e~rJ~mv|S:J%$RVX&''ejj ݎn'099`jjJnYj;>zy7IOORhpp;vp]w]ԍ. kfc``,e˖K/aZ_d͚5dffkn7K,7xC2+t:d2/y,rssHUU/v8oP^^dy$''a&&&())o'--䖞$IÇswSPP@^^\Crxxcnn.$>>a$ȵέw^P*h4rrr?رc\0ŷmimmw%&&1>t-%$$PXXHii)MMMlܸM6hd,X9 Umܸ0:;;INNf\.ùXn&jjj8vv [q)((+<iiilذ!ؾ};  )**u3lÆ >|ݻwP(}կ~fff(--eڵKn5" )x<^uYhжDDDq|twwYӧ'99yi&|"įa6׾w]&''yyw>}^__ϊ+ؾ};tuu(0|> `IIIa员("}|fV+g3L$8u{=4ƛoILL SSS馛p:>ʰX,FGGiooX) b0qF ###$''S\\,ogZZMMMV5k֐o-'''J.X֯_Onn.ttt}vnVzgmh† app[ngrXx1iii,^t\wkB ,,˗ϳp9CBv;fIΖӧ`hhLxx8~;6lϨPK]]<;`ɒ%s]WrB t,[UV/i177" ϗ{!@ @ff&qqq{_~)"\.rrr(//ѣ<@~~|_ʆ!˗/rwΩT*C;<l޼JEkk+.{K^tog…dffO}}=vDذa]wڵkh4Oaa!W_}ӧOYwzz:A$3|"""X~=[l{iVTTxbjjjlFFFFP088"));Rzپ};:NTFV300 Y~=yyyrm۶q뭷>g 8q2vMbb" ֮]fܹs$''swO0虘4眅*B_Vx+4;SeV$yrTTw}7˖-}t:w2@jj*111 aو`ժUMUUyyyvFGG_T^Q* կ|rf3Jkrwt:/zx^$Ijr1N:E|| `0Hqq1+V[n͛7SZZJVV YG^^NB=jrssf͚5MKK 6l`ӦM j5͓^[o%~bcc;6l[o%W|R _xK~~>v "##kdV+wfjj`ddDjj]\.333$??w*O'N 77Á墵A^Ad2QXXehhQk;N~a6INN،xbL&<1 0v)**122b"""?~6zzz.%TRP(ddd'a||@ @jj2 ʅEANNy~t:~?455QTTf`4|Ɂ*++!//O~yΞ@l4 100@uuPPPRR(###j@1͜泥Nvv6 V\Ioo/?OIJJcǎ133p%Kr鑻kZJKKqX҉ ?rrssx<ZZZBOO===( t:555xoỈ'餿fff<++0L$''#WTR^^Vjtt*!,#kppPI`͕[CEkkk-w |tww388H[[N355(tttL\\/h4RYYIRR=== 뭫KSSSsQ:RIMMeɒ%twwJZZ1112<On,IKK#**^y0Ltwwݍlsɽ9L8rfY/|ũV] O^^Ge`s j4׋addD>|>())h4ʭsj=?w999s!^/SSSR9lR())!66 vZF#/]]g2>>fɓݍᠩIaX|r7V)((Att4>O}wP/⬬,Ξ=K]]TUUsNJp.nt:&&& ?^'MMMLOOqxxIvvb>22d~4 ̟?7r}Pkhxx86 … )//'??ŋGBB\r:??J0Lv6o,TX|9%%%IJ%^Jf=}hhH,\B\\(rɵ(twwzh4r{yy9TUU!I~mFDDlr uXXr֭[ ٳ  \Iff&W/("""0 rm۶IFGGYb(9 !!LLL`h4$''SXXؘ\)w/R(x^222d2qFy|Eh{\\$&&RYYIZZ'==poNyy9aaa$%%?qqqƒxN"""鼼<*++V 60|(++E}qԡs &B bccl׮VŠPPªU* Mzz:V3ettn_RR` 55xPa:..kRXX؈)>p2bbbHMM%55JEOOqqqRVVFyy9c}>\X ]z= 3==V%>>r<lڴRj5,[FFF\LOOZi4hkkcjjJ~C 5 :rT*333roYjrBii)rD<k֬ Djx9Yg~VVyQRRBbb")))DFFβeˈ!9a4bhh 6ȕ1$$$PZZJii)JKK)))vt:YhdffRRR2P(0 ,^p$++8 #55|XUTTycUZZJnn.CCCDGGa\TdFrr2 c0?$WO0[^/Ōyuh`00<<̭*'ݶmZVn }BlXHKK˓{Oww7EEE^JWW111h4ʈK"11Q~w]RT$$$088Hvv6%%%$%%`ϙn'&&FJJJUZZ*_ǡ^[ntڵkq:FZZZ\ m!"őJaa!PYYI\\͘L&֮]Kqq1]]]XVIHHnJ^^pPVVF^^Z`0(+W$??X;83}:hL LERizYuo [޺U{.xF#RHD"r9V%DJCJ"!SR@w|}}/>>ZͶmHKKcjjT;'B\\Za !!Çݻ`0F!%%;w299b!//-[/Ǽ<4P~!?2~8~8pIvE `mmm۶` ::Zx!++KhIJJ"0<G!++kh7qLAw\ٟf˅ ?7e "]Ddsq8vػw/}X)--*A9a~~wzH$ B! <(?~f033Cee%`Tʉ'*Uix\3 V{^DJ-uH$,//V7'w8Fe279޴="y$-NT* HE.6|뛈'}qmMD'IQ=y\==>O=X[~%H[8>x^AWG"ND ri8@7?l< _&@w\޷Ai)&`0<1D(Z٬aN'Fs{ V"W|q>~]Ň|_st|o\zs>[T iȍX}Z5YUGmYCL;Kx^%pxK0qqqA |$i[D0| "& }Uލث}/{( y1|ňT?;7_9Lwl6d (͎PWWD"bHNNQ__O?QQQh4:::>ZV*{X=H__111'j466rZ8Y]]%>>Ž{F,|Ħ(** GYY]]]B!>9KmmmܿFFAZ/,,P]]M  66Fyy9]]]a!s<22 "#0<~ӟ233C(buu)>CyY]] J\rƅ ŋ8mJ.^.\`zz͆ŋӃR$PPP{qKUUW^ǩE&! Ü?A(..fbb.=R299.]_Waʨfllrʕ+p8]*ri^{58(555Occ#ܼy ###LLLpABFz{{Q(T^R__ŋl#iiiƍsYzzzznR)}}}\p5aT͛7inn+WPWWGAAPǃD"\vMhY__^{7|>}FDDDDDd=@aXx~:UFGGqqZY&''! Aݻj={ۍ\.gZ zt[la;(ɟ z~#FFFHKKx׸r vΟ?ϙ3gL8& q1N87X__Q^Y]]}n_~WJUUP\X,ܹlN>|/ٻw/o`0Hzz:'OD*233fȖ-[Φݎt>Q$SSS?X^^VUUOTTo!JYZZvp NW,8r&~fggYZZbaaFGG楗^"##qjjj8s QQQ) RRR())aΝܿuH[F\\L&p\cرc/fLv؁F9sݎ%// >ӉfcvvF__]]]oe˖ >K.ΡC6\LF\\yyy$$$PWW'q6 Rɑ#GF&|:66F8&??j\ϜPHoω'p8½Gnn.wY[[Xz-vM(G~^~e^}Uimme߾}kvy&vzӊ"""""""ϗ ?HJJbeeY\\deetVWWvCzl8N|>bQ*رĞ={2ϧ7n"= p466v %CCCBY~2@V`vv6fX[[i:4BּCE2 Bt ,..BOOQQQX,8 væL&C*nD 322줼e!'J`uu,B* frrr8uԦg+++/~AJJpP(HLL އ9rJnn.F_~p8Z&!!HSYY ,--=qJ$(++crr4z=lia(J|>_, ["HZ~ x`D(++cll챁\.G"kAF4X__G*"J Bs)._ʆ۶m 8qB#?F#CCCvvItt4wѣ &Vp#aoFk., [n^JHss3㗿%?R 0 3??Ͼ}0ڵ#GkݻV21JJJhnnϟ?2J(:::hmm2ߑMy Bdff YvJ޽{YXX^$ 0KPNmm-դG[[uuuLOOj~ G۩[{""""""gp8X,x^, ;w$??۷~INNf~~SNKvv6yyygm&o ,P(w# .oSY=܋t:bj1( t:$''333#v&%%k.a@. o j#99ߏNc׮]|>J%:*>QTeزe 'Nfaو`0jzdcǎnSTL&&!!ٌb!==D|,//t:9}4'<߿[q?~p8n'!!aSAÃ={Ǐ'77Obb"YYYHRN'r Q,//+bktTn'&&ۍl  }Dz#>>cf3 hZV+µ6LdeeaXXYY!553+UDYVVWW/rEq~~>iiiB0wSRRHLL$::D~~>:NUx1Lt:X,ƒh$++Tؾ};J"66^xA|X8`0ɾ}*Zjپ};nVˑ#Gp:x<RSS`7b;h48NHNN&::HLL$&& VVV'??zcF#۷-[-MC>ۈhNNJq:nRRRHJJ"11Qe2T*cccHR;v@T"HHNN={aNMM%>>ݻwVY[[dggcZ&**,#Hh4$$$w^tklݺB< {nlB jh4r z"""""""OAl6P"5yyy*ol6n޼۷o_bܦΒG?/ƳAܺuqL&vP(Z̙3Q_DQ"e昈ȷ ! iN'Jټ-O`\"|/s.HHRAۀD" ek*W^y@( _j< ,!!!~B7,m8ѣ߿( p8T*ET~;33a]&͓Mh}}\ Ǘz xD:%du%eiٯHt:>ZQQK$@VVR p8Fl7n,|>S=}aT*ГJܥR鷲]*>q7U 6= ]7gU."""""""">u]|)zu&""""""""""_W>SjEUU$$$ ܽ{W0QYYI8sssܽ{W[{.ƢViooFh*>j:;;B*JVjjjp8$$$BII vdN'UUUV1LtttPUUl(--l6z)((P(d޽{444J 444jh4%(kSQQQZZ#>>%nݺE[[p8!))i#222BrrOs,VqbbbPT477SWWG("**JݻGGGTJEEÂ}}=rA>⾙l.K~VܻwD,r\zF{ U ~7O8񰶶ښ`gu:˼v<Z_n8q_|B`yy?B`xx(aX ^Ovv6PٶmܿdRs{zz8z(wBT*_رct:d2V'OT* $&&믓\.G&qArrre?KKK8p@xU*466288HTTOfϞ=( _x}}rl6݂/LLL pBdbzzZNMMȑ#BNCPP rssM ׿fjj2^2W^&jjjhhhp;022»ヒD"A" ҥKrz=QQQܼypf]v3gZrF#J ~OxNNsssl۶4jH$_;K$DB[[nBs###ܽ{F>C\.#ngb۩y~n2DVz붺f<#lݺRavūJLL P ;F `dd%AGG6 lf)//gqq2Auu5v`0}f޽Rdnn`0j󱶶czdffڊfc޽ /cǘ{ƀf&d8@[[Zm۶ ~V\7{B!ۇL&QЃ f@\NRRdddH;о}7볳|'|ڴ>7@wh4277Ǿ}X[[8v/B0 deeV9ugvvB`ivE]].]"33  p;hZp\B滷aoR*>z{{'O355EUU#66` BR__$ǎcxx 455122BKK TZWVVhkkonn !!!SNOO[&!J C[n"Jd2$ n222èjv;ٳh! \II FB@V,..2::ʡC0dffb0xׄ}JdSRRҒp=ikk1⇞@ww7P(Djj**t6l0L&CTT;w$//"^yikkC*"Hܿ-'"_-ӧOֆE"~/Yhzӳ!C BfY0000[vckX__DDDDDDDD|H\ll,$%%adggˁHNN&##ũSغu+YYYk.vI `~~^|E, IIIx^N>-=,*X9sF}"birP(DRR`xd2+++lݺшd"::hR),--MLL 撓C~~>CPh7ė"K ``ǎHR Oʯlݺپ};GtHKK#** <&7|xaϞ=l۶mHJ"..x\L&HOO'%%Ap믓.Y.c28tfǎCTx}<,GPjٵkv^|E D"񰰰Ν;9rDGGkFJJ ?DR#aF W4HNN_DƉ'bii +CTuVքx饗غu+ ,lGxX$.::%77,1L`0밲B8&55UXfTFF۷o''' . ``0h%$4c<0@H޽{9pP90`Ϟ= D_<筈DH; ?WH2-‘qO"FϺ|U%xo2g]* 7}}}GEy%"""""""">nSg'o>1y}H[ȗ3UܭV+1;;KbbZTTD("&&tDwa˖-\."..TJII ddd{<JKK>'PD\T@EE$%%͛7Y^^&==NII ͨT*bbbhiiBTT͛v|2T޽Kmm-9Kuu5uuut:Z-eeeBbA{ff7oxHNNf~~+WB8&!!HOOߠ8o'>͞Nctt;wߏjERQWWݻw L&JJJшD"T*:$*QqL+9˅^lWESSRqrSW` 133*GgD6򰊻VbccYXXF#QQQQTTbU7/QQQTWW ٲe g?#66{'+geejo~CAAoW^v#HhnnfΝLOOsM^x^F#uuu;;+ݘL&.^r yyyX,t:sr9.Ks;w:tJ n*Q*bXXYYapp*++q:$''oggg`vvJ{{;r  _i ,zfxxUZZZ˗ikk#%%@ @yy9ӂ ޷Bj444(jvd2@Mee%[n׿5[n8VfIDDDDDDDDwEύz9h4zɓ( FGG1L>}Ƹwm۶q8XVhkk#sqL&g%s!Μ9vOT*޽ZFbpJ~饗HLLDѠP(ؽ{7[lnVWW9pFVKuu5mmm NFFCMM SQQ={ 9wNn߾M0s}?d||sZFղ̥KPĐnsM_h4鈎F.ىJh4N#99lv;III؈h$ ETTԦˉAPp]{.µtgϞBuu5?ŋH$Ksx DWZZJCC/ill!.]D||<㴷 sWVxhoo|O׎~9™3gpm)x饗AӱT*7 ++KXstÅ رcܸq9nPL_ZZʳ;SSSTUU 6@{2uf1WWW9w>ݔ/2‘ \r$''WW1vfffO/r^~e|MJJJBR"`YXX 33(fggF1++#@II ---B1aV+'N`l߾cǎxHR&&& HOOg⢰DRR,//zQTBMP(DQQSSSe;@UU{AP__Ncjj TJvv6ӹc4p-[ý{200y嗙 +nk{nz{{jdee E-[l5 III /PUU^l6h4rL&Ғ9 "jÇ#Hw)jP(D0d}}]=s_ܽ{DǎcB>tgbXdHRJ% ( Μ9R7KMM oB}p@ Njz{{ioog``ۿE*2;;륻.ݻnݺ"S[[ ttt*ݻw` **|>;wDR҂n`0w^l6DEEpLB߼L&#//Oox<̐L&cii VFatt$v;R,z'MOOO~N'ׇT*`0~m۶ %|xDlbccfhhDBbb"yyy 033Cjj*YYY\.H}NN^6HٷL&cxx$fffHHH`yy^E&33;;KBB ԧP(CT_ԩS tttBzz:)))BT**"0۶mcyy4~Dhd}}Zaw~xxm۶188Hrr22 NJJ ~ $%%a69dz6k5k.NEl6{n%%%011!}ӉRl6ohyg*HmAO"fٸv6p>'Y 7}vv UpRя~AT" RTT$=dffrԩ*GP?}#"O."""""""+ ].YYY% qO>vRVtD"f bxkpZq~IX^^h4nZu8fyyY(mߏL&C.?r|>`xRs~-JQT@YDDDDDDDDH$fggH$OFPH~@ ؞9 !/>Dg$z߿)}#b]DDDDDDD[D"a}}~pRby Bp8%d"%z~L&Ӧ~f#B"<"%fyEDDDDDDDD9rO[auuuCDD9Y]]jc}}̎r;̦[9~8NfffzB!gIdDZeDDDDDDD/˿"JFѩdJ%>W [nINNF"0::nSPP@[[x^ ihh@T *PV466h|n `JIIaiiO>l ףP(޽{ܸqXA1fqEY[[?`0bJ^/IIIBPZZJuu5:Nǭ[w[nETƭ[$%%).]&--YΝ;GSS:ܽ{9222k1B%LLLseeMQlyƍtwwFrA֭[TTTPWWGTTpׯMbb";wP]]M8&!!D6 ˅^=###LMMi6=j455Q__/(099'|"xG0ܺu1a-.. шRjr/2gz*[lrsjjj0An޼IKK Zŋ9p9811+WrQPP@SS:իW޽{$&& ߧ4 hhh8}VWWQܼyRRRh BQ\\ TVVR\\Lmm-R.S__OQQPhp8qšܸqRRRY+r uuuTVVR]]L&krOO/^DNMM zir IIIpp%jkk'==*^/ p |>d2#̟͑@mm->m۶Q__O||<ќ={Çs-222j|ᇔs$ :2k׮ /P(6腅LLL`Z{.z2߇չ9())AѐmmmBfIse<磬 JFF`[nq%ك墢W^yEWWWO>!''G~:ܹDj56[nq1R)?9tH$hmmeff#GGuu5/YYYs9<1uS(d2޽KKK 8N޽NC.1LJ NLL b騬؇gz:::0\rSNqeINNl6S\\ݻ),,d2D*RQQCtFR}mt墤V İDoo/ aIMM}$sSSSjkkBaa!$''#)))8ƨeaaR;wxٳgÌ399^'66N8L&#@\\ͬbٸw999ܺu|ŋ۷Oh񩮮& cΞ=Ν;ٱcVK.'OFVVVKYYNS;w;wp"--bCEE FCtt4zb^|Etww gOOܾ}Lƍ78r%%%$%%1112۷op^gggo~K/ĭ[HNN&##8***HOO'##ckFFFp͛dgg .]$l455q nwab0 J%qqq055ETTϟ^yyy9  jT*T۷祗^Bzz*2\.IIIB!.]͛79vz{{EVs=jjjH$wFW^yDB}}=E"EDDDDD_$@ܨwl߾Bbazz!N<\.gll ̉'ZLLLPWWGRR[n%xF:::9r^dzCԩS,--}2KD¡Cزe Jшdb޽( 0qqq=z@tt4*<ӅN~? ::(***Eqbcc,9<(fDgg' \Jj޽{vV+رCF*++EPJkk+EEEAaSJz= Fee%cccF>&&&vDEEҥKzRRRLMM -vm68Bl6 UUUh4椤$mۆh4hii!** G]]&Uϟ5NHIIAs={.\rZ*gϞEPEyy9%%%8N0X,222HJJܹsvl6W^Nn*_!'NP^^Rp8࠰J޽ ävl6s P5u2..JJJ FٷoÏK^p8l&>>VNc߾}&/bXuFGG9tǎcffť%^z%1̩SZ$&&Nrrc $$$0;;+Tuݻw;v`2SH{{;hZJ%IIIܼyQQڵp8L8&>>en޼ISSŘL&~btgbccZ,,,>.T*>zlg("?ϒp8Lvv6vZJJJq]<Z0hZT*zݻwuVDdeeP(Dtt4r={oB!1BT"l~{mmϓǑd|>e@T200@QQg!T*_Ϳ7l6t9s_J|>'? Nbb"&99N YYYzzzHHH`߾}3>>Nss3 ѣ~n7d׮](Jz{{cϣT*!11TJ  ; t:9pYjkk!**P(!T(¹(JEs"\.' JRp^xN';v@#ֲm6e&&&%++;wd">>FCzz:{F####1::"\~ezzzbxxaMbqq&l~9z(`mb\DDDDDd%555\.yWx饗0zoN(wvs~`z Rz P(D__cm P픕Mss3}}} xhkkjfgg?#vލ``0011˗q|>ƒnݻp):::(--J룲@ hdvvۍFann:drr/ -@.^D"!99yø% D"xeG8#;hnnҥK,//#ɄD2䉉rt:F!::Mn߾ٳgY?^\.gzzx3??ρ^GVo zGAA1??Ouu5466ǹRD*2==ͮ]DPl63;;~ѣ( B& PR8qJlfMƿDO>(~\Nnn._k]]]S^^gpp˻Kzz:Pr122ArLNNJQQ.\K/ 77>c.]B@133eɟ  t:& %v;ɨT*R)ì^'55RL&^/`ttx`3xA|2{effg ~\\{¹vu$ On^;(r8d2vK.ۋL&C&1;;9wd2ƈ'ſodm޽ c!'==}\,DDDDDDHl6H$,--zͥF8f˖-`pIMM~ ")) FQ P( noH]籴$ uvvt:ARE0jbXd}}NGnn. JDfffb}}2n!@b4RUt:yyy8NFFF0l۶ &'%%aXm۶RcmmtqkZ4 XVVWWH$z!)Z[[O~&)) 0R^Obb"233plϓZll ziWضmccc͑Hjj*n%RRRH$,//344l&33D0ܜPj<11A||< bj|>R)_80$$$0$ kÇfJll dx^ deev /ÁbNGrr2 &R,جİL&d2144`@"T*1LBjXB D"!--dFFFH;K @R/kkkTVVrQfgg{7))@ x<JlݺJ.(2334 ax299@T` 3==-̡rP13334&-[p8Qp8LYY۶m#55uoo4ڧq:(Jf ?"=?nڵkv9a$oKKKOOPɩS""_wX.""""".gD"}ݎJBl⋌;& Hzx<L&3=FpAacsфbp|U뛈7DRt( ""=yZ"u_}i<#Yoy"r>7+[__`(zH_D{%M-qzLE~DJ~~oOm[*>X[[{affF,y.x^f=6 +voy<+/5*n7øMȷ__?H$n7XVjjjy&###Vx<;wp8LBB555\~MZZ.\ j_rV+ׯ_@ @rr2@ 4;N\B]]婲NnBR[n199Izz:|GΒp,DϥKZf|@bb".{F BJKKY]]%55Ux\. {.:^ϵkרTq199G}*LMMH8bp9***%33\.qޠ2XZZhPdt:|2Ƣj}6%%%\.bccq%%%TTT:/_D$ 7nl"rh6fry`||o~CttpA ݻwjߺ E `}}KUB0f3MMMQZZʝ;w/^Hss3333rȠ!r{V222B~Hff&nzZ-ddd JY__Bz{{h4288ȵkhnnf}}АnF#N4 ,//c۩"66w}{ ܧ0>>Nmm----ܾ} \z{ۋh$FGG"׿5well ˗)//gxxdVVVhjjbzzZl)..fǎqEijjbyyn k"%~"]]] ˗ٱcr,:4' >wJRpwرw+W^;޽ŋ$99VKUUnCQQ8Nbcco~CJJU>C4 ܺu2VWWIIIy֭[ܺuR 茜={۷SUUŝ;wls5z{{IJJr4 #"""""8Bcc4χL&{;stNVVx<… c08w o&-- FG}D]]gΜҥK B@yM^xjƍ,--NII ~@@peP*1==MGG/"^BbO>СCH$ZdddNAAnbϞ=QSS믿֭[dŋ8/_L?#99F른#G Hxwx饗hmm --fgg9rܻwW_}m۶ŋ9z(;vD"JHww76rZ-2 Ctt42::hΝ;Ree%---fyw0LhZ>E$z<GEZ[[X,oreٺu+ w^ r9uuu)((8M&vN'h4p1IIIܼyNGFFEEE|>x :;;{\.h4RXX  8㌏sm' &b(,,ĉr)))fmm[n;þ}ؽ{7P1뿃nº}6&4 p\x^f3z_uVp8q:455տ";;Jss3477Gbbp ^szv;|8Nj5w%66z>Luu58p_Wr222_;wRPPyIJJBR ?99Iee%?fdd3=sYn޼ݻ?)FSN -^z@jb6)++6cccݻtwwtww `EEFVVVp88N~?.SNq]z=CCCr|444V9~8rUGZZ] r ;wIFFFGRRR˗k׮qi]IJJ  jkkbpu:::7o[oQPPNdddr;۷Z.H%;w2d3>>ɓ'LLL`X8x VI!)]EzzzBh4?sll={p1v*H$ٳՊ\.'66H~~>2p8LLL {%cZQl۶mCV08Gl6KYY%%%hZ݋Znycc#PܹSx VQRRĐ#\DٌbR [nW>rn oh42>>NCCܾ}! bccINN&sٲe \zERPEdee:Uaa!Dll,kkk$&&m6A=ֆlfmm;w`X6ؖ}H$p}lقl^ AcA%ʕ+ܿ1vܹaQIII!;;^Omm-`377GZZ G@]]===8 A᷍+W H0\xV&&&ؾ};W\a~~n߾MQQ Il6d2NIRj5VX∍E.300@qq1DEE+rGD"2 Faaͫsx7xdeeY__' (rG, l߾p]zzz8r%%% sqﰰ;wX[[^r2t:rssIOOrjA366 R$ ;v &&f=ɤFGG /ߏ\.GavvEVKffS>9Wر;w:iiilݺUXT*jZJdUT\.A % ߿-[ ioo<߫Vd-fGr X`8/bx!N'񦥥??G.oXg"m>v"!!Z-U|zmX,۷\J%mmml۶ %ßjٹs'gJ% ,c2ضmΝ#}vJJJcyyrvsl߾}mh1xx;w|dDMM +++H$l6qqq,--$L&>BKKK2334Ʋk.Y[[w^rssJh41(JanjJ%*Jnzh4 ** /QTڵ,,,299` //qSSSBOOR3g1͕Zrrrt,..î]bll`0kD"ayyYtx<~pDDDDDD5m;ӃFa``z0ر~8|0,,,%9~,,,PQQHȑ#ܺuVٳI B? L&&&&I}}=fػw/BryyL~a٘"..qݻ ۶mwwӃjd^}U!{c0EEEQRR+BLL }}}N4UUULNNr}5nM 8Nd2O!)x`+ g2 \Nnn]XYYA.VH$,-- -6 * RHOOtu۷os9N>-+ dBf Y2RW^A ϥ֭[=zFO__vJ#͆G*b9rjr}taN8:&Tz{{&˱Z+$* 9GBعs'VR^}U:: d2O~B[[;vx*-0RSXXT*e޽l6jjjl$''[#>͛7Y\\dyyz B!=??O[[ p8+>#jkk9yp[lAR_E].s p8r㏉\z_,// ۓg?jbXH$ڵ_|?\޽{W* <ERvލD"! RSSïkxWqGL&rގNr_466rmlzf2jJTT'55˗/s a8vϟ_W~?? 66VÇT* T~[ z'P{nJ% N_fbb^zgϒiZ^^trp8Φׯ3>>ΫJff&׮]-[lSdgg sh4b?9ӧOsM~122BKK .QxWILL?ܹs†|fƍ{nl2ׯ_Dd2B0Ntt4?lbbbBxz%4 ZVI dffT*$ a6f||\ b~~E$ -..q&LFFFa|>r-[rPz!KsvVY2==8PJtt4###ùB`ddCrr2EVEѰ nG6 Z::N&&&hoo'? ^ՊcbbTN#66i~?LOOJBB0'n5bccevvV83=="B&nD"n3>>Ntt4)))H$2 ))Isssfr9X,VVV0Bj @*>p8, 166&́@ ??o~FGGq:$$$`4 \N0d||\xbbbXZZbyyJj>/%%L Պ!!! ="6k111 YH5 q?vasdjjL 2(v;ccc뉊ĵN'n{CAzi||NGzzc">Xa-jP( U~#JY[[CT RH >"lpOKR\.X^PT*ZH$|,..nR)6Mh  Cz# 1::JBBr\lTInnłRdjjJX,p8"..D###|>T*A"=f l6&I=<>,HV+ᾷl6>̭ȵJHq:ba~~"0??/\'Ľ *V f3 8N$0Q* 6Gd\ÅJű \DBR155n'##[!""""011!}ӉRl6oype߶/H$*k׮t:yسgfp,>;;K||^8EpA 33^zKeP^^N(B.so]pi1ڵd2/} <bϜ9 pqqycx<t~~ <~$ 'Nx@DDDDDD2-]5׋#** 6K$JF=ϋȸ#}O2uW9N׋%::]H`0lZa8aY BA(~ח=T*ZX}SH$BYߞ xy5rL=|lk """"""lH$#ɞ*@n`[rdܑHMc}u87>; }|}}EJZ_|d btG0dqq(|1nVWWt255ERR  KKK$$$0==M||7 p8Â7,`XxRSSh4{IJJWt:Ǯ.~߰gpM0䷿-l۶ @PjtttpE߿OLLSdn  ;wpMFFFdaa{)rssYXXҥKTVV 򕕕|G N 99U~H0bp5ܹf#==]xPs:\z AŋJk׮100@zz:{8n8/ill$ J__/^GP[&ֆl|*UUU|>{=VWWٺu+ZMll,ܼy OFFcEp\PRR`rNn v_JX[w2㬬0>>TΝILL@ (Jn޼lAl6X,\` 55uZq]]Foo/1<cHJJpEjjjH$O5{p8i|>ׯ_DH裏p:Q__^ڵkfʰz_N]]& Lqq1ׯ_gmmMpAy".\@WWsyRRRXYYŋ Jbppw}]v1<<˗ILLBmۆNs100@FFkkk?, fr\"(몈W J%TTFQ r #jCee%7o$11V'|=n߾Mrr2jsq}N>'|B\\qqqrQ:::|2pGtCFF˴pȑ'> ~|***deeaĉF#\xCVihhj V7nܠ={vwoقnNN/^$;;[Ap:tTZ-29D"_p8̖-[ennÇ388Hss3gΜax<kȸr9z E"PSSC}}=]]]dee188 gllY>,حjƍ?X,vN6MpzaiiQ|uuV+MMMrVWW}6n\~#= Q\\Lqq1dggT*zܼy^xùsԩSO~9tMMM#H{訮bժUra, yyyB!*++r٦&B$''saF$$$;Osed2Ν#%%^OSS˗/uuu,qO__?~`׮]tttP]]),, ~?۷okrYn&:jkk1 [\!sП8qtvs=ѣGȸÌ8qĉx<$&&nZ-jZ hK:{WTT`4D"֭C.322Brr25550<<ӧ)--@g|x^ʕ+<裟='//IQQj DBUUTJVVzbQJLL IVV:1g6KPT"dggs)ߏZ`0dPHܜ]xsΡR(++j4YYY9Z233裏8t\~Ƒ#GSH$Bss3ccc;wZQ_`OvAee%mFYY>ׯ_gddӧOsi9s̜ħOSNq9gxx,X@$sq:L&CVMVVJSNQ[[Kvv7.z"HD)//P|ǏGrYvI~~>.\ʕ+q>fdd{~zjVl6xXlccc444o[=>#&''QT̟?FGG1Lۿ$''yfR)~{4Vn߾l֯_F!##"كjTM{0رc$%%QXXjl,YBYY۶m#DصkӜ?sQ__˗tj*˩aѢE|rYx1 .ŋS\\)++c޼y,Z2*++1TTTp(//l6 #T*Y|9GbCnn.;w$ &?)) E\)**b``]vQXXH}}=׮]fրgϒIBBǎ#77+VP\\IIIk׮Q__Ϲs8w QPP P*˿`(..e˖Q^^ŋY`,["/^FztjjjHJJlٲ zzz;Bl޼yd2СC S__ONN%%%yˣ ɄD"nzYt)555388ȼyXx1NN!===Mĉ'N?#A_1K)ONNuVVXAmm-'Nfb@ rZZZxgQ(tuuիWioo\t;zپ};<_1FFFذaW6*XOڵk?4sQnݺ˗x"=AKK vv=oAbb0_^Ԋ^SSS ϒGwwu?1xLx RRRhooS?6̤MFF%%%p8DsX;$s!V+/2lڴ6⠱&Br Ξ=KQQSSSLNNM4%==`0HWW/ѣ#ˑt:P՟ˤ0r nݺEss3/^v??"Hx"gϞ滶 FP(D$!_$ Onn.:^׋jezzJBXV ɾAt:~=?U D!nSP(HLL cڵrJ*++QՄB!~?nNGff&@BBLOO~h4*A<P]]cccXVX/R=r!h4$$$RnR(**"R(t:rFt:f^dh4b00ANh4b2rN:EX~ҥKY`03DŽ^Μ9SSSܺuQ}YE_jÁ-;, LNN255Eqq/:,Ķ0j@Ӊ+6>].לԧ``0Ŷ3lڴ D[[)))$&&@H$bajj4RSSY~=?O(++ҥK7dddȹs裏y&---R10{. ݎNCt:E$e^}8qĉ6DR?4GA3|/~U7o>x <\v+W`X WAAcEOSRRRt&+W?.,ZA8p>|7ŋq8388G}(/^$11'Ot: yf\.ׯF~.\Ν;`||A4 r)Ƹtpw]sαvZN'Nb ϚQ( ?>t:L&j^OffhN___Oaa!TJ4ET"3;R_~޽{grr'OvJTUU-jcK,@Yz5.\`ҥܸqLl6*Ꞧ_GyoΊ+h4H$q=onP(O?ҥKimm*kr|be||~Z\ =n{իWcZ$'')Q8?v7nȑ#,YwA^z%ŋ,YEq%~_ z'N8a$6M###t:222D-#zx^jF1dffwVh?887 Qm0#VEfAxbZ ͆V%022T*%;;D@\Nnn.^JFaddp8Lvv62~177ؘr\"FJ&%7~YFzE{łj?Me,Ys?ZhTX,n7zc, &iN4FBB0 LOOdJ$d2~gF9zx<9‡5Äa222ľD"vL&}\.jb2D?UǃJ" !Jz"cccddd x< V+A|vv;FLngbbBK>QQHxP)|> ?JJ 2H$^}D$AR)`iDK4 @ jcQAnc0D0::Jbb"&)zbGGGdff244D$ZlP(h,l6`R)t:<JP(̸8N<b^j$|}H-b Z͆dv@ ^n5NSlC˅Jd21==NZ-Z9B*Jlq/c*+kOLv\T*]~n: 244DBBRTXiXVl6j~F#G{=XwD0dxxX<@J8&&&HOO'!!@ 0 n7SSS 1g2_1A0A\ckT*eppVKzz8ArrrĘ(cccs2qĉ'ΟhDDX @ @bb{ _'?]˃>[@4 'N`ѢE_I: _1AA#==[Oq2[@qU.]T*So&իWjƍ466"j7~7h4ʹsB"Σ>mkAN:ҥKu'N8qSSSb)qH$8NJ%j[pf : G"DWU~DfCףP(H;4@Gq`0HBB·#6Z8qĉ+MKK\1se!yĴQߵR:;wUS*>Fbo?1?3N8qĉ''|}]wr\dH$?@;i>ρW=>=zT*Ɖ'N8qn0;; ^?"Kr?^ۯE+lSO^Smy팏mMnckv{!{}Әn?*!300p_ ~vIp8"1ηbsv:Qn~ng֏۟;G~nIm~'N8qr?KIMMĉٳvկ\:ݻ\R~m,Y[ndB?Ϲx"^B$ PP(Vj{qF~z(  b߾}twwSXXb??罹q>N:E  //'O?t񾣣g?#//L$!11?GbX(**ܹ3gΠjl۶Ç3|T*'OdϞ=ܸqCLFyy9nW@BB>Ǐec4ǙtclQ>#JKKбqhmme۶m\pDt:;vX,233ٳgGbK.uV>#EEEH$n(޽{qbۍ^gv~߱lٲtKg˖-Xsk]G}$d||seX.  ,= 3rnoo'33S4h4wdΝ?~Ir ۷oʕ+100{ǹ~:ٳcǎrd@vvgu||Jzz}խ[r%1*'ػw/SSSsɡC#߭{k(b|eʕ+lٲNll޼QT>}OO8qĉgXf\.z@ @$#=" d۶m;wz֭[;w7|͛7SRRBVVǎϾ}(,,D׳}v{9V+򊸁#GT*Yb;w mJKKY`innfʕpE(z@mm-cX"p =䓔 Xt)Vߙ7o@722ڵkIOOGPd._E&q)s1\ҥKˣ)\.?8 ^yxHDرclnݺիtnv;{S.k3gXr ߿_~fjkk9s 65k3BDGG7o$//M{{; (J Yr%ǎ5O>vmallG xҥKSOqI&&&<[[[Kuu5۷obc`0044$NtRf3s͛7y衇h4nٷo`Vٿ?FJq\UUU|$$$^g|| xGɡOdggk.1]x9x =؜mhh[299SO=ECCKRVVtp5n7R^z7nJzzks[ZZ8\βehjjbʚ5kˣ NǾ}HMMeZ={۷ߗYWIVVX,***HII! ªlF288HFFEEEt:, f֭whR)CCC={J@;o޼Ioo/JJJشip8̪Ulٲ^O(bϞ=ݻ|1j5.]FΟ?OWWZRSSٵk@OUUNfݺu?&xꩧbbb⁎o"v"))^xh4y'ܹsNʕ+^z&&&hmmeմVIIIF[[/^@ @OO/ԩS˩SPT,^&ioog͚5RVVVe߾}pBVZŇ~H0D׳sNQx 6EKK ׮]6q1(W^W/)HNN&77ÇBaah)'6B!FGGbll VIIIm?22b.Xr%RNQK].b^~ߏ^璞:;;a||={t:HJJ{ Laa!޽q^իzjfΝ͛7N7==޽{Yf ?0p6֬Yf6|>rvXN TWWSVVTTTP^^"RTT'N8qDQ<GL+z|~(>=MCC DQ^/~׋ٳ\vfyg0 Jff&o&?y&SSSwWՊޤRyyꩧD SH$//0ISSϟh4׼kܸqAss3N?&@ @4%11kײqF]F(9?44kFQQ7neddWWK\~χʕ+Z: dggSXXHAA-Jq\^ 33,1wbVrRGgvٺu+<tuuP(˿K"Y|9 ^z B0999tww__255bs׋F!??_4 ÄB! `p8|׃/!55RIZZeee$''p8tb2ču^^yyywix'8p rVߏ $c\Nnn}jj N'|")H$At3 0??$v;F2ˣTJ  ;;b((( ''C0vvq\|>()))s|Bx 0 @VV\~t:G.Vh4eR3H$qL) n72 ۍh$//TA ev~A… ;wrٴi+V 6T*aQb-[vG|Drr`o,&33^/P#3_LL&UUUv_.RHHH:v;SSS|>222LVV& ׋nݝ233Q(9.*v&55LN#99VnA QXN'6z=6 ˅L&?C'N8q@ cXZXVv]{twwT*1L89Nc\zT*֮]ŋjRTTdrrP(K/jȑ#8Qy;֭cݴzjQƍiii!;;zcǎqUVX ޽n3,X0$ mmmݍD"ARa4ԩSHRVXARRk֬d2F7osɓO>Ivv6׮]7 ߻Nh4w^JJJFCRR B{.]Ν;bPPPu똞FדNFFॗ^RSSw%'' 2>>N'oj#G0>>NQQɬ[N]bلi˪X,x^(ɢzH$h4^/VU߃ra0LNNh q1-eLfL V`0Hzz@]jӬDt\.j5t::)BJthR"6BVDD*$B0D*N @PVX,D"ҐH$ 大 2'''z=d2RSSQ(~B?*Ys:t:R)iѯ_ 7n'? HD4ZH$j5F("%%i^/xHIIncۉF Ʉh$ zIHH NNNILLD"055&99YqQ0z8J%z^X[d2~((A,8b~pAkP($ Z4 uD(0ơJBVh481&L&9\.4 G¯}|x<|>QskZ s^l1CbA }>ۍZ&: BӉ}\ H~:}}}wwD" 炘x\pN:ūhDv2nJ%) CB!Rh2{d2xF!Ğ۟'Np-6mڄlFT c0ZIznsn. Njj*Nh4*'>~? O~ ŜAP(@urr\N(7h4b6rZ!A&''5,6/a Ɖ'N8qvb9{ _'?wgt:9|05k3[@*-?bE8ɓAU^^ׯ4H:nݺEyy9W~f $f͚?90}}}^Յ|p=zΊ+>u D"bqXvxt:p<:܎'N8q||)z;77k-|  rDw ӉJh7&/k|v^C _U8 :7Y;iLL+UB>PpDχڼ'N8qĉ]&pO>E&bf( 0ϛ H$w]޿_bEiR露Ŵ0^XcAm^$W=cuJbП1v?TJ88sݺuL1'V{ɧnt"000@ff] bF#hZL&999_c劵gۄD"vcZF! 288HAA}?nj`;~׈F ~FGG]w;ݍ͟5a\x\rv`ۉD"}߮<ۤ41-h^^]]]311ZF2>>N~~>3=='==>pz+gͩMw[gn3O|c``1***$--@ '55[nQSS^v~ucu>^续p0v8qĉA!#:ѣٳrss1 8?L{g&&&(--E&qE~_b x8ٳq;PHt|2۶mt|?"+ iooI~_˂ c֭:u Caa!Ǐ緿-餥3O p8ۿW^sر#G022Biid۶m={N^g߾},\JÇٷommm000/K\rDhd֭8qݻwSTTDRRXoL&VTs|gol6ǎ# _ Fee%n̙3bT{rA)))7==iy6>?_|tt@ ׹x"^k6qOMMF ~!'ObPRRT*̙3l޼EݷF<5Ann7 pa,Y2O5Gw,o>;ٛٿLj}wzzw}ŋP(n!ç^6 ᣣ߿"8@NNhX}ugg۷o'vX6f#NB&3~SSS8qS\\̅ سg8vvvuVΟ?/>۶mx5V;w$sRSSWH^(GLvv@CC)))۷|.^(Z;~8yyy߿ȵk$11]vDZcLjD"L.{=Q(bz͛7y9}4 ɾ}8pCCC;Css3999D"ob1UmƉ'g3ΝcddD<$f.oΡCp\&))!IKK?$'':1[Ȏ;hll$11̾}Xg?ߓlݺgb4jl޼'NDbݼ{a4ihh`ǎRPPf7 ׯ_gw_ D¥Kزe ׮];Ù3gHHH8qĉpF猪 d;U*˖-MEEǏl G?ǎ#-- RΝ;GeǎTVVRXXȡC0l۶KRQQ!-KRjkkq\477rnFa={\NUUHv֮]D"!//"oβeHMM ۷vjkk \|z*T*,Z;wRZZJRR[labbe˖QTT^h4r9/_T*_`ܼy6x 1TUUEKK =Zv~z=[nA8v 466RYYIgg'cccZiY|9 PZZlСCsqoGb0 tvv"ٳgV+CCC(Jnݺ`׮]dddpYR)SSSNS ~H$Ç|2TVViN8ڵk޽Qzϴ*M sl۶K.ɵkhhh7ok.Z[[̤#G >lpp>+W`6iii Q\\LGG;v젻dΜ9 W\!>C\BRRfYŋٵk ,&(9rDƷw^:;;ͽ60[@?{,* /~ III:t3gΠVimmѣ\~p8LVVxh4J]]bرc$$$Gjj*N_΅ F"pa^/>({%==:Z-G%Kµkx1L,_F+F9??>ILL͛޽qfqmmmر7nMWWx@V18p3gΈi9;::dttqd2۶mcrrP(ĥK(**jFGGEsIGTb۹x"YYYnݺ(###r:;;r :{!==> ::tBq\B!ϦsU-ZDnn.G!--#Gor gݴݻX,,_RcӦMڵZhnno~^y&''bٲeHR^ʺu:t'N055E^^gϞСC {3<$ttt`67og'N8_*_D@*+VUUq5v;VB*211ARRyyy$''3::ɓ'%33Dc``ׯ3>>dΝlj S[[C"B R߄顴T<=7L{}}=TTTF`޼y466ed2yyy &AnܸA(ڵk>|XԮ3j5l޼!rsstsrgffRUU%/ViooڦV+]]]< ٸq#7nMee%:4MIMMjf3Nn&&&vsi]ƥKpႨh4455q%]ٳgl3==MMM VBV˄B!,Y"jT*VB$ 'N^R(.Zǃb駟#p]p_̍~aILLOr;ݻw}RSSd޼y;w7nw^VZs=NC{1A… l۶ NL&cϞ=s]PPY|9ԐSNuV A7Wbd2Ƽyشi/_1LO:nܸ+a<3byf\L&Ӝh瞻=TTTw^ű$Pb~h4ڵkQ(LMMaXW0j{R-f^wZG}|LMMٺu+ZM6DbgǎA^|EqNGVB`rrIz=IIIXVN'hJʼn'hoo?|L&׋L&ȌF#YYY5vzL&l6.KxkXN=SPPdtv$$$DQQzj~azzzjbp8,jbT*7 v']<(d\F#Ojkk)))!p8Zf`rrR|ĉ'N=Mz-hZ֮]EsM0<3,_sU^|EMV7o޼{olzʘ?>>JL&|L&6nȊ+aQH,n7ZP(En$jo޼/nGTdΞ=d"AjjjX,FE2h4&''?qj:D^rl29u$''366ƢEd2QYY)7??N,/j;;;$++ 4R%Kh'RYYy}m`\.իGGG .T*###\z[nQQQAmmx hmmExXhׇdB&SWWGAA~0K.E&a28{,---,^FCGG:MMMbL xAF#/^dj|>Ch8}4 Ɛd%vSTT4=n"8_Ο?nFFFXhSSSx^f3dddP\\Lyy9ddd022"Z,`zzzD?mKYY]]]244DFF:QϟOGGUUUrn6oތ`fxbill111Gt:ݜ9"6n܈J=|I9{,W\aŘL&~T*]@$ ǎ^֭[Gffz),,‹DM}VViii\z())̙3更EՒ .2^/MMMAy˹uuuu 6mڄFallLt̙3|r-[Fcc#/^ rlގF^ e_Fal6N'Z%KDB.`r9Gazzgy06r|6uvcibzL>==͛9j( N'HJlt0sń&KVV {y^z=`AqTXy񐒒"yF$Sh4*߻_˜B~?j`0\.#A`llt(PJt8fjØ9bz nA@P f`0Pbm b bx&\.1uLh|T*Q@s8d26M|4ɄaZ[[)++C.r0͢ud'==+VՃN/R)JOBBϥB r$&&yh F~? `2tf"Tp89$ ÄB!Q;fA[?bϠĴᮖ8@fqj9=.<ŞX`08g>D"8r/T*5.v YsjlKRjv֝ڒ\.'<狇"6M<U*k}z#su\߳GT[bsYlNN# kzl Ibal6J$PTbS.ΙHqĉdppPߎDT8ǒlOa]biB!gy _1AA _EvZH0$D?Ӹ=n$ ,knoL~~>`nYj,nH*~SS]lzХ'N8qƗ"OMM19=9ŌTKdF{Ҫp0/DB@&!Wȿ?hf4Q! &`! P+P4_?j9L*"J{}cB" Hr Q.-FpoRT $ORFH9KӑIe9=N8qsF"ර1iMhwZ .2#-Q 5rz4231֥c;M!;@DPC zs;*DQ/8,6fnESH 3K<$GF Q Edi83q+qĉ'N8q9D/?.;t |w"/ƯA3C+q=_ӁiQooo0)L8lA#&suB3" ß\JcA"NC%S}q r[3N8qĉ~r|neSf`Rhp4,nd3fRLA(1c22$#AR)Jٌ_o캢I䓗\*G&?אd(3e3R!B$:H)S"H ȥr)hH< A&" |G&EB( dҙ1fc"(d $*0hD\*'eVJ?_8F%S!HD#sWܺߍm :~[}o%̘~L?D*A)SΤ!2L{#AA@%8Fc/T\*'%:WyyC~&_p!)(eJJKUh3i܇ofDM"7o~3>O\M.kzdB9J3TrՌ9~4L(23?͞2 LP\3ccaB[3G!S̩UH0dqb6l?dxa)uu8N6oĤ6Qh_a?l^~\ǹ8| Dx9ʒ=lRǛo2?,+ĵk9cED-c3y M(oz4 7qu*/T@VBao ^x\ͩSNZk v/2|a@6lmJiJ)?Z#}4 5ni祪Hӥe~NdmU9P_TN(B-WWꁙ D"!"DrMC\e3S$2H#ȥr{7潁Ymf5ʁl,H)G!/O?}Lxu -7m7ձkNiT ;p} mp4L4E.#AB*^⧍?t<e3vdT^xyx'03bc!v$AB(\IJe5x!HIe#~fx8ǂHK儣adFqP ?>DhCJ{;bZg}'}3}dɓTTyh^| TFh3,xeLj)ܿRV8No:+0dpco_y!*Pd.b}z.^0˟G!SQG\c cavwF)SB \63W2S7T6s`ˋ>kLI"}|p LAT~|߱v];u1 gJG_ LL/UD6 WG}hT].vwGxI6ny9nY'N8q|ǹő\2鵌9X$MFceIeycpO4s)TܰrTS闼{]d.aiR\̆I侏=ΨkTҜN:-;jk9:C*bƇz~4Ă4&@p$0 D( nLs10Cv^x$m3sqa?F,Xk[Xj e23y *r\~;ﴼC0靜SgT_/k4r ra0\`3KU/ H8}+^d=Nd;$(84}/To&֡)8YG iݫRt)dOLZky /p:={_y#a 㙲gMȥ-h-m[16o-Q!ʑ#(d .}L^DC(@!չ:~j^-`eJY$m/X,\Dz+z Iao^/6+zLN:,7lTT!vIq [yYIzucY24 WǯK#ߔ雴MTSȤ2N:$k9V嬢ifo ;Wǯdɓ4 5֥XMe GiOyy)xo|Hpos!D?tG#ؽvޘ== xUA7W ,^?pajRkHmml,ɾ8JKDK/GAd C ,Z"`xyTro]z \L*#Y?`Q"-|BV15&x]Ős:*RTo[wMkYm8ĉ'N8q45<4aAuj5:@&׎e浑McM-LyfrZ L&cA%əZZåKD>@&[ӷB.} ]RNk'p*p3鞤6vK;)K&ט˄gze,bOr )4RRI1Ǩ2M#8|~{?N.xLND{:PREuZ5]S]l,H61dr577s1/uV:3ag.i)΀Y)40k̤Ҹ0taNƞBjj(0N3aBM&טK1 SsWcR^?KD+^}h4k51¨6x#L Y,j'=hˤ>陜94T*%ߔϕ+8}N&L'+^:\ CqFq]$k0F*R`*0c֘yl3kw$H8qĉ|%JM!ה4]S]K $"i4{;ry*Dy)ayrMM=O[j0WƮ4k)Vca9L. wM$K"`$ν"!Rxez{zs~{?^yDM"U9saV}LN@ׁ/] & Og^ϋ/e?y7p2q;vSRGթd'd3!A@mz-Q(S3=NIb /Tw1{:Zkpf Q, LGyQV箦---|^N:k5Q\N]Ígwu똟6}X{I8qĉFbDB"953/o+nH2L৏iZQRp+SFB6 X /@b :dR{& c1х^ Q *0- UhKD΀s(߱M4̘zAt!ANC.# IeDQBz~Fp#HT H"0# K%R JHOȃRD  Ds &HŲ!ƬzqFg 3?֬I 4/m9M/.H)t"! jŌpQ̴!@rc9V5H3QA7jB7% ȐbY2z/GBJpDॼ8m9ͤoLF! c:غ@!U* ^{;E.rE&Id"D#3-R9p$N3/$i(4nIR@-SgR}<ggEBha?JBC 򢒫PT"!R)?Yv`9tw ʌe8>z\!pTH"(2L0*Ru<&3A΄̜q@$L*C zIdhZ LE @РH$n8onBẌ0QhP<8hɬYIh3 *hw ̌eR7% $s jsdz ӱcl^|~q|.^53z2XƠ4̙?o'6+ $ ΀ gЩt#3V s|D0 3cWʔb!t ]ל8qĉ'η,|濣P+xtT*ILL.F!/^XßDdtu@( 8 Q@ 5#mߎܲy"{v.j{>q}s E)S0$A~wDPޱI;) IDo}_|fYOz~B= a ހo{罢3?CМ1;g竪o8c Q<1q((0Kfbgۉ?2>>ē9sTtkNs۸ >X*&D2#0&k޾QIDy,LxOOă;{ܘ ?o0 bÔk~(3~f~XK!rǼx͞o Ν#|X`{^Nuysj8qĉcv t۴&Z~mAkA IIcU(9X!;Sw,gvۀ@"De"ޯ zFp)Ȩ0TןIW}eb}UO8qĉ'Nyyl,߈JOӠ![V|^_[% GrrA>uSV4j :;7o͟w%HxRS8[I4%P* ~e-?Ο Grĉ'N8q|{H$  FjwL%R 2kL!C"iˆT6s %Hҙ634$+lf }A AføG*zm8qĉ'NoRT\P("s EH$Fb~XχO .ko~<ϟm' x<߂ zq3?S6AD3n7/6 PHl IhtNG"<z9_\߉Fs|fID"npAĶsbx9 9\jDg WK8H$B8&t:E1bc:̼ll^"cX<Ϝklj'N8qypH$x^0:tr1XVHRٲe GJr9Og?=lٲFZ-~#~'  js!ͽ y^  ݻwsQ.]DQQV_ttttRٶmObPVVկ~EFFL&۷oɓtuuQQQR9whh͛7܌^G{sN.]Jbǎ;vf?9Z:;;~FWW2TlB]]---; :r^ PDD"!F.޽{O2hnnfǎףh0 wn9|0Nb֭211֭[ijjl6#o6.\```*R)nFL`4n^D"! f" Rt&Z@ @  f", *#JIII$6 hZV^MSS{ڊ餬 9 ;y$隣L(o6O&`6ٶmuuuܺuKSF}.^HVVfA7U8qĉ'Ο h4Bql @&hzbb"k׮ڵkx<*++9t===dgg#J9s ?9uIIIH$<?0~!K,{A{{;*ǎc 9Ν;䡇b׮]X⮕1AUTš5k8&''Yl~zϟѣ|ˤ)["_FĉhhN;˗'557 F9~8gϞE.&@ ={tr\<:-kZ-[F(lx8~8 ,`Ք&'xTN8Arr2<;v+VV1zBBttt 9y$twws99}46RQ3gp!Z[[IKKFSS>aB{exx0[@|2$%%zl8Nȑ#g׮],\a&MMMܼy^HMME&=$ mmm,^A7U8qĉ'Ο _D@{JJ ###\.-Z$n-ZD4jb6INN&111;ƢEHLL$˵khnnfhhZ෿-AHnKvv6p狥IMM֭[@uu52 $ 0Z.\ 0LFZ'ONaa!P֯_OOO._LNN͛(JٵkRDJ%&w}!P*F8''zn~mr9J~IZZڜ:GQFFFxGINN&reDZX,>}|^xFGGq8vyJKK)++h4rQ233Y|96llf߾}$l6 `ʕL&<Zd2pU'77fZZZd21>>;CRRjnLNNw^^hf1Bqqj?$++ ιsXt)IWW P]]ͳ>Kaaხ=2'x6FGGdyw(//p$ LLL`ZYx1SSSdggT*%ȥK(--%99YW4% *^Onn.x8qĉ'N=v>~iv~0?;k6`xxB^Bknnf޽ddd3Lnl֭[q\HR<< ~:---׋&=6l`ll ɡCz*:ZF(";;l2FFFD_'''oo)++ DK `4yGyߓJGGǜ: @BBiiifESI*tIII$$$pyEx@4'xcq~S]]ͪUFB!B455rJ$ 6m@ @yy9dddX,#v " bz8N\.,!eee<3477s1V^͉'cżKt:6o~.Z vQT[  9z(HDƍ/0::I^O>婧b͚5TTTy'l444yE222Xj*j{rrh.^[&I&&&HNN&eh4B!n݊L&c||"8}4cccwt\}bz `'H`XDJˑXqd&yOv{wfWvbV %%Q)NA` E*9GG{~mر+Wٰa^?S^^Nbb"*~Q222' RTTĥKd۶mpnܸᠴCMM ^m۶a28t#x뭷hjj+V099Imm-J[!T*`l6 LLLL&cݺuTWWvJKKlVY6)++cxxDrrg e1ԩS\pA[lϦMX, 裏R.O=DVVeeeT*v;:lj'HHH `XHMM} uL܇|2>KRTTɓ'ϧӧO3::JJJ ˗/Ṙ^N'㏣T*Z( RSSAr1h4IYY7n`ѢEbJn-Jd~? ͆JbŊSSSæMW^A&1<yn7EEEx<Ửhč% BhF3_P(DDwRIXحx<4f$E֖3=@F:"^ѼZ-2 ˅L&CPRx<~r9:NH,d2Z%V%K2] %JJB.|njЖMMMP)Q)AF#? Rh4L6,,|8NzŠh4w-I?oo;w111jd1/O_6`HRR#?!b @@ @XXjZT]|>2 Nwߩ."D!BappP(o3A [p6WW(;~#m^6i,O|u:߭>~ uIBݾ~s/e3 ͆^瞛 ga83\>OXY !}'K.LOOk.2331$+ RRRHMM71P( 3ZoqМ_ȵ!B"D!|РL&2 ǃ%<$:,,iЃ *NuG?}$S^^Kjtomqt:8~?QQQŌnCGttW"p8>nC"D!B|=dϚjAw\~OJbvv DߕzKt=_<( juH@R|"D!B07.rϝd2ݑtz[&fY 6MZ" xe6|w}ngzz v\L&N'p+@" nвZrW@ n, v v]Ӊdl6VUh|>fY,ӸnіH)\.gjQ?5RP#؛)EHّ֌{oF"D!Bq4k |'`ժU(J~5k֐7gΜaŔ]vHB&#ximmeݻ'OHHHG?_|{͛7*VK.hp\( K,^O?L&h$???իIJJB}n^/^z)N:EOO6mb <(=.###"׿铒dʕ1::N3M[[r={p5bcceѢE(bbbāfիz=deeqyDRRRBRRW^%//~{P9>}KRPPڵk,^z=:_TTT̛!B"D!S-Mww765kPUUeҥBEdd$ьq V\IDD><]FUU###$$$0==ͱcj\FJJ ~aY͛"ɄFn … Yh ü'O$%%4<(?#GDD`hiiaӦMDDD`yW #""k׮NFFyyyTUUQSS[oELL&\fffdffZW8deeͻnrrCfr?~JKK1( ٷoӧX,$%%qil7a!6o^Tfgg/IYY6$h4]!B"D_Я_{޽{IMMNΜ9åKPTX,F#fRpUnڵk rJqINN㹱GXX៫rUUU=z'|RRYN'oݻL&xI@ee%[u155f???A055!++JJJ{^&''ooXhMMM-!(++cڵL&m^ X""")$WR)4qTTzJO~ lnyYlV VzR[[+vbҥMrr2?g|||3F8n)v;Z`0H^^O<?~ 6pXr%O>$qqq߿,djT*eeeYIa?7L&[0,ɿffB}<\.QQQ}H[oopp8233CJJ xzE"D!BqWx?222zGyc0(**bÆ X,N:E^^vbƍ ٽ{!B"DD>b02)n7EEE|>~ȍ.fKZWLF T*iT Q@Y JR楰`|~j;/ie20"KF`R)&Kf*`0L&ϭ{0z}]R%m<,755NCӉ;_fۿE.ʨP(D@1ߏJӉ >>^%hRT*`Pm1bbbA4 EIDAT%A0h4$Icw} ##YG|18 R=Ί1`0sGBb: L&m]0.kmn?kR~.D!BPBߎjEV3/3=ZJrAB%E.+h~ڳ( vc\>nsssϽBC]z7!Rٹsmt{]ncaP[\nm}n~Ud2Q`0a߾}‚A@ pgAj)Hw{mÌufn[Ν֞!B"D!ܡA7L++L&|%{ݎJ",,;{p&Y|SbH~ ͆N{hB:-<< ܾ)͂gEq'_"D!B⛃$[k4/A4nG8N\.<3e#j v ˅`0HTT}Y{<@/pv"D!B⛁\ },h,˿r3f'>W RoAS=%c;feo!B"D!9(,5{BB)~?aaad2HRpLNNT*QTtjdX,l6\d2Vņun`0k)Zfa21;;dfa^P(lLOO6bމ , p?|zzZ|jd2 bp\I~?ǃdn299)'^A$!!r&vFqx<"ԞRK$f))\.fff2oxn0DDBNGARQ[[r0w R*Ki_͆b%0Lv ^#Gv܍vΜ9Cttz4N 555 uOzWx<T*3^I!ByS@?v.\$%%h?9j,^}Uiii_~Zf3oPWW#..N <_k׮x˻FnTVVRYYIVV333wY r ===syhnn?9K,b/255J`0 kQQy޿?  .Y~=j7|WrRSS0ZV ˆ_466RXXF'Kf^W 0\.Պk֦rj#/&,, &6#\ڵk=z˗/ ॗ^zt555߿8|0׮]C 5---P(V'VURI $i.~i|>j#VٳgaѢE( fffp@K2Vաh_6mDMM mmm477jۿ6RqOÁ(((`rrSNQYY%77wn7ǎ7| J***7nܸ~+\.%%%|>, gsAΜ9õk#<<|oF#/2׮]h4dɒyr0TWW;d]/R[[o%Kl6 71)foRTUUrezzZrY^z%N>MYY>qqqt:j5ׯ_رc\|OZZ.LOOGMM =C"D,G@mسghoo,LNNOOܼyKLL /`0pYVZEAAoH / /Boo/{y-[ҥKOyyT\ή]j򗿤۷Opq?fjj_|֭[ikkr0==Muu5x<J%2,g% 22>N~~>qqq z)9::޽{9{,l޼۷rahhH+<裢>;* NRRӔ*=os L&+WRSSCQQQQQ\z`0ȲeؼyC%%%\3g@VVpozygjjl^yۇfO>a߾}T*y8 ѯ rN}Y|9<Յpݻ8~8Avٳgq:r֮]+r/^Y]F0Q^ʦMشiSH%pݜ;wN9N6l@BB1Gydou:?l6O}}=111dddrJ:$>|'|B?ՅbaÆ 8!::'O2==֭[td2233l6l2|ܸqDf3;e˖i&q8::ɓ'E6l0&F/>|*~y"!!}_-[,dٳο뿒ǩS& ߏb!==_gbp D6n܈СCtuuzj?-V5 233Zf۶m,]+Vpܹsl޼t4 \x۷?!"D!B v<<<v;֭ŋ|> x;6@?NNN:g}vL&333TUUQ\\s='42~j?֬Yöm8q@pΞ=#|z&&&hjjbhZV+o6jZ z*d.\KCb4yoٯ-Qzz:PWWGVV6 @jj$游8v;W\jR^^NEE7n //-[j*>C … X, yGC\.G~r9`'O~ HA2NJJb$&&W\tJKKٲe 8(//GPBrr2׮]ܸq'<rJqpŋBӑI0… 3vyWglljkkimmeٲe<#l߾uQRRrGJ6jdddP(xkdQ%ojCxx8J۽`577Xd EEElܸQXuUUUGGG(9sr~PVVҥKپ}4((( 99ZMjj*QQQ\xNjjj(++#0;;B`߾}<#\xF$<#fn79rnN~o!B"D=+WgsQUUVb000$''b "##&11:::ja4j.->!!NqMDDٳg9q#** qxOb0h4{nT*111~bbbXv-'Ow^D k 66ǃe||X233y&333ܸqcV+MMM_^WJDXXyyyp X"LNNATT299)|O:E `tt<\µkט$;;;wRVVFXXx^IZZ}}}444PRRªUٱNsE~:111 f@jۉ`dd .PVVF^^.\`ɒ%ZJG zeM{{;333ill~zzzz0dddhz`.1bʕ+(())'hiiٳLNN!tz=t:FGGgϞ=8Ξ=ڵk622,rf3$$$pM/^Lff&r1^/ӧ';;[@pq|>{)*t"##9x lٲe˖8s ]vt:INNFӉԂ⩹ӧOc2"))Q׮h8wW\jӧOΝ;9vrL顾[āXb#233 ۷o184 YYYY~=rf3ZEvZjjjhnn&11@ @^^:tQ{1A&Î;ضm-"22M6155E__o*q:8\.O 'kƈ9RI˃h`0h$)) L&ƍBC /*@&&"QPP ʻxÁ۽k9바"..n:233~۟9hɌ|Z|B܎b6{*@" nz* 泴Bi6H>s/;cttįUL!BPBߎI,&&f|`8!,%!bnLvgJ-$ ݋=g& -ܶW}kotܲm/\FJVKvvиνvbMBsB {J|i<3B3& 7oC~]occcgsM TY>}uzh4i {DDDq:b,'55Kmͧޑ[hݗook\.,B8D!Bx8|VYV\wd2aXHII^2 +`?se2RIXXwfc"ɰjո|S'ՊNCT>Zq`0n/Z-2B|d2<>OX"D!Bv#0h4/A4 >5" p_7${i)F\E0$::J Op4ַ!B"D$%g|>Eqˆ]j+ȃԞ_,ћL&jȈ0+bdd&r~OLL`XV{bbՊ^sKX,R4sZbh4tx<F#~Vcll ɄFATbX$,,l^` j5~a&'' "Ąh`0lf||JRd||\OKץ:˅h4<<,Ld].;7R100}?|>v&(.Q'R+JJ%ͥFQDiL& gjM@`0h6ۍR-\.555x6ca27l>󑜜t:z SSSL&t:݂n322"ֽYFFFzœtff11=###"X h4b<1LLLhĺ>11\.xMŲ`*M7orqRRR`tt\21==RmSSSb9;Fj=uUUU,ZRNjt:h4Bp8b=n|>^>#t"Fy0+;v6oL `bbcǎETTԼh477c6rVZx<^{5nܸACC?~gR[[Krr2466rᥗ^VxիO}}8ziiia``<.]׹tK,c?qE,-vn7o&,^x^z/^9~?W^ ,, Xz5W\wykעT* ,,@ X_u TUUaZgrrZ-`||OVVuuuLCC7o$77GR^^Njj SSS(Jd2x<t:ݼ\N633#ߐN;PHee%dee ׋磡H `07oŋٿ?=S[[Ç~:zY^}UZZZ0dggkH}}=%%%466oo"a||ǃV e"Dzt=##*r=zIJJ ~fJ hZ,YBVV>˖-c۶m|TTTdjkk)++\c>C֮]{Z8IP `X(:::ظq#˗ͱcX~= Ovv6&ӧOx(..F.ŋ),,$.."/_)***,󉏏'//:[ٳlٲXz׮]Kee%O\<.]hmm񐟟/ //rE:;;v& OWWJ~N;Fjj*w1H\•+Wv?Njj*F'OrMl6_ +űn:<mmmΝ;vWfdddΝ;裏ػw/III8qټy3ׯ_gݺu}my71ͨT*=JFFTUUQWW͛7xf122Boo/>èjEdv;ISY~?*>Djj*|===P^^N]]jh:Dvv6{$&&raV+UUU-!R[[__3;;K[[]]]Z =Bd2ǏT*1 Į]XhΝ|ᇬZTā9^BpYJKKy뭷z?^Y0@gg'uuu?uuud2jjj̙3$&&vZ y&۶m***ؼy8h{GqU?.,N[x1===={*4)B"DoG@ Tq5\.={GffztSOn:Μ9˗x<{m].DFF ARUUZfʕjlɴرclٲE4G%99(l6<(J^yn7 cǎQTTDff&pkC>>>Njj*j|s7j5>>.6s899 @aa!|"`dd$v}^ >}{,ZhO, +W|r{9. NSO=Eff&qqqj._Lrr2WSNtTVV~f/F7n`ǎT*V+BR^]]MVV,[3gp9ѣ / Bn0HJJ">>j_΢EIlld8qH˛6mVrss`ٲe|JII ۶mw@˗ lcc#IIIA{1 &--2mƩSlDDDPSS#% ****&66^xAt`pZ!**JR'''ǯk6mZ5 L&r9z(V+X f"##:255Jk4^"##x(ټfq`˖-_^)J|> BJ`0(--CR-8~:8&&&HIIAՊ`R)4v-ZēO>w@ `0xĚ ż2ۅ/q/^RNHOO7n`0cddvV+/N__yyyFkk+ EKKa4IIImmmgY8FLFTT?>B &&hhh 99˅'66lqpdrKmdtuu#x~XX###LLLlf``Ӊ\.`0P(d|>333x^VdBWWczzDZZZhjj"::E100@{{;N"\. h"bbbq$%%MWWd2/^b1|XVqp1q8sr!Bw5qɓ"Vxx8۷ogÆ $$$l2V^,/^dZsy O<QQQ:t1\.-ђ{jj*fBO>p044DBB~?X TUU9܌b!++G}2ٸq#^Çˮ]ɓ̤ \ihh`xx={G}$,[ ^OUUZ;wb49<ӄn:, W\aڵlܸJŅ s}gffM||<Tz=k׮N, 6mB.SPPB`ll BAZZ+VA6mڄhdhhDҾ;Ľv;Nkb2 6àu֡T*hX˗P({ [:4>? vpƸt 6˗)..f\pJKK)..4VK||<X,rrrdffh,7nQ1 Q?Nba͚5ƒҥK K+W288۶mcbbbbbΙK$""e˖1::JWWڊ^BVJJ tuuw^^/2g}JKKQ(b .. .yͥ!ǒ%Kʕ+lܸkb0ĺsN222z*333۷BJrr2Gڵkn:9B||޽{IIIa||`0HJJ |'466j*HMM.A{EVjIIIvSPP'|FtwwSWWGbb"\t`0Ȟ={HIIƍXV\JEvv6,^͛7\P/""Blݺ&K||<Ӭ[z&&&طo/frr:l",Ο?Ovv6۷o'--jn7?8®]Xl>/tR6l bXVHLLh4h!B"ķc.X,B-EeumL&Z^KϜN'N~*BϞ[>鷷~?u:hoSSSt;5-:22B0^ [>] Auq666&;`HRRr|^'DR;466b2d$$$P\\,u+}PsM Rbbb>S]o8\.׼M~䳎_cEs3fgy5 Ͼk@!Bn288` g%jLbA[i/qOl3^ϼ~s߭wCROtt4K,Y`YdqP~Z=e\xGVYKm+ItY0v&w[~?,5^#ms>o? _d8`ށ5~]\B"wXzt)SrrWZY^ȕyn(ߕMToZ}nC"D!B|=dfv[.i_ p8p:!]>]d2&''tom L&QRz0_ v!B"D!2 ׋L)vZ(BEjK~n_V}ݑ)%Kf !LLLI(6~aY)ZQF.~ajzEYZ-jIFFFh4B{Bш[RHzFFFDHARr96><8 "НjY_@KH"GEE3buqJEda:::HMM3g{GdBv&''3333/B̍|occcjQӉh`0X?,w rUfdee}1L\|K} ܇d{<.]Dllfq9r9ׯ_Buj /uR)z..K2 RIww7LOOj9'''箿e``^o`0˗|2GGGGZ8qJ'|㡩v;Ǐ'22SNa4əf299QUUu׀^NF#^```Z}ǘ QT p]fXh45N'z;CCCK80<OEWW3==MDDb| fggWT266&;l6ZثNOOy&&{d29ztuua4|Az{{qZT255%b4Z"u:b~Ki(va||\kɄf`0ԳgK=xr}!|(Ϝ9Í78w$''swHSTT+Bww7~ywikkczz^ϩShjj+W" ׯ_jT*9~87oٳxx7hhhN:EKK ,[+W222vRRRb??dt:Z-'NU7n ^ϑ#GxwذajSYYIBBV^zQ֬Yl^d^{5Z[[aѢEKfو֥EvrrYZ-9rp^~eF#k֬3g@?+ QSSCAA=@RB`zz`0,6cǎ^~_r+ Ν; eeenZ%n;;;gHLLf*++YbJ~7|-[wUUUZ ڀMMM!ɰX,v x9 6 ɄlFTb4h)ՠZ"h4222jevv>LjE4H,ϝ;X,Va<ߏlu:`0EF֯_ccch4e3W@okk~FѣG 6011hIF#*J iiivΝ;E===LMMsMM >mmmvRSSq\"͛7yzwn޼oMYY&JJJDn7nq+e֑X_2cǎCff&`!]q|MVZEMM p+'++aѣqq222p\\r;v0;;+6`ӧOٳgʢՊ`@ l6 lee%mmm߿5k044o[d2K,! 211 fZ[[@ll,yyyCiT*xIOOGVc6E6:MMMԈzn>"<MuuH'GR xaKwYd2===T*҄+IkN#;RÕ_J(Pikk& 0OX,$''jbvo(300@׋4fYj5& шR\P |G:u Foo/;3;;Ktt4:\~ɢEݧ"22j8@gg'Zo"m~3RRRHNNFriחQgiY7ofP( ꫯ"QմrA, W^eʕM&?z/ω'˗୷";;^~emG|>qqq=Fuo[<gϞe8pW_}m۶qY(,,nJI4Znjlw񻽇x ټysr[Е;PT7axxb._LVV`v</KĊr o~͛O~BOO/2^wժU")rq /e˖-<|RSSGYVzrrrVFZXvczzX Gt^'<#Z-qqql۶wyHXnha^u222Xr% )~mp\\|.xDZX,"^'..JmFrr2'%%K. //o^HylRY,|>Xv-W\h4֭[Eo߰j*fffڟ"q\8qv; -A&//HFGGWh>0 333266(CCC`2D՛7o //{__ҥK ˣ>*꜐>˳>+Trrr gϞ%99r}Q林TQ]]>֭jRXXHOO8$~:wl6s5="11<r5 )VXA?JRh 444~3ppJ%$$$`0(--ٳ9y$‚k||x<.\ OG|騬D& k{9f3R\\֭[Wq\?3կhiiaƍ-ŋioo1=>>⽿rJ ??m۶V`llGy^weݴ288d"55'|ӧOz[u;wd۶mj^z%Xf /C?j//XVdXV.^ȵk(..fjjKbb"7oD YχٳDGG77q|/+@ ÇYv->(###t:HOOgΝDGGs rrrXnr"Obb"mmmxի_HJJW^ҥKDEE(1113<M[[~UV DGGGcqp,> &DV8yLn7>,;v젺K.1;;KDDXX VǏs#کj:;;immeݟr*sΡXjx)H9rGy(a*-$$$jX,deeWWkt: >|e˖ ҘL&rrr.\&R$, aaaZÇKXX].׼:A88IMM%"^9sFr"Bs8?NXXm޼|F#'Odɒ%x^v7sBr9/_'x\Nff&?яP*ر9qaaa~k.errr3._̣>ʟٟ @kk+]]]\~??g!::hyhllɓB~嗬M$F BA]]yyy?e``gϢRO:O8O>Ijj*---l[l;vht###DDDֆl~9wr7 z0jkklWWWSZZO~8s _ׯf ZL&,'!!2T*[n?7odhhHc]]'Nd2 V#//R;֭[)))^@k ˬ\RX~q8WŞ={ĺVz=B ,,Le֭q"""ZCvv6999OFF%%%l߾˗e֯_ټy3l۶+VvZoҥKyG(..fͬ^+WRTTN`0*ӧOʕ+?1BT*rXӥvmsKTTTիJg}ՊdرBAII 7o&..,6|>`0xغu+Gja,Y¦M(//gٲeM}Q.]իٵkJ7|>ѧzN'|7nv366ŋPďc222'<<jnCnܸftHyy9ccc\p%Kr%_n[z 333t`0zGyhll$77WXoRZZJEE/رcB1,,+-GEE-̙3 N'W\GTTTk8߲WbZٴiTTT8|8ėh4޽'|R('a%Kرcb=qb5j;h4ryV/Ӵϳzj.^HUUw'%%1osssGVc...??cӦM>}:L&YYY$%%q.a0xHLL$<իWK:33CRR@ n'99y뭷r![֦ׯ_55%̎<䓤 ׀), N,RRR)dll,n7n088("HQQQ )<|>0vFFFկ~Eff&t:CFF)))j*VZJ"ǵk(((`zzF||<>J%===YK./~1\vf(Ja Y ||>WndA"Y(h4ŦRT Ei×Ddd$eeel۶MzjZ_J7(fO>!11Q+tBsvtDDDWPjEJ}-$OLL`jjj\JR?^O__|>㉎&;;~>_LMM77oޤ fgg!͓XF#ݨT*RRRmݻF# vZzzz088H__jyΝ;yHII!%%E&`٘fѢEH)!FFFXz5pK+-Ke|211!6jx^~]ׇpv܉R䣏>@Dbbbؾ};k֬att&nܸ7 9w=T?37R@ Ν#55B>l߾]P ݍF͛!4CCCeǃbl6xf``Ql6.Z6l0 twwc;XR?X,Etvv-z{{Ƞtfggusc=FRRz=ׯ_l҈'xHzz:O=X,Z.saAߦGhj juu5FbccXHOOgѢEܼyk׮R(,,b؈h|ۋF'|ºuPTf\.DFFfvAii)ׯ( '&&͖-[شiayfiii󲭭 ˅ 8x [l!<<\X3hZz{{1wj~yst200@?:&''dըT*, n[o֯_͛Y~=˖-ѣ{z^>#4 0M'ҡB__###I__8NFFFD_ݸqCXjùnQ*|> Nimu0w^ ='ObZIHHba׮]~9"\}A\\ZSNKjjx~{G?h4*!Kۋ/K& >N:E||<111r%;;{[ZZJ]]mmmttt!/R3g033CqqXۿ[ lذfݺuwgvvcZy&iiir.\@gg'555,[Equ(**$%%111Agg'###rev;%%%?'11:^]v-gΜq[&L~Hfffv h4)%%E;wb歱d2X|pEl6!˗q:ٰ͛a))),_+V ˩a,_\gdd}vfll}{\. LNNJ6IV(\pA&&&9uG455 77zd۶m]8|8qCDDTo崶2>>?Ndd8u\իWGellLhQ4 k׮tr5Ynzj/^̆ P(|n7 Ӵ:::D(.]Joo/x^t:`B֭[Y|9QQQ"NXXx^1 SPP&??^O||rrrhhhŖ-[p:twwc0s Fш ,YB!uyy9tuucV\餦0DPUUfӦMİb !))F#;vڕY"##---L&O<&dv J3g099?Nrr2B4%a AQQ333~222D322h4I.. 1 Ldd$+VZ| Yz5k֬aڵ I$6T*|QTDFF(4^,P,ZH |Yoܸ!0 LOO344ģ>J~~233)..frr8nrgtuuqMRRRPT\.֮];M#333ZkbZ$##DcժU]$::Ja?N||<q(P(rL&#""eDMM ޽Ea4!ۊ+UhN'# 0LRTT$utt]v$''MyyL_N0d޽322Bww7=K,ATRSS#`6cΝ$''399O?4qFqMMMvy$%%$ioogzzŋիW/#*դ%**@D Bikkc͚5lܸngժUt:ٰa^B~zfggŞ8foŸnDdMLL x^֭[kײar9---zJKKYjPjHV&svпE|tb4Rqip~H6>-Hا![@o+R \$N'5k(((x`dn1115h$)),]]]BsYf͗6gl6uuu8Nd2X~$AɅ!;;+_  1y())Y:~l+Ann./~M@0d2ʕ+l6;J.\?vQFz-6nxG0{! >Z׫?ٳg^|{hiiappejժv~?Νcll1~ӟ|z;w +Z.>>UV3u@~{|jjJXb>h.]D  ,, ɄL&n`ի?ӾtRWW'xI"7AՊZ&&&fĂQ>\k!- _>4)sM0BVw4mn>k0fT%ˉ{oL6/U_xx7nJm;wĈ2+׭ZJdP|ɤ8<^Z 1!B|;4oWu '=z1 _H@"wI@jn}|~ >4k`Ͷ`/)xZ_FX x&_=<p͐Y.x;6R o[ӃGw4uӞU|ɧ\b筋w2߭s{v-[o+wLlF|1 %=)罏A p_'zt:omE2qOHHxd]z)=(_?m!B"D!n!)wW3ȳ|Ֆs5]!B"D!gw( ى&22RT ?IDGGH400@GGSSSDEE!att(~? T((@^FGGӐjUFp8㡻aZ-Qz{{Ebl==="͛70CT  ZMXX===LLL\.gzz6ytu$@%}߽ۉҤ:tΙ.N4mi23NqؖdٲvQ"ER;  ;~H-1>D^>s{:ZPzDDD`XtjZgnUq(FGG*wdaaᎊ< giih4d21b2 A.388T*JLT*1*+=pjclLccmn[ ‡ϭ* 255Eoon?i8s t8_+xY,éayyy]%{rYjX#"""~x< 2004aaawLLL=}USSV{ $H A<BCC1Lt:Q(ri~Ottt0L!sQYZZbnn333T*YZZbtt%׫T*fgg~& ш5l6R,EܜZUUEqq1v]lFP033#v3??/|J%ΝLd2l6"##q\%@GG/(hZŁezzZT蘙avvV:`6Qr昜իdgg|\r._LllbP@|2ddd  7oooؼy3aaa477͛7D&1LP(l6qFn2KFy<,//jX,ͱ*FFF|)}Q^|ErssIMMepp‰'زe f[2;;8! Fbajj^zR6o,$J%< ?ω ++PƍlذѣGyW36lyEn޼)j4ggg3==O0 |+_W^!&&J뙙k{n~Kvv6>04- Vy\R)2fQմRVVƻヒN{رcLMMsUv/̎;K_t_LL { A >XT* Ĺsp\DFF0XJ%.<3S]]%,,P~?nx RSSq8;D"hZ****REN>->;<ɟ ,//v9q"b((( ==7|׻#xx< }ljٳgCT" tks{Oi&RRR8~8^[[[_*aaa\.bccyljE&xhjj"&&b*++p yƬ\.x n}hmm-999zvŋp+++nhoo  KRRO?jP=z,^<?jE.SXXᰟ~?2tv%_ynH$E˷-'}><3LOOڊN&III^J/H  L( ;ƦM<zq=R^ʕ+$&& QQQ$%%c!##;v˗uOO7ndΝ{nBBBسgǏ`0`ȑ#466J\.r9ZZZHLL0H$.\Zf˖-=>toNNNΝJ}}}x^vAee%rӧB&a6j?$$$YP%ue⪪*P*Q]]-ҭFFFX,$&&OCggœO>I||<}ݻw?i$H A Xwg"rmm6zzzfqqf3񬬬JIOO:z=N!n7S[[NCWx _ہFf3sss+zE 6 F4 bZwD**" JKKE"6mB"vd|>Y\\dvv%8|0qqqvE8f#;;XxN' LLL~\RDPRa>׋C311Aoo/6MBiq\HR'99VKqq1O>Cnkk?1%%%hZ GrnḰ"oߎFaX,t:ǎcqqպ7<vl թVHww7DGGDZ,pt: )SlT*T*]]]tww#""A__FQB5 L&mzDh/P(J,,,p9pGBBEEETUUTUUo>zzz #22R0 PRdtJTT۷oc05J%*J|>ٸq̐$::&Rxn孷ի} tNFFQQQl۶ 4BL&===c4t2>>{nt:x/}Kdddt:FXϺB 44^ $H A>|dzLL՛CѰsNnJZZlڴPضmEEEJvv6###"O=RZ&''9x ˆ 䠧'|Nw bBfggSSST*cccBltuu133#6wf˖-$$$c|>,,,Aww72 Djj*333( 6o(V'xZMUU]TTDll,z>,&Wee%nCyy9QQQPTT֭[At 111z )))DEEQ^^``bb%ߏZ&==, \6m sss۷ł` >> pkz@meeÖ-[ptvvRZZJEEyfd2333455ģ>JJJ 6>vIaa8Dp8:NnʧA l6ݍ%??-[/BJ"%%FCbb"n 6 J";;c|ܚJDjvm۶hhnnBdd$DGG ڵh^WrL|>hZHLLNGZZ8;rVu)F(JGxx87o&&&҄x FRm6&&&0ͤt:ZB2<<͆` 33$夥IJJ "=@דnںu+. RRRشipkii>xzܰad2v%T4 DEEDbmڴJٽ{7k׮a28v8}(&vIMMK_Cy.|2o}yyy$&&E"|wB^/T*Xo|}L||<^m۶ A 3@6}؃=$p\\߸ʊ"v<2'>y턆>4s/J<r?vA%R3>ir`~ I<gu$H A|vX,f@/^YYauu7][.Hj{`|Z!A $H A>\uW;F>4A?~NxP§r$H A $H{ll,nQ6Pv``Oxx8&Nd2 %AIR$**J(؍bلѭ*^~}nU|||\.QQQ,//ىêDwIDAT@ӱFoo/j!r!<<MKKb`ppr9^|> rJIz^`eeN"x^7ssstttFtt jtta?0LDFF~>UbP|W("vuuԔYd2J(Pql˨OXq T7s4DGGcXX^^fiiL&DB"shD.FRdeetA A $HOQqXHUU200Irr2?Y^^ 6ՊF!--7orYfff9ɴFy@̙32::JII]wBPTWW3;;˅ C*rIZZZسg455199IMM eeetuu~:)))aqqRٸqȏq.2(¨旿%vB.h4x^^{5F#[nevv^xÁJ"**EjjjD[m0Di;#:afffX[[CT299,>1L&.y233QՌ033Fy(ٷ,^xBd21;;믿Nff&tww3<$ 2 ^`񐛛Ç}ׇVv355 K/DGGiii/iiih XZZҥK{ !F#}}}ű"T*_CeeeTTT299L&CTC__JR3K.Obxw $$^g.["ɓ')//'44s3000``nnF◿%2 ®]avvƑ#Ghii!;;f3kkkj^ %33 .󑐐@tt4aQQgnnnuv;gΜaaaD\.deePPP@aa!\zQjkk5׃ $H A|X)υ P*ٳÁ\.gvvV(KR g}g}!JB*R__(ZmvQT"~Kx^{=bccjK$L&O=GO:;;h4n7<#hZN'kkkMaa!7oz)TJ[[<3RPׯ_'??N|2.\td{qxDEE$H A !>@9w%%%\.t:>FFFgqqjf3L&, .PijjXjtww366mCKK UUUܳ<+B}}=Ÿn\.L&fffQ$$$x0LLOO311j%99(ff3KKK(J999"_l6yfVWWX,9DZuVt:3338&&&0,,,NcvvTJjj*jYfߏ\.F^:KBBCCCbZH$( d27od~~Ln72 4t:xzjCC?),,DPJbǎ\.V+KKKm6rssDѰk.v;۷cZo,nYZZ4CCC}m h=ܹƍM~~>\|E]ZMff&111ٳJ(..fmmaYR̂||>8p5558R)g||\|n399``aaAajjFFFeyyY~5.##Y<mTA $H A> rBTT[llGΝ;ٰa===QXXΝ;?8yyyTTTϦM砧2O>=ޚ=00Rl6痢0T*aaafa/ پ};夦}v~?OV@RaXHIIaaaJEII0q_P(|lܸdIHH144J"442r9CCC߿bbb2R:q>>aoApp8|TVV"HRVWWQlڴ T<sRRRp\w^H$">affh1OtV }iiv4 #66F*++ٰaeܵk999"CR$%%£>*ڝDRR)))鈊zέ928.(( ))'$$D ԒU6l ց͛7il6^Iaa!IIItuuQXXȶm![ A $o3.Y\\Ɏٌᠰ*En6 #,,~jrfggILLU}vvA ukjjy& z0;; @JJJ$H A crrR8?fCT1ݖi"Hx!z?mUC` >n,> >q?uX~ ~juѯro@[ݶ7% p/'|݃^Mw/ |vf~>|HXhmmnJx^:::Dm@SSRTOknnfzzX$ 파㡾^N'zwDss꺓Gqmmmseل{LL 188HXXjaۉhAKK^WWG?>FCww7ݢx^"44:::#..L MMMl6bbbXXX #TF#MMM,3q Ԥv:c(n&''q\455tl6'22P&''iii%ۮp8x뭷HHHc4Cww7sssꫯbXX\\>|w0U(ߏR5%66C*3}yyH&&&|2M?wvׯMDDħro&jK"s*wdZ9y$2k׮qK.aZV{gQ).6ƈ-Eoo/aaa(J:;;EPɅ JbmuX,yR)555+^:4482 yD>{OF.cX0\xD‰'|1<< ϟGr V+YYY"- &&ϳB||guuZG׋BHHF^~en7 R>euuPytU|>NB*r%F#\vDFFF"** Ju۞v1 jFmm-CCCf*Pfގ^nF^*t^磵 Q( Axx7o^=RN6!!!8NE| W_%++k]ԭ߸DĉrĻ^XYYETH$LOOVeddVVWWF*3|ܳśoNȧ>x &''&;;GMOO,--`͛ #YXX͛΢jo{n:::P*bcxxX<4551??Ott4~fT*ⳁE477311!>GFFǶ)4 ͆Bƍ oOwttz`ddDӎH$DFF244Dxx8C ,QQQ(JVVVhkkc``@.XRSS~:W^eqq!4 /t;}}}LMMގ`;2k7ofqQT={݋dy\Byy9kǓk6oތj_'++ ^\.Ι3gظqx]~sITT444osNr9QT֢VJ mۆh^@.Ndd$?OzTWWNTThBXgMMM!0\xDN8hd֭LNN$''/ƕ+Wimm B^UV+uuupb1 >.;vk譭|&99ߧLOSN<zcY1`mmm3>>gllQ^/Ʉ^gffNq(U]]MHH}}}C Ntt4..h4.8J% AHHccc R__O~~>L0<n5F?e؜㡪xٶmKj$ׇJ\NTTfYNHbzzZ;]tZf3$$$B`jj{=BBBāRgg'Vrv;MMM.,,ގf#22FGGQոn^J\\l߾]|/` 5RD"ԩStuu륽~$ ?g֭磥;wofxΟ?֭[ybʱcDŽl6ϟ'>>!L&nZD"Kr _Wl߾/K~?7nwa||\ŋ)++?>>sssh4~_LFF󌏏p8h4D*266K/D"`bb^}UJJJZر7|RL&7opNjj*?OĞ@z_qF#deea2͛!͛ 孷^`Ϟ=|>XjjjPTx^Z-nW^y7|P[[K}}=& Hhh( Rٳ|>VWWh4FBBBzꫯ2>>Njj*>OoN>Z͛7wCNNRHR)..&$$ͩS n) 3˅`%vioogmm NhITThg||n|>ZϓJss3~q\b?!4Rjr5.^Y]]G?W^%==at$gHJJZgLOOOݍf^#<<˩߾o+Tʣ>fxx5yG9y$~RRR?)~={!3668~T*2QbccK_C˅ p\TUV ot`@ TJvv6biiIx}Y^~e:;;xx"{^gaaFҸx"Joo/YYYr!z{{srry&UUUX,\.<ttt |PTJZZ%%%x^Q(LOOSSSC||<>{L&j=6lwCyee%~0222~:. R͛7 #==3Jw7snoMTTv⥗^b׮] /} o"..!rss9{,)))444pQ|Mt_PZ 088HRRǞ;fff~TD"APHUU 455qa|M6nHxx8ccclٲEh 188Ȯ]X[[d2F{{;_W Ӊ'''v8@BB/EEEDFFGP ɐJDGG/Yy<233t˨jv;?OINN&998fgg1㏯÷211/LYY &&&D(կ`0pa\.~HIIATTC(\.$ kkk9 ӻ\.R)`d2q5OGy ?~Y طouuuL&cΝ" pmm ^/ƫ_z^y233匎xp:x<~ӟÇ9s bڵiַ366FSS2>,uCD-r!#;;27=]fjx/_[SSS&6zGA/~{A"`Xadd L&6mBRq5˜8q00ܸq^O^^޺'? ٔPUUEZZ$ DEEo|CNMMͯ|^|Jx zzz eyyJEtt4qqql6BBBi3~?nH$,,,__Hdd$UUUdeeߏD"aƍ199W:;;IJJ(JFۍJ/;>իW)..y.t$&&ü(n Gll8_vߣ,x  Ӆ;""^OTTv'33S<\~ 6|ڵkdggկ~\zߡVmBBB8v!;ۼ^/gΜ!""={{ﱲ`0*6O2 7MHuu5\\.eÇsI7n`rr~8NIIB `|_XBv;SSSܹ_W,--axٿ0^9xTVVrIQ2+_bzV|+_ZpNzIHHSXXSO=Err2 rssoD"a``?Nnn.999Kꫯ믳D"!;;W4SSS{dffrEӑ(J233ٸq#?;M`B?Ν#** Ʉd0H$ܸq)y <3q ncZaxxXP$ vi?NYYtww裏r@PsNv!~wnܸArr2Ǐ'//ODM8N^d=^׾].NwwxurTRRO?47o^w}VKZZSSSXV^/'O$=="T*{駟h42??$111#&9MsE:2+++v~?~m;&cnUt;;޽ }yy.VWW?Z-Fzr(++#<<&uc2!?? HJJ">>,ͥ"rrrؼy[~~>6ll***dOJJ Vev[oIYYR]v|iX\\n):lٲ.'0233ٴi88}4O<ش,wŶm$..RSS 撒"^]w0ʶmxר 77W'??JJJDdeeQRRÇ_ֽhhh9X,VWWa r1yBBB8y$زe {vljVs) #<fjkkٶmhc:??OAAKKKL4 j5F"Ӄamm^W" mFn.J'<111{8qB  m]>hqEEE\~VvAZZrZ[[qy+x<rssš_iivexx,.//S]]Mii8  Lu;-0Wd2r\Q/0^iii9rNGoo/|_&FGGy8t455a2xΟ?yyy;b , rMqHJJn3888iVVVFjj*TTT3SO(##^\.t:^ZMXXSSSTTTLNN}k{p|>Dhdbjj7n000 67nd2133s_n7,..Ѐb)ںez=gϞr@DL&cuu+WVb>44Hjkk!''dnܸAgg'~7pիWQT0 j fłdddË;|^LKKk׮ lno5&$ %%%SSSO>8ڨ'22d{1ݻy駉!'':HMMeff®]ĆIRPPfcff9s. HLLz~:0<<,om#% 6mBRSS#DrKtt4;wd,--1==hh4bX:[V>h4BNNf<󴴴 6jjjD,-- ~'R)  544H||xwfd2JRxa4ldgg355ٳgx*s/ 6<4ߏlfzzVKXXXOMMq!6l@RRccclٲu"qJRőHBB~yl6JaZ&$$Dz<RRRbpQQ*"]דF\\i&RRR'--xrss)**"%%BCC'!!xd>L`j222HXZZȑ#lڴ"6mD^^eeeN?J$fggaqqhv;V^ wf@RRqqqj '99l!TUXXHBB㌌ Kݻu90!!!$%%VL;vJ% STTĆ ċ1==R_DnAAV9~dggMjj*111TTT0Gy|!hh &r9E^^6M.G aRILLLKKcyyLƣ> "3W>33Ñ#Gjn'%%.Frr2H$`#HKK#66vt:EIHHy4 [l`0r 33Sx{KJJHKKC&IRR$&&Ett4񄅅Bdd$qqqzx"""tB`tRXXHff&6sHhh(=z*))!##5233IKK>X,DDDMbb"(833B륵pz="55 ›>AףVرch4T*O<}XãHLL$<<n7t:{1kFff& r9<yf"##Í@Ö-[9$$'x^NcqqR*++)** DE,--P(8v예40L;vl!%44CVEnpEEzɄNc˖-LOO=&]v+SDZ&)) ^Obb"H$!gee^)..㖓R$++)bbbĞ!,UVVEDDxNQ| DDDNQQ7nD 1 D V}KQThZe/(( ..$t:[UEi BЯ@8}k2D*MLL eee c;""!yfrrrHJJb~~j5w^RPPP ""M6[M&;wbƍm 8iiiݻWS5944;o>vMyy9ʼn5Nד@\\###hZ~iZ- 6i&BCCŻ'::7䰴n$bccs^dBq: FVVqqqyfv;333l߾[NX ??{R∎&--$Fbb"YYY$$$PPP J>.=;v8HMME*}Gogƍ@aa!M7oO4͘L&諬,JH)xꩧ(//gƍT*EdV%::Z<ץ ]gyX6l ~/99Y8d2QQQ")##ܳgAII (JF# ~PTTVBv~BBBa?KOdqqQ-% fj:wS}mm^z۷y_ʩU= N0<:B 22ÇߵvuНN'}}}B!0o֭[r7rE!vTXX(^5T*}iŋZ4>/ÇiOvΞ=7BV? GMMȡNLLdϞ=V… ~=ׯw}`ΝyK.\g}VT^~O?隣Q(Vt::uYF#|_kGHUU`VVV@ODfNMM!HEDo߾{;N^*R&rrrغuCGIL&"4Sccc~9p2?<\&'']w4@oꍴX,| iw &<<3(DɔO90|]~geeEx|luQ@4R@LRU勀ă9|X,!0NJ@;"**j[ZZFBe>?p\|j{ ‚7h4,-cf o~_kҜl6xfo}oK$z=1&D Hᇹk}aaa]uEoZ}ju_ݷ 8|8Nif#,,L> :!>j}8Aߤ[]snٮͭ׺M~֡[?}ZoOvkǃnσjcZ6t* ێ8w4Bq_wLkCxP!~D>$H A ䷟^@x{ A~p{%8 $H AHXq e|>ZQH$DGGB}}=SSS$$$ Hhhh^OHHFׯcZgnUqw466GttG*߉[{zzhhh`yyYg HHH`yy7oCXXPohhXF]]ɕ+WV6u^vZZZ %44FIJJB.399Imm-377qK<>>NmmwuuFll@?N`ftt?x$<<ꘜ?]]]ާZQd2ꘘVP*".0s*f7DL&g `ppP(:/\rmM@)A $H SGc vn7W^E&Agg'N#..{V˥KW Tz*7opCrr2?OA@MGGwmZfM z*---ݻyFFF? &&&x7###+W%N8AQQqqqrz{{x<>}B^UUŕ+WD P:::x뭷عs'2PWWGHH!!!9smۘ_/bcc_'//O"~rNDD06u:mmmnHH}}}LLLfllh:::xD)FGGt\iq>22lQZ-?IKKlذχĉR]]< |>'N >>{-[T*?3zDD.6P(2NSS+++Ʈ{V, DJɄfC&P(x瘟%5ޑDVc4Y]]epp(z-IMMJf K.[%J%7nҥK۷LFww7( A $H/ck;v VEoߎ\.ghhZWUA3==M__Sk./ Op$ĄP何NvɗeDž J9z("""K||<Bj{=~_166Ɖ'룱7nPUU`>###?`ee˅n'N(z+ }⭷zs|%%%}%v;ccc /o,..RSSL&[s\o|^QO|X~p8[dggS^^8s _WEI}>o6RyFGGIKKoo8|0'OjbXx78z()))}>;wdݼx<Ѯz!`$~n7)))<ܼyV~?zGRTTD^^G/$ 裏zw^R),..Kdd$ڊjra~O1?~us2P M6hxǨʕ+HRf3NBeuuNB?pz{{پ};eee3>>.bڊfl۷o6l ())YF\\.\\hDGGSXXHEEP(nܸnd=~ږD||<.]bsgra4YXX`xxŇ݄ A $H k\|D, $&&2??b!==ΩSX\\$%%nXZZ"&&BxHIIa֭hZH$wqFnܸӧIIIZ~G455ttt0660?~\.ccc fcff6p|EYYY Ȗ-[0 ygg'tuu*>{hhkkcǎ2552'--MJlz$&&"9tH$222HJJ"##łN QQQdggS\\LFFBBFBByyyv4 ۶mbvIMM)_dnAOMM>GyM^^{>74 $%%P(㡴쇢$H A ޸t⢈H$f?:f Yl6uE{=f3;va]>:333ǯ TUU3~F@-KC]] vuЃ $H AxLNN 'l(Jt:ݺn.zq8NKߜ@@@j LסR8x A˅Ns8iQQ7oF.;͛JrS\ Sg@m A $H^Bg]. `/--FY[[Q5^]O\.B?Oq~yp8vkd`3*H[nm~|V  $H A !|/f}~T*?wT qJwyA|z m!A $H _<={у;/ Av>wX*ES"B>K>OW}_N纱xj744@XX\~RSS匌pUIJJbvvK.t:IHH`pp*VVV7n/TB`1FGGINNl ӀW^ett^Jz|>k׮q @*RUUH$n޼Icc#r\(T2jr@NEV^IKKcrrٌd󌎎NIhhWb0gqqNd2ٺhZ[[Q\p6HJJ̙3aZihh Ibbα^~en7333444rVVVr BpmmW_}y.]d"11g.PBqTUU144D||md\x&Qsp8hnnRSS?_]]W^h4p8g~~;x^jkkY]]]7Vo6X[[[[ill$77Ztw 'HLL-fzzϋOMMԩStuu͛7'%%}ܝg?>@cc*4 466a7nЀ!>>I}}=MMMh4L&}k_ A 5Q*TWWʢ}{DGG?OJJ .\ ;;'OAnn.III\x$ l޼իW9tmKhmmE.DEE]o-GHHϟ'22VKCCݻ 3gPQQdw!.. ~?/^瞣ƙ3g$99L&ʮ:u 6hx"uuudddChh(Ü:u;v J~@FF7n@Tɕ+W0l۶Q~fz)N8A^^-hoo)hjj"""LGq YXX ,,LltttsOdd$ PԽo5'''Y[[cxxZ-7nԩSL&lذ+Wp8X,ywԩSlٲJ1en޼IOO Veii1V+vQN0<PwܹsRgllXfff`~~/'ͭˏ~#nJOOÌJҥKܹS]8\.]Fyy9III ĉ瓘l6surssy嗩 ''PjjjH$pu",,~nܸ磾.>cmm'Oa, l6J\|lڴdꢳ2FFFhnn>(#񐙙FFFxHNNf[Fx}>ӧ)))ᗿ%]v =$$VhEF#@Vr88q7q\"r(7ATrirsst∎ܹsg A y~ q߽{7w&""BlݻwP(FSO-j5ONN؈j;wO011@ii)~]vömx'0 X{ Tʁؾ};d2bccٳgJObb"ǎ#77\L&|a `6J4 GB!6*`0T*h4t:Qդm6 Hرcw zK xwX\\ԩSbcX[[KCC6^xQ~ӟ"JOMMo#QhZ{=WfӦM=zXr9(J&''Q*j %55|L&P*qaaaH$PMH$tttp9^pQillW_eee6zuu€ԩS 2==͹s !22Zͯ~+FGGTWWs%y aaaTTTpu*vłR\wȒ""G"ȈGDDPVVa޽")**LQ*ٳG ~my76$$FN#99^/aaaT*9s 233֭[J455QUUezz/_uFFFgtvv_SOT*1 z;vA}&$$DEEEdffD6oތHR\..W^y/C.%** 0DEEp8P(phjjb׮]T*y7JLNNX^^fjj Coo/<裘f,˺ff3O?4gZ2|>{/:NJbϞ=b|MnVThZt:z Jd2eш痿%v#GPZZ*q/_ǰX" $H/v:$%%k.N>sss VI"o~_S|>|>Dnm۶R|>0@7muu_Wlܸ2^opp]lHxq HMMooyꩧ8s o㏯ H$ݻÇsY,k?,,,ӭ=z^233}ژ\wϾ}X^^t"JC|ddd}v\.###fQդAgg'8N<}2~jf?,NSTkjj(..&""'|jjjPTΊCmӝ 336, \|Yxv,===EHD"ammpnJQQf^ONN񴷷cZqx^R)dgg.>|>ʐd466 V]w RxgWhdÆ -wp`M*++h4$%%T*HRSS1͌0$&&~ HHHQ@qqq) &''d21<<̉'p:F`ƍh6 {u '~5ߺu+$&& osssl޼sssߏÔ@JJ #0994ccc/}fggYXX`hh~z=GaÆ l6V+>(۶mC&|/o}~>fݷ' $H/"k\zHfgg)++#//U٬믳DZZ"o=11"_Ή'FLttmay&33V{ ۿ̈́b6Y^^!}}}(Jl6NSyGllP3 P__/Z|>v;7n`jj;v022BSS~5Rȗt\X,•+W E ---T*nƹs0͢nD"Uj͛7j`ǎ=ҥK>.<:dddV9tH ҥKf͛vG'rg2:;;|RHKK{CTT7oFPTTĦM\DDLLLP^^Ndd$lٲELd T8z(8$ ٟuuu;w&R)WL|| '))1#99y[߾};^HOO ;;i.\@oo09{,/_fbbB$$$|ܹDVWWq:2::J}}=X,z{{"$$09quuuą D 3@bb"/>8ݴi.\̙3133oNmdd8k4 ++ BA\\rF!`rr .]B!zlܸM6_{wוp 4 44MM5Z,FI2T* UyT*T^SRy$ڵv_ݿJVVHDnHwظ/Ee˗ %Ϟ=˵kטXff|ߏbɃ$ o~ʊ388HWW999x<BKJA3נezz:eeeRYYI}}=YYY糾ΡCrzill9DO>AբP(عsVز=''NGbb"MMM/yh4f#bXPT8NJJJHNN&55ш`@R)hK/Aɳqqq,--a0HHH >>L,gГرcJdh4PXXHbb"Ŕt:>ט呜Lyy9 ZbZLN'V%##BZZYYYbZ#;;RfÑ#G̐a4ٽ{7 ػw/χf#557kЃ*!!jf38p"yyyɳܹFHIIa}}O>l)JyV^JHNN&..N%OIZYXX ++yBh())a}}RIvv6dffb0̤FC\\{% l`:П5詩deeEEEMJJ.|>n7:th4"fO?tz줤$)..;(J,h4RUUZr744P^^Nvv6NSH#.p8Ç";;[%ݱcr׮]Q(466R^^.߽{7TUU!$,~?| PSS#nP(Z>|Y Fەw:FCuuB\\w怜2n7zHOOgccCCCFa׮]o,((b.ki&;wRQQARR9r UUUkii)PWWG__[ʣ*J9rH:7ұFv؁ZjhHKK l6NDvvt\D">#***sN9bJX,8pVU~bL&>#h4lm+ ?ګAW\.yAP鱗OU}eegY}ee렻\.yBMM ao¶AX,-αXW222__oiH˗/ktEx[MAbDw:asD"%U:)yDZ> ^ iy<F<=v\% |WP(( J[UsuR('֠>K\\~)]X웼?' v"CiXP({{׮]re. WJ#S(o  oB!/{m(dYRSJc:R9i@:n[x:?U;y`m}֞?uVL E9Bhb;u}WR= v+  㗍}!z!S?wCeRD"1L"=BAAKϢ7@ fTN,c}}}Kmb8^Km `iiB6ocsyNAAagfq7tuuqUL`/F1L<~+W\zqrrrF477#jF$bzǕ+W$==HK5 ƍܹs8p\rj1L<|f,sY{O>MggevyvիtvvO\\477cf~~%y25/_bZ{.7of3q?-Cdrrɗ*_#X l>11K&==ximm% ʕ+WhkkrK.144jETrMn߾B ##,ۙlkmmךizzݾ3=z6dsd}}JKb1 `XΫWJGGIII,//s boPXX(gD'O5[ZZd2=ܹ999rniiatt'۷oc0^&|WJtb4_===477  -//h4ʵkxF$:;;z*X ,Y\\k_|f3ܹs7odbtt .JVV>f?~lYF U?>99IJJ D"??HOO'--K.QPP1LرL.\( ttt9w 9sjt/] ɴgϞ\fmrrHss3zLww7]]]jkk9rkkk8-, _R|FFFƍ> N>n߸x"P9>cGÇ15駟R[[K__###O>ann.ijjBp} MMM388(|7$AA*e_A||w^Ξ=SSSD"b1.kB۷h4Rdnnb".UTaիbz^?N]]\z'k׮_Z,>D8s ^q˿K\fnnSN_*o[Vs!>3^J(;# `۷\LIII O?333Ͻh)//{(Jd߾}L&byyyzgii1f100 j}Ͱz fggD"/ڵD~_ݻw΢T*)--x/QTTDyy9we~~^0v:::]]]ehhyPJS__Oyy9.Trss1Lrh4T*n ;v`׮]B!===399*Vz gvv>FzQT0== ))FFFXYY!>>h4JBBTUU1==DB /ٷouuuőJ^^&(,,dll*#oGRmyt:jkkiooTnݺEUUfrssKcc#@>e f#==<4 2;;<,--1>>ν{biiA8p(J&''feeqjqbT*tS__/)..:N'\, jʘm!pinnfqq[n122ƒ~ǹhOmm-( l6a||']ZZ $$$PTTDYY.`00::(z233) +JSSS!R^YY/_bJ%ͱ cbb<P[[^"׹p/_ ˤ$ou|ͺr7pvJKKY[[ѣA, /_gvv-_[ZCCCdeeD||<;wׯrs}-N:ō7LNN!?3OΩl&))ׯC(^//ѩѣG'++ Rm9Q BWr[0򠀴\ƍTTT0>>N[[\ GpPXXfffӧOs5ٽ{7t a˓;ˬINuuK%YYYAӑ;wxpX%HMM LNNRرcfnh$ׇB8:;;hZjjjp\$&&b0& cZ->vĮ]*}}}arss)--ellYyyoo/BBB:I233q(J$&& IKKÇr??xg}}AT*P(DII ###n &I :==1P(dffRQQsssPXX vi}}YY A),,iaaшJbll ͆n'&&QTO$)b1v;VUNGee%ݻnN'[>(J9"B^/iiib1N'f^ɡ5JJJxZZHD~F\.Bf)V+|>eyy,VWWD"hRIEE`Zgnn͆`dd$***X__g``8 ~Guu5wf 2kc4<===hZ~_ct:_}}رBЖ$333S\\LJJ 333133CRR ʃKKKb1222GTbXFvh4T*ETRYY‚r||$*++F Rێt2SSSh4, J 4 iiil6YYYݻwPD"fff{Mh4DzrxΟ?Omm-V*^/^oz/r2b) y^,?SgzsFq\o<#bq:nv;̰ʊhEans?^[R.Is]  Ad{zzBվ \v ɄFannJKHt:kKu{^$VH9bLMMjQTo D׽_o{^~RyQO?'狜c?]jhT zс9|[L}޿{[AxӤO"B"jV5SBETp8n\}DTRVVF,}W\\FdAAAxiPXaۙVKUAOM~ s1())gM~LVAA6r B[ֿzVh4HrAAAA;GQ^/rW3?FD"xn 'qmAAA~X,#VWϯwJž}D"-S'   EQV+ez͉6{^Ŭv J|>Pu\.v5 <   ϙr K@ DsRf #*   -^D 'fХ4    O[6~   EƂ   tAAAAx /GcÇ$%tEXtdate:create2019-01-17T15:47:24-05:00g%tEXtdate:modify2019-01-17T15:47:24-05:00:IENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-plot-task-result.png000066400000000000000000010170001414302661500302070ustar00rootroot00000000000000PNG  IHDR 6wgAMA a cHRMz&u0`:pQ<bKGDtIME :}IDATxwy|Nn  0$,YcY}],o,[fyk,ɲDRL") HOw#ws\U(NW۩ @ #iDQ4MP@ @FUU) HwP(o= !!G6@ @ EUUѝ6P.Utv(g@ @ "g/ޥ $I!Oqth[r :H;VXJChb@ۅ,+躆,˥ube[z?$! Z)\mI$ Ib',U$I.u8b/U|oHr)|2nu{I*oǻNQ@ vi:(E-5MGx_x]H$B-2Y^ir9L&3,gfSōj6ٛ1,, (H$h!28xzEfdd+Wr9)+EŽ1 eŭN$޽1 tvvJ8wW^PRP땿$ٳ F#:$155<6t:SS vZ[4ⶨxΥYr @{VCS @`Ǎb rزe3^LP`ffpXمŁ9fcݺu#]!4^p:C ]_TЗv!$JHh4/a 8w( pirfyH$` La4QUc*miڅi*_e綐J1L +A$8WE/`dd={,0>>bA`jjh4J2$8v<6&&&o[q:qo'O266F[ 7[n%p8 &Ot:I$"=zzm`41Mh<@(f׮] gj5cX0aFFFeHHdBAezzÎ`  266djÇ%1 Jp:b1I$aկ(PUaNt:=/2=F&xGx癛X,F4% %Op8PR$de簰FclڴA vsH:k}i0@ F@U UW2$ɰu6n E"ʌx8fnnш$hRip$ ֮]K8̭A42 "_ښLB!NZ@ (i ?{ccc|jp8{ۿUW]3,Zj+ߠf{]w1==7M7Ν;ǁS$wٰ6r LLLY׿u,+__pik/FC dhh\.'? zzzc5px PT*y9q$T ٳ8v8j*FFFPU^Yz5chh۷#GxzN~?fԧ>u]!կ000@gg'<ϙdʕqq</mmmtuurN1) wd2Yo뻱ZFK)AKKL*bNg8tuubVzٳgرcWwHx<r,irY %l|!G%.qK\i$ tSXV Y _^{-333s=q)<ӧZ gnn~y?t:cP]]?y$cccb14M'r0_ߴsizi>pF&!xI&Sfz5n6oA?G%!>B0{fvZ:9y$Ǐjett3gYz5|+W^_"k׮,+ 2,]]]s=,$ ^} g>݃il޼⾣A::p}q 7033ƍ?32Ll_{zB@6ĉi /J<#N#Id.+WV ,^f%.qK\Wge9rQ8s4]6%211I("3;;l SSS>85d2鋸ϒHıZmȲB "˕͢dsYdEF̆, @nuE?Sz{{׾FWWC]Nn&Z볫|F4Me%6 GCC=nBAOx#Gvq8 f3Y.x>$IvQU׋"̺uO׋b077,755R(| *d1 cF#^9 MMM\.N'w&cHDCC=x m6QU^z͛7a;x;illDQ6ŏ /  ٌb_믿Ύut]_h4vQU+V/vZ[[$tuuFȲSO=$6lر9sc6Q{:B ^;$O oҠnGUf277K*j`XQ›) ߴi3p8̩S'*{̔$ UU1_f3SlVf2u]'Lř3gcM8R$VOK+)ũBAEU/~%I\N8fM  ]/*5\s\uՕΎ;Xn-B[f:;;QZn]'[lMSYjk֬uMb8T;vp]wbYikk6mʕ+X,lٲ]vrJ::V҂Ȭ_}CЈnd21;;[Zofj~zn7n5lٲFR4wy'v ղ~} ]͛7Ҍhoo'Lb V\IUUwYv x͛7s]w4o+6Fٶmyپ};6m$ͱi&vիXB2nXb SSSM]]V-[{.Һ$޽Yp8lڴŌW]477i:{atvvbZ+vi&Z[[1-444/qWfM~V !TUezz,KK60LbQl6/YsLNN299I 0fd2WWyc2I&(LuuEuyT`vvl6fEJ] MF.j_ĝD<ŪULnw@ xb0a+Z(u}ٮ ib'v0~ZP((J%̲?ȲLP@$ŀVU@ @$y[lLeTu1 7YFcX,NU++Z BR/-,Mk9LEQ(RFy //Mң.rZg6qWd~gggiG4N>M6l6YH+ _z;}YsW ׽of5,Z/O,9@  Y(74HD,G ~NgINJ+zˎ@ G7͠KD$v/} ̩Sd2ۇxQUk^rF]$صk7t,K/x$x TUe޽>|iii\\4v }?3[lAQyꩧHR\qLOOp8$A馛lo_ul6ٿ?NK_TAٳg?):ӟ4={EQcbbuQ[[{̐efggǿ2==,O<WfddG( 200mXr%/{^& @ *躮f>O,itL&eo(\}|򓟤jY8 2&l6K.C$݋fʧtuu/|??l6ilÁ6˲f;v#077fK7ffXJR& ǃh$͢*mmmvm_kFuu5{/ԧ#ˑfIRtww^1 fF#LF̞ @ Gjfjkk8N'. w܁ibZ/꺎륩jF#^ٌQ[[c=Ɔ hjjbrr2Cz2cill( 6 ޽{9{,?ؾ};yzzuχb[6uz֭[<ZkmN'6l9s R]]}t(Bcc#uuu@[[7p$ v;^HP੧\yb] @ >H oJ B@>(,c0r9fdYdYh4V6 yL&|T*Uٌ.LbZ1ͨmyyD2$veD"Q-`۱Z(y:rUfwYV@%K:L"L&lFub.B@>&w8p@ EtX4iKEǁ^ٯKݼ*i~7a\L>0}%I|cǎa0o@ 8R0Gc@ @Ɛd>8@ @`?8@ @G~^@ @ x] @ BA@ CP@ @ `#p1ıa?] @ |l6 Ç*ZqE჎@ @ ~\V$2iEÛg/uvu@e+0,iڲ4-Rqe]*N%Ke*tީyGݕݖ->/ޥ޹(K⳥%IBBB/w_K::zE١ ]L6$2ٗe,Hˬ:H,޿k/$$]\$I.N9][rkɳw$ߗ{oioH:8o@  +_^a(bjjd2fCQr)2N"HPUU,*T\.dZv M iTUU!2P9 vt:4`) LOOp8FBpÁdBQ @A.cbbP(dn( XT*DQ{ N'B)(v<@ٌj%2==i8NdYfvv'ìp+~d,S)(6 l O0De,ʛ 0'b7T$$jLe$c1 | љ>:tnWҾTPv$#IQ΅j2 L%kb@ld bcf̑#.;C@ ex^N>M4e͑dl$If3$DH$XVy~?+WDefw"tP\UUzd2qyWYnSSS|$ m6Ξ= /#Gbݺuj^z%qWǏ~# .$wPU'pajkkuW^ycǎq9ZZZxg7ޠpQ^ydhh!:::x'~ݻq:yTUEQqHD",*72CQi$jjtaBbѨDdV0jݮ l^~Ho h *Fe50+<[U{ٳ ǎhm8|+8q€,CkkqP(`4ɩ9x'_g>5O8f.5ǏOH6љ$ s~od$?˶md,O>x,t7YL#i I|^dD(XL"1h\CyUEHD"fjBfgf<3Bh$%һnoI"`~TYfB'sa;NER82sM?SַѾ$F#1's*xGOMq2x=LbL!P0Y.0 0(\CLŧY}@*@8l0cTd 6MUWqx0 ?C 9OfC8;wj,ɜ ű!½Y[L%SS{1.*### R__OP@UU ^߿Պdb1W³>ˋ/ȗe6n?N8vR)xƍ*}} vn9^0Ojb: T'ffdQ0A(JQY&׿nark459#SSxENgq`|\/2ˏ~dW LMygHD U@ >Fw9U*j7ߠPm&SP EbR dWx- ,<vZ3g~ws<:ӧ45zż~^L`0[;1qJ0(qyFFd<UU:n +qGD]5pJZdYFTmv#|nssԏI@5F;w2[r&t 5p\l,Qrj8ZNWu5[߿µ Ӊi4Ӊikqht[ir'=nM$w$Fua!UL'q|3>Q6bM)>4>ك`axaQS,d)ڳuu=+00Bv?k߿r2xkZAՋ2u&_c{v::ƶ+J$ISaΆm_f>Ofge%\]iq _Dd<6Bf]^o|<\j&gvs?jfN}0F Xk8NNvw; (@ >\8/_O__?wСCR)4|+Z[[Yr%/"6\.'ɰw^Î;hooZlY1<󴵵qTd" o>nvf3&2#_(x'Yv-Fx<͛g?K2G?'NtwwL&r8Nx9rX &vMss3Pꩧغu+---f^{5t]g ٿ?>Y1͕uo]Bn)϶m*&|39fge$i>V,f3d2]wYJѰZu1vlؠr yRH$$\.c ;f?61:*cl imuj]q UUAI]r8:̺u*ޚ'x5ss2)r1;;iιV˶m4Re=\j>|rXd5S1wlB煖Ӊi&blJ͵+V fQgVY1Se"Spt(MFgU'YY/Y1s|8y-ц?b2>I c4992}tUwQ3$ f!OtVw~;׵^m[IwB !nnjb5XqeHx-^\&::95WQP%$ZYlMnRԛeo]hq]W`V̌Ŋk6H bMev' ;7H&gX.F/lPdō4.Pdda<6η{jjV{WSm&q&t f}L'$ ERhqp*x؍vttޘ~WNNs>rg #΄TDdIDf6wjjev98IL! 2!xq۸wX VS)jD> #/PmFd2  f'1ec>RnA{:c0&f=:: /&tS@ .]$---x<EqaTU[oEu|>6&f3ř3gPm۶qyhmmh4؈ĉȲ\15_=Jsϡi1??K/D"r9qlH$B[[ ,,,~zn&oߎn`ffgyp8w֭[ꪫXjl߾Çtvvr-033/KFFF[x<۷]י#GǙrqFΝ; ]w+V駟fnnd2IGGV7^*A_:Kj( :DSSQi߹SebBf`@f~^+  jK46jlڤLJ(\yehTflLuTFiY:;UΜQ+Vh*XrA ۶S`jJ ~{rr˦6FG#gs6|FJMZ]e#Hō, +=+ӴT[Z8Ӊix,™0Ñav6d}zBResM5^ަ4:9:s֕bV-j՞ռ0&ggCg9/){!ˎ[zle|$XBs3d'LrYb~њ@aZ&Mi0_XUhF VS1ɖ%V`!Ae~,{i]h,;#V~Vs4GAfwq`I4eeJ-efK%i9fP/+%. Oc^*eG]LvKT^KgiZG]יOSm@ ~\VAMfuGl6AB: n,'-.$wu+55 _ĕ@Gwz³/oۙ*'@ .IRH;|C4QBQ.. 1@ {CuҼ ^6lu]] @ wY_@ @ ~-] @ BA@ CP@ @ pMs/v^_w\Q[:w$!KF,{o|ԏ+#"-y* qRϿ5͸n x|>#o0t:1b9YZ8N$d}K`X.x<8,:oG9/fN&ȫ*U]Gh)3k]+RYQ$@p:|ĻzWe$Izr(J J4?c0PmKnu~ @ &_l)$!eݖ*_oRrYR]KAv֥4bAp)t /KA/ǯ쿢(Ms]P`ppʕ+ ~zf2C,x㍘LJ:rq*>u.+e Ǐgnn:;;uA }vn7===AꪊB c޽9$Ilݺ*?N"`ӦM477Wp1FFFp:\uUhÇڵl6KOOpΩS-[ IOfhhN:::gbb^?477iӦeo'tUEqt|Hla!e8\IBҚ뛚*R[u4c=VIc{{;&vr[}ĉeǩcr9>޽F__lݺ"^&qa, ;w$LrmFuu5Ofdd.V\L@ e.U/v`0ȁ|"~1d2<쳤Re7}owzMK& *o$I )+O>dE.C={Ca4/ͻwr-U5M{[Fu]P(+3ϐN9r?ω㌌p&''r?'O255E8&ryR333=z),J~*  zYÞvVWc$|F#}>6x<ԚX%Z6cGu5Ilfzct{'DQx+ecaaz 7 ÄB!Goo/Byַŋ/_&*SSS4>s ?0X|;$IhP(SO=E__/:u'|SN裏F wI$< 裏288o /Ȳ?9}4=%S@ _մ.pg2~,Uz5M̙3<<<:u}QUU%͒ޱBzd2yxyBXʅn'Hdx嗙g% b0HӼLLL0??/L*b_h4lVԩSlڴD"fl6s{ p^+vvvrwсfnVXQرc ֮]n,ټy8HczzSNL&[nfUgٹs'$a4+gvv星ppW3::8Dp:-+t]U4V9l % rq]c#<noi!ϣ*n747colnFvTWscSSܩ*k`(yW P7{aŊj妛nM0|\l6TUk2 ^.cW\qfY| qYTUe޽~TUU-3 ZFNOqF=ӧ曹[9{,GeR)4￟+WrQ;8q՘fΜ9ngaaW_$Z@ T/N:رctvvr7S]]lr T*E4%FI&U8})w@eꗿ%\n/4;EQ+ꪫH&?fxxGK 4M#Hd2DQ2LegD"QQ>Gso266y/߻]6t}ժU߿V+\P(D4e~~p8륫 cccl۶Hӕʪ**YR)z{{q8dYN:u%p~oñc32ke?lfzzv__ay ###<3|3Y_ TR5Uš(hQ:%oZ$I|A6nȦM 0Lr_?SAu|I, 7tS%+V77zJe\W$9uO0ɓKlp8hjjb֭HHgb6&ey.Xzu]g޽ɟ |5k}>; @ N\[[o+8y$?;Xz)bƍXp8|٫wW(y^Y/х33裏L&ټy3|4|5Kזڵ6BP^un&L&333ydeXƥ>L v؁lFUU\.[Y}zrzTUDkk+cccDQٰasVyWYj \.jjjx<˖=H$aZijjbhh;w)Ndpe˖2r LNNOOq$ ꪊ {"`ddYhhh`bb~lٲUU+H$D"TWWrWʊ+0 qQ>Oٵk|><]]] eطoBsαz]ߔ%Y4NL0`a$l.]^/$1.SUt6XTOkZq^@R)M_߃o}{"~<ַ#( 'N Vff$allL&C.^z￟H$B8f||VΞ=<. Ν#sWCqWt:2==g?Y8JU2FGG9}4۶m{Wc45kve#G0??5\,˸n,Kz`CP(w^ ^+WQI%DhoogrrT*ő#GرcEkGd2Q]]K/͛q< pw222‹/(] 6G}ʦM8z(>(|s#sfppq&&&bX,֮]07ofժUX@ W򕿽f0(_l&.֮][9bnUU|(ֹx^3EQ e.][e2$~KDss3;wdժUX,ių˻ګz0UUUgb2pMӈD"H]xɲ\lj\ʛ>]JT)|f`0`۩aŊX,n<+V*n72^6#Tz+k׮]KWWmmm8NN'DZx< \*4q8 x^,K,FªUظq#tvvm64s뭷zyu*H$B `Νر2ڊna4q\y+rrTWWaF#|o(& Q2Ggf8 !:|뛛i`0H$p\(dIHDUUlz4M# Ԅ`ӦM_.lBKK DQZ֭[W9P(zq:fll ̝wމcbbYEQ*[;RIM+lffUVqM7*cccbZinnFQr;hV([nrXvYXXfq-*Gf8>;&477@ss3MMMall6nJ]]]e9GyWD"bP]]#HpwPUUE4k ٲe [laʕofn7to@ ޽{bqZZZkLLLv;q:pwP[[)@9=WG`-ݗ_6$L$I(Q*2oW6卒+ z$!Wv;2Qe2>>,˴oOMMx*N eTNҙ Yzo.9LeN6 ]IDcȗfǪiPTV~NuX/{`QmW$ Y02 _ݽ6c1kuLr*o2VǬ-JTY^m//)rs*mg8] AK {Ugg%ͩߍv~5Tf0߯rbeL&T} <LoEZeX*JG* 6Fd _ /[g+yOZ<v2qx)-U/_Lq,[,U/^ @Π%/Lg;I0͸n X|>#o0p\LfjU!e͆$LL&lեo2pe2~?4!cY1};3neZY#,NfN0\lիYS_h+麮W6(S>@l&L@ , :&Kw0Yו|dN(RuED.A楮.@ ෝߏ0>h_@ @E @ @!3d@ @ ~\.G2Hh蒄I,i.IHHH.H^qkr- R)tE/IHRqGkI/C- h Ȓ jwm@*H&KHuy1@1ťSJ&s$$ E$"/]dCI:bXHEe$I!RN$^N>f(=A.PVutYG]Bo]bt t]B4$bɥ<Q2 z #Eq[,^r)pe]ґ)J孜d Y/T*#e$먒 r1}:Ų:ZiO=I/XCBъiA*.Uʭ+H+Z*1?䦜"RY-כeһ&2ːTʭ^.G#+*$U(W.k}Y\4]^,?W %]3V凄Vާ^Y).!IŲSmُR8_? Q)Eot4Pq#j1 K!jTʄ,y_+KM*I4^ҋuEGZN[4I֊ukI\TIG)9t\nJ/].R= q%=K6Jԯr$^zޖVҼڋJZK8ŒP*JYD$dPlOmRT!!k%*~aJ[TYRž 4wZkJ垮%M*Smy9TM.ֳRWT4 Iѐt"uV&C|H)fR;KzyOQʛi$/ ŶG+b.whr%C+~\jk^Ee+mTQS4犮JRIv[./#—Jm$!!hKʘ^V rVu].KHY+]BdI]VK:mW^5QV, z)ӤRZp`M*~hTiYoKzQƺR_^UꌎR_K@/Jrb]ѤR;A^-%KiIvRNH/P4R_W^ X)Idd]+G]+ߧ<R]JŶRu +,ojK]|J8@/~CJJR۬eUF(ownd2-LA$d2,˸\:bY? ن_H7+3z>܅$kXd+2;_ڟ`tQEbkPI~l}™F5Ask8pHdzxSx7[1Z8Q{W _|^24S]*}0{H.Nf(M\}?Q 2IFʹ&8,hUL²gϮ_-1ՙʎůxyz>Qo I6\Bz݋}LW׾,>,Ob-? RJV#?y =;cb GVWLueP7m)mc/gV>/:9N~ ]1&0Z+32zEoU`'%;eT+:jg{J#{SWbvz/7Pw5 GpXbNuYdC^5O]GBWu77ikl>ʦ4?i5+!?L:L6yz^3ם@zvkjd?rn:ճd}o6VfmәenUOnJ>k2BwUEIlܴIҸ&ڃg<Lk(/k{mo,n߻Owe[֛xc.0|/?}QSӜְnaÖO:'75x$b]/ױaV'zp2p*kз񯷌Uq&4zp5kl0ۦ1rFA-ڔ1VQs9דͤ_Dc"CthGH}Ȟ[Gu*A{l:J^ 0쬣ktK TzHPdMDaHt[Rgenr5-dZ#>|&So3뾆; AcF>qkXyJbvS۬SZfzj xټt e Qo!x-Կȓ]5l  Ȳ%{=%o-k$CO:|̑IZ8OR[83,öF"&rK}#T$X&9VAkuʷ? ?zfUjuUu[P>@x~5-G8tp8{ko&y=S< i=GOLOZV_5f_IʩAF^ϋm?J:Rwk h;/o e mx )w~2]ŏAIui3~VdS?0du_!Ds1&/@⏟\ m ms ~&>(/_f n!ukd]l.^/8]ˡTu?ҌQ#i.ca~1B-vRH/v#3j(O f$yc?U`]]T$sBt\@+QF:; OX S:&/8hd@k8F<_T{Җ%HL&1;N^+`TUq_3GIU&vg̿I1;gWIt"& V? Y<5A׊ovဍHc oZƪ<6P_I'3/YWc[T.l0Iکs03Mf,~%駪7D&Ho3{ NY1#Iz;gcx`\ϊ:?{Lr0ȡf\8GΑc7%RJU!9mI !"?ә j~\E] &W'c30Ћ&0Y`ʀ-sg3G#z_g2$?5O0DeZ;9ǯc;9mNڂCOq'G( Id9}{TEZ=:&zSf: 2M;HL~ 'bDaԌR_ '.~¶5~4I92~ hӟN17!vq;LdCVGIShId41?^$7=Q{X 39L~&Sv ~qp9?N!5I`2GF<$NTS6N"kͤY84;aƏIP,y Xٹ^j I5fbqr"j/u4=uO7@qj~2N '2YH'ԃ?T<@0.fLUN?WѦ9I. I'wO;14[n?1߫b3 'c`nC-9Kۄ&yb_ًß"f01zƋ1d9´Ě!Z݃Ɵ<Δ(HS"u&B`TgLx0%'ۀT";@"PMb(`b8&Y#$jaD|pYjmcMO FǗa4X tXNHD$, =~TjeX{!ez@oҋjOEpBXI:1K68CodPɢg ;?d'>DA=Nl*ɼ}s{QT;~5&ϰmhllo3:R;I/N4}wEA0 ?/Cσ*L֏)Y8q^PcRה#b]712H8c*zz'wϣ6? t/=nt2߃3㟧I1'3I ~jtc^G##O4iҳD_ ?3zYL4!}6rMxCAf:AuVla#NDO0ϠՅ]8O1sҏa'zf5t2 bi;a%zp}f#W~iI#2~͊W'Qfg)qZ{ c 4sxpPj{0O3pw=:?'h06o֧3Zz >8g'q^?/',5R~,^BZ =^N$t{zql}|DkOVx'-L[F9TT&gP,BHӌb2 0NƾYz[i53 ,2tےx\/O1ed4V?Z=a)$R͙NYf;Hx:SKm/=GqbM8yCX&?7G_>O.g^Y2&zc &譎Sꡧ` nzIAtqR!5$*+9yc'F1 i y丕>?6:yu0U y" }h?Q;D'Y1s|yIfˤ'c͞ST'(qD Ho}WOtNs|:C/=M)t9G߉w,Qs1?\1?y0Q't?xy5Lک1֪ ipwL9`!yIg]L'zM$cn\@p!F{mɜ'LI j)^L'375NƐa:ĉNyg/9+SF}=te0f FaWÊc&zc 3'QUo_VLRx<, :V~g75Iøn|>'pp1ff&AQ*)~Lq`KmPJ&,EQ Mܗ9\,^W&eP2*O& /3[߲Wd>_6)QyV2՗WhFhY.TҌh\1[nZXK͝JePMY4+R^jV^~b[ɢ2K2+KRєxY̢y2Sݲ!i٬wMI^iŌ%f̨eS)EsJͱm\ceDi hq\Y^QdX%&UEsR}\bX/bQY1?^d>Tɭ ])e^\nQ)2^6МP_j^ί%az9J&ovSKɬJ_DՊWnhTseP1_fzԭ~IXq;,mI\`TMqWC%:ϗZXgsPX"㥦mN`y[QzbM'eeM}ReO*a|(.tҢk%c<d-`WڥJdeu,#zV2/.ic(-I*.*gqO9}ٸ^6/m1o1R%)pB+- &1&esr9,ׅR`\4G-hߡRmgyIҺTn35i}=^4eRƋqzM$lditAUJoe2|JM\l.\ri b,/3qP+4KzW34iBJJ|,/[Wd[|*}FHbWdXŒQ.KZ1*˟j9Le}I ~;='Ҳ~VZv-v‹eRmG)~ZyӲnhKҒEm}DgXKr)T) $/;ҢK*,QG*}TJR1_*e7> ̗Q[zyPE4Kڤr[4e%SZR*e2TZi*;oJKd_-.Ж|{&I?:M+]tmٷyK$Ҵ #"uT.-!(/ ,%r(w|ErЖ/OKJ6K2Kul/k+ټi#oٳg BlٲYD"dY|>[Ϡ`:&@[G4яAGG ٳg~@8&sW^ҭP@ @ 5i,s7:6BpIBA@ ׀,ˬ]5k֠i*L.@ Ly#8I*;7}G(@ @ y&''+Ǭ,M] @ EQX7=}G(@ @ eyQjuAGV @ VޮrBA@ CP@ @  t@ @ >] @ BA@ CP@ @  A,S YɈ9%a-IHkvUY1r^&jhF\r@!s#eރAѪXFU#%[:6{LyVs@5U ƼNĭBƥbMkd qiR0bIv"5:TɌ4 Eթ'2F01bMjǐ2wC ygBJhBN@1T`(HbS`,0nƑbTQ44ҾdIV2X]5j*`JKزL>tsbpU =K&DE!hVNm0OnB4& =nPP$fD[RxIAALօ(Q;9YR&c,jnHbkH1px44K{L" )*Iq'o WPu`>^; " o41 MA?IBF Ԝ<`^':q-v "kЀrh;ؤA`) 4rP4QZ<ic3sH٬I8v@x.P0DЦ"¦KԨ:ݤò}|TGǠzoShzk=AhmXȜv 4v2N0"6ɫ _뀍8!4 ,PJ"Ê5f T݅S,3%$h]$ hCљ[ gFV)1sN]a@j)%ZEGC xtSõ-E DhR4b^ 3;c:,܂ 2Uу#ruG, 8"@G6F4zMAgѰsD"-FXH$imhtX5d,4mf@EP\Km&^UI1Ʈhu'Ǻz g}\1nԍo{.ANR6Yt  Cǡ !0I m* v="b[D"M݁c+>Cפ\ؐQĄ0*CyGE`sF8G9G! u槞P?|3|l ȍ2q^ic7' ] {Xs'[,4Q.~tRP2pS3 }7 .bP¿Z>s8bk9q=|~=$d`JЯ\X?O

-?>뻘'Xz|-wP2c̝oC}硃;~ߚ72߸/Q|b Yz ul?[]_l]/b7}κKC<9g>dOܼ^7`d$ylz^gr|n55?=Dԡਘ+͓yxa̖}TK۸u'Ķiݗ/$~m6v!cO^el&n98BSw)7.>oeŁ/kf0.$3#{2.%"#o#|}//^Gq65~ +S+~ |b-%)IDATL$_{7'nهCqbg>yŸ+\z/tFߎCl Ww]k/ՍW㈤siPw򕎛b~*~a;SNmmRs4{1>;?1 sSGyGkx'<0JX;s7̦rls/7} Fl |HwvC5f-3'S=pۼgzx8f`a\t7cn nלl}78++s𳥯.jp\6p7?]=">zqe$<;w΍W_`F¾/q-g6Iʟ_*Nj/7yˎ?d[xssXx | .)>Ls_-+ U;]z Ӽ< N)Vx9o{~VSĘ3=tMNdt W't?gӊ+Sx?`1G֗| \}l~\.ʣ(!rop+:vSk .E6G3{8a߰y4͛[rܽw}[=/_zB^_b[<·ˋ/ }kI1{B o׌ +M{7x&^ň️Op<2R{ &ybկ)7NKdEC~xul5j . jn 'fo靼3#Z/#ԟOsgfz_:#ܶ#tM_m_;ˆy}#XϓW!CNKK%wi F_I& Jpu;9oMrv W߁<_47|oOW$~?[\c8cy#/w񨺚 L=z+&i}޻ y|E/k{~`ykN>x[p\Tw{Z_6q }.3?[߲o伛>*lp?+.58^LϮCznfEȅa*^|#^B$-~|~G^wݴȏ{~'oGJ|jVy-xu~wqA}Rnc|9S;m ݽoɓ/~9oyJ+ܿyCW7Zǚam}!q_Ϸ /<=\d_X11})?q5 m{65˔dkov]þ`s{߹L]c/1ײa>dd앿u%|muE>)Z| ^)̅"7^֌bu:8q-?>4bq?Iަ (lbKǟ? <]]ubQ 춟Gn5 qr9\nƟ ."W Uz!B~/Ahv>־or-h"}/})xbt1@4 ^9 c4o:nu?6zNp0B6:?p/t;Զ5< {|~b+kN3zJ𞛯7>0.?Oį,kgoW^NW3S'o-OtR;ۆv .tj>*n{޽O0;{9_}>>R/#/=}?b;g~o7'.)ϯȻM_D=?yäGMxSZt}vE[^[duO;{]{ n9/rMmּ0{%{/o%7rAp}ʿ?< .6%7r(RG0M>kr_ Cߋ7τ$T͘ A=iT,Ƥzb'E@yAhTJB$*ʡ ٠ĵV.CJz^ 10B՚I{$ !6$QPNڭeZH*:( B|ϧn$ÔFM68eWJD=iaӣ+(xnH\ H ҠJyʧ FV|fHz}/ A%%!# D>Zń aTGƤK5\ !I%@ qH1A-wrJPhઐfU |< $Htfb4c+qfd[$֨kR4ܘ bW.ʭ#^2? !$hTMh5['U9ZL]k!!qԭAEW4 Q9!SA>DUx"F5k$Uix ڭ6cF*"lz^PkjRIC&DKӋ *lujSC>Q#RuMXH͚"nnLӋtVWKTΔz" 4dJlbU}S5BR =K{fCx=!!>uWUAwD6 j^*wfVjFOR1i6R\*&nEc߈mԛGYuZdquc>xՄfNQPԕ uDQYq1ʹ A# I.n]cd%T(QGSE4@ך]EM/bT6pm^HKH heBN4Є( >))InV Qǭfm(&Uo.TEB? 24)^9%QaXp]쨆xX9 P^ /7Gթ!@Q#t;"$$55p MMMOMxШ4=nO9A!TB+&u@$BRDa#41Q9"<.ƝxO5P+L^BX QVi&('x͈棚 GS$ik:rqCh]! C#P&B4Qn pq j>ʗa5Bw4U'MMXdIҭF&IBh(P/fey'HD+rŌtAyL)G)YxqUpьITTTwUC[!x*%qkĵ/mqXKl'MWQ&\݊"4"4A 5ZStl&h5HM[!4լJUjJ pCt%!g>f׈x/ 2t]nJӍy UЎr 4”v&ШijB՚(Pk*fB#M:^#DU z$ j@O5Du4\4TF: z h헡KZsUZLXTbfI&^-*zKiIXP^JkL/$=6a= RTdq#z&5^5OI9D5kDMԨӬ+QxU=1AixNC5 ԇzf@ DvLD*&"* uR(PmjD -^ Usĭ ehAPOH\ \GcFITեX0Sc$KqH$#*AJ.})Qw-ⲃy‸ &$UuIfGDxĮK* ZƕA5 2_1_WCdsB"vFXpbj&!5Pc}gvs|8<ܻ*vAq竂qUEXb.VȲVG+p:F㪌zNs:|<6b]\\7۬fsueXX퓋r{?7mFmFmFmcg}]kyiJP<"ZC$MSRX^bamFmFmFmgAOӔ;3R( R/}AmF?qswOpY^066Ej{xaW{Bh2Ȏ1hȎ=ux @Qǘ$)Bd55B*J4H@#E6kZ!FD#ИZeO hu-F0B*PRzխꥉ 1uh}&~!~Fl>ZnZ](thR/Oiɲ|xF,+ZDټ3 !B:YЪ%@.٣eZdfrh/e&8}ՙ̮Ԛ-dKҿߙ"3ݴ.t)*\H[lV+Tt$[V5t62lݗVK RK}5Z,M@B-T#0tԧ$S\1Ųԧʬ[R/Ń3{- 0Icxohg)XG%Y Yhݻb1nFe>E6^"c+>%jiB,r&ҊEZ@胪%)JV O[W!Э~ }zYBf/Ӣ-ؗK!(%QB"C_zL.m0Z1$"|%rqF(Bg|hv ҥ\Vk B%["g,-[\7 -*a)khђyBc1}y-{8iŊ-k=`I%k%+*并4[dNB`|2ZHoҋ{Z P2ӡ-[6-+Э|6Z,*b=IEk頥,YfV, :&r`:bvRk܇閿}X]-woE^ -ph4-?002y{[N?<(xi)篣1έ>ft@Cv^v*N$RLNe("ИV@הC1Cܓ<Wg!:844yB.J d7(3΂͚pm?KFlG2%f65NIQ>$$;9̨Fu.q Dl}Vc6Yc$.IᮀMr8idHlggNj X`)UyVc^css͠C{M໽Dfa'z׌8aeg8H&u*e=L*$I"(C9c֐9 (ۃ`GlFilg( BO;L9B<҂H42+w7:rҡZ ?e $EǦQ~:/)!n8U \rCX"7nRJ8ܵp9D)a^#CR}QǥT]e&czOmO9w{f'sg0Me>%|g-$v΃@65DiH{S[1 US4r6y(=29OCbKaa sہ%":sveN92':+XrpK؞.0gcU &Mu*tУu@o@~$ Nr*OPusFig~dŒ˔i v;ĻDa01T\OW 6%h"Rir GMiNzIƦ|JV_ KT.r>]S6/Ph*K(),Rtv]E8!&"s:݀t1"`jT$;@w n9CͤdЛ9Իީ-Xt0 6\ЙI7ZdԜc&|6ňbK#=xǶڎf vvop=tRMj=Ef~FV즉WGgL&>P&5\u:뚡Ni'vݦB,4J:z:/"ՂQۉ/b'@hm``4(]\Bc|D`3R\mE\i>LJº]X`XC 2͙\a|z^1d3Ts;M kLM׷4[ iPaa¤Ck1Ef ljTM61%]E@,]^ {YU|C4k8Yd@lPI+פLC: ׳Ý<(FXKy;ع:w g-!6AW ]EHwD^zd, M$279CQ{L(tT`?&$mvE褐@@BD7:0 &%~7ENQ15WF7]XGO\2aVxt', a]HB\)xgņB91g"dc܆iYW\&#V65{P.& lsٙ܁^~gj<@isB2ZXW Nwr (OO=!vl5 \WgtJxn?v @b*߇IV8LS o:Y1#!}GVH(]zfFy(jڇYa.1 ;0- {鍛5Fn֤ebG=gu|jj 6yf<>g>n&V/V\,)zU*F|J&VTsyDle7F#ϚS|m>9Vvu*#+Q z8a k3kcܵbGk\aFm׼kɝU<8߽?:.;T)`gl 8{Sxn3=wsz^A&&50F9Xuz ѓp<xkkg~fיqg3''nĝ܎I%~:>Jn1D}3ZmؗB6OluZ+Tdrq{S:u{8P0Ǟphc;r_,7M|Fuc0u!蹇L<׹3WpJχ6N>2|. 2GϜ;nr󆈻*w%Oד~ 6Bkn%[ҽ3kS=DB`V)q;ѣty~p8>~xYIgCص6e0YguX`xM9zkche F X8u9fT>.:1*쿀FO$9|yB=S 1Z_f5}XQ20m簾Z*6 DuE{qg ຣ 2gtu׳S.fO_ő2&9;ijM1| ^aäRx9\S>α1eTg+ddZr?Ϭ݉BRuYg3ǻ׮eͬZ#o6ڗ2#]_$.<~7$fg/?t.ǓU;6<-tax^ `l8^؎muoabdw`9M31ԵB,գW0c&;)AO+eڹ$/?&qWs*kUMnc?I6I΃7ˬ<:?6daSo<ٱՍgs, sv}穮2fg8E{ Y?͗X]{9pnVN@7pRdmK6pG &&&\MU (oq h+gN ‘ٛ?Ȁ=ꥨL<'bN^s1׉ibl6>im"=Oiz}'i.374~۶=Ʀc<=^14OKXV\ïp͔n(.y []<_|] 0fz88s3/򨺆cc7Q]0ָwbׇ1D]G&gh-sJ PW=Om"zvM.:ck;b1B@$ 4`` rӌ{No >9x7=nB!yMG$BjH~ꢋ %ёkټ^۲1O蠻cseϷ!!kߜp N{t8.J֎`\<Tv(n/_~3Q\da@rm ;RMfzL|'9v: .f>]b7^!.:ala?[17N "#]lLעיjWa֪GKY(gyJDhm$^O(0n?3EuO409H~$~Ag'ws6::5BGmc 9ؽo(w3LwdP Ǟv ;C[n&E\vC-D:֎'e qͲ9#6$#C׳s˃,dѳ&3=W񖯝b~/Ɉ *cl<ˆhro!fXʠb`8{7;w>Bc۸ץ Mئ8æP;-œ(D.,Ƒ|u®1OȜlcbR[UgNtl-9.,7|u#">zSNvxS؆m ϲ/:ijڠoڴ)FFFh6Β$ \s +_J&]<>!/쿃.SV?.|Ս>c}ي^{~vw(٦_J׊~fg|=tÉkA|?HwL]VsLA<~4zb5>`9qYK? +F]>x?<Lg3jΩxןv"H&^g^~{53>Y|wG!ݻ>8߿>,¶m.rΜ9b6~?s w۷o糟,x+qmFmFmFmYm noD)8![ '\p%MSKUqED"2{0ZH)kB"h~l! YRd )ZH!H$)6ƊR֏Z~|G6? rQٚO͢`,"Owi9!UW HDKg,) h`qR,ʫWɉ>[0Ra,'esClH.y~bYD-˄ԏЙ$˾!Đ [}a SXEd&B_R,1MH )1e[i [7M_ciz5@(# ,&Ġ5ޢ/|k٪d^SVZBba\8+bW#Zi,<[?{\=ĀUd_VǫW5gZ"V:1ʮKmnY.ly-򋱤3|fɶr}Ȟ^H#3ܤ,[\!ehkVW%yc^$BL&)2Z++xXe Z'![ϣ1V^V,.mWيED-$:Z)}bGVrXR䊜أ-|5c,s}K7e3ߕ1nGC|➕Bn+1ҜE;?Krϲ?f4X̴ymVpbrh^e_a/hJ^lɲ"eylJڀYb_aO!eY]kQK%[`c9V[E^P1Vr,gs0|b)βt)~qͰVqke\^~xyﮈ[Cdeyxdq}wp,%{:%lEujYd˿jNm Ye_^%U!W؎b= 6,%+cSWkUuFҶ~/robBV[\[oQ |(m^lԆ~$Vhq/ii"xzÅXK-IV"Vvh/8LSmždyoĊ)YˮZ._3Vpy-o,ȵEFUk%YEbE~nzu5!\1 boW( c,NQjgd|yF*L&'#X= pk,>{!]cfI,s 1 cYioCMy*!5]{8nP/n&㨠L8 &Ϝ`Aè 3:7\h5vNFdI`nbj$si&h8v*M8Li9u+1VC&*Ua&g&9pk<`d P) EgTs ,9hp 7Y@ƝLOMR/&}QEC69떩/TcW: 8X8D0mMQrNpڞg?M:䴋fFrx%bOF9 3LCAYJ|1*c0fȻ`hefP.EwYpp֜.f 81svGjeTS!Fizg&HYhj*20Eq ʴ?ΉdRú_"J4OFLFӓTj%œQJd$:CrD I^.2_oV8aycT-Ƈ98}21S+1㟦n:*t%.+TOrD/2jL:Ch|0RZ22Ze,>E\pԠbTiI3KC7s)%j5߆18̞[#bLv`zM0%C.bvKuf}hIf=f gOӬt*c0R(s px3.Ք3!4M/03?NR*PƤ|#4Qi1<z̔b'RX2$' 6 ԝF'C2b?Ȑ:0ˬ>8RϳPѤjå)*%x8L s[V9KFTqrFyFš<}CO-3p|Q͕8Pf6b&|r!Lc`;pe)f$EȥP0@0gS2ΑZ4ǻjx`D`LgҪRY礈HR8Vc;Ic6ѥ8V/341=?yDa{% IT=Fݍg~qIO5fR1)8FgtiɑɉU eϴwSz ;2QK( Ny,z8S:>O:۠:6Ա&%D>`/7̆kGkN7ǜ&X?ɑjbۢM0g~.אC 4N-2ip:n2;aF6_6$& &iYNWm &QF@ioJ@2=NyS*MdTyx CW8-s^B Y-n.F3T™X"dʯ#G}asNJTdn(*+|b,pүQXBm2F<4T`̜"5*pq5aDeE;N=:DjiÓT.xefNcs'& ).4ب0SQrTq$]0\RP4NfL,~q f)yi&jjn婔)f9L`Y22*hև(#4zı|d4i15mP.'iiܘBAnj$F$aR"0̀H;Ҧܚ2MI!EX9($9BB*MA7{li V#\'#o R%)O&Bwe<۪k- 5H< #,xĈ ;lJ0R2 2REl , Pr" 0 4q38DK%(y" J_Ĕ6jR)1E-l%M$<b@BM.L-4y_:XTY !-SR5lXJ։DJL++&h#!!t0UbLJ h+IR$F 3D*pG 5IXf@8D1=C&҈)/Yn˫[$J )HeVVU"L KǐJB3vB*dLL* #0)bbH判2 S'(3L3_02#ʐFH'ЊDX$XEbiBlYy?'x(HE,cP剥LuVRJ*D;c SD!S4CHRRL8aKibObFXD$B<&&1dw-D(Ij̈8Α[ńiChm,C"%ȃ 5/iaJe ISX.3UFJJ&/=Ҵl G IшUfVψY6RkJ AN:H%Zw\9U5i$8 ŹU`g7eȾ6jisUƯaʖ 18E 6&)NK~~J%v5Oġ%BԮL!1 @㈀ XWpg1S)щ\ IcÌDd 3UY%gzI%ZD$U0EH%eeZPY>KXOl[6`8#AHDw1B&hO$tD)2FGM+@l]DjLBd blpZfK\JZ+HY612 LJY9_S@`"Q62(;6 t\ MTY6fkuւ4u&(Lq $hSg9^h8)#ЂH;^K" +UYHMlȌ'rDJVJ0I.IlDJH| 12JE1FRDX "h+E%H# HE`(Lhe`J GEJSLbI\{ƈBkz۶[u2Y%^rpբFmja?a^rƍFmFmqmFmFmFm[6h6h6h6!CkM$I;R%6h6h6h6~0C{FmFmFmF0M8]물`RzmFmFmFm^Y|3Ao6h6h6h7mFmFmFmc6h6h6h6~ ޠFmFmFmƏ6h6h6h61@{FmFmFmF?hoh6h6h6h zmFmFmFm ):#&IrhIvRlG Ar\jQBk6(1oY(!='&2%B-LRL :C&E C`iEDF&vS 3 9L#M % &*Q>DKV$!2AFJ:Bc)%L}КU1AB:䣄ؔi0R\ˡ&*ȑbH+L*QLRl@!b@8$T ,3@D&aa$&~ҁ0c F?-bCc&JsX2"A&4 Ѐ@lHL7 AsR>1&V0eLhX*5 8HIQ4!5 EH<1°( ȑQǔ h.t.F)H0M>0eL R`K$V1k3?-;Đ9E) <%(I-"G8}ElkvH10I0So8!(Sce>)XAdC>JIm@X1hcEdqbh 7mAhHevi ,L3ѩA((%XNR4+&ɥHHo[X:3 ,3D"*X"0,Ђ)1e)Rj($VQ N[B(!͙ؑƈ  ~kGt1m`H 1F FJJ'QX!D&iTHj+|$IN!E>LI B``G#ӋTDL5Ď^GblGHlJX&P i#alhf:m!2݊*L$Z"̄DXH&&1Q^c$efq#؁@$/P2TtF,ih!H⼔0"BTH3.S "YcRa`ǎH HmE.N0bTbaa@QJ42$"-FX2D b !Ru,H%$NRLptȥ!h4$$cPX(H T Ȓ(' Z@ I柹$!4 &Z*U֒0q ۤB1VJ1&cJ$;Dl`!J" rQSܴK(aJ001Q^aIN+m%Z!"PbC`IJ Hey.5PʤiH|D:g ba6#ba"F0IQ!"aY^L+@#P(󷦓8Gd|NMXL24eK!|A\L(1B*H%:1i ,/gKHG8*&TDւд( "$XO(ma` S!cX!EJh$D g 5i`-( F` N uq iމL#M*% \G)XH5cPt5i>J0H- 0HAu3\ vHQZ&v1m321Rs5"2f fBA 5Q\1)Q`Xa\%R|LHGxC(-lbf4HMhd-J1M\H`ȄHB#gxIlri&9ij M> <+*SQtdN"B[Y3|&$BLm$TLD*%1260E0$p rq bF FYDt$Bٞ$򇿝noП'_QW'~dy3]gn;>~CW ||'kXw𷏾_Dtwm#tl=ş\RH>IPȖ)c]Kγ<ɭ/~'ݲ|v_8}8n 7'.Cthc>x!_|W]1ԁy?w/M; 2^|6>Z:l3;}ܵZ2bar1Ol0o!5G&.E^}5Cb;Û gR9>υ׳1l+wwF$^wy|fj?0ԋϱOc9p轿:^Oṃ睥PfwrQSrYw8D k+Zqm0W][y]˟x#a_kϱşL9u/D 9o;1}xnFz^|]jy [,~B^tmg$k8-I a././,2|aC9|wWEӘ7ټۧu 7o@+|An>JƓw[\m|G_^w5kkl ֟`d^V5wMpM ̿U9Gw)W$O_,nW~o\ݿ35Ğkϻ+Z2t+F\Fħϻ-?=s)jqx#r^ΐ58q%\j?olb꼄s8cjrg*[Bb>8܁(wѫ/"5{YrTm~7Q w-7_}2_ t~'8ٽ}LOߓC=~gff9^q.z\q?}᫸p73QՇ;ű{6QQjσ8xbL➁+xqNӷ$+`ٯ"E/q+p:~=W]/l<7;cG8A4>yvCwsk ;ÝWnX*jCwG1u!v~!>)j _w}{0-L 48$o9qGg~Gػ>^Lc{g?ŧ^2Ht=7|s[x巧9_L&_}?}rnP9tg#(#Nmyfsq^})MIXi:? e#x_6 /?wn_)9ҹX{:ƭWo*"{ۗmr O[W>\Z.}眙%&zq75kN?½obˡ׭]6;GNz_UKOO"*|a_ϣl5Xwշÿ=AG4eko7r|`xc]Ed o|ųX뮫̱݇_4A  B(-);Ci7ZEhgvbc1Z +2t"! 07n.__o+_JO/ XuqGw<( o#o6'꼬yXY87k|~"|*^~6<%|HZ P¥p N#pS/; fz)x媻NpMlWlcewJw٣lP6}IҔ&ë&$k`g;a0" q  ]BdK+һq&%T)׎"Yl$x4M6OG>45W1Ii]J6Oڼ2Zkk}vAIRV- Pw\D=%>z匰/u /Qݕ3 7.FDnNá-i4$&'l)w.EH eth N@Slioi b}~E;cm8%f%+\$֢{-bHA,_۹]v5c4ٻ{zp@msUatB;md[F)贇z^X&B.K0!-FJPaiv,_FD4wJ܈l%;wd{/jY] 51m$ ]鱲:j}Lj/ z2vrihPcps]5Ҙ .wi.n46׆.~wNKK2Ҭ/i&WV;B`5!zR e ui# tmz 4^JZqq,PWw޳Np9qs9r ^CqݤY0چ[#`KhS]Z$ncvZqPkvRB\4hTSABVb:Wt_i3GaMlvyb:6ݽfK%rދ3ht/I M98:& Ez)D.;)w86}jm0PzG} <46i.ep #:"abA``})rGSq ):&r/ec]8j$Gw<#%)b6z.VE7 ^j2P0۸ W؂Nrq UB^[AàλNFoKzVh.!z;= +q5EiŰIT_:F1VjLp Xvj3&ڥ]!i#;+.:-t=J]d):6͕HQaBxC iigzD\ۣ1mtJ\oϲW4MvRC:mg+!{w 7;6}ohۢ?`KD;:Q$ •Ϧߥl͋-Es͕Z> rvZ//UHcP]('o_ :%NV̱v }M!Kc窓2w<6#ܭrBL*tVvz}[)Y*ʸQWZY{R S؅m`q٣l.Ql;q\gatI/5ѵmwh,IZŘS{[B5_Q_^N!\_x:ŭEt Q]+k%Ts Ռ`a}X^mv{2qݘ#mTaZy9!w-V{V}`PkGMIzQV" j'-m5CT26_ݹIjk,m hotw"N= cdPh V_m0 %t/GULZY㞡4l"2Woti>ao$[e$ңYTwM1^g\v6"}!MRPx.AetG\vE{rScPJe4m a=޵!Gw &x ѻ{ WF^ڥ[rmlstֱRNKhX07^lݣ vh>MXhl ]ƩWiN'u)\L@o_C6Ժ\ZPv\HQJZMVlv\FcO%U^FolYH_v2#4P/wc۫MRWc)l)]:~VFc!bo p[!26~HU2W.i*ҍ$\bXZۺb\_:_A.Y$ÆNۀ(&i_ ;HW^nS{9 Fq/wpjF"Vᦂkt{{2AXWo챝'_CevMY7rO @ !q1MN?ϗ)sLD2Kڌʼ"]~B}K钓qs?K̈́&)a &|uk1C0@)RH/$BNۈ1"hsG˜'R1'_e,Hc:!ghb: -#~i"k~#E3Hc2EtgDHS0Klr1cFrS}ḻLyY]7|b"onb bo13)tLcbNNx?Ãv)-鸒>y}Myx9"qft|oLc¬Wrwc&~b6`c;×9g&f>cG8 rFF3ҁTrghƟ)jM0v2Ĝv9cʓ}uc7)r2~c4Uc0Frc71㣙T$u7cb߹;]0F6t|!G:& 9C?yr9_7?c8*>[4)&|Qfu#`6ƳIR]'s6f|M6wcv6v/7Ě Yͩfq.71o8T39Gtq5e^8nOTczdq)l!.S(fώ6u,_3=w2~ԇӜgVrwMsc_yƛ?$n9c9c9c9~Y)ZJt?v9c9c9c9P%Zko} 4y1M??aii~8< ׮](^??ns9~ѭ_BZ>k4&/&Ҫ(!OgCD輹+"QW~ʟ2hFGm'zD BF4:#!)tZ Zo^rYO矗T<Ҍ?Qz 5dh5*J52(=ԄEc:S BM(}=yt2d5SNx6y"\|@# #h"@ѹp,y3_<=hgh9hSPr;ڏM=X5UbBՠa^$fLac;)S[;1]Ψz"᩾Mi*%vHwƿ1Gs*9ӱ#MWUhT&&艎2K<>'d|Q2j=z*̑;[7?hDs_isŌ|gw"G9mdB=ʩҤF)3}ާcd~8Xg йKpa11 7K&cXojjZz)Ge}r7rʃh\O %="ȟȱؓMuiV}1-mzۍԣx8!B*ٓ:lѯAəA$g:g=sODn7gҥƮffIStMoIZjnG ȱc`,)>4;Xia$o"131F5]gg+9qr=S^Kϸ<`C9͆&:G_dzT"TuifffƞzdSRe =#I1B#x6y?ΌsqP3o|$OMy\IMh9<}}J<4L23ی#ok}DOfb$NOg1c#{ it,rg8aS]̄ &ofq|ėNun9NdrJXrԑ̤?=FY'珕QrDz_~5J&Pw/_|O~9szΝw?q>/ @ʕ++ ~9qgoڄTC)6+8f(L1Qg5hDejaqA`%/xD$l>ҷQvʠjP S$rmNM" =R^i0t1.h3FdQ\,"t4bPtXN8*a/R-(;]QfqX#uge ". $5v.TY,(+C*fa5sXd%'ֽ p3pLjX19>T.+DZ 26DG2CCǢO Uނɂr;EddP4a5c!8uVz+ȒNTdOc,"^ac tJ%uhTJ4G"U+dG,{HHPN# fe`)ChQwYLOfJj;Ytםeֳ6jͨ M>T64M{#ITWjJI@V\¨^&B u] IX*_EJ"\)`db1d4J LqrREE{*'6% YqAIB RD/ѷ,p>B:ѨYAd`_]=^$bJ9v!%8*foo\{EU?aQZ `UvFM}.݁6KjCQ. GyxkЩ8AФ2cK8IJkae6kK.֨>k{jC*MTAqi,z,"_j2VA60v[N^\& j ʥ[q(td!TbAP#$];t{qe\%!H+EE5 ҫX8!d1P$!5?S)`dlR)бr w2JǮbضG`_1~oAFA&w3ja>NkZn24 d*d@6 `BzKʲ]œEM-/lV4[*BǺ_ݩ!dFx`Q,⤈g tH* 偠]./ rtt,X b:n*31di\Kϲ U6FdPSGTظƅ)B۠EM5 :%·XUҡ'De UA*wpbr_zЫ.1Y(1GJWRbJ;1Y } Y%# fv'H ,>VjBfB}U.SbDlgEJIL1l&.( &+Sf^2ٳY$&رY)!E*q ,*IHs`khҩZ]$!¦u\eL Qt%"ReikC-Я\‰'xYYYXw>OS&'G0M۶iZu]JE.$q4c^N5tuHP c3\\[_Ы XE"A&WP7Wx4ε5,pfsw]X|'<ư3IwS.w_S? /Np *\WiTʜTzU[;ɏ?^%"<]^Ncg8vxėg;!]d&RBu']JroPl vVqex!>PcΟ, b {6!Ov?Fk]c/-'h]잿8"l 7 Om/O<E`勰u-$}NU|7w?R9Jᾗڱ{Y{{<(w?E½BTƻ|noQ υo}L:qS.Z]eU692 Xy9dŇ [$~! 3|VWyg<σ$O}?أ&9Yv=Svhy⩀*ԭU?zMpyAkƥ5~Y>QVA{GW\Xye]`|rϟKl/W9XYIDATb;l)8ivOiqLů_IYr=Jc hƅ ~C6>ȿGPǥ5{|'౗<%B:p5:zqmN[zqEw¿u/pEEs7we՘uvwD<O8qiދ -?g^`O٫VY-m=UWrs+i_v/p:jymںye/8+s/N?pl/={٧}GンW'cxɸ9[r Nȋ}l)>v8ŗ߽E5ܚ7+:ݻyw|;_y2Ҋ>·~B>͟Fkŷɥ[)-4v̵wws/w;&^wyn^y+"_}ϯ N]~NP[:6r3&{Ͻޖ;.#R/cmc>[Mɑw[ERoY1sko#_z-8*P%Cvr*s%]뼒=@|nb%rIltNԑ;9s9o:WU'?xshS.7Ask/x2k} !;;{/r|ۙz/s8=6xлB{⻏.Pxy pѯ:b]|;?1>~mqm;c4&NQ?*.{M]^Z?mNW_fR?q7kkjċ鷓Sミ 9Ǐr<kR^!ɻϴOngWy|k?V?WWf1o9"QIdgqNl''Ẇxc\2O|:6غ/܋)ߺ,zN~-\9tʯگ++nT*qs >O0 !/oq)T*Q ըl#/(1U "/VRPy)Fe T^7d>%Q2A&UWH0T^ #/QD(< )!0Ԩ' G2I9)TrD(2CqP:۬5RddBbre!F:J9*t Z Ei-ZdrR&T>/- #=7#ƨOȴ1(!RdBXӒٲqPy2/T"/ɤD J$B $9]J@fhm Bk@ =1"y 5Rd1T XhM&DQ LZ 0Q9di /B`l9/O79N8HeƤ)6夜MK1)+5 ɨ<N^ Fiqe>'FpJ!fʜfkJI1)[RHRsT"rRe*o3.ٖ*CuWfK%S;דq2בqYR#^ 5-xT<n=L=*IK'帤TM&PhSM6M!*磑3IfI)c&s%hjT9-ZQI\239.9m6FmHsUBr\޳ez~GlYE(C2r}" !!5r27]=UejH j cf&?A:;I>D9B#&l}dۨmGB 'J楟Z(%"I 9J&ԜWӭ;J@*d2_C写* Gq@k9eF:5>r/b=.h TMgӹg@) FSqwRnF+9yb",v%CfKGۢ!Gicw6rZN:?qF^>|G7tK֤ 5$HIѶ!rУ-=J<|]UDmN1&6رX"1)5y}[<}t%DeĶ[2ƾ\6} %jʱqe_4x+`߼ڇ'_MZܹsEN<==_K0~&omm|u9rGy&bv׌tݡKq_^k5{c|5,fxWya۷ +!~xu5`vu;?R߮-^ 7 UOSoǙ)Jĭ>OӇ<|+t/n:!-;~tGPfizxu@R$DjnY @%2jRJ^ ^__`0\.SV'N>[ 8M xa.wlCMFO&$F'}~g0;J$cJl_w?Z'h0~oV̑wi)gfķ)?`3>&:S̶)'y4ur7l;13w>f̓53~śپqɊ9g|RN>M>oFbzο֙;޹ /DO{?/f3I}z1QV93/~=S:3C̾sptr?_6&6Sz>]7{nS>}m{_bnn;4yy8kYOd+gxv^Ggu:=ݧlЌ([7s<}_3nFuA'm_?9S;yȁ>ccq:GuXG~zlz_>jߨSާL}}z_yYFăYޱ[ uGmDg-fǹ.f9=~8d?cfǔy̸㐱O.>|z|ȱ_g|I?{\﷽  aXSz6;gބr^LL gFo6?s{7haLO_7_q]w/f]ݸ}3.x<%9wo+f-۔Jڛ67+6_0M^NZ6鵆tbک뵨'~Fڌa  -HMn-v!a~G[xIJ'zfwt=vBN'Ꝙ-G.`#K)M4= `z'xg7Be7I>f0iM2[={dI7pGk2Tt:ްJ?n >.LGm:.g1pE[ ؎}Es ]>{cu?Yt;팠pwH{Zavz6~wvk{x[.aIoeҋ \AF4nofS>aI=-G;lӯh}zBu[T[z=`g*Ia^I4vta;w軚#'Oc! QA'u46QN;KؾM)!ۡ` ]vB~|t!l7D!Bh!R xnwp[}I* َbhh*60!n)IO%=txqBQ͚D"E'&isפ4=!^E׷>k4^;$ ۸j`ջt\դpm.a 4:O3w>^v]vf|!NҲznؤt]"whx.ʏtuC k@6hfvXFإ7iYm﷉ۻĞG\hP^D=MH[ 1^oHw&6h\z]oHh3tTD tb16ىhC&?o綷vǠ9 q6aזC0,7[(mRO:YBM9;$ItȨAu}z6qk"n`x6MG :%uͬD\vFL0t(A^6dد O9uq fL;+nGi>Cٱi%6{!mMۦ ; ?t>nC4qNV!-yբws= ;tU&~a ;mt)Cwt=mަwqCܣ8{]Cbl7Ao6 Vnq}vC^H=kR]g+pavbG {!V07l KC7pnZ`/Q4(- he]>M`h0(vH}`'HJLP{t==A/3:nhg'&~"h׉{Eb bA3 [MMj$ = "r ìD }1c;pٓ}.=%X6^A/ 4AA>Oh-Ik ;awAEݥB'v5Q7H;Qw:aEk%n_l'=KЭUN7 1~È^3 ~^s"v=݈פ{ly>n괓aw1,щZ>oh>tׅvC݂ȔI+hMvvtmuw0ug6=,6Fǧ[rI,vxCa M/Fw[q#rNEmΐ_' ͜FO젻uz>nr5fc]u:=i$A~c0%?he;`2l\Q  prno{ꚴz h% ~n4R =pf7CZ-ڴ܀8htiCХct6KPw4![*i7=>CE1d = i75hwu`wH.[È>]M۴}Tq0Oz..ɰGjt{=;qVcowI,h]W1xsE۝VAӡV^&~]ݢ7p)eR"* {qG *nkIdMY, S&ZL0coڔ<$VS1zP%,aCe&IZ4H3;P:3vW0T!̔.8H0eo- U?yǤ-CjG,3,"J6)5Ҷ0rŵ|wB;W6"baa Rp9MPfnMM 3!$,B% +x͢٦gTeEր xG0XӴYV]@tFO.)cQ5 H,@T61%$<~w&)*Hm ֐"!]-CʾgU`Z#0b2#P q")b*Â%4''QPS Rp(qejIW( U\B]].RaS8IF6E=Ef@0.0%fV4XZP|iM2K&Ėi[,5(e 0APdjNߦhQ)xE%ǘ2&Ţ J6ΰuUl*+zt ,#r$*}=ΒI-(% IPƈLKK  &:3Ul ]E0;%&HLh;e`!TV #3Af)$S)4aIvLy8{k2V#K auщMjk"J[js,qIa!ʭ]\$Ec@^XD (C:ǗFCYa- <%DZAGdqފǸV1^ReM)JTҐ"׶fnfuS$s2|0UNC0$t$e*q)S\&)ea$uHW|8O]2|!-h`Z3,K§T-$Ҡ  q9$EE) L]ED8ڤ 2'paLfjF2:3' k:,CAZNX(zU'KHMDSkaU .@-srm(, )C\M13V,\ZJ3 '"V1b'ԘQ\A,2ӌݥ|X<Ȱdbf(*aB (SbRCL ZjD*)е+L T8'Y8qUy %D#e70v1RJmb0}A4S* 1%Oc CB&fI * aX!+ XTg,2dWEE{P0p 6a ߶pTZ )XR`(KdʢKAD$ `%|-񋒚aXHL($eŢaP&4/9Bi Mm"0_]0|TX(ӳDXq̰,ѧoTdLf@9NEl_6o*@[R%H5t Jv~@e&Jdz $.?uLV1zx5 2M%KPfIAC) U6KE\BJ=z"ET%,t%d6Lrl*ID\@Bd %,dD` m N?~G?}1ҷʨ0D5˱KK~s3"]YLEPJiKV#A0%|A#p4R ըMj-8 J KmEu@9 10ˈR* +_ȐCQPQ]cRTEeE"ifCEfa<&_Ŷs1s1s1?/c9c9c9Gs1s1s1s`@c9c9c9cs1s1s1s&Cq6s1s1s1sIBen4Mov@c9c9c9c7Ap[. 9c9c9c9x!W^ӟ4iz`ɻ&t9c9c9c9SVooPVy'XYY|~L W[o8Xh#͜[s[Bn?Ρy_Z~ 葜^_^|9w:::?,dus2os+}FO;cl׷$._8oTx#9~0@7?~}>Wo^W?Jr15cСbW74>fMrq|s=5+5;;;o&a𶷽% c  *EkȮ~vޟ&{4p?j{'GqZi 5;C8 1sG.)> KgO§^,02կ#n*ø v~Mhk"kH/|}hby߾;ʏ9xj=Hg%dHH/~_ܠZ{W7o@rvjig~O|7 I1AHoWAT|@coפZegP{Ͻ$08Ajkz\N~T: ֓_2#xֈ 1կ8L~uݽ~BeGtE՟CG޳.0nOZQ[OlZ>L=to㵭'Y=l}'!'Gm|tqPsPo﷌oިګ]xO?}JaHb}}!|~0&yiVJ5 ]Hq@ 1*W;Dy0>fF6# UCߞCiTgVZ()-/5^q|]crmRa0G\D!Aioƾ䍰z9'Dqq/o3n=_Fr^՜ 7hQS}y1& t!i?eG7V&:?Jիud!QQ }[0sf|]|#^5k֚Ǐ裏w A0Sc9c9c9֚̈́cǎ?ϟggg%N<ƕZ-"r=9c9c9c9Ce:u )%kkkz6F~z=wo}[<䓬?<|u]{1|F{^{1Ο?E*??KV=F)bE.4Q!2bfu %z1Uz4֫:k|Ɔrb&Z}8 gy$}S;=M @؄}\n;51ó(M3c>C5guGI hy?ߞ}nvnC(Ԡn|y>ǯx=\n)8=zMx|7mONus~_r}jSZna7fp|n0={u/7ν)gt^^R̶WCmϲ˯8ַj|Z`oy[};9~w];wo J)>~wE~7xqǹ@eZ )$Z=cX ]If iQ^`DiiN™YT,AIM(G#SI@@1̐ 3RLHMt1ʷ)E J ZT{ FI V#쁅iEd8I~J 8%цFd 4i9%@ T9'Ԃ ({ ":rňa*-I E@%԰,'`*A("3N-U 'd*D|P&+&`dT@#uN;RCf2‰f2@dm$QU`s`=,ᯇ:=_@8T 4R9G:2Œ* ;f;,o$g h'0 F6HR!4٘":%3E9Pp|*1mh"۠D%2h%fJTv&xU6Yj32T4LsY㖹m(P6yy&1SmD;w2hB`INme88"hC!-s;lB"щS&1@adf& `ǹ}f&EA/2Ctx"RI&5Q*QIP_UfkC#uކARk31@*05'2%Qm.^"* Dbh;%5vLLT&f>O_2(2"EY*A*@'=5Ιv2R)˪%I 5h3^ْhQR }9HJfMVgg1#,H:%N@!KЦ13&v;ChRfSho刟Z?qH,tl#7e$.%_CZCp%h@#'oSBF(Cce/m]NQ7+ G҆F& MIDl\3 "rM@c #! QR0DcFc V$N-&h" +Q!)Tbh B[:1C:!F, 5$H W+;(YHw)4\IR/h닌$v%(lUgFc&> 5s#-v$Vr%"&q 2$HHAF ]`  dw͜^h;cXw{5Ti6V,P弘Tbr< H 'hEhHD 9pPZB9`{Y{<BtXmbQ2ϯ2EnA 3u*D~UCAXT呍I%@Me1_!'?'3 Y+H(d}h!j"6@dI8aPejP3%jAJQ(!J`&ڨR9]2(IQad&S | $r+){`eĖ 3: %SDLA*Tb#d|\c܏d$@Pa8$2eD!@HE`XXAb}0$7I"Pkz"KHMl Dl!S)R[3,K լtb*"%tG9)F,1  %RdWz508qSNQ8v<0v:կ#!Zg}->Oq|\xw,..rs%opiq-ָx"_h6loo?L?~=ʧ?i:'N\.cYc?c%I•+Wxgxt:9b`wDžW2K?x2[xq.,v}%k/3;-2=ٓ;|w uF`bEWѪyȗ_[Ih+ϽS>egVcGQ:i~g>0>Vy!YTP">EOʵՌf W eht`+;] |$O?•5к+w"O^|ІbşDhg~+C&;}1z,ahU,E?B#"9ŧ8*O?Pֻ}'2Wnwp-aVU-s?[d?N"*IVjVA] U/W$M aA@p B1B}Y\#իX-2*;5Ni:w zOgq"{)lՈyJ6s!̢O8K˸5x 4nCsB rPh.(2p{4WJGL" laҫ\9c| "+79f|Fq q?׉y+w HL%*)bFs?/eakdo/P?f['0\$=smW~{!ЈGI/Rαg01Z >w&3H./E &zq^ILIdDǩu"{gD`vJ0,r=dU/?ѩ10G88珒< ҷ12{G $(vP[Z"* Ad~N0\ᕷ%l4i /ݍ򋷵YpO >Q晀KS^!S.5*:?|p*J [\;Y;l"RӺ+d|qt1)26HK\8S@f2׭wԏWrݽ_([L,8۵-^\-i\8]cWI.l]1 1| hKEaF]!IQ,% Sw&\+];^Dd_xy"q%e2:rH\w[g^z{V' \w?@ZHbJ<Rcgq dó|)Q:I^v"x~݅x)|T)%3Ŷ/L~"W,(gDA|erw,~(Jb5+/"ֈ/A]v7Q?^[y_3tBH.|F--ҽ釸ho)d'$-PL"MΟb_[!(dO?DXaݩ\=1'BdON\GR?b 3w3)#1QIcuJd%Ο)n \^\Y=B3 D5W9nrnIRHE\@d(!N;EڭQNG0w1\bҸ/ h'k%\XlԠ92'o 'Nlnn"@)뺜;wqh6} _җzz=X^^FJ=6kkk,--o| &%< ' WKK|k_… |㬭8wKZeii5>O;;ie,[$:1r&JW3co jt0i=@IKQNmsX]A7r$@YTd`S2}>F}+ !шn)HuCPj4 )d(C$Cr_GwHIe~Zbt'/7\_D6ӊ+neIGv -Z9exeE=lȫ%Fz?Hj)Õķ*H̱9DՈe.7,Θqu2C#0-~Ch@=:>va!hDjHltq\!A2$F#ߩw)F|2'_(8&픖h3MfFCbw!Gr[eL%VWa1u9ZRS[љ5HGm2KeIl0HrZ#}Ѡˉ2 ~YJyT,!Ȅi$3yb(+/)fouRVz3Յֹ<<+#QGb 8*nt?FqdD $*.Z҄tT& IWò UV.sd@JS=JTf"E*4&9pLbaQ>'!5/dT18ƈ-bUs %4 {7 #93%&7ѴШ,CȯEh80ulD^Ն\LEXyhzoP۸1b r_$6sQ5蠄h%'{6aQJF'R =M|ԘWy D"5EK2k#b P'.ب@*qP!eNCT 6}UA)ϱ d6JIu_Ħ$գ=}mP/3PZH8in+:(9> aP,BP(Rb&mebGy??P.m{RRt(,//cYǎs'N}{q]wŝw K/ĿW{oۼ_}D9Zؘ*_e7yMpo mͯ 7}k6p;F}7<4n&ff'c>}LM?7m.;mu_<̤n +*foa'S!6%uM~>~7/q$nMO 0ȡZ\O_moշyUI75bq}> n9Ɣ.1; }c?7]c|ʹ!7.4>j~)~q_ej+++<#((y9r'|%$__h`6 J%VWWT*<ɘ'OB _5T*8q5'XYYRַm>}˲'?ZG37Y^/-qaqE7~MXp1q_̴{30Û7-x8U斯$>gqno;v߮Fqk?[Utd۷u=ax[ǤzzZͶ M[?=pr[>|}c).87Ua^a>|k/!\m.j*'9c=mY|nn㷣Vܾݡ|׭n YHaufŭތ燤_zj܃BacsClRj,>jdjM^/Ok媯"96sè|>+Z۶=YfO?M\ RirZN6ٳg'*;V~,ߎ9*Jw}+"yIgsgH„a10eGa fA0xQdFP^FXA4#DƳϽH 7H!L1')2  8a #"?#5tS7$& #3bNs% # 1^1 2FB_*Ϩj)e$dQg؁% %IɄ$Øaaf^R6;Q\S b|_0 5/dwD(<_(KDy+M3h$HꀢDJ)JZIg~=ҏ(Qw).-(0$3~L.si#GnXΩȈ7̸h?bЬG4ewLW@Fb'[^ԆR). fxX~HF~ qRt {6vb.rpe )dLfDݏ2! OHM֋ /AC2CA$x͖m#6VCW.p*hu/bT"'M'B M=HTu^+$t!Gz1n ښs fͦ?#2A/x^@=hz! OD!Qoh`?*ĊNfz;Ԋ/b?DNA~Dؾ^D=hz $f@zMW~ "[ #Y.do|'vZa>ŸpbycEX'+IBqmS 8tt & DI!W_ ~D.M"F4U~Hi"fD#P^AeQԒ;ԭF#O$Dȏ-i*KSb.|g'D*hr~H 4Wo$h1%s$2 b?h_UZE &" B"?+)c1x€`?U)Gqܐ;%%p[s >f@w8w)q ^h*z2pMLADË!n)hFG&5QL66m CmU2}}}peƘaj!ԿmlVWꐃ@e:X?W)_/c 4jO! h뚁!U!CU54K]#o "k1vyC&T8u7\v(cC氃4bڱ l(,U! &泸LDC}6K*(4td`'PBDGC0؄P^`FQRdI^Ĕu2*FVhGbeMRuz0YJvϱ:Q!0Ď|Q6VR(#.X$6hl;W+B+d7]mHGCGRoH"Zc!W0ɲJeEԵ«9FxƲBO[zy:uySjL[YvW, +6҉^]-ae@R^39,;8InpAf2X`MvJ`uV5I6:M-PYD¢PzƍcX .F%j)]rM} "$?M'H2$Agqp8F"X>XN[%4sr4(C7XVBcb7H T];c]>-lLSbH240$V ~Q 52ed'bD7X쥐ihgCㆦufmFd`V"hdh!#|Η $4c˷QKm(Q:$ !ЎQ+Z!9"ԓi P$Ahm혬A9/,i~9zuKIoEvC! kM|]ssUFG*qdLO/5XZ`X,Iru!C@°^)ܺMzEҿ c$*ENrrOU d-d63s-``nh^ʊŽrfoD.Ԭ# ڥ$/dXܕ<-܏55pd'nC10Ce.K)љ8& &!{ȡUV\Wˎ]I'/獝(1Ҡ40°p`3e m̭: إ*$r^N X06,/Mv&J6˄0lR֝N2.NB3 .*"DRnX;|30 nX!YR`Po[c`B)U?\j+5âp8L3 heG4eL.ؗ !VرH'V{v`adW}k L]dKwɩM [E6|V!46,J?$@#G֩NbforJ%#r- CqE!舨 4P8^MbD ?+†:ҿ٨%ʂF[uG`QF`e1}8`yPY8ۗd} Q&%ZW \*ݨ=XEgb i"CvZ F:tQ \cd3J#- K(܅"ZпKka$VOUA "6 G`G4 j<*@ϪNGFQ`6zYBdL&NRi*c*w*!KȬ3Y瑹&qCX d*2qId=5N"# `EInx&>N7 .n)d|"Vcl0b$-OK*'IN$C XS2DϧXM6 2PZXŜ h!S Dj5 bУ"WRCIy$2!JNdOfilPYj}b#4"krF$r` v sUMer0I<4e jU,*Eg\c+CZn-<pCtmlL b5dZ'@Z@X% W)Q. {]T37 _,z veu 㪘 + ML)^?9 *uT1ml|MQj {ѱw{~sssNww:f-׿sлWar J.?>կdihmZ!HmĢ6tR:7FlEvcS;'Ҵhkv/Ciε0[׸H-T9!LΖ)[ulk{+v΁\:d-4}xw_sDkRk;h %>t3ǻ3bb@gӫ2Ġc'' vKnv˹^vӳ,7UPoo/q!ڮ;]ڦRiݦc7>mqM슭tndڕ۶vȮx=3vmL]ïvܔuyۦݜCR&-v {.uNfO&)_ĝ٫Ϸ7ȾsV/=%.?@ֈ[v{;Zv]o݉숝n on뛒o=Bܺ۵JFqevڴ=y`vգ.wencnVw\%۷M}|necKhO[,{϶!='{;lm֖{{y7[G䉸nNn-ݭ:^:ٞ=c=&Mv}wߙ)RH";RH"E)"H"E)RH"Ef!:? )RH"E)RH F8N6 ]I')RH"E)RH"ŷaL6qlR.w\O')RH"E)RH"ŷeQ,) ;u/}F:AO"E)RH"E)C05H7K"E)RH"E)^H')RH"E)RH"k=E)RH"E)Rx H"E)RH"E)RH"E)RH5t"E)RH"E)RNSH"E)RH"Esw1MB .2F9Fc^۳|^fzA" v~vNƜw;܍Yςܥ6'@_uiшǼ|eoZ M̍=ߏ1Y\N MVĶo|Yffi'oIy lwŒI/QP݋ۑ |}UwoG Aɸߟ+ıϡv)^㈄|_ohenU,/(b?&=gy(1/^ޝn=fvz{gDkġoGMu[Z^C>JiŘ{;飔F <'U4+c7=w&@~cXFWanL# }OڨLbTkR_؝m###诞]~X?~&6-?4k;`K2. b n]`V6Pq1QǾ.cd Ze6uNPqQQ⎉XVfjڢ\D?fr~2 ؽ_F{9ae ӫ.`nL >Xf@'_p'n`.t@ 1؇wRB?*%?]Q>ԟ> owrJ /A!_w~ %E0 gP A _SK7Q8خo# v{Pv[ϕyߘ U qߩoGMu;|T#=0|﨏c} M/{M? Z3y׺-1 9/ B2${"dY(#ebl{"f=۹CZev3Rhi۴#, c[X+` K"l c{QDw"ZDMfԺ۱w'lkمڱ2/Ju U=)R!l -;kHmߺLR&ۢ-˞Cx/Z|~̮_BDBGݒEu;|e!_>v+Zہo; [$GZnYV.%ָ[Ѿy^K ,Z5N2w;n0;ollRV*oy[r8_q]Qz{{x"|a.\@\橧(KKKO$bg}J_z,AK&0#~w~-|k_#sJORg_G~_|A?̻;b!kH!0&V v^|`i0FlZR'd,-AK6BʮmA'6h:KEjkCI60FmM8! "LCKV!B K1chF C Rr1812BXcF[\Ԁ`ŽD0L(cdѮB[*$p# hGFb gR$j{BIcB&<׶Fĩ#tGр I ' F[chˠ`l lҠZe*'KI~2*dډQ2Z TV!9a0Z H$r "Hȳr4"Ze6#@#-:Am D,i kAKDZeRb蛈m4DdadHAKJFO[I"XEHdSK0VRr NNhV(1F-D.H42J#P6K!w:LRF$2^cDE!4DDOHVH-Rm!BF6PϽˇ?aDž $W^ennu{1=|+_x?Op n޼Rww?[Wrr&xOl:Q"!3Xx5n/YAV$#́+D!?]{1NL" 1D,_\axz)4Ox?"[?+ {O~R?Kw>NoP>}7+DKp_EO.Sy.7W]|7^Y?z7c^ejW~Baѯp2"bn s&߷H21sY(CxȞDa{}7γ|?(3TBQs>jY>/|YȜs&}/F&[0N-o,*7pJ`뇛8c ?K_r} FD*7TDhvbcg=3 g6<7蒏5@z|ar7=\?2[1}X-3yi\?;_$vkX<tc~(=|1JHI}0bsr9s`p_dRhn{}z+?uRy2-_#{i?"/f;r_}8kxoq23ACf` #zni?yCދ|auBe{Z=Gjgюf흗S#F"n {8Ygg`Y!Vl?ӧ5Bʅ"KUWQ $Fظ+8C⻮#R8zIk%%|onRGC=~lEZ/`|/W~ÿ6cUP_S#;4^_a~Fnf2La(c M:,>W?;1nï(\P6/52~%fw|(Eg(\ѫ_?^l'Nshy1r)G/,ٱd ~ n2WE2wc-c$Jg3~0_ rqXgDm// q^V} a$%~9Ipx {i'ncsPXޅ{i$xϠj4Coeg:f/^E]ɠ>BÿHc[(G:B z/4pn.ϲ} dip0:7 _*G/5ȹG?J"l~>d(+I&uW +,x %43IJcfZ`.aDC2ŕ{>0W4DK$ s G{z NrDFޮLp_<+E?Ǡ\\Dpv̺ G"IXY#jV3&Tfb?/!>} h!Y}MZG<|Bϕ"ߵHo\#32×$s#6p! GfL&?# w~YhV4 W޿s#8%e~_~]αZY`z>J~%Kɫ؁`Mn Qvo`fPG"rʄ_ۗS8Xp0#g }pR3e o36/݅;HS'xy T"dcQč#hIGs+1kGC xByCp>}&b,czϛ8%3m!‡nP_:a\:甯VxCGD_!p,/4]Ϣy'RȸG i٠oѰg N,r坫 ]c;[↵N%]^74GK{? \,e^?c=y=[BP|y ,2QBS.x3PX'_?$.F pCחYíp{W .`#8CtM:oaݓN=ߗ lllq -n^TIDAT:u'|{{1BbiiLNN/} ˲9z(ԧ`yyIq]d2q>1?#?͛7>!R𶷽_~9Ξ=ˋ/Hoo/穧qL&1|+moCṫQN~ Hޤ` n82pI>=ZoÅPxYBK }wJi1+ =&,'E#>xʣk哷Rehe4K'<> y-Ze$t("Zڬlf>bMcԈ|M}CgZeM2$=L|]`fz B%%qL.%ǐLLXi ر!V*Mj FZMDJT%jlr }>-X;[; ]WhCCV"DKDL{&Q# q!Qq>hd@>D`a&S@+ ohQN8R pˮ-G4! aFjG 4+!n6" {( HI! lڦ69N^b/ghde@4}D`l}7YQ^S5M;R#psS)&#LjY@&D|,|Z |rsmG6qZ+$o^&艨Cz1FK"G4/Ȗ0T;|y 4mր~FS͐WrUZob~9ѯ6h":g5pD&(jr/5V;?ch DspA3TDf=1!.[\Gy8RE_ "Zaa)D"/J`APaW`*!8!phAW>U"7fG4YS^oªf}4zf2qwωʇx1~E$LCFm/p7PDVl.yɊ e>S QFK Jɗh)XZuvd_yh+2j`^6ˠ Iu6p{`z#:Z p6LL}8DYE\ cg-%Ei1nL1d"4c0FaTM|dch6c)0*+CX hk&$vhP hQ-D2iH0C5Se,&_$+ܘI wq*TD[/xML>)yH&12nY2irJQ)qVUbk\MgSh'Z/+hm 81[FK|FDx8.4"ovi Ɛ3aBLI_nxECcT%)T9@1*C}"Rl|Tq&7Sa#Odh7D X`iCH̊&Y HQBI$UǪKSD_ZK% qʎn21E1b7w w_٬M-zۅ:26$l`m-e݁-㺳Lz:+䰈q[n%-9oϗiLn1.+2v]ƯqΛ.vԵtUToϮxogN2rfl͇ұIK{昛.ZѶm}mO;.7;v([Ǩ#z2Z M.EMrnvc1`;@NoV=Ӽ]dSYm͓θwok>f3e͕fK]Rew"m?aDgg[&E[h.:ё ]2n1[2nɖ~u~owҴmv6 ?0ֱ=ӷ;9c׶N?v{a5;wtyQlئwlnǪ]w wM|%vkliE'6m^Ŏk 7wGnV>ty=3[i3Vņ ^v[UEClm}^ݾvMQnۙM߹;I7NG6m1-mڿ[ƱӦBbخ[v0`'||c a:=~l˶Gw٤=[wvxt;+Alc(]&裣| ~!JOF)EOO'N… 4MJ?8a"~ǘ{e``rL>P(}K.P.;ms?s(re~~WrwwΤ>088{/Biw)RH"E)Rnͤ./4߹)] z>Lۻ7skʕ+;w!o{bhhhKGyc=~7n[=;r9^m_TT*0c֬SfC  XKTbiipiGkFTL(%QJ333WqܓZTV1Ս CJbj$qPڰAժ#P R͡בjUOLlcoURĨXbueI; bn%,j͏[:SV@6uc[ګ/YiSm~ĻЉ#ku&Qw&YQk'6M2 rg>ѱѨSMҗkub2NTqOX I^8Cp&auz7"x#ut>lgdePҳa,5 qF($Va@XqruhYP!'@^-"|ht d0bLJ{bV*{X9٠HqصA 3.CK]>ʎɞ,Cez"ȵf|-J>X&KbJw ndrU!БN lɀV%ڂYԈ,WQ4zaIQ/eÁKF"G!KnhX< <'ǠPZ7kPو rPEwDPz 3 fLg(TA.UϬw V,U@En&}39740w"Blg}ȐXld93ũ"3!򞈡CdTb Scײ_aBW9$|ؑUe.P.go ϭ[.2N BT㨕rb-eY6TUCyY`ճ4}yrH`YJ"L`3hh:.+\\-nY f7B]zNjHcC:V1m58b=Sϓ]%M1cXQ93w(CfDVɔJ M2kB zOɑd+gra16bC!J?Ż$QZ.}}}J9mH)w|Uˊ<}[QFJ\dc@L5"1#hNXI6vG+M99#@H0ZH:9 C''n$G)uӢEg{d/9ʊf3RK!9^M Th-:Ŵ &-ƀaZ9 F&3'$I'nF,d—̶=I:n'ysR;J%Y"HhvRvlqjntڕVzY(vqX&9ΖHLif3X.'dBX+ɴV־h%3ytdvml6+&o4-hӶ3c3t ]umֱ_M:Hyn3k'-͜,cmҖ;/A눜1sb37MO7_ wqG^2-6sMfNn{ޙRm|%6oEΏNK+Ҵd 8Ϗ|Fݲ/鴤srކ6-4Ao?-Z[ $c.ZGeMmti2#ɦ_hEO{D-6UU"e/Dr]jm{Zf*Z@m26+ٳ-;]Ufmwvvxvۘ_[Fs;-<ضmɿlnջed:7-keK/Lhl9ifJ0&ue&]G[aB`4;] ѱV;ۡ-6IF&{bD|LO̴+5]6MyU۟j2+:)IlE[ B*jZ&9qSG$I[vt+<})7itgO֑nYhMrna{LǶeK ߷}P—DGl7ϓB$-G-_eUlV;[L{ȥADnu @}^HX)]Ml͔]=]HoK2]6͘ǯ7cNW٥WEcIȭiצOHbJ #Pf&iȄK1ҙ^o5ܴ[}(ZoeG޷0[״$]hvn.Bu%m%r_َ wmW ٬W"E)v@I$l\6MN)RH"kߩ)RH"E)RH"Eo=E)RH"E)Rx H"E)RH"E)RH"E)RH5t"E)RH"E)RNSH"E)RH"E z)RH"E)RH@:AO"E)RH"E)^H')RH"E)RH"k=E)RH"E)Rx H"E)RH"E)RH"E)RH5t"E)RH"E)R`EZ?1kcHz_f,ʏ6; pz ]*ѐ=P{a}%ґ_1jvP/,v-!p=˔,F͝e CrG l|mu:r XEe fc24Δ0yg;=xsTJz_Xʓl|eewPzBOy)_R|,b>}Ŗ/3S&z.:aDϾ=޶Oγ%*jǎ>w׿V΢і0{"_ݎ )<Ёڵ}Uyڗln y>K{sKe.pvcs }3Z.Tvm{;ZwRиTp2gXzߔ/ ?5+'_F!g{:S&z+B$^}v !ﮤD~nST_\SohS|CR?MH12#YH'{ wW{(Ur8G]] r ~Ʈcn09;a#{־g=1־Lj훴놡G7˟[ؓש]X߃8` ]i2Lfk;0+5/v1@ Ƴw9E:M!ONPYB 5T_Z{h%n+;Bf-E'18ؽ.?u$fwߑ?^CLڍ]iV'/c=|܁ ?t(||`0_Ohߛܳ[(d2{NЃ9ߞ^&:rn n1 c؂?C=# DUcpg^gleH^(tOU-f?v^&>_Lj7t}׉ƻ&ߓ{`bOLrRVfG wB DߪJ!]cB$?$1{kٺ&:v.ӪE Int!h;m6my'ovnnCK2I{AR̮}ޝwwwL fC:.MnWS Cz)d]+{?MH>JM=x]Q޾֟@ےDW=n{*wor;{;mmђC}JiG5&]2*+[ǻwm9bo9L`-w` dSH"E)RH"E zE(jRH"E)RH"E-/q׿9|?333YVK/Q׹8pSSS;w~a^}U]֚'NpY^~ey\tQ~,˺c:SH"E)^F|S)RHⵋ;7 ^:qLZG\.יPbq pu* <G:??ATܹseΞ=m'$mllF~={O}S(a``??Zl6?]woo} oxGpggFM,ad7ArM~\O Fй0$ڼY<'L?1 BhӂHhm:iGK t˥ lԦEm IΨi2zM`f–~IshB0Fa@m$Ҡ[dWbS0][4n AN_URM:#hha׽34U oZѝ#Ȯ12fd",v`v:AV[o!ᑡUK|L;[l>۩[&GA,Ǟi "C㻵`dOLE]Hr̖2lzw"Zv][×qK'2iMX젥lEKHYzӆnfu_|O2dh].D+睎'2!6=7mvg,ݲ?vlm}׶ЫܴzR9޴YD:EBLUěH&|vN̖%6obM;i^lڰliNd ءt9 ;@tIrw7mV"2R6e|Wl:11oIXlDb햁o+ޤ-SxaS?&B0$ʛ2moئ.i[EK.yin;<+<&IةC٪Sm+➶jmd;6Ovٱ6-FraӇё$Л9kFl#Z1%[{KXۦ|m:b- fkn?ǻb/4"KivҾ)I|%z;ux"ZdЊE;~6b#7 e;dvڣni6yԦ#w|]a̷cU#7lV|fcSmIWK)Iҫj0`F|{;.tl)Ӗ.)w29/Mm[ݶ-lRk[㚤.;#MδdLM?M_w<,..>7oҥKH)YXX@kͽg?Y~~ZF|3}u]00###ַ^xAz)>LOOjc ﲧ=ȟ߅Ԟ T!K󫏲pw/d(^ae/>-"S/Ι?.։1\;?߄s&ͷ\׆qkLפw]3<ka,qW߃y,|dx>$QrefPy2=>9f~*'~.N\PwM|w7OF,扯+o2B81-W*0qx΅{],#e EX%}^C_x,s0ǻgCS(‰kob(ZUWO;Kߕ n^y+k!Y‰#dOgq ~d 35Ox3?2|i4Q!`u3OGE?6}vs?1yކƓ7(\a?@ng>66Co83"_d?C?y;[s4F28| n.V1|^x?7ـJФ򇯣s?ssO ^2g^̥&S3&}$Vd~a\,\iSo']t*s% ?z?X N]TgV`lLg<+ac8GhL/Bᕃ{2/\8FuLsUEC\-xq}`g{˟sVlz8ڵ6b}+ܫ.Rn֚#y~ ľGWorD1JJ1K Y/x!" , z>}W-T!2?,Wb1ˡ7!}9s9!BIRDG[gg^=i>"gXv*,?9ɱ:>xgj]lgf_ ~q񣌎WVWX+}6cn #xk:s'`^)㡱E*2>|_i՗Y}yOKn"d*١"Ff|{8ɮW[!Ԩ>0o~apƙ9AzYdvyX9*ʐ={ᅩcGa޵I&o}rrN_OXiƏr<@367Bn'?E:g^"~ {^"]ɟ\buN|zm6N{׉OR-aGs=xNz y+~s^ ws~F|~$>6cKg,#-=zL&I~z]=8Nn _e$q{GSwW=(0+ ;\P}G?3YR,4AgeJ*] o˰?^?HV4) VZ/~7,|z9<& J( ̋{.<&Q{/2r7koAOe_5C(RU?u_|AlLG>H랫G(slYFq_.mrgテW8{@=acNzȽs _q_O*}?8id%cT/pEm g'>.`"?!~"/{q _eQfCaM\c_ߘdwqB/s=x7ױ\f:pNЂcNM3Y~i&+sT"zˁ8\E_9 +-6zS,֫{!ơ&߽B=@/⼸%q%*cX# 5=1k OFg)[pD& \ȿpN<=~CC_Ŝ\eY2 %[c_xq 8=Rx: fd^G)t%~%oBeXX~?Pp#J:Rԩ.[%Yg4~%ǰ<gwo>N zkv<5O^9<5Gt2)ϗNRIέ2Nc ~ys?4~Ě~#<yMW:jNp?N }o4˨(c8u{z*O=LOOc!"&''o399ɗ%<<3ͱСC ^z%zzzZh4Q'>?A,byy!,ˢ^p9,"|&c:Z )gn_D^ga./!i8:A,p5\@]?>Ffx`pib>_q(`Dy|'4T#޿J!]GbۊҲ1u©W qptSj`V{s0@ Q ǧ"+E* ⣗=. st`@..Nrp Ajܓ7P`{%J _.d0a12O)^{C,q 15g0Cc8oиC|dR1zX=`{ !4Ѕu>rur%>iJŸZzG L,B|t[!:KUlW\GBD~mMb і"2oXuOPw]#~dDfxeDiҁks}WՈ8@TAZ&ס0:F UuvA\zӘOCЛ%s9K>ЍL|CZ1q m0GDJ}S:tE\njeb?Ҋ1&cCHoM~3` d/  {6Q$ѣ=vY< UvDow9|q`ӧ܍ب#d* z3D1dAc,_qy؃82$$.{oF?,_ݙ4*\ Ȏ\.DN*~~KJc[bCe3nFpl1 ̍sNUj|Vq z{lˇdD2<ӏtrWLM b= ,J84zWɝJ3,Y̩Y7]h ub+Ĩu/1 \ܞ/-}UgF=7R#x}A[Yr'D4=vC_f8O%\룩HQ-1TS !rʾTԎ)X!0LiC0^Y2=-60^&09B2KƭѼyȜ4Q8^B o${6n &v`("( '= Dezz!@ #CV7]p.Ovڦ`ї/Ȭ}s` #쑕!2WX}pUԅ!>:o~Y^2;0A3PDA*o|0m@jo(nZ`QBY~oij ^Ś;8n{<)Ұ\k"3hm\Ú쩫Ɓ(a+S^D`P8's?kbB?ucb#l"3M w_@>$n<0SKfFaYyh֫1^K)T1E kjN|?U'89 <shh(DIz0qN_ż~FO+Ne)l%r;<^q/z`DPZrǩz;v:ow7r["˒(R`@mf?EuQデ3s{ΜoE ْ@<9Ԡ6X +%d%U=㼛pqPW!,a)&B!YB 8ڎ^X'l '#1œHI,vCǺ~3$aDwV*% :)U/c+\4:dLw{Vf3$a6Ϛߕo>&&&H&HdB4:i%3!(y>LJ6N˴yڼ4r/ Ku..WҒ)df*)g%ǺqZѲ]SrL^Դ΋JK?OKj)9d _u!2h#sea52r*I&a\U/ZV鲨f׋U/|΋^f:2rtƽY-kYewT~wzںLʒ!#FФR(RzɖYL d\*rFk2K F tΒQnig%Ku4qi=Cvoe\u߻4vGK ˤ_[ʪY-g{zzXSyoHJ:=)k\>bwf#cﳥ$%KNIK%d"dƍeרqZM9y Cnʖ^?ؗ2޿%E6QQ7 WYǗN>"LMϯ^ߙwO YxG-u1M%3| K`IcCyW*kˮ.Y^˘/{Y 1&iأ˞i>aۮf[3ubR2n,EҒ\h,ʌAZV^Ԭe\}ˮ&hO̘SdݘS#5c|1T}4^٘ٲyk ҲاK!3P~aD]>1e6i]͚s2Eo?wz]IrHԋ1ʖ[cL }J˪Imnij,͕;S2fRttYϞ#=)|XVnvlTVV( yyy(~uǑ${w>mFii)(B29~8DÁ՚^qZxLLLP__ӧپ};7o&Lr ,b1***غu+~ߥo7^@ t˪Uhiir-!TUꫯ^桽e774KKK?o.[kkv/{.ʕ+Yr ->H@BK!|*s33Jե&MC8_T2M3Q!X\XLjPUfgf|k4RK>Dt `D,^,g@j:/FBaPY.ݯ3 Xtȍ58s șd$ݙ?A)NiF^8lNH;X[K  $Uo :nSݩ!3Pw ^bq~[^<ݮ꒖·~M>uF2E]rR*-=Rz{2a4-&ue'Lֳ5tQ5du)r8f,HȪu9MeM]/ge`~vEIzX&L:~EɌ,yʌctv#'Y3vYv,J*K>eQiwc-kTX4b&/ڲzggФ%G=1B5*Lśƺ,Jz,,.Ǘ5-_H8L(L7I$S%bnvLyyD"|ڷ]fRʼۥLG"B6O7#HQG1gY^Tb(Ed;ڒ\!".}ERLh*O^ ĩh;ÔJe1|ibvf|%=jR%G[8#K>diٙYI3m(g;UUMו&-Ota4$ 9L^X*HĢq KyN+լh- x3RdVg1Ӈffq*ʒ]ߠ)ZeOf"0O;ez evЗE՘%WI;R\c4ӶJRa~vW`Hcnn*IzꭷTn5=hyxX 2cLdZN}D]P{2Hכ'OY<>,UIZ5NeP+4 >'uX$F`qȋ>\JOqxI#''D"A fx.]?&W0Zm'0!"V;9?Ӂ uk&H(S0hd:Dr𢓙Em3$|QJ gTx~r9ݘaʓ8#*yX,14jaHOn~/h okȜիfQ:Hc.bk=  B[LmhS)Ԣ9B%1íL/6 /Xm2U`E;M팘t)\cY\q]7c);e1ԼB6fhflHjԎZ O-,Y$$N&I|M`;_Hp@A `kcՎǓ`nᚴ3f3M" j|,kO㝰X,ab,ҢR4az"y.wwͧ@&~lcEJIm&uc?WuRcAE;)[uHBF`xh4ֱz0꣮<6PxVbЛ12u5c'a^pJ I|M4lYq9k!\3]crbQ5c,#y5o\cV#YE"5K)H07W}ARH&4 ,:|V3f҉ f-Xy)N>Yu}HahLKZq)a!^mɘ )OL fO`pQj"%32GѸ2ȡ(2h e*J&o$\a&UÔp`^3sY>ɤIVGNvמ`r<0jR&` E x|8 4W貒('7"jxo`_!Iǰx籌 NXzM'/E]M\uϴb49ϧ',hb\6†)fSDT(,2q37]O@R6S(:paQ;a-A>_Jw<:"IZ0mgN43Vтnv6+~G72v/A CIlZ4F|8k(:RJ ?|.P.qkϰb }ʦ@Ұe)bXc 4xUԡ2!Ϥ^8H)+$a̹(c~bS m]V2]?ɔي876 y1[#hxfM̸]LZ8z̍MLʔZ5,K4Naw. !ӫ.tl+s:~M@"瘓xK,\:5`:,+UEfr$corZfҌٚ(neIL3l%#FY/%E ^#&P:d },*de&kILn"] 9ִ:YjC.QlhQj׍Xp(yþ(ε̍@A/B+[g)xTEU=%K9q7~獳/&I+EڈJ8<ot`Yjkaμp<-9}$f0%F !7ӵX֟e] g$X$xr ȋ?[NNys r)I'5{ B[J# N 'dL;E:U@~7aɁt1W!zې ;O`F}4<{vRnbdyG*3O*`rPN՛0Pb Yn*.Շ)T*clee]|ỿ9:dVt icn~H,$k3 SYjZ/IhB/H&eXf&!K KK^'JKZ*~z;B*a2dp$ 2hK!}LH EJ SdNE^*ԭII2K.kTRr&ƹbc[DzѐLzT3LܐC^ ٚ**R!*fB%IJڱZQ$cYBB5vhvh2&ˑJח^5WP^[HFrR MVg̪~&E-[Y#I  $-]d$mI4Y+Y*a2ddOE2v@%5nd隴.]>e-u*=/r> YE s'I`).fLj]@IMnz!^ϝĤ!K 03U%Xvv/H25w7s,eKyFv#Ijvdi%7d'F,#-O55$S#3b1_]zf׉, #lKϑ }C5eNѣPeKvhF21Yg>*Fǘw!S,M8C㼒 L^zJi2U˪̹tD&sLِ)2(x'dLZr5.車o}cLf^#Ϝշ|eK4إv΄ia2c'C3}Mʼ65̙9MeˇIKȌJ/H#=&-gMVReBy黝yi/f]/g%ؒ)oFGUM˺cl"3IɨFEhFL}׋(ob FAbw.'!eDD,"5@ >eHD"0j݃"}ZC"@Y@ѣi(9v;VYF@ >(,vMpMz8et.E @ Ls1u{P  @ x+Ž] @ + @ @p ¬ @ $H`2X,/( VrgS @(@ |e iڲ+,i@ OBAٜ~gG^1Lg"s@ >a3@ | ʹ@ <.@ P@ @  @ @ WBA@  3=J(%Ae, d҈Y!v0L k6ϩT8eټ @ @pL*Hp8iJ/,cIj"2PT*ubvq F|%Iv}UQ\srrr׳O"@ xtY?B,I$}h  RRRM%I"LׇibZ?r~my)˟JCUUjjjlWd^? HD<ghh˵L1 BTVVb?$Y&&&ɡ-iyiK((Z \(C,xŢy{ɲ,({_JtO@ ;3X,il6dY4NJJJzo;qԕT*f[6ɕ$@ 8 x'MW.Tt?rOГɤ,h軕F[\qJ^fl6`1$ɷbHV0FzN *Tx{4 Hq$ f%I###]attV\.Q~HMAA?@ ;*{ԩSX,vŚ5kH$(b&I$IjT*bY /={p\LN>́ZTUUg, T /".JgAUUEbתjܫ*/". UUk읶eԕv$I2ub /xضmqXoP(D" JJbAUUIJ3bҠ/|J[f~_q CJسgX J*2qMؿ?{nc1Ezgzپ};W_}qNblFUeV._Bn~`6[I&ttt / 7@iiG}a@ ?fhFIIɲaq֯_oSCQZZ0555Ōs}]d8/@ |JxWkX~=N1y(k׮W^y@ ݻq8򗿤UVq!([n%HOc2x d2ɝwɓ'9ʞ={Ǐؼy37n@ x[_wsHGG=333/Jhjjt/3??O,[n8NEa֭[Çv0vwlXEuu5ǎbLOO#2`Q =I sp8޽G2==n[nɓB!`iү*CCCf%%%(+GQv;^{~6[aw88O>$[l _PǏsFFFغu+?~FÚ5k())#G {nn7mmm?KCC&֣jnsC.P?.l̞={8rSSS(?l3<Ê+ػw/?86lݻwںLf.L'LOp1ihhG}B"dnnӧOsС}??|V4Mcqqd2Ɇ ܹsS[[Ν;Ǐk֬aƍݻxnVx7üFWW188H]]@ \fv]UUc'^*.뮻Ǐ3==lf~~avJKK twwc QMb1`vvX,j5ͺu(,,dxxAII p~Fa痖gtb kgn?7tFnf@ wTx H$ܹ*^z%z{{Yb`6)++tiܹ'|}{lٲ"V+BFGG䦛nBUUJJJx'TUUqF^x~ӟa*++6|I$ItRTT,|>n7VB^/& I(..^vUQپ};.x}A㺏c'-@swE/UUuV^|E|>w}7```|C- z_۷/D@AAXVE!//͆;̙3aYjկشiNm> ( +W_"sss]ȫ㥗^ѣܹNfG454!trW40hdή]xW4]v1==SRR䗿%,sw`(**bƍD,H$BMMp(@pVI$b1L&b)DZlXV"$L7k֝CTW2}Ȍ$DH&8V+XD"a`5% ñ;Bwtqa6I$XVFFF(,,4CSy$ihFuuS:( . H;wtq"d2X,dY6:I}n_f\;L&ꢬlY􄡡!ʖ'l6Ų_g[,(,u3m=Z~d2JpUUq:L&EI%%%IN1paanXu|8(X ͆n_gû>V~gǎXn,"l6--ZNQq0fX0q].P@ .3蘒$1~,d+WEQPJ. .|V0999AG!77Gv8@ gϤ1?bݬXuA~Rd2B"$h=&Q#˲\ @ |ft@ @ $G @ @ .@ E ֜ @ @qrt=p cG;Dх?k|?+H&F˅#\[@ C<b:Zd2INN^w2[LR|xcx@ jnly;>˦ k<>SY H$z;+@ qrssƆIlqqD"{.k$钚udYF$4MCUUL&d2-}=`YVv8wxˣ/| |k_p`2W~~o~رd2C=kijjk hnbf1::<~cg_6|>'MEEӨJII >T\0$QVVf|L&Ƅ*Nz% ~MSS_=_YXXn(Px{PFQQ-'|K_2ּ<}~OO477 ?ߏby2e+O>$?Nii)Xa(?ۿeժU|0'??< ###L&rrrBTTTh|OOWb466rc6)++c||UU),,dxxd2Iee%$1<A薲YưZaFFF7nd2yI&( .nPU{*/S^^$eyҽvV+$aZ1A0["Io..n^uڨ$+mmm<|fǎD"ݻB+Wdƍ?_WD"կ~??ȑ#TTT3’$[x {/EEEbQE n;#obXhmmepp;΍> (׳fNf3Ȳp}t:e8***JП+5IDATIjRTTf#SUUeڹs'|fgg7`qq,СC8pu֡*X ߏ1edLԻyI$kS]i?D4{n>c=zimmgUV]q@^G{/dlllY۷Vjkkl'255CJJJHR'?n0d322¡C())1:ߎ; v( 999~}YFGG?† ɬ^VF0$77;ws=PUU(~˅d"//XW(++mvx<|>/{W^annrl6%@ =$L&_WHFQN[3&!hIjvZرc%s,[͛+WbXغuvVZE(b_x<,ˆ4ΦMx<$ VXAyy9yyy^̆  oz+EEE(BUU֭3*.300@,;믧D<gΝHCC7otR__Oee%999]ºu8rfrnVv=7fz7n$??χeժU^2鈴`6I&^q^5M3v!u!ߴiuuu/uV/7,a}vJKK)++M6b(Է~;(Byy96ljrJJJJp8\lذIEaʕr7rv(o(BUU֯_Oii).:V^jbLSSVVl6l޼x<}Lr@ذad>nٸq#Vbzzbb^@  BTȓ$Vñi~~޸J$ l24$Iq!Y;~,`0b1 녡Jҿv.~WBdY6vf߯(q׾56w+~݅^/_=ԕ*IDX,}La.I$p\Xַ<'/ w1ѯׯB_H999E(uidڻƅ[8n+O @ .$ILNNb6q\ޒ$j%77wwSUU=<'I8nCUvf}lya2{-aH&b1<%MGwf6?EQfQRRb}qqqBK" H|M @bvv~QS@ pQ-ڇiLLL>Λ{%b6?ގusOR? TPv.%pX,brrr%Y4p8L2 d2I*@ C4} qQ=''UV}D"#effÁXt~DZNލ rss O7211Aqq2{'p8L4%??rgE @1188c]t9v3т{l+O3ם$k @ ,A۷xqD"R) ԩSX,n7TN|$I?NooaoZ tvv,ˤR)Ξ=kx?{,\.c_7qw:N:E4%77}(`XZ pY~P(ĩSbF9w8NCCCtttv kDgr2*syL&Ӳѣ8q^/fFGGG$z{{0,8}d2155E{{;X<&&&8}4$zL顬=g4ejjHrˉbnnSN1==l6300se,N2“ٳg%//D"ӧ4d2{HqqRP(~ǎ yXbŻOw廻9|0K?m&;xש~iø\G4FFF8{,hO*~<vAΝ;\B!Nܜ16AZ6RQQ륣!|>, hs=/?#$eftt3g077a``srrfaXBe(tuuLgΜjv =,..Q.Du ;*ϟG?T5kְo>^~e9w044#<Ν;x<x R^}{b1V+6$IG]]^wYGGGf~~EQ1LeY&77ljFXV@UU ''ӧO}Zn7}}}>j9ssq #X,<466F9pNTTTpxٺu+&i>33Coo/vS[[5 x64ty3Izzz8tP& 7117/σ>Ȯ]p8N^{5on2立J86vاp\Յ$I81GGG`F刺ÁxT*ő#Gڵkioo'? fidYd'O2>>"77xcA'|iz{{))).p7x+W_a>L~~v*#WKJJD"(š5kxkg?^{-֭# "I{ĉ#I;w$ ~N'UUU]kz9rW_}gZW~?nAv*AWTm6ZǏSTTիͥ;wXv-8p;vEEETWW3<<̑#Gl477c8qN2hii~z^GGx<jkks1lBnn.ͬX׮] 0;;޽{)..&//'O''۷Yijj2-I7tvv266F?p9RO=򕯠*Ν㮻bڵ X~=LLLi&~iVZEkk+?07|3:u[vb?~P{zzO~j%''W_}I#/~j"I>_׌N2䥗^bbb4/l1::/K;ѣG:;;ijjh|V^V^mk bD"V^M^^uuutvv"Io֭cϞ=vٺu+`Y0LaB1L, v݈&p!ǹ[.Zݻws){1B㡠Y8T UU|> ӟvZ$D~|[vSRRB*brr!^XXz{{dffY#|4eŊy星'bppH$<@WWW&H /_ 6cnn.L&^/;v젺*֬Y̚a6͆,b(É'XXX@$}TTT 9{,H<'NԩS$I24fgnn.@6$ dq>z( L&ZOOEEERSS=܃ԩSD"y^y6l@*bjjJ6n$SSSX,(c߾}?~fT}ݺuotWTT۷cbzzڰ m6۶mjw^^/9syˍ# sPWWG^^W_}5W]uƑP(Ν;I&߿EzzzQEall)Px$e^y8x ݸn.JKK)..ȑ#9rH$BII ȉ'x|_0[/ӧ@ lg~N'mmmnNn7p8X~=֭;wƍf֭TY b6OOOsicZ]]'gZPTTi;v ˅f3Ғe@ @uu5,..il۶7RYYɶm4G;p `ZYl6 ?~BndYf4MQl6177~zf3ϟ뮣s1>>΍7Ȋ+vӝY,ᠲ|֯_4,,,pדKEEl6ZZZXjTYvE 0]&CCC.l޼IdӦMl߾"Μ9Cqq1_=+V`||UU;P7|@ jX@gsrrx>ƍvYr%f1hhhXV~?{1.~6qe|> f֬YlQ*ˍ5M#b VZEAAlܸg(++chh1Β뙚bjj={n:ÉƍٴitttP]]ͮ]@UUB6rfgg $ֆ;bo"2xjcǎf0'OD$z`ʕsꪫㆆZZZ  QQQlݺ2q8\wuj'$ ?"l6hPCC999N$jkkcllnzUXXX`qqo:N'ϟg׮]PQQs稯ꫯ,=@ \>4??oleH XcDD":Ng5 ND,,, /011Aii)w{]? QAW399 w{֍F ܺ3w^ߑ zeSwt)t=:gip|fqK%Ibaa#_2f~?x|B@ '=]4v;%%%kL܁n|&1q@ |:H$R?C^=@ @ q=j5e:u~?DCyyy'ORTTd"Lrqv;,sqlFl/ Sͼ'O;W@7|xn$ĉ?˅墷v^hkkH$8x h̙3={p|300ÇaXhoog``ɩSJccc1;;K~~>&1=J4aڌ0`徘@=}Ȉ&ۋ4ǎc||<, ϟ7nN9}4\yO~l8:::8tcccRSSCOOݻm۶a2J8wF,M8frrp8L{{EY\\188h Ȳb0bN'n'[A_qW F9x [nEeEɓk!2p%LoRWWG{{;<쳴m;>̈9( @ >5|Y;wNhhh{aݼl޼R=444pUgϞeӦMhL&/󵪪n_|W,z$IzzzFrm_ʈsMӸkhoo73006l@4l6&~hhhsΞ=Kmm-ϳ~9t_җ}8twwSQQA" s1::n"lذVx DZZl6, $aXp8X,dYFUUڌ?{)++W_5,<$$Iɓ<l۶<~in:::dllrL& X<g?ampUW177O?M8nȑ#466( XLp:477/[PxG  3;;,,.. #JPUٌl6v?#rrr×LBtW_}3gΰuVgzzzY誙=J,#J199W_klf$Iv;l޼cqYGUUmfX"tt¥<쳘L&:cad2cq뭷.S}>MMM477Luul}g]@ 9gnn"6oLNN[n%??N8VB4ZZZf||q0L 399IaΟ?Ȉ|~paD"b1:;;ahha˅&Livww377GSSdQ&&&!\.hoSRRB4ɓ 266F__x^4M1 ?#===TWWFyyGXr%P&^/]]]X,rrrذaTWWvee4 YɻjE$CU :::8x HdLuuuR), Dnn.V⦛no< $I\ժU$ cQK }+PWW,󌏏%d2iӑ#Ga:::鹤e4 ʦM 7n4Z*++ijj_gqqѸ7''+VPPPimme߾}l޼x1IG_IJ" $޽z| s~HN5FFUOϱTmwj eԾV4Mo1{ ^2@ \9J_EA%@||{ rs|`}H=e{ ҵICo'Cbyhig.i9﫺}M_Zd Q࿒Pˇ+|+rU苟)@ XB?4y_}tPFbiRf}{ߴOFzst_ 9JX v|.r~>}{/`M$Ԭ_nޮ}ߩFth6EUIl2hGcvY'$aLԻ^+K2$Z l~2s19y]i_G.n@ |p>t *r*XW3Sgf|7GDUliqO90||VJ֪tt2`mZjsޒE|#nGY-AXU c1'ڽl*Tx'q[l(ـ)F44Sͱ7 M-[hhGCc{vlf]3]tux-E"ϞyX]a㋴880tESh)l[Q`U*ƎKƨWRh`'ͭ)^f.<$}@F8j|5;9<| ٓ67RϜ ' J%-^K\slDr8?{A6WmY1gS&TT}H"BEsb[l-]nd:2M0fmMF^{a>ٲ<݂Cfa_<|aJ l*#gIg ǑW}O>H<gE.Ƞ[Nlw?l(ك NNE+^GJM؛$;*wca80LX+ VPc<4NDG#@ @yZvT;(r;kYY-"K2_yf;&}+k[ mpP-k[m5QvUښk۫% z6lf`Y}:r|iX=~l+5j5վj!IFpZp?e2]5hk$ PXLΚga5Y)"K2wYbw1f̮]Xw#9ՃY6S-Z[k;1U\Zv&ߕO8f!I6Z.ZM-%RJ_%۫suxlϷ9K㲸T;m{)ra7Y_VG/Bw!xp"̝+[}+K/)G͋d}ys *|\]{5--xm^\q'߸8 Z]bԩEp[ݴb3y<aW.r8VnںkɱයQU[}45puլ*ZD-klmuzexJ(Q-,ϫeu2ZSuuQW|ZMV6odgNV76odGJ<%47m_gkV|UlĖ- K2|՗[.=2_laq".[V^4f֗ںk))+U@ꮣ_,ɬ-^UWQ-"[ qZ/箦)1BH`3ϳl'a@ AYfNOʼe .r|8߸#owM统np5&/=+A$F#,TĪUhh:ҍ3)rldH2BB?Ou>E+-[<cjXYyyoEd"ϞæMHđ#/W$x=yE$#ĕ8f̾}\U~7giM?|Ua&Ó453C|g>W_H`]kwc+Cjyʩ_K\)5EJMqk &45?|+ɉ;V} L\W.xyd2ͳb!+X*GF9݉,ܲLgf1_N + 'O{kro[ɒlt纟)fxrl9v44Vq|,&*R?+ Vk֒V|ο$];wP-ѳaq2:A<}iWn纚4 h`eUgF䉳OpbR߫R-1 `" /p`e&DL'"E"fN83UQS7{ǩױl Y)tRrˆ,IHixW5:qY]dӲ~+26V!. LD;/"}H2›ordgp}jiolҍ<ŦMr0䚢5<]/3Xp6'Y/39 ]>f3\Uqw40 &7~e Ocisx-5sWODQjROpy<{X*F#[%v~‰p lkP2oӑidYfM*s*i)j!Ǒׯ:ZfxlnV|M#tT<]]ɷԍ)((JRKJ3$ӿ\[w-y<44MATc;׋,Sqv? :\lΙNEє'#' ɱ`5YI*IƂcXMV&;y<84r$ OqnxW^) 6P,>$\Ƽtdc6*aMF]kRz_6H))&C/ McPf24ɍ 7"+"P%M҈)1NL`.:GXF1%뱙lL()gsfʽhhȒ }}L7AC+K3'E"IгX,V2]3Hidf؈ M(fcW!7fb[]e$ A{@fiEVY}"*d{ιシy/k +Ԏ6͓đH$#AtJ;Rw ʈΧyY]_enm;z n,EdttҹJp^&\`Afٝ_؇Im·+8½+0 Fj#Dd/grafuʀIcbwnJSJ Fb1fP!-Ţ#O?H$B=n.$UFa%J`ﺗ< zd\ BK.ҷǃһ9@I$f$U#! G>|_=,18N - ޅSb&33>VCDba?r:6K|'= = ,p>X\S.u])p:k(J|>T2LFWF`e`$ȂwTJ`\ÂD;F!S[ѻԋ+"YLX3k3d&fW1r)VWX . z[06Jpe2I]E%Sa֚IT%R5Z aLu/02/paAwx,sMR%aQ[^&Q(D ñ0'Y-X!Y̭[=KOXuKo~g?sks̭1 sks:Ȥ2_MM&ø>OC[-9LEh-,6f3除n(eJ̬Ͱ[d-Ƥ{NG'fLŤg4I8N9cȤ2=`=΂oӫӤS EBLN?l<ݗQd2& gy< W0DR?33/m#̭:ȨwP4$4tO2EPcP]{R"`Z[cxe̸{alzn3<+b;G0dxyz{[c-AeLj"8rL9(eJn`vuJ>vvMDDDDDDD䷈==:Lxq(B&h6^rD\Dti~Sež$'C|nܝe6o>_"$geRsvC<~HVѵûw:k H.~*+,#clG-dKȣP̵kE]?k{Ow6?i=>{/3g.'%biI݃D"bk#qeRC!?$ ~zyg?I~YQDDDDDDDDѿ@Vq(46)Iv]ĈGԢs."""""""Z a6KcgJrK~~?kth9}tjj[=oߏ#99[= )) R%ϓTbm66_&""""""""ajjpٲa7p8L(a,z=7n 9<կ|455A!55s=+/F,ceeHyy9b1fffvX K$!_U Skkk~SSS455a؈ ##VK$q%<묮ӧvc0hmmI> |t:Ο?c蠺zqFCBBH;wP]]Mkk+.wR__555TVVv//iiiauuFnݺ pݨjFGG9wccc\p$>FGG裏P*444̍7ezzstK$ \~ zzzX__gee>FFF(//W`0HWW+++211h$_3gΰ |7 re$ hi(_ǽ{`ii9Y]]hTz[nڊԩSsUbo稈o?_q!DJJ ;w`0ݻQ(ܻw/~ կ~D"A"Řrz=,gΜjeΝ;XVr9RJL&sssAj58qw}a4 zF̟D"ׯhTVV266۷iii?>|ᇸnܹÝ;wXXXooOY__Ν;̠1L9LZjMss3?H$^l6SSSÝ;wpݜ~mRRRXZZ" ۘJflnc2HMM%;; <.œr9&C+4#G%%%EFTbX|3gyIƦ`୷"}v***"55X,ƻᄏ)ADDDDDDDDWi'q\BxZ"t: :'ErQVV2w7?5/z<֭[ ''<RYY)4*_,+hhh[oCCuEDDDDDDD^<6tП䣭T*Ot}>7"`>q\.* V}C"Z~yq!Z}oj\% @@~tu&xӉbyd2*5|FfQ jx^xB!L& \yH$<.ҁ6B!B>k9PHhoxyoDe~VuiX__?S${OƦ£1£>Fp8ۭD"a}}3r>o*x!S܁Nq>m G-OqD"X,Q1]DDDDDDDnP_ BA!|[y4ϾH$DۈbH7 zIDDDDDDDDDDk0W\ATbZ|TWWNRRHr"==V # ILLǝN'HM]nݢ'J}̕J%ݣev;˔Lvv6n7oڊJbn޼l&11xXP^^bsڄ޷oΝ;D"RRR䎎'99R)_nn.MMMzIKKcpp*&'',,,peZ[[***|ByQ㤧?znHmSYY VJESSo&c2y& b0H$ܸqARSSQQYY!##D"tq+Wx<3<CUUUdff"XXX 11ϳm6r ^cۉR^^Α#GP(b2(++#--h4ZvڅVeqqNv-emm-6 *[&q=:;;Ԅ^G.F1Lܾ}>t477322B,>, ]]]?j;wl6oI:|lF#kkksNד%"""""""[Wqпg׮]‹!)):;; X,ܹsLaa!ccc/#ehh)Z[[ wppC;p8pϼRG{nj5,h3qRSSyIKK4wM~~0^8pP\@GG ;v<4ͦe͆)Z-Gd2h4l۶Mcii)/POٱc^'Nrd288ih'Oʽ{qh2ikk>c&''9y$B'eΟ?ZbJYY###nN:ͮ6 :ш\.[ЙEӑNQQnNrr2cܺusz ~zzzhmm% q ֐dh4\Цq^|A^/N"qYUzzzd2dR 8rf:;;>ŋ0??ϥK~:dddRHLL$331L?!Nc>N>EEE;v шN疖FvxK*255EII GbfhZv;v~ T*bwmbTTTƏ~#fffD"D={?{.ZTJ~~>_ dj;Ν;.Geeen$ z^{{t:sNYXX`mm FCQQߏ7`׮]t:y7HMMezznN' H$`f~:::P*8qB4H$L&6mhl߾i;w$$$)--7n033h N̙3FZFӡjl~tRUUō7HHH@VSQQKz!/DDDDDDDD'$.KSH$8N %%%O<$:;;QܹJ"P ᠑HqbffNdbjj1rss6ˬEQzzz|>KDѠjiiiauu]vhhmmdzzzF$$${n&''D*k.aarrRhӃT*BBT*vލB $JJJH$e233b Hff&z~Z-;w$ yyy TJoo/h۷ QnLFbb"v! ZL999,,,0<<^J%8ޱXLcYz= NGGGvu }}}x^ HNN%<7g}}qrrrHKKm||!R))))M( l6|MDDDDDDD䷅)gY]]ETt oJ}A"A4ns\\|Ł8zVyA6yA 6&mmm{ s."""""""U']"^;D"tD"! &fDИި"r9j;_w@P(hs+ˬ}r});Pظ/sIDDDDDDDEF"'( G.B8䰾(M羌}MDX__߲FxxH$B(z.tܼq62/l>(""""""""ۋD"!&3#v Bx^PiX__l4D3".sbfd?Ob㇍ZH$je``3gΠP(HMMeuuׯs}L&h .B1>>NYY%r ?&GR )Zǵkhiib~)DQf37oޤ`0n"---\xl6JׯLaa!x:x<ǵk!==Ξ=KSSl۶>x<Ƽ(bCn?z޾%۟Ćt:FFFr $''hFhuujkkijj"11x߷zo,=܌` *ol63::9 z%##MD"Z-W"Hn,Xw}g% OVg wn?SWUP( ?6'ˇ~Hnn $""""""xbOB2w/tн^/̈́aJKK|2KKKdffru^z%V+rZN8Luu5[nq) ),,$))P(Ľ{x뭷P(k׮155j:t|uTv7ohHKKcdd^{5ֈD"z.\ BTWWcZׯsyك륶ǏL&cmmΝ;Gqq1& k׮Α#GZ.ׯsaT*+++vHIIA.c6evv}b``;wS[[l&%%EL&`vVczGGtwwAKK .]_H$BAA7>W׋``yy[n166Jj5cccFӂ, <\!--6\.? q(..& p8F(uuuB!J%?Gn7fX,j;w jTVV288l?p8̑#GjcXBTUU1==ngtt;w0::|FFFuߧ^(yd ?gVWWdllj|>n4ikkcjjAѐRduu*:::PT 0 q'ObHMM hZ߿drrݎJ#"""""""U/z).."d`F#8~ln7 ))v t:yPTt:yW a8ίJ+H8t(J &{P(l6^~e0T*JJJ:h4Hmm-wAqatBv]:FѰ~!Vy饗HOOGVc0())a׮]d2j屴q(J^}Urss4h4ŋH$PWW^ի A]] Ν;/_&==D, //2fffX__ɓ[쪰P(HJJh4F![nSXX4;::dtt16K$.]"33E,#11CQQQA,kА`#5552227}oii:b\.A/>dp}INN]Q˗q:ʹr9s cccRypB<d2C^^2tijjai۶m$&&7`>ʢ7o#d\zΝ;wp8s:>}̍7p/---l6RRR{N@pmZ[[iiie1dggϕ+WgǎT*n7IIIsݭ""""""""_Y<; JAףT* +Y^^.._"tuuYYYaxxC= `0(_6'rOy)--hll$ll|& I?oͿO}}=n .]O~V+Xx<Ή'߲}vc?m}~~ӧO;; 9wɼLOO3??޽{JDQ(lD5_z% )..fB!029 9x fxZ-?񏙜  EEEgjjj///hx饗(.._!8wEqq1EEE,..RRRBII Bjz7lmVT*FL4cL,.JKK1b8~8sV+/Fl6RSSEfggh4ڵ`yy@חMGV"ٔ@(d2err%, J߿Oaa!iiif222g̶mعs' LMMիW9~8uuuh4!%!!JJJ 333}vf3VCQTT$ADDDDDDDD!_OLLp=߿(D8qLOO:cJJJѳo 333nD" tttACCG?bpW\!;;P(?,//355~Z[[9s Da``۷oOIXXXԩS\zh40ҜHzz: ͱ{MH$( $ 2 \.lrll ܹVΟ?22LF<-- \NÇFvر7n?^\.gvvR)N^GV;o>4 gΜAoJ㤧R~:HRR)z'N000@<a5ػw/\|)l6uuu477?aD4aT*zZVVVk1'TG}Ą6==MZZzL`ӉL&cǎ'jYd^$޽Kmm-fl6ܹsa E6dEaVHbb"~)555䰴ć~H<'++KxBB$$$g h4n޼ɿntAqq1=zy233Q(HRL&{gjkkr SSS(JR)2l˟!""""""""%$ N`0HII Q8999FQTP(X^^&"4233CZZX,,,h0 ,,,lȬY,9l۶홚"9N4 Zn3FfOOhՊlfxxH$Nc277T*HD"oD J۷xfwF!忧5t: ##,fggR[GFFHMMz9NZ-YV+kkkH$z=KKKhZ0ttt033C{{;gGGG'4--q0LLLQ`7d֒w LLL~NlyyE&1==999p8HJJBT@T zVА;NG4}~*qIMM%vIMM%166"??\Ąo2\.g~~˅R$##@ 999B! >Nemm ˅\.'++ χAVN `bbBhe٘fqq<p8V%!!; 5"HRHLLdpp* ,lL&VVV#//OsxBSXX`nnl KKKvA~366Nnv`~~^Vs)J d,Z")))^\VG$blV|ϲ*?wɣaA:o8Ov|2nÇnȣɣVᠧsПXDI"HB!:ljbBF_:oT{'N3 z xޯDžiĥR)o.2{smo"""""""""$ X$r9x\Q7?@t$ňD"_8N=gFTNߔ|U57m$y.w}uߏL&3 )`˸|lU# mRzz'rz[<>oq:B:S? ,k˸\.Vs8'n[s߈|~ӟO$jÇ~Bnr|2wh49}4oߦ\z=CCC9s;v5|F^իW󑙙D"!jrE0u( J%555\~iYZZO>a~~"(++DBjj*?JRR|@ZZ^(fk׮q-"w̙3twwB444IDATm687oޤIff?00 tO;wŋYYY6Y]Gavvs힄޽{dgg?Yv… tvvVƍܼyKrr2W\͛b4D"\p.RSS477sVVVE"zh4d._ttt}vzJ/׋^=S__/Cww7۷oc٘TD4шcppP/ńa"Z{qIZ[[YZZɓ'dBg ӹI>hllx<΃PTbX) x)++ȑ#dgghhll䭷"駟oZ2 TVV;pyvEBB&ʕ+8Ny&/S>z<󩮮FT e]]]kA fsq!$ XVrrrD"\zׯg|> ɈD"dggsY 8ǎ`0HUUFV ϧ ͆^'##~x饗bmm1JJJ9voh4&[*RUUEKK \.jjjjd2FW8J'$%%/~ L&Z*0"Mxl,--ގlի?… رRSSa޽\ztadggAJܿzzzΦr<Ƚ{b7}CoHe]z1 wݻj0L211ItNzz:ͬ?tR zq-h4 q-~?j.$06n߾T*EQVV&oFFƖ5{xAur?? 77jjjf}}F}}=}vaSmyyׯڊfcllk׮Dzz:555tttۋlܾ}T|>׮]cjjT޽T*eppE>cHOOd2Fihh@ pv-`4CT233C?To]ADDDDDDDy8_➞N^^!H$r9~RSSF!77>VWWy饗$''D~: OH`Ϟ=9rۍyŐH$ٳՊ\.'99;dq, {%cZQ.̹@\RRTWWsMZ-{EVc069~._Lww7jZؐjك`@`6),,$77h4JZZ* ǏvR8x 999ow4ƍ &''wiiiܸqzzz],7oޤdӉ\xH~~>;vҥK,--!J9y䖧7}v"iiiBڵkh4L&|>(,,$"J8TWW7~_*,..rI;IQ''‹Ɯ7Q6l6477vEw1~ӟk.coΝ;dffr1wF.DD"all6ݻ< ٵkJ,..î]0Lq233)**bffVN'333B@4.h4*8[I(ҥKr~Q$ oXaP?fyy^Pl۶??evvMrj޽|& Çijj⣏>bϞ=$&&>bWEOOLMMBEEܽ{>/AF]]sss1G%%%$| ΝP(I__+++Ͻ{o~C{{;v"PQQnp_arr8}4x<z{{۷o'!! f3?Y\\ $ JT\.GPdrvMkk+Ofee\ZF"t:J``mm;wQ[JE~~wq'OFRR d2:Áb߾}sT*~h4|GM)x Z-/_fhhHXS^[ouuu ݻwyJR477sTWWs޽Ǯlq4 F*QTd2 2 L'|4SSS b`0P(HJJ֭[,--P((--ebb_טf\.rydXLX3L&dД155%(J89{,R$}ٹsJJ ]]]LOOoFILL$55WwERRSSgrr@ BѰLZZdffbXdf멨 ??a>S G^Y """""""H\.vpЂ %%%,--1==M<'==  qB ($'' /^gffIjj*6 ˬY,bk:E8N4 Za^/x\J%Â`hdrrR caa%$ 999FDQǑd H% !V c0`hhߏF!33~?R<NxRFBVDttww355Egg'gF0j ꉓ^gggY[[#55uKjI~?>d癟'c6fvv%RRRHII HpLNNb4 dddIII(J\.KKK(J, `VZfbbBFnӸx<11׋ 77"v]p72?DDDDDDDD~q8 '{<BIII2aA.yA:l8/S?ˬ+<yA6yA 6vf\.y饗(--ݒlQ]DDDDDDDD8菵WިCu% `P(ʵ͏vD"[^#]1h4Z'{!Hd e'Os@ u <6%X"o "J7 {Z__VVDDDDDDDDawyV>N{/j{Cn3G]yXg||v+""""""""< ?xjjjj((( !!>#vލBr ɄNܼyS& #Q੩)}رc3-d}*++)//gll\ya,..ryFdddPWW'|BJJ.,,tۿ[ZZZ/_EvvR[[+H P(8{,nuu_<ٴsy`aa?Z[[ٱc՜={\:<:cnnAZZS=v̙33ܹs͑… c2x<>}µk׈FmrF7>Ν;y_YYImd6Μ9wtt>ZZ[[)..ɓ|>&''z*/\'/K8s ͂/~  UUUl۶M{.\hll,//ŋILLZ0"""""""_5r9zJX,L&{Lv t~"v… b1vͅ 8z(۶m#!!~mBN~JEEE7odCN<Ν;IHHq^{ExQ]__gǎ"rūJ8`0ٳg9tj{aZ!sسg~f~RTT$HsY7o"Jy7j9|p1JJJr VBAALLL+PTTgzzcǎ!ihh ??_ޘT*f:;;YZZ͛jd2kkkF.\h4reA֭[`4Wj]Fkk+&I.yAdggrxTTT\t,.^[oE__HX,444/Vq\ܼy_\8 p%Z[[ttt,LOOs VVVS^^vF ))J_Njj*x+WсfcppJ[0ﷁ:Ν9fgg8v&~w JFq^zMddee 6{nN>L&ݻ, UUUTWW̤2&''ݻTTT YYYQ~:uuu|˽{ܹsy8@ff&W^[KQQѦF:Xmm-GETR]]MUU^6.]:TVVrȑMx< t NGqq1>yL&Nb=zZ[[Gܹs¦N[n M9/]ăl455199 vK.DVV׮]c}}k׮K/1004CCCv$ LNN2<<^?f߾}¿ sέDDDDDD^H<h􉁅P(D RRR~V(B!~?~ jjj(,,$;;. bF"~??v^XYH$hMg^O~~⛔DII vt:999f6QT޽x.ŋtww̡CRɉ'hhh ˉ455QUUEzz&;ZOͅJ%jшaqqqS}T*m6سgiiiFFGG9v* Fnn.W^sA^z%FFFĉDPT:tr\.YYYryfffP(ڵ\hkkr]cǎ߿vFXHH$l6 )//gnnn7þ}X[[n&k. zlT*IIIq1233),,TЋD"8pLFaa!xr޽Kww7;Czz:Ν`0p |@yy9r@ c``Lqq1%%%x^JJJJܸq\|,ӔjeaaATi;l6:::X,h4^/9rEjjj***w}v8j[MriN8AQQp܍cqOOsB"ZZZX,ގ $0h#Go{ݻο1.^O?G0>>bݛIkINN, (**"FJ\.v;$&&IOO'''QYYYa~~LFBBz!~mV8w { #я~D<{=rssAvY[[v_DYubw$SRR‘#GÇsM9r eee ,,,t:ll6t:v~?jD4 n Pm6Q7L,4jkk;ػw/OeWH$B,#o?b```0&,p]^~ed2:Nx<JKKYXXt:Ƿ40 aXBR)CCCձ(lF"Bxw9q<@VdBb4Y__?6Mjjj@ @(nJhZ\.^W`?.JX,F0jxޱ1\.(Jt:P^D~~>&n߿b~~Áf#++ ш墠 g^^999\.~jfa4$$$@^^5ɓ'7@TRTT?:;&gggov .\oݻwIOOGTԄR$--4Z[[YYYadddPQQT*ѣRQQd27e0ի+477sAHKKrR68NW(|innF"D69dɼ曬HMM% *ThkkwaddX,FZZ~_ T*j5/2/_&hHKK_//aϞ=z<{a޽dddT*gll~عs'sss?p '''̢qlD;::g >IOO';;LϽ{/~ۑJtttzIMMh4HOO'!!Nff&?BVzR)WUU +W000@EEdB&'pAJKK8veeepaN'eeeº$''SXX/K '7P*5蠴^2B###G?6L&psY~_k.^~e^J[[*X2(/2p5({GBB.\p@ ǹt;vV8@ww7կ0LXV߿۷EDDDDDD% N`0HII . χV++++j>vv5d2hZNYYY`0 Glmm RI4ET4]]]ٟB~~^xQ6,--.󑜜) w:,--0vXYYbJhZ`p:ARRr) |>*p8T*"i$xyRSS  WW.wfvv׋jEPALxT; $$$0;;Rb0??O h#BRR2u!Hb2p\,--hdvvP($dlD ϫX,*F^/r4p\DQ, 6M8fC7m<|wLMM }>*JMA/tпKuпT<r^/3wJuпM6A'%%FY\.~wwSÉh4JUU333H$y׷ѝCuEDDDDDDDD^ }yyoTP($DlLTV0q$ GH}yoԱougg(" ~-;y\.z= bK( %O*JBWk盍:Af""""""""/Er39ՠqRSi~ltw]R)2m12S5|'wCj( cZL&ȋWyۢ\.+6W}B2= =ǘo>}>z~KS}> [T*E*~Ur /}l:gjcEg,J~4x~>>>ͦ~{ҵx <ɆE"~p.Ə@gԗ=מt/{|w Ń6~?GÑHߥcy񻉉 zzzX]]gΗ=/lޟCӟ/6~H$~"V6oLFvv6SNp8,--ĿoD=Z<77GMM υt::;;9u$%%8{,UUU,,,۷x"deev裏hjjfF9s uuuA Iudhh {NgC0p8LKK υl%pH$V*HJJ"`Zk"§~Jmm-:MF\~K.BAA]]]|壏>$x"W^% ݻw9}4p8w(JN:Eee%2d\Bee%333>vKKKNd\| b:7X,z{{룸Ϡqr|477cL0ܹs\~H$BVV 9s) ? N<͛75FN>y[[[B!}Z[[ٽ{JDDDDDxbOB2LP tBH]vqyT*/O^c$&&;#̙3oсwޡnO~ŋ)**"11q.JY]]exx^{QGU"o>n߾\.OwwAk:tH{{;VBW\={ >?پ}; ]8{ P]]\.ĉnF^z VZf޽cZIKKc׮]366Ʊc(--%k^ݻ ƼR)gΜΝ;p8rHLLԩSܿL&gϞehhHԄ``hh_  )l00߹?GQzܿJMM GDYY\r Dhiijb۩ѣt:VVV7D.?7``qq3gڊ\.4iiia||7n3IYYœܹC[[Fjnܸf#s%ڰZQ^^2Bt]]HjVVVp\H[[h4'ODד˗ijjBRaٶl]p8L4E.ľ}Q882L|饗(//fԄVp8Lee%=nܸ`ʕ+8qy}}}jBď~#.]Drr2/_&DNNFccc;?`6\r{>vwwnmm%''*VVV8s $%%1==-<&''9<Gĭ[0 T*illD&gvAKK 4662::ʉ'xW0tuuqqZ[[)//gjj\8{,vtd2caa,jkk~:N4~_s|>8N9rtttp mƵkׄ7-AFpU< ;w;wz}}}v***h4;wz{{1L`ttࠠ<裏$99;w`hhh@RQ[[}}}..]jrE~܌\.۷V`eeoŋԩS?x|(,,Ds=:T*ݻkb1^͛7 deex"""""| S-˦h^p8t8pz7oc222ba4r ϓFaa!,,,oٳ(J XYYl6om8ϟ RINNx<.|hdddZEEEd2t:( 2337?J4m۶ e211555r:Ľ{X\\GEQQ:2V+9rK. IHH̙3[l۱Z,..m6 |hZRRRl9siRRRc׮]ڵ h6J0::;vn333Cww7 HIIy9w\|駤2??ϭ[fC]]YYY:tR>Sr92/200@(ѣT*kkks]ZZZ}6@VvANN~^}UYXXjry~V/w=_\\̡CXXX`jj~p8,Q"A~ff?1Daa!))) F)..{ՙ'O*UJ9Ke!"cLhngzgg'3{{=ӽlc09d(@ r*ʹ~w.6KU7~Roo/3oc"͛imm,9}4x^JJJ())ahhk׮a۹u_r%,]TJܺu:y-Zıcj,Y%7^fJvZf͚V311!pbb$ܹ??j%''bz= ̙C^^LMM1w\Q*ܺu VKYY`5RٳgU*̚5B8n2222226>S 60{lnݺEZZFiYbr5._̥K3g5kt1118<n+ Ν;ٲe RFwvvlAΞ=͛7pX,~K/q |2OXd WŢEvAB*9x HOOgbb[2o-N۷ƍ@GGB!ZZZ>EEEttt`2`rrRw~~>(6xdrrr5Jyy Ad2155"hfBll,. ׋n'))p82Ҙl(Jktr">>Vngjj ^O||@Vb?1;wr9xIMMH`0H ?z@FF%%%:ш`ۉ#>>^ID2|z=ZVXLMMq VXѣ155jv3k,qD&_R/Ǿ>N80SSSnJhcD\\|~ & ^d"cل+ &&Lp8>`#f3G̯ϟ/EVDJm#Y b6vINNr$>>Ffcrr@\\`$~?NS\je`@P088ɓ'Zl6NÞ222222_+>6ύ7!0o<r3`Xx"YYYdgg ?bZZre._4˖-cѢE\r_ddds8z(ׯ_ԩS]3a^}U&&&0a69pmmm={Tx 9u6m+W0<$ׯ_pׁh`,Z-EEEhZ&&&HHHNTb2HOOnsQ֯_Ouu5}Ӎ 0gΝݻÁZѣ1{lVZŮ]qK.exx??pY^|E/~^G[oc߾}׳rJ,YBkk+/dٲe p8KUU֭#77z_הjy7qx^xY`/>뙘 ??rZ[[ٽ{7hZL&:7o k\RSS/F!//}477lٲ^/[n $K0DѐH||͛z* gϦn~_ /`6ٷo7o&%%w}W_}3|5O?4 :t|;\.CGG0zՇu222222CaDxUBjRVVngrrH$B||<111hHIIATv B  Chw&''$'' f#99Yܻnn7IIIx^FGGD"Ĉ`m*4###B󐚚ZyFI4EDdw8zB(JQ1~?J4|>ߏfh4 0@ZMRR6 ׋B %%Eh%!ZDvP(HMMEcZE5ݎhP(jBc%iѯ_N__7n?@("66`0jEP뉍v Avq\$''355pXiX,x<+B0dll a=22BBB)L&. шm)ml"äCRy!!!Ahq 3>>.o@@Rj14 qqqXV|>( J% i,...ELL `PYPp80LLLLo. CRRn0Sa6q\z1#x^RSSB!YcZILLh4 E mj%ZUi |p8V@D _hDIv>\.VaS-H̃><C6~t>hoR/k|abG"X,Hq$޻?_FJ{|kvDFFFFFFFF0>>FL=G$&>s%3GN@Q(ޒ@EɧyLO\4/ݽKHA?>1>> b]~`0۷Epůݣߡѿ~ gܣ̜9sDcŊ\xW_}6lݺ#Gh"3-mbbb᭷ܹsJVh8x |yWb… }vN>"//'NꫯFjj*s_ٳg3==~3IHH`׮]=zA)|֭[qj{=<ȢED"߿*(((ҥKܹK.$o6'N r1z- =_B8׏X&?.Ҫ=lciFؾ}Oo2x8udee~=ʾ}HLLnuV.\@rr2*:"DZSYnH]NH$m%py7۷ogŊ݄an߾V̞=N'S*߿+҃$ K<^:@}|?@'''p 8z(|&&&x% ywZ>o<.^޽{y&|>}N>N#33P;t+WjuVjkk1LT*x N>͑#GX`###ݻGyFaϞ=?~N?%4G>~.r%''jߣ{wnOjj*Fs( qqOkk+b=җ}vN8Aoo/EEE\r{6 m*g֭,Y֭[`0{޽{)++d2qu>#V@a``@A߽{7UVm6֬YCee%ܸqM61==͞={aÆ \viPXX(Ҫ԰l2'Z@߳gKrA/_7т``ٲe?ZMYYP6}Q f"??;wtRRRRhkk#99ٳgz9x mmm,XǕ+Wزe eeet:`jըj֯_Onn.* Bmmb*̊ }6k׮4W&!!K.//z+JyhlldppcǎRn6ٺu+.]ʕ+$&& McǨh4olFP~.\h#ߏh]T2oʶm`…ڵ׳df3lذDkk++WDpmϏ~#Νl 188bMWWCCC w/*Çz9ww!77k׮9uhcǎ@8ƍTUU100V7 6\Ο?eCRRK.|>DZ\ǏMuu5/2|iii8pg}!7osAPpYV^B`rrA֯_ݻIJJbX$X`h4:::Xt}7 2222222_>G@Xiߵ%K`08y$ , ##p8LQQTUUQUUF!33c}{)**+ v"t:Ӆpb6̤"f3ʼn]MM IOOg޼y444{R5k}}} ;X,ݻj4 YYYBh5k0k,Vklly׮]CVŋQT zjjjj룷3g`6Yf ׮]jņ cΜ9f>LZZ/f8p`0H\\w~覒L&Y`III|>^{5 hZ:;;IOO'//tvv222fcl6qRI__/^l6?s>7o&={`^|EX~=^˗/}vD"8p0w\***1ٳ TWWʥKCPpMt:<r?# fN:PL)tuua2Xx1555lڴ[nEGGtvv /044ׯ_ŋ3k,JJJ8~8@r|InܸAKK >|JRRZln7~"233ikkc׮]dggPYY)r߼y~ܹCKK >:t6@RRCCCܾ}.zf.]z  ;;ŋk.;cE>Q1$%%M6xp$66%KPSSƍ~:CCCtttʭ[w ܸqR-ZDVVϧƼyxgԩS̙3Z:::Dl<b233y&v"''B*ZV#//aΝ;,\8fs%BחO>B_neee Ill,6N/_.\ʕ+\pF ?#V^իW?d2166*s>`<}0 / T@ @}}=׮]:L&/2w555!fۍc?fѢE\vm|K/DJJ ###;TVVdÍ㡼DHHH 774rrrJǃb!))ImZZɴЀjFv˿LMMuVrrrX~"/`0H?paj%''xp:xCד&,#|>~#g\H9saΟ?ϩSB+RHIIat:q8\.RSSՇtxjgx122Ν;={6MMMB)j5jN%..8 ZNGbb"BNN=z)z"$y, zٱc7o&??K.h"^~ep݌#??r&55e˖qFzzzzmƍ ^?C3P[[+%755%\;v a0L8t呞άY"&&F$tRUUؘcR׋vl2(((l6E\rsGGtwwԄB//P([V, nm۶MfdaJJJDKfwo222222_>nMʕJOOX.^ٳ$ fbbBMMM466rXf ~ݻwŁx饗 ㏳{nZ[[Yf| x, ƍ:utoNii)UUU<\rfoop:hZ***ĉ8/_N 7$!!GOLzz:BӸeQ۷osAx y"'ODRq \B@׳b n޼Iee%111a;׉D" DpJd2jQTa4z̟?}q-zD^ >"RRRHJJfw|2=OTVVrI1L߿xAV3o<V+wAO7xW%''G?Kzz:۶mcxx˗sy`0@[[O>䗾V(p-J%rxGHHH@PKRR=---XVx9{,1113tru\.hDʰZ0@`Ϟ=,^ӧO+aPُl6c0h4U\\Lss3ݬ]qVQ(a4f޽tpp40f͚5l۶^t:F r V+ "!Ũ<֬Ye˖XzLOO _,EEEºj699Μ9swŠ+v[d eeeW?>>۷7o0f{]GYY,I픔IOOglٲ%K044Dbb"111TUUQQQ;}69vǏRZZZؿ?Fr<o&*_~>.]y'Dq8x<^`0k.nݺ?c&''x<ܔl]P`Zzrp8D"bccLNNVڞH$^7D"nF PJEBB* ۍ&))H$n'A*ҬMNNǣVɣdi h4p:x<>hLMMT*'055E @PH @R q8 a]włj3~?np8dyZ-l6>OZ*Ҭnz(ZVE6u{0111B!Q(t: @ 6^Wlv4nErr2NI8&bcc1A|>&^/SSS`6=جÇ hZ^/.K5jB J>_HabI¸f# G `0?J%d\\Z)1n~zjNrjEmшAq:p8X,*Jrx<$%%zQTb~t366ӧwߑNCTQC 7`1 L&K6)~XC ,1P bܹsX4&&&jU(PFN'֭CRx<L&=I[Q.~?z~Ƹh4ܺu?h4T*\.X! bۉFC\\n[%C$b`4l3]zJkV(brrN'N8Fד ĉ̟?<&''l0FCC.~)######'ݍnGՒ0cIEпMD 蟄ĉnyoTh$Z@D _c>22@NNV鯘h"YYY/~*B5550g*++y!######R ~z?Dt oVT*7)p}qILOOc4Z:"VNH}/=a6B#,r|YH$ǻ(#VZ2U(L-0J9mu:111(P( B|qiz'ڃ"x0B@TT*q+########AP0==zDNH,\.z7 No0Mܥ2|$K)########;4 @3];p8aDp8,~D""R8vEndL4IHs)B!^E$G7.|>Gj{Id(g gQj/7Pۍ_? ܹs3]u6B 'Wt_D"^_@@\##z |p:tttܷmmLNNrR@ @{{H럅 zzzßz F{~V"R!!T=g nf``3?'sMnj7B& ¥K~B}]jjjP {=Μ9;w.:~_裏R__kFGG{qiv;EEE4]rWn?-RF9r---3>>ί~+:::Xx1l۶3g055Eaa!'N׿5餧OJ[[sN?NOO"UÇy ++ J֭[ٷo/&w^>),,ŋٳFәwĉTWWd=믿NQQ]oIDP(AT*8RRRBa 𹔄X;JE__GTDM+ȕ+Wxџ~mΞ=KOOEEE=zÇĬY7ޠxJ%;wI Q(8N6at:E(+t:%##CFR1>>ξ}={.ב@ @0$&&>Fff&pP(4Z:s8LNNiRtn)Dh$Q^LLcn2w\aI}_i]W"cp8\vAf͚Nq;Fqq1G񐛛+]GT*^I3"39z(;v@QPP|"nNoo/f릴EOp"N'o6Ν?]PVV&2%D~}+;wD辔ƘYvz0==M8a4R-,?V@7͌ 7o{!99[㏳b bLLLpAXnׯ_gjjSTTF\ã>V! 0oGL-Z,yjkkQT̛7Jō7Xjjعs'˖-#337oٳq:t.,X@ 7R^^` ##%KgHLLJڵkCѐL]]˖-#66dVXѣGINNKOww7֭cҥ|><>()))455/z+ ^{5ꨫcǎM0&wy/rxׅԠsP(pz>ȣtVŋ|\t y9z(gĉe>99}6 ܺu ߏjgA000 YTTIJJ" RUUEBBXl[l7R__.~3gt:IKKc޽(JʰX,;v?3۷oc0())dhhb֯_ܹsٺuo~1zzz`ݺu{9(--%bڵkTTT[nQPP "S$͛7Ooo/<3\..^Hww76~x qxi|IyC]FFFFFF p5k`bbYfa6Zܾ}e˖1>>Nkk+B{͋/Ȋ+k.N'/G DviH{j@LJ&ށ@+WJmm*?sH8233INN&33a zHNN&>>K.qB6 ]jߏ'115k<*++1ͤ(N#++dΥ'`XXn/_$^шbo&*++gb]^R]d^//_ڵkpyپ};JgyF[RRaǎ"ޅ?h4~zB0_n& R9cKLHH >>ш$CLL㛚ZbjQe!pBvMgg'n[h fYl %^TRUUŦMhllΝ;̛7G?wx^j5-ŋرΝ$j* o޼aߏeܹNj+ |>'N`ժU444tR_NFF6 NGeeWZOBE1>>.dL&($,I~<д2OII NBӑ6CD"dddPTTDgg'o(--%--D,Ȃ 7`xx󩸸8t:4 IIIf, ^TuB`Xj,..agg'F!pF(((sڊ'//v&''yǁJ%{d2a2ĺe2HJJ੧ɓ‡h4X-Zđ#GصkC F('ILL o>˗ 撘8#Nx<•*ϟϾ}xQո\.._ ++xB/>֮]餫lZ-D",Yj%&&FEܹo &T Պ륬 ׋遴Z-CI36iV hH0r PƢT*qݸn8Nq'aZ1 B E;#Eh4t:sR0"Z:0C&t H$XI0D"v`L&<hC4# ` &&F'H!L&4ظIjL*@ ^J?wooQ(hZ0. BFAՊRy~(4nErrd q8BD"L&0C=!!!FcYjW-$[$axx 8z(?1Lt:$j;):t"p\x<Dp?*B% im B8N9:`ZkҵkG"J"%%^R$uR iK>[C\.ñ!p{)Jt/ÁFAt: BHZ,WRa1n7>O+in|>YpAtyNs:A(χZkn3͢/N'pXKRTyBZz=CCCر˿`0ų :NCCC9sؼy2222222@__v7vV+,#%>V@D _hDI8NΜ9eŊ"P7hDftI@ZpBY-B!Ο? .D"իWψ#yhmmf3=}e\y&hAͅ HHH`ժUr  _>115L~JDky?o%-񧩷U/ASe"~d>iXh%S?P(^oW-V(x<J'9adFD,2̧Zddddddddd9HϺo8JM%?/,S> 臉d5^o)W]O)4q  _&########AVxc2 t"8% C8vQ J#:yI)`kbbbu4R4IHВx<⾑HdF٤Tb@^/&ĉR$m>@0#P AF#* |]8ڴ_ףhz@ Ryi4 ~_h?622餠S_#g;:il)J ZzE_HcTVC>o<>Abb"¤V% a&nR)֢KgzF*W("5[ddddddddd>J$S`0HJJ .]?)ajN}]E;vpYv͂ X,TWW5kPWWoAww7j˹sTD軻կ~E{{;˖-L"k4DZcǸtXV_v*++ߧ19q ddd??QTT?O>LcsNN:EGGB?p;v젻Lj5[ne,]H$޽{9qW^/~jkkIIIrm6N:ӧѣ{-i%TߏZfzzMrr8rB! QpJKK alF._̮]`0믿N]]sA=ʥKftt7|:f3j={pyFFF(--([`w:Lu[JKwRg):CT*INN@ @0$&&o#pn޼I[[Nqq_\;wr9|>>}K^^MFFFFFFF+dzzZd)S`  2ogΜg,X@ii)ǎcݺufhnnfڵꯍn6ߦZͩS֭[Fuu56"!`G"Ν;GUUrYl6.\000@  0k֬e+W@bb"n͆nsrQ{118N***=^//^۷oӃht: .$..'NPXXo[(--%''[g1"####### <ڳ+>M]]TJT*GD!ϟ?كRŋWVmSRR&P^^J"..N0111fFb0ʊ+paXKbZ蠾HMMe,^\.F-[044>D<|2f龒q8<"\~fjjjEVa֯_0v*ZZZHLL 6 E^^O<s̡{ ՜={[oի)//ƍB!JKKԓM$l6J|||~RSSjTWWp8xf˗/'&&+VPZZJ0d˖-R2D"S\\AgtwwV?fS2VT꫌3::JRR`{;w`0l߾JQ]]0|;ߡP(ʕ+l߾&yRSSy B CSS`[nw^&&&x'X,رV<iiilݺɜ={V|D5k/^B0UUU311AAAfY[V ~Ád"551Q(,_zGt2|hZF#3::ʲe`bbtrrr6q?qA ,&Xn~F|>k׮ӧOsmz)~?[nʕ+̛7 J%Np?#!!Bl6233J&2?Naa!˖-ɓ … MLL nn7999\tz ZnGRh̗G0e˖*\RSSYt)jqx5ʼnyhc,\ ,9|0,^X瘘6lpߜ222222222_]aلZJz)++#D"hZj5gF6Iv/d, zEp8,ZIQCv$ۀiZ F#^WDL|{< * F# RH$^&`J%ʯP(Dpp8,q|>-:bB&\j).N &y^FRaZvtY6(kiiaoBZKjRp9NP"n\.b|J^zDIe'}P(fD!!!V+B!T*ՌED" &\T={:AշX,dff qE\rxZ2Hk4΁BȲ!^FFFFFFFF'wcj$$$̰؝<8G6jZ- qT{y_rKl~6{~w>"wMp`4y饗).)bD=.H,H)6mĬYfGF222̜1cO֦>~Brqiآ4]FFFFFFFFq}bb;:xll;cEk ( иR%  ?h$ '. < "v|{GtMt2i} Lo||HNbH$F!!!vx)gdk45azKvqi=,3H$B0$>>ke\ . [Y3_]TcfUh_X R՟$̷R {ƒR>V+ h4q>5cQ*"rBl6N'~F#\.Z-@)\.*JDJQnVrSK̵Z-G+6v] 8\.(rV`E#8amrp8&>O]zI麤6LOO_>&E -tz044 III=@w_aQ~:LsZB`zz.$*Jv;~_A0f|3 3ƍx<,d2wGSv] 555PazzzHMMLIJ%W^E7D4>O^(nݺn'>>+wtN ҧP(ĺ)p8,R[L0sf>p8Lcc#|s`_ˎRF }5XBLOODp8xy.C<<<̩S0L}&###mDqX?vnʥKzűo>jjjعs'X,N:~3֮]KMM o6ǓEOOL7x"gԍ-۷ӧO@^^6W^yׯ|rعs'555 0gN<ɿ뿊[&BII 6/(J, v\v2ݻw/{app,J%۶mcǎ,[H$޽{9{,W\˗/sajjjHLL{nΜ9ɓ'Y|9ǏGIIHw@RR']F4jtuu{n̙Fi4tpe-_|SSSZl6+WF^^Nܹsl۶4ؽ{7/^h4mۨnSXX(R$]DpQByyy.W*xWijj͛Q__޽{%;;{F0ĞvˉȲ )[@4ҸNNa q:"+t Rk׮Ē%Kzx<`\cKJP(8y$bZ]0mrP*(Jx j5)))eBx<N>n+< QWWݻt)))l۶:\. s1q8,\P(Jq wKjS[[j@ yyy111All,Nbɒ%TUUa2HT|ML̡H$Z{v|kv)**nh(tg>}SNQYYɶmHJJbm6tf^urA9BKK EEE"PjEc0zpahhYf1::*\P(OVVPDFJ^4>bJ/~ >< vŋIOOv +蹩hؿ?̚5K%R&R [o8FPj8< -zbJsP#w)BZ~ICCCFT믿gϊ䌽OJJ oΝ28t;Ccc#Fk&y~~>UUU3 ;vhѢMWW>j|rN'ϟE//,Y'477sA룩IlN'F瓝 @MM ^}:uRΝ˛oҥK?saB뉉?97n`ݺu<?~p8LJJ ?яl?g˖->L `Μ9,Xcǎ1::ʼyXjvbrr""55.??ȑ#v~:Zz/bZtٱ<38qAؼyӳgϊtf>QT\~p8ŋYv-gD"455LCC̞=X***祗^̙3͆baܹ\xF__ӟ멨ʕ+p5tfOOO===v.]ʬYxׅujzݻwV)(( -->t֭[/KΝKCCe>Loo/yyyl޼ۿ rx" 9raVXAVVMMM~g\xK.޽z):::ԩSjDKss34Z[[[n˳>+7ob4yg8s ` Ϯ]P( D8t+V 99"qn߾=c܌q,Y•+Wiijj`ݺu|><쳴bILLʕ+tvv266Re˖h~:7n͛tvvƍ/GeΝ\xy<|0-͛7v ==YllݺU8f&&&ȡCf,\pxm}]j56l!"=hbb"eeeV<]ijjbժU( bcc?1311͛9 /իWcbbB|{crrÁ矧|9dҥ[*6ab6q8zjf3N_]h._Lvv6999PWWGcc#CCCboXرcJ;wßٟ|arrr0? -- z-F#PaRRRq=Xt)/f||JΜ9ؘpQ10_Nϧ'Nß韒jeddٳg:NΝ;C*++QTTUU111AFFO󑗗GRR'Oa/7RZZƍYd 266իWPNaa!7n`ppr}Y<ϟ6N>Mgg'?O(((xԥKrIΟ?ҥKINN̙3:ul L&}FFFfŊ̟? 6j_7o2>>N$a||Aqq1YYYSSSVEՒ??QXXȢEXp![l 6vZ*++ٸq#[ ^ٳgadd, f7or!rrrA`LOOArr0%33ӧOs ]Ɵ韊CLi\r%TTTvZx^vc4BՒLzz:6MI.\?ŋfzzl¼y&I~~>.\`ppPX ƍ1Llذ*\.ɜ={cǎC  E8TjumIOO'%%,]JΝ˾}&366Fss3lٲ 022"I={6k֬9s CCC 1 ,ZH  qqq x_dff??h" B_.Of||K/ׯ'--MXr<裬\3g̘H8LGG^\BVV>| `0 Q~?餧c'55xjxD"㩩AHLL$..Pt233l"Njj*p!1, b񛑑AFF>11u:v$,f3;rX]2;ի B'%K099I__466rXj qz{{9v DAݣq{9n7o6@'|R|>ߝ;whnnz/_˱Z8G{{;/"zՊn'##իWSPP~"Ǐ}{bs[ovZv BJL3Dbb"fdLH&>OqqqFjkkiiih4bE4qQR1{lx≇l``W_} xb:;;1 ~>~?/^M6 -q+**RTG7AB`٘v_6n')) ͛7IJJoo?>iii[[25.v}PD%66Vlڴ>.|ף=%%~z{{|BK"bsDEt>ID".Rw}yxbffeeO`4g6^KqHmP(jT*Νʕ+ٷogCczzZjdVV`VZŖ-[())a׮]ܹs07ofڵKLMM wO(B %%LJJ qqqDs,bbbXx1۷o'SXXx~urrr+FFFc3300 Do߾Mww7dee'b13110VǏ388Hrr2Zgvy֭[ ,YBLL <sETyfٽ{7###lٲK裏FFF˗/ 655 .p lBNNΧoRxwт ;vСPS__O]]TRɪU|ܹW㏓{G0d``YfJ8}ayꩧ0Lر\.iiiٳ-ڸv5kG8˗/311A~~>fY[V344Dqq1nXRRRldddVYl/^LLLj*^/s200Z&>>%K+Wd``QfX <(}Ϝ9CCC>IEE\tL}Ql6 eF!//ٲe _߹sO]]I(bɒ%B!.^dΜ9_X| gϞeŊ188ܹsp$QXXH~~>H! )**ҥK’fry-ZիQ*|f6m$ JkY0$++RTTDMM zP(DAASSS…|>f͚BS]]Jbbb+W2880IIITTTp5QTTTpyRSSWWWd`` b^088ȟɟpU ,XT:;;$77Jfn`4IOOAh1̚5dqnݺŭ[PT|;!##:֮]K^^qbVyLjD"=zT6nHJJ 'Of3PRRBKK ͬ]e˖_ѣG ܸqM6QQQ gϞe]J|`'$;;jyꩧ(++\ڏ9rD q:dff~22222ヮl^P`Zz@/T*ND#E\"hK)tvF0'jb00"xtIC.@2ZVJ'N022~2xFiE_+Ż}OW XW wRzu0s0#Ǣ&{ŀ4]z(,^zI$l^3׬9-=SRݤ4/iGoBt==O}v~wY~_ݯkTtdHLW^a˖-_ӷwϱ9=!-=RD_# wc5ROs']sAUFFFF__ߌLevZB+AD(3gJQB?e0|\>@ 6Pu]tIBwmI7Ҧ)997He_>,7>~hv?A<5B?Sϸ6zCoۅ`-Ev",KRg>RW^Pk yrGY֋-G7oEEE3[_gݖu{|OBthtܷaY-iQ I~_b%ܶYݿHӎ~TE 5GT*E߻YΗ}OI'#Lqk I;ħ֠KfRP񐘘Blt ᾝr}sRte6III=GE7o k|?/>W AmdfUS=%hFo._&########A6,|n0==bQ[$%%' F!p8199I8ilV+~D||=LMME.σ`f3@& lApvphjjJfQ\.ȹ+mP("h055N&&&DTq~}LMMQ^^ BxޯEP*ϥ4=~_H9_񘘘(r}B!aJjj*Ed,4oӯD$Nbb=nҺT*9|4kMMM˿ H9spUoNKK vdp>K,bpQ~aΝ;Ƕmۘ$)) ?1""ʨᮧGy3U(:\o~õkDʰ{۷)//ٳ+dee!9s`jE`2طo\r2gϞ=:t 233Q*ܹ+VD8x uuu466RTTDSS'NX,0ܹst:qf9r"fܸq&F222g֭\t Zd>NϟRtb0:|fMJp8"_lB B"-VvA`'6#,ҡT*9y$CCCT*l" Ҭp y.]D  ''G䣖Ex ?ΪUh4 V222222222/|4k[hn@ii)Yb?ijj"Iww77nd2 |z HOOgxxH$BNNrssٲe ϟ܍T*ٴigtvvn:y455XV~rxioou^XHurss%66}{D"oaXzL&IHH@Յ'>>~F~-[ƣ>ʎ;hnnOOk88|' j+ 4 N4;w. hؽ{fx饗x)//V&&&HYYqqq\pH$‚ xPsRQQShnn&77O?ͻヒjepp͛7s9zzzz*k׮%66}l2.]ÇikkϿ.(JnݺŞ={HMMe…\x{n:;;z\. ټy4TGH$͛innd2122Byy9dddp5&''IOO'77k۶m^W^y??ʕ+dggs1VXVގ%;;!:::lڴ݌_+Μ9ŋ)..7$%%s/2>,8$9u}}}K/C@/>ֹU .QRRB{{;UUUeҥB!>.\`PQQ y&۶m#==]*)5nܸD"ej5z~B륤'N{'g466>vIJJ">>@ @ff&2GThuB&Bjj*---Lo4Cپ};GE.SRRBll,sss,,,m6v;444B[[ZJ%%%TUUvOz>2\v/r)!z8N^|E$ >(qm6f lڴ Á7d||z BdnGuu5,--m! O?V_~G @OOQQQx7'DD8F 9qqqh40Pp8Rra ǛjzrkhPTpԩ.^699o~nJEEh4/@ @oo/ ?aRRRdhh^' Q^^,^9VWW1L8Zh0<ӌryõk0TUUqIxذjh4Ν;%>>^y) __A*˕+WxǨ#)) J%Gd2\.Phj5w)*fxxV+h{ wdzLOOsy ~_xfEDDDDDDDD_l&>>R||'99qbbbؼy3={PUUJ qiV+N" ́شi'r8{,HRٛŖd8HJJbmmwy% p˗/ XXX&XZZ"77{;wT*ٿ?~wyA;F\\>`Y  1113g:u Z;$TΟ?/211!eggOYYYYY,//{ &'' 9KKK$&&t:IOOGTsN:;;j~ eeeB!J$''uVYXX`1??OJJ }®Au]]]nn7۷od2Lnn.GA.s-$ ǎF***`0Hmm-IIIpN'iiiH_].111sMvIAA7oޤm۶q5fffHF!66! SOʊy  6޽{1 A q:T* ijjBQ]]-̭|<>=55vxꩧ( yܹsx(++5#>EDDDDDDDDɗAl6eQ(z $ PD"xO#"cF8& "Jc"s}#^넄[,jԓ+A`ZwKOG<]"e66d2{}h4Tto͆vGi_dD'Ҷ!xp$&&nRTk$㟛+x\<[o٧ ՝;wy'58yΈ1z}Ys`PPg7&"g% H$e?VYYo'wsqwzЗlݷADjJ$n7rRyd+ yO5O:+++h4rt:'6 ߻;}g({!̏o+ښ#""""""""ǍD"jR=""t_>Jp6"?F" Cܿ)0(H~RRjD6м^WZDDDDDDDDD"N/ZJi'ߵ#jDrkFwߑ9M32&z$LpO |]뛈CD ?\.C XZZ󑖖F0daa5J%(J~?$''"Pdt:^ɄJ"99BlfOjj Ell6z=|>fP~lmmMNJJ * &VTǡKKKhK\\MBBu啕f3TT*fP($YVz\.n4 h4Z9::czzNUU=!&&K݃oH<\NJJ 2L牉h4F#rQ՘L&$ d2<hZ?U ^Oaa~?of۶mbbbD!ߏhDՒ@(l6 ym۱$''V5Tbku8jrHMMEPv_yh4k׮{|Dr!HJJ" r9 T*IIIhNT*,.. =w\\\FaaaU=ZEHMMXO>ZWW/: `XHMMtttSSS^̙3?yǸy&ЮVyWPPPL&Pf?t:)..EʍrΞ=K[[7o$++ ͋/HWWcnn>v_W eĺSQQjY]]ETj줩 ˸nӑH${kٳ>(((Z+Wȕ+Wزe ϟWYYJPftp8(Jpxq:y@xh4 ?T*Vj/իWill4oߦV:::@zz:###\x.$ qqqK jjd2XVnܸT*%//r% |HR<~Ác7V VRx ø\.v;>oDJy^~_4VˬEgFTTO7ޠK+>FGG)))_۴RTT$/|lڴI~wtvvR^^.l@Fp:6dWWWjKee%@L&h~x<0^{5t:ӌQYY۷ioo筷b,--!HP*FDZձF(z 999,.. ϮիtvvLII ---tvv+j^K܊0,FDDDDDD˔YL=%%E03gΐϣ>/̑#Gعs' ɉ'<$FrJJJ>l>QwޡcǎSSSRAJHR:;;)--˩… \.eeeMAAKaa!;vƍdffm6v< ڵ tuucپ};YYYcpIRRR|2 K.QRRBNN~^z%hmm111ܾ}^:;;q2۷o@kk+Jft:gΜ!!!Ǚ3gf~~"aC_ahh7n0::JKK v믿j%&&z6bbbHOOzKK >F(\/~ \.ccc o>mƥKx|jɓ9sݻw{nΝ;|GCʗ1?*6>SSSܹslڴ Lbǎ<o`XG1>>뮮^' ԀjP(lݺB!FEE8<Dr>T Nl \΋/E&qya?.Y3ԚBʕ+QZZRd``99|\C={y.\FS8fmm~"bccyfvijjP(*dggBTo|2`Fí[p>׍Jbvvn;FTT+++>}(a766Cjj*7oի\~ef3pR}K$Y^^KyyJIIa``\. BÇj͛y'hllbKKK +++H0>$$$Q!Bӡjx<>|;v<{B8ڵk=z'$''#J!66VWW1 t:hP*B V%66 !vc0(Btt v?ѶHISSǓ B!a7it:inn$aZOGGQ^^Ξ={! r-vڅLBDhoo^z%yGZ]VZF ᢑY^^d2zj(JhZ***x/۶mi4 ?OϳJGGRo>vڅZJJJz399Iff&pXXC144D8 0f4FGGVVVhիرK.aXHHHr DGGc1Lfz=:y҄s~011ngX,Μ9Cll,2L5YXX`yyYؘev;cZ|gAz=044LDDDDDDDDsBhhhjJƍ3ϐ qqqTTThؽ{77o&&&cǎ166G}ɓzO䠧300$O>`< PoLƹsp E~!+++DEE!Jϐd"??Vz{{l裏sNt:s&&&8~8\tP(,ٌ033x'Q*9sF.KII<=sss$%%+LJR6/ !77WtFrA+HOOGRSS###l68T*LdB&-[0F8hdvvd222]0. CMM ˴P\\̞={k.r9333ܺuXz)rrrp8466cl"䠫T* @nr9!H0ͬo}lWaa!eeervލ!;;[06oތd``r$&& ͝N'OBB~JESS {"V>LqȠ~rss͛ qrrrl6s)1ʹqAm&Ź>|!ۙ{j TVVk.>C(R*j#G H0L( $**͛7366=z\А|8p(<: INNtFll,[l[n111AUUjR)F.^'$11qڕ˗b֭Ba޽d2h4r)ʰX,pA***y2!&F^]y%/b*]$l2!!3<,#r_߇}|y}]nm1]bAѠh>wVVVhhh`~~p8O Oߗ_'X}޼h2 /3 aJJTXH8{oo/˄aٴi=-fuuUXi?mcϯ?g7^K>צZDDDDDDDD 333NVVVP(mxks½/NĀi??Owjϧn~QQQ$&&KYY'6.}";r;^~w}B_~^_ ;P(Bk?{Ƚo_c>1#ru }kK8}cDDDDDDDD>O>N0@ڗ~1on!O@?󙙙H$!a!2O7zN'kkkR$ OvBB†ү"55]YDDDDDDDDDl;K~00J }wx<Q8μK$h4h?~G4"!d?% --Y^/ ϧȿ HAi'FT*E*~fqkDM32qI]xmXl1?"""""""""—yLwrJE(bnnٌN#066V\.2??OLL N1fPittEN'џPq\gii NŒ#a 4`hVWW"gffٌZFP<*J𞮭1;;J" 2>>pF< *|Vqf3LVA%yvvDFn355%;NFFF0͸nZ-Fy*x~'U#*+++t:Rpr9 IX^^jOMMaۅcN'~t:T^SS.KMl63;;+́@ Pz}Mlӧ!''灅PՊJbii222>sAEt\v a655jC䤰VA {7kŭ[E*G!Jcvv͹sHHHplXm6SSS(q|Oϟ'++#R1=i~Ξ=|W!r}>]׬o%ϿkaXXX@TT*q:LNN ǁ@In7:?u{^&&&bXc;c?cv399I(B pϘdb~~^x73L&bbbd riJ""""_F3 ^`0ȦM}6Ofbby233ijj_]vy/ɉ'y&~!DBMMMtttp!j7|!(//Ar .ϵkjwvv~|2}}}tvvyfMZZYYY76mfZŋ PWW'x뭷%D"ٳkB]K.100g``P(h4innʕ+l۶+W088(LR tՊbv jxL&V@ L&jbZnLQQEl6pYowvvr-n߾"&&^xB]]EEE100JVV}}}ܼy^~;Y[[#//O(1].&I'yyy. NrP(lF^|E, lڴ/RWW&##cLJ~ȱcǐXVn7F#𱒤R gX^^fmm`0(ST\.%033EnxQv8 Fjd^F~+t"lH$lDGG/Lqq1jzülpulrO yf~DqCCCl6 P\&''prq\XVr9) tff_| )++tR?-[B0DVxfqeFFFX, /0>>NGGP! Zjy뭷hii@ @~~>fɄRDPM6baqqJ燐N(YQQ~+1gb6韰X,ܾ}2?OSSQt:taZhZgϞevvL~?vF#rT{Gaa!Jl|>aF6a"Ɠd* Eo.̥HEF8~!<zy~?p/_~efffbuu(^/>OYkY]]6gggY]]Ezan޼Igg'ׯ_E Jn3??T*EP`4lhZ~?X,R)UZ-6MX\_pلad2+++w yyWX\\!n߾Mii)W^͛fW^addHFF0۩ߧfwߥ_xo~}}}+GSS ;000`0RVVkFww7MMMιs6~1>>8EEE\r^x;wh'ٺu׾i#""""1_& RYYG}D~~></2Gaǎ^Ǐ388HWW`0==<999Lee%NFþ}6.7oرc>} ފ"b*J ؾ};z6oLll,۷NGuu5\zݻwSZZ b6qprd2dggSPP@JJ lڴ+WPQQA\\l6ڨ!66blB]]ر;w yfIMMeϞ=TTTPVVիW`0l/0>>Nmm-CCCb2X[[cxxD›o~!(hmmfvLMMquFFFX^^OzRR;w066FQQ߿^jjjزe qqΜ9OC, DGGs %%77:|MJ%V7n`0PWW mmm$$$0::Jff&Rp8L(fyy@ ^q\0::Juu5^9pT*&33 8pqvE?III77v)..࣏>BTrYz{{p8gffDVV7n ;;nhkkn222fΜ90_ưX,|>|MСC\xL!!))p8n`ONNoc4# ¸a4immx1½/))a9s 񴶶CWW +Wߏ'11/ZF"Ů] ccc{344DLL *( 9s CCCv, oYZZ⣏>jr5G$E0Nӧٳl6|BiضmCCCtwwrhmmg?ZvF#EEE:u>@ktvv_(:t;vpBkkk_ϟG.__3==2۷ݻwsyVWW+.\T*faa9z{{yꩧ͛vx9}4۶m>H$PYYyX"""""_/cf D"%ݺu+;‹5@}}=;wduu>!$s׮])N^{ 8$ݻw^N'/5 QQQ\~FömoS.g#`0dB(3gHJJBVc?xwYYY!h4#j===ڵ DB0ٳTWWpT=HIIcff^/lݺ\`0O.(655֭[ٽ{7׮]#T*ikk< B(===<W"˅|ʕ+\r!x w~܆?33?9]+ IVVկ8|~: ߏfLOOs lUUUp1Kss3n[P_M\.ĉHR:::FYYY?)%%%~P*7L&!ĉ)Քrqx<۷H~cc#lٲs5^/JOO0 :Q{{A&Coo/111,//Muu5|SSSͱ}v8p1118Ǜ>;wRZZ*\7SrZ-555TVVRQQ#Gزe dϞ=l޼i&Çioo>tt:jB) n޼ILL CThoogll NGmm-;w79}4(JVVV~:&h~ G?СC\vcPVVF8b@BRD O ۷!a}ѣB(D9{{{1HRBN6oLbb"< W^Vܹ^Oj80:^#x#i6QQQBL&CTpx^z=:`0 BXn т^'::P($ w8 Ǭj\.zȤp8L\\eee߿üy|zZB^YYGEQUUE||<,//S]]-xq@ \G >dff'/չӧOsM9"[,veZ͖-[/B͆br!J^!/`0᷿- ߿@ȃh4|>2~W_}^>L&W_}c0 ::|^wO9¯V/o\N("  0 F!N"pnbzz VWW}.J<\^x[X,a2팍}#}P]]SSS ~B8Bk#9f|| t::N۷Z\R(zHIIԩSTVV y&p8Ν;ܹs,,,|>}N' 211hduuP(l<%%%XV.\ݻihh`rrt~?Rǃf0/O:Ebb"V,!8<<,8199޽{9p撘ZF*2??@JJP^0:::&)) ʊpl&&&hoogmmhٱcx^PP(D8S0<$::͛7S^^hA^^裏RUU8ǎqqqϕD"attzzzGSPP>K0daaV쬠)+uuuTUUVH,// fzzz6Bd#\.[BzT$;m'mFRRIIIzGjj*˘L&<P *poպa/..LYYڮT*IMM%66GRUUᅬFA~Ar9 LLLT*EӡP(HII`0g8ݻ?d~~$\~wyC-d2BAA , ]\N۰E'&&bGضm z4fkdee$tww3??OYYz^H"77~PTTTHOOM6!fhhBhooxU*** ᘎڄH:;;qݔ fllbth T`j@/W*""""A:::pšRG*XHNNF#'&&r|2kkk:uJB.((m^➑8 QQQA~~>rȑ#Ԑ޽{Y[[ŋOCcc#xLvv6d2~:*'OP(8<KJJ mmmYRRcccK\.'33)*++IIIn|Vݐz0x!?33v!vZ-6mbqqTjIrrrVqH4*g}V0=]]]lٲ]vBCCqqq;vlPW0D*Ekk+Np8O>N`0y4z)**޽{ٳg111ܺub/uCzz:*L! 55DV S[FEEQQQdee щ c2!))۷311iii ∑P㱱1{rllx D.S^^NZZìPTTNcyyXϧ@nn.===DEEQVVF\\III)2Eӆ>zSSNS(n!++{)jjjpݴl6O`06 $$$0<<"oF,۷F#G!99>d2  {nv)h.TVVw^iiiAR㏓4Ӝ( bZ9uEEE8N8z(7oFHaa! ;;a, O>$EEEn:;;9|0[lAHnn.&;;.~?O>$f9qiiiܼyEv;d2@DDDD˄Kl6}مz_HxHHHJX, "Y, İ,,,RW_=4A&1L=:F/`XhmmDHMMeuu_<3w"ǶSf||dff,qqqر%"^_f}&..nÜvKKKA\?**dB?!qqqw=o8`05OkCzz:2{&|.R*%%@ВxPc<_vF#'HزeV-"ǎL&OOtV0{ZP}|73}ӃfB~~2erʗu B0>lpxX_y *fx8J?}6@ЧzQ۠A"A >H$ u[D}kםkwyPDDDDۋD"ʌ~%zD~nCbbW2ЗP߸m"s#!D䁆G^6LȷWZDDDDDDDDD"N"Nvs_\:w<{m<N$L$ ~<{p晈ȷ/}*Var9`0z~?LOOLLL QQQx<&&&n/%h42>>.⅍*na|>.Q3W(366F @ z|>ccc͡VQTBV+Qլ }DGG355f1Bqf3XnD`0BOO8bbb֫!u'e6^p0<O49,--122BkҒ=vٳttt Hd2!ɾZG}A}3<׮]W^yLCCzQΟ?+++B~n߾͎;d**IDAT= 1332 ӉJcuCkuuUs2X,bbb8w7nܠBԔt:1L8o3 ~_}6x>N @ӱJv;JV vVrssyٶmSSS~d2:oAOOkkkdeep8hjjb˖-^DDDD䏂/cfݣ[raA)2nǏSO؈&##C盓C0D.Y[[#**@ BqI^C*r)oX,y_+fffկ~GappP^XXR JLEP`0?n7?'NE0]t:yY[[C39x /P?!o٤ϳ-u ?fd$'',s?O## /`:͛7el6fJ{{;O=}դc'qebbbA HHHiCuii)zBNzkd3ѣ$''L&l6r8p[la||={`baa /LJJ F.\@VV2nݺB`ӦMQYYIii)z=ᅬbaqq^bY |s`aaAz?ϙݻwx"+oAvڵ3 /jؿ}vdvv;wOff&pQ`ǎL&q\9rN<*555ᅬ^R>rKK 8qP'}=ccc444PSS |{ڵkHRatGYY/"H$:;;YZZbmmz_X XYYºlD6~77tuu,lnnfffx~PTTDOOo6333\z-[ ddeeq%VVVp [k.y뭷p\A0ڵ ٳgcuuݻopJTTԧ:Dŋ1 l߾بR-Jl9s\x]ߦ T*eii~_K/"{crrrc;ƿӧP(ę3g((( T۷YZZرc^v |rijjj|p8Z駟fӦMdffϲ ۷sϡh$%%qIdJbb"UUUر:^/2-刺'|@ 餵LF(j{;rIr)RSS&Z-ZVS__OWW$&& ^dDmm-2 b޽LLLMMM \|P(D"appǎ;ؽ{c$~, :ugg'/_&77wC(jjj8z(p2'))^z >Cv`ΝRVVFMM QQQ)**6Bmmmǿ]vя~Dqq1j'OSO֭[pIEE%%%=zB!@fVWW\.%B;FT Q#wSJFپ};lڴjaMNNJd2<455QQQٟMgg'>,>,={ݻv.\ PPP@uu5:O~|cǎ!J|jJXcք5^^ijjbΝP^^ή]PTL&&''پ};kkkr$ }}}444O~8@kk+%%%?L?3&&&HOOK/a6ILL={j9r?<###nF#/_橧bmm ˑ#G^m,_|vY\\l6vСCzlBBBccc8188(4F y(5t:N8fyyFX,_so&޽v~~^8lV`0jl6c4]Hv]xyJx<_f022hduu l6F#^w sN07n^c׮]BNc[[[^^/pp\B **J( o~BB D"ATEcc# J\.`0PUUũSxsgg'ټy3ٌJĉ~<#@nn.MMM455 ccc|>!$s=kkkt:ceeQdvvc6##VpV%##:ݻH$Ę[ZZbeel ?~\PaN("::Cq |>R{y jp8cuuUjZOtt4FQT d=eDEEЀh$;;O||m4IIIa||IY]]ehhA %%%>|NǶmB` ֒5rss֭[H$ W\tnSKK Y^^66hoogxxx466C\\y'Hz477g._L  -- Krr2SSSLLLt:IVWWl 1>>NBBڵv܉B0Fd2ifffc~hhf *WF!>>F(((" 344林TkĐojj"++D //`0`p044<011j3::ry(--%33SDz000Faii;iiidff@AA^p8LTT6 FAWADDDDDg栏 qqqh4P*</[joΖ-[HKKQ__\.ɓ糺J__;v<sM&---Fp^^=Ere2mmmɄa_R$qcnn.F|>YYY߿RSSٳgPZ9y$:>d2deea4,--؈^'@.su #JY\\$999!o1** F#UUU$&& tLd";;VA/ CTT$$$Eff&l۶Mu8>|hrrrtXV(**bӦMnf3j277GJJ {^>22"SQSSC jO\\裏R\\^WֲE$.388Hbb"SSSa4t!r FIKK46mDkk+sssڵaDR8+++DѠV)//gnn5Ad2N||0DsCIII!)..&%%8!!p80o&&&'Ot:y&SN /❞EJJJ6H"Jq8ܹS(Iiوݻw#JiooGR{nA299^pIָ}6}{B{aa! P((.. ՊZ&??{x'@VSWWǖ-[P(HRErIz{{q8`0P*o>JKKr )))Y8fqqm۶a0#rrr| ,--Mii)wnCrr2[nPTfj5=V222xDž J%$$$PYYIYYd2JKKp)q4 7n`֭ƣ'n3 ]pj5TWW BnO^^{AڊT*e݂Pi\\III|>L&>(477t:yIOO6^ X,atzz`0`ӦMdddJVVKU*唖}o+9M=B'’g333 B J:DWYTJLLC{ߥRiD LttH$DGGf?"{_5ᾉئ_N0~SoOи\.^/.>3"7> |]h'뺟a\.RЈnhDP.r """"""""" ntQ̽nC!KKKh4?~߯wD@C#w qy_!"""""""""~Nr7xgy3/ƽ_8FkE>kς8/pq->|2n6mbjj d2a0P(8NHLLb4*h&&& j^=J\\z5)r*LMM -#~j' axx\<<΢ 2??OBBq zfRfIV+144$oQQQ)311'j,..~Hdj%bccLNN 111,//ݍ+1??O||<~^9 E\.ߨnA*>e֫f 5Ocaa^a^O0AfffPTv?<,..9۠m2@[oERRqqq~N>Mrr'%{_&j$ 177wm0dxxX>[h0. !˅7Fww7~_eqq8d2cccUn$ɷf|4GFFx饗TVVrM^fc``"Ǚ孷b߾}t:^u^xx jkk%11fggy 444yf }aawyn:!brjkk1L\tdR)>8pDkk+333ձuVz{{OjjPؼy36_~bccQ(444ŋ^yOذt088EӱF{쬠0227`pp,, FÁ`P* /㡮V+ZH0d~~E|Ml6w^昘>|Xehhٌ^v300*sssL&cuu^x`0͛7IKK v܉hd||z*++YYYattTJtt4:tuuEVVֆxƻKNN/IHH@V322Boo/sss(JZZZ(//6Ozjj*l6L&eeetwwS\\4۶mc``@0villg\pcǎ ihh`mmC} x7jh4>蠣zN'J,yW1Ltvv"9{,SSScXP^^NCC}}}LNNb… 呒"ŭ[Fbz{{oDB[[Z6j Dw6TZ^{ "k@ש'## .ĕ+WX^^nvIOO Zf۷oViiia``F)//'..QN<۷q\8pjf`D299)((ܹs !Jj¦B JE}}=A/k׮Aӧztttp!&'',.\~3 ޽{ ?$;;v.\nܹsa_NVVt:oKbb"7o$;;&Z>>}j}QΟ?OVVi X\\mmmf__ kGaΝ\pA7pu0###00<<}y& ~pyj5SSS_5 5EDDDDDDo&^p8L(]vt:IOOp`6ٳgxW" $AΞ=KRR۷o6jK$xꩧJh4PUUūoo>c?__x7\?ǻKyy9eeeal?~ 555ϲyfNF^'Ɖ'0 |>VWW$>>rihh'''"T*axp\!JY]]211*P5T*JR(cVXX?OBB^n bjkkaǎrʹ ~)r9b̐m(**͛~pw7,*PJN8nr `Xaz{{9y$?8¦ PT08N:::hmm%z!**G~ʜeqq1O8\."JJ( IGJJ%~AOYg+++1?? ݻ^IHH`ddEee%kkk0==333,//cXp\(Jؿ?TTTޠx^Y\\h4~ν+466RUUE  9FDGGښ<==n'##X,, B*w2BVՊAR0in7˗y7زeJBBYYY8NY\\dffdzpXxIRa3% (BgTT2۷oD^^@L Gee%O</nnn׿5DEEaP*ٳGPq\EEESWWGVVvn!dM@ @[[Cerrc8Fղw^n7ر& )))TH?M^^8p@H$P*F)(( ..j;\.TȼB2 L&̽JJJغu+  HNN&==tN8-["))#GP]]NJ11RPմ300@8FR )vVHMMennn|aiiZl6)))444pQFGGln:::>RDBII ܸql4 RXERF{{;BL[[>dvEnn.yyyBKKK,--qMdn޼Iss3SWWa"DJ%8d x^hmmeyy86<tvvR__Oll,iOcc#XVjkkYZZb˖-hZ"y&TTT033zTWW#Jcxx*233ihh\6mDoo/ׯ_GTRQQPTT}3C'&&A&VhN:Ett4vQl޼͛7޽{Y\\hNz)"qKKKR\a d0h4J%"999 ޽m۶ݻ ôv1FTbZdyyRn?T*(0))),,,P(X^^&99J(rRHKKf @&''a۶md xQQQHJJB׳HHHZv89r8233¥#!`q:FRRR{w?Y>33 رcav={HNNd=JQQFP(ēO>I0x  q1 wuup8ΊGrSz="))vAYYL&'4. ::NGYYP(ā0͘fIJJ"99yd z=( !err\1LuV*++QTUU8199%++~ jǏ?4eׇd2RRRHHH 55VVV0 >|BDGGǣ>ja@tt4>|4VWW/Qd#J0ILL$!!FII (JJ%N|6mĦMfQQQAff&B!1ݻwSXXFcǎQZZL7BVWWX,yfq: III}U>oJ$ BT*?Q*U_."_yyy'NDDDDDDAĦA_^^f /d\.Aa0:h׋ԅf$ ~ɽ\geeEG~P>aGSh4BTTP/Qbcc455188,zyWWHRD*b0ZN6vZZZp\$%%}W3S\ 쉉x<:;;A]]]hK{{P!Bz>E) QQQtww399)l M0$..X^^&11enݺ(fDܷHmOc||1222xm#{Wq7ʹ QQQ ՅD"!66Dkk+`zzD|>mmmjȋ qw\0==իW)))70;;+x<k744 ~A|>U/]k‚y ?8NZ$%%}b>F@ @cc#{}'vWbb{%vEl%Yٱ7wN|yN&]f2+]|9Dzl%Q"% E`>>L")gCbO9?NRRGavv|XA͛cyr8vܸq v]tC|2Fb倉 n޼I jM{{;VFCss3"8ꢭM|gggqP晈F߿.f}{TTTP(1Dw%%%c%ֱ sssB!q- 477 qhh[n1==dbddVK0Ųbupd&''$-- G}}=Fz=,--aXKqB$d2QWWG[[}}}c23::lFVB8l6ߏB@KK AVg ü~-'яjc488HccăY>88oM$a՜;wk׮ ijj4`ǎ z-~_{gh$99P(sqZ]]V]!'6uڵSu2kuuu|>N>-*N8[عs'.6fff8<ׯ}p8.]Xf wyG,T*u~cǎQYY)*8@__XYnܸۑ444abbYZZ"++)zzzr ;wdxx>LII +=00 333D":::HJJB.vFFF}}}QV+?%''$:;;b|Ã\@bddVFFF0ͼkpq y7P*֢蠮I… lٲBГʕ+jb^iiiW999h4L&322\.X,lrB,d22lņ6q홙r2/^{{Y._r1Ғ{"++KE><<^EINNFTE?fp8Lww7fկy#Q(D" ./222BQQ|[l䰸H]]= F,--믿Nvv6vfffhoohZf3~!lٲ ^}Uiii477[oQRR`jj ϑ#GtTTTE__f.CZ-Ǐ'P __Ů]xWٿ?7o`ӧ)//9<{a߾}zx"ɜ={VϷoիT*y7;/RRR__s-n*)))ܾ}[Tfdd(񰴴DWWfRIGGCCCL&Q!PZJПHL&cjjg( .\@yy9SSSt:&''D"[o$դ|kTUU}vѥqhh"֭[ܹ .qFN'7o$STT癞&%%N>A"++>^{5A`ǎ477dhhk"Bv"^~en7MMM+b F(( /[DAk_KKKٺu+ l6vd2QRR7ˉF'?qHNN|FGGq\|tjkk??/뙜dtt^D"aN<8Z.=}?֮]˺uk9+J8o_o|8N.\VB{d2q9so}[_WW$kjj"//n\.fQ֬Yٳg}>rsst{??uVNJk^|*=Jee%x^0q2ÌhkkppIF B~N˗/ݿl>^yQ}8uX@^ydaaAkc\.nG?vx<.z4,--?dÆ tvvL&cxx͛7Zn:?N^^,,,p8t/"n۷oUVHII>?uvffw6o޼bL$$$$$$6VY޾;bX,Fmm-[lrV+LNNDEE{x<Q`<[E">Cذa}=66Ç7!Zg>x :(G?b۶m߿׋wa+3?sP:tH6A(--[f)صkvZ xZͮ]xgZKT*n߾Mgg'HE1b޽TmH+X,޽JFFFFhZشi3Vy'׿puֱqFXf yyybZZ/2%%%Z:::Jmm-b1 TUUuVl6ŔRZZJaa!* AP(T*(6l`xxq|Irrr(//gݺue Rrss5y''q)yꩧWBRRv??g޽wT867nf_իWЀf ϡ***/‚(d2yIȎ;xHwJKK^zg}Dş`7AAAXҲ2HKK#h>v$zF,7^7_Ѱzjz-Ő-J%Z& y}69NXIg$AVwJ%^gYzwHªĹ}"xg-[K/1::͛7)//_&''Qa p}_^^$P( ٵk'NnbnJHHHHH< >Q@AHKKcf6oLjj*]]]B!q#TYY) .u h4RVV8N" suallܸW_}: XZZ" (Ì Vchh^)++#.KFW&==@ @SSCCCLLLfAbbb~?oaiiGR^^7opc pLl6T*hH]YYYtvvR[[7' [nx((( Rx< QZZjg}ӟB0h4***âR"Q3QVVŋ9wq55$bqn(>v nJKkldz\N<'==\xg= wM sؐk4ђ(Q+\``pp%rfB(++#%%bկjB!&''`bbB0q:9sׯSQQACCv$g݁eqqt:0 ZdffE{{;>K&*鑑&''BӃZF088("uuuQYYt:ٰa)))TUUyfJ%NqLhhh%*a٨Kee%:tE8YYY2 8LLLxظq#>}WH8&<nP[[ٶmO>$.]ի\pNF#?w޹'_4<6m"PUUɓLLLf"TUUQSSlP[[ѣGٸq#JrźP]]$'NСC,,,PUUE$!??IKK~7np<xJR|7%,Z[[%99&&&hiiarrNAAٳ?>><\.N:%8w{r1::bpp&!!!!!Q0 XV ^@ӱHaa!hZ*++ 6PPP l~+_8^"]]]dggw^d2f ߏh󑖖F @Duu5b1bTWW#vk4 p8HIIl6YUU~˅e޽8N'Az=ՔR|رP( 鏤Gh8BA4E.n:Z-<lڴLDsqq1F? tttyDKr"=&%%/H*{S}^,,,`4QTXV:lq:L& n'==dV+N@EEh]R(呒BVV('tdff1.S}4Ľ,AO4͘L&455t:dggcZ1b`Zٴi 099f#33FZZFUVQ]]Muu5t:#'''|y|IBdeep8l$%%%^7)) J^^,//)Xj۶m#77y k׮f=;&//JBXVF#UUUFسgtttB[vv6JV˚5kP* SSSl6RRRB&} Avv6Y 6B_nn.@q222p:RXXH?l۶B&''|呑ݻ UP*n󠰰PjN'V\ <. NO?"<<dgg  l6JJJXn>IXe2b֬Yhd2QZZJEE###B!^|EdggᠲkFݻw5l6SXX K/h$''XjS]]㤦+Zw$99ƍEs=GYYxKUUWQb,Y婧"33E^x%z=mĠnXD&1;;K0- oƧv9q}qOMM=:蓓7 99{jKKD2M'L"bpםFvc;*9чIz=wAh7kv^݂@DчopbnGJ.[7|JHHHHHHHH )(`oq:qeS0'n 8Gϱor󀝰<,qkOⳏkx6c/ھ+gˏh\|ZW77?'g.zb![j*x.$>>n&߃O^G~ݚcϲJHHHHHHHH|2Qx]JN:-("I~| %+ JE8fdO `*-8v;yt2!+ RɵB ߽q<ъYF~r2~?MSSZ68L/.85Qfmz:FfqT Vn32:M4OM![(t;7GÁ`gn9l6VDq X^fd Pie2113Cvr2xC!DZtlD! <5tΙtbKNƦS7:z0|ÿoF$gg?a ͬNK#Q?1B(*l޹94JKc> rYۓL+&~ ~TpMz(rfB0 m6Rt:I7P*rVp{rײyXB&hh 6dfLb \Y0%d.,OUeG^kN 4ffd2?\+*H5~g+>99{7y kNgg;/T] @s@@< ;?/ߌzĖ=x|.ؓ((H3MOS32"婩(d2:ff GG*$k5nc*=D\Xpc6*- _ew63YY|QN e2 lYAѰ /9B\xIwKJ,RRHK#E~|`4EäѐJw VG۷cX 1TlȠj%bamz:&3KKrVߍLKìl!ba> IJKfy9WUA`Sf&>S~?f=lk bw2fxXp;LFAZM&X 8̄O$m.]ss4LLɷXsB'DT2V(XDP+dݜXEdJ\w= pEwr FåaL̇xA&~~?`٥%^&~:ff(Xz gp-.޹'8̭IYDЫT\c'_f{TX5lZ->&8 @8qj o(DzR5w-&n7WFF蛟GP9wG Fr׊d b$ߝG@Bb$2X gQ S&29v]őkqKCCB!:\w~,$ CC,+/su\X sv`~x=cjIVYDzx蜝eegnig |m"J%zzE(d2|QN7 w @4m.m.n Z<!wt$$$$$$$$$>X,A77{(BP[?@vL&vnc#҂(v~e>_Gˮݧ4[DD |G˓-G%sFmϯ+56^?ﬨ| XpaLIy GģQw?2@R\l2ڽL2OH BYJ2V>|G5o%$$$$$$$$ d}>RqcOiA7T?_ZZbii gvvN#ۙEף-O򵴴":SSSXVԏ޻ LNNp8@cqq@ o_FFF|,CD-%'! &bC<JFBBBBBBBBBpO%(vAΜ9Z&%%@ @MM ---D8unݢtt:SSS\t\d2oߦRZҥKINNH^O(իb>Uxii JZ^/s<|>._LSS:BKK /_jܱ~;wJ0رc477ŰX,\~7oDZKr{{;gΜ ͆Jի @}}=ׯ_' /^d||4'Na233ihhP(nG.VT7 !--q`00::ŋfhhhhX,& &==p8ŋą  )) :Ec`aaxI]]2IJ=77o?tbZW[ww76M?Hh4^' rZ[[IMMcFf} π%WF,ܾ}7npW 77ĩSFD"}^{5СC;~8hg{{n޼f߾}?$AcX8z( q&&&8~8xb2W_}G(ҥKtuuw\/^??322ddd`,--oX"8p5FF :tK8̻KWW^ĭ[8~8FBB/^OA344tO9WrY<c+x<33ӧE%PKK 344Drr2XW_}rc B&F%F[[/.]"7nԩS011AWW>Fb/Ν9y&&&Lcc#ǎ#믳oYBBBBBBBBzII ׯ-x3338VZEcc#`jJ%7nnsuL&%%%+Wp\tww388HFF=TZy'xL \.gϞ=lٲBncj5 t:y(..FTP(ذa}uww3;;ˆ F͛twwc6ygFR&l6n7uuu\. w&%%x<^穧bÆ hZJ%֭㩧bP(0ͬ_h4ʞ={0dff!Z/.\СCn>CF_}UxאrJ%Fd=Jkk+߿q]VZų>nGTb2PՌVIJJb011A0DSO=ų>Koo/vJCVd2͜}._͛7y7Y\\ڿo㡶k׮r?o>0׮]cll шbA,B@ՒF[[uuua顽 ^z% ӏ%$$$$$$$$jw^<~(F"nܸmۘȑ# 188H,cƍ|ٳ|>x"wWMqY%Oee%֭?_~N:ſWJve22x<΁D"Mvv6^z%;fzzw}^x =AFFǏ_q=n~m|IF>|Rɳ> bpp 6`?PYY6 @jj*O=k.BrYz5O?46xv˨ \pYo255E("%%L8X, ܊8477sMf#??FYv-Ν۷m6hoo_+vimmv#lذA (..&j픗!'* IJJB8X DFF崵1==pg~Z,ؾ}NI-5tFMM O>$*sY$$$$$$$$$||>99IKK c0CӱcRSSikkC.SRRZf޽T*Bp'xY]Fzz:?jx<=]z58pBÃ"@CC:Yy&===tvv+Z}6333ڵ N0+WP[[+~+x~_Noo/\t~233ϭ[ooBRvy9x 6MoܸAnn.vÉ'8wdB!ZV&?S\\Lcc#'Odvv\B@&yyy S{{;k֬!99}cǎQYYI??1LLOON9{,\p隣FAwK֭[GKK x,4 999pX,YLUU>,yyybU*V7/&ܺu+j@ @FFOI0F^E˓O>ի)((vSZZʖ-[(((@T^ J%YYYr1I\.x\Sh2PTt:q?oĜSSSdffc MMMرfggD"ٳgZEr9NΝ;)..FRQPP@FF/A@&aZq:3Vٴivٺu+III,,,p8ıx'h4K8Jd2fgg TTT<қf|:nÇ377Guu5{yܷAs<qi1Qa^^vTnW^LFZZ{gѐHu%$$$$$$$~HAPբ0}E ٍ',`qݢEˆL&c~~V@b`RŸA0wvve& 0;;fg| @ b؉RD X,3뒄22L 4~'bL&#  X\\P($&X]' Hxc}b.og%𙏏b,-- G7xK!cy$Vo4z+!!!eraT*ܾ}(Gƍ^gttӧOqׯ_( z=gϞ\nX}jjG2;;K^^ާjP"Zƍ\xY233ȑ#͑ٳ444hlܺu3gΐl9rT8po/_ڵkD"ѣGnV9wo&??Z._NnΜ90\.>C루RIKK MMM"vRCCCdff>p&J9=WW NTZ-׮]ʕ+a?O>AN>Mkk+aN>۷Qբ3}yGz~$m]XXd2lj'ǚxhkktD0$%%s$ZZZ0L,~aʺ{]]],..b0z*k);}=88ȯ~+Z-Ofvv!^hqq݁;BPMM gΜ)&p!n޼:y&&&t:tP(DFF Ι3gSWWǥKp: .]ą C&3G#555\v NGJJ 8qCFF؎ax FZ#( XV^/MMM| >|{*|>Ƞ}䪭Dr 555A222ȑ#@zz:p?~8xTFGG9udff!r!SN1==->'N -- D?OTlii!??;"++N:E__6 brU^J("==]3#!,Y?Q@x<\xH$ի9z(är96l؀`@Μ9Þ={P(WGe˖-h4tttsO ˬ aZ9s NKK ܹ׋CTr!6n܈ȼ<8N7d͚5~Μ9ÓO>Ivv6 ˅l/#G  8Ge֭T*DZZ>|I,C܌墪 <Ӹn~ݻQTb 7nܠAh4T*FX,.]Dgg'. 's ::: OSRSS1\vvl6cq_.ONNP({ǦMc߾}s-_8---TUU Nbǎ(zgg'ׯ_)*W62kSSS\rGss3o&jL&SSS444F$ƍRSS Bl^oo//^v322"/2<<`zzׯ388Ⱦ}%++KTnIa^WW0$%%zc||>NX֭[4773>><7n %%Rɵkhjjl6 z*###X,hi r^}UL&~;244ŋ%==#GzjΞ=KFFsss׳gFGGvX oMrr2UUUŋikkKs>|'x<ڵkBFF ey'==QP\\,n,V+.\ 55|jjjhll$99v._Lyy9G7x]FRRXchh333nLFKK ]]] F4ʕ+'"v]ׯs-F#2+Wۋp4 `PLrz~?>Jmm-믓Vh42;;Yy& '*v;tvv`Z;SKK z"D}}=ZRשȈXVq8 >F#FӧOrpeee={.B|jq)//x466ruJ%2Vf߼y>|>vRRR L555fjkkP'K$X,\pJᠱ&vsssT*>YZZӘL&`qi^u?'//Áfcqqx<)**_VOqq1Ǐgդd7npIb۷osx7wl6j1 sZ-8N9B__^wy类;cL&d hZ}gg'~$صk{ahhZ^պ")L&czzhs>L&G}VIOOn%nϟ?O[[^gh49Bss3o6zGʻK<_!B!}طvLAbցΞ=KNN)))dff>-a|>h>&Μ9Cff&6MD:<333[|8qBF۷.:v~z-z->&&&f޽<0^{X,b!==tl6X,222v$%%ﮰܜ?Y?8r9z=ܼyzfffx1\.b׋Fx<ƍ2''.OZPIDATb1ۇBQXX ޽{)))0ͤٳg .044ā sU;F__zV+~jjjV˛oɜ={n޼ɛo[ośo͛7L&'N}P(p:Mkk+===\t۷o??h8vͼ[hZN, sssl6jjjp\tvvڊfc׮]bZV1\~]Xy7b#>'۷N'>K-.]"[ohhooڵk\~ >7@pY^=3;;KUU[n`0?[ll61+t*l֬Y#\.(hT*hhhrq CjddDOOCAqT*v%*~ C&}jO_>,`'OZP(DCC۶mcvvGD__d26op%<%%%ٟ:ه!~~uֱf͚vR[[ϟ{hN|'qA~?__={8>_E'gy˿ӧO=;OSXXH8F lܸNQ6qv;O>$eeeuV1U.322BEE۷of!_OGGE ogg'sssB!4cKx7~o266F,7DLOOjrT* DQq?#Šӄ`jٹs' PZZݻIIIC4֬YCFFiii抛^͛ټy3l۶ NGWWâŰlڴIPܹMmmh-cll.ZH_FaܹO,c͚5ݎL&C233ٹs'EEETTTi&hkkcnnEt:hJJKK18N'餥VdDQ"r2^FFFvdggIFFhexxt:Ο?7nd˖-L&RSSя~=hooGP{nV^-(KJJ?#&qX,ۙXn?A0 bh4B!**I0b 6$CCClٲkגfPԀRVVΝ;Y\\SXX|>q:O)**bvfgga͚5dffF~~>* Atlڴ-[m0tww344ZVo޼y2NTϱcؾ};7nljjbrr~Btuu}vtDGVKee%k֬a~~nj5DQq 4 ֭֭[b_=p`rrMRRZ2._,ZXnIIILLL E͛qݢ7^pakOծݎB`aawy 6l Ʌ w+&M'AN42<;@<_qOGGGuhPTT*ٳg66T*EEEt:B@.m68{,p>Gsy_Ngg'j)Occ#H)|>W\fzzz\.gbb`0H{{;rWJAArR'O> nۍիtuuѣG$??X,FMM ===\~Yo!z>|NpGc^PPb!--^zIt_rBB) eeeܺu#G0;;+M&O0$;;\^ƍE+|Ԝ:u^{ ^O?jB"X RFjsI:իwѣdA@Tr9:;;iCCr…j]OOb L&~?7n "P($2S^^.zj$o?:"X 02jkkinnFӉs -zgyE;JII~qcP() 6oLJJ 67hV]c007Nqq1ʕ+lذK.Q^^NAA/_~s9q?^~1 D"jkk9vcccQZZJ}}=׮]cqqiN:ř3g0b08s {kDot1tttP[[% ֭[شiv& i6 J% f_WzmF0cXCU*UUU={SN155Vχ\.}rMؾ};Ӝ={t\.@ {f"oQaa!],?񏙞z^7n޼M6EQQ}p88s |8~_ 3}8z( `ꢭׯ333Cmm-ŋt:1l6Avv6֭[_:qmmm%V7XYfv,&/|`׀Yt:zz"X.6ѭP(ZJLb7<SQQ *{{{N"''QV}).--1==MNNccc=/D055@8FբjPQ1kWW:2\.(JYOxuuuQTTȈ h4Z ,55U@z=x^h4dff{DQQb,q]%--a {{6 ###l6vN<44,'Ogs xA, twwF)++o>bannN k=3JJJRTTtw tww322\.''',|fRdڵ,..ގ SPP L&#-- Eww7ۻ?}d||~rssΦ!r9W&/*t: !zeee/G&ȑX,444 İNMB2>>lFׯb1<pպ8󪃞'Iv9tn 6}}ra\@$tH&&WzO ώT]El^x(ÇSXXHEEx׋dzWo}]Cᳰ{wzYJHHH|H^WLT*ŤV@_XX5L&fX,U8&h=٣"D2_nAD/'&s-qi9RRRI D\>q!h4RωDuP(筄į#Q WF\I"q_Ib1i%$$$Yv:::xw|<<3++w$DBH ?Nd2A7Z=qMIl.y DQcKHޓH(X Ïݿ$ʬ=y+! ? eėi%$$~HZf Hiv؁Zfii# Z^QQpqM1&ʗ'<䏒%JCDX,=(\%. wެ`PLX~zB'P;ɲy |}_Z~N4 |BO57tpg^]8G|9IHHHHHHHK‹a=~QI;!l}w|& SWB$!?tAyaa@ !FדHb)rJ}8N1}vvCd2B?semaaa;/0픔{HHHHHHHn>Ag2ߓ$n~~V+]H$c_' Q(_8}?urQ\auyM>hhsȣ_7/y#!!!!!!D"v€=BThVfj_$Xٽ唖"X[\RPRU !attLNN2115kDA]TV+B&T~҅zzzx7xg(..7t/>JHHHHHHHHHHH|2ֽ^/H׋޷z<gnnM<rI@9q\bB"3W@b1| ˅uN@,CTOk.Q>]P}v(Xl _$$$$$$$$$$$$$~׉㤧p8Vě/OOu_}aaAΝ;̙H*͛ӫWn kzYF|*X[н{w<9F CASY6u3[$ѶmN}Sj"]u݄NNs8wr._4ڇ~eo!˲)Tt (iεһVe'z<)QAo0ݾ<$Kg"QV{[+F;VX  yTikU 7=/O7% r%ƍ54jԨ*#UxݴW+C dYYfXYYus2FC\x'NвeK6mzoٲZ P2 IMM%$)hOOO8}4mڴ%55j*v'ֳώ;Eӧ_G&MMƚ]Jt"NLJ#I_}MiK6mxh۶-k׮A2wԩ<a0ͭv,@VFd^4 z*jZXY;wѱNa0Tŋ8u#F< Κ5 4mZ/?jřP1bV **ƍݸr2JHHj]PKZ;Ko9SS?F)++S[n?$;;FѮ];FZݻIH895e˖;''[jYlNm6d 70nǟɓ'OOOFxUV7yC3߯pԩoa4gʕ<<==yg$ gggXz5-ZcoPs< ݲQFoUUWd=;TPpRuE|aÆ3ǎgFD=fru˧~J.aL'N2~WZǏgȧ$++윉'ÇgժU4nQ{wcCx3<ó>#7K.S򄇇mV5 |Ę1cٹs'&LWe^X9^oP# %˗/ 0U8h42}ju8;;sA@~yfY>[Fhh(uռ%#M#OFvSy<99~JY $I6 ^O~~5ݝlm$W(*Faa!h4zȲFc"29ammNڵb++T,>+|}}Ԫ"quuAVW{[e6o;M=ڻ.Y5M*\dHq]8:#IyyŴƭe\v^b^^M)))ggJ/,T*wƯxsUdqGsʹhтd<<)J={NF^ A4i Eփۨ4t `R'ARѮ];>LiiI/-7DU>nee% Ԁ ڵѣS1 2WWWطo_]7% 666bJn&A,ά#I| ,x8UxA8xA8xA8xA8xA8xA8xA8xA8xA8xA8xA8xA8xA8xA8xA8xA8xA8xA8 ?~iԨ[G-x*PXXHXXX߿FzP~ 44Ԣusz=4o.zN_^x4Msssk*AZ <.\P~0a|GU !6ԲW>* +++u !!!ҥKV\tknVKhh(k׮m۶Ѻuk[,YBjo*i∏ݼ#K,[nҶm[MFYYYIEO.wԉӧӸqcvATTmڴcǎ]}o>\]]ʪpx_0k,VZEΝ9}4o;wusQ%~?%wՌWߟthڴ)/bIEϨQٹs';vΎRRR֭xzz*eYw%11Vkk.o4m:w䫬dI>sV7n?ÇӿdY65D_d9rM /(ywYjY> :ug}g}|KZrssb„ :tx e!XŅ-Zʖ-[w j5...XYY7|Ì3O8y$۶m[[[<<<$IX[h/+**BӮ];T*Y{~`s<Æ c7774hҥKL4sakkKhh( .,WNHHT*2Rlܸ777"##-f|}}yxpssŅ|, BC#M#OiAM߿FynjvR[sl`֬Y8;;uzD@V V/EA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,dzo߾j Ln8]KǏuu݌;V/vA~0i3ȲhT駟^BAxn D,R(K.eɒ%g,^H+<#tЁZn]2>>@ڴiÞ={9s&}W^0tPz=~-?֭_~\]vsNtC,r>}.EW5\ĉ899K+2Ofذa;ovq/Tgs2:t(ޤ~zFMPPL'O? **D>#LDD+WdΝraZnTODDzJ`0k?xW_Ec0z˗SZZIIIo3rǣ6U[z#%%[[[z=>|thժh4yG5k$={vZXv-={g*9Po΅ ػw/6m/O?eȐ! 0@I ,3g(((@e233hӦR~pp0={Y %%ɓ;v,7o׬S7˰aڵkΞ= @PPȲL+<v=\OLL 7o&77,KeSrYVX+/$00PI}8ASz9}ժU\z/// Ƃ (wz0 n ѣGuǎ3ִiS1 ̛7"##䣏>͛vwޝuֱ|r>vZiZ%dddܶ0g֮];k֬ t8v6lk׮>}%Kշo_Z-[l!::Z =$U%{<**-ZiӦ?~2 /{[Se&L@tt4k׮^w} /ӧGѣ 2Iٳ' UxU:bθq ?OʹZ$I~N>mv̘1ѺukìM2| BBB*ŋceeU{)XZaa!{彺y?SN^^w怜>}oCvZuƮ]޽; MY۷gϞȲL޽u>Vщ>7cմiӆM6e^xjsʯI&1dΝ;oMaa!:t0K׾}{XhsA/+y|7xxxW_ϣ>Ͻ4j///U>͚5LJ-ZY4yr k+SOL >;U? ~r6E떦 q2 lquGK4Lw߂Xabmz-hG׎m@՟H?5Q~% LXx5OEʧ[ $O(R E؎0:]6i'+uM^GXh ];GkquV Ԇx[|ƥ?6MqRt%%8;d480.VW>Y9kƥ?C>:}^MRi{EŇɿmacき'~r9w#gl믿ΡC:u* 6 0MC~&>>۷FݝHΝ;%2-"$$ggg7o΢E;vgϞ4 ,mkDHH{QEtt4NNNvZ CV3``z*Сh4d[_E#rSh(Y֑s+\ ,d.f}JSqikxy¥%E. w0=-/!+*:w\:t̙3IOOWf$˗/ѣeĉB*gV~VTۛYVSPP@fffP?9.-}886VXt'pt0ѹ8Gԋ+yߙҲs\Dhfũ? /F. [&jJwH5΍n?}He3;:;ȑ#8p qqq8::Jvw8kZ*NovfgyȲLzzz&|}})))!//WWӕ>q~kxNy .{%vd_Z ՂIm~Ŭ%8ط9l}F$k]\,7s6¢dJJO璛SiF.{yy)ҦM̛7lĉe޽F'LU ^Ojj*wﮨ*y?~җ~qXh|^sJY6p1k)^MQ;fm5Y9kسߓ_4\?]PC_UoWkbbbشiu-btޝ^"&&{Ny IDAT-;v$11 內'ƍʕ+GHHzٙHT5zjRRRԩC _~w\Pz&q(FSNw\x ܰu9ݸ"B%>A8xA8xA8xA8xA8xA8xA8xA#s wɳ wMxA8xA8xA8xA8xA8xA:~kA48\ W@RM9^A$1M=U=f89u3r)$GWAX=:M   r$fi bΥZ\UX=Cf  V羒6*(+FF?Ntt4ѵs@| wcXuo`5w-øg!yc<#y"5khTݟV.WWTa~)#P=0 sNciΨ>ocB_~1ɥ _jeu:666R Ԇ?Բ7RyTC>O.gF2Y(X٠8QS)yz$LOיz8HqROqM@iPE@>B:tSa #&&~L||<۷o'<<F;;w~2-"$$ggg7on6s;ٳ',XPe xɉ٣;**haڵ$''Zffp]xCh $11[9uV=0T?T_BsSSpzM;eW^3f[`ӧOGxxxÉ4 yYbO$VNGj GaX`v畨z/_N^ϐZVy z..İi&4M-Zٳ޽;[nf_z%bbbx8@ǎILLd…xyyɸqrJB^pvv&22*UM^:uĐ!Cׯ%=iyʔ7L U2۷>a%ͭQFCNNۅw?({QsY=[nj7F9RvdYAꯆ=N#ʼn#ʼn#ʼn#ʼn#ʼn#ʼn#5D/S &z< X< X< X< X< X< X\^N߿?5sx _uxkDXo tqq&`aP/ I榞O]+-1Brqz`{Gr#%G9 (|צ,W8ӔCiPc;2U9mϷb>>]dP 0l/2tP4 $&}xnߗU[l R2@o@i?r^mgeVv0 LSc>03ȅsΥC̜9tm,_GSOamm"-XǏ_p!,^<8@ΝHIIᡇbҤIqFΝ˺u*mѣINN&))W@&M 4lf̘Att4ӦMc͚5\p@ll>** GGG233ٽ{7qqqwu섺Z7+[#4N>2-C)_W}κ{Hm0fdSErA RMVScǎGYF4 3f <<\Y`ON)=<<0>cNdd$ˬX'x\ϟg;v ???ZjewJ1c0~xƎK@i~%KLfddDff&jZ; uH?m?ƠޘdJ O=T~Slh>zI<IY';UJ>ҥ[P5qvxOJo@rqgss8~8ӦMP\\LQQj +,ԩS$''+--E5 'NHTT$ 67V~VTۛYVSPP@fffP?.D$eSmϘοx`뮁Rb.^zP\XGr붫T%|l7rHH\\Ү];d4jU8V͎;f|ydY&==`V+^5s<%S< I|ݠTezeUVŘFïUY9evkuxruGGιJ} F(!LsKS3}KmT%776m^g޼yf'NHll,{h4%>aVZE||y #ջ}O-5ptr lxvٷ-&&M6h*\h"fϞM߿?ݺu3K/s=<w:vHbb" . OOOƍǕ+W*/..zꅳ3fWjjդЩS' B~,I'SdUcw\yrr25ʣhԩ隹|;ڳuVqpEшhȑ#徼nGM=Yf9 _ {%BGGGGGGGkp7YsYDGGGGGG'?oٻ Piϯq`A:ť s%xku6j4h9b6`/͟2^c烿0чޛB)>۷FݝHΝYYh!!!8;;ӼysCwAϞ=h4`*VPPk?NNNgQQQDGG䄏k׮%990j5 0ŋ :FC`` =>[kFrho-&7N&3>C&43p 0\nJᢓ]S[PsҡCfΜIzz: ʶx/_ѣGyꩧfdeef?^IpBbccYx1yyy8pΝ;C=ĤIaƍ̝;uUڶѣGLRRW^%!!&M(4h̘1hMƚ5kpX%}TTdff{nn{|WjdmͥϝuxӰ~AE8ҏW(>[s^:>H*#&,"SOCՀAEmcǎGY̧3f[`ӧOGv{xÉ4M/̊+x'}y֯_ϱcUVfiz3f ǏgرOd222HJJ"33ZZwaws:$ϟ?>љڑF-o̪x?_߻n=LQPw2N,:=q>ž-7r͓'o[{јp'n:Ǐgڴi7;veJYMRRRB^^2z=ypc(1b,5*{p6>א29ޙY9'ǩޑG2J.qryNb[T URzUͥM68::7o'޽{1dgg+wO0UVOYYzTv]a]UCƊ|M~?sjz|gMP6mڄFrݢE={6ݻwtlK/DLL =<܁ر#,\///<==7nW\8BBBիDFF]իWBN2d㲄'M#OiAMrscw\yrr25ʣhԩ\aI _֭[zF#F#GY60k=s7DAA"`q"`q"`q"`q"`q"`q"`q !gV|QQ;/%:%z< X< X< X< X< X< X\^N߿??fߎ'BU'??A{ABn &40[liӦu O]b_wpFD>_kXF4x|}bU>yPx}M]f=8% W1+O}b۾1}Q;; RrVPP|A{HKK j'Ld+| g҇Ci_xS%n52'FO6xI+Wd1XGê?ˇw᧬xgȼ7Q<)_p=pq(.YW,H)s=wu:66.aiC޵}ww=HlpvVѲ5lJfJ[FܛJn:)mM+oL*/ܛHxxI?-#VXXPRSSYb0~xFS}xWۛXBBBXf ;СCz qh޼9NNNnݚ>L)ʿ̚5 ӧOI&MfĉL|Ց2-o q?IGd zؽHYLA idp2R-/fXgD2V@ԋ7bl2̙Õ+W Ge˖-$''LBB_uycccٱc啛4##;;;:޽{ڵ+ ?? 2qD֭[ә2e ۗ N:Ejj*'N &&z;)s4^#c':5i&M't k_ƿ3-kܛ ~6sQuTv]=)ZSF&}emxI-~gܸqtFɓ'7o-[2h ~ ~L:lmmy3KcooɓJbl IV|>OQz eK<6ڊ72\q<' IDATiݛJě}'|FOAFmĄUiӦK^E'd˖-ky衇̚5"^|E{=2e AAAó>#'G#ωDs_t _ތO{{_}B_~tlWxA9< A|N >'G#og$ 8o556%շhA^ p^$Gng~?ښEPPH[Ox\. , %%I1Ѳe #kٱcVyn2kxrg1QF-/?1)d}QsA~xMvvyn(2DL&.]ĉvnٶu-kѸсZTY(6:2Zb>؏bS ۍE4Sܲ&ETHn( O'Fn7{ߧSWkxQt=HOYc;+aD'&Ea*y^,3zapgRXwdv ^=P'.iq.435!·o @ V[Vy/R?jz$OJٴ6toO` 77O>G}`vfLd'j[w$)125!BNnysGv; } !ҨEV搸32SZ^PuÕ%'9[Ư҃#8Z *@i#_"7 hhsIu4$@%15V2?+h#LJʒE>ƒEީV%#O{B|J,k?:{])}Yv-իW{G;O<-\n0Ңl).ljP?2C' 9LWL $_îfﲼ n7,;BN\y4 j*IXie dI&.Y`Ԃ)LQˆR,N*ᆫvvJ[rqܼkJڝ:e m$7(kbFGtSvDSW3+yuп… $++,v"X]Hei陳5vR#hw9ӵ 0>.r]'wh~pV; kYrwv'Nɍwӹ!L ǘ!搰$ڜ]'+Ġqk\u~8v%Br1T5u_H0j֩c7d8]n / }&xr96m"==""Jۺ<ޓu+-jfR\P 5I';x7Bgc(zkgZq_>,V;C4V:Һ|/xl\Kvr ӴبiVK#SK&O̲eHJJhK g?8oVQ+:>UHDd FGsg?&k3*eF0Hbp^qJ;;ex*k(ZeW֑nw,AAJt@]5Z%6' Nb{b;.t4; n@I d@)ąQ\yfmKvvHn7c7}e<Ö#1j[l˫fWSroA.A2N[y'9ة8+Z%A“;^ߙUhl_S7QdLޓcdǣ49)khc?~V3ѩh ?`BJEѩZ.4_1e?يp\Kٍe =Y1Iƾ\5(syorrǢǽ5'Z?8t:]+$!IEEEжnOoݺ "DzSNE`?W6RY>%f'k[{{ׄ~L|8BFƽ1 3Ia[D pf˅ }ꬖ A|N >'G#ωDs"xA9< A|N >'G#og$ 8{^}AW'\䮻nw^^ Gng~?x "(H\>]q\,Xl6[/zce76G<ҹF%٤h& ":PI^Wm0'yZJ!PƖ*+t ]0&_~3w9 @JO!9LO oOQw_}ni}נV}:0Tnd2OO'~*6|Z 4iS1̹#eoQbnބ`ٺVM-d٩MNb*6Mf{~ O,&ʨ凒ڜyopGu`y'nv캎Qe8%q?fc2Xt)'N$##:ڹEu-kѸeсZTY^>?xG(>ٺ6~5-fV@VJ.بQ@CM&6k!.MXv㣍lz0s+E&+KvtKvyZZW?x4 9k)u?^gڵX,V^:xB#-Ȇ2ʦvUX#8||e# ku]WawGVȉ 1/5R]hQŦlN݅f"Z6biwRΗe 7\SBؒ[EՎ]]Sx.; L49p}s)Â_NC+˙1պd,[$vͼpjc9ŽADj`t?wFShvy9(olpm `^ ?sGἲ)m?ɃW5@nE#5Q)<k_椼3I sOlv' r~:)Z W3e0t 3#K6omrNSfgc2$Fsmyt ].:%SB8R)s+$/+NJ)+ k*پ0$oɆ}i L1Tڜ5\i?+Trq͟Wx{!O΢T jvv lŊ_WuxŞ$TueZjjPP+<1Eۏ{/![C2 I$QTTDZZ m֭}x<"B7T$ pe*SbnqwMķ~S*ddÐ . k< f3. /Z "xA9< A|N >'G#ωDs"xA9< A|N >׫l'\yNjlJ{^Q>W'\䮻nw^^ Gng~?x "(H\>]q\,XlG| J1Ѳe #k?]ܒmlR4$l/+6<-_f%SrbcKny./w %ϧƐZE_ 1>ڈZ)ㄩr8^c}62?+yůAtl9ma,qdN.'ӃTlZ 3hX33UYc™sG.ʽ =uZ7S ݏ拏UlYLQ%a9yp53Hb_a9y(^){:^Pe7}OdbҥL8 hVvގvu-kѸeсZTY^>\͘NvY`".XGr\Ahrr/k  wַ뺑F-v<ӆbPUəƱj+5WzP^)#O(҃#H1l+ ܛ|.بQWQԵҐ v7 X1X&gdgմ8R ,yɎ"rЪ:$mWDjY>%Q_Dz֮]baю/'4Ңl).ljP?2C' 9LW6"H]eynX|w$j`R0hڙ?:O`Iv! +œg|*IẢ0>.]Vɝ<599Z݉ ȚLaonΣo{˿j]lX!awI49,S_KlAMu%Qu\THn7F F :*Z.t1hb00lڴtvO`^j8(o\R{OypIqA]'Ԡ&=>\ftf^}Lz 5VH_X5<59Cdݭ8d/ΐ Ǫ=g 9]/м|c"XueWժ-6jm<5fpSK&O̲eHJJhK g?8oVQ+:>UHDd FGsg? Õ+162AzTG~)mřVNVR.c0J9'ͷEf ԠF\:VȮf'1D=x:\nڝwԊrN7Vhj2 _͔aЁόx.ټy϶Vyl|;;M$2IaJ-vU)tLCw N az J̭<T|J,^4RFyC;+=uVx@Z%$MT6p?Ӵ&h* mN󏟕xt*98Z+Xcxght*V; WLYOb/+W@v:@wrssYybOVt깆YC \^j'Ʊhq%B~t+qqqtW$IB$HKKmݞ:޺u'@D ~lB|J 6Ni0poTȸ7!\XyHW) "g3[wC`Y-A< A|N >'G#ωDs"xA9< A|N >'GNHqb'56%=(Bիqr]7;//#^hDEE$n .E\.,X@JJ 6u--Gnl)7[xstFsKILDtK `N.|BNy-UW`L8fB3s0?CrV j~UT<;5 F 94hXzַYMJ9OT4vOTnd2OO'_OSRN_h%̠aVMg՞ ga,{s+&npֵRlj!;NntJv?~'/>Vyn2kxrg1QF-/?DZ.n L`yM?^S]k{^J Vn1L,]'tʎ{5hP@-G,V/#%(6 ؝_ęI15-R!_V B+k?&7WSqgd?|󘷓+xwr)[⿧@Y^ #B<1) V'.Ggܞ 3=+B<&;ķ*>8q VNcw A؜nu_kwU`:zhڙ?:O`Iv! +œg|*IẢ0>.NZ<&G;`]X˒{ǿ}gFl;τc#vDS2?ջĆTw]u-]CՁ벺THn7F F :*Z.t1hb00lڴtvO`^j8Wޓu+-jfR\P 5I'}uǷz?Ca[05YIqA$7Ǫ78l3$@ݖZ!gOxl\Kvr ӴicFMCnC}buɓYlIII><59y,g-6J9jEr "5 Õ+162AzTGSaz"ZJ d8zꖜNܻEf ԠF\:VȮf'1D=x:\nڝwԊrN7Vhj2 _͔aЁόx.ټy϶Vyl|;;M$2IaJ-vU)tLCw N az J̭<TfxtJ-6<\[Go!_Uhl_S7QdLޓcdǣ49)khc?~V3ѩh ?`BJEѩZ.4_1e?يp\Ke =Y1I":eVyb^B _GNye@$$Iږ[xDHo ҩH&T 9˧PldmkoЏoTȸ7!\XyHW) "g3[wC`Y-A< A|N >'G#ωDs"xA9< A|N >'GNH{ؔ/V }VO]wX\<@ z~⹖5-&E3yXсZ,Nr62o9eVr:%-6V^QG)!<6>6'{ͼ{@31.S"3/+6ɓI؏bS Q6'{/Pbn%=C4 ouPxrR7x楆-<%fOg9Z4a8Swno=2g\tC)klg{%$O?O\ŏ"=Sf gzV*1|'y0.Mvo' U|pAB3S9,|0 $@lu`72/)y٩GrMʼUOx YՌ DmG?&u$QeLOF!'bC/Jl1+y0J!~ :C$7';gQ F 5IiH }~P^)#O(҃#H1l+ ܛ|.بQWQԵҐ v7 X1X&gdgմ8R ,yɎ"rЪ:$mWDjY>%Q_Dz֮]baю/FZ 9eeMGFqh~73?9ӈ!x-͈ d/L僓uSV`ԚXV`P{(^)yiwW__ŝ&M-؜ Dl)/nkg%Z++NN/뒺DC ʚ7w2|iwH4;ye9_1 Kj,\Lhgp~EdG!g<]Z*-6jm<5fpSK&O̲eHJJhK g?8oVQ+:>UHDd FGsg?&o 1pWTr<3y_6tz4F@-킎3K;2?c_dyz U=ow,AAJt@]5Z%6' Nb{b;.t4; n@I/L&. ̈͛7l[jG@r/+Qbg[^5ySuy~0Xm.k`c:s{Jx~F^;8%|M64=y 1Fv'G#ωDs"xA9< A|N >׫l'\yNjlJ{^Q>W'\䮻nw^^ Gng~?x "(H\>]q\,Xl6[/zce76G<ҹF%٤h& ":PI^Wm0'yZJ!PƖ*+2{cvJ ¨ɞb3>4PL xKʼM4I O`̆/oɱַY-{0>4r W ۍL~*6|Z 4iS1̹#eoQbnބ`ٺVM-$S‡ ֑57VoYQd~F9ɴ:\l⦹?k(X5=+ή= \Sc><&K2qD222[Q7{x\ ;]HSud2|Ŧ5XmN_Jny!z@V@}V=XœEi#({q񧬱U0"D0j/~tj0k8ӳP)d,O;ɃqInM|;iHb8vf[qwl Zfy)ޟNcl=X Net?'%lWF^B'j<\֬YlhjDpq:(2'B4OhT6ژ<\?EqIz\޳JNE朝{P^)#O(҃#H1l+ ܛ|.بQWQԵҐ v7 X1X&gdgմ8R ,Qyl=XV%#)o׎׿"2P)73n/}"xz=k׮bzjhǗ #-ȆN]@+9Ta nf/~rSaCbZϡ^'w;^jwu?lszv(6`sJ.4iԲ!Kv,kdd᪯–*jv.7:;%^?tm69p}s)ڙ?:O`Iv! +œg|*I"L : Cݗl ^ᗾbwݔ}7[;9$.6ge~݄\AM㌡%Qҵk}[cp_r~*$NIUS`uj-p4 o1_Lr6mDzz:OG;E0/5Eַuy.)ԏ'WZ8Z̤ r4Xu3eWyC;{OTm !zN=ӭ0= m.[V;C4V:c"Xue.f56ښA %'Ofٲe$%%lh楆EP+Ѫff$"2P\#3ҟB7+*SLͣq>Uhl_S7QdLޓcdǣ49)khc.rN%GkyTz ,Njgw3 lId+V½r/=d7Ve =Y1IƦ5(syorrǢǽѭšz^$ I(**"--톶v{xwG<!қt*q B)1T78Yۻ&c[?)22aH5Vy=V3vQۻ! 0}ꬖ A|N >'G#ωDs"xA9< A|N >'G#og$ 8{^7- W'\䮻nw^^ Gng~?x "(H\>]q\,Xl6[/zce76G<ҹF%٤h& ":PI^Wm0'yZJ!PƖ*+2{cvJ ¨ɞb3>4PL xKʼMzڇovV}:&էv#yz:z rB+a kf&jZ<0L8scE[7!usbS !z~;3:budMxap2_;Q$sN2?}Lvvyn(21L,]'tʎ{5hP@-G,V/#%(6js%Vr˛H [Է:* Zzd=]ϸRSΪJIQJ?q?:L^5Yy2$7&4WT rZ LMtc[ø;6փU@˼OfZbhg2:擒z6+}/5@nn.k֬l6ls5c"8QOjg`azrQ-,FǸ>. 1TKrs{X ҩ1\Г奜2t+/=8#o+`̽ W} `zA]{, `wIoxl+`rA}|_M#%Eޟo9փUhUr^?6{{+",{)}"xz=k׮bzjhǗ #-ȆN]@+9Ta nf/~rSaCbZϡ^'w;^jwu?lsz}ŦlN݅f"Z6biwRΗe 7\SBؒ[EՎ]]Rv_͆65\#㣻o8e'2hjwrf%>1Xp!deexBK T]9-0=sSNP6~w9gdOǰ| WXj԰DOe㧥]. ux>'fkG76%*!bPSm8chwIԵtZ/!ܗB ƨSR>G5TShLƠQܒBwlڴtvO`^j8(o\R{OypIqAi )TϱfrEdG!g:UGg #_b6v \7J.<WsB?`W%n61պL9d8h#ۍ+o#HmG$p޿#1nĈv$2|(M;no}rX`)))l_0P[?COE>⹖5-&E3yXсZ,Nr62o9eVr:%-6V^SBxl|F mNye:%Mgb\vĻEf^WmxZ %_MC"|3>-]v^?Xu߷3BƮEcx|{!-•Tnd/U`?>-V L`մxV)`pi6i IDATƲ(1roB0fl]+ŦCvf)SuȚB}7W¬(d2fvVIdZ.6iqsKouW+X2! Uwx-v~R&y]c#k><&K2qD222[Q7{x\ ;]HSud2|Ŧ5XmN{%Vr˛H [Է:* K]<66f ;%Ei#CI SiOJ6HFr$`L?7ϲJ.&ܼ[dfʰ 5i -Tb]n:3c3*FN}`})ω:!̠fɄHR Hn7_6%v '{wu?~mWAA,mq7Դ\Ȭ̟5e^zV̕KIi".)";|~ +y>Ñy9e{JQmm'{"h4bcc5jL;?GNdU'ыB /{N_*`W bӍKM%3>-~2@7[:4vddB<dNV3B!.VxhԦehƴ'qP+Q),IEБrC܍ٿ%S]y@/d4*>М '+Λu ?Gk< _h*dV!c3)(O7%%ӗ$^nMLC-k~u HZ`J@^Ǣ:5& g쯉-Ce,P{O>0v,~:6^twJfp #^jÁ:1w0c5XTĚmv2?iVRX7/.(ՙNUGyeq@B˜|R̎S4rfɾL J/%l!v7=fnph 2+Ck0 =rl+ap #0[ֱS3Q/ճY[ll\uOFWlJwOxF… ꫯꫯ,+|yuq2+MN}"^<0%qgSճ+)y0[om8||7o;S)*ӣVxEezS9e:ue\.*Ju<9Ww{vQj%:ZҊK2ꛯjgEVaeb2sKt诛y'=]q 8(PpdokmT,ҴM!I2jEew? y~?m%9)5Gi(z> <  Э[7vtep[oƮI UPO;6m?ϡt taWR}4+=-Ƌw©" fdnzٓsUkf]OBZA}caUyt]~ O{+N\{VHت˯[{1u)ү D*pc= JTPص U?SꐞΰCa:'EipO=S-裏2n8BCC-ǣ n͸u /ERVV4ˡ<↟ |sСj}cGq2w wSR2?N*;GLeG-k%!x: $geOg34w;+:`uj8gѸBPATi۾s2Õ{AamנO}RE^}/5zṪ`(:ZVÇÙlx&>ZU(mEDiಋD}WâʃNyg$| m#|61&48N|lz%aЖ/# \pg׵`@b0زe AAAf?Oƀy?CPP>z3z[Un. }Ώ3iTg$Ii=҃xhTOE{8::aV^̈́L@ic|1m}w9\O^ׄw,W^}5 Yj%/? zV6(QX I]}ߙK(e}BvD3/Q%?y.^+3f_oBCYF&仡ց;E=,&}Uξy'LAAzMlg#""kkk˫ʢE8w=pwwo0ң\xJ_~p5kfZՕ^{]JFFF 8MgmmM=P*ڢv3hV!))ttFDx +}QڵkB.iI"[`$I0|A8xAzjőW999Ѿ}T#A,^O^^^H\\] RNN{ط 1#uZ`ǎx{{sV=6oLa,p'IL*pzs;'\S|Y&h`#(_%JJGe.ӇJ{Cy2{d~MBCCOB=kr.Ox{[ yXVE|K Bö2i+Ѻ $;Kd&ѷę0ܝ<1 YäAח|\{?Z-VVV.#22zZ^ =$xBExD&}ظ >iY2^ Z4.-%Ӎg^]L*>q2|Y×yڷoɓѣ-Z`ݺu=SʺuشiM4atЁM2fZZq퍳3M4!** ^ׯ7{̘19to'>>>̞=lZ7kzOA%N9 :=l9 SZ~KF +Qu 2*%(MDv\5eTf WyݺuDEEȰaêtLZZ8pcǎqVX@TT{!11\bcc@T2rH/_nʧkךz1| ۶m#..8yd_SvWVx=K ~3 4}[_|4B1>*1}Lӗ z@O( 8aJJv8k̘1VFĉ婧b|>LYY^^^lHmcpww`ŊL>3gN5pU;d <+%L )XVv8TZ#!Ly 1]c %=o<ڒ[8 id'wjuss3֖ Ƅ 4iߟ5kFǎ`DFF:{,fy<_d,T~idwh8)yԘ~< 55e~iZKp"R2n qe a t8s _o>t+h()1_ 4;;P(xw8x 4jԈѣG###Yb)))޽QF|}}p^ҥKժkgo7uR-*;Hl/NCI6Mp̾28/6;^5'UM$ u:M#xOEW)}‰L2{O˺mu:$u7:ug}OOOlmm 6[{!ׯ mOw >ԪoYe:>kK+ %ZFKc|b߶nl6›w*-mpHU"U{9s^Txڒ#NC/$u}l~Ш|ԴJ Z!pT*ӺY#Gښ%KaZ߾}yGݝnj^7__4^R|gIKtu[mE{G;5v'&ȔT\ʣ.;a%I r[BuIWKqR)y jD-Oi8zmaԫelgn/j-m3SJ6 饬BR((Jmcǎ7oMkZƍ74iĴ4oNFذaٜ9s &燍 -Z6/2/UV8::ŋΌ3VkJKMM ƏOQQi߾=t҅ӧOݤI~W . I-6]yHNDD;w6NڵkiӦ mۖߴ솨ѮJzXTB|~1ZYf\J 2O:͑ ;k;V9Zx?3G $*юKe:ΕV|~ʥwSxAm<wǏ'!!xYbtޝPRRR8vIIIL<\zK/DNN_|-qݩr;wd޽w܌v͈#;w.W\O>aݻ|Sי.`~s_Ӷ [kz8!$;3X C1~+D2.1 C]a<[RPRtf]@hߌ}Xw1Qw;v,( z)z5>|2Veӧg{n~aSO?g}F֭?)}…̘1Ν;P(CtJg}#AAA 8qF>puue|lذWWW|MJ%aaa;mtM2kkkmK._X|9C wިT*s=g"kCx}qOR.>\Nd_-hjg";R'V),\4^-cߩL>u!8 ` >Uc*/RAׂV ,X@TTYYY(J `ذa\pI&qIwܹsM';; h 3gd̙zj^y߿?iii]6lXhp)))dee2 j$88,Wǝ+^x? vjoӦMM=Mh1_PUxjo$񘋆G5z9trIW$fvּ–km5dxUX[q3j kM61w\ 55={P(xw8x 4j̔;ӦM3 nښѣGġCaޥhܸ1'N0N:˗qrr]^PRRbzWfg 3ʗnܸ1)))f&''Ӹq7iϱ8ƒ `Pa\baOnh@g yE) 'W_ȡ&jz929:2/"Xr6e+'2yvrrrpvvYf9rlu׮]:t^FʼܩS':uiʕ+[QPP@^^K,!99Ν;0~xf͚ž}0 \tW0R{=e 0f~+Wp6}z=ϯqy51zh֬Yo^g֭㏼5AҠZ%sS/Dv$}2 9|xY?p+Z=x;}]罜,-t2J8vwd~HE}L.\7 ##ZMvn:Ѷm[vœO>IAA'N#FJ"$$+Vc0a H233quueUEF0uTBCC)**ח#Gҿ\\\ؼy3'N䣏>ٙÇzjSfbԨQ}\FDnXloj*tR4Ҕ)S5 KϞ=k\x||<999:Ņ)?]cٳg {{/rLL ;vVYlۜ3gnxj@A59A,OA,AO. pʗ \s]|, 4`/_fǎU! 4`@Ӆwb00 $$$Ԫ\1#ʼn#ʼn#59Swjy}W@`q"`q"`q"`q"`q"`qz:=..jT pW R p +?_Ame>t2--dk1@+ɕ\xUՃg?7?Ȕ,_Λ^(SkI3Rn+2h\,BTGbԥxȅLO9P#tOXYJ›㼣`ɋ~1M^-rcʖѪnL֮ƀȥʖb5U:Szk&APk`:+.9J0Ug*VL3\" _T(l)ٸre!ɆpP\j#fvIDATpV!pIIJLe[+(#xY$gItUTv/ 7߼~;wSNs=ٳgM,xbZj#,^y͙3`N-><[I~\Ȓq40$\ՈgJ?笜CST}m]y9t-[Ǐt_Jł 1c믛V\hse͚5tԉlRSSt9r{Y-$''=δ*?זdq%Ѫn|j_,UB):Й#MUt92TdZ)LG 7$a@欜&!SBWEs>n!W.&] QV s:NyYEy[9s ۷oZ'$`вeKt|gfǏg֬Y۷KnJ|ܸq̟?z{V=S%?[Ov% `U_̈ȓTvc=m v=\4 LU7Oa|[O٨%("zڔ>Lr1c˾@._%>Q(FAәxbz-Kj5Æ cŊ &P($33WWWO~--#Fޞ~f|jp/۰a6l0)۷ʒL,OTEҳgONNNqqq!<^?%#ʼn#ʼn9AHt˟+Zm۶E=,]ZI[m߾e*T"As< xA8xA8xA8xA8xAZN?s dggU}Ynnn899tD89sIx:xhڴMEBxUPP@vnDծ];ETMfjξ+n%DVs< Cv'MY-A,w7o>@ ^z<=yWtt4~~~w%MjjN8Q'm"׫3oPz=dʕ|G>}Got u㉎&--Kr9b#0i$C.]ܹ3111w}3b}Q"""XxM.]JxxYZZZ$''K~`Ϟ=/www۷/k֬AeΟ?3<t֍}ؼy3!!!̙3Ν;ӢE ^{5L$''3tP{ 2 2ƍӤI&NHaaQ/o'gϞ7qF-[ݻ={6>,YYY͛73n8vƍ3g۶m3x`222>+V[n4iҤ^ϯJΝ G1zhIOOo߾ 2"~C\\qqqDEE!2 ___=JFFgFTRTTDϞ=i޼9dzj*۷/CEӱvZox*W6f֯_Oaa!;vիeZ냇Ν>;k׎ZhAAA/_6jv:ƆB BTސwZZ.]",,=z4jZ XD\7^0͛kZ-[ƨQLےNJJGm7KaЦM7oκuؾ};Ç|[WM~iƏOrr27/Igĉl߾www0 7/ߟz= KƍСC7N"5aѡVtt4l߾{^?æ?8t:K,!55մ3ѣGB׳o>;^|[QDFFh"nʨQj4̪?#<³>˖-[tl޼C"29994n777dYfʕ{n7*֧O$Ibj>}PZZʇ~H~~> SP:e˖ѻwo4{1:w̲eL+L>???.]ڵkMs>,3p@O=z4>O?-?8?c AAA|7MSTbG,:SyWuQXXȳ>[:WgP4U;l)vV͛c0Xp!jZ:Ԑ~WXtUU;wmYɓ'kQA=׈ύ*ԝ $a0N$B`6qqrr"!!-Z4A qrr>Mjjx9}4eI...899|}DBjYfuUhA3wA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NPPP+((x^+$ƒ;L,$E̛O+_wY[IENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-plot-task-zoom-1.png000066400000000000000000006010451414302661500300220ustar00rootroot00000000000000PNG  IHDR 6wgAMA a cHRMz&u0`:pQ<bKGDtIME -IDATxw|ǝ{f9'1I,ٖڲ|t&=y{^ӭʖl%JDJ")Q@$rLz HoF3RF!B!9C?\\454]!B!5Ͷm, ti.˲,>B5{B!B!>l&LjDc'1҇VeΌjLӼeB!B!Fmԇܪ<ƻI: W8ʶ# pZEz'b4?9B0Ak0 c9r[R 0m;U~&M)RcO}L3[ޱW<'2ϑq^#.ԹeN^^, N[[{N,YLOO/yx^,ˢ ENN69y.:Huμ{3{#$]]86cܹw!Dȏhp8R,n7===gǎ?@8vs (999 pDo} tQ^^m'ah(J}}=/27ofƌn y˛hoo&Hr)A1MsE)E]I#-s-Z"5|ߦP 1wB!)mў~E"b]`0\.Wż חi顽ۍR^m!+appYf;*qbiߛLe%Ѥ3/Z8|?`͚|M}}=?dggRQQukٸwA׿JQQ1?oϴ~& 馛~g˖-:Uϧ>I~㟰`|I$`p0׿5zzzطo?g#vٸq#<4> +W;_#|%//VLBcc#_9srٟG_n֬YMgg'N HO>Ğ={hkkg֬{bxMF|K;p!(Pcg׮ɴi8y$>>}:o'NԱlRf̘Νq)|JJJx))){a޽֞ O}n tuuo} 9so~[:u*%%%ڵ|;w;v{F!q4Xoj֩@z޼|>n7:u 7A4edggPߡLo-ر,_gۉF#H0l!Lj'yc$E]%/yKTh5h d-[pa|>'N^}Q֯_Okk+?Ǐ1{u0_ߐ??3PXX#H'O:|`ٲ8p{./nvIWW7?~Yf1w:Ď;سg/>S9z(]L>z!֮]˛oWf͚ŦM`&eř;w.ST#_0 ٺu峟,k֬q/^I?c ?ό3y[hmmc…!X,3;/Liiߦ^x˲mܹSNq~=txX,NccN{{;x⌴1,ˢ7|z ņHgp00L:;; H$ß4.DZ'>ǀ,m !Cki|k_c߾}=s%;;555l޼.@zke`0;Kڡ ^{un7`v.dy p 1c&K,ht{+SXX ())f޼1k,/^ĤIضŔ)SD"L}'WeD),,bTVcҤIL%Kp+Yvsϟ_a(sXh!YY^BB͛KeeYz5˖-cΜ9|>f̘U׳h"z(++^gڵ̜9۶e+b6--\n CVx>2 d2ASSMMMtvvxW>;;%4 [kMGGmM[[ x߇aU{Ѷp{܌>5;(Ӫ\B|<\.N.QNG_, QA81ҧӶL>eaff|1 ˲PJa.'mۙ2tvvOEEqbS O}zkFo͌8NfteYttKcM4M0ih2<3ۧo؏La~~rA,Z(3ɓ̜933ιC)E$駟g_ĉ 2eMͶm\.<,^|Ǡb``~jz)L?)'O&??9B!B!]g+# կ~ÇbO8͛mnYfۢ+Wrma:yyy(hmmǶm֬YÎ;eL4{RnfOz82>dLӤ^xh4ʪUhiig%;;Ǐn VZk~?gx뭷8|0_WF<tuu1|V^ͦME͛7cYWf޼yU"x3Ivv66l8sֶmꫯ_NNM,zdggg0ԧؾ};o555|3cǎa&4662{l}2 6~ӟ6yOɓ'y0M۶aҥL:W_}?& B!3@Z3sL>0w\<044D,#??믿;1MnO~ڏi!H$PJf~?ZkΝˣ>^/& fZ s= o~C{{y-2eFx<pqlۦO|߿W^y;Caa!<ԧ())!HljF̟?)Sdn\.^/nX,&B!Bq 3"ʢb䐛K~~>w}7ֆ;g`&?? qz' Q\\3< )BރZ(//'//4A֬Yñcկ~Ųe˘2e d^x!z("++n{~~>msuyǙ6m7x#׋m?]iӣ{<"D`0a fwb|>#j>44Dnnn|pp2֚X,X,EkXE2?!> |ȗB!BKiNwiw_No:#\H+X-g߅?־R$Ivł ΖB!BqS]]]]#ꧧYB!Bqmsb+]!B!ctB!B=g!B!BJt!B!* B!Bq]!B! t"ӆ=WB!B*@㴶r]UЙIYYٕ.B!B9#aT%q1--?߾$@)S_k=a*_:͙5 qFS:t#8V_:O۶ x0m:.v4f,:]/z;˕R(>B!*v^(--vg)8t>iӦ (Zk@&hF}$irZD ??<8---vdhh2<j줸D"AKK mSRRBNNmmmqJKK8C{{{&?MKK nR dTPP)磸˲hnn&KYY٘Ǿ!2mmFeQh "/Og+5:z{`PSPqhm5H$녞T"Mn&66ZCS֩m3F>P(,m/^bosEQQmOK/q7~@CC[neƌsďc{=n&ZZZG('O3@md2mۘ >E$j0pRAu" Sei_a۩ |>Mk{6!*zzR #y}\lb$M{M]IKA^?bsɜ96xع.8`5TWX&a'xizh=ڣ/^{ &۾JP!^{K10;q^}'=e18N:B!B+MmrJ0555Amm-ms-DNNq `P[[… illD"ٱc===x㍄aʘ7oY峟,Zko '>Amm-3gdΜ9߿gy{w$'O㔖bYmr'  җDww7O"OS\\Lnn.qH$ qwǪUŲ,xxӽrrr(++:n?8AnnB!…6CN_Lf϶YƤSQV0iCMɡC&Jpw_n|{Y45 )JK**455h*_45?nWܼ6oOvƍn֬0M27Nub~Lݖwȩ檛S/$fdF1=7>NrQuB}QOJ{{NT[m%Y~6A[AobhHIU~b1˥$Ӧ99|;] ln%&\ͮ].vr_z8ul,Zdri7y]< }}W_ui_ j䤺'g?'ǓCP9Lero4]4PFPg=*PdY@17F×B!Wqt5^|+̝;Css3dy<^/a`Y.>P\V^ի1Mχ8 0444fdYѣGqضM__pX,FSS2e GkM8&gYŞ={2]mۦb(?Dkڵkq'Nf̙ bh%000yv_"~SNaYH$p>"p۶)((˲H$>Yn77zHFRpɉS8i59|ؤ@Bʭ"y;fw&fX\.*N@)m6NX1ET*#/G8/އ(B!BkʸϠ+dҤIa&P;v`6wy'ZkB~ ^/i2w\=i,]Zz{{vS^^N^^0̳#AF8éS_Arss rH_zX9}|ҧ2Ǯójx*n왴Qid֏\g.B!Bk9;3N~fG.wݣN/4hX42>sۭ)+̘d3ӥ?sXv溱|20 i[/B!Zv0TiBq.,@B!Bqe>x:3=8 !B! YB!B!U@t!B!* B!Bq]!B! sK=Dy^t|>&R,WڅGC) Ɵ)4 .oj$}TΩB!.qt5ph4s ,p8L2wv300@<_v 󑓓C$!\=kp8|8|ƶKv>.R ߏ륻chq\_vG~C?5,NJiF1o5kR> )BKkyЕRD"8$Ȋb w8]]]dgg>pYRH$0M\Nx< D2.>(((8fZI^^n{BӃ%;; rXT)0Mx<>(kS \S 8,q36y2ެ+P{W5n˲RK0]o9#Ӌ !"c.x.Yvikk /IRtvvD(--_<8]]]sI9u<v_}a&`z*²,<τ944Daa!@ SqPJ:gk۶/ah3uL&蠰\׺ixHmh9E xu\ZLzsZ1mC8@OEmkJ{43;mw\YqO&\.LӜpKR@ pS!M⮵KHJ) 8gt^ εt9P/#;1N$hY>q2=ƫ1t#Jå Ko99β,?aԩtvvyzNl۶[oǓ9WeJ|a )..u]Yݻioogƌ̙3fٳ1cݻe˖ ٳg]]][.Ptww~֬YCgg';wD)u]GAAwfppEQYY)î]8y$999[qرc@+Wٳg===̛7)Spa(//gɒ%(8r'N`Μ9TTTe"SLaҥ444p*++Ype"@6v2Ifn(nISO/T 8ό\QA8dwgg&|kq NkMy ‚Cagݻ4Yb@ݻw 7܀Ü:uI&h"ٵkeee,^x̜9w} Xz5=z|-[-[Ǚ5kgwߥ5˖-chh#G8̙3;v044… ̜n|N:eٲejkk9r,Xq}}=---\rԵsNZ[[eɒ%磵&oF ,XP(:M&<3X˲2e 'ޝ_3{L ֚_|>q\b1y'I$D"I$9e y.-q;O_vgzgP !B\猴p& vs~sԩL+pQ6mK/ĦM8|% m&H$.8 Xb7ngƍtwwOHgI&۷W^y_~W_}:0۶mcӦM˼B8LfO^.}:nɇ $b16oLKK /]]]\.غu+tttyf(owTÇYh3YzuYvm&X3gw3fm^/r 'Ok.\.fBkM0$o>:;;cţʠ" ÇD"qw33w}Xn[o[o5z[oɓ'ikkv8x ׮]i{a=+F6qeZNC![^3rsyy5idǶ rGe%rL 充ZQlmhAgm>s3ydlqmQ^^8x^nvnf~?mSYY3klժUx^  q ;m۬YQ}>nCЀi,ZiӦ1i$.\ȤIXr%nol8z(. ڵk={v2e pzrssywihh!H$ڵk3=Fm˲FZkB֭3 a{Oo]0M4q\x^CCC:ug}A{= 6xQM>9@fY__= .dϞ=l޼^jkkcf^KK m3uT>́H&̟?q(--e͚5([';;믿g!BKX֚!yvŜ9s),,z92Ȁ\q4xJ8 'eFFQ2ZklCg?>]lP0}ڴi[H$twwOGG===3w\illKKss3CCC ;wnf4h4ʾ}&sqyᩧ[o:|dk.g?Q=}Y^/---$3f`q/^C=~;~?>OeZ׬YO N8+*S$6,Y$cʔ)455Fٹs'˗/̙ïk~x(,,_gA6l@MM s300@II J0dO?M]])(( m۶1o޼͔G0k֬c!BK7g.LOncTN3k֬df*m à꒍L^^^9鉜t@{fid=L3rQ|[[[37>RJǣh%_\Cy @o$™ㄏ}A,[|cclIyydQ:NKd8{=x7UvOxz!B1[ЁLD>p;^`0eY L&?p].x<`j4 4 ߟ)\PkxxQu|)8NfKQn~Re>/`BZꎴN]C+sәYZ.WRIP0)?ꤋB!F7@ i_*/e#tGB\-Ե\Ip7sg%B!GyGq.GJ>t`z/>8 B!pIB!B!*0f =Y!B!(Yz" \ !B!Y@3j٨])E$0 rss9b!B!)$;;Ǔ6={ H;*{NNWB!BkR4%//,AkmۙY qB!B!enwŲswM$S!B!B\cǎooYvi%@B!B!.q0 o5~ !B!a̚53g8mc6Xl !B!Xz 8Tfqdrm$@B!B!.d2ISSSf58=h\<'//m$@B!B!.14 |օ1]!B!L ȴ7.B!BQ5$@B!B!  !B!W ЅB!BB!B!U7_R 5PBq-v hEmoW.zq 0'ÅuI Q2t!Qn?*lt<~8>؋(ՠROuK}E̒$TnEe;CbUgqva%ߡrJvF^S$&Ȯل}b3fqo0*9-׍_Mob}rʓ 'p P/Fhꕮ q987Ce7}r 1' {N`{18nμj^]CϢL7*XI@n܁Yб>/5֡g0˗rN{zCOzBK?vZ1M[ZЅ9vntыza;H'ɷ>ӺMv*]Ou[gz`Tz{]tS'6vNo`}h2սazki?Ӳ]qlA^#.UӸitb`p:i5~X_z=}]O7S[qp鮽 .ԽlXޓ 6suմ SN`׾ݲ;Yzl#gѱ:ԇ]ڶp>-W)]ѣ뢷7@(Tː|2Lk(8\iM8jxzϨmR*5~p61őB\I+B!B\>p>88H<!B!B\>pSYYɓ'MMM a0}qeY|9sСC޽BnfρH$̛7UV[oU>}:lٲ,nVrrrt !.Kމ[X>HgQuz5NԈjtZsvy^ȣ^ϯg2Y!% ٱcoχ[x  qA%%%:t`0 7 G%sNYz5YYY$ |g?//կ~7̻K `޼yOoY|9/׿O~&MĔ)S0L(6Q\ȺmSw[h$=6Wa8tjP+Ig`8DA[ml#9rrp%Se$ eư.#J<8@{@h{A T1$6bm,m " .f&wttSO|_W_nJcc# .d߾}S__ρ?>[n菈㔔;`f&?e…޽x<΍7ވeYSZZʮ]Q\\޽{"n7p7k.|>?~]v~|>۶m\q =Rh#~0So蛺PGe`X$3qF!g~vYוjfx{n>Ș1f0= S,)/-u-=h o5ϧ8Ad*yG-`@~ػYr݆W A50x-@߂ߥqGл? ÏcJOޏ0XjZ7-<z~3})px{7.o*cÌŨ?T҃g_h7LmmgJ13.3gd͚5{X'O؈R ۶䡇[b&-^zhll$???\RQQŶm^x(?0'N୷ _dfn6CKK ,`Ϟ=S^^ 7/ȋ/ ̯~+vŤIt !.3ۥv1hw3ht^C>3 t#`}}~wj3:\t3 [= @t͈^AhxAtt3* ۱^~S!hUc t.tMcГ0Ԣ|=Ŝ 2 ƒZJR m,H 6t tNnl % n. 0PJex 6ى4M\.Zk}JKK)**BkM(fɬ\CII .*qol2={6@bn57x#J)RúuXj瞣իW_B|4VLNw)6F|LG.?=2>vuIcާz7m/=zkמsP:!cM;h3~H. O\ #u.B\U&|Lt0-g-B~~~f]QQEEE/]4+gAA֭QF>˗Z|B8p6iQ0:]mc;:^k،V7ƲcUX=jZ;vhNUǮ1he_p].JwwD3( v[/3KRP?CJX r?(uH*7>5C)gZr&Ԑ{14vv_wB!B|LtM!B!B\F !B!W ЅB!BB!B!U@t!B!* B!Bq]!B! H.B!B\$@B!B! !B!W ЅB!BB!B!U@t!B!*B!ĕA׷bwFcX}U:+ T n낾6%Wp^Cq߼5Q@M`:/-\9+]j! !sIv?PW~D=X?}כpysSb9tgߕ>ԫű cԭO~~uЕ.BKLZЅB;={ .Jq.0M0 0ۘu✔9v=)cxR(O!Ht!B!*D"mW8B!BksN&Mɓ'MSSaP^^>np8̞={,^J8p,]GRSS8L> w^:::Xl999rXz5W΅B!BL(@D"QRReY l2|P\\Lvv6N4M 9~8yyy,Ygy>/Á,\+U~D")pL Q6 8#he 653V6Yۈ4cj1P*8(@_ !NJB. [[[ϝwo[VXAGGx:.\ѣG1M6ak<裄a,W_%vzX~3***صkpueJ=Ç1 <mGuu5l޼n={PXXȚ5kxaҥر3eʔ+}.B\i|>HH<:g2&=yl[O8фQ稘otl@bH {8(:{qS:T,kT=9_G忉 Ce#׀r_R !NJl\eB֚3grwn:ijjBkM2~444uVR\wu,\m۶LWWQUUg߾}Aǡ'|H$>9:::ظq#0 .JJJp\a8@VVUUU|>y˲2[neʕyϧBk ;N%8V`>n.Tهϙvk ]`i{,nUН;nwF(` v4!`v 0@B񡲱(0^'Tq\֙u更L&3il߾iӦegggsAfΜɂ cԩ̘1ZZZpua6CCC8CQQNbpp~믿4̝;V\Iee%uuudɒ+}.B|]ڌD( 0eFa+ <]2AFy0f=9crÖz};{ii)wu^{wB@GG3f+_ bڵ,_d2-ٳ0 D"AUU_=.l>ϓ{ϥB!B1.ۛC`0H(}6oL$fΜ9W>FQ3Bc`pR䫥_e]:t.8 _NG(yڿ9NJEesbrY[B-V=?oچ$@G?400! ZwFM:B^/W>lڴ)B7۱.mᶏ 䎂ٍ ey0Xyc\Yw8xd7!KzInXz˲H$geeztZ?jbWB!Js}:/ϬYt !/F'G /Sï+K]q*s ?}짿5:فl83eQZG:˯FW!B\N ЛV\7otM,\:3w\^z%~a9qǏ; MWW>,nnn&-[@ee%@]]=dMaa!$I.]ʴi8rׯgTTTxx<9~8m_B*3G}₶5ٿuN,O]S_bKx+S8~ O#P"JqBc=Hi9:QwV?buysN¡<[y '~_ɀDuQ?J <ԋpHljt+[$^!7Dt vwDo 3Gˌvƕ8DucMnбe&rq繗S"6 |Px.B\&;Cuu5gijjb444pI,"q1m۶a6/fڵ۷D"AOOGӧ;3y:uH$§?iyy|D"FG`ԩx<~ooa2]䕮k!`iRjMaV:fKGh4:eFaC#[t5:qz{\Cx?* {p->&>:QO}5 \E5T;utzpBniP ͖(=5vTRqBkP7 )I*y{M^ 5hl x ЅBk݄t50px^ m0 ٷoMMM$IRx^ּ+̜9bŜ:u P]]MAA3f̠\ǡ~̙3r}ݼ[e-[ncǎdrss] 6ܹst !pLV=JOw׶L =GCzMYԱe&gIMֈgtNԈ3i_{:921s3"E*hNB!GB֭[f1m4 ,Rxw&''ٳg344RO|2{l)//nyvA,cڴip)mݻws۷iӦq7H$X`A[eY444vyG(++㡇b޽,]믿J׷B!B1 P(ܮY`08*ljb(6t `Q?e~2eYOOG-[x1/[n ?=jUXjWL?xWB\>0E0]h,BWoք5p bd=QN7*1T{y@__7!O`` <@WiՇ=O1߉Hb>7cET;kBk#''z{{3J)zzzm,hV%%%tfWŦMp>LtBZ3rM׻~{kBKb3FoWв)@ߤ @6mvMxEA'&'i}%sO;JRk'24}ca1΍&1`\vԸO!Y?ߜ7m[[x㠵4BiR.YQH__5A1@9Zi.xRq.nqڸ] S] V:sRΕ.B񱠵󦽘]1i$&Mt!B!crvBB!B!I.B!B\$@B!B! !B!W ЅB!BB!B!U@t!B!* B!Bq]!B! H.B!B\$@B!B! !B!W ЅB!BJ@!.8L=XDpءrA1^3C6=-y!0 0\zaro@QfO3mIn|Zj8ĢYNMgaקnqpy3ܧwl8f()dh.6QBEA5ICP1 TnPƗT5t7;L[b48L0OTrF!VMqAt@3e{yB!rt!G΍'ҧB!VI.z5fmϕ> (>YE}Fά3׏%.B!Nt!B!* B!Bqڵ2***& J)i$q***D"ZZZΦ61 P(Dqq1 RYYIVVQTTD~~o!B!bL -ˢH$Bnn.m)))!''׋eYr\.0mS\\̆ H$|$++6(,,D E/^?q>>OD8p{a_OahhG}+]B>_g!㘙Ht1plZhG5R9kxՎ5Z oQ<+chm2Mp&6R1Ж+u5~_339^@ǨO@']*B!. 荍?ӧOjڸ{9z(cΝ=zA 5k7n;$ r۹{ijjŋsQz{{by̝; /??388 k׮en:/^Lgg'VTTT_~oo޽;J׹C qkMꋸ}UsX`&YbEW\5R0uA Dr kItKRVq%\t8Y0 (-i.B)Xs:n*a ( aɛL3FJ\6 Sɟ%|3gf"8>9-2xMayxeg86l]4U$wx3馧ȁmiBжԢ?Fkf Z !c2ٟxC^Yzd%A SYzŇtCC!"L\2$ /~|;[L@>88Ȯ]xG9u۷oghhٳgswPSSC^^>g̙̝;2q-{G}}=Hロd2 /Jnn.op?N<gٸn}Y~_Nqq1뮻J׷CŸ#:_tYz +Vo/ P+D[o4:#5XNB x':a:p~x%E@).f/+5TT?Sn%kFo7ZCY 7$yݿݪQcp}YB6.Pp[j]Lh Q j* S@"U(XJ?SBL&p&BǍRec1Ӽ@t!B\&m.;;ǃ#;;˅eY8R Occ#MMMضalذiӦO$! ݍ8-Byy9. ۶+VO{{;/LMM /f˖-,^,M]wő#G3gf" R[[KEEfͺ-i`5~vTuT|t}rvi1Pg=c?#K#Unzg8(lRh-%e(mmm0p}!;ӡ>"cX:LQ/=s&m,7jlN/B!ĕ6Q܃ .rd)//g֬Y̛7 ~>LMM ~ɓ'3c RZH$Byy9cɒ%DQ}ZZZvSUUŔ)S%K/dӦM~zŬYh4ʁ_"9990{+]B!B!Ę&Ԃ^RRw]w@AA4uuuB!Yx1Ϭ[fM&N׿y…gs̙|l_~ԲO~򓙟C<Ȩ{EUL2ٜ%.m;drhF&32I&F] DH`(wz,5 Ji8ʸ\M  D=G0RmܗBXV6Ox% !2MhB!B!U@t!B!* B!Bq]!B! H.B!B\$@B!B! !B!W ЅB!BB!B!U@t!B!*BKo)jIj5y~;;M$':5^L/V÷8-Nui|iE7.ڎ6U!E]&iCq8L.P 5 BA]f!B!-B79|E{݃?x_8c?ڪyI-ϟy|'hάi<$/VQ\M' ~ O!B\$@B!B!8@?tM" H38Յe&I:;; Ù48g4m,ˢv;:>LA (RDJ")VbGI:/%\'g'Nyω,;%[Q&,`  z0?9HJڟg=g?AAA>O4=t:"PɄB@$(( 4 @ @(Bxh4F8@$ᡇBRZ`0wa~~ K/1>>N$'`xxcǎP(ذa>?Nkk+tttpiii~6l@BBx<{1!##qQ(ܹl7,< ;vѣ 0<>#ar'ꯋ^k?G?bYAA&HHwstHNN Huu5v0 HDaa!v2337ߤ}kףͥVIMM7G{7@VswPPP#GFl۶ FGGybzz_Wf͚[}:AAA᪤9y$IwE2XO.}\tRo߾lP(BʅB!= R}^h4%D$ g `RRAU("VڅabV*( |w![d!I\AAO)Ӯ]tpp`0,zFu󉇸hy睬^ecb^tKjq'OA|0-aDcD;AASC (A􏓜oa*++P?{.  Y$%TTp_4ssϭ AAAKBt   m@   p    D.      m@dqAAAL$T*$]oW#tAAAA0^P(D4]7׋Z5"@AAALP`jD""h`})   uT*X,p8 |лxAAAÜ;wZBs=.   7BB,EEE]^    O<&))H$ˊ]AAAnh4jb?|H|]NAAA+ID XU_wEXXXr}AAAϥp8̲X'x4b\innnrAAA\mĺ.(   #ʬ   m@   pehIDATAs(T*Z bpFs7SAOA 9P(P(HD4EP,[4& AsH+|iR)VEp. 3b  |\A>D.      m@   p    YCpVo P(PA."ET٢D"BJPR$醞CJ,   J_vF_, V RB" M\S՘L&L&p8hp8|ކc5%I"..F}!  ­qtBq$IHt7닋8L&Z$ DQrssh4u?ǹ %V-@$~?F3zh4/;$]^z0999t+K4.|F t:5]$IBTD=h4z]  ­#jQ(>۔h4J{{;7±`  j =$(((=voh<yݬkq^~#|.n7ϱa*3[*4yY& pRϗ/^Fat:5^?nE$v/oc8hp\z">Ijrh$Ib~~"OMM yyy}$  ps}d~.]Zf֭Z@ @8{e $hD"DQBjz<ߏhDT^5;{,NBѐߏZ& '77BB 7PHmD"ajl7*vc4D"lٲ j644K/ggٳg333zV^ώR$˟>aZ-333ݻ,dlێ9,+W$922‰'Xnϟ'//p8L$A\1 v  ~|NAAOCP(ѣGٲe W`00::ʁzIuu5 }zx )--̙3x^6l@ CTb6f(JFGGy]q:rpT*顧۷{nV^Muu4:FFF>rvT~?8͹sؿ?V@YYV $IbqqZN' b 𥽚hf444MBB<*A0t=pjF||<;w?l& #@gg'=Kt 1??ρ%--7r֯_dB!qs]Ph&ѣG"== ꘛh4J\\<$$$|ml~nnExIJJd2r8x .oAB;Jss3~|Y;Fbb"III122?R_:qqq,..RSSCRRN333Cqq1* FFFطo~ h4LNNt:)++cjj`0(;v\5  pk|_Zͮ]hmmg3==Mzz:>Pb fnnC=DSSo}[ٰa={DFF|;;;VHvv6.\@V}'N055%ߠ044"CCC{z~?w}7LMMx衇hhhr+DDR{njZ #ٳOrsss;wa6l@ff&rj*%%%;w^gttD]]X, u 4 :SNu ƻ<Q*444pI8s ӤŠ+(++cǎemfz{I#++ ,;v젭v8x psq%&''X'P(//BA8fxx* wf߾} xʢ@ @MM 333jyZ[[`0裏F$f3lٲA^/O</^dxxxGp8x衇8r`sIgg'gϞETݍjHLAA|Y$!??gժUry$h4m6ihh`nnÁ^21t:RSSlt: 76 G__>1|>FHVP f#99Y)r df|['@__uuu\.&&&P 9Ȼ]IĆ oolcb_l6f^|t:ٳg x^<tlc$ɓؼy3YYY:tHJJbzzJEZZA>yfs֯_Orr2^ORR###}v";voʢ_J233'33:ك$I Q(XVL&$,*%%EN(;h4σb`y˃ZOmm-w}7yyyg?`0PYY$J^fkZv;^Tz= t:X,B!=مWՂXR$994֯_ɓ'Yz5tww,?9v8v޽lRKʯe4 a6m<]]]aZ)..ĉXB~ۗ@A,[Wlo[oO?RdX,y^}||~_E^^CCCK+Lǣ)**_RXXH ?۷v222!33~VFIbÚcc~χ^#;z>#o$xz4 >@ ߌǒ9)TG]R->KFQT4 $%%ɥbΖnY4h4Jvv\v1nt:FN J%nZB;Ku'/ ɣ#nui~VX!a]`0HGGiiir:??O  %%e٨ؼXX5ۍJ{cm.a4 'lҤ,a \l$KI񐒒5255%/m6PۍBh4ʟ%JE$GhZ9<\!#vm]bעǮact|B!z cƮzNAA>2@"$Ql6^ϻp8(2//_j~rJ$attBA~~@§%99Y|$%%}h/G˧fȣkbs^?5 fY[(bzzS%Z4bPRrn:bE   |)t@ E ЕJᾗT*: ! ogsx#Ć2c  K   DAAAۀAAA6pɗ"q    8KK , cnzX6kM}~"j'' Rni`0(jAܬv+  >~?jZі&=aXP(Dbb"vf8|~}h4t/~~|>5377der4enneX,[)  M266nG6JbN@ pkڝ0 P($h4J$AT\R*~^@a>/=Gucy!IҲ6,{RiOQbQcm.泖$"K? CŖ][AAϧb#GQ($1>>J󑒒rzbzq:ǓD__nFCvv6:RSS1 tuu!---,,,T* ØL&?NFF;wbKX@tMt8fpp9f3,..233CAA.ڥ+]KF 477(j@~q>_|;crRl6Mrr2`v;W<$뙜dzz<7}Ch4(e6k㿴]~(LLLD0Vm...244Dnn.Z=_Ds!11+kjjcʕ=\AAn ;(_WINNe?4@SOJ__7`SO{n'?zRINNϓO>+W{{_56m" K/QSSCgg'lٲ0?O)))r|;AV>- Ë/ȋ/Hjj*>!^/ v6_+99F|~gqqaJ%qqq\.222p:ϱO[oEYY|;ARH$dff"ICCCT*B9r֭[1LZojj~|;d~~h4h$..;wxKww7J 9XAAnKc/F ɓo6 &33$.!joo駟'xBHK(;6m?OkOj*'rss6L~`2P*?$++ ^fggWիh4\p^y6l@MM ccc ijjd2!Iv1g?---1??Ϗ~#>D"h4G_֭瞣.~7~~)))wҥK|')) b <^۶mnSO1>>' gW^ᩧb֭Xckz ^WU022/KƘ'.^uFGG/` ??!  ~ٺu+ꫯ yGTEII uuu ?MEE:j)))aΝ|ߦaqW^!33UVvvV=쳼\~:tvB{/(  |FʮYUVɣd5 ~2k/!33`0xCn0p)ft: D"|M?CӉD"efh4HFARFףw˟ɟa$IɓF:::8quuudff'uuu̿뿲f:կhll',ĶAӑbgy{>~~Fl6GeժUB!~7RWW?o͟ɟP\\|դ;ۍ;H$aڵ̰f~ioayqCAAωبXlxCtݎZf͚5 #`4?4ѵ  j*~ӟގJb͚5( o fgg^z222{bǣhHNNFʒkm޼T9`nnnfff N]vqRyf(,,ua0'338QTTTp9T*ONĦVwy'QRRڵkYrPܹt0TVVhXb^ϽKee%aVXAbb"{Bt:y].HիWhG%//24 jh4YVKzz:֭b0;;KII fY{7Ir TVV@jj*'Dzz:UUU255EJJ ?'RRRAAq\B& h4zHsssR$1;;+ ^Ff$ ߏ{yX=~ Qr=Xzy)AlK{Qcb= Q(rOX}>? !!??I4;Y/?PcϪ$I|>6+3w,f$Ib~~шF}]Ė-kϗgɓ_D"牋GtĄebX>mΙh.-mvݎIAA$IbbbJh\v-INFn_Hgx~L&5X-V{ӶET~dO߱" 07t=n*caj8Nsك2+&  |̠:}aaG4e||zS7>ò}R^Jv033syk `Fr|OU;Z(n`0(/`0H(  zqQZZzS7vxZ4zxSV`0|v|qv fD"lvz$$$MAAnO]w.6'Zl\o\&|^Ī\.zM  ,%>"! 0͸nl6䬳H$hdbb&J%fMcc#388HCC|>F#w@8l6ۧxPh4iii!`p\\t χnJ?^ mmmL&9Z H0n"fN:;;cD顽VVD"\t(JnC;;;  ZZZhkkc~~ 2=V+))鶝k'F9.]\u`ddZ-Fv$11h4JKK ###,s%#Gt:III)r0LdONNfrr,vfbCܯ6hqq^/vP(Dkk+vT*1 @8j255ťKPTf"ܮ- ZI.]Bb|}hkkO|$6h4ny tttzILLԩS8p8ETb2hhhE||@URqq9x ( z-زe 244ĉ'ҥKp g׮`nnV+SN1>>΁Xr̙3ٳRf`0p1^~e6oތNq^z% 8s tvv@aa!_`^d"-- R,@_XXCCCrR|__===jF#. 8###x<*Q}bbN&##gnN8Aii)*F999=zG @7xCmm-(e4===={DnnMW˅lfnnχa~~^&nZIOOj2<.\`XV1 C{ǡCؼy3d2a2XbgΜAP`^޽{r1ٿ?P'NP\\LKK li~!jjj ɓ<ACv1F$?SYXX`˖-|> ۷LqO$azz\xZ-?y뭷p:( ^{5hkk|>Z-8Nz{{IOO`0oz9}4EEE  ]p XK.a0HNNl6o>rrrBFF&ӧOhHLL$++bڞB?Ǐgrrn~?[ox8wWrV$ @?<۷4@Ar%@nh4Qlٲ{PՌv:j׋$Ih4t:`s<vXo0D >Uoz-, `1rrr?SyX\\ki&un)--__Vzi'Xbv{r! Gejj *'|;wR]]Mkk흙a||aÆ r͛7k.F#?8jI0`&&&Ba;v 99hBT*^/jBJ"~}k444p9 jB!֬Y|0eeeL&&&&t ^\VAAuuu9r\WO`0H  G?& A(bbbQ'--yzzzo@c^/ EEE|i***|b0D"199I?pڸ;(**bݺuXV6n܈n`0 SSSLNN2??pEqɄZ… D&$PTHgΜR)ߴGQyInnYYYLLLpqHIIU(l6ω'!--tlقnRbfFiooT3::JWWLOOxCh4JZZ(J222hii!77W~0VI||!FFFX\\jjjjX/sNN455ۗ Ǐ#GȐ>r> RRRd׮]>C:N> EQ星gaaVczzy$IBT^qm/(( !!R~a4 Pydp)VZEAAJMM :NdA!tttRf~zc͚5`ZikkcӦME{{;s=( \.ׯ 155<@AA$-➑,.]v}Kwtth&99h4ʅ 9)  dggގ$ƍ"337Fvk.L&h4fgg`ffVիsNy~J"G0bPZZB`rrFrssyͥȠ~6o̪U%3%772lL&QՔqQRRl&;;JFF*z|z}}=v"??@gg'۶m#//ON·zj6l@NNcccD"vڅBn$...,]r8zj5Ӥ_׹$q*Jްb RSSYr% F#*bZ-lڴ B!'ZLOOTKZ&++ NGrr2F MMMvnV+WMn&|rK999X6rssٲe 999ٱc999۷SXXᠥ 6l@__(J⨬311;fƍYjGpCb׏L֬YfcvvBYYXVV\dqqbNV+===hZ:nNիꤤ$z=ϟgrr￟|T*\.jkkD"ܹ{v!t:%))Ifc4%33UVQVVFgg'$CQRR瓏Ux  \2]bC}>Mxx<{e>==``0p77ɹ՛w|YGQƮK`0ȩShfq/,s; D" BWpFuҲy_@ KD"~"Xۉ|"H$rczDz_mXOsוy^/bnDAl>4{RR}}}׳HBB\ҥKD"f3\pBjeaas1??Orr2;wn<HD{{;rYCtwwz1c5 ]]]444=W ?^x<\xNF#FX,ro磮B ӴiiiAL8&z=:FINN&syh4P(8V+?PT~_KIp8ÇINN^6v4 ϟgxxՊVz4 FpDg``J%---b6stᅬ\VFFeq|{$K.Rp̸ny&''ͽe?L($/^$++#nFFFWoIvv-oK_m_b.6jcddHHH 022B__: 蠩iY[D"ݻӧOxQT۷iٿ?'oosVX,W7 D[[&h4癝%%%@ @cc#(JL&466ۋVEɟxj5ֲ@RR^:HLLzt:9w$&&m+>CCCjqݘL&tl^vvލJŋ|p8+Bbb+|ԈP(oAcc#EEE099Ⲳanȣ9z-?w`$FJ%VYΝ;!11O]]埡qjkk v<LMMhoof阘P(D||<311!f۱Zt:+5,JLL$@OOCCC<0vcZ/cZoʨ4A/ϒ#Z8rZ,Z[[Gjj*/$I9r"x Vd21;;˩SfӦM77LMMq555:tڨpY;{, ;;Kcc#sss@oo\].A{{;* "qqq 288"6Kihhht~P(8r?Gbٳ266gϞ=( N:Eee%*jY|yV+7e_].f3::ʋ/joۋdp,r~a<LMMaZ&#If\a' zsV GRvihhtbۗ ǃn' J?n`0$I|>J%JRn aٸtO?4YYYfjT*ikk/RUUu˧~, D"nfff8x LLLKBB/giiitvvr!.^h!PT( DZX,z Br /@4ԩS0::*⥗^bݺu:uJ~s]wꫯRTT(.]b~~7$Iѣ ihhvl6@$}v|>===j*YXX7 --K.8~i"zK/Doo/A.{f9jkk1ͤ|AT*~? a2$>N"77IlLMMD$!..Cld2B__vzzzd2줧ӧOj*"\`bbw}Fn->~z{{y뭷ضm)))0::nrE&''lk:utx^ffftww3==VMfvilldbbxPþ)իW|Ďeoo/z) b줯P(###vFGGg||ټ!"{E0 '''Fa]ww7=6STT /ԩS$''S[[˅ KD"N>Maa!/;v\Ooo/afggywz444P\\~30Ǐ';;CE{{;@vލXƾ۪)**_grrzz====9rzzzl<3HıcXj<󤧧>$Is=! u()) Frr2jD `xx\xMKK <@VVuuu{$''{Zfݺub{シ;] 0@URPP@aa!uuuQZZf͛75}f3ϟg200@rr2rϐ`^O}}=$H^^+V =='ORYYj%_ǃR$55Lpׯ'.. J%###<۷ÇٴiTvyFF o>~?mmm:uy}]t:ǎ8v+VW_nSO̱cp8FXf8qDQN'3gcbbEZ-޽;wR^^ΡC$ V?+իl\. ?G$Μ9êUnjnXp:⋴288Hnn.299INN=B!`줹*y0CCCLOOD(BVꫯf9@G?ݻw#I'Oj[oDx֙, )))tuu1::ʱcHHH… \pA'si&&&BVkQXXHww7tvvŋffftR]]M _?nd荍ݻ:V+@ǃBh4299ɓ'GSXXȱcHKKxKKK\ Zٳg B,,,P^^ξ}rÇMOOiii8pB9z(ͨT*;磾Ro$Iq=p9∋jt6o,%+Bss3MMM$&&իILL/2;;tRZZ믿Nnn.0??oAII 'NAp===f9z(rO|\\>}lˁF(D^z%t:+~^/F~+$I;w={rʕ+凉7|ƹsPT8pls133Czz|}mjj044Dgg'vbʕ>|ERRO<& 1>>ΓO>IWWӴo} Fmm-Ӕk.݋`'|^&''ikk~HJJ̙3QPPc=޽{F8N:;;'?fƍ8p`w]=Jjj*֭AFFGAӱf %@9p{̖-[xwp݄B!S$J\JRRyM]]]x^V\ɓ'o\.D"T*gW ٽ{7]Va?~h4o^gqq!oqw+t:YXX_{!++KϺuXv-o||bbjjjXr%V۷sa>L4 $Ibddy ԩSkvvaT*wu?06Gy^/r^$!OJJ ###7^ B ַE${]cַEgg'OG}_͋/²$a$Ik_7}g$!99|^{5m&g럝%xPTڵh4ѣGGVVEEE`2زe ׯP($ρ|nm4fq} hkk#  J%EEEnFGGiF,..t:&|AoNII YYYlذH8f͚5477s Q*xtfBVZٳgq:aill;GdN֯_O__cccTUU177"`0!--{ǏPYYI\\+V`AN@)uU$f3UUU y瓛KUUEEETVVj* $//rvEKK on~FFFp`P͛7S\\o}㒖Ʒm򘟟{y8wPߏf_:uuuDxP(ݻN~aoߎf#^E"J%wq[lattP(@jj*deecC5= a2HLLD&&&B8N(,,7~7䇋<ˎF.L&֮]ˋ/wAII r<pXfcAykk+ɔžKDUU={%rssD"899yvu]<rIAڵkyؼy3cccXVqhjjbڵ< t:)))ppwfjlܸ.~kLjj*>(W|jjjhkkcqN۰J/R`0BXvkcjZ,FLJFR5~VU JR^χmklع.77իW_q# ZKvl63000iii8N84$$$w^.\@II AEEE<8##^r\!(|ZoٳghoogxxAۿ[F#&`00tuu1;;Kqq1`aF^/?񏙛p&&&bvvVzF`ttNBSSStuutVVWjyf|cccX,,;69:'Np%Ѩ)..رcTWWMrr26ljRUUlj4\إCfabb .ܐ@PP066Fgg';wĉ΢Yb(z:eyb/vN'gϞ󤦦Z,-3FVVeB锕/c8y2339s;^p8Lnn.j֯_υ V}}}ʕ+^mgĜ9st1dff211+ttuuhFVD8r <yyy|>.]Dgg'hƮ{EV9w_W@464i_lݩTUUaX;b||rmٲ7RQQ8l6|>4O!".FyTjj*k֬bp]wb hooTYY===ri4yhhhbm="IjZ[;!ӱ@MM<"8E("??$ Rq@n1nN;)fqqs裏R[[锧2Fm6N>M$!++Ky=cZijj"]TRVVF||>t{bb"FTVVRQQAaa!UUUD?[laŊ\.$I" QUU^'99իWSRRI!ɝ;w~K砏`6'%%6L&|>GVVA4^QQA~~>6lav%ϱtyrEED"v!X,MC$!!!" tttPTTĶm̤bgddCii)6l@Tm0HNNf``1rrrXz5)))XVV+rPcʕOVVb0HMMj[a90 ܹll6CCC{dgg֭Q*xeʕëX:YYYn'77UVG׳j*y}ssslݺ)))TTTx^eVP($ݺusss͑륷 ***6[mmmr{}g;em,77T0r>(wTZZ|@VcZy( v;.,Nv;:7̌|-HNNFV300M*}}}~zrss`0}v233f=٤wAyy9yyy" BnvIJJ ~zV^Mnn.ccc$&&m6G;w$33Dغu++V ''Gڼy3999n(?ܡ222<@ffSq9"=;sϱcyR`'N0<< |#iӦ n;FGGnߕI$̙3roURR۶m wR}ddŲ, 9qn:ggg|zl6ۇ?6f-+FZO_$r} ]T9+6]s _:AO$9O5333ߴZϱ~\#咳nɡn;ؼ/ I~f ۷0RpjGQX,zI?-}ǵزW[Ӽ]h 6Q8AA]bkV+ƮFQZ<{0v9S'fhhiiERRN'NHJJ .gڊ`bFmm-VUz:u8~?477DZsEm 444P__^GS[[KWWaN:E}}=L&$IԩS $':<>Nihh ݎhD\===>|+V\SnIKK vi1X%&& 9w---z, Ü}y8ə3g듳$dq_:}8Λv bY?ʘv~eqp :u ^` .٨?{#_O?Y9)AAh>K =zBANN.]v;g?bp! xx<466T*ILLq9&&&HMM׿5rIX9r'OhllKˬ]xQ7j09r:n===,..rAW_%%%l'*++q:曔JKٳRdɑ#G&99Y.믿ΦM0x7())3322Bii)G?"PYYn7|;ݾ,@^/gϞ% X,+'"x"NGKK\tJ||Kl۶mfD7Rd2[[vΝ;_ذa dddpwhضmܓ"gܥKشi?8ꃡP(ؾ};?fp8LJJ @.==G}J0$qFV\)Oww7TUUFjjsN6oތRp8̡Cp:5oNRRHJEee\W!V^MAANtri6n( Xn)))l=\8 188,/g?cxxA^z%x?)###JVV`>իF(J, np8,a^/z^{yr@sF.I߿__?~SN/sy({uϜ9Á_ yꩧhoo7ޠݻwsK8/r[6hxxN6l`@Vˉ/G"~mٳ8N~?oͨT*  ;PWWo4կp\sY3  G`ݻwϖ-[سgNEx(^~<h'Nnݺ+155c=w܁h{ $)))lٲCJJ _WQT Ʈ](**bժUs=칱cDF\;v}Gii)7FQN<0_W}I@R=В$RpWmK7::Z[!''n^/&ӧOSXX``֭D#33rxE"y)--x9RSSIII9F#[n%''I[o Q҇):R=Jkk+UUULMM1>>WdD"HDcc####x^zwImm><  ?sTWW,Ť255,,..o3;;ڵkq8޽Z8qk֬A1==ŋt&.}+Wry222ZzǢ(O=$''t:}}}!kiiaffkע!ccc444܌jr0v9<###_HJJ"r%ijj" 299Ioo/ׯ ))+VwMaa!yyyLNN2??O(٫qqqX,JRDT^np1~_5:N9jYXXc۱8N|>MMM rҥe bYjkkD$.^H?MMMttt066ƙ3gn>GQT*!;;[>1:`0HSSEEE$%%˽{EUBR\ZZGcZ咖>Fxx_fN:!==<$iiiܹs\.VXAZZl۶ @FFyyyvAAn$>>G||qFj5hZ~?}}}ر$`X.JC=J-@BB^ ddd`2X,jF#PtFGGh4L&(//yڵT*z{{h4ܹSNjgZ0h4tinnN$i|>7uW/eiQ:uK"pQFFFFuVDz4%  sr'h4Wº`,A"I~@ C%I" v,u%I"C̿N>:nUmh4J(]s F`ŊH/|Ӷۥ-AAϗXliFPt^x^BЗ?S#<=Ĺvq|>3p=iIh[__VF[AAj5WDhV+ Y/wB!_GHq$&&_f  >u  O=j(=.K~Yv˥bX.4~p8 * N (Ċ eYܓhnn)*`0v;F4%)))>$iiiqap:dff200@uu5P(eqѣ2HDzk4.^ɓ'q:8fgg9t󤧧@MM rK.QSSnl6>|ݎޣH$fٳ;wh4Jbb<$9 r9Ν;`@sI$sQΝ;ǥKGTطo DQv;={ORR BoMKK 455111Arr2/^D,a׿5uΖfqѣ(ׇCTG}}=O,=gϞ… fIJ~#犏255%nXa0hkkLfbbۻ pazq8W]СC?K.HWWo&~`0Hvv6 wy<>]]]$&&jjj<[GGx0մbXP*677 _cN'fttTTlO>MCC\m㗿%$$IJťK%;;;\p%gt;Fkk+IIIhZ8}244Çq\@ƾG8|0###ddd\uL{ltt+LOOs.^Hgg'TWWsIrrr0ꫯ̑#GAmm-Oŋ Z-Gǎ˨ʇ8qxL&`Z/..sYf3qqqR]]-qpE]]7* g=賳qjjjhll__gjj_רT*^z%xXXXɓO~~>39938z(O= ri4vc2x.>|0F$I"vٽ{7NRIjj*9r^ywޡ3gp8 jNs=Go033믿륽{M$ÇS[[뭘GëJ4EDx駙daakFkk+P[[ѣGQ(>O}\.JKKGFFF١j/%bM??g||^g{{uYt\86nؠGcbbbH$&&&$!!dZV+ˣJJJ󱴴DII |>Dž r@2dggz χlFSVVGxXZZpXLLL 444LMM SSS3::Jyy9CCC8HLL9vwwe666"""Bp.,,#zzz١>}6###ܹs+Wo륨^UL&crrNǷmz=||!77^zYZZbhh艛#G/c0mDy9wjDBTT/^D.1+ddd JH$瓙)DdFGGɓ~j5r6t\|cǎ!Ʉ㡪 T*yz=>TJNNDY]]%##Lss3 \N{{;r"ɏVNVZb͛x^] nhooSqa^~eJT*C&?ϩS *NbѣGciii"Q*~ʘ6}]vww?m\rMaS^PP`Dj ͛LNN299ɃѣG?GT*'O@l6r@D8--'O~d-\\\D*c}}?PdFff&( """ %,,=^cff@VTss36 BOOϟG&~3N'%%%reeetvvp8\p_~:;;III."^ɡׯ:{{{šƵϟ#h8~8"gCHHTWWс`uuZ-NOxYHOOvc4w199)xQQQ&w?v;7n '''NwllR~~K0vE""۷x<,..266F||<ʛoIQQo`2ŋ<|P?@]]ǎCoVH$''SZZd"))loo#q8f^|Errr離u^ba{{k׮q9y&n%FFFG&qNgv}$&&Lww76ǏSQQ0< Νcee/F?6 H>j3gΐz4bbbfssS(#瓖|8qDB[[nz^CIe"ߏG.si^x,ˁ:~ZPFRSSIMMRەJ%/2~ozy!;`ffdLOO3<<b癛cuu)^xOdHff&jYT*p8h':5~?/^wr1??ODDZ">($H Ai|TWWjYYYĉdddSRRlnnr)qmmm=z`'D¨B$=z ^#~T*666"LNNrvvvp:1<<,_x^>.hii`0ϟcggf9wtvvb6355Egg'.@ӑFˬS]]M[[QQQv`zzetww z{{;ddd@dd$< QQQSZZJ?O{>~*=zĿ˿`0X]]eii"*++Y__LLL ˱l?h<55R3ㅔց;v NGnnP3&_055,yyyhZ9}42W7˗/Ӄ B (i1|>Dii)QQQrʕyge {|>K]]Әf9Bvv6{{{BjCj9r/V%//8:::0̈́vVpx8bIDAThZfq1JJJhkkƲGgg'bXx8&ܹsx^/\.H|4 RQTFZ-!H8rUUUN~~>333HR=Fƍ OBBMMMxߧ ʕ+XV싔 gKoo/><0z{{|~D" ڊjE"022H$"33SnCCC.L\ oooc2ctt.xg͛T*ữ_Ғ(Q(H$P A K63 x<L&~^OVVdggsIf3III ivC'44#G tűs=GRR&q:8LFhhzA0& KLL JZZZp„=aaazF#dffr!N8L&cmm VkZFP_FÈbؖ͑Fd2!HHJJv9rgϞjyjl6\..]dt:E ?::&:xRSSH$p|*M'j666H$=a4"++Cqq DFF+MMb1NH1G"JQ*z}hx<`6pjZH3NIIacc /p C.b81t:F#iii¼9w>˅l&>>DhhӾ<$.,,8f3dgg"qqqh41j/M!!!BcǎR_d{{}sx<| 09r1233zX,rss9{,& rrr[[[rassSp~t:9t>荐ΥK|BJT*%..Nȸ2L|>HIIcZ4$$5a l6X,FVc2HHH &&@.Czz:D"^z N*2W^yx!++Ç#ּ ΀˗/KZZ>}Cn'..>NXX؁gСCB6@TTFdD"J3gMw&..4D"|>r9/_d2ٳDxx8DGGx ] 111ó>Kff&loo /<F3A $ȯ"If q" 999_^:H􍍍SA_^^>9ΎovOzp8= RZloocR˶ $H A>+?{TTTVVhjZKKK|z(//kx!300@qq1mmml6J%222Bbb" @)JKK'**SEr9TWWcX0LX, X,$&&ɣG@PѣGDFF vܹCWWջF<111BJ餾&j5*JINNz544AXX>R0Llmmq:;;Bݾ>zzzwvv1LP(dl6~m;+H.Ӕ1::JTTtniiF|} rZ D?ͦS~MX^^\#444V"::.###\vHbbbxԏd= PVV>xUU555 `o6!!!TTTBjj*2*++֭[tww#HJJsuqqwݍT*EPUUEKK ~(ZZZxmmm8N?9ӃT*}rkkK륹:BBBd||vvv0l6d2!NN2,,,`6qTTTETT :::A $׉c t:x^RSSikk1 DFF[oCii)ܺuq:dddjc{{3gΠT*١_|\~@_ZZB"0==0yyy"<.633Cxx8j룻/6sI(..&::$~?\rǏCyy9ϟ'>>D*:۷oEXXŴItt4JE 9{,DZÇRRRB`kkq ;wx4 K.!Ʉq\.~qQyFGG9|0o6ǏgffR"\.Ưq}yyX,?~]wǎj΃!&&z-N:$ͤPTTD^^r+ck4v;uuu"˙&228V1 e 0::^b0>>Ntt4󴷷Fttp- ˌ3<<,4֛ʕ+ z=MMMhh~qx^r9.V/2<|XS(TVVӃ^x&''Qtwwp8z*ٔkpdd$CCCnFGG@PсV֭[dffCyJEcc#[[[v&''*!!2RSSfooFllG.FFFZz`0ߏjw!##xA>PQx뭷̤4jA-,,GMww7ssszJJJx Av;*y emmz~^z%l6UUU餦 v*ƈfddfΝ;GBB~5T*oĉFCCJa###`t444GDD,--AOO2X\\$<X,gѣT*̙3r!sa4Q*d2=Jjj` ɓ'jT*ApERRRP*BͲ㡮FWWT*Ν;Gxx8~DBjj*Jӱlf"##ikkCTT*ihhCuu5ǎ{bhoo'<ȎPդ011D"}}}TUUd2>>Nmm-}}}\~geoo+Wr줺Zn١ VKLL zׯ2ݣ&L&kpp:_Nii)匏su<J r9јL&tr_u#Ji*** ceegFGG9q/6=*++ۿ[fffXZZBqeioogkk_|'N000>,/+RK/DNN===LOOs.\>|W^yӉbamm VK}}=]]]f!˹vCCCTWW)//gkk ^hdkki᳋T*^yf3SSS,//#HHH@ףj9}4`2DDDpmp8lmmP(466ׇcǎq:;0<׮]f|>r5   JQ!299pnn߾??`٘$%%˗/#JiooG"/BOOsssK\pqW_eooOp4;::l $%%elj<}'>ǃT*E"rxKjj*333eǏsE1p@Vlm j 'NB||PH`0`2HIIN6gySNP(HMMOOy7r&V+cccLLLߏb:{zzX,nBBBcpp5kÇq:LOOSXXȯ Ummm9}eBCCygIOOg~~#GpE,OF|bcc`0`^#""B~X"HHH@P0::ɓ' χ\. s@& R1wD3ϫD"A*  $H AcߎLmm-"9Ν;G^^``fddt:yBdkk+'N|Ittϭ+..? ~ 3<o&''q8X,^~e!C"pbbbJ\pxNb)//guuF蠯 >D"&''9z(ÈD"L&P999HNt;qmmmܸq$V+SSSG?шfkkK(~:mmm瓟OUUn"##'N~3$ O&""W244ӧ9rEEE<|#Gp)yw0 DEE1??&++;w{`ܽ{0RSS١IaH$LMMQ__/|6!!Hob!%%B~1??vΝ;|?>BBBHJJ6\.sssS[[Kll,III QT<3T*8r>l:~N2B)VQQuuu$$$`X{{{\.:::xgʯ_~`wIff&`6deeJ 簰0ZZZwfc())#G000X,楗^lfggywP*;wJŕ+W:t;wP^^ѣGˣwyXΜ9jrYqㆰ8y$555ܸqLR)---LLLP__̬ $H A>f ye" tww@VVqqq~DBTT,Djl6 ER)‰<.6>>"H|R666P*T* 77RIGGnٌ````׋Fѣ2;;X,&77W67999d2:;;q:( =jEMsN'B:&ǏvY]]%%%H* ڢDBNNgiiD$ ̚`xx4b1џ@iBjj*SSSBsVVW>Y3 LNN211!rHKK#22.vwwJ>|Xh633#ȨJ.VVV@"099dbiiX, 8$hLll, "A.ҥK<3aZILL$..NH 4 Ԍgee#ZVG{{{ F@ddhD"axxh.8Qsss3<<%''qIHH 118q5y$[[[( X]]=Р2446ﳿdbrrR0III!..mfggnsQ577'ǰX, Ezz:.Kp>֮QVWW9|0* '992N<)dn'##H&''llXn '11fffHNNfeeBVevvVX, . ^< 366X,&<D@r}> $H A?D"ˈDOeKE>Ks\M>E4beWs_G>yIx<\MLN-}?qv?kL A $H D"Ѐ=Ѝ5Љ"}#S~7*nrFR$H A nw`^/[[['$U}{xLq\?;c_nSoma~677q\lmmT}s_png/* A $Ho&??(Z[[Sf\餠Gtt4 (((`vvV}=t:ρPJ a0 d2r94V\\ܺu5RSSZ<|fd2Ѵ 1fqMbbbիtttR=Ád"TTTP__ZFVS\\LKK x^ p<<`hh&W^FCAAuuu`4tvr9[[[HSSsssQWWRGA*zikkC& ݻ(TUU4uuu Ohf#~~l5hooGTNMM XVL&}}}333C\\+++\vN$ 444P\\Ltt)ׇY]]]hPXX(Ja&j&Kkk/=cppшT*ѣG֢hPTЀh4~˼ $ȯ@ēܝN'#я5WVVIzz:g?#&&0\ӧ)))d2q-gww\bbbrJQQ/^9r:Zy!`d2VVV0LNJHJJR\\۷9vTWW /D"aggnݺEff&]?FBBBlsZ-8vzv;cFCXXsy@dx<\Bnn.׮]crr{=V+**bww%fWP@ 44%zzz8y${8~*,,$::X~:Ofll>̽{8y$  C]]ő5 ˣGBz)++c``0aaax, eee> ŋf100L&z{{Q(TWWىNcwwf3===T*^/N:q ۩gjj Nl_W7зH)++cccDkk+ b۩E,V)//eioo'66XjeooOD?F$qi~uttj%::ZAnrzz|>TTT 444Q*444Ԅ\.?`4~~򓟰-Ȉy^Za2uӧO344D]]$''Occ#<$QQQSUU`aCѣ)\3@`b 9w^H$F;::wH{{;.]")) RL&kE{{;jvwwd~~Oxx0::Jtt4Ru8pfffNcffQBCC)(( ??p!BCC//vZZZJQVV0rQ"<>nL>|(Hzn߾Mnn.i?A $g1?6GVV2HAŋHRAKDEE?<Ǐgll0L&>Tv;:RIWWhZjjjhllD* '22vz=twwX^^ofqqMbbbiDzz:'OgHH^ˆ ??8BBBjS \.誯C+++fD"455 /h4d20 tuuիWq8 p8rv磬6y۩߯_fzzJ ]]] ֆd^HNN=Mrܽ{u>nիfZ[[immxDAAzVVVlKwTUU]&Q;w`0:, 477swܡ 9{,gΜaff>s=r3Ϡh4<;H AX}ggk׮ӧ)**baa1z{{q\x<|>n[r:ArTxqn77̃l\zgrMSWW ޽{lll0<}Lw~_TwOFFG'''ZdܹsfVVVj"P*,..O^^ h4jkktEEEdzEWWkkkp8r+K$F$133Cxx8M#ɓ'F"xgHNNfnnN>Mvv6)))3nӧIII:tՊL&#<<"""@V Ӵ4N>-aQQQ?~ݎ`ܹs(J!رc066 sJ&!xHIIٳF, DXk766j:u&*ӧOsȑ# @*Bvv6.mR)L&N>M\\~Z-\>~w~XLdd$?> ׯٳgIOOy7>buuӧOV%**,f3b~?^'D C*")TJHH-D#y!l$H A|l>??300˗^`yyrBCCʢnsV+W\akkW_}VN>X,&44X"EEE\z^{!N8;VVV,,,Jee%ttt+N88zQ! %%XVFFFh48Nz޻ȥKdbb ~?UUUP[[˛oba}}]BMŋY\\JbbPxy'~J{Gxx,ko߾9D"hnnw~w(//G?푚4~^z 70LH$A=p~:CCCdii TVV2jz=q |bb"KKKDFFt:°lFVVVv]0?arrJll, jmdB$5!!^0T*RFLL R?==:X6771T*CaZ1lllB &&V2J0Ɲ( <A8ݻwt||>*@_DŽAZZ>O+J9sH$"--}Kjj*,,,z\j2==M\\M_Tbh4"bii20::%55%|zt?Đ>SSSB<0.D"d2 33TJoo/^TJnnְ.H A, }>6rو?@y/ _MA@:E4111㡤D`IJJ⥗^32&&&7xb7 ^*c6y嗟J@g>DIJJ"++i/P\\?666@dd$`(onnRZZʷ)H A0KRRҗv"}N'aaaH$bssSB|S)D8!EjjZW{ߏj%""sj4ϓ@]i:?)U拞Sf=ǟ_w@ $Hσ@iX t链(м$x<|>)7oʸ?y\ϧ 4x$H A|1~$~#Sܽ^7&]"|tj <zlll|-Sn{ڧqOsn7+s<}*(_Áb~|lll|eI~666p:OT~!fԔЌd{{ o2[[[LNNr>^/sss=S$Ho$??((,,djj8BBBڵkB؆߿n'11In޼)tv԰Lrr2TVV"Y֩Jbhhwׇ`@~vAbILLd}}{e222X__#ܾ}(o6F]z-zDFFC***!>>^xCjkkQՄr=t+**&""۷d2a~F[[>D]],--L&n#˱lՑJuu5SSS$%%Q^^Z:z'O>OK`jFFFs $ <ETTFBBRThD&QXXHmm- B膽R2H)//vc6?SK`|fZ/eٸq}}}dggP[[KII $&&˽{hll$** ݻwikk#""B{cٌX,_~3?wkkk8DEER߹ǽ{ȑ#HRx$$$­[",, ͻK]]dgg3==-H&&& MQTj #$$(:;;)((dYs0wwwy ++M]F]]uuu$''ÇY\\$11޽Kuu5DEEVHNNfaa;wC0KII 9s&? H A~ ~n?"ԇH>@$%%fȠ7nFڵk ۷9|0l6IJJbll H墽K.q Aq}kkVVVԩS" tLTVV"Y>.\6bnԩSD"A:)) CQQ;v=xWHKKC"xHLL͛$u/'N>rΜ9CXXzX޽{$%%vE‹/HFFTVVhy8tnbffLn޼I~~>TUUrtaZ'>>+qq}kkh6NH$"%%" Fs}N>Ü:u۷oGHH`b۩b``z_$h4(**0\.AUU EEE.<```U{9@zR]]墩,..͏cWTUU 399 Qrj5SSSlnnOWWl6AW tJqq1z(**buuL}}=---MUU~P߿OWWsssԄhNύ7r]ƩS顺Z,++cmmEOaa!kt:BBBX^^%f3͂wdd$%%%<|шÇEKK h4sz^顶V jIQQ===LLLpZإR)NVH$g}V\w6xcc#.tjjjsqqq\.=z+۷IKK#,, KEE]]]loo355hdhhM&''innf``FCMM w%** MDD4776HR"""GTTl6a|M5yl\|GãGX__رc^/qqqT*N8F/Ç 077lrIOOgssɡCp`0١UY[[cnnPbrx<ӟHd2RIdooj&~JKKY__l6p|>r-*++t.\p.D"H$ŋzũSr yyy v<hjjbjj'Or]z*ϟBÇeccq>2?RhDRȥK9rT*$&&2::l6SRR˗@.T*rrr01>88H\\YYY0SXXܜ :>>4Ѓ FYfggx"R9"##'::~xg8rSSSfkr9OLKMM%++ QC$q1JB$СCH$~?zǏ"$$n"""0 TVV#T*Ǐ'$$V+Dn7mmmlmmJ{{;!!! z"hvvvteb1~Z-TUU jt:?"70[[[1 z!*0??OII f-橩)d2!QT `0ѣP(ɓ'}LMMz`-//STTÇ_zzH$bhh.ҐT*N:B`wwdFFFC$aٸwBoX(--%66hbbbikk8;g)rrr`ssa||4Pդr1ƘUj`PVUUέ[0LTWW300&ݻwq:;wɍ78t477SUUH$b{{GDii)H%'33ǏjqLLLP[[K}}=~Z-٘L&\BHH.z^pfgg%,,,ƃJ666JKK)++cnnѣGx<ƢP( chhJ^СCs#66i8d2>(Kf\.Ì؈ ""2zLΣG ass (..F#nbqqa|ϣV9|0jZph4JKKzjަ>AqpZ~dlTVV v &pd2ccctww<,.. +++ttt099I?RHIIȑ#LNN2::J}}{ݻSRR׮]#&&&:;;UII }}}paZ->R`ѣGX,bbbj uBdbqqg}ߏ"??lhmmessvZ[[|BQǑ={T&&&|H$RՂvG*b4Y^^ɓ a#0 jt:6 .JLL uuuHww qݔuuurHJJ2ǂy A<>@l\zǏGqq1333ىrxp:Bc@:zۋZ&>>'Np!jjjOLt:ܽ{R믿Ƶk׸x]ǣp---@Խh/?M(,,7~7B[Z?oAss3nH$%666OHH?X]]exxp?~l }+ȠHrr2aZb2CHLLdyy)Mφ餠Tʷ-~?Ry&ozɓֆf#77T*&>RV|0m6>G2dgg * B`~~"2LY2RRRp8vb1dddpAD.{[^^[%8axfggիD"233IKK"Ʉ HDj?NVV)));v L* RD*VV.]dbjj .{{zX,r)aN\.Q*r^|E|M9{,qqq444%$naaa:ӌ T KOOgϞ_IIߏZ&11pߥł`7~71 ddd`6⥗^B&Cւy Ah__BT266믿hZ>Lkk+̙3lnnӟΛo K$q:?EEEܸq˗/ /OY[[#<<\H+--"U Ǐ .JBrr2?ztt4`ZIOOtWW ̋/HSSCCC>|Oii)### w|Tp5._LOO&JzHRoǃh$**jDtt``;N^z%bbbšRwccc>|$$$x嗿Mfr ǎݻsaBBBDHRZ-/+++T*222 @pf"466$le2FfL&Ӂ4@ID"!>>j 6䁿tSYYC* XRRR8y$^_EӧOSRRG!::e}}}{TTT H,!'BL&CՒ.'44TpINN2??/j z1L xY^^pޯ:>b!ʕ+XV^uS*Ess3iii\xݎN#!!) 8 innӂ# 1 LNNr Y^^fggLF|||`ŜN'N"##C8FHHbR^^^xYd2illT*cLɓ'ZQ %%6,,]***'Nra0x\y7ݻvd2ad2^/T*f}YYY?EדHkk`('&&R__ޞpe20~N&uuu|> r\0"H0͜={+/9NA3q8TVV2::Jqq1?<vvv a~;66KJJPoS[[(999¼x<cxWW_}_|aHJJwwl6"""'>>Μ9T*evvzV+F sp>.\@FD"aeeBng\^ A<%D6MD"666p85.Nmt:V+ Fz=N j5 ~VVVrn7SSSx<RRRu@fM׳ > 4$lllT*QT'99\8>! MIIauuu!ezzDBRR"IN'RTvww !44)n7HRư턄Q@-H$bssYÉcoo)R)III(J666X\\$<<\h쳱!ȬnE$H\\2  d2jZ*0 ,//'22qǣVoIII&tmm FD"arrdaBDDxo}}]H OY^^&66=fff9 vl6r9 iNpfgg <<\PON||<) *JGFF eaaauD8$ :RN'u KKKRr Ύn3??B 11d6v.dAt:!;IbXh4looc0^/6xAP133CHH<@sssHfffH$$$$ z*^|L&2Lsssx<r9F#etcnnχV%..yw4[[[QoZ4dі\.gssU9qBmÅWTjkt:xK.`f!JX,looc2H$ܼycǎ/r(V+2 F`~~^?( <:5"##YZZ@ߏn'""5a-C&,䤐͐ޞOHH`{{9 III( , bX)4aaaL&u8 5 mfgg1 `X`0`2g||\xΓ|>1,--)~h4399F!>>^x-Ϳ7np:\.N'zz=ro}A UfnnNa23\?@2y@e4 3_$O6Fx $H A?D"H$OeK? `>SӲ~|l_8 >' 城/{ $H A#| }R߄wH}ZSMq4 ÿ1}j A $H֖Ф9 m;o0x|, ;;;O4ibee3Xvןpn~압\.jessuv?ooocٞ΅appOY]BCC?6%zss'Dì{qO離'N|&vÇ)--ettF͛7IMM:`0{P7t.))AR 211)//gddVWWǵܿ2INN۷oOLL \~Z-!!!'? 歷BV )|Й:u)z-n7IIILMM *޽f͛ "OV~폌rQ^^Ç 226]Foo/!!! r466!(Lr-QTDGG͛7YZZ"))ݻ $H Al JX,ȹT^c @76̤BF#*[no"##)((̙3cXrBuu5j^u޽KVVZORREP>ݻwG.kk8, [l6]]]LLLp8h4ܺuQR)DDDk۷IMM%&&!##C0"+++̤sQcpp@edjj \ΩSgkk<ǁ͛曔Crr2>>Dd2뉎2AH<h42::Jaa!DFFR\\LSSJRޞ ӃT*=(//f MMM$%%GQQ6 VKRR8NBBBlttt@^^>$)){W^y6d2dff:_ $H t:A <$$Dhhz?bl-++ N%11 pREz=&::!СCa6R0L&hZ?rDA4%%3] HDNN`dL&BCCIMMj$bbbe{{; Gf*++y!!!:tEXXwtuuC[[ k@U$fYJB6`WUU̽=VWW :@KK DEEADD333TTTBQQ8NX[[iOEBBL&#$$1bcc ';;DBHH111#H-n>+XXXѣG;wN^hp/F\$1:: (JnܸAtt4?6֎nGT2oK/Dgg'匏’%Kⷿ-ӧOsI6nHII k֬sݼ Chh(>>>P]]MQQ,Xbx 0&& NGGEEE  n޼`z)aXd SNQ__ϙ3gxWazz 5ONNVٺu+?q͛Fa||q222xyy100@RRF:&'' Ϗ1/7?rss9vX'aXP*j?Iee%|FX\.–-[ x O/_,BGGGٵk6lUVa0o$##Y%ܹs\ %%":;;fѢE9r?񏤧fN>M__K.e֭Mpp0\.n7 P(p8F{<PTVVr5IKKs}oZfʕ'gffE? PRRڵkٷo---BLL l޼;wR^^. +3 09asWlzLА=fbbۍdrz=`n% \.zzzp8lfpp0q雚bjjJ vU$044$DCDD*񡯯ӉV%22a l[G.L&JRmj4tB͆Z&** ۍbh4 moo/~~~`ZAPZ2~CCC͚d``@d2T*e``@\f3SSSxyyPʘ!: ӉdˋnV+2A/r\JO Fj5Vnjh4fN˅`RxQr9044$#J%nG344D@@ :22Ąȫy뭷ؼy3LvqXVA[wE#7* ///NGHHccc"of* ( B]KBO Kt:E>ԝ;wP(t: VivgKEH"ٌvr9XVbw)$!!!bL&|||D@hhjnn&??g}Vu)IRz=QQQLLLGpp0~~~jvzzzp\d@066Ɲ;w0200& V;kVF#>>>"*J'2YR3WVj"\u???ܹbWОx<Rt~~r\T5A_N_\v15@y?09as"J P(d_62fUK9_D!RO9r\Tp09as_By\🆻~wX~,<ػYc}HMI=ٙ]RQO@9~k|>p\bTap8r=qJŭI{{zjsΝ; wuΝ;{Cww7YX,ܹs硞/F|d||s2_w:˖-{w{n-Z$Eii),^vEA[[Ǐ'33KKK)))! " NMMEdd#p88N9~8VYq\$44>-rrrZU ]ee%̛7n _{tuu1|z{{裏ŋ˙3g 11BvMMMV>=={O+++9x Lyy9X,CQQnYMDD=CR=t1;wpiRSSgE$''J ZZZxp055ݻ9z(7nܠ&RSSillDNtIDATQOF.v ɓDEEqnuȯ~+n߾Muuo7nܠ ȱc8vgϞ رczAWÞ={8y$ܹs(T*Mmm-ո\.L&'OD.n>cwK.q1/_\.Çsu g׮]r-Z-߿ׯu>55Ů](,,$<Lrr8pnV\Ill,:N}ʕG\\W^eժU=z+VVvGrJRRRl8pW^y+WpҼJ%G!))IMLLԩS\+WAAAdggKCC "997Xn:N\233gѢE9sBCC9qŬXٲe gɒ%x{{ߣvOuu5˗/ٳ #Wł/twwLYYj2zbb l6.J???Dhͅ ꢯX.^ș3g$>>:=JCCAAAM~~>'(,, r9хĉٽ{7fN'j[n Dj8x O}}=G(ܹjl2N>ͥKDFFR+++9~8UUU4q8 344d"''__G>SAy& ^=zk׮̒%K!>>Ryyy$( ߟx~m?>!!!|,]Mmm-cccfV^ӧDRaZ9y$\..]D~~>&V$88{f"##r7::~:::```@={׋x8~8[n%33'Oxhoo2}||Xr%gŔ㏳yfJKKijj͛,^p]FII 7Cdd$!!!í[Xz5ܸqŋsUˋ_|@j5pe ,F}}=G?bllǏٳg8qh6mڄlF.FCNNn:a7oŋINN7xK2<<G:;;Yf ͜={~•+Whoo+Wl2._h$''1 zjjj4IJf3?!++( IKKG?"??///n݊ngttF7+IVV>,J.]GYhwl۶u։4\oΓO>Ihh({!(({dsA͛0III SSSѣG)++Ŏ=Jmm-111 rYfn';;Krqd2MMMx{{ՅdbѢE;vm۶7xgx'~:b BBB/ 6rY)--eÆ |&u:̟?|FCDGGSSSw];F\\O<CCCh4~R׮]+䄟锕a6mĥK^k._̥KXf <Z&11%p/V $z::: 66oooܹMMMKoo/'ONGrr2QQQ̚/!!!\zDhh(%%%BAA c=$EEE_'88P*h4:;;`0jEj,ZǃNcrr~ﻤٳ򯭺+Wpu  … )++ϏOreڈرcfT*O=444μy(((cǎb |I1""^ȥ͛7Yv-W\arr"""8~8TTTzj"##)..󤧧*DiŦuύ78y$WF&q)N:ERR8'ĉW6|ʕ+ nE{{;oLJM6ΓO>Ixx8477SQQԲp:n:rss9{,CCClܸ48p8ouEECCCTTTfn{n֭[$''KQQN"((4N>ի^qILL ]sdx{{c4Yz5SSSy355EDDZt:z%K˅ ؾ}=c>db455Ԅ7It:~~~hZ]Ɗ+HOO)((@P+Krr2|rpLLLϺu "55 !ՙ \77bX?ؽ{7ƢjCCJJ K,ĉ⋳"++/^Lmm-Z_~˗/с//s144'Od߾}tuun:سg---d7CCC7oTVVڵkQ*QRRf###ZMGG!)%HVXAuu52Lt)**ȑ#|W^ys L̛7???Í7eǎ9rUVP<6vڅ ""ooo|||z-[FTTKIZ?%ޯӘfx<痢呟gs>nI&''E[)VS>UAe߾}>.d^g=ZBBBfttDdd$$E{P݁EZFMM N_&$$Eӟ+Vp-hhh,Jdd$/R0͢۷IOO祗^SoN]]NBTpݜ;w&&&0h4|||l1::Jzz:BZ,Yptww/d2 .dӦMLOO33堠 k ?ַ|2Gbb"yj*&'')// VK{{;It~<hx c֭=J||3ȥK줽b'nsy:;;T*o~TTTpMBBBHLLw͚5k0"FшeVg)tuV"##s!}Nck׊ypev;̂ DTN'`۶m~3-[ƾ}^WThZt:2 ™3gl6344 22ɄL&'$&&'O؈fߥ5in6$^.^\;%>K !!Ap&BBB(fbcc%..+وn݊w?#11Q)Z`DGG^^^_g9a FOO¡!FGG+?5e׮]466V1 ˌNcѢETTT[ojdjj>ëJWWׯ_g``8n7'Nl^}U.!77\֬YCQQ6lp`xxN'xNccc,Y{G@@lٲr"""x9{,dff0FN:ŷ-FFFx:TWWdǩgrr HrY.Q("MI\p!1===DGG* ZMzz ߳'BSOBUUK.kk&M)((r {xy/s6L,\PTf)fn:N!_KDfjJ%/_ŋr/vpasP(Fe>a-3͞bzzt^ɛ455%.SSS a4Bh4xp\__CR3)uttQn7>>>30mZ"4]TJ:N0ZMhh(cccLLLx$bNLLjq\ "˅uw``.12n&&&p8F|||x< k||\ݐ(F#tعs'?<jf\.Fn!u V% kv]i|f||R)r'&&Z8NANbY9>>\.b0==-)߼PT V6 ڵkq=$ͤbrrRWyp8BIw:sRDiT*ASܟ l6{)>fR {$z&''j "z!11M6188}9 i~r\8$Y1g3yxgJ⅔.t΍ṏxDT|jj V45==-dl68%Kt.RFtk79SY̻'3/ _f*ɘoLڵk466ToڴKfjjg266!==˗?\;Ć a4p>9n.^(Bg#""x^룠͆L&ct "p\hNQHOPHr(** 0?"W+WrPlذaVїI~hP__ϕ+W㩧z AAARG߾>.\BTf͚Gn7Ġj*y>9(Ìn櫆fe&h䫰Y=ZZ&~= x~g?{?9es>(ʟN`8qDEEկɓ8q;wLYY{ݻ)..FP ػw/XVdBz{{SZZʁz*P)T**,&>>AyYh}}}߿/299I\\ΝVgg'oFll,cccÇͥ$088ȁD^Ͼ}bx<>L^^Ǐ'((޽{)))!$$N>Mvv6G}Dbb'=55Zfpp'O2o<=Juu58pȭᣏ>b6EGu(++c?Vѣ\p"""8u999466(zG&g.]Ed BCCCp!|}}?ʗT=Bܥ*hZ^Tʑe˖I9t҅bdd={h"4s(,,$22RyxkԄ331vł r=MQ;&hs\I{dE~$H)oooN84p8 cxx$_vv6ぅf>d2 ^/7asEg>ϟ:::Ds=&~.\HOOvŋ1|N:Enn.$''L}}=cZo~l&))7or!>R㣏>ʕ+5qnr9tttv\3deeP(fC__'N ==}Vt{ӧx.\TTT`ZfCj5޽%KPZZ9pLMMOMM .d||O{{;/Byy9FFFǎCV3==͞={|2DFF`ʕ+CjC[UUEee%l6N:Ehh(կvՄ͑#GΦ*l6>|XtdGN:EYY+={j* ׮]СCCxx8|ƍ'3裏>BQXXHDDϒwӧO"dn=TTTOll,yyyl6(//p066޽{9pnݢRSS}67n %%Ea``{re뤤PPP@{{;'NSyƑ#GHHHxdBVvZN8Affhzqf3K,˴h@x Μ9Cii)o&c2xgppPL&0#::w}///zzzQj޼y,\>W6o̢Eؿ?{a``g}V(> R7۷N^uQ1}͚5ĩS ^clllVM{d07n>{°_ddd}'NC9y$eee8Nі-[HIICP /Omm-UUU\dW_}z{{~:jm۶۷j\z{/LAA^v¸|2 <  C( 3188HHH?r ~!/dff299:x .^Hii)Ooo/{{9lMoo/;v젪gϒH~~>---444ǡCODDCCC(Jz-L&7onjjjqd2\.TUUa2x稪$(,,LJ,b' DZ+o[Z-t:z{{Yx1 ߿;g}4v޽{cǎ nݢG(Jj5/_f߾}ttt?Ҹ[ZZ(i>>\vl͛an7՜;w4^J]]ݬ޺u NGZZ111dddyf?>r\^`ѢE<_iI)Rc\pcbbbDOr///tl߾1Λ7>#Ο?R^̙3[hX~=yyyW֭`0-"$$=L&c/]ĄGKK >(5:̟?dپ}= 233ikko+WdzZo}U233?>W^%99TCNN.K(#))V^ٳgq\X,`0\.^Dooo֬YjexxXУ?R VV%..+VK/4$E<>|233ˋW^yB#==r?N?:t?66mDoo/sfdffz,dddp ***8s 7o`0۷q\,X@`okk{`ddL6 A2tRdr<ٳX|楗^TRSSg={ѢEsN.\/"999[P<ى𼹹wvPT پ}RR}(*JAooo,XS#55bΝ444|e0GOUٿ?6mf}}=xX,LNN266Fhh~|}})++cժUk266Fvv6k-e6ٽ{7qqqlذ O#GsݷԩStwwoA(NWRUUիW)..FoK/o___D۪Uشi =p8~:(J^z%|}}&** ȼyx饗gpp3睚ʙ3g #..,p8XVV+Va၁bNeϞ=DEEp8 .^n߾ͩSxWEbmm-W^zj)5.Xn}}}!˱Z8WQCkk+2P]FJJ :HqqR*bj"Yz5j^O`` FxƇ`xxEPP~~~( 5".՘@faJE\\(JT* vMzz &xd2a4`zz@0((P4->55gy2d2/۷Q딖2==nht:* Z}㣂 fbbHhh(zPF\.fRp\l6_ F355%R H@hh(Ah4!088Hxx8AcrrRp_#V%<<(> b``@)gnXd kHzz:Yl\~F (,,fͳ>Kpp0]]]jחJ222x7 >1⋴p1r9jӧajj1J%FȁI,YBhh(ccci;Nb v؁babbgk4'))go}{P[[Khh(lt\,_![9>>jg,Ny%~ͫdf$1@'k׮t ) fqZ[[ioo… x<^}U~[ $!!AtrJ&''hmmm0g?(G\]SS2 ___/L||~7]cbbjlݺ?'+Vtvv4@"E^MLLۋ۶mW^!**D~ӟn:>,%)jbb,gttE``דO>IRRǏ ܹ#$G#>(Xj/cccLNNjw`0fp&PTT$RbbbD|f!66W^y ~N\\ h{].'///m&0?|jijj}_u&&&ۛ%KPSS[o+W\믿Nww7EEEtww3|Z[[ٿ?#''/s(((`x{{O|\.vx{{' .`2ؿ?>}gyR%22gX,j5K,s111Aff&;wb4gHyN>Myy9ׯpZZZ8y$o&fYxv4 =;Oxx8gΜCHHaaa枘B 66V(WBOOB޽)^{oz=~.\x/|r.]DRRYYYX,t:x"O>$?O@VtR  /ܣl6Μ9Cff&qFQ\ptg޼yt@XX&IDkL& jL?F???>Lff&W\~~~f}4 )))LXX+W?&,,UVl2-[ƹsLד!88NBrjEɓ'yYhyyy?ghZϏxΜ9asZZZh4,Zz{{1FEcc#/ǎ*Z___tAAA_8zCee%̛7˗sI9 ( FDKKqqh4"ˋpnʭ[%Ϝeqyd2W&)) oooT(⇯/---˩SXz@K~J.]J^^eee,_06mڄF)<ԩS477sy6oLCC>FCnn./uuuܾ}֭[INNfÆ bZIIIaʕ|<rQd2;v`zz<Ν;7066F]]6_yKbb"yyyl޼kׇ`LJE  ???fJ;z)Ν;'j3x{{vZ}6k֬h4ΊȒd"''CDDQQQ???lµk?~J|}}ٰa`7LNNc0jHJJbܼyE-|RvfLj;FaaPN8oPjbbbxq9rRϏD<0`Jߟ'xbF#/2YYY€3ψqJrnzocXx h4Rgŋ"bbVv% $,, NN;F'OvYv-ߟT*gϞߟ˗399)"LV\)֐Bh4P(0 h4j5`Y|91BggKRR 0rRɾ}AOri!|||X~ZtX[M@kk+/^pdXr< Ϸn:k<,HMMeӦMܼygp΀aZd2ˋNrܹsܼye˖z/xras:!3 'yIOOgtt*.ezzZl6FGGr122Zǃlt t:T*LMM"S".%'/zhhHYfCATf)l||\h4 #VJªp8p8P0KVTrx+U.t:Ś9Irhv/-^f򣣣FCtt4xyynۍR-///\`h4\.Gvk000!1XT]p80B>Hϑ" $mۅ,O '=~u\"CTzyyVߕ TIml60H t:^J???Q`ooo*)1>>.Bh%9+k.al"L&jr39)z~?;xyy1<<,"E3{rrR(/t:XsҳIUSSSnG3)C&1>>^{urrR|ǬYh!n0tM4ZYe$///O2J4G3HbbbB`T*ccc^#*`ZjsOHv|gڵ8=z5MAQQh-R)((ʕ+hkky>9(Ì~l6fX,k)l/}vgallL& Un}ӐwA*!=Wj%4s=}+}Osg٨ai*x!~kt΢3?Y͙߹=)8Njjjp8S###"a`٨L222BKK =,<MMM?v;uuu_I[xݴl6SWW7K\BCC( (}&A[6nQDJwe3RA& 3'}H?\ג<:SoG̔3t:E!Ǚ$T\PT`K^?R\)f~ zyK2Hn ~IjyǙsISݝ4INûu7=vt"a_ҳfcq}53755%ug$477SPP@ee#+_fWZsMccXߤ%~ߏw5kΒ<J 0oGL&vpp0gΜɓܺuHѪ__dDGGsa"55KEEqqqtuu"~~~9rK.Grr2r\(ܼyR\\*155JBRq rrr >>A~mXt)===۷|FGGILLܹs{L&Q즭"!!Q~_R]]-:tgFrr(Ǟ={vh9g?ҥK8z(ΝÄ000}())m|N8Ann.cccsAΟ?O[[)))  p2228p{n0 lf׮],_\T^SNt:8p+Wヷ7ǎŋtwwIvv6ODZ-Dk>BU˝;wHOOg޽ aB7%nىJѣ$''T*ťCPPUUEaa!K,rR`gf}xb^n*ezzZ9ܝ']T/E 4ݻwh"D?p8p:x{{sIV+fk."""'44T'N ˉy3+]d2;w$,,LYݏRϓ0{uuu\~{h#:!.iy뭷hmmeɒ%{nadggG]]\p={$MNN_LJJ >|f⨯g׮]ܼyHf3;wիX,MZk\NQQʼnK:z( B-{Oݍ^!gF7!//JILLٳQ__ϻ۷E}o>nݺEmmUUU&000]z*v HKK#??F(//gɒ%bNҚz*ri9wn{VZY*8pSQQAuu5deeqAΜ9CGG7oDP޽{<8uUUUV|,_r8={}6$&&*.]({졨6HMM͛qIYx1D`Xصk׮]Μ9h@PZZʯkuvN8d߹u儆r:DVVTVV255Edd$Cш.wrMqW? 8|0tvv穬ˋ~Oii)HQ|׮]reѾnʍ?iK♟NHOOuƾ;b\Ǔf?rX,߿={P^^NMM 555QVVFII }}}|\v&&&|2#GhjjTq1x(|<)++CppRQ__Ͼ}ػw/%%% smn7.\ 775kPUU??޽{ͥRחI]+ݐa/^ڵk裏())!22K.100l*ܼy\^un޼I~~>JPbbb(**bժU]bћzf8(,,… _ʕ+y'xw}rn7_|o[֮]ˊ+(//흦g|| aLXz5iiihZz)J%ʪUHJJ j*E_7XV [g~i9y$k׮ҥK}6mmm( VXdĉl6֬Y m"e2fJKKq\Wre 7nD_#""@TF`dd|rPdeeSOqΜ9Cdd$z˗s {1X,>|’%Kz*---055EEE~~~l޼ .PUUŷ-ZZZhnn&((g}^2(^|Ebcco@T2>>΢EXp!;w__ο˿e/^ٹs'bHgbqq1~!CCC\~V{1z{{ '++lجTl%<<_ %%%|G?M/~ ~'G?==6twwsmT*wܡz~tܺu;w2<<̷-gťKgddD݄OΰY0DEEӟWk.^yۅ3?!hll;.\֭[?>&ѿ[fhh^z*.^HJJE}}='N$JsCP[oa2زehY PWW͛7JR%ˎ;dĞ}Ν;b099I{{=a^uL&op Y|9 ۷IIIۿ/"iiiٳ;w222k68P^^wVERqU>CHnn.s ?4,XN>/'? Gl6=կ~ƍYr%### S]]MKK %%%144/LRR\9 RVVbaŊ*]@@&@p\ &7or bccQThZl6 D&˿d2vIIIARg'Ƃ`޼yLAAAAA$%%+`׮]d2¨#,,Lv6$'ODT2kJ*"##&44*蠥V+`jjJ/""b@FQQaaas5BBBhll뤥q%^ۛ˗/s!00BAKK ˗/}IHH@c2hkkˋx 0v fhhr:::0}!$$+V'_ZseZ9oͶmHKKp&""_| {9ӹy&477c4gѵQY~=AAAܸq-[DEEuVd2o&??_xp\$''}v 9s _~JfQGNMMrD^<͌Ͷmp055Ň~Itt4W^̙3n:rss&JJJDVoQQQ.=== NLL k֬ӧOΖ-[ettCCC cQ oTTUVExx8ŢE #++/RWWGoo/k֬A.300@WW SNQQQf#..X %`DBB$%%i&/_NXX ,Vyq撒۷spp!X,r\xtx<NCѠVſ*III Ν;^ 67nٳ8&''!33S+5L& N'\BX,AVQT( ?><(rJ/˖-:<ַ(**}Х&2+WIFF.Xh{СCLOO/RRR¢Eߟu֑drr̒%Kt¸3slZfvQ(rz{{yw"99YCqի|2;vեExܿ?mmm_۷oxW`0HII w獵I{Z[[yƍDZ,^իW{KDDͣrΝ; F222jBIMNNΪ> Z?-Y|pyvI\\>>>bH{a픖2|f={ҥDDDR䥗^`Fg|f/F~ml6d2sBAZZ)))TVVϢ\.GѠT*h4ŢEbarr挜 zcc#`˖-s-ϧP@a6@&'2֮]˷m! _~YXV v"--5k|UUUqqo.,RΐuQxP("\T c,--+WPTTVe>ŋ)))7D311d2l2֯_O{{Kf۹qVBP}vL&8IKKc۶mLMM144ŋ)++7޸oTΜ9d"..,EfƍFQ_ Gl+`6͛͛7EXKHOOgxx{"<"GsڵR-˱X,v&&&~s<mmmrBCCv)))x{{c2%VRnJȳbƍh4T*ިT*8uLMM z^shш`uPTBёhd׮]̟?}ɳb0 ϏIʠDNJ%t:Yn#=UC&N9>>> 4=V\.gzzZjbX0jJv:(_z{{p\PPP@jj*fAI>Vx ,\}{ȩ`^y8txjj,팏T*\.zj"##s4D?)϶Y ׮]wqJ4Gll,/ooo^z%oJ "66VD8N.]L&ƍz|||}6{+񱥥L]\\ϐ (KyvWUUB~~>TWWSRR"d$V+/^V.^f'?'>>~=/_.z^O}}=N!UdGc」㺮<ݯrDH 0 @Q"%$[cvu{7yq{7o:LGm[eERH9 9G"g BIQEt,ꆳϹ>g?c.]@#dywt:/!F BEE8FGGGY~=`Ixя~DVVg?'o0T*"sssynn.?OHNNuEn;"g7^7 QTTyyy^G?yyyHHH<6O>ϣP(ԩSz֬YCWWٰa`w}Z~8<[? ///ϟի|>r9O=nX(b߾}XVN:J"::C͙3gHKKȑ#,^Cw^jkkiiiabb ׸nٸq#ccc:u #3gΰyfeǎtuuhD'4 i#&l`bbdjd2#>>}QRR"c6xTٺu+>IIIl۶ 6~z.]D\\c0غu+ndwEl:~9ud$$$ILLDTb4 ,]3g}vf3O(Z(fZ[[kr!>cj5$q%66t]ҥKillb9ɤ$d2111F222سgדJ`0uG}|X~+?B׮]#==(=JIIl6"..N,Oڵk9qlٲTٳ g>..Q=J?Ogbbbbp\j>w:;;ihhϒSO=ťKx<,]-[oVټy3)))|( ^z%^QTT$vq:dffRPP1͘L&|>tRN>ͮ]xL6n(*0&@ӱo>f3111>^moOz)_444`2سg؏ 7#**nߢ=HLLDVAZZ>,<#bdF!%%;$&&hARf1RbǎGӑ@nn.UUU9rh6mڄG}TܩW*$&&P(wh^/)))$''e{=ɡ.qa+Wm2߰mt:{=L&qqqر'N`4`0a:::dڵ$%%c^ɭ qY|>DHMMBϟyMu:dggSOLqq1 l!| 8h4Ѭ){Nhرcİ~zm?Rfd2q\ d].JE8puHI(N'H(%v?Be8FR(볰X,)\K]шy` ɴ@`0//~_a"A(**P($:;N0FQ8V{AT*NP4⮭j2P*X,^WO&&&B"\.' kNJB. B!K ygILLr1==M$A.(FiZH'*@ՊTJZĄ8.z=f׻~_\"M#_?|b4n3ߞ!_P<;PRRBNNN"΃PPBVӉyB_ Q3>OM(WZf||\b0 f1ZiMgJxN$;z^k I;!rGTU!""x nz.o||>߂(.πL&a3 πcttT7=ؖsR믿K/$ SiƨW7>7yrrx.B!G{o Cp= axϓ144$j؅)dsпJ;_7Dpd$P[[+űm۶;^l~zRRR_زe˂o"t p8̕+Wdܳg}jjJ qdlܸ7aFGG]Qȋ{j fxxH$"ޮWM$E TWWMnETTT0::L&#%%M6=p/A,..[q$S  z(YNMMqeBJuݓg 0<so!F>AiNyۍ%::K9PhAhݷoKK\ɝ\GX,BAjs$>&!!!!!!!! lw[(p(sǾ B>7=dVh4v JB~ q_JEf~nķA;p7@ G($-D"<.kPVB!N(uѷp8D"nQ H8F5Dׄ)Ӊng^QAlD% 4`c+cnnH4`û{ZUr8l'B)o՟w揁罕=FX,' Q r xŝ{ ,!bA9~8ǎtf3_ r,{=N/vEur)jjjb+?ŋLMMdΜ9??Bjj*׮]?D~~> ===İ~JKKbҥ0b=w}? 6p!Ν;LJ~HJJ ccc|\zLtt4ܹsͱh"N<ɹshnn&??V+eOOOj*}](**⭷"11QTIU(R\\@0N 8tDEEq!.^H?9r3gH~~>:>~_PPP@(7ߤ\TQt:h1V\oll6߷:NQ_Ƚޘ',؇:Y _0SSSh49\.'!!A z=⭷b˖-\zNZ[[ywijjbnn%K_;x78$,$!!!!!!!b|(6oƲm6ZZZp\,[ǏCzz:rK./ſܹsT*Μ9Ï~#vZ-+V[reh4lڴ X 6n܈㡡͛7߱]V֭[@Tj*4 lݺZҥKYd `ƍdeeCBBٸ\.9+W$ ?NQQ,6lCXd qqqR\\L~~>ѤQYYɆ 0Gss3=1>,111\pRɱcXnb-nKXf qqqbu:ǎ#33+W`Yh}Q._>|Qګwz=6l P]]?Ntt4TTT#xbJJJ8{X'СC n:Z[[|{wa[:NB*++YxM5%N o6(JJKKȠrZ[[x"62.]455ą l\z@Ç322Bff}]t2AR|nm6sssRTTɓ'yGű#YF<륺z{{`04 TWWm۶!!!!!!!!mnۆ'$$0::`͚5K5kX,f3144D8fѢEddd033Cbb"555>|ld۶m a7|>)))k$&&G$BALLzL&UUU^wJKKINN&''@ Ex᷿-HXhuZ| *=IDATr\-v\NCCdddh"^JCC### 077B?f5rsssor2RSSIKKʕ+$%%Emm-344`{}u`6tttPRRL&CףVGO[[<Ν;GBByyyAҘ!羑H$B||<%%%>`0{:@ |B`bb\\ŋ'77z5k ())P__ϖ-[HJJⷿ-P1222'|rfo>p,];v@TKEEj^x<(++e˖qΟ?dbtJfvIBBMMMݻŋcARKkk+}}}nv-~]~.^H0vc4)//'77"~m$''c Bl۶ ȥK駟^ >}D, +W$))6{1jjjt! !}xx˗/ Yb˗/qFΞ=^Zbν&##كR#30 \|D1EC1?}||h6nHSSFذa(JqQG2<]]]a,Y"KHHHHHHH|MfۦB1u|VO,) q'ZՊR)֐|at:+T /nM||<@@ TT_bAa0z2pmǃL&CPRDen\^6  Q(a^/2 N'ON##Q(xA]`zj15 jr|>`pY,zX= T*2L'&&EVQ*al*NC*80>>Nrr2X]{-sF# jű&< qINܽrx_0 }ps$&T;! J7odnnZMllH۾V]NBX-V\.NV׽qFc}VVIyo}n[u|;(ʛQT.p>oB&-|+[?nu7l5ߞO¿ ׿r8"ڵm8D T?vճwc3:HHHHHHHHH< _MB΅c E&p8ph4otQ,bnnP("LvӮ,8#??_<? o7iMz$AR޼ܴE# o͋nN'ƉRNB<!Ml6yL&rzz . q_y>Jz Jۖ}{NAAG"Q@r~o)!!!!!!!! /m^/V˵n(Zl6O$ann& S255%Y݈pι/xZb`0V8fnnQH0;;,Q8tl6SSSbj6VVUr8b[MMM6D"mXVzCA+|>/o,xzhK0 nXV$`l(q\cp\y^7,Y[[SSSbzexxnQlP[N¼p8v oYf-11Ǐsi\Bjj*qqqLNN?J,~mΟ?OWW\xO>Z233wߥN_188H0$;;LZuu5 Z- ˍ`͆V$%%;r\p|ŋdѢErҎuY7ߤ\΢EĪ@믿ٳgٲedC )v[=))m۶ڊ률cǎ122Bzz:oprEoo/nNGaa!,^Wi&0L h6mڄ륱͛7߱]V֭[BRQ\\`[(**bɒ%S&''Yv-mmma^~ey~y(((<[[:}}}wRӧȠ˗/ȕ+W#//OD"={g@bb"/^djjJN8YYYfz~dEzz:l6z-qxrr:IOOSNQ__OBBxo3}ϣ>ʡCɓx^.^Ț5kHHH-[<%$$$$$$$$nnۆf]`\rϊ+ݷ1͌DHNN&--Ybccѣs=n^cnnL&v;>B{lxNŋn*++^xJ%Ne˖3ϐIHHpҥ~`|q8'--@ ߱qFZ- o>u裏xgIKKڵktwwSZZJYY* 8J%.tss3۶mhii!~zlMpo5kXr]7ʕ+;v^xAn7o6@g}V r}>444P^^NEE6mbӦMX,^z Vb󑕕Œ%K(**bzz`0(^_WwRRR3I||<===\.&>J/_q\“O>ɺuP(<#y, >,/z $%%177GQQ#P__^p8Lbb=k.$a͚5PZZʒ%KX~=gΜaxxlV^-j z ٻw/ZݎV%-- ĕ+WHHHS4zu1[n%::GAAT*rss)//d2b }%qOJJ.v-:/駟ߏaٲe>B&]fD`L&/_`0H(k ;fL&# Q*GPU*J.`NjjpX,wuX,t:d22 B!^KmD"JRlC8U PTD"d2Q-߅ ; PbX,z yQ88ۍ"!!qT*ű&Vo 0&揳 bccŅA ߫hHqd \gg'ǃ#8|fƠBUgA o4Yx1 bAl(#"0f\.< d~?0&a<)!!!!!!!!044$nBj{n)[:m_oU3ƿot?Ohsek4Y:ny{ow`1~oa8-5Nƣ`>2LH$ F& 05ne;-/8B[L|̿:*v9@BBBBBBBBM;VFjjWw2-yN'* F!mju_p8,/_(upO[P(r_xW󛄄Ã[k/.Qvxޭ!Z-+L&C}sȿ,% /"111l'8ga˅󛄄ÁL&q qBp!^mi~)<ʞBh|m{5IHHHHHHHH<<(/r166쬸Db&w(brrYVIvg||[{|>&&&X,_Aq8SSSߡP"뻙333v"6eτ LMM1<<,03==>O+^>` AP + unK.}5%7?Ēa1)'\WW>7D__n[>.VV/|~[ 8u\br}HW^ݲM>+W,x%$$$$$$$$gYKLLĉ\x˗/LBB@Vo[***hmmR;Fuu5-?fV+999|TVVe ł2k?~˗/#ξ ƔJ%~)唗n7 ---022'|Bee%r^yRSSIOO_,[ cXPTFfѢE:tJUUDGG?q|[;f~?MMM<Fimme,_͛7s0L;v Nqq1˼;^ɴKMM 155Eoo/LMMz__p駟ӃRٳdddN}}=K.ѣX}r8}4nXjjjHHH`zzhqL;wwy]FYY$$$~|>*.ygppxbPUUEnnNVwЏ9BTT?<999pq8r⣏>r9^/YYYL& x__cZl6s~?III8qZZ[[IMM?piG%**,4 ]]]gttJũS0L̙3rq:?$v;刺Huu5Ôr$$$$$$$$$w6=**VN'6má,YcvvVM3LLMMORRBӧIMMejj Cff&f`` &&&hmm'kL&jkk^`RFgΜt:݂]'NFRRn rx7]R񏌌gbn)";;T-[ƹs|2ӌ IKK㣏>˗/qF²Z--ŋΥKHMMf222ʕ+e`/ SSS477}vbbb!??R`̒%K8y$III ccc;vQ1%/X 0>>~3,Y"֮޵kUUUX#z1 tR|, `%?l6l6z"^xbccxaƍdggfVZEBBiii444t:)**'66V\؉bhhRK/RAwt:t4lOKuu9nѮJrh{!/\VNZCjB\P(ݻbppLfffpKgg'gϞeɒ%?~gyK.'d( ^/>VnC QQQt:i|HHHHHHHHg'$$p!`0ORRRlM6t:9w˖-l6sYJ%{!99Fz{{ٶm6mbnn/tRJJJnA/++Ӊ!//$z+ >#v;###$&& ㏙_nϜ9#:/ZfΝlܸFöm|tttSO B I[[2UVQ]]M?< |r(((np8ضm >ˉC`'''|2<<c= ]e$$$022O?MNN^r9⢋4buc~{yy9\.<fR[[Kqq1>|(<䓬_N#<^̰w^NVl6r'PTTR$==BYf 3,DR|N'QQQx^1$55&HJJ"))j\.yyyzŝ 6h 55BAff&2BΊaBhdz`0PRRl2v;˗/fl:2?ĽǏ#^j^:: $%$$r Uo<`bbXq!e$a||䛞ϤL&ֆ#MzzM{:pyNmHBcN\.XU?,;#"?[/,vI̍s߭Ʃ0Ol?>/n7x܍tv_"JHHHHHHH<x(ou"W"%b^W(+T*q8ߚA!7v377m'wr9JS;qd,^xNw? ̩`@ }>%$$$$$$$$}QH$F!11+!_AX,hZFEX؝MDH~D"V[ENLL*arz_j~xx6i;EY'I/6nav |PyBO ܫMBBBBBBBBA.a3UMGoZ èj\.(J4 @Q|>zH$ĄX344j Tn7cccn;EP3Wl6 z|>B!t:` V+ZRfczzF@Xnjj ZM(bddi4SSS "333LNNRP*LNN277` B8NSlfdd`0`+|͡~Z9|>Yd2&/^$33q櫸{<p\bZJbff d2^jezzN't8赵b Ap8>St:1LT+p8P*8N ttt ˹v)))=~nnJjIp8be>ˆD"|~'p|p8Luu5P(Ri.tZ\BBBBBBBs7*uO>MUU/^$>>$?q^{5ihhSNQZZJuu5)))tww8?*>Syp9 ,^ 8JGR[[ŋro֭[رcΊ+(++W,ZF~_PXX A`08r TVVRXX(Q0 |'T*)++w} :::8s b z|>A^{5N8#n';;U( r| ӉjET 7p\8N^{5t:f uuu Q*X,N8dXDW^y^OttXp`ZŚ񳳳 1U0A?tpHIItbQ*fɓfӁ?,l6Z-PI15pp8ECd2SSSqOTz-^/  GԀ$$$bzzZfggK`JHHHHHHH|]yرFïkXl.]"))P(Dgg'難UUUHZZ鴴sYL&faN8A{{;O=6\.gEV }v^x;F8&55U_O^׺Tőd_&_jb6D"|駸\.rssh4K/#$?󌎎211ANNկx饗X,9sMcc#۶m󑫪h4e"x<:::p\D"zzzp:wC&Rرc}~{߻/bժU[3gƮ]Xn~)===(J^xr9w0 bp8Lss3ݻ#۷o!y BՑBqeѹ_d2?#Ouu5fbjkkyett|;CCCEww7zZMEEVBT222BGGSYYɟɟv#sN0Ln1߿BALL ;voo(..j=TV~VXs=NӧOB`Ϟ=T*ZZZزexlUUeeecQVVf# w}@(bƍ 2::JAAصkͨT*&&&Xr%===\.rrrvkYl333qUHMMfddիW B={^φ TTTCvv6/҃ -kxزe Ν# CQ6 @LLhhkkҥKb @ իW)))uZ-ݕs.r j5kVpRJĉqЊ rssINNf՜9s .`ZD&QPPbMΡF!## .ƢEx"iiitvvFrr2ȏc󩬬|0.j Ν;|ϝ;Gbb";v$p8066'|Ga# q}]x<!ٟ"\ ŋ<O 7y'Xv-}v8v8Nyؿ?v͛7dv%. F\r N jkkIMMevv y$%%??gd26o/LOO.!!!!!!!!q3,.\Çٹs'& (eee\z LOOSPPFfÆ tGG~e˖_n܉'8{,O?mpY~_Rزe pۍnPWW%==L<.wy!v܉B`xxE~~> $&&z B͉(.Vl۶7Yz5999ddd"n.\@}}====7{ҥ9srrr8~8K,!&&(wKJJ sss333CTTԃ_n^}U֮]KNNsssl6-Z0RSSݻ."--={`4'))i5Z-2 &:` .]ʹs]DA^6D"L& QQQLOOcZ|bH-kgggp8,:2LWvbff#G@&o4팍DPzq!J8Fd26mC֯_h+T*"6 ӹ``bbd2p1qTRa0P*b@N(l6ţ>͛#V+ QDR9L8fddt1=c0 `XĴ $o~ԏB>3=!!ӧOBkQQQ<(.]ʕ+ٶm \x^ݻIKK~oNvv6dgg+W-hMB\.ILL$ qQJ.s0RSSCKK 6,|I6nHTT[n駟Ǯ]0͜>}p80 Yz5 {nbcc9|0n,YqF s=Gvv66J6lyGXll۶ J%[Rjl<$$$`xꩧSr9/j244FaΝ_9tuu%bcc9vMMMlܸ|Μ9gddTx 6l@ttpv;?.,!ԄRFCZZLOOzjiQ ~0/&--.HNN&--z z=tvvhXv-FW*H(JRSScccŜXV^MTTc2ؼy3cccSRRBAAnN')))8 sgggillRRR&==6n܈륭 V˪U0d2RSSe˖ŋIIIa81 CT|rPլ[l6 /&++bbbHHHRVV8k׮eժUv~]f sss,^JE}}=7nnSYYh$**xx<-r792&{^/_\߽D"dT>? ۍ亷bou5ο?ỷ[}Y߿ouϳgۍϵѭaQ_][|bbXq﫶+|#墱C$!??}>?wr4. ϲ}~o{'owҘ344$nB߈P+66vxm QV孎wr!v߿{?ݟǝĝ/j[=J[Bq1}m]ƾfv~Ͼl~u󊄄Ľ;Ey ¿J2QBntrp8ߚCkSI(p8$P|R&.~?ϱsm$$$$$$$$>M!AƿHBx<ETd2 ol!~S&mIII]%^"L^o)!!!!!!!!d2EP~ɾj@.#˿pg=ƽ}8zPα A1&?n>S=11 ~e}"ZN?JN璘KTTp!? Pp000 ** 9(BZfjjABF@шghh)t:jiFGGji0dxxVK(W^gttQHD,qVQT033d"VF#*vsssfhh˅dB./PqhxxH$UUUdeeWg/ D"~Ν;Gnn.rp8LEE/_&##CTsr"Z|wI?sssXdbbZF`f+B`hhYŇt TVVt:Eh4v\:u Ƿl?ŋ"SYYFsmEotLOOh|X,F#NsSɓ'E/t:f?7p8nR pՊN:0448?ZVv300,FQxv\ 15(--%// JVB`vv~j5jSNQUUҥKEi|6/:u4}`ÁZĈB4XV%11.XsU"LOO3==-o*uppp8hpߏnh4 YoppÁdvߏL&[ 3>>ΛoI\\zl˜w~mضm9sVXj7!55 jkk?RTTf׿R8u픕QXX(l455~l6& ѣGy)))AVsU:::xwΦ2Øf~ߊ/Cqqq-Np8LVV b~)(P*FfaZ B~P*T*V`0P(ZLLLh H$‘#G8}4vA9}4B! Jٴi>I.^F!'';Aohh*\r\B~~>/^ϳd.\3gD" ؿ?⩧dbb2jBph)4 J1fÇm ]pCCC\|-[,pTl68p׋'ngttZMYYVh@   R_WpqV+ są: $*ÌIMMe||\tn7Vz= |G,^ԔX!`XA.c;1 B!V+ǎzVZEgg'\pNnҥK\zƲep:_5ͬ_tuuQUUErrX… űb yW ¥Kffft^}UgժUT*ٰaj|M昞&##f:㺫7|B?:ϓ$:NՊBR166`0rZXVJ%D"t:nMꯃ"d$d2F׋F`0Hnn.###twwS__L&ԩS:u ^$''#Ea gϞRq:TTTPUU FSNB{{;+LLLI?:Ӭ]vAZ[[ٽ{7ütttuVFFF8y$---RXXOcc#UUUdffFii)˗/'::A?rA[SO=J˗/E$sTVVȿw****HKK#))z{{z(JO|7]wڵlڴGwWƐٳB266c= /#Gä''+zٱchhh ''`0ZF.V!::_~YD"=zۍF`0w]h4%ddd\N8K/bܹs|>ZZZزe &I {V(^v;OF~~>@n9uv7!=="h4B!+Bvv6deeaYz5˗/z ?я^7ߐjӧZ1/_fڵT*h4444t/ǫWfűa\v }vzD"T*hiitb6룿B' ]޽ɹsj\z FEE?' |2UUUrVZ ,Zшd炱1h4CXz5NOGG^~vOSFFFկ~cŊRQQׯgՔR__O8ҥK h|'?|zՁ(6l@LXbΝ;Gcc#B! ,Zhf +W)ZQ]?==m۶QUUE__Z N>#??B]Gj*+XZVJKKq:<455ͮ]wqijj"&&EJJ v8z(Hw]-Z$ĉdgg`0ѣ\pϓO>h[LƑ#Gezz̳>KLL 555?SNhp:?Y|9V]vs!2>>NII ###444Gzz:Joo/z(  111T* yYC/^̳>˕+WHKKϸvo6x:rW^^v%$$$$jnVr @[r IIIp803N'GEEa2x<PWWGtt4HYΝ;Z厄Zv~nJzq^T/_JѣGٱc111( 1_O?%11Nf#++??%..7|M$O?eժUdffw̬V+999űo>q+WGbb"6lԩS;wݎjEVvZ:n?)(n6m?O$?!HZˉb͑\#4 Z{cى G?'DZh4ٳUVSOQ*={ʕ+(((`۶mL&1ɓ<$&&-[pqJT*r)v܉ZFP°5$$$$$$&n렟>}#G㏣jEzbbbi/_^իalWf׮]ۋdbjj677kn:n8t/^djB,V@Q\\L8fnn͆bt"룡A2 qݼ댍m61/zٲe t:PHjD477yf͛1]ŋ*~\._ DD "j4j5@@ Qfnn^<& FFAӉDžB!∍%33|;bh*\w(--ehhz1SȭJE"9>>b`llq1W~K罵W_}5k֐,F?۷ z|>HՊb,ED"b8ViXabbY]v_H$Bbb"<`2cll #Zd)))DGGn:~ibccdrr߿`HVc9ptvvJbhhtB2P(LLL0::nG.c‹-&rrrv )Dc6y'Yn/^u糮vv ߏhDVjE] !]cvv$L&K.wZx~!Abvv@Rzj~?r|>Z4<pr۱X,ܹf3ŷaffՊ磫_WXTRRRX,477cXHOOilvv~i^/cccgSSS477LSS?88HSSMMM477355f㣏>ʕ+Y UVQZZJoo/---bA1EA)gxxJ]$.\kZg׮]XbAVXAEE===ׇZw?pRITTLNNh7'p\yBcbb_f Efr>cZt.h0GA, 6 ݎbϻl2Q7KHHHHH<,|fzBB/_v311dGTV^Mqq1r*֭[ǦMHNNΝ;Ƞav5kUVvZE@ȻllldttT̃ͽ /Ϝ9Eۚ LMMK}}=׮]tٰalٲ`0ȩSeݘL&QlllLP*^v&''ٳgќ8qݎ!?? axxJRRRؽ{7njkkٺu+999bڵkY~tFC~~>===466"DՒ!==VKVViiix^jjjXv-W&G  99֭[|_j5/T*ą!RI[[FUVaXĴ!ܺIfp:~)--[xb***B8(J{9Ξ=++((#+t:111b`Ir9333~r9deeSnITTӔVyYbJ"//OZZk֬)233Yb---n222XtxJټy3K.%n:IMMeʕx^i&N'CRRf@ @~~>?A$N׋qEEEp8ظq#/&))N(gZl޽ @jj**`ʕ`xg1eLNN266O8{7훞p,"!!!!!7odnnN x_H$r`FBL&9Æ}c$`6 A_~_~U?7^__75&&p8th.W1nff3w yTkZ?h<~"D'y=[BBBBBq]LIIJoŲPw{)z_nnWn!^/3NANDHATT=wD}d|>e^(',HHHHHHH|=d̠jz$K|7/'$$|)}zzZ7 otNL@C^K| hKo&|Q;AY'C^_\^au-R<6q{2#oZHR%o$H$" ̯➘x^I8f``@lZBP`0ztttrRd׮]c||(T*###}*tuuawfVڵkq\tuuq5FFF{O,&[oo/:`0H[[D"FXIT.D" ۋZFfp8Lgg'}}}LNNeZDGGP(GLL ^N1 T܃ DEE199h42>>\._#<77ѣG{`_*v]'фa]АXbjdd^d2`PTWT 288(Dv)++[P{~#D"bT*X2IL&q$&;;uOO_2\/h4\|YSSS( E ;bh}755% sU0dffa>cbbb9Sw&Dp.]"pr9ϟgttY;FBBLLLRdzznj-g``Hss3cccb8\fA 9ro\ݍBk׮ K000{Gnn..:oVLFzz:|mmm233h4nj56^{ꫯRWWGqq1կ_:tdXN̍eꨩaff,jjj… PQQA?gΜ!''LUUWEqq1>BSSWE ,\rE,GU Ys΢Vfllz ˥K(,, IKK[$555q1~i"SSSvF#sssb8 z~A~ԔX39 /PRKPr 4200@GG[e``IF#* F__`ǏS__/jx^z=vw'x< }nn^ %K)p88{,UUU299Ibb"o$qIZZZjZP*rl6:&^3 [LLLIJe˘A155jcݺuTUUhG2==ͥKdttd^}U&''bŊD"z{{|L&8~8@`0onŋsIbcc{gh4399IMM ٜ9sL(zj\.hyD"nbbbX,LMMxrj/)ua~, 111P]]Mqq(p688bۋ%** j*nh r )**"11QOD"qʕ+tttk.B}}}d2z=ccc P(?h4L&^/:ł\.b099I$q?3hAD *6DS^;ݍ}o;9o6'9b5(JH {A#DJ%:G4[~O{NFGGdT*^Cpx<իdggh֝feeZSSSjvl63??/\`R\ 8{N#ǃn ^EHHoMgg'===l6^/f``\^yƨ!==;wp-kGzz:/333Ԑ˗innH8}4cccB^xyԩSq \tY/3??O{{pTWWEee%ttt J ֭[<LOOkqa(CK7)++BArr2/_&$$<CCC_8NZZZ~F H\. ,//p8G?ɓ@]YYajj[~~॥477(..&::~vލFxnݺΝ;cbb8RSS\N^^!!!IMMh4RPP@nn.7oޤHKvHKK`0Iss3[nEՒATT=zgrqqR (+`@ѐBAuu5}HϩSXZZdΞ=L&޾r͛X,w^BBBhhh`aa#GP\\Laa!"ɨ@&Q\\2{'ORZZVjVq8KQ\\H Hy7 %%% kFBBdggDII :&A---\.r9ND0N'J/b2'66{Y>C !HHLL@ ;Cww7B… ,@SS파`0xWYZZ144Bʕ+X\\*q V˙3g0Lӧ,rss 赵TTT |$HR񰴴Dee%FXҨBۋRboP(CVs%6n;#\.ghh"(JO . Ν;DEEQUUErr2}}}BԐ [lSNP(X,g?DDDPQQ8MMM=I{{;i/|DEEjkk"&&4FFFX,9hZܹ㡡H~~FTT'),,$""Ott4_r9 n޼ZJ0jjjHIIfgga||VK}}=tttkM}}=455Iee%`$ 24#j2;; iii={ViiitwwOuujvjjj(--W^!227X,d2/^l6@xx8o`[,ZZZ>!#HƍB_Ο? 22s z=OUp/,,܌hooQ*m nZI|QQ/aaa466.80iii|__1554]]]<$''SUU2III޽.PJ%rp6mįkvA~~>6l`޽k.n*;//m۶qaZZZp88T*rRՂ#JII :{-[PwczzZp=s߿VWWIKKwyBCC( w]! ̙3d2aۅv\OYt|[B XX8pz~Ɇ P>|\ pN__8t@$9.зo:t,p\ttt,( R)r sαcxvJ%d ,{l|>v}T #j;w/c$ JAkk+t:gaa""""}P433C^^{attFÇ޷^^x/v;pmv|Śl6 iկ #++ 'βFaff'T_6n܈c``e H$x<g Y^^[8bmۆFa֭D"Gvv6NTTT`0HOOڵkdgg^h4| D'''ץP!o~JJJj,--188abbU^}U:;;ٶmGNÇp]-r  22@ (B*(SSS,-- u_6ևܹVѣa-|<|NJbCoo/hZfffd23V2 ^O\\ ?~N'===)..ׯ iGGGŃIMM Y }}} 5+++~ 6mwFT˗1 I!"!!o}[ettizTtvv鈌W07o0hZ!annTJ\\>Oh522Bgg'V $ :&I8nZZTWW2}сn ׻sssٳglܸ"fggguu\a9t{aÆ ~^/r\H󑜜̡C5+++K"..Np0Tfd1}}}dffCMM Rt]pA#Wz?99D*R[[ ɂwwk׮QWW֭[ !%%^ρرc311J4YZZbfff0Moo/~GLL  oRv( <P3jeppP8nt$$$e݄sjߏ Z(1a>tuu1==MLL RT եd2ĺyp~KN'F ^~ed!xogffرcEEEEGG555(J233BvPAAqqq466DJJ yyytvvRSSB //B]]SSSjihhL233ioo( Ν;RN6l dl466OAA)**rQ[[6l >>;w MOO$.DDDDz|b{LL x^h4ڵm۶ƍ),,$44VoNYYFVbcc9|0)))2??ϑ#GcXxgSX^^jg!-hjj>ʼn#PUU%)Jfuii4:;;r̞={غu+ ܹOee%fgydϓ,!!!222 Ǐ'<<7o c<%%%HRfffhjj"99Gb4|tuuw^6mDLL MMM iq\.gǎž={HIIAP000\.'==DzEbNql6 Xc w v͖-[%n7h[]բT*GSPPl&$$"NOOFc)hZ}Y)))Ö-[ؼy3Ff9x:`Dp(J=Jjj*vrrrʺ[rr2Hc\6lt288( AG\.'>>.BCC(p4!**\ِΎ;PTBD@5 $%%$zzz ==>܃:^Lq epp'x<غu+X,z)1F!;;׋hl63>>bǎl޼0D"и8;vP~?*:0RSSJǣj %99OJJ N:"##ַErr2r͛1 UFFUp :Lx ijjbaa~ H$=Jvv6sssLOOs1 twwsH$#GزeڵV+###;v Ѹ>IDATRHOO' 99^OooP 'hC0F#aaa`6, 999dddCHH355%~0vRRR񵁁vEii)&DZ-ߏ'??\*ɂMFFD~~>j aaa#JIHH2n9rRo.8ٻw/,--k.IVV @RRj zۅO{_I$|>l۶L^^:&رc)))twwT*yq:TTT JJ (B""""h|w:H$L&N'v;vb2o& Z}_>۠{}~d26mh4p8xMRR=y^wbb"eee^]]-dG?`0EZZZ^gΝuf )0QQQ8|T[?&"Hɓ_%!!!DIuGaCDDDDD211!?ښ @{w6}#O_:M!9&;8G8< SJEffPo&|~%22$$$QO] ӉСCԨj#g_eoiii܇7zTEtt4?Z2-R)*J|DDDDDRmt {Ts>/6MM"(u5O-, @8߽0H$O5I ow[< -f|Y[RD's""""""_PT_,W[,Q`ٰ_8u⾸(~yT)䱦?6?OW/.""""""""oײO_P_>#p_M^#?>^:E֠m{w9EDDDDDDDL>}*LMMՅf#** T磿@ @XXttt Ɉfֆb!::CWW333DGG#˙J%D|Vq7ttt`2z4㠚BZnZtttt:pjZP#<<J|&,, Css3~"""\.GFА^T mz=~"44LFGG DGG q8t:v;͡d¸Z)VWWh4LLL EWWWQp[}iiQ(jFFF6D>9&$""BAˍ7X[[6Vv\ܼy8AZtv}/)اn-(OOO 2mmmx^X\\CXk(JaJ}eOOMMMdee}tuu 믿 t8wJIoj5ոn![n>Tʇ~nw%447o288jehhqj5Juw||^BCCB"""""""ϣzuu5ܼySh_HF#ZTVVa}ill$22VdffVˋ/nJ:~3_*˩dnnWT*>{277Gcc#TUUi&:;;yWHHH 55۷o_y׉'** BAMM \rEhspΝ;L&#** ZMee%owFR =z-Wh^NRI||}ACC7nD&3M&Nzz#j%""eN'ver9& Ԕ`'F#ZuFI,//z",, L`$-//355nG>chh T*'Odrr:bbbƍLLLHhh(*6zrssyW0ܾ}TyWq8;* /`X"77r1]ZZB188 l6 sssT*@& NW:u NGww7:te%-- oRjee@ @dd$ǣhP*;wNpꫯVܹs=z"'O$==]X%""wl6())ky<t=##" `0pUÉv3>>__܌nؖ-[r~?gƭ[#>>~n0(--l6͛?EJliii!..BghZ'rmm-v"77 HMMerrJ%6l@T*gJJ QYYIii)ZK/@VLbb"455uVZ-j&''yꩧpǎCpMR)n">>h$ *( PT¸###%,,id2 ;#墦dΟ?OXX555DGGm'$$PZZ2޽TJuu5+++9r"rsss玠[]]Rd2'NߦDȶPl6^|E㽸葑466LSSnB"NUUr o&77YYYY!v_Udjjq~!aaah4m_~۷o Qj~xcxxCi&_n'""=H$8kkkݻÁ㡤K.s=˗|L&/VBBBd>U$ . 8M&`4yQ՜9s;wAV#JIJJBϷ-X,zΜ9{qF"""瞣ah4&9sJE]]*! ƶmضmp Ξ=ٺu+׮]nO~IIIDDDDDDD>S@WP(ػw//^t"˙"wRN'BJo>9<MHH2 \~AT*[qybcc#ZmD<~!'No|@dd$nYoQ\\̛obn{nRRRcl6JJJBZū#::sU_jO?$30??OMMͺ大sup5RRRbxxT,sssDDDd{ܷ`F9‰'nAbPHDP \. RTOB$x&rlܸv&$$DXڄqχ%zikkcxxDdl6;wHJJ">> 6n܈bh4tṪ!;;pBBBطo뿦'Ob2.EEE KYYlذBahZ^ ^߻تKDDDDDDq{˗))) DBoo/dzLee%B`DDDm6֭[vF=ǭ_\<R\\v )e~~YYYh4L&!P(p8?#f,^d2QZZngiiI=::ccc|>f3}}}l߾lقVeΝ2$v߷^2''*IKK͛dggD\\IIIq077GKK $&&>@| &6b /Caa!ښh4ݻh6nܸ`  **@ @oo/133 cccL&0 t 4oNGNNַ֥3T*0 cݬPSS\.O k6 ׇ'22 '33:jjjHHHa*++(//gxx,l6LOOcXΦ*J%eeePYYiii)_ff&fJʨ󑔔ܜ49~gnΝ;ϸ;4Bv餻f|,.. *\"MMMkxP .hh[,:::sȠ())attJ|>W>HDDDDDD'000\.gii(nJYYV]vQ\\LJJ F8 mmms1Q* qa222"q\.DJA 8BMZd2!X[[#55>VWWDvAYYر@ @CC6M0|Q*,--lFTRRR,NgyZMmm-!!!x)..F*P(qQ  Oc4QT,//Ͼ}P( ZPZd DXXXO\.gttÇߓ/"""""""y<)e!LQt:?ғ/\Mn23cR{<jjj%&f*Ą8kkk( e7\[H$xuw?}|M5O>qx\@@ENBBaaaul4ռ}PJ==EDDDDDDDD6Ń"ߎn7&鑞nZq:8̇qsv\.MDDD'2::JKK ^/b `jjFR)Z5YYY!66EKK zmmm'߭>??OSS mj AZ[[ښnj5 Fddv:477 kjjI.kKgg'T*%..Gcc#T*bbbLOO؈ 66Bcc#SSSrC1::2QQQ !֥Xp)k*p΢B*BAXXz@TMOO=}]]6RS~?ttt h4vGӭ[V^uHOOk(,,,JJJʧl6ĿY[['55u]zncZijjb||\>N^fzzQN>^G=yѱn\xZn7~!rK.a2022Ȉpccc477P(^zzzGPN__,..rurssgpp4hmmz777300J"""Yqt:\.LMMdյnwTUUn TVV"ju TTTAWWɟ -Y%B7088H{{;aaa{ASN&fgg9COOPH$DEEaXhhh`ii~? RJ%,//S__/|nZZZ@#sݹztv'66Acc#xw#33Sl)"""<*j7667P*/~ 4 _HRn޼INNOfaaT*---tuuȈweϞ=B*zt[[SSSpw:ָz*:RɥKhnnf߾} v ɓ vnݺ??PZZ o6K… ((( ""۷ose"##"44zyvڅZfffUN:Evv6UUULNN 5 /"r0z= jP(v _|͛7 /NII/bIHHsn,Uz__tvv2>>NNNCCCp%bpEܺuۿeLOOs9$ lڴ \@&Z-dVVWWEV366 oQQQ\||{=FGG '!!a݃˗9v6qjL&A0nffa|>FGGp8Ve~~NVVV f ۅyzfll ??VtH$N'2 L2N&''!VL&W0{8~͆lڵk k^祗^"$$0봶Faa!LNN ivvHfffp8x^YǛoI  6033Cxx8ccc,..rIlBMM r\p޽SN4Gll,/227oRXX㡭 Պ^ʕ+TUUIll,\zLFUUܾ}R&::LWW`KDD0ڵk+BUU KKK~m|>wܡ \N fjerr5W@NL&#**.FFFd2ƍE===#5jIOO"UK{{;*OLL TUU188SO=f@ FappR)r_GbkkkDDDhbbq]gg'RTp^  ammmݹ a28wYYY,xEc``\.vt:B"ݍL&CTEpQ.qݬۍjER!J rttET**rrrxWq\TUUHUU=== +OvDZZ/"7o$++s155%8U111HR***ذao&ܹsNG[[277BZyzܺunܸB[n~FFFx78r^PDDD!Itt4111\~(;55şڊf_+,,,qF2228{,fÆ 466m6Á`9(++!h+JΦDj {nZ-DDDٌ'nmmEVKhh7[דA^^FQ04 >^z ݎL&`0Lzz:MMMlݺFCRR2i;ƥK8|0ܺu TJee%z0d2&44TwDD(JQɩSTVV̅ ȵ  YXX`ii;wppQ HOO\n7j 駟wޡ(V+jZpxH$ܹCQQ#5###Y]]ɓtww311Azz:$$$HZZ111x^rrri0 MYY|LNNb2©S|h?@PΜ9L&hZ>gϞS[[2ǯ 2;;KEE:&ZZZG*LVV^ZY\\$$$w}lMV+C---a6fuu7nzСC,|c v.^Hss3ZۍnG"Qj!ͭ[HLLddd(VVVx1 TTTVz*7oԩS( &''l3?ʕ+F_Ngg'F2zJ%SSS EEEsiT*^??Ν;r5MMM#P"HMM166Ftt46 .]Dll,n"::gbB4* ^Off&J~?yyyVĉdeeq-, <\|"##q8:u N??Guu5ܸqFCkk+d2***(,,1ZZZ0LMMh%--1z-u6fBBBy& T*1466D"A&J? 󩧧?6 KKK,///7bnn7nFMM )))v)++W_EBL&ٳER[o!D;:: j9xIiiiA0<n0Ξ=0CCCPSSCRR }MERUU\.ƍK/hmm%==BD"("&&Ed2?Oq@1~ӟ277$>__222|h4RYYɓO>IBBٳjjjضm# y OA|\plx<31r!bp!p=qs<쳟x<Μ9CRR7oq8{,=>barrTڵSNo6 [la˖-| Z-Gr|>xyF&GGQSSnrt]Fbb"\rEp6xX]]euuȳ>Kqq1_||H$61t:9udee{RZLLLPVVnɓݳ`ٸq#őӧ9pХ`yy@ nG.sq7o\rrr"<<{uVzzzzBmjm8x`nN']]]~{9JJJd`ZYWX,,// 9r#GaRRRغu+aaa|>6mDWWo&77LVΦ:VWW|9~8111_ʭ[2::,eee,--aXp8x<v;F|;TUU<ŤqF4 yyy9r0`}>|ra͎'OsN233IOOl6nHQQٔAqq1Ǐ{O7winnrg6l~lncZzt{9fsϱ}vR)NB83gp8dee &&JKKy7C&Jd2! 5{|>~?'|Xfgg¶mt|>N'KKKbNGrr26'Najjjp\x^ƄہH$ORRRnׇfbammQVWWIKK|@LL r ϻv,fL9bbb~@II 7o䤰޶o>~iT*f}{Ehh(fGGB4<..#G|w#H())ڵkrw#8/^v\L&C*"Jx<:o)+C. =wo̗@ T0[!87 zr\ ^JLL$33ǽ,ŧ'OڵkdggcXHNN&22qHLLduu+W`2شiz/Dnn.F2"""سg233}Emxr}KՑnt$LNNww.8dii 6xa~~y <<??LBB6ټy3fqZ-@>a^Eپ};1UZZVeϞ= )A;;;l6qP[[Kbb"iiiB^ZZF;FBB333ܹs~RRR|| oKff&^jkk4Hο˿OZZ6~?Bzmjl޼y]!^[[###H$!պaA3aRYxg}6KKKn',, 6e?#/^]] bccumIII!!!Ci&n7zILLnnܸ`4s`;|>vnܸ֭[ijjbii ~?JR0:rsstO]]]\Ɲ;wHJJB 1$''3??O^^JJ%&f4hTPUUn'##I{{; h]… %7wr&8g ,!!2"##پ};eeeqV+%%%B ޽{ٱc%%% hrrrXZZv3>>NMM SSSR```ƍl.(..&==DvEzz:TVVIii)]]]\tu Vṕ@DBHH===X,R)===LLL)w;{,---C׳k.mۆ^^/&fa@ k¹666`AOIII$''ѣG ,!!$$nr9kkk244$7R@jj*ÇJ^^TUU111A{{p>T~ֽIHH !!6hjjǃJ!+u, t:Kuu5.KpLk)~?4 sssdee1>>ŋ!JvlܸT***}6ٔƥKΥKfƍq '??zˉgƍBifH._Lkk+pm***HIIaƍ pd2@x"Lyy9lذGOOӌsЊ|uY[[CӱqFJJJfdff{%//t! w޽X,z{{IJJѣH$Z[[Zє ź,ywנkjWWWG"ۋ^D\. AJJR(s!uV$=|ggii0, FQ_...fee@ c FT*%55UZdgg#JYZZx  crrCa&??m۶!Ʉqٴi111dze@$44Tz=v4v8 Fr9qqqѣG1BM6QRRBff&۶mCTӃBĉ#x5 :it*D0J%/ ---a4y'qVdϞ=(ڵk]zL&JTZ[[ '66C 2RD"!<<Hll,qqqB=m^^qqqLLL0;;K~~P[}v6l G.YYY!==B6m򲐢o0"%%DtSTT$RTT$oee{vYXX >>v;nҾTA;o^/L&'jo߾YO=1==ÇYXX@דJh4l2" g~~, l( )JbqqgyJF駟F"M\\ATTǣV1x^zzz穧">>(&''9x yyy uiiiB)Jȑ#dggp80L=zYYY;v/8())raZygPtwwcyꩧHJJbll98@~~>uz'INN&$$%;&$11Q(h44$''/D5"66(jV`MOOr 77it:%%%֩`$TD"!))I( [XX`׮]p8HJJ2mbcc=>ݻ),,$--iػw/8N|>ǎ#99V4"++Tg,kJJ<9rD8Ql"dÇ'^B %%(FSDDD!yR%˂T"`2p:?ғ1>_.7 4ܹN'O?4F<ofrr(ܺuK{s8p7Z!A&22R((M&*CbnnӧO&$$Dȸ:#Q|嘘gmm BAttlv/` ztt*ko~Sp8߇ZSLL. ,;U*}n2P>X,Zك +++vJN|-M˅?""A|>v]h=yG0y""""""D"=.ߎ<KKK]. y$ 6 ۍU}Sar698C<|\nid" |☂-3?8A톏AE ;_}GVD@p>""""""_JmwxݾQei)2LLq ==M<]")"""""""""4 Qls7V6]Hx."""""""""UcccΝ;,//+(fjPSSD"AӱLUUfN 墮^᣻Ugfffjjb cZcee*AqjRWWGww7jHz{{G QxAMM ō7%wVKss3j}>mmm477Jhh( 磦@"PSSqqq066Fuu56x>Hu*NShcrX,\vu8444!ڿ{ UUU| a.]bǸ[}vvVVz@ @]]}gg'nbccdܹsQ4ʠT?6awA"`6db C"Vbpp ˘L&***'22r]M0wl6b"##d466с\.ާ166FMM:w/ϣZ… TWWů~+1ͼXV^u&&&x7ڵkry:::,// /}rhiiӟb~AӴv+++bUYYɯ~+ڵkDFFVxx饗… B$077Ǜo)@VsYfgg9u###tttp&''~jzꫂۻn܁@'ORUUJbjjyCOOuuu122Byy9x<:;;nݺ*@^nܸz^^}UP*oߦ@ MMM.,yN'mmm|>|>kkk+ygppzzz8(o< ˍܼy)x<5%*++immvLNN /"JoQZZZ}67od||E^~e!1==իܼySx套^bmmv;o|>A!buY]];w<"""""""""¿a8pGjv؁\.gpppMCCׯ Fl&,,#GG.qFRSSIOO''')JKKʢFerr\.\0tttCSO ly뭷㥗^bttY|MVWWy7׿5ʕ+p9s KKK ǝappG:tǏhd2{188͛7> giiODII 'N 99KXXȑ#߿JCbZbyyV˓O>yzWDB[[gΜr8wcccTVVrm^{5qv9~3==͍7LB$vbbBȾ>j^DT#m={p1t:^NGDD(JbbbַŖ-[O^^෿-gΜY',W\\,l'""""""""ԯ2Ù3gaϞ=={Vh4::*(]V@DSO=Egg'W\#|{߻] yo9NN>Mff&eeeN… |J{HR!%%|Bwȑ#$%% cڵ={p9^pm>*駟 Aq;))ݍbA" ɰZϢYXX &&}v;ٰaT* ZZZ(++J6RSS&33uY ZBt:7oׯ{n\.]]]œPtvv~ۡ=*2>Lcc#ND4߿[\xdVVVƍ466l旿%n\.ԃ*+++`Z9fgg룷}iDDDDDDDD|H\LL zN':B ذaeeeb4Y\\' ++Lf3999ر8*1xXZVN'dzo>4 ܹl&''Z߿V(0 r:Dff&4IKKciih[$.<oУr jßW+X-JQFD"v#S `ӦMBJZ'xpx cA''NŲ.QsIϨD"yD&h?y+""""""""!X c}bccY)R.JiQǞ[`} SEDDDDDDDy8_~==q?^*pp:R}n7.ᫀR{0yoKWWL&J!GEE@X~:$&&b۹uA5n n޼111Bgn5VY]]%!!%] F5*++ikk#44(:::$::ZPl… Ν;444R=ףV tww磢::;;7n n޼j%11^*++Y[[DĂ nSSSCcc#իW)((xX۷iiin#H8ud2~?}Y[[h4~1VqbbbTUU҂L&CLmm-vW\NL&AI?8Ǫe`Z 5uuuH$fggH>(KKK[rjjj(((x}LLL000cuu?JVqw:TUUILL=jrMFFFHII3(DDDDDDDD@<*巴DTT7oޤ v~_" ftt7|JMM ՜={19u~Z^o2jN>.455ŋ~V+>DK/.[n 7abb jkkHNNDD:SSS9s |8>CVWWd y&fwy(Νcll^{ DB`qq7|FY7@ 믿Nkk+ `6իvimm֭[ Dž vȍ7+W`6sE&&&>Y\\b0::Jyy9B+(T<@!]FWWv *aN:E  44 /VVӧ룡I b69s#H$oҥKՅfii9qE^ʝ;wp:ttt0ccchZ|>/N7o֭[vFFF֭[ikkŋLNNX\\fa6kuu~VVVbׯ_łJ"<<3gK/1<@߳g{!""L&ٳh48q^OSS8q-[)))deeԄT*EсRo|qq1O>$1116|I8p;vLB{P( =Jvv6rL͛L&6oL  ,, RICCh4|IJJJ ]^7oLWWSSSjߏN#GדFvv6`4illA&&&'$$&&&D__ٵkD133#DGGGy1͘L&N:D"ɓU}***ŋp<YYY;33ؘpܣGhpdqq\o~i|>B9Bll,rZMll,ٺu+* T*UcffHx ZWR]["˗իW~cv^uVVVy_'Ovajjp=>wyqz{{tׯ_˩Shhh… |>^uJH${"?;wr%2>.^8w!44VׁvǙdmmg9)""""""""S t{Gbb"wٳfS8 ~R)< ܸqCp?9{~:+++|܃:u6m$n!''4.~?)INNɉ'p,,,;3ϐ8\tIRUUEII 8qzQ(~?ShooguuNB`yyy ߃ۃrrr8z(zEرc. NDZc cbbO>Ɇ g߾}ffmmǧ7xO>$,[*Rȑ#> 7L|;>WWzL&kkk[ܹlߐ;'jNkk+KKKlܸrz{{ٽ{7vbnnuutvvD"tyf#;;ߏJ"66uFᠵe|>. TJii)۶mcqqN222xꩧp±G||<ZoΥKHNNj244lOXKbbb$..q߂/Ga\\ٳg߉|T_Hشi999vN'l6~mVVVغu+IIIBd222PT>|%.\@yy9fW+뙙\ ?3MMMb2Z444000@oo/DPSx bcc)~_~?;w099Ν;H ap199֭[h4(--ERq N^&T* utop.\ \ ڇb6$'' \.l((( ))XvIttp܄rssy׹r ~!kkkr1sw:X/JTJ{{;LLLP]]W\oyt133Å qx^~_144B nݺIIIn41LܼyEqJJ lڴ~?III(JRRRf FEEQZZF|._| &<YYY277w\jaEDo( ˘rss!??2F#iiil6Ojj*v ؼy3.rrrطoRɄBرc$$$E< N||gPP,M.ILLL&ciil"##"::F#ԃf !!!,,,h8vjZ@!Aaa!RH|I dddAbb"240L&JJJضm111c9|0999ĦMظq="qyyyjl6dffDtt4111FRRRCדjec0Ea0j !?~LFAAYOOO'%%HLL :N8nIJJfQRRB^^޺vqR(<qqqHu"qnxJ%aaac6dn8`H[x<.]$egggϞo*]DDDDDDDĄ8kkk({2Pkl6233ى#NSSd?~Q*ꯤ@"JzdB|-> NS>qL&4)L&zZ䠨ǝ'2;l"(w^D"k|o.o̺$"""""""MF"b#ϷQraپroʇpp#D" X̗5O> n@/`f[= Nϳ'ϣ#_E}[X@BS?Η|#S܁G?TaSܽ^/zuCLqaT4/o^ GB?CzHݩ""" ۽ރxXXX 9Vmr fYsl6|>ߺ봼q,,,k㏏q6*R^^n7/_ioox^ 333\xiZ\zn[ejX>22•+W$&&恢A5sBA}}=L&F#fsa6IMMeeeׯԄRD̵kth4࣏snޣEVVVRSS#S].UUUrZZZHOODillD|2$&&3ghlldhht 11Q6w[,n޼I]]V˗)**zؕihhj"Jyٸq#2 Omm-@w}B!B}Y, IIIzUGGGr P^^N}}=Q;wPYYbh4ٳgF!ɸr ]]] .8ճV+bd!s{{{;ddd0::<333;w~É]^^c0P*.\a|˜?:IJJ*RSSl6[oիW8|M6l؀J>jw9fxx: c( \ng~~˗/s^/.v <_t?$%%ET* 51K}}|LL̚{C\\---477e,.]bttɴnt餶vzzzغu+MMM;v-[PWWG[[PSSCjjvX,ǯV߸q YYY봵FHvjR__σ0LۿsU$Ih۷y&|p88}4)))?aN8J7oR[[:u ?.<8Ξ=T;# Jvv6ׯ_Ν;T*ill$ z*NFFF\~'N099$===c2X]]EReN<ĄXz>3Q , Vihh`aaFC^^ܽ{G}D `vvOyy9:VcZ)((  r… hmmʕ+ ٳgrM.]Dcc#0==M0saZ5_8x<0>>ΥKhnn&NP(A~ci'333>}BArr2:{Q6O>BWWNB$pڵ_PLCC555!vwwϙ3ghmm]3fٸp7n͵k׸|2N+W>\.\|EFFF֭[/os]P*zu>s . ΅ '''IΟ?իW7ٽ{72;;KMM zZիWX^Oqq1iiiܺu xԎ^իWE;eΝ$$$z>Ƹ|2AѮHMMe߾}`XŋdggsYq ٵk,--۞p8L0|yNyy9Joo/7ofxxZf3+++l޼rKMM eR:wbbt, ΝJE~~>ܹsõkhnn/~:qqq?~|6B!N>vc\\\dl6.^HLL jO?z&''h4#~_N}}=h4q>y;w1J%n .%y`08~8~ihh p bbbX,ܸqzzz^$I&PZZ^h42== Fp}x7ٴi[oQ^^brBFF===v>3gCh|T*9x t:z=III8p(Qt ={xv)++ 66@ss3]]]parrrW#܌`RdrVTvVV۷otb2HJJ@aa!nGb0(//?ovvQ~_RZZʡCHJJbzzX2::ӧ|\.jkkILL?bpI._۷qq^Vĉ8N\ݎn?9eee=zXfff466244Dss3sssjv;gϞ+ "66ш^'!! jϭ7P(0\~dZ-MMM Ԅl棏>";W8v@>S.]fvS__Oll,iii$''s)qkkkhmmd2:ϐ^<bll (~yשjfV1Dy:|~?dee͛vccc Ftt4x^8@rr2NRjʕ+y! ?9IOO磏>ܹs$%% ?HLLDCTTqqql۶ HFF'r}/55\~9}4111IMMe֭ab{>c=2~yjjj'##yN:`11`֭dggԄ餻!)((G?@$TTT0<GVVXO?IGG,,,@VVfƍ7ؿ? ( tDllد$I]P(h'ӧOKee%.\p0>>.z<͈@ߏZ'? ܼyNGkk+sss ӟwɓRRRN룱_A3`sv͛7_k׮r̙3g?[3TVs~m( Juy&DGG;K[[Jfcbb/=ؑϫ q6mܜeHJJȑ#Fl6&js\.l6N'kzjNOOg~~^ 9z=!˄B!qݼ;?8fffɓTWWZ),,\ <p\v)zihh`hhrQv;kF!,,,p=fggŹMYY;wtdp:PT%g( Q\\^UvѢ=*JJCRtttA>|(z7?NEEzTx!eee:tX  yw)..p8L^^h4xHOO'##Ų]B!|299gǎLqq1P(/ຠl6Enn. bVTTUUUA||vsNjn~11 TTT~HJJ"33(Ĉkbss3b{x z-G "9Fd?(Jq} TTTMJJ [lpP\\Lee%)))JD[[(Jbbb8pcrr`0ȑ#Godjjv;ccc,--i4~m>̕+W8z(>˗/lYebb\a$I*P(aBК_;?OGsU?{EZZ7xr=JBVoq11iaՅp͛7X,044ğgJ%6 K?ܾ}i~RDV._̵k0Lx^?t:q:,..UUU ̶mhiiahh[nDRyy9华?!h^NNɄa:::uM/6''yN>e֭HVc سgdzw^1 '-..ߧgvr#됞JAj5fƸq \xqäA{ ߿Ν… \.B_Zx^ŋf|ܺuaZZZ-QWW W^ezz{.fykBjRRRbAP`2D5(//`0K~~8w#]\\###pȠDҳśobT*)..7zECMM s˖-aD2Rb?^LłJ"//o 줩eT*fHvv6pyhjjbsEFT200sXYYa˖-mEEAȰAѠVEq^{5hhhzimmeddVWW9q39=2rJru0TVVfΞ=K0$>>WW|磾+W/[k.)**b˖-vU]]M__lݺ}q=?NRRѼ{e^ٷo3gά9zrrr BAAAX*J$qW\6>>Nbb"@~ h4:;;zhZكh4lfuu"Z-\.bbbػw/@ANN i, 6m}Ĉ"}}}l6xfggE"ȰY222HOOt111,,,Ve||qIMMebb,hZ>|HVVVIRSSŋ xra20L8mԔHRYYY8L t:N'錍}vT*hЛ6mjbZQ(ddduVz{{|رD1UVSTT Vx BtvvvZ 11Jjd2aIKKcnnшEROp8n'==E?B_ѣGl63??϶mL}P*n9vIJJAWJJ }}}ƒKKK7SRg2kvZMrr2ǣP(Dĵb65`7o=ãhZp8rٙ<kZRRZB(/s>|H0d2o-#͆j%..]vx7o&ؾ};iiiXV0aFFFd˖-沼fטF222D6KWWQXXHCCUUU"Z0 KKKk;DEEABBVLt:LLLv&))^d2166$ {nqӍ$Kh4RXX(gggP(z)**h42<NsMtk2Kp8,j}Al6. xo6T]#z&A0.kÑ& OU|LNN><$I$ZdQqzLMMp$db"CTl|v?u|YEwNk׮zױ {%z{{IOOgbbݻw2l5Y7Y]]}[+3YZZ "% ^QY]]%xX^^͛7w^ }}}dffʼX,$&&444D?G!>>m۷k.)=''5\(ifddb1upByy9YYYq$I$雉HsRш\ag5 #eqG/Xd^_dHEW8ZJB_ã`_%/[z{>̿OoO BP(rNGob6/[6b]%I$Iz5Dr>mٲexgzzZV][JMvT*ZwFN`ppRI~~>pX(.FCTTԷ{,I$I$Ivl6%%%"PWDEEm| ⩟!;ƛoɎ;DρAxc+I$I$Id[_XXԩS~Ĉ6ۍ|a ɼ"A %I$I$I$s(v3==-#?M̼a ٳEB֥W<$I$I$I_. QռTWWO.$OR8x Q+IDAT@`0 _q$I$I$I]("==5O'U0@_ZZ_x,//+ZVVV_$$I$I$IQ$ʊ}$|-//j}2k^򷽭$I$I$Iʊ^WC}]z$ $I$I$I$IF_$I$I$I$=?r$I$I$I$d.I$I$I$I/&x%tEXtdate:create2019-01-17T15:45:24-05:00t%tEXtdate:modify2019-01-17T15:45:24-05:00?IENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-select-a-1.png000066400000000000000000005112661414302661500266240ustar00rootroot00000000000000PNG  IHDR 6wgAMA a cHRMz&u0`:pQ<bKGDtIME &IDATxw|}lX{o"EuYId(.u9'ſrn9Q,˒HV(Q(Dm,"h褮s]RVfj : !B!C(ecYoUyFIiڨ709} j Qi\?9mt]B]7PF)u8Kӭi(,>]61iiçO~ kg/{-QҜ9kZ|y\ݖ*7y-LB|ٶ², m+4+}}}fNк-Ƕm8.]׉Ǔn+u;{tye8(@G#߁m_B!5eqaJJJ0 zjk'E*M G RA1(رc7t^o;v̙3 9r%KnpPR*_&ᠣF233hllodee߿SNQ]=SNEĉAtvvǶm/~VN'N ۶xo8+V^uxp:P__\n맯ӴhiipũSp\x^vÖ-[(,,@ 餮p8LVV՝  w AYY9eq b8YYYD"aN:ʕ+Yf SNq:]k+?j炙xiii=}hƉ͖5^N:̟?cǎEff&G'//_D"f͚}fBq~eўzB!(-ϡÑn~1H~[{zzhooti^}leedgg >}:==C:l&Ƚ40T}B\lۦ'z-|[ũSO~כ(//g%X>~6zs[Ahll`ΜqTUUNKK ?sGaJD"Q6mHyyJYlp!zL͛C-&EGxĢ$E](w 6pA^/ǎcHj?&++}{[}P(ĩSlٲ^n7G)h499BaO| _g޽l۶./nlJWW7>(L>Yf~lΝz((($ >F0@ :;;'LqضE,C7t( \!J) Cؽ{7w5k>orS\\Dj|v~~N۶%##z/˲Xz5 '3?DYYa`ΝѣGYf ]jժqTUUٸq#_lJQfժ8N~?e3i$VZͯkjjjD4̙ͬY3oBu/_Nccsc:t9sfЀ0tVbr! !7uM3e9z|>lۢp8bY9ƄϟAOOK1ier9nZZv䯔" 3s,:DGG;zG~[3MiaY?YY̚BT2.((dٲXt J)zf̘i2ct*++9s&aPTTĜ9scƌ,\lbL6*fΜDm` @8"#Kuu5SNS[[a…x 2u*++1 ٳbedffrhkk;=̅כٳ7o.L: PVVF8ᡇ9sR\\ٳ(--e,X0 ,ˤP(ĤI%??ٳ琓gi!,X?DOOmswdq:]̙3ŋcY6yy\wu̟?X,ƛ2e2&Uz2g**xTVV2i$f͚Maax^.\M7Ȓ%KN1gn&t]byxb^t=9kNe)ɰ \=v'p8P*9xjFu8󅗚}4MRCf] ۶| >UF*O˲a2S:iiy[Cgg'}}&i&b`|+Ç xx|_j\.[RMus=Ǿ}hoo0.Nz֭[Ǵiv x7x뭷Xr%uuuknep87`;M7ޠ^{Rh /I|B!B9-蚦ׇgvshz:֬YeYvmL>}uMhooo{AuV^MNN;#eYzlٲ^̙Cee%o6%%%y[Nj:Ry~pB à˗iii᭷iǎ{sWJe>8>K8W^9sp-r)?>Ś5k0M[nٳgx8Ǐ'aǏgҥlذ}uxyY[/Lgg';w.<;w>#N8Agg'?g|MfϞvZ{Yr%,^[n#GŴip:dx;wҗĦMO8z(_9z(0 illdƌ~1t6^x_xw2e l۶ 0,Gxbjkk/yB!B3lbڴi|_f֬Yum&F妛n:o!apmO?0uE,#iz+|*5k7xgpضM,ӭͺC=7 &>xbX,M-rtŰ,j/g>Qm{1/Q\\L<'3g555"ۍ$JB!B\ņH=#++lrssym6^度R\)((t&77n{Bbt:DE" ' Bx^n7e7TM:rBq~? ӓEQ233zTF<n5|ԹD)E4Mh4F)٘I"[G!B!4lgu/y*\Hp-Spg߅?\YH$ؾ};sIv!B!i]]]]R3꧖YB!BqusDB!BqsdffwB!Bk~Y!B!RI.B!BL !B!B!B! G ~v!B!_*@bpLjAiixWC!B!oѨi\۶xJ$dffRSSR*]Rj_*u۶S*TG*o:%²,"?ЎcGΤK=} 3S6x^;09̶!׊A'+i *.Ha>NVǖXʸV4N_] ~_(N~Ni+;}SυB!Zַ=n Bddd`F:u px<݅;۶M~~>M{{;L"---Aff&i>Iww7===|>\.a`&|>8twwrx<ݍ`aCss3~4Mh4Jvv6tvvvz҂mdeea@ft]G[[9 Ds4k>lP^li˂~ LTܚj6dd$VnLE5 ZZtv6Ϛ 0)C *+Ϥ5ٸI6~cH@0|mc|?4&fp;EtRYyf)`N\ +ESLf@#x gƐz!Bq55@ٽ{7)SN4%##P(F4x^>CvEmm-N,KG$p[5M#cYDQz-˧~ʌ3hnn瞣ŋsa>cnJss33fgΜ9zjrmg^z%L$''4yؽ{7wf.={!RSSC0W^>`ٲe/_ݻټy33gdl۶uQZZJ"?9Npp8x9q{aܹ8sνeY$ ,0 >P(tt$^ۆx\Pӣ۫c o`@_òz:?fdLEoFOOr[*`'w;ذAeͱco e{.-xMlڦE\de)Qi8NV7Ʀt;n/c[6 wdX\@l.jjvC,j\C=P8t  Cm6>m͛;]ix^B}>"fLW&nk:byrt`o^O/r1+FUvv>k[3-ox]B!⢌ݲ,nFGEu?eYu]455Łm]י;w.---?~yHkk+xo-[ӓpKKK={9]n7O=J)ܹs6m3gdϞ=<=z4\__ϱc())4M,pK^^yyy|_" 9ݬl6nR<<'?,rrrx駉D"? | _pFvACC7x#=zȑ#,\pkt:Q 6D<_yyy,1T,:_jW^q1cܹGtvjTV=jAk֭Lkhbp 68yRCOdf*εxubݭ;NN߿w~'NvJ߰ɍYiܙl̄<uinN>fͲhh74;[q&^^M͛H V,/ssliقpsXVp23&M&vdAN%BJܲ`3wTcףPLϛμy<3z=dO'(8<gqxjpM!B!FbY^NÓO>M7ĦMD"K.oѣTUUqmQ[[˪U k.(z+r _=555Îouɇ~Huu5SNrbڵ<n\.WE4M}]O$`~wP(ċ/Z|rntw};>kעiZn^|9-g}RnV_4կ~ESSӘǙ+lY[\Sqtz{5"={ ,~: Ѩáx'x[ɀ﮻ld jdg+ow}_vqdunb| CqVpmsp&2;9p HvO7taYC?O+s>9w2}n͡C4p 4|s7YZڜZn-)9S8u fu ;e7skyȪ< n?N݉,>:7@aF!N}nb}z65oeװdyx\v*P"ĦM49ueA],wOBm?f(t8}hEECx]Gee%䝎ӕ0c..4ߏ:}bX d_az+|>6_Bs--K{}.46&'np:+-3zC,+9'9+5q^Evvr#$(+ƙz͞mq} 83G^8p(22]dg!yBr*ƢEfs̪ѩRU@lP+^X?q;4t%o`V6MM˾}K[@"{ǴMn* [ٸ 7r/D@3Y,RB!B\Fi`Jrrr0 } ,Ш1 7قh'nhl9z4=z&OxSG)2-B!z%KLuNͅ38O>q9̙44,[f2iɓ&&{ 4X[L$ǬwIQљRd83(󕱣m{̠(K[zrIX 6lps_}d82P(r<9dsf-dQɢ{X4 q݋ aa֢:ւ` ƮD QgƤ{iL1tpXcFv@@߈k>%/pe t .gp}끬ke=xi.]jm׈'/u gO_džgVn .N3ܵK{ACCrLXL_ʶ33&_?q23հ!5zzh 6J^!g>lL–wB!b"u覞x}Fz>uәA}mxZ֥#Kgǒ)NTV>88.Tm*ܝٯTH`#k4mOoNp '.7tNx~?F+o)eeYF!y P.6oԟyB!B\FmAWF]RXօM>>o)>gR\HB!q\zR 4ǻW rB!b|藞B!B!.B!B! B!B1H.B!BLNwKmkwW]uDžJ.ea/b=1|^xy !1@WJ n~?iH$^y,N'bK:^,BPvv9^m \s> @,ckhk3p27U@5(p8]~H`08++8 Äat";;;Zi //諭B! 5M#c&%ȊFಬwn6]]]|>/KWWaPRRrbQPP.'.k===s3b(pt:ϛ^uV^O`4M \Wve}|4 0bcJo&`qA***x30~s璗.7Hor 7`&555\MB!bt6o {.֯_OSS9pAF|!7=R?W }K4e?@ϗi;>1n:Iu<|06mtX݅Jgg'[lA)Ŕ)SXd ̜93gzjvލ殻b}vӧOG)'{n={6:t 9yyy`SN <l۶ wߝO>z|>n6y:u*6msXc9i$t:D"DQ$##={p=:N9syf4MĉqC>gs4&BK,a֭זe(cҥ8m6(..f׮] 0 nxhy7ҥK B˜8qb.={(mAFF,`% QbL0$HD7G bDQ4MKƍ n:BPzRP(  3WANWW'b``HNY^^΢E4F8|0nGyLB!q~ +ؿ?/"> SL9'.ɼy4i===<3хC<3>dFgw)h4oA(b>yyy#vurt]onyt{Ekk+=Xlq .c7|3_=n˲~cGBdz++\GD 0z1%{ 9m 3sf+=9VJ+?s'xp҃ɾtih+żyv|zX{3+wkN!bG) |>.\FGgg'---455|0P:tzòeXti {06=Jii)|;a…XE$a֭L:`zFx<ή]8y$|;L4 A 8y$_od˖-ر9ضM__3l=t]Owe|^R>t=Ohl!hpa‰0}>ԝ>̉ w0t;޺4ihS}p'] lmʡCF{&X[ȼyd1MxH*@Rrssx<餸SNQPPa̛79s0sL/^L$t, 0 7_O4*233tM"$=SPPܹsq:$ x9y$.~\:::榛nGt7т_4 sCyyy{{nn.X磦"rssvSUUEee%DiӦ%//\^orH$b1f͚Eee%}}}ضMaaeY:j/hH4)))cΜ9L:x<gKFFwyyy%n7@<|A˩N/XQQAii)Ü9s ##EQ\\L(J_?M|k~V~8s=B!s~k6dъH$hllpPUUuYG鱕h nMKQ999x2>;5QREEE:@#HPTT4l>ÝԾÝ˲hhh@u.,䐑qu͎7g&Іn+{H34vzp3˵&YM7У:_/:{RQY.oO4g k?}5߃{&5ˬ H"`ƌ| lj*JI>+IηZ AMғӥZS|S>UiPZZJNNxq e=!Bv]x/5@O-j#v333?r.G]hr<vr×TK~jqS%ƴI0 ➮#49 6\ᵼTWykqF*0 VT0?8.xn| G S ~H7UtR!bö / ]r;Mp~Ld``D"qɕw8dggrғ]j@:dee BZ5֞=q_2lNO"w9qVVcV^Eso!u)ES}> H[R ںgdd׾)ғ\^4MtMB!1@/4VuyR?tJCKwgOJ),n|\…B!Zw+J{*c<Ɵ !B# B!B `ЭU!B!9z<' w]B!BϭL\.א׆蚦 ul*B!B\ MrKҦVo B!n{.YYY^J۶i.gϜ~13<5R ԰ضR*p3ñ, Md !!crwx}N{vg;Ω;B ]3óM=) xy[w,;ƷohF$zɷm˗os!&OL{{;=uuu̟?6^yVZE$>"'__عs'ekʕ+immeʔ)8{+W䗿% /Yp!J)z-{=N8ɓٶm۷o(?яG[M.O!8[0_ߧiӦ~~F:u*G套^O?PVVƊ+xz1k,Z[[Ȏ;p8|>?>L|r~_o>jjjD"پ};]w@^zUVͤIy9pSL^x>͛7`}]}?ԩS'B ۦMƞ={RZ7n!]~CCyyys=t:[&:/_*СCTWW|LVZƍ9rMMMqYx1K.#B!Fp8馛W۩I&@nn.O<-Ʋ,,XatuuD裏8q`b~;grl2|I֭[G{{{ r}QPP@VV .4q\q<]N̙׾5پ};ӦMOO;w. sNy=J}}xj!dɒ%3~?gƶmJJJ1c6l׿5Z(,,L̙3믿Χ~墪 ǃR Emm-dddPUUEyy9nn̙ɓ'9q~;x9q?+*x\JJJ[ )))sb榿?S 5kmS^^Δ)SOxW477M7oꫯyf<UUU^)SҒn&[54Mtra-[Fnn.n_|D"Aaaxj!MmEEE)..NLJ9spTVV3|˱m*&Mիy7qê*rrruXhJ)~_cǎQSSCcc#UUU";;"^/{LNN ?k?Lmmmԏ ˲x9y$O?tĤD$ ֯_ټy37n$;;|_ȑ# e֭[3<'Yx1>,-bq޽,_ߥN~_h"nF6mđ#GX~=6m/~ir:B!۷o?駟&//83 㯾*.G}4_j[$Inٲ 6PPP7 {18@$O?e۶m<3dffos>Lbݺuܹ~ ?|0i2{l&YYY;vlOB L)ŦMذa< CB!^y~?<5M>;vuVnJee%ȃ>F]{Oz X7̳>ˌ3صkWTmj*W</~saMuOw>;pe eY?3b11M_W8p"?я|S]]͖-[XbL2K2}t,^{[2{lR@ @EE7o&qyN<]wEQQoϰmb~D"{gv[?>J)5k:֭vs=\(=8`2x78qeee /g^+WԩSYt)SLnp8+ݻYp!p8QUUņ m}|r{qݼk޽˅=*++~FCCDOAAk׮eʔ)L>M8v'N dɒ!B!`?#TUUQ__믿ΩS(//׿ `Ŋ_`0曙4iu]ꫯgzw륫Z>c222زe >---| _0-K__,_UV]wݕi:D^^Rx<~XE88'^z{{ӝ5Mߟ%(Jw+((pH$p\200^=// eݍIsH$Naa!xA" rssQJсiA^^b14M#??X,F0Ķm?6bmvIp.bTiM<G4 1M^ ᠷ۶x<M$AӴ!7`ǃeYtuup8OFq\b1$77D"rɡ{ȾD" L .+5> ׇB19$n+**"@vv6ח,//whqq1`L88NmN,Bu x<"@GNNxNRx<|>x@ @("++ O4MI @)LܞzB!^/yyyCƫK.B!B|ӍɩuЕR eqR!B! j>1 ЅB!B @t!B!b]!B!$@B!B!& ЅB!B @t!B!bpwF??ގ˽!r1 ˲ƻB!m<#7ի/B!B!& gdd5B!>W 770ƻ*B! 77hwM7F?XB\V ә9UiQRR1G !WxY_?헬ŅsFR\.\.K,c]=!BqB9:='Ofͬ]?ܜB!8mz0رcqjjj0 #G:SLA4,ˢ>0eeeijj>n!&hFoO3f`tZ~jNd,B1)@?rQ\\L?@72g>cW®]8pg@KK Jqq1k֬OOcBkºv`2O/p3ݘB!R߿~nR,_jkk9pX $;ڶ߾}=Nbܹ-WYfqEB!ĩ6o!Οm̏F:kJA"o$Euk  YA^L: 6_Mn?^bo @~sϱNeN[CR6߱}Q_8ƯնZ|t4A?.h5 niT|%yw7(N(mد=jh2@{8NѨ~/`8Zy|v֮Bq)uAܸ.*1Hכ5-ɓTVVo|#G if\. 0 LK(;Nm/fr_!955HtHάnO&JͶnx+k:h:_ \tA\۶dϗb}f=9cydk[;cU]=*~z^:g79;Ӌwҿ{zi,:+Ֆ18'Uk|+zB6 iT4<Ϝ9+WrJ0MxޝEgK%vBkl&,GШ{8;Wp?dnߍtp'P}F %7qB1,&ap&tn8}ŗD2]!.R:$XI%p٧ҀJ1˴+6 J!B11(<N7tCgڴ] !#m|)[8B!#ŅsC IS ΅B!&2 ЅZ B!&<&B!BL !B!B!B! B!B1H.B!BL !B!B!B! B!B1H.B!BL !B!B!B! 0 yCn6H3EݑeϪvs!-:BubuKgKnvNs?v#bn!C҄N̝:,v*@} #礋ݴQlHbn!l[XYƍ1MuذF;A)֭[im}Çs1ݷoǏO?7M>1wIvڕ~ɦMQΕma5nAEzٰaht#qG}c"ur?b8wEƉJu@U'A\8}Iaw1W> N:ƧKEG=b_ٿivhq9(ۿ[6nxy cJskB!/G+V?|׮]_Db䝬c`??s#K/_9B!1BEUwk1rzu}GGu )}[ƅ{1yRg~Sjp7q >8G/B0\qz ! !B!B!B!0.xLӤMhiiA4PJa6لa8999@r6lۦ 0B!B eLz4嗿%===QYYI"?f(,z)oÇ?C"o6(**B!B!&1Yr%'Oo^ 33@"Iff&O>$X5Y*Ɓد ۝i}W) vs)D9=EXu  ڭCi5wM]ϱrYzKd)Eu賓Kph^Dy_9 np"^["GVuǼFy }vGǫPhXGO%AuIB~Bv;{?ǫ3UFn#d=c\Z&MFLr4tFM+Tv;{/ -l&fs"Rh0hJl<纟8.RY'Gmb| Pgη$;Q )BLLc #++ ۍi޽O>I[[@rSmP@i.kkcacW4_.Bk:t_0s,?S5:{IV*n8XH?H!$v;C52F'Uxn3gc9X.'s"`g$!׆M5>A -#fk_\NNGCgS{V`wI%Czc+Bv m4tlnR)[gH?a) s CNA˂xB!&1SNeŊlٲR"x[n%ݍ}ƍ߿&:Diiiz KIIɘu HHBKgЖsӞebG4DDrE]>y1cGrFcmc( ~s8G~V=MrиM0`hHt.b"/*y6lŋ8fѢEtttSXXwߝXv-n7RQQAvvxB!B1a X`==؈۾_Tu55zN!.do_5אzEi)ɹWl4!Itpm: syaXeY(H$SFt:LL?}Ƚq 9 ]C$ :p8Öp8us(ڠiNU37F$1V=@SAB4[%ef}d 5 onZlGBQqA:ȾPS_찦f|4MnPJa&s0577>}:4551{tnDQJ\s?ԁ+&MRMӆ-CuN8 >Ag'B{{X3f{Q^^Nqq1EEE$ qoαcxghhh`QSSSO=%AB!B1Ș#Gyf/\"k֬a֬Y}G?bx^0׾FWW?y衇9VGHhx+!84q3 k+B!RhἨ,QRRBqq1. 0ظq#`￟p8L8Ng{^"k׮oUn1nY!V6Ll$J.Bqz<5KѮd>i$VX#G(..& H$[xg1 uֱqFx^x i 3!NM !B\I[c 'Ọ>o`…a$[/^ɓ'ON___ݻ7'B!B!&1躮ss뭷<>++~$ ǐ.g?)eiڰG ]t!H2B!]׸\4kMp\缮:_ {Zۗ !ĵ¡gܙ@I.BqevڃLΔK=h҄.```-'$N! Q&''^t:@w:У] ! ~'xWE!BBB!B @t!B!b]!B!$@B!B!& ЅB!B @t!B!b]!B!$@B!B!& ЅB!B @t!B!b]!B!$@B!B!& ЅB!B @t!B!b]!B!$@B!B!& ЅB!B @t!B!bp5RD"m۸\.8nB)}8J)n7q !B!ʘt۶Yf ۶mr` w%??3fK<g׮]O[oEWW<8>v!B!bS~qVXRTTD(bӦML:{sKSSSzl,Y–-[Xf wy'yyy-״aO"SHB\8C9ڮ§$B!./d5Wj8.r0˙2e 7noA4@Ӵ! DZZZ'cY]w@ff&1{,ZZZNF)((K_ioofl*JB!We'K1},Ydff2k,|>dffh":Ŀ˿w~w{dϝB!B1)@w8>,pǓ0i$կpyx@M!ЅihWtB!s)k6pn7n _p唲"1Bq13;3H !B\ L7JUn @Ҕ[M>u;9ݲvB\X]n'( ЅB!Ņ uQyL⏾xWC!j?e ߟ|v"B!F!DžB!B @t!B!b]!B!$@B!B!& ЅB!B @t!B!b]!B!$@Bk=B! !nB!8 ЅsnF fj!B.B!B! B!B1H.B!BL2]!B!4MC4t=65B!B!eH$tB)m'׾ s]!B!8CnX u> !B!ᠴ۝n=m`Mg+-B!B|Avv6n;[eYbs]!B!,b˖-lݺ4;1,&B!B\3uTt]ӧzGL/-B!B! (**J> ЅB!B+D)ENNX5p)Xh4zEԅB!B1it\=x<>~xB!BqU,!-FpL>ZB!B!.p=cM(B!B+GYB!B!& ЅB!B @YB!Bx0k>ߖerƻB! !W!]uMPJmJ6!B\$@B!BG+|+at:%8B!22]!\!H.B!BL !B!B!B! B!B1\eY]+BuN'D".boa٢v%ϯHlJuǐYB!/d B(>꺎 ]Bu iwjNχz0$\Wj=gM|ϪeY=Nhi?SB!oo-@ubM4@ @ii)>scZ4'N@)Emm-.帖WMĉضMMM n{BjiX233`*<e?M[[~sHb4 ˲8qeKle;:YYYC֢غtl:e ٞ\j6a?B!btEFQJvÔ=T0`&n{ȏ\MS^tKZ*;;MR\D"HV}mN_K?ႀ1^;~ߊ$A"8>G #:it gi0 sQǕzfߨHx 'S!Bn}͚5ݻμyXnM$hJ6M9d~ȽKff&a q|g\.&MĽދ4M^/mmm|G֦[lNi_\۶, әNkvz_۶裏Ķm-[6ئ7m𱥤1i!uSA?$++[n%=8u̓ x4AĶm1qzxen|>WVp8x7ٵk˦M0M{wh4 4t0O>,͔T+pJoK+[onKSw:;۶8M*?R(((Ho{q8<$ :ć~{,]ԍg1ՅvsNRo(⭷b…LM6QVVFcc#555F-JS#uD"=_!Bt4Yv-˖-c…dddʕ+D"̟?*V^wq^_)S0{l6mD$ᦛn"{a_,]0hii+_ ʕ+`buuuq^:4ܜ{͚5QVVƽ B[l> '' ΝKNN΄ 4M#uVu3f0mڴ ?R߿իWz{ٽ{7ǏG}W_}HBwy'6mMOO"??~z233y"H裏{n=JEE<^H$֭[A4NʬY \Ͼѕw__bƍ8pk֬m.:;; ;LT]]UsVGuKn! g{}v؞gǞ@BP 9*tt#%@уPW{ι>y÷At:wuU{,~l߾gbbUVT*CPfZZZxioog~~;v|9~}dd(x;s@ @OOFxCp8P*YD¥K"??{WXjkkˣgm۶%/^ҥKjvA]]ݻ۷3<ZZZj| //`0Ț5kXb.]Bד&xwQT̤BeΟ? Rƀ6 m64 ^-[PSS jFP(0rNRR`p?`ZBܹs ᶋ r.p8OOX,\|Q֬YCzz:,[۷SZZJRR\|~Zez=uuutwwc0C&qT*jCgqE#"پ};/_fzz`0k&<~|N:Yjyyylٲ%sf!y뭷eӦMGII {%>>Ņ /^5OndD֪o~|Mrrr(//'cZ!^xۙ ;; 6Faa! 0::Jii):u Kff&<MMM80XիWs***ѣBzA$̙3$$$PUU餪1"344DNN{#"""""""r@z(<Νȑ#L&B:[R__ r@RRFߌjVp8d000@ZZsssx<JPΝ;t,[Gy:x0wȇUUU ذa?~>󉏏gvv\NJJ ZX06l<3u]$$$T*h4366Fgg';w$ <[oZ&## ={VZEzz:SWWǁH$hZJFz=Jx 2 DBbb`0Hff&֭CzP;@PPP,-rؐhl߾cǎQSSÖ-[ɿyIDAT駟Fղj*dh4L&T*f3nd4 j0 ZZZ>w+<˖-1yuŇ^PLTTk֬رcFy$66V j8tϟgݺuK*G>qqqǣT* ĠR0 <2LXxjZ8Dcr\8XV+byӉ\."kDtu:hf>@,"Hd2 by ,%תxWFg?E(b||TJnn I\\磿%zllLbD\s|\[6 łV%>>~ɜz8[1>>.x7_[[[IKKl6& @p8ϬT*r].ק&\D>ȘEdnp8nDDGG ԟb0ͷu~,4A!G?j{?id2F!|Rk ≎hGZ>iRE."""""""""r""""""""""""""wbE ;@f[Q1[ɵ$na~˵CP%ODy'5O~_К]D4E>ܪy+""""""""rzQ('::߯-ncQ*[;K^/cϓ?bA69cX0Cχ`MELLL`6QՂ&$f|W}^%M }-GJH$0PL&,"$ɖ}u>.oWݷ3-`3BD';FOFaRmL=GR"-"""""""""N޿8Zia0Ir9ě͋bو!>>N'JLj5}}}$''j!--M0ڰd2 zgϒݻb#;b bEff& ͑Ĩ|wxEmc a ,,,6 #@gg'/"?8YYYw>|]>^rt%!!f/>Β#x҄aq\dee-́<bjjP(N#??Bdv,###dggRgY$,^/}}}wZZZx)))_*J;\=\.<8_IHH~㩧"99O|z_~CAA۶m_*VZ-ccc8☞ѣ| _  RHHHb[`WW|'`tt_p8җ?B}Zl,8p_~_~d<###nbcc1ۿ?X_ L&KLL "Ɉpfi/KYl?8r&&&B322'==Dr@ @jj*N?!͛woffo~<ڵ J8F3<˗ٱcn^d2iii.""""""""rvihhGUUw~ t[oEcc#}}}h4FGGIOO7=D׿'q\X,n7_|k޽C   v 1_˿><288saٲettt|tzd2?y/rJJ%kfΝ;ZG?3---z$ f ~6rrrZ˿ i|CJ>}Xz5?IJJ wu:tf/;L||lݺSO=$^@ !==k{&x !e!ZM||<˗s300׿u~0L>}R_җ8z(uuu<裼[_,J!rsXJBBx"""""""")!M#G>@7( ⡇B}`qC$4 Kii)/D.S^^T*=Zyx9{,4a"[߈+R$!!J%##CڰaɂiiiTUUa0LqY.^Huu5+V  x0LDEE L&6===߿GBB|`6~g%)) L`0e.]ěo7M ۔S\\|D"c裏o~V\Q~ӟrξECİ|rr9V$$$ `Ŋy^x<B#"a/FsE9 J',rk>?_E=χ`0\5'"2sתb~#}H$XVt:J,~|>ȼ_.{*\BVh!#B0\"\׷s֡?;6)r9:n["`P*? nygߏEAnT[82C_o#ߏ!**'RM. ###T*lKD>|>|>ZDDDDDDDDD>]͡Vnۯi_e}a&''1boTzqOEH8Ǿ֧@ ;7Ӊ!Ctt4s!t:>&""""""""v_Mqq-mr ZY4 :v333Vrt:?8Nn7)"""""""""VǺvx"9"ElwAzt@D!R N_nU?xc("""""Y鯪r3==Mss3 ^O AF#~zxRaZijjbzzh!{``.GBܵZ-vfn7f:rP((Jikka2p8477x0͸nDբh^/\|> nd2ْ豱1`0 `llX$ }}}ttt Ӵn2ixzzz0 ׬rhjjjb6XYXXʕ+ 055E\\=zTJOOCCCx<B:tRd;0_qAЈIj8q|꓈ȝfTOD!jwww@ @ii)gΜĉX,Yl g6l@TT O?4wn\+V`zzSSS]Xjw^زe BP={I=JBBR}QWWǦMΟ?ϪUhnnwIIIdffյWXb^ 11Q8frr#GPRR"ڻw/͘f8s Kvv6SUUE `03xP* ~_h ɖ{ll, `^Jfz{{vT*arrP( DGG3jjj(++[UUEzzUmmmXV)//_rp8+Bgg' (Jӗ\r F[oEii)/+Vl63>>ΩS.(Jfgg (d2Ο?# ˗yw`0xWزe FN0B!zzzf188Hmm-555ر*rGDDDDDDQ V\ɖ-[\P^^C|AvŹsP__"''`0Hff& K(~`HR|A ?OlCo>0iii|k__AnJ[[822Bww7L&cff\F#_l'?v mPx^VP _---At:_x<'?tqF6n?j6FχD"A0??MW 6n&233ns1hhhW?yyytww366FGG XV, ]]]Rhoo_פJ<02 RI||<9Gz,.^DNA"̾}(//GVs/(őOVVǫD"b~zΝ;JBR100b~~ŋ$388f{=4 YYY=z$%''CccR\gddXchhRضm$&&RPP/HFFNfff8u7سg`j4^}URSS x^J9s??1.^֭[Z_{ҥK키frYL/++ٻw/CCCX,x ^~e]zy衇DYV˿Kڸr ֭[r ݻywdhZzPTTDWWshjjb w%77B ގn'77ulN'> {dBAGG>(LMMrJT*iiitttPQQqurC.k6},,,pARRR JK_r*0LLMMrnZ ">>J`ivD< ޷oYYY_5eeeK,,,rxY~Cf׮]|%oRTTDQQΝbk.fY8X,?ؽ{7'O}I{0QQQ<,_l/0==" Dee%=зd>F#^MCC111rJO0izJ444#<6Rۍ㡿%rjT*󚗗Wbccxp8@5kPYY)~B!֯_/xI#]]]TWWv])@@XKR)w}7>._sQVVl&//rF_ftww4_رcCCCh4կzjJ%k֬_* |>T*<V5k֐;}Φe˖Q^^~UT*eddcǎ/~L&Q*QT( RUSTPSSÚ5k'77JJ%ݸn%KCCXYf җDII J;wCAyy9###v)((p8O<$344gjjA ;5v;aIOOgDGGSYYIll,8JKK ddd088###tuuhZF# `ٮahh)&&&>r~s|>!pbb _^ORR@@jjS ng͑/䫏2??brR4CCC\.~iX|9>Gꫯj*x4LNN" BLOOcZI rJ ADoo/ XV$%fff#ɰ팏lxආ\|~bJ%J஻"&&8<Ν#==]055UtOmm#lZioog||nj0:7t:9{,Wŋ8N(**ǏcXzcӦMu]{vDB @R111e˖a6)++c׮]BUFFLLLZ""""""">4_6LhZ%%%KsgffhiiAR!̼Ź]]]B`BBpZt:*JT*nIgg'6M_v-vZ05558N|Az=(JIKK>.(r5se2 c0(,,$99$RRRtja#J(!E2;; wSWWZ桇b~~>V\)N\\EEE=99h, *\.˖-cժUֆ5:##B [nHXl+V --6Xf 999<`h4Z&++K.鄐iލbٳgMIIIaC=YWe2twwijj" #>JbɎD(:uu]..c;WYZ-Z~jrQ&''INNͿn>/:pkꠟ;w/o~sIQ`0煨4 rtн^/P誅=Rxlq5ONSI}'rPaF.: .kȭexxXpBݎRl6/?tDP(tK"`ciJ$OD"ARQQQA8&99S3VnVȝKDFw#_}XDf-Dr#BϜgz0?P,kuU'&&AT zb2|\xFGG766W\a||\p|>Afqw*TJQOj===466 +Ε+W\.Fӡ룩 x=uuu |>.\p8`6R)FQh .]b``шBApgg'Af3177Gll,2qjjjpݘL&ijjb6룷%n'P[[+TWW(nD"d2155ŕ+Wl)8^/uuu s,p8׭`QH~n7Od21;;Ktt;U܇yP*x71 WU0nF5CFFFC&nXVB466GLL J>h4zfgg5&66G]]"蠵JV0&yzi?t9wYYYBM1jkkZ0 466ۋR{8ɥK8jjj~*+rؿ?111|jhhLvy^aoo/hZz=333vs&''C"NGGh4fgg|2>X<W\abb8v;uuu Zf||+W\ي|(U?@W^SVVƉ'HQQLOOw^6mڄN㥗^ww[WW111,f~\yr9.\@ŋgll,z{{ԩS]LvQQQC.377^t255餩)"v&l6&Ql6s;Fvv6j&&&0͂TFQ1$ Dbazza ^^z%RSS1Ltuu/x'~?`Z͞={c۶mLMMIMM d2$ r{G.]wtJVV333hZx<7A*rIٻw/ףhԩSׇdC"p 餺._LCCX,B*`/|rc0ҥK V LOO(v"rssq/y~i0O&77WH_  bXXX`DEEC?[nf133޽{ٸq#6~?fCKKι\.ls p' ^~eimmE"xx饗tDGG3>>ٲe h4~Rf&''ijjb0dpphn7Nr~FFFZt:~333Crr2. J%ļ1224)))LMMVgK/{ٳgIOO̙3ۋrogyùsHMMܹs/Tկ~SXlUsGDDDDD'n'$$p8BrIXn/2s%%%͡P(ضmpr.HXnR]]Mzz: ^4$h4jbÆ 74CURDze˨#%%bL&lذ(W\aÆ ,[!dppzZ-h4H$őCQQTUUj*2Lbbbɡ LAA\xB***(..L O&66VKZZuuu|>4 999d2Ǹn.\@ww7V. x<?_'++_z= \ZZZZ[>III,_)..TYf ]]]L&… <qv؁̙3d26oތT*c t@}}=oqqqt:8@rr2uuup9:Tzyl455m'&&abbeee:u>FGGĉ/;4`믣P(0L>|,̓.Ο?ᠥϕ[ăVp~ 6ԄF;w`ddD$wno!Hhiiaxx-[vZ9=7ٳg |B?}}}K|/[ܼy3ꫂS0kb8x 111211T*eݺuɟl߾}1==Q߿4*++yQ8>zUo87@֭^fayW{k.T*y뭷{G{ {aʕ9qNMBB_җ8{,|{… hkk&ݻwSVVFnn.wf~~@{{;<#BAZZ{/͘L& ))),,, 9˗/Ev;N9R)6 <@C(B.#˅\BhNmӵHHH >>!JJJ8}4YB, 333Ko#a@ *M6zjHNN,.\o(b͚5XbɢKUUF9:::!&&[F0$..VXŋX,fffJ'"YYYbG%++ _*H$&&ž}ضmJRdº,JdA9kF$'"ܟ\.<@DQZZjf׭[ǣ>VUb1PRRªUضm`0L& Hزe '==tjjjHJJ")) HLLRn$ vtvv#c$ 333b!)) Mcc#CCCp8LWW¦%33ÇٳgEEE8 0 tuu cpj7eRR)l#4:::pEdaZBV+CCC`6)..fΝZUUO?M^^~_CB vBΜ9ɓ'annj~_˗/3??OSS} (J*++B0IOOcلFGGO\\֭"O(B0::4L&JKKٺu+r}YYYtuuI0p'̹q9 ٵk M|WX>:N8All,.^və3gHLLnsd2qqY|9TUUq1RRR(--ettw}Cyy9*cǎʕ+ܹs={\V\I[[ZFùsf``@ SXFQTbhhhޛȁ8---wSSSqݼɓ'+\E<,,,p)222r8<---\Moo/l6$ /^$''ZF!))'NpeXj>>EQ:$v.^Hww7pIKKcff&`Ĩcj!rT*9s\d׮]={8z(VB"paz{{)--%33'Or)++cǎj)++C.sa)--%;;SNqig?aRSSq\9rI{.""""">>4}ddYt:& ^O[[fݻwhp:䐚ZR-[]w݅f(|Ad2nx9EȕTT_G}q.QQQXV 66V(xP*x<222T*+e͚5H$Z[[ fiixJgg'SSSl޼"EB#zDbbb&##D/_l6oNBB)))xW~~>rƦMz̐xK%rj5}u]KZZ[laٲeXV <p6|>wcFB☟'&&!T&a6oJ_#9Nvbbbزe 111ձffnn͛7-+Jl&&&OJJ QQQBE$j`Æ XVIII< h4bccCP(򕚚RDSTTD8fyf3GBBM-~wHR$!!|R)ssss`0o~aܹ#z0lذ,N'p￟tcǎ撞^lfggرt <f:;;fӦMqe`۶mRX8IKKvu:v ax<<ƢP(h4:%P* //T!fOII +Wd||ʲeg```0HNN^ Z-.)))attdlBff&PHDF#)))h4RSSt F#qqqVYv-Nˮ]Yl0^C\0 x^ㅃLjw}8233پ};"b׮]dee111{Bf"Yjdgg3==hdǎB$ D,000)..\"""""/>Jb:8Yp+u?7nX}z%ŕ OBpٰaǎtP(L&{ )㳮D\C* EDDDDDD>  N)j6H^s ny#?p$7r\#|׵Slذp8L\\ܧj"ȏ3Ox."M}p8LQQ˗/GV/icgϛF!|ZFk :S5gnռDrE>UDDDDDDn.zBc;N|>^3H$B§f$Hͺ0.Kk2LX,x,HD1\&""""""""!"zWpJuCX?H-]&]w[o{{8&!!wOw8inq9" !1ĐݍȠ}TOmkDR$H]OA~DDDDDDL`sΡT*1LMGGfӧinnxj bhhٌZf|| dH<ΝcaaPRl6Ο?8.]D{{;Z@GG555F v&::ɓ'imm% a4-===={^f3 zzzjexx .055E|||]{;iiiK6>>' ߧ9w~t|(U?@7SVVѣGC"peJKKYXXn~lقF__0;;Kcc#===dffSOh0 J賳8qflrCXf@ #G0Lt:N:E]]7offf>8z( gɓ?gժUl6|M/_NBBrvX0(f{~zr9---A:DZZsss,,,pe7!::hL&>,(Z-wgg'LNNzill$**Jп6L444000fCV0PV1455SO`@cvv} /`2x`7773??O?yyy322Y~Q ZKK x< ]]]xh4(JaR)ۿn;~`0Z駟$FGGKWWzN8555\.h Btvv/uuu9>l6pKxiooٳGGG/_ŋ:ua~_/K>:::x7r~mjjj_eXb?0K4!$ "hjjbΝ޽[сBanz- VSN /_v#?4B).\Ç BBzz%)2lٲE\7DDDDDDn#7dl۶ +H.EB׭[bhZ&&&A*yfqN'NxNWWM7 77 o88|0G$T< o J }vۇje~~W_};w. 9F#vu] xww}x^׾ƥKOp’>abbbصkcl6DBWWV &&`0Hff&7oF*2>>b@nn.aZ|-q TUU1::c=ܜp`!Hj2,,,,ykhZm3++͛7COO lܸB˗m6|>LVXq ݉,%#HHHH`夤ƍ1 `XHLݻ)//G. :Vb֭v:::HHH$;;*P&qw}vL&w&66 fggf||F#[l!++!عs' iii?~R $$$úu넴JJJ0L\rA b|r6m$\l6h4lذ;wbZx<zjZZZb۱X,LLL`X줵LvMnnU9/^$33SGL&#!!bpႰY,J%w}7d2~?o&9`*| B{[QQƍl»IQQ=N/<+B>|tʖ\֭[{ꢡroNff&.CQVVvpxQ^DDDDĎ.=55dbDEE~zhoo' 9sw}7MMM={:(**6ld/‚f:yꩧ!!!͆B{{{?V177Gee%jyl6466ڊhłNtr1B477 #~3aaaw^233V˕+WP*,[|lW F62 T+fee©SzRf! RX,PRRl{綇M9s~4asP(HNN DT*N8˲e˘233sq9<188HKK 7^N<T{p8Rry(<$ |>N:E[[ےg INNfzz'O288xMJ.#H@"`۹x"DGGJHRBs=W-[˗/qFtz^V+FVXڵk룱QVf.a"_VVFLL yyyl߾]! /ECC֭jBQQQ155Eyy9f2naM]̪Ujahkkv sss(JinnA|% *UV1==͙3g@"/~>jjjKPIuu5ϟ'33bpccchZ{1!g=f^n""""""Cs'''q`6Bq]vR|瓐JbXjaIII!11I6o,/ALLLF!%%ObvaT*exx4z=BN#ۙBYY%%%RYY\.?wލVc4z|>FFFe֭g$11Z-f< aF#@^/xfggپ};dgg3>>NYYHR* DJJ F$f3111dffLqq1^9v;;v 55MQQQTTT^ra0VR8nqnJ%+W$::I֯_OEEƍb0عs'HR!HT*jl6zh R)o~DrЧ$11իW|rf3IIIhZIOOd"''IOO"qB}GT 󸤤DZVxwHNNh4b2())A1336md2 t$''C\\III rrrHOOtRXXHII $''Rch44͒iQQQdggS^^.Diƒ  MLL˅VnvIOOH~^G`)..&55Hll,$''KVV$&&RRRdZ|9r^//9ȊvQTlذݎ"--^&wT*E.Vu˗T*H$bXHLLdʕ-YILLdŊjN';v ??xƈ&''JJJp$$$ Hh4$%%j*N':۷B`jj$Xb~q%99.*"""""".X,B D" R:賳KAX,:tY ٵknust'''oz䐪jկA|; a2(++P(ZfΝK¹? 555Bhd׮]W"Hx8&"""""exxXpB.(,N˻! xnY% ^χ'^ӆD" a*m۶a|>~c͓!rۥCv$%%C "."͘pkRQQAtt4`FRwvvI5vs="""""""=""օvv bluM mn7`'Aīs'E0"8w!<P v1vޱڲȧ~J $FB0.~DQ# ۅ]"{=\e}aT*vBܥR2]*^w[ p;C܃ qqqwȍsBEDDDDDDDD\< {ŝHH6S*;v RILL n*ZZZ0~=J}}=$%%hٳdee199ɩS#&&#Ghhh4J*+ŲDWzT3W*444PUUf#))y?j%55ιshjjBVc2hnnܹsfrĉBÇD(d2q%._L8&..NInooѣtuuBV… B~N>8 (Jzzz8}4fgg9y$$''P(~.OjjunGT|piER  4IIIlZdz^N>Mss3F~;9ASfq%$ rMbqHOOgxxY8rDEE CCC8qp8|CbӴPT\p+W(;z}>uuu\|cǎ؈=z}]~7xg}VUW_}U H$;v;00#G>`B!1:tZBۄB!/ݎӂu8iooCQWWwU=ʥKx<4773??O__F oسgSSS˟y.\~#zzzhjjŋ?ݎ[hnnKq8NN'.`0:9}YV+nVo[&&&nP5󩬬GmFqq1s=8^/R>ʸ{Â,֭[刺YdddEss3K X⭻aN: =x^bbbH$1;;dB1??T*#Ϡ}{<233ΦªU8q_u199I[[ےBKK EWVV؈Vj5 !"7P(Dyy92@l6L&U-Js夤MVVW,//{P}}bb{#1i+"""""""""ɇ477:Z-6m"..6$ (JoߎBdx9<`LF]]111ddd\6:zzzhooHpV,C|wttǏcJ% x^蠾6oLll,n(ΝҥKvя~j% ŋ{9s>RSS B\r~X,?eppBb77$..q/_ZԩSj>{,>~d2Rxs ˣ#G0;;T*E&!HrE8FVcZikkcʕFǏ3'* j+ɖHDXGra>}~ .]Fnj#zwr BR̤)|d2rJ)--#Gm6HR$ zzn3<Qرcx<$ |ebbBH%p8L(˂wy3grX,?N@ ʥ܁|h1%%z=qP(BR$''X|9`YصkjDBii)BCs:,,,N#)) eErB)))Adϓ`d2a41HRh4Krr2EEEPRRByy9 i P|)Rp)AyM60<rL&wuBAu֡T*quo5|>Q(hZʈji&VXANNsssn:rrrdr"ɘE2X"qRTG0A('jLNNʦMt466qFrrrm۶%J11Abbpp8̉'_y 9zP0++-[\ ruEDDDDDDD>  NcQ*05w`u.Hpx^nG i\!HJ:6$ ^WmCV*w}t[?n?=>c͓!rۥGVZEee9JV\ a||VDDDDDDDD@"o{k]("v+zz8Ώe{^Bps~G|q??<|>.y0>yP(/|$&XD t筈ȝAy|WYF7;|R!2O3* o{{  66">w.놽sTyEn>NcGRDDDDDDDDDDD>>ZŽT*trI0:ĥKhnn&55V(G%//19BWWfZ穪"(G触8tsssdffP"̕J%/_͑ܒZV?Nmm-*X8~8111ByΡCroR__/T>{,KȡC ..R)_vv6.\ܹs8رc JG@zz:9r^P*BU!0 ^xF$֒o\VqѣtuuJ… ={ORR0cccz9r$%%8z(T*bbb~;z > W\A*244\.^YXXv/QfOWqw\?~⮊ȑ#477c0#Gt:;RC tӧq!ɓTVV=zm۶!x9|0v Fgg'߿J|MK tACClٲa &cǎ鈏6oތjn#8pl6y-#G /j*8v7n$==LѼb48x  RRRÌq!֭[B`ll āHNN& VijjbffZ?ONNhZ~iT*iii$''P(~d2._LSS8N.\^G. 1L={vt\t^B555Kss3O?4DEEQ]]M{{;111%~>11!mmmL&^uV^;}_:$ LMM hnn .6mB.1zTT.sԄRd``a~~3g`IMM]bOgp\g~:gN9 (JR;c8go(o[7yϺ<$Rb&H" @H$Dι@w%D**OKI{~Ự[XXXjݍ\.gzz%Tܜ 6z=w!!!1n7gzzZXs/^ 2xt7+**AJZZ}/x^(((׿5ܺu$VȇI tSVV&<\.F#999twwAqq1@}a6innd2QXXH$jVшD"}sٿJ=z;vVh4L&|D"cǎe۷oСChZ ===2>>Nww7ttt`ikkplw8̙3JUUprΝ;[o155ř3gGVjYYY… jf3)))3::wyŮbqqqt:VILLl6300F388? /$JVKoo/FK'IW1( n߾oߦG ^߿Occ#nܹsH$ݻ'H=nãBt7oޤ紵QQQ(.\ 99)1 JtwwS__KԩSϳAUU?񏙝%//ٌNn#JyWcppYwADDDDDDDDsC$Ɲ:u Gee%j\泥#G`tt$ /`p8Yv9s wbRd1?pX{M8ҥKx<'==ۿt2??wCJJʦۿ[qRTh2/".^^[hB/~IHHj5FZe>@T4=zL$!;;={vy!v1Z-iii100 >JE$|WDv~YB~Fnn.,--!ofl?Fq\ϴO%Oqq1---,,,w^n޼0G^`aav|>^ +++©ݎ;@Ւ'4Lo25 iiiTWWsܹ^h4RZZʖ-[h4rE9b_rr2V8D"҆VD"aBЗIDDDDDDDD :;;ySSS( P(8qL__ j5w0Ld2d2?Z 6z Oͯ]]]>6 Y\\dmmFfxxJ,,,璘xWE"ܼy4|>?'.K \~rrr4551<<̽{X^^?$>ٳg)//G011Q*\v NGYY%%%TVVbz2 TT*E&m:FBիWY^^F*"ˑH$D*jq:tuuw^IMMeϞ=4_WhZQ*֖L&CRA0DTg*++r ۷og~~w}W8Xzov/uMM KKK477322BGG==={?7660LČlDBZZPT6l3LݻVKAATTT+p}a}҂ft\FFF8~8dffT*7Hww76#GͥY./%wΝ;={մ_A299jEo0==۟uDDDDDDDDD>'>0vc0l6c0p\B\.G.uVQ*deeQPP]زe R x$%%`0 / |>0cZ?rNjjrssQ(B.g۶mFL&X,j5ɸnRSSIKK#%%ٱc۷oGVxZ:u V+|R$99JEBB oÇXYYшjl6%~ǓF!11|222FKQTTD0d߾} sZZABB䐕E^^+BAAX,>^X[( ٿ?HRIFFy5DAݓV'N JGBB999$&&ʢH$s='rIr%CpOK$|_A_^^F///dt+Wp8ݻG>db:sN,CIDAT/Y/,,bw4͛LNN` fffx>q s>D"ɓ'E3@A1==-8JѸ)b!// kD"accGbb'.>&Hp:Bg]B"p8Bsh4@V?~~䣰B\\3ˣFd'C rR)*sy&p $$$|c%o2$2OH$"p_@`0'`0D"TU$ n*>a^EX'P(D xf(P9 B!^ Ig /""""""""$ Pc;0У(Jv i/GяU&y`0(UxDQFqSWXh|Mx<nY7CDD "v7B gϞEPH8ŋ455NVV: ٲe \v>F#:P*XV`sҒP]fT*ill222X^^l6Y]]{ U[ZZz*QQsΑ:Op8d|>iiidzK.GRRJJZZZ(,,$@]].t>|HEEh>ȕ+Ws---z1==4iiiy! ۷oʕ+v233XVr9n⥗^୷ޢSN 2U>dhhDBSSŋ6 C?qCuqq4jkkh42::JWW=Y\x}j 啕\p;wxu/"999d2n7ɜ?bA@ ÇIOO>[n܌NX,t:ݦ4!`ddFÞ={'V9pj(-- Ll hnn& \t DB__ z_0]]]444099I\\ϟgzz+WN|||H\\ q8Fgg'X,A=55E:;;IDT*O&nگF#gϞ`0Dz|>Z-twwٵkfYBKNN%XSss3@ff&`< x[lرcB!VWW7=3559tsssOERϓSۖ^bJvv6iii(Jٹs0)++T"PTTL&cmm 7o$ F$&&ERR$Ο?(o2X,f0GA&'6|1|hނSN!JGףT*|tvvrv;000Çx vA^^H-jY:N>͡Cؾ}vgg'MMMɟpz{M8ʕ+|Ν;8N&''|2j%Fy饗?CD>j +8<_|DBqq1(B!ZZZ8xDZ8pBٳg~`0L&c~~Bۇd"ͶmX^^ jłjett[*B\~`0155E4e߾}vERR`oll'V۶m?t>q|'h"oNcc#߿ZFFF8z(/2ܾ} kkkajT*z=;v젠˅` 55FFFX]]%\.<2F$a֭$:999=zLTJ%TWWB9<˿7t:N:/LCC~{˅$55U8D ÇIIIa,--155EGG LNN ---:t@ e߾}l߾RɫJ8V0H"$۷o'==i覂+r8Nh4JSSC&=|P(aѨؾ&HU2R$ (J###|>lق`l6 &JKKj ۋngffi ضmƾ}(..F)..f}qh4bZQ(ܿiF# Ljj*h}V2EDDDDD|>99Ikk+팍!HK/dNG^^z??&;;[b[oqudQ~!rrr2wܡOdE"~*8N泥AP(tuuEcc# |eǎBx"W^%;;?0==Ν; ٳgP(D}}=ܾ}355KKK;\~p8?{,$%%166F(~K$ Dʎ=h0mFGG.\`eeL&'!OMME.p\qAz= lݺmUUU#^G.377G4Ea0X\\d}}ҥK޽yx Ν;G4}"suv;,--0mmmtuu}t(JR)sssl߾6h4IVl6s! iii!Ʉ(Tdbxx;Jh4ej3#1}'O211A @.SRRŸr7@ {a``_dggD B[laffMuu5gϞ%?Ogg'nݢaN>ͅ P(t:yw`Ϟ=! t:lllFayyIzz:* TidffrMCV!xWQ*477344͛7 !!͆FDEEO _RN;v1 oHII!>>_ׂX*g***(//gϞ=o}?giim۶q977Gjj*:ÇQ(RPP@(QH:F!q8+HX^^QZZ"cccDQrrrHHH```JEqq1 রp8,iii011F\`-[zLfl6rXV ?G}yyFV5QTZL&FFFBt:JJJc~~TJQQPh~~xBe2|>J%%%%\.Z-̐ X \.U ++brx<-//jh4aZqH$zE@vuu1;;˃я~%-- ƐJzRSS  $.̏U"&fXwtB&''Y\\$55LGSXX###DQzra2BӑȈP3OOLfl6cۑd$&&2::*P煅A2022nG"Ezz:㬬e!% RغupдNCCbaaAw )**bccQR)T*x< Z8fnn(lll^gllLv7Wn)r9t:XصDTRVV&MPTTD[[pd'&&dddҜN'DQ(,,$33xtMNNLaa! 7o /ѱ1D"B*vuuQRRRHKK{ P(333B`0⢐򵸸HVV`OMMT*Xz`dhhh4J~~>v5T*8FFF0L山ښPST*V8&??Ԕv?>>$?ZRDDDDDԔ`k5!Uq_$蟆MAEtrN'dϺ ϓ,uM?Mլ0Ղ077'N_7EDDDDDDDDĜjXG2=SC?/$z% NJ%~$U&* H|lll{uugfFQVWW1Ox0RT(.8JR8Yo"""""""""_$ +++jr<PC>iEn>o0HdSOB$!q~Z'Fl>J%<>n?^?*z4EP|yO{p8 q9w?O~?4󑘘T]E,]7?}%(:Y7C+N4e~~y1\[ ru38MZ^{,qYϒp83 y/?c?H$^/PJ__o p8r r)}]n߾MSSz9{,[nEPo[HHH*(`0Vevv~y?V^/ RI}}=̐nfaa"v;466"HHII .`Z1loIMM_60& n޼&33Sx677sYz{{INNFPpٲe hZnܸ2pIKKCp=]&i?[nqmIHHP(wlfggTX^^/E%:t rEX,hZvEgg'匏… tttB0477#H_ǃFy2c^0SSS",o& D"ܾ}V`0 PSE\t;o߾͹s%==V˝;wa65, o&ݻw9y$j)..RYYɉ'r %%% Mz0djjA?qCrO]]J,P(0L?#HhlljC(TVVsNijj_LF(";;sQ\\,^'##P(>};wErr2Fnݺlj-J~hZd2)|uػw/\.fgg?hoo(**j蠴T8G{3gwý{p:|NPܾ}½{8p w^^un޼޽{!))z^~eʸ~:{^ -- J%\ffO"immݢ(o׮]cǎf8N8!xzAnT܌hN8X,455qmٺu+TTT/샷nn*.578q۷oE.ߏ淋ZѣG\|ݻw%ČD"\t2߿ $''jŋ+W8y$W\a˖-SSSL&rrrhnn&//Dyy9===,,,illɓ\x|t:wEQXXHyy9@T8rȗZDDDD'1?0===<("H-sKJJ ݻ4s>|@*2==Mzz:`00??uM&%%% 0$ ;wj"˱X,űuVd2ḫ]FXVj5<^g4X,Q[[Ve׮]j6x^\Boo/j2 hZΝ;C`2(,,$77p8Lzz:LNN266F]]`xGa{UUU155Ekk+TUU1::J__ ,//AEEsssR\\b!==h4ʥKHHH ??[rev;R3g<漼ASiA=w^VVV_#==-|)J!''gS4\FFô)"""""+ѩSBZÑ#Gl0;;Koo/\vYzzzp>O0$lu?)63gpM?촴Ο ұkǼ1{gg'III~ZZZp: s5,T;~87CYYw>iΟ?Ͽ,ywrJKKiq')vذk.(,,LIRl6999 re1;;KGG p@\|\ηmƐH$|[" Q?<LNNVxqP(D4?O([la޽ܾ}rAjkkѣlܸquNl<Zٌ^grrUR)iii( mۆlt< + $''v*< onm6XYY! EAAx^T*jZJjzzpߪT*<(ri % ٳ|0۷'{cQ=όFCQUU%H4> p\Af3$OmoVVw?9F4d2}vRRRPšwwo2L޽J%]]]xv?~ VKYYWΝ;Q*`X1F$&&RXXș3glٲZYYYӹi(r-[{M)x0552MMM"Hp8$%%L{{zL&(|D"innf~~9fffX,l߾l ڵR)[b4Q*T(JT*h41==M||}x˗ʊ=33~3V+& Dyx뭷ڵKR$##CB_jJJ ;v@"ijj׿5KBckW&xFxhkkO[[UUU,11RV+nxCff&/^رcÇyw@ X,u8R6R) z'P cǎ(J7Dezz7x~gӺ:VVVX[[rDQTTD}}=LMMK/˕+W'??ӚJHHHXqqqdffb2or8y$׮]?ܿKriΜ9#p8X,~^J(bǎ糲"Y,d2B;v ..NH?!(AD8\8pEEEtww8[n%==a!Ei%""""Bp8WC@|bۙ166&>^,HNNfjj KFF`Ht: 3~?fe޶Z222dLNNP(Zlllf۔#M &f6 BLNNk$a޽8NaGkdvvUO*2xN'B!z=Bq5^tJ:SSSt:cłncXx Zl ~ 0l6pHRQ*BP,?Bv͑  xo$ >O||'mH$\.J%HQ[(D"BQll|>A*Sh4*xÞVg *1~|ihtJbD"acc@ ϋX|sxσg|>jX֏e?eg>Sr>Jc1cm"eȍ o2_8jkksrV˹sD"pZZZ';;^***XZZBPAnn4r&&&0L?!&&&HKKX,fffd2mZ/L믿Α#GtӃ\.'==;w Jw'O˔nٌ"?Ցj-99y yL244h4266޽{B |OO> Q\\,O#!!OU8G"PZZ*Yiiizh5t䐜,xQTرh4l&==:^Zf֭6 ÞJNG4ERQZZD"AѐDNNIIIx^bffI_.h^pMz(ۤBoo/266 ~JJJuܻwݻwJ^^J˗/c6ٲe {ˬhxwy,+l&p94 }UZβ{nvPj||MkN"0;;Kmm-EH$ CCCSRRFٳ$%% /۷ogffN~mA\|BFF~njVjjjJEvv6?@ @?.]"''U>|ٳ۷oNkk+=?5eŋT*N|qwqqqDQرcuuu,..r]vISS|ml6455HWW^۷o ===SSS4 ٲe nn®]@. kh֭ٳ .JٳB<СCEgg'q! (yppN'& Hff&uuuIZZSSSTUU ]2A{˖-9558!ݻΝ; BQ^^Z&++st:iii&Z[[u<(JMHHcǎGFFɜ?Eٵkccc,//cw%''6FFF(((رcgϟg|fΝܻwocmҥK\.N>Maa!FRuVFgg'h42>>hBii)YYYPTTD("#Jq8QPP >---L&`0Y\\r!H:?k2~DQz{{^#77Q4 N-dWWt:7AۍV,$S8&  D"ϥhR>LCCMMMx< IOOBmFRR0oNGff&" 8KHH !!N<ɵka~~&VVVXZZ󱸸(iii_/ 1Y HKKq˖-`IHH`۶m䐓Cqq1RGff&%%%dggSPP@nn.n[(:#VRˣ@ 9222 333att{`0Jzַ׎tQ H0dΝL&n7~^{ڰX,dee+v;dffRZZ" C$ڵk RUUw'*/..r zzzhhhHv  _N__f~ӟ}vyFvv6[\.Nhllt X,IHHd˸?O0'OOODu?<ٳ>^uزe ]]]<VL&>_~I(٨T*>ܿÇSSSCQQB!C&/ٳgAVT*QjWCCCKt|#G{˿r}jkkWV 6=.Q(T*L&{/VB"T*2 TZ޷uV*++5b{Abb".  ^*vI$aزe ºp( RRRdbiiǤq=^x!RVV`QHk)))BRY- &Hx/0 dgg300D"bG2ݻwΝ;(\Ncyyu *^*z*\qu/|D"a\x9&ɑ#GX__Gדl~oZ7$##2x7X^^>r7n0;;KNNڵK8XQTX,oί~+~?G墪 Lٵk/~FJJ !q8;M"磴"!@333R$--MiD"L#$&& ^%SSS~J%( ^/^:D" ?QX^^Fbt SSSDQOP(BV!TדH$ uVK8fnnT* ^/* 'F7=%%ƆpuNoZYYYaee N%IJJ-&J\\Rp(J0J>fffG?@@/,,F@BBv@ w}}Ų)"lXX^^nDHHH -- *fY8PZXX@ Op0dvvT"FRfuuRI||<>JE0D&!Y__FYXX %% d}777G0FRdnnN3F#i B&ejNG @׳F$0:Ӊ^g||yn޼ɿ7/||X__gccCHØ ssscXp8z!o]t:t( OD"8N k@P###_`(TFuj 9蝝{{Fp8$&&&|Ƨz_~?333½E4evvVȅJHMM֞f#99^taedd_~Y[[[#11Q z pGrr2PipPs8*HD8P[__h4drr.~!Ʉ{?==Ғ FQ*ž?XV!FP߷.gvvNGrrVCrVWWYYY^DDDDDDꬽX]Ѹ) / OC@=8upZfffH$dgg 餱W^yEDDDDDD1m$ >/Dωu4OM@"rPT߱\g]>:(׉y1 3YGhTH12:TL }وo@@(e e޾X?\|u+&(3ПAFHTBOUo>~,P _T mxֹ"X}_*_w>\s)"""""$O}Z_L&C"|od!_ebfz!ԢG*"JEhoC|{C^G {B۶Gm8 z?ކ]}xw$|t E.w6O[O[&/P~'< Ϻ_kGO{?{׏㡳էappKAߏz=;z"3CLO6 aZ?)2l8s wA!Jy뭷y&ǃxٳgJ~c6 Ü9szA  ˿ l߾cuP(P(TTTP^^0l6~399ɶmX\\wߥOVV7o׿5XVGp\_ c4pl6/oMM o"ywdDQ˩`jj\߿ϹsxP%rN'YYYTWWsU=cqqNJJS{@|MSSqqq Ν;ŋٳg*>.\ѣG7?MJ~a1׹r <|˹vЀh`0pe! `eez fWR^^yyyܿӧO3<>N( .R8p.=;v >>.N:ٳ o} RIEEwޥ,IMMܹs=zR@>s}AxPi޾}\Nqq1^^;F$!)),}]OBB%%%( (++ܹs guuur^z%A7\jjvŵkװZRVVSSSHRΟ?ρ(..fuuׯggTUU 2t~KRΞ=Kss3,..R]]-p;C{{;}}}$&&r9 p]׿5qqq( ikk#../ p8LQQvV+!dggsU~w~ABmmmXVҸuGEӱʭ[x傁.H BxfqYIHHvs903??O?p%INNtӃĉhhllDP[o۷;wVD"͡wf*D"Z[[ͥF8 줿_i~m{.v[n1;;Kzz:dggS]]ͭ[9u---~4χbz~?VFܽ{h4n{RSSCZZ555|{ߣ Ο?ɓ'fQ\\Lii)sss w^!:Ǐ̙3Fn˗9|0*&<^G͡CP(\..^Hss3!!AAjj*\|ARSS0z=/_xR)ccc,-- jZZZ())f.]4LFF2[n|ŋIKKf B޽ Z-wz*f/k122EEEz|F|hfyUrX\\dttT}!{ES[[֭[F"C4%..\GV?qݸ8233?UDBaa!p,4 q@^^ Ʈl<9`0m6(IIIsmΝ;RUL&&޽R$''GАw}}FCZZoII ###1??ϥKH$wikkc˖-|>سgnbrrQ߿Vl6=z,tcZپ};|> gϞ}!iiiXVl6b oV%99$Ξ= SVVFYY~< pN|U߿o-h_|+WCqq90jvZ[[wwehhVKAAV/yW^e֭ܽ{^t FceeJJJ0TWW?ӵeÇH$l7xett^_fxx9:::eSTTDee%`"NJ={W_}|KxddOlB!nݺ ܽ{x/nGGuuuɟ |> {_WvEGGǦώr!$}jٶm?X^^FP!HWFf IOO'77"pTj.x5SSSIKKÇܻw5l6RZZfuuۍJbǎۼ}T<gΜjr)P(ٟp.?C B׳0yyy_%KKK8Mzh4BA@P(\F)--ĉ444p-666jT*IJJٌbee5(..vEVV2|qqqFnݺũSv999LOOsm\.|>d2t:x<|>vލN#  zhZL&\.1Z,Gղ!hZp~t:fj^vzٽ{7qqql߾F gΜ[tttPVV=&''ωD",//?qqq\.~m 7W^!--QRRR"+BGG555d20~`0Fd 4, UN')))oh4;CRR/"444 x<¿]>uj5'N?/{Aaزe VN{cXD"}+rE&''DTՅ^`˖-xxQTl۶Tl6NBD"~999&>??Ϲs#!! =Bx8b4'? qqqױls!lݻh4ʅ hmm,h4ڵkLLLpqx"DQF l6s5*[nNF#b``i2228uJRL&m۶aQT$''3>>NRR`ݻw 8p%$$$$8x R\\nG")DI|<~5.^H||<~>|,hG}Kuu5qiZZZ0>|L& f``m۶1::J `ll ---y`0FKVV9993::dbzz}111l&??ER)XVZZZsmq^[[??o~&&&0LSTTdwo>VVV>!Jc߾}0==8Ǐ'-- _/_qh4 wÇb9v޽{H$BWWIIIrv;CCClݺ-wTUU/KH$šcaaݻfvvP(?O$տWTWWsMP/v144ľ}p8twwv9y$\vMP\\ ;v Bf׋d"//v:uff&z^8pf||e0IIINrr2[nbCnn. nݺō7p8 }LNNۋ``ii"ߺu.8quuuȭ:z{{ٵkǎ[8}pp8xW~>$]p8D"eJ4%11V ՊT*D6F"n&(ǃB ` By^f3>%(ZvSN,Ȭ-.. $rPZӡKTv`XCvV vR.F @*GPp8t:!_{aa`0\.l6p8|H$V+>5" F\.. łZfyy ,0˂:ߏD"dǼLOOCp8,K///#HP Ab"}x^t:q:D" ;EBBlll`QX,a"VP($ZV@"FQ;˅RD KL#>>3g4eaa6 L&w6P(bc0zd2 v]8􉭙Xm4%^W {A4ERV Bh4N'񬯯t:FzT* kD7u6660ͬ#ˑdlll`0p(J~?zA//1h4R)T*qqq~b{Nbb"kkkzW5ݎjVq\8N ,--h0L>77o j̖\.*r`0f#bZdzvp8HHH`0;))IbEnQT¡b{Fv!#99ySaeeJd<q6eY^^ AUf3ZVgV+׃i ^քⲏG}Eix@&aQYY:GY7#y,ɟz(͛AUVVY ihh`߾}W #S__8%%%>|3]"""""""""_ "33 mo$n S}Y[[CR}d RngN>gq/h4*x?k싚{D";PFK"|J$|>ZU2rWG_ۍV}!nN'7K""""""""dJ2>GQ&O$! Mu=sLVXܹsСC?СCL&f͚%[Ro@SS:tZ-+Vm۶B[[ɼ[\~h4ʡCl6sux V+ ܌l3߉ Jb|>Μ9Cff&|{ce]F4PV jkkY~\ ˠ[Vy#ٳjɡӧOs5:$s̙g.]DVV'O$pYb$ޣ\tÇ䤼qVVVܹsٻw/֭CVe.]JWW6xgٱcUUUP^^Ύ;Xhh 8NQTB!^}U6nH07D>QjfIHHQ())Q]FOO^^ٳgYd FGRYYIVV p4 .$Rtl6fϞ}ǬfϤ @~~>. Q)**Bד)[V+\vbV+$$$JN]]IIId>}~ZM^^}}}Vw |@MM Zz=(j˓keX`݌ax èT*:;;룿Ƹ ŋVfڵGoo/'Njn:.^ׯ_gƍ̞=sbZ裏`Ŭ]={DHHH`Ν-6==B? y0dddƶm%##1JKK)++v}Y&$LLLȊCx(***"rFFF={6sAR͕7Xky<CCCrxQZZJII 0/La۰a M\\vk׮|rhnnf멯zq:dff6+WsNlrG#G100}5]s8/HCCK\~ICCuuu1VG0dɟ -ŋwi{{;1 iiiotRVQQK/@/366&+WRRdddKvvRǓ"' 55sqi~?rAV+ű|/lm'z~FiooՅjett1t:XYf p8n!|B!~?@ (̝;7R[[˩SXr%G˗op8̻;pǃt:PH.E(* FNRnP|݈bQ\\̑#GЅ5kְev;~_>m۶cQ^^N\\v(fǏsyx.g||qưƚhD2>>N踫{GGw獵Z-gΜpSO1g.^H0dݺu ni&VXyz̟?۩#55իWjgc:;;X,r\ zja^/DQ9&<>>@ ??c2ӧOsA)**bڵ̝;ɲeˈD"l߾3gΰ`f͚p8L0|Oӧ dddϸ\.n7)))|ǜ>}ZX`455Euu5ϟ"x ZqwuuQQQf-ɒ9dN:Egg'CCCX /^X,ew322B("''܇`KGII ]]]\v Nc=ҥK8NVZEaa!<b1mFss3f͢Zd2ٿ?))):uܸqFvv2VŽ6 ,Z}ի9y$6 ŋ6:: @~~>uuulذX,%Z % `{OO+Wr JJJd/b0$/^7466̢Eg?Z 7RRRBII g&>>^.%S2FFFxI؊וqqvl x^ 8..$T*`Q1 r(0E.qvQIHH χݔy?1rIh4l60U`0rD"r,#[q~ZT*EA8F èj"nшjEEl6hTGw݄B! B|>bՊ񐘘Np Ҹ2k>O,@FC,CE:::իL,d2Fq:^h4v $&&rXGRzIMMxbF0ZSX,Fbb"h._yFFFHJJ=F#@@(BFaEa222dfJ%k˔p89z5L$$$j% a6 rZrCB#KJJ @@n7Fdt~y]ŰZX,n7~_Ls'99knb1.) }}}V\.:wU&ttx<9|ʕ+)((xݿg+_$(K tsQillˉ$(NbxheŊ4ѝton'1-0H@ DћH jVqK:Yˎ0U<Eo~ur/A-*#! `0J*6o՚ۯ3MAAAAAAAA᫃ xL M{~~ZPsf WwE2&(kΥf`emZ}p@%|3^E(?FOv11F%ٖٜ9ٔ33؂6ۯF鬧98tp,Яcm/l*((((((((|yQ^Yum ~}#QcĢ0!&G9*AV% \e*-*AE(Jt#Xp,(Uj".үTDkJ4* jAM(WmCVO?&*kB,%NC%FhTTJTsS㉊QQԄca0Zj`AցHEւlը4hT*AN#ǨP舊QѰ|t<2T:377/IDATYIܩ/QP :DQ$ 2תSFk,ϹUr.Kp y>1m>? Bv\6&}Iqv}W)J*}K&p~*A(##:nyѨ4s~3[AAAAAAAA (,^}rA x9 j55\s_&ɘD9m[[ s_w;&3.?whjGK1.l÷+Qcȍ#8sJϕ>GIr ސw/Yg?`3oZC5J#ы쿶y)^?:gPX_T:+bQՏM<̹s<_x*KZ&R o?}ԣ8Ȳ6SZZfF!{IƢ(޾ k 7Ui9r=/\ky1/  sC!ʯD]& ٔ "lA Fji rˌ{IKguj :j-g'O!DΩ&7>!,|!cTG/N)I@Ǻ*3*Yɛ'Yps?_<̅$jҙx|XVqZ:; DqH,_k:qDH31dI=ÈȑG#OC_)I)%΍ckVV"iOT>._\dcGG,\D.ƽ<=i±0{/%ÒL&4~<~T#Liފ7eqbtj--l.LpTmOg3¾  XZǩЩu<^8^G/˞' (O-g=Ik݋RZN1#׏|CZwʿÉ:,E 荣CnnE%hod}z **ȏ&fT ΂Tr˶9߱8k1 7օSs±0g""/@IrɔHk61ߍ#?xGeEeF%y yf(Kpf h'}12w%h0s9qm.""dL{{:n{ޝ" :4gT\L8f;!_02'6 w-?VqڮVrq3'TPQTD]_CbY2Ɋb]:F=z" de~ۮ5ޅ3gvsf {d *AŤ>?CG X¤BZZm5F~#~;hrCtd3BEZe)e%QXH)Zw*35m=Q^;a; p.fY^+̓\^?qXV|t#f/%ÒAg<9?r8x ;;w yF}ITW݊2&NǦMRM8Nvu¬5 }+sWbzzH"1d-:AxB-[\A ;;._ è1RTRSɱp M^#ɘD)S ɦdj=IB%% `۩YC^B?! rs꭬/\l OC!l΅ N \PɖkXyؼ6f%T8rGAx'Ǣy=:3>g #`5ȸoA c1TJQiDx^9.u;ogIe/C-I4$SJSl9hW)~\]f )"Ѩ4֨Y>k9DQ>!qtۻM~ m F! 8p\qx'6k}td7^G܆;rOy">NTTJPDZ{Ψg&+.<? D)xq _]v'ݒFCtܤ"QGAAAAAAA]cgg嬕hZ:; SZF>/'a\̈gJ]dL"*FijX1 ϗ> 魡*ى,6_8}_<#7 ]P |;$y)±0Π[)N.fcF]l.l-ʞ{Xyd+/~Ikp4DV\O=EgT)*-߮6΀-%[sy {I3(s:}Wxex9>/ P4C\0L&nF9s 10ᛠs˞gKGΠH,칼VKP ofK9|0 6fm,z :ApĘl GALZT-1+¨1Le32K ,: (0hTDDA7jX,ZƤ5UoE OȃQce yP4T ؏/COC$3Ui=DĩR7q}kk5zBn"TM & Uk>YO,*A5嶍H8& aS}#ZE(+40h 5FT,ƀQkQ j4jWZEgR>5V"Ky/Q3VøZQk$2ֲQk$ O%Chj85*#J˷#hTy-5FZ#E<XS}a\qAZ(b[dK{,ì3ccSmҚkZleH, kZ+h,@8ZZ?E)J.{km1 $Gp&o.JtFvp,=3ﭿ3͔Ͽ*XDR(O+|!O\ҳ:M4Sg91ݸ*_Ї?ϭJ036 >͂n|Z{}$I&p{㾋Oo\3d"4|Ր;l4n@D$ID._ƕ}4ZPSWF3J 7_""K!^o _DDgS&m6}bbOYiC뼀2Վ 0ah0b6ãF7=n߇%5%ɽ\gdl$:goc"c=l 7 G4d2} *,bZFV|6eDjCf)5*jJ_q*y먧þ$DQDPO݇Gy8VAAAAAAAA˃J=DzD" x^DQ$vq:x^b)wX,F wDQ$ N%z8N;'$Fx^BP(ۉb3Eχ z3EQ$ňbx<N'@@!'p8tDEߏe q݄aYn[n[cs_~_b"x|Z-Zݻws!ZZZ(,,dbbK200{GMM cccp~_IVVׯ_?q8?ڵk$$$c;ƕ+W(++CgoNww7h4mΝ;Yl(p.\9s8s ~!`ZٱcǏr9~8W^N7chp8bɒ%c9y$?'9N#??_ WqM=J8FE1ͼ봵QWWGZZ'qjkkh4&FBB`?40L&-[F8yW8v8q{ީO2:Ć Z pY֯_F(V^x h4;v\^J}}=`g(s(r)8IOOɓv ٳg员8U>vD&33m۶ؾ};Z^ݻinnn9B0ot}ǎj*Krr2G!PSSn}{Ƨl~CPPPPPPPPPODA[d"..NKww7 Menjjbҥj}DzzzHMMhF'&&صk8Yt)*W\~***زe gϖϏclܸJX~Yt)[nȑ#LNŃHOOgbb Fsc:p8%''@ @FFۿe…8N`0r>E|D5kְb |>g&>>QzzzXl\rFقAGGNh4yꩧl)]dIOO̪U8z(,^^z [osVUUh"<z^kp|JJ`0 q:nٕ}uxevɤĩ߁DGףBL&" 288H j>.+((((((((<$~y>#b騩versse˗c2Xbl-YjK.EE,Y^wߥŋSUU%K/ܹn4}Y6%WoZͿ˿0>>()))D"~mn޼h$Vjjj'|*(+W$ ΪUHOO緿-h!rssioo'pU>l6ַg?OFF۶m222Bjj*'Ob,^jkk)))aɒ%455q.\c=Zǭh ۍb!==1233˗HGGcccZ  p 0,].FGGf``Fff&}Nwq?r555rҼJioo'%% 6 hjj" ~z9~87n`̈́B!mF[[ϗף&)$Ν;G4Nvv2VŽ:9ԤÇ3g9z(CCCdeepBمd2a4󑛛KKK 7oFȞ٘fHOOC4IKKvn޼I(bݺutwws֮](ccc299Faʹ0wo}{JJ uuutvvOr477zjhlldٲeTVV~)=;΃߱z \N$":FGVc0dۭHdF"h4*-e6 󑒒"[aʂwk\l&ӍF# ZV˫T*L& ME XH2 hh4 b`PӕKl^/K򐲦b1t:zH$B0`0V DQF, U{z_%Jc;w>?sA@ȿK5 Ph4`;./χ%55U^ҢI~F^ן&AGFFHJJh4Z!K Q>EQdxx `*d)((׹^gppPǓ-'֗$iJg||\>d2VERH6ji+ dJ" ɹx^~?)))9a0gZD3֤W>}+U]B >[}R[ݩy$E6#%zYxn훤i"3[w'IY_{<4OInf3m}ugZ'>8NSNNN+CCC\|Α} LNNr?̹&&&zz xZfŶmhii!ݻcǎTUUϱc;֭[^$##;vpI&'')..FV(vu~qiDQݐʍiZv9}4gn_K.|rرcuuu 0w\=?? ._b~F?*x}jkkx">`׮] ɶyoNuu5(pIژ3g|GՑL0dΝ8qGb >>ŋ)--`0w(3{O! 7^Aϑ2͇at:ׯ_gΝ̝;V+2sO/ʇ~H]]ʫJ[[̞=cǎq)y222`Ν9sLRRuuu\.̙#Y3j"@F9q{aڵ۷A}}=iiišh>x<9fY2~y ?G"FFF8p\Lxdvv6Z\ _ ]/X˗˖ZYhϒ%Kٳgٻw/ގF!8y$z@ @GG555[;T;v2͛{-[vYA'd2N6l>Çb?Ov<3>o}[z͛,Y+W̿˿d߾} cٸt?g|MZ[[ٰalذC۷ogrrԄbzٳg OhѢe*n_SXXH[[Pr9x𠼖nܸAss3̝;x j5?8{,.\@}YvcX8}4P+WcVXJ2>>N\\/qqqr?;;;9~8h%K|2v399IFFa#pm۶qF TTTH,cڵXVك`&&&j477cHNNf֭?,_\ )wEQ\\Lii)O )..f޼yhZ,YB0d޽׆]] Ìs\zǏ344$666l2|,rrr3022kF4%>>z 5k|+WpBjjjؿ?j:UBB---$&&RRRB\\j*`jw5k0$&&n1X,f駟&;;Jŋ/ȅ f-ewP( /@QQq1Yl6l$$$Gjv!+6zV+̚5\hhh!zdz}vFGGU*7oޤ??cوNcӦM444p86l`Ŋ||T*^xZ[[ ++'NC0A8|0j%!!DQΟ?Ϯ]HMMs1?͛Yn,DPT\t: t]]]rDQdD"RRR8x s̡_իWc3|sINZJss3XV݋Vh4ra>ĉ (++c֭~&&&322¥K||[ߢ F#rX,~?gϞeڵuV *L&(,,T *k[rJ֮]K4Y\d Q__OSSܸqN:E}}=B,YZ->INNz KyIMMa|>opg}VpA͛79{,466|r/_nݻw/``bbEVVk׮ח>L}}=Z\|_˖/"dxxbj%55U.I&k4B`PvCNHHl6S__Ϲs0r7jQo}'/__d\v P(D__P3gM6aYYtR"/VoD"kkbbskJJ z^Nγ>˲exꩧhnnFv{b1 t:4 K,aŊ3cFχdrrRJBb0xϟ?_fbA"V9)ʲehjj,^XJKKٸq"QߏJ" bT*HHH  q5.^HGGnFGGyW)++cҥEXv-@͆b…xQPPPPPPPPx5>|ARSSt,ㆆd8//gRRRBAAqqq>LFFO<:NFahh|>qqqaBP]]͙3gt6իW7o@4 ,Yׯ322ʕ+`tt1'NA<UUUBvv6k֬n3::?F:F#?yRSSCEEղ` 11A{{;n#̟?NB`*IZʕ+w!..χ르l$99X,FCCիWϑ#G!##H$ܹs\餤\%33j:::ARYY눢HII/#YYYܼy&++uq%IHH ??SNa0Ǡ[,nܸAJJ ׯ'--nǙ5k477Fjj*4440g0555b bP\\LUU/fѢESWWGmm 99;vpi-ZDee%yxtniA`bb@ @yy9hTN4VQrR#ɪ(YxnM%Yx$$K b1"+#շNIILoY F#fH$B4ۑ,Rj]t:|]).⒥% ԆxKMDdy8#F!}ڋFb14|tKh4Y~de̥^/mmm399ɿwJ%%QVRdiZyHjjjܗX,&E֬&[822BRR:NX Cr֥Ri( !/Mdò[?iKM_CNqOj99זRghhQlPT ӯR는OzI,9Rg4RGi͓{D 䶥k={ZAAAAAAAJ__l˅N#))iF%!KJtzϟrxxJu[;yK &'mL6$Λ.?I[x$˻疎UFSOv[2}I;[uNk֣J!;uwwv[poΛ>[ކt-Ʌ_EF#h^ǵq=_&n4e9]fLt*/=M6 fݡZ'AJ=h;V^vj︧ɒ_R\d2=2(nI9Oc|z)((((((((|ut[Kܳ]r}=,|>~,peپhx^UBE7HIIy>;^@ o _ DRhrGG*?~Jm|\6)\vqJ==πWAV> thDEPbDQ' 299)gm$Ο?O\\b1T2 ">шdff2::JVVccc,Xmx^F#v^*++ $199I(">>NCz1 )继6DQb6+vIee%h1AZ[[Y`!I\AAAAAAA]ˬܹsp.Νrʁhnncɒ%sAc0qMNN:S__޽{YjFqF5xkk+`{rc{zq:׿ŋrɰ>ӧOs ***8y$ODVV999T_ sn Z-ݻwD[[ vž}ldggRرc+V@EKCCMMMΑ#G%>>X,ƾ}8uGaʕرZΞ=Kii)&IVN^'ǥs`%c4r eeezyC?eZ[[ٿ?uuujW_vm۶EOO{^ORRo---x^PTx<F\WpQ=ʮ]Xn{r`XbrzZ-oi4"[.F Bh4>werr3gP^^N(h4t: T*NZM$7 qqqr]4?RVp׋%) ejjjسgD"v;1nB!.믿d"55UBzy \H!~_cZ岓v]' =C7HVEQrvRu)ݛ^~:Dqq1zǃ! ^+(((((((|y2kwUqD"ϟϞ={'7`XɄf駟͛:u ǺuEr(,,d,^X.n:tܹb6nȮ]:e՜9s@UUV˗/zjL&̙3}b ̙͛7IMMgϞs璘Hii)K,aq---A(**d2QPP@KK K.%!!ٳgb ?NVV .dʕ 300?ҥKq\XV9vpEBEEEAg?Νk׮Ѐ"ݍ^7ߤÇ??p8PT:uFٲo>Ұl߿s |ʕ+ B\pΞ=s=GCCUUUTWW3{l._ƍٽ{7ַȑ#t:<ȼy(**"33SNg2D"l۶Z[[7occcr뱱1F}m"+Jww7K0vw^]Fѣʛeee|G̟?۷z9|0>$ZZZHMMe||x:;; B?~zT_Nmm-c Z+WoA{{;77LLLDaaa3]A߷oqqqlݺٳg‘#GHKKvs1Ƞ@ cZD"ڵZ&''INNߦWb8s ڵP(Dzz:1tttΝ;>|p8G}D\\z\›o ZCaZˑ#GPTx8q8NvAOO3gO}}=_x> GŃ(wM]R8pcccAYlh? b4 =zJnn.@555r;ZO^/iii$%%$Jkk+* 462ha&==Gnn./"^^{M:;v9s搛+fV^MKK CRa6eTMoo/k׮B Yz5~b!115c̱X ͛={6&o\|͆餡 ^yr./"g&''ɓ'bҥ_CňD/h)f1.\ 0\.~mt:677Kvv6sΥZ& ܾ ܼya~SRR"ߴiMMMl/[ 1x蠬'311A$t:g  ݎdb޼y<$%%1::*399Iuu5TUUQYYIjj*ٜ={üyغu+IIIl6HHH'? W\F/F/#/F^{?lVZņ HLL$77I٫^x sɞ=\tǼ tvv"" ^~e(r8uf l2%##j,X͛CrM$ɓT*!..qYr%ׯ,_K/QQQ t((((((((|f!~DQdɒ%lذFCii) 044ŋq8l68s MMM sehnn&p|>ͻuҸz*W\h4bZhpǏСClٲ`  n^{5A`ƍN=669}4DQ˙7oN۹q=:III,\g\Fٷolݺŋy7ٰa6}Z-EEEapprx(b6$L&(EQv9aj3h4RWWGgg'IIIx<`JL& lٲꫯRUUEEEݘL&ݿwB!rJ6l%KtTTTٳ)--tZ-*JVN`ʭ8??"?(r팍}cMLLD`08H$Zt2<<,oIH6aT*[,)[,gΜLؽ{' *JTC!"vǃN#.:N ) <3j5fʷ-%//OD"37{l{9._ѣG)))<3:ud9$CV Nn6C]]/\'#99^ω' s V+L&V\ɂ 0 lڴ˗b f3K.%77˗/Kqqܑ.;wWϒ}\j5>N҈D"ܹqȑ#b1(**Ӵ2>>NAAO=z֬YC(bΝtuuOݻFGgg'XnK(b˖-FvIOO>L>cBwwlҥK̝;YfG,رc̚5ףjgĠ3g9 Ujj*nlz=՜={.&''Yf hsDRNUU f$##Yf=;ŽsqK,addffϞͪUp88֬YFZŸ1jkkYp!K.cХq^v0CѐCEETUU +=)C\\@P(DII YYY?6IOO̙3x^̙Caa|db||\.[ ^Occ#YYYjL(===8]ڴX,,\DSSIIIfV\͛7對st:)//nK6~~E8@OOk׮eѢE\t1䄅$&&OVVH&222HLL$..Jűcg匏S__ϼy󨬬0w\l6yyyL&N>IJJDQRRROO!11h4ʥK={6N:J?яf[Կs1o",-55uT*y>M9ڙ.ϑ9~>Ea222nTu~.]D0DE ɹmz:[ϗy^/~_~鞗 w[kwm}\L_ҹӟҳIbz_{G{/sCAAAAAAAQz\.\ mˬIJOgR3e9˟kObyН *}/;Etx~ܺAr&#Fh /$s1}2;IVwm8iߍ*_΁@b1/)nr=p/KI sslܭ}~>Iӿnϙ\Y e%4wj( 222^A  qz]Fvc^TχqK.0ָ/+:\.0摭#i.(EEE3,CCC @zF"7湤MFѤm D,--v~ gQ'&&,ߔa:5ݵ눔#a($&&>:ޒ+rZZ#OƧِ΁@3=:HF|v<oY)|S-/z<U\MoMAAAAAAAA᫃JoY=èjz=X1&''1̈́ab0h4B!0rlF$###h4,(266nQ7^t:v;b1L&`a(FH$6Mng||^?#:h4rqy|ƻ\.r٩Q\.\[J`0xk_|>l, @AA]&gq$z{{%##)Z>G,~!^N9А,s)0ɄJ100 ?i4g(譭rh4v?13g`X>Z(vh4x<ۉbtuuR~:w=_fL%=0=f`` 'ɰQJ{Yn7gcgΜAFh4=x<$''?D+(((((((Ξ=ӧs^/|;#޿?RTTą 8uL&4 G#GrJyZZZhiiDV%vt:6M($''cprs4خ.mFii)I\.FX+mmm;vF ׿&̙CKK l۶l^ʡC8w oAgg'`B̚~&''9y$*Gc֯_Ϟ={p:|cʬEQN'nZfh7D"|>t:^ëh$11P($mmm̛7H$Fabb#o^LLLVF?&x"\f5.h4z17_W+~!wv t:%ǃn$&&LmLNNʛ~hQ94vvM?P.&ccca . F#+O  ++Kޜx Go[,Yܹsx"ccc̛7A8<ϟGֆ qG+++Yd GRb=۷o'eFFFW_}{Ç ôvZRSSgl:HoA4Bj5`:Ykג™3gHLLdѢEuVnܸ /|n__ǎOOٱc\zɄNJ4 tuuQ\\L{{;OOO|twwxꩧr VGOO;vVIHH'?)-f}<6 B!ϟϖ-[0455qa̙Zfl۶ VŋYj|nSS$''n:jkkDQm6f3hjz{{7o2<W_}ܹs$99fʒreF=zIJe466r5 x((((((((|i TVϟOgg'{fɊ{]]˖-# q͛Zr!V+x^j5v?pGiObb"bVF# t:t;V% n:9)Fٿ?$$$vh4kj51ٴi,3A3Jt:=JVVeeez:;;`T sαrJz^bz<cEH$֭[)..&11|;ܸqݎ,\W^yX,d2 /GJJ ::233Yd k֬ȑ#DQL&Oyc0kjjظq#[b7oORRb16lŋbΜ9_|ORRsαn:v؁dŊi&DzyCdeep8HHH-[pe233O~… +V+pڵLG]5 D'd2Q^^NRRRUU&pimmrq N>M{{;$$$''rdeeŋ1XѣGy1b1Np8gZ-V"dwo)cxWW---!//ߏ孷ޢz ZM?6M5u\D"vٳgyg[o㏓LFfϞMbb"~˗//Khb`4H, 6f^O]]ׯ_'==]~ƙl[>WW^7 /^L&'B(bppO{{Rzj/_hd…̞=<+m:I Ann$!772?.[wi3QZjf e6CvQL)'OM6199ɾ}p.oXp: !":$oDI(AX|9Yt)EjEݎQl6322䤜chhHkj1h4L$H\\=+VիgfCV399)oiZy3&##222b #b19o$rXj'7۹k zGG LNN`ɓD"^|ERRR#)) L&+VƍfŊ$&&d*++ -[&LJ1tvv͛EVV8pK?iiiDQ''RT444.^n'??_C\\W& w^ٴi>|X,F?yyy\v r1ؼy3z{2<<'##SN --/288$*\]FEEYYYX,Z-555chfĠ;NT ٘f-[Fgg'W^nvZT*%%%jFFFPh"fڵ Ozz0~\"׀_lPRRʕ+q8~/_FzytҥKYhn0HHH sy43!;; Yp!rm' b͕+W8{,dggN8||Ʉz/^b, yyyh4㎓$.\H\\`ZYbCCC&Hii)>R<Jr0fƠ;Ν;ǥK$33xrrr@ K0 TVV deeFGGs%))233Y~=n[h4sYt:K, Nnn.7n'..G~~>---$$$J a/^Lee%NEZUU墨VK{{;8NN>b!..̙3GqWPPPPPPP: 1nJu;`AEQц󑒒 r=p >c8'>wobbɄdT\.DEOt5y2'͝~d߃ςdȸHKRrb?M>'^0׋orO.iھw볲&F[q\t:fw4cH/wN?('}~H/֗Oj~i26֟OqZT;wmҿc;;w/Vy>1bO;mztZ}5}cg+ygO9$ܩ!^D*%Ŷ><^y9-f͒&2#h4ί&9!Ճ311`b|c^A`||Ʉlڎ[ʑ A(Ɩȓ)|6s  %%k{*((((((((AdRRPTwɼWA||eG=Ni=*X}}P~o~O? }wMt:DU b1 uxC\ @QrrrPDQINNl63::ng֬Yr2~L1&&&HJJ"##vR\Pf3v99L$==Ay&`4vAbb|IV~~>FA(T*FFF`ddDNNG%m6͕ޱ'qM&''Yh= ,_6<hZrssh4gdd5X,r~"D"x^2Tv;@Ln\n``NGnnl.RRRnϝ;` ''G>֬YD"zzzh4ѣTVVb6F3~hX`'#UHNN_q:r5{C$att{nDCteJEb^^=b~?}}}7.gp}}=}}},]p8 H$ѣGYlLgg''NNΜ9Cmm\Sf=ʚ5kW_L~!^fMAza 7NNNk)a$(266b믿Nqq1&I\1L$>{zgR__OSSo~&&&~nHNNƍ޽帾sNUU\Zh4>tڀB5FFFKI5n7p~Bm/PHn2p:LNNp8СCR\\Vkj[,^/6 ǃdR,e}~_n:줣|2-w\/]o~N' .,Z illnSVV6`F\›oIqq1555T* yp\y?эn4bHwIQ"%Z-[qDZgf$)W;Wl8Dɲ$RIIŝA }ߗKh޿?;HɢRSŲ.s=y9TTT HĉBm۶quillF+o>֮]=C*͛oIAAk׮< 166@PPXX(Dy 㭷nxxx0I177G?X,D"_xIHHH( z=gϞ%66ߏgڵ$&&r%B`VVVo>Wgjj@ @jj*p}ssmj!fggȑ#L&Xv-:T*Ο?`o}[;v Iff&[l_GRQVV李ÁJLll,;wdzz=zk׮K(BRVgaa ]0@  +WP]]Maa!/8xએCCC?𭺙,^{JKKٷo: eiiJ!̺.:;;D"LOOBGGF@aa!\7 p|?~˗/sT* B,..p8,-- Z͆ 8Nl6nR)%  ̮]c~~^F6"KKK~^~eػw/2:^~evڅ`VK^^p#pt*`T_V b\N8& 1 2662ZRիLLLʊoINN&..un}YHKKcffZO?M `hhEx ++fZZZHJJbyy9bcc2q vcqqϽY4tX,Μ9֭[fQZZJuu5?~%XJErr2ݻ۷#J0`0\.jLJJ z 6pArW.'nc׮]?χT*|gllLЮOKKKXV<d~?^ $f)..FѰuV*++1L۷M6m6ٲe bZy9fVVVJg$d\|@ B!Ξ=CT ޏp8}:D\\uuul&&&df.^J(JN:Bss3pLRRb\.8֭#%%p8̥Kr u:ݪt+QQp8Lff&qqql޼FFF޽JŚ5kP#ˣՊbaϞ=355EJJ v79I֭[q\RVVƞ={t\~V˃>HQQ===8x ~?OfrrxB,Vxhkk#))kZz$''.mut:z*J]vE]]Wnrr7RZZ*ljRSSnGLL B&)++cxx`0Ȯ]l6^d2ݑ9a2Xn~"HNNR  :NԌejj BG}NKK 7nhI4=:Etyy9)))rxIf o:^z|a]~<h4!p8`6QTٟٗrsϓ9F=H`Us8RSSY~;`yyO=}-x?xp8NMl6! p8 ZDwt/*PJBB=v299)8?DTb4W6;GK E"O/'H{4!H8-&&R8G"?SL&Ӫ߇aDߓwYd5э>G _DB||GRY]D"d2AEDDDDD[s|۝177wWo>d|s^'9FPv4F%\.mD"²].N^7c>88\.=>G"\.- Qv^ " sK""""""""_eZ^*ꎎ@EK͛x<$&&~*=Z{7Z?@#'%%}H$4=vw/7o}MDDDDDDDDC AQ߇Nvso槹gu/_v߭vFs2Z^ރgmH-i_|5 _;|oG[Vh4B̠011qqq( <caffJFann!T*Zw2|>z5(fT*axx@ ^|>xf3#j`0(9jgll얲T0;;+;a~~x@ӱn 'p`0arrR};(ܑzSfw6M>sLFll,v~r8fxxł` 000lF<~/֢%>EbyyO㡦\.WNvca]IDATܬ>77/ @zz:PV{[8f||U,.. tll,+++|$addٌ^G.3;;0\.2 288nMOO sB`ttT(vŏjllɓdeer\}?Øf >w8N',,,?r^ ôf͚G?N^T*enn$ *ǏG(رczA]b~~TzAXXX`0v.3·MRt:{ s`@"099:R墯O  bZt IT?@# n:^ʩSznn. sQvA\\/8x /_̙3h4z==+BGGwᆪNr3::ʹsHMM% qZ[[!_Ά hnn旿%BBɱ_t:t:*/266ƅ (//T*8s *H$sΑ "Htttƹsؽ{7ׯ_矧D%@X,t: BLNNhD"H$~B D"fffyWWկ(((:-,,2k---455aZ<|>.\@aa!/\v ^NRw===444yfd2@LNNb6d\.T*~͆gddZ+++ %gqq8{=.]D~~>Jqar177@ KKKH$l6`xnEc=>>ѣGE133#Ԝ ǏcXطo. ._̚5k}kooѣLMM1>>N^^C(x癛RN8Agg'»~qFGGh4cXhjjW^yaʢsۋG*9)))a}JKKo\z*fVR$p8h4,--o[ ),,$ )%N{̵k(**vT*lA^C099 vbpp^}UvA `ttp8V% 266&ew`6ijjiZP^QoDkk+A^xafq +ll߾Ȉ0MOOcXj~n7*Ed2<*8NRSS r=pgΜeq8(Ja>vyڵkYk׮QSSCww7pc!K/1;;׿ftt:rssihhҥKtww 1 ?~3gΰgr9¦}tSTDDDDD@OKK XnN"77{K/qSUU%8pNfff ),, O .Brr*=>>Vw QC5&&B*++iii!!! F#TWWY~=)))\|;vPZZ$`6z*rR mmmL&rrrȠ\n:;‚P`0OKK 7oh4RRRڵkz*yyyl޼7 wIyy9SSSdggqF #??_NE Ϙf\B?###LMM #[o177?PZ6, WRPP׮]cllYJJJ @ONNfӦM\.&'')..7200@ee%]]]@bb"uuu>.LSSCCC\.xwHOO'55UwyƑ#GX,LMM155k&l*;wJEkk+fN> cccB!J%Νra28v66inn&&&FCN8Aii)ɓsqfffn/2]]]_]]]sNvũSJsp$aqqqxGytb2?cyHIIa{$X^^Lƅ ذa/Rׯ =7jwuuww蠿+W̤~Vfggٹs'[nٷommmSSSCnn.555 TǏgddDx"׮]#??^z*|;A4$''f"h4TTTlWbiiH$.LNNLss37h4nD'hZD"s222HGra9IAAϟ$;;vvE8>D.#"""""'1 pm۶100 ,ģJڵl۶ ͻK^^+++XVo=9ER!Q*^XK$N>``ӦM TMRo8qB#@NNM^^/"n@ [o͛ݿ?l?~\yt֭[0H$ZgڵdffSOa6{mmmeӦM|$d2`&`\r׋L&P(ѧA.COO<@ESS2p8L0 Á\.'jP(Dnn.>(|{ڦ+.t:֬YCmm-TVV(ͥA& !{aΝ͖-[())ٳa$ }}}|>6o|/''WT*X,twwV塇b͚5x^RSSd\|ÁB```{ݭwH$\.-[`[~c~?jZT233o~þ}d( d2*e$ ZjQD"+ˉv Qլ ARxo`0Hgg'.nN'CCCX,Ƙ\D0 <v.\-[tRTTDUUŜ>Ζ-[hii!%%ױX,TTTh~:]]]Occ#uuu$$$PRR4 \.***H$466288Hii)BDEff&eeer5R)j|>XTO#azzzd$&&rbllLpljj*nffflݺ"`zv!+A566ngݺu\.}]҄jHWWaaozzZhSt~deeT*Q*H{{;k֬\0֣w"D7!4&z{{0*D@BD"! P(0͸\.aP*ddd)@,--155֭[iii!''Q4%%%ʢ^唕z*CCC꘨~A:00@cc#yyyH$aBDDDDDD>44$F4 'nk֬AVi&6l@ZZwfzzZr9&77H$Bww7?EEEj9FpCqzd2D"\rTR$&&FX(ZVrssbvvGVVvb˖-c0555,--qat:iXbvv\uuuz:\.ŋB[SSS@*bXHNNfzzǃnGP,$&&v6 Gvv6:n8^t#DPdBPFƍfbb޽{jZ( Yv-ϳgV+ӤR|QnqrY [l!Iee%vh4J||<> EEEzy`Xx衇\4=Gbb"FfggQ(Bϥn[xׯ_GѰ{n̈́k4۶mX8QTddd022r333h4jʘ& sss QHRHOO'//OxsrrP*D"***X,~A+!!X9ppLNNMYY@FF裏1 BjJ";;%|Kؼy3J%l~n݊\.'c0HMM6j%==uֱ~zZ[[Y^^&77Wȓ^n۷o' r̤R:::߿HYY 477S^^Ύ;ɡBYf vI:Dnn.PRRBuu5wA.^(T/(//' ɡ+a'""""' ql6+HX\\RVVvWoxn1EjWN9zqqQ+}D=o~Kc,E^Fq{Z=0;;{:׮]ʕ+|{[  b77mgffhjjBUoˬ|J$rYA*ƨWI AN'JѸ*,HGဟD"rI4[RQVVFII ٫D|8 =>D"233ַ`Xup4!U}&Vѐ/|ޯς4V{O_mDDDDDDDm;>%l6,O]o{yyY*-Aqr}sr bHH$$..膛Ŗ>h.g/~_Hj`ZQT΃Dx˛>K˝ wL?C"eNYAm,}Y=6qg$""""""IۏTqBV% 8A=<<R)ILLdqqV&&&z}}}fUCp۪}7Ӄ'>>MggPwee^U뉉 j裏X---t  rpC\)z=r>fff0LH$FFF#뙟 ÁhfVvT_2<<|v i7[V:;;YXX >>\"bWWLMM !]]]X,F#2:::x<$$$ H.\$%%宴vj?v\^1E}]JJJ+ z** v[!vINN+}eftR[[KNN~>H)bcc?H$4===x<F#`>tB!ennioo ̩ B놆x$..^&''1 U?sQYY)i Zzd2 y⿏P(lFR}{nVVV0B!z{{1 HnqFN'76:oozebbB~&''1ry.\EDDDDDD>_>G胃֭[˗9<6^ t:^}U}Y:DMM 555$&&L&=zj!$f'O277(ׯ؝5Tr9555qJ;v>hjjbrr+WPUUEWWoHMMOO_o[RRRGTr5, O\ȏ~7h4 9555TWW#Hc}rssgttW !ZKŋ޽v~PRR"D7{zzil6`aR)FaVRdrr90cccX,z=]]]>{ ϣT*9}4;vqrIww7###lذas!._̥KXZZb``._̫ƍFnzG"""""""ObUYYݻ R\\LUUy8+Wp8ڊ!??P(DLL `%B:'x knnfΝ[*wT*G! uxG9v옠''s ػw/pjj!֭[G8<& c07?!+++=T*|>vp8VSX>x^~xصkv_dqqd}Q~ߑE\\j`قѪhhoo'77)Ν#11V:tdCTO?}*شid2J%T*fbb^JJJ8w>(Nw}LFOOqqq|U D׿5iiitttvڻFDBgg'ǎ ŋ";;FlIoގf155jZ;Uy?O~~>2Ahnn&..tZ-rZsEj5V+|;߹c̉'h42??OII 333<={/Lvv6/_6>iiiw}LMM1??˗yDŽgKMM~x~a"?Op8(Jbcc1 \. |>Z-3339Gիvl6.kU.D""y 77'СC?/Dfݼ|t:o=@[[uuu C=++sEFFFc}˖-.c///@ ;l)osy$ 'O$33/o>, 333={vYZZbjj'Nʅ ?ؼy3  ݎV%66xv;RR)DT-,,066??P[[Kcc#ڵk9w=);88HYY?GWFVDDDDDDOUWW3<<ѣGzD"0׮]c۶m\.yq8ϳcoNǑ#G/a@aI҄B!}]شiӪkGbĉvqqq~fgg﨨n7Gy .011!_"055E8OO'dzn{{RSS7Ann.CCCra>,ŠCFF6 Ú5kG*LWWBHAAv o|#ٽ{7_י6DnE*k.~a4 O?4111'66??&??@ JYFdG AJ y1 aN:Nc֭8NVHOCC۶mh4i&~N(nS^^NUUǎҶ={[onݺ__3 %Q޽iH$XVxHOO]VS]]biiIn9+ H@ @OOmmm<䓷_$a׮]k fT*꺈| Ht N v܉^gӦML&qݬ[`0HNN399nT*P1]AA---\x;Gy饗@ gtt,fAՒJ0b`6nngtt Y\\P+++?eiiIX0==jjxPTD"Ǚgbbey)//sY9† GSS&L"333X,zD¿a*nv]d2XXX //@ L&tb6h4n::t_3Hzz: j.H"==ӧO(III(JfggIKK# GFFHNNfdd/L&ƚU|ԫ}?F#&''MP099Icc#d2Apmxx'@ىѣ\p 6 YXX 337bX )))A"i&JKKIJJblܸߏjEV6=33;vNOii)pXje~~RT**76'GFFrBgXZZ_ٳG4nhT*%  HLLf8HD0!;;Z-&F=iiisansܹUMb ٹs'@H$B\\W\b~FQQF`0e 1>>N(u/ >::*Kkk+ZG}Vn'''GX_דΝ;X,477j9|0 :J%H\SAfvyGA7b T*PH$BKKhX\\Мq8ddd}v6nHVV۷o'`Zdiiv;$''C!JCPDHIIl6T*YZZ"99J864$$$Dhnn±333j <0Lj0LTVV Hff&FQ0(++# aZٽ{7.YRRR 9蓓x^^/p͛7#H`ӦMlذǃVeڵHRA.''B`hh={PXX*]t:]B""8p8hoo'..}vZa񝛛` ++ BAzz:7ndffJVVׯgrrTJqq1yyy}~ApϞ=ظq#PTTL&#''([lL&)))b0PTdggntLFjj*hZ233n: ̰m6233G"VVV(**DFFF\㱱14 LMMa2DPB3??(|a#0jرM6jnsAd »J||<<jzyCuuuβsNr X͝bƍ Yf*,hFFV~7 hZ222deeYv- 2??͛$##Cgs\~z42==^6l6z 6,> ( ذa۶m#;;>rrrسg\.a[f ptߕ+W@RJ\\>(jZ ,;vCEDDDDD$]bWD"aqqKYY]yǃuuh4nsHKK㩧׷[uiH$"l|n( Dň޵ϗ; t wAxH jwD"l6w~deeo_# FXcii DB||EDDDDDtT*Lna!n HB!'Ou/w6nH$— }Ys5B6&YC$!??_({4ώO2n&99JuWO>D$X5zh.wFw@8D*7kb ۝׹7Ocn^/+++_ v{~=R鸓/3w+!Q1ϝas'+Qh?"nFkT!h9OS˒$""""""HYQ(B쎎S__/JHHIIIbPWWd2ZZZ&66Vt߬nillvtG Y|hh6st:D<mmm  B;Âbvziii_v~0znJJS__ؘOGGP^l6,--qU'99!zzzݷSUeȸ&>>ގ?7 ( hooĐhjjp`2211Abb">[cT^nZG/..Hnn|LNN'zܬQnfrr>{xoաVYŋl߾L1u:!hZCVRfbbL,?ψ'55׬Bj{9HKKbjQގ%66DD"addIT8N4ͪyFGGE&1882 LLLE @3>>v***X,d2Pµzc6Q(pIC&&IHU~ZZZ/IZZ,..Áfggh4  PvYLL @qqV`6qݼ[L& GӧO@NNhn/lz]|lܸ.ihh`˖-BQzzznSVVF__O{b0X^^&.. p8$$$vioogii`0V*ɸn0֭… dffc^yKyy9(J'x4% ;wd~~a$ R^^R]v!WFw QC5&& iii!==2 TWWc0(++CDuu5LNNccch(..FV db͚5իWrB&d"//flقh\)))aƍ1<< ͛Yf }}}~z֬YCoo/)nD~VVVhhh```P^^/Ν믓˿ۿEllQENee%tuuw}lvZlNzz:f[200``iiICn:N>|\|LݻJ_=..a~򓟐˗VȫB෿-BtᅬFVsEJJJavv/ /!==^l6CCCP( /B'? Z~?/,..-u{1;;АP{ttT"OLLFEELLLxG"R\\Loo/8zzzɡƈW^APݻ1LH$҈'xBwwwD(vSRR™3gfhhM}}=---T*ebbF4 %%%vZ"}}}TWW#ɰX,<3hZ v](VSS2d2N8D"ڵk _\`ܹst:yh4r~:CCCl߾^y>{c_oݽ{79rD( c8yF#̰sNT^{5bjT{{{#>>`0HVV<j͆墫x)//\.Bsss<]"pu׾`yyՊT*pva^/p\\.rAKJJ?Y^^mH\|AF#$&&r%Ғ`ܹvX,8Nv;.:;;k_k_~U"pXx.ׯ'33<p9r9;v젼LF0رcT*n7SSS QSS7 CjgnnJ8&SWWf# 1??OCCf`0jeyyOJJVIIIaflZ|EDDDDD|nZall%ٸq#z[H?>2>;;fa, )_zjmdzzOܸ_444f<^~Ƣj LOO3>>VznXSV ?яlB{{922Ғߏlfpp~3FFFrQJKKx<466"ɏ1557QFL&C* ^1 ̤OX J$d2`Yf `Bng||bF#eee8p{e^ʳ>K~~>~ebbb(++ EEEt:N'%%%\tϳfvBAOׯ_j}}} }H$rUIOO͂SQz$APzE`h4FFFG.P(cll$ |>g56> W^ebb⶛v9@P:jjj5s@8&++;wocWk׮k.EU e||EII lڴqzzzsT*[H\D"HII s|LOOٱcǪG"B=ڵkIHHJHG嫎),,$333b!99YG˗z(**Lvv6&>>1jkk#33SdBjz=׮]]r!SSS,--h$66F#FVL~~>T*YnlٲF__&XYYATzɹ%f122"sf3:AJJ D(CTBvv6AJ%lܸQ+߲e n0FbZrFѰL?YYY"~ɓ_ISSKKK>|{}""""""" Fs:(JF㪴/ow@ j7}<~|>'>ϗ;mD">].ח$hu$ &w/xÐJB *zhyys:/͜e&j^"jD"w-""""""H$^/111wt-z$&U{4.>vDy{8&99|BEDDDDDDDDD4w  xaİy/<55E{{;znkk+.M6!ɨT*ٹs'E:;;fvvV$ UUU$$$Ԅ墼[Dss3lذ7QᠩIPuݴv ==>FFFؼy0ש@"p5|>EEE< ׷mۆ^Ν;dtww355Enn.LNNӃ^gӦMl6Bzvf۷?v֭[?1n>Q1;;KGGJM6jbrrAٸHUUPF[n%ʊ0JDBAL&'O0KKKlڴYA7FÆ HNN>:W/%lذɄjJ͛T/Aw:\tWpy^< 0o&^P(oۿxhjjJ  l6uu=8q7,355oAkk+~^z-0vՊngraxwW譩?1㌏sYh4x<, @_]|! J@ /2v,H^z, P}J% ,,, lH$B__׮]댎r%E hiiիtuup8hkkI]FMM .v~ֆ>b.Ǒ#GH$⋌Ξ=9{,8Yy/R4/2== @@=11s%7jRSSC[[~~N'LMM =o Jmm-/^dbb~_qrҥUD"|>>/ކ_dyy_LLL / im6AffflnJSS>[ ޔ_Rp8L\\^.tӃT*mMLOݑJ8pxNG("%%|",xo^  vbcc9pIIIa4 ={i˖-<#$%%0TWW#˹j޽5kV) ǻko}}}466R__/{? 4r筷j{466244oq.ׯ#++K1T*q\rj5qqq,// dtttp>L?D__ -HhooA|>P[[ˋ/b:veewpg套^rqU&''Q(_!}|>0H$BHdjwqq1۷oB_g㗿%xG)**"0>>Ncc#v[ƋȽVcnn7xDT*% R__ώ;l;jf3رoPPP__nzy7gƍo^qI~iZG#R) ??r1 Q8@ffpzh4;*Ga֭9uP~!6ܮN$d2q֭[GQQtzH$ a>NKK $'' ޼&ns\tuu166'jX$ijj"99!Ώ1<<8?PD"~p͞!OTRap:Fww7x^~bوeyy&FFFi ttt099Iww7b4q\?~7xl\IOO'%%H$tuubPF"R)2LPqTnh4tuu}f"7Vxijj6ζm233288p8p`q86hLrr2dddGSSfoD" IJJbnnKBBFN)))<(J~?EEE$''Cqq1eeean7sd2B!<(x@FbZ&==xP(rN'&RSSH$LNNVEףP(h4B!2220(Jt:TTTP^^Nqq16mB.366Rh4`gddj~שT* F^/D" PVKrr2`J;644^'66t!^Ph$-- @ZZFDNNiiiZ8OFF=QUUEAAZCuuMKK' 8r }T*`00;;Kuu5UUUdgg333C^^v"??@ NLLL 8| vQHRv;& CBB~_(`\vtx^HIIazرcLMMvٻw/»T*giiP(DZZrx|$ jh4wן:@@HjC^^s0LzpCkayy$z ^T*)((rV=;˅F6 gff7RYY)4|8mӺ}>P"f$6MHdH$,..z)++7YA_\\JA_\\uУBxCܭ:sss,)))H$ŋ7;wN*-HWI AN'JRmr2kP{Wo>Bn+~qH$!D" a꿏O:N>k,w7D"A^-tݺuTVV"W=H$Bee'">ﮌ[/QND`pU. j;Ou2E_VVVB{r$Rn|qz p;QD"T?D"_rx"@ǭGLLs09->wT qJ; qjP(Dbb'."""""""ޱ]\؊|2~62ryxu(sDE> _0s{~?v`0 c' A^?)ȆrƝ# x>)4+++8{^+M|󈈈ȧ#U8{,JVVVz*$$$8}4---Zfnn˗/>hZA,,, Vq|Յd#pT\TիWq8bZ9{,v N'555VAnxΟ?/׮]8bcc,8s mmmLNNř3g#++A^Bh4εkׄSSS?~;7`0xK_2>>ǥK0W_%..6233?VZ_$771a69s ^W>o[(,,HݕVVV> CCC\|Lrr]82;vo\.'!!qΟ? iii8Ο?Ą0^`0ҥKD"XXXܹsB`0ȕ+W"11ZM{{;¸\\\ܹs͑F0eɕ+Wu ϟp%aW*sNGss5õk8y$g&"""U㓨5:u>bccr 6lN~I݋R䥗^رcKJJ qqq466288HBBG>7蓓0<<W^yr?NYY* LoMii).\bZ`0_L&Pf}ddfINN&//﮴5ZfmiiZ-===q yw(..ѣ񑒒\z3gp`ff`DFQ0C ʺ:  Nmm-KKK2͆ hnn^qRWWGoo/qqqhZsU233dH$, n6я~SWWG  ))q$..}F >AC`vvs ^yRr^FFFH$d2ajxxISΝ;Gaa!###zzzzȑ#lذZd20lٲ^{ǙE*Ԅd⥗^"33ӧOSVV2vRRR8qdggJgg'.]"..+W~zZZZ@R뙞իvdfYn=֭rq9rrrHNNfqqGΙ3g(((_$!!Wb0p }}}œodgg HHH`ppPؐ5 \t|[__Oww7sss$%%Doo/RIcc#ttti&l6111iZ|2l߾]C6Az=s/lxLMM,W\jȯ~+Z[[dzz 8N:::X\\D.S__4X,jkkX,$''3==FA&E"܌jTh:N CCC444Dt444ߏhdeefz{{ 199IRR355EBBªMʹs,//hb{ʩSɓY_|.]Djj*gΜt2336K.멭%##_|LΜ9C^^: nE{{;vz=*]W^yTJoo/P1ZZZ477/,[KZF$.R)Ǐ'99gRYYb7ߤHuu=KI tqF8^XX %%kֆer6oLRRQXX(,`^/ zr ;vPxOO۶mGazz~ǝ!Jپ};d2P*D"x衇(,,D.#شiBX\\dӦMD"bccz=gB(& FCCXKBBpޝ>uv{7K/4{!$$!OQjR2IH% W$Sy3c: YYhB z_~/T}#,Y7!ϧeI{yصkUUUh4 ڵ HTTTVVG׳uV222 iiiO>aqq?{qM\B[[fddwrccc;v B!E>F\.G`4t066Ǚ?fjj ۍRرcz=4440==MTT>Oz蠫sqM9r.],p[nfөy\Pp}]m111hZݻ:u ׋FvF$p]^ʕ+W8<C199Jى}nڴz3)B.gM?Ǐ'::Ln@__~!nwyYZZZꢱ1&&&8ugdgg''N`bb3gp}^y3>>^gffP(ʢkQ__ݻw줼_A[[qqq8pB{{;3338pM6ݻwcn޼Ijj*oN8p555pgjj7o,][7nvggp-ݻǞ={ػw/twwgggٲe B!Fb[TAپQ={XZZ?~6jkkYXXO?uVz-JKK9y$p8dqqFB!i0mD\.>LII ҿ?+)L&C& 8v~ql7:uEfgg9t?IIIkϤp5aqqoN^^@'NP(طo333ܿnqpxvEqq1ܹ^/raؽ{7P(Dff&[l1<ڵR%55p8LBBV&\.yyyܿq&''$%%QRRvB!}߾}72=="<|hdqq@ @NNwGgg'}}}vIJJ"//hٲe pi܅B! ϑP(DLLU]]Mjj*`';;THII!''266ƩSPT( 0pXz22 CTTgJm?"Nv+Jbvv*++1 R{r9555\pALDEhYi O^^2899 1 R27|.p\rݻdž ػw/ d28D˧}GGGSXXȹsغutMfYZZJ>|QxJڑ$pJŦMȠE0~͛7v" _BR &n6:]v199륬zRSSidƍ9lڵΦI6nȶmۤғ(M&a6zRH\.~H.ǯ\Eh<ǯ~"~omITL^^7*, ϼ3011^'33Vˎ;Ν;rQTٳR)%ŋܹsdrrrrIuk׮q1|^/< ;;B!9sFZ'ֆf#11q fLNNr 㩨`llC!ɨ"&&i#28..Nr9KKKܹsLz#ⷿ-IIILLLPQQbfQSSCii)\rN8y͵7??/͌F+LOOůkZZZJ)((, R$[oo/SSSf^*ED'ZMMM 111P^^B ;;i9G#iinn&%%gGAAׯ_4jR|g9N.\ŋ\3+xMMM KuuO[[k^P(PTx^RRRP|G+ɓ'9lB\\Ν;TUUaΜ9ӧ)((!0 $''saeeeA5 DEEl&::)l6wBX,T* 6dffk.ϧ i0t͆V`0wo5PB&vaat: IHHtR__Onn.yyy86l@eeYBZMZZtwwcc۶m͛$9$&&d"##Ez=$%%IKKKt}vl';;INNeeeq:XVj `aaHqqT㽨$XDrr2~r񐞞Niiq8Q\\Iʾ~YeÆ (J6oތ%&&{JP޽{L&l6\(##;wMBBG`RHZB!ߏV%%%:0҃xRRR0LVKczz^}UF#6 ݻ 77ӉBfQRRB0jꫯNll4jوEVS]]MAA,--ILLDTRVV&%NLHH ))Izhy@lHNNw^ityfJJJ94%99Fjj*B!iNNiiia*++%--1RrȹjHIIۢ4~Ցř<9x233Zϻb~?JK 嬮ƍlHQ^P(DZZ`Amm-yyy|>)i8&\."mf5.///GRjٳgEHLL$!!A PWW'-Q{r ^)))xصk沲BmmtYYY֒B\\QʫJFFyyy\.JJJfI#=x<6x<Iy'!!4nikee%dffEBB;w$))Iz0~3$%%I}kA߷Y.[\\F=ϚnuvsA_\\ĉϳqF׻EA^:SSS$&&~I( vAVV^CgϞfHa}ee޽R//䈡PVHLL^{f?uߥn`0yPy ؿz `~?4npM6qn  |J_p8PTL5MOG({Dv"qu:O&K&Fy$cvS?yv][pfTY&jҲvKJ%Z+YjH9BNQSb4q~\$]$y~)= INQZAxYEhxچ /^wG~Jk" 7n@R}vL&׮]ctt*++泥̎;\xG}}=r?U***?]]]@jj7eee^^᫹\..^*uuuX5?d߿'\OA#;\455144Nr2RSSvhF:tMOO4Jmkk#//^\\ҥKB>,ZZZy&QQQrBhgyy(nݺ%՟ BG1>>8#**4_t:)**"&&Fʪ%dee'ۋ#==~N>h FC{{T>^ct>~IDAT#)} N>͹s#cccjZ-> .pi._n… ?AΜ9É'tuurhnnɓϯs},999;gΜ!++GJ`V+n9sqN'GA.@ {d2VWWinn?fhh^/tuuq]=ןX<99ɉ'q\3;;K__CCCz^/> k֭[8NΟ?~KKKCt:[nh4 jl߾){YY555zr@qqTl6SWWGff=q`mmm={`0ȉ'֭[r]>CFGGill$66F^gaacǎh'99O?!ill\$|EEEرz=qqqDEEݍFt:޽{ܹzFGGQTt:zzz0L/]VlL۷iiibVt\t۷os!WVVtttpeVVVO>\.ƍLOOc6ZPfoK[[gΜahhcǎÇd2V=n.\oKg``$ngLLL`2غu뚲ubnnnAAAx2'|7o><gϞEѠP(zS[[nɓ\.w5557SN??_Vfff~7t@EEO}ܹÅ )Zw Ǐt222ݻwIMM孷//8?``Ϟ=Yб1)|ll?> Zl߾B ٺuTJ.Cٶmp8LFF8Nz{{exxNGrr2)))1??EVKnK( /K Bgggd2133BPZZ??Y^^^cp8LNNܸqIhnnf``m۶Q___|Gz2v)L>z=YYYaj5f5tVKJJ MMMre &b j( F#zzzz}TK=KTT~_>j͛7KZ]]q̉'jB峳X,,,,H[XXpI:ɓ'x3fffr s8].&I:?!HII!ȚrLUU:\rss9}4Cܸq5bpp:lT*) 24Ltuu1;;Kmm-:,׵***hmmСC111կ8s ׯ300 }FY  ) zxt:j5jP*x<زe c6IHHb`P$$$+˛L&L&Z7jeT*Qqk4阬V+iiiőFff&dggT*q\8Onn.FTz=VIJJB&yf P)E^\.'33hbbb(**"-- G]]EEEx())ZP*RgR\YYfe2fRdBTV%:: фal۶ J۷ٹs' ٵkVUz*P((((  hHNNd2Q[[+-#%%EZNY,^y)--eÆ fӉV^^JHuu5PJ%Efu:tMZV^}Ur96l n7%%%ƒOZZ*-[`D8AAȸ1>>Xbbb`0 O+iLnnIA]}qqO>Eضmz7E8^:SSS$&&innftt^sAADYYYh]}kk+d2ػw`DtAA bccY^^fiiIDKJJrz1Lk"Ɵ:@_YY!;;5\&vx<o|L&ZFӭ{%rܑdx_wpX 1~_yn3pyf#O[bzċ ?`χGK%T*XGE"^oAAL&cvvJoo/8v޽{rxچ"/ }z$ɲd2~s++u"!ߥ<@ [Dxp@ }9 @"|}>ߺHoAAG @&Q^^gvv;vRp\O}p8Jl6GBM&wN|O-= =wYw'_KyC8a2ք ?N  /Hn5LFeeI_,}{޹f}\%eY\\\wŸ6?? ,..~m|gAAML&"Uwr#Ϫ <r:{_V~ L&cbbAQQ3sz/ ߏ+++5Q~YYYytuuQVVn3³EX2)(**q\pd***u$*  `0KKKx^J%pXE?-Ih4R F"뺝N'VuVDr |ՠ/j5QQQ/ p?t\zc6{Q>wF:yס  ³Dr>E&/d̠P(Pk3d8Nr'zC.SPP@8<ORDR=5K   Z)&'')//ꑪJO{ާ&}V>X4s+  0`Bݻٹs'η(mF   8AAA. Dbb'{ܳ*f=u"m0vY]]N5l" "׻)   /HEixYȸ>$nuuZ6הYGzWWWXAAAO^34    0l\(   G,2AAA   KvL&(d%tEXtdate:create2019-01-17T15:05:16-05:00Q[%tEXtdate:modify2019-01-17T15:05:01-05:00) gIENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-select-b-1.png000066400000000000000000005312631414302661500266240ustar00rootroot00000000000000PNG  IHDR 6wgAMA a cHRMz&u0`:pQ<bKGDtIME 33q IDATxwt\}SDa/b%d5+ˎ\Ol9oΞl߬gmgnR(-۲z(Q"EREWL>?$@EH}^>cqf}`s[B!B!ٶǶ.E"B!B!heqTii]0MACC+B!B!^eHQvttuS܍9Jɪg=0&B!B!JXU-.hv  ̖#~9}F2Ʋ4fB(e~zإ\JG4teW4MдяR4M?ek_+Z*qW8zy }/Q*}{LB\l[aYa:۶e L3ch]FGc6xˍCn+uv;tye8,@G#¶/!6eQ[{b C2ICwF ܒA1(ؽ{7]w^o]]֞p0{l0Ǐg8P`J鴶P[{nӉR FWWC)Ekku̜9)ض:v(~;~,Q{(++Mg4Y7MN}x< <:Yh!}}dv1MdddN~Vңfg^{&--Yf~)eH$%??۶طos!33S~s! J} 4p8L @4q:%O4 ̝;00 #Gq#p88N,Nc˿|JyN߼}:颬V^xE֮}N*++K<@ HFF~5si Ŗ9u,Xp ''WzH$œ9sO_ B!OL:SP(D4e%|455p8R/Cq>:;;q:hZr`p8BiiYYAfΜI__cmE }dfE2n~!W"۶g?9+Vw:uxidddjJ֬y GGG'SPPȓO^lwqGX&͛g>***줭 AǏyfO? /? ~ ?6}}}۷G(--tf^ye|A/_Ώ~#Cտ//dgNUU|_eƌ'?p_5G!?dŊx<?Ğ={d{B6nDoo/pklݺرڵ]7˲ٿMMML67RWWҥK>}:;v줱|"z){ػw/'O3 {J'={6ͼKP]]MQQv&;;J̙;{S@!mE4cw1szq:@^^cɋc 4p8̴i@)H$ʶm[)++G)+5x<;ʲe˘6m:}p8Dvv6x ݲmXX|[,JL\Mnrܔ" $q6o̡Cz@?7ioo鱗e9륶$]#W|Y233~+ @~~>_B:uAl[پ}no;UUU9rի䡇M4eppB0 {zm>ϱt28Ν;ooer̙33g6bٳKc)=JwwӦMz+Wi&o2sLy]t4Ms̡}kvN0y<裬XqmpӧOgr뭷5\ßFS{nݺkR\\OzI,CD"b8TVNŲ,A"eΝCUUS]]P Mnrܮwu,q,;ȁ9zJbD1[N:;;g4MZ[[ٴi#>MMMFF9>F0MC #:ax QXŴL8]q!b(0 o۷̙3 rr)*/ MQQ!yy8Nlbʔjͥ/ ӴRO@;4Mn7>t} 4 G",rrrH$┗3k,}Y<tvvCsJ1M\0MRb( HԂ1N:1M2#FnnQRRLvܡĉZ,YBUUe{p3Xn{… ?'N`Æ nSuV-[R6%(e~{8N|>e3uT֯TUUQQ1MӘ7o.ssס:Wa׮=zyԄ0t֮}"z{{r! !tS/fr-:;;x</eNrN q8q3IaY.34/nkDJ)B0gѣtuur5 z0ǿC]iaY߂Y͚BP_M7ȪU+QJl2f͚iTUU3kLL)gAaa!#//Yfh"mf̘)̞=+`p8²e˸{HKRYY)((`TWWxXh˗_Kuu5ӧOcʔ)ܹx1MRp\tttoMcܹ|Y\s|>}-p8=g޼2wJJJ9s& .`ʔr,ˤP(ԩS&//s瑝c!.\ȽC__msmrJ*++q:]̛7%K`Y69,] !`/ij:C(&?yQ^^eʔ)L:9sRPOQQ^EquYry!͛u]kddd`5xG2M˲R阦a<$ˣ:iiҶ,+Un^=\F !?۶9rX }ǻe۶"xtskdп!9Z0w}C;ްii^Jet!jïd2OOs!8ǩSp=u`c,ǎ#--X,^###͛7SYY}K^3y'8x sa,XtM1cFj;sC4B/2*k׮"rssSeMͲ,ݼ,\8iTVV /PRRBfffjMx駙:u*999#B!Bq:]4|L4Mm^WWdž ,o3g٣i,_o]yF4yױ,+V}v7oSL^[nQI._RR}~3-Zatuuzj0_=mmmdddiqvVJ)Çy <0o;]׉<3^nSʰw!B!B:G駟tuuښ _y ##7x-bݺuyyy̟?={PWWGUU.twwswwS4+ܹsS7nHVVwqk׮%??%Kp 7pq2331cN<MFF{!m۶s /p ;atvv̬Y(,,a:.X,F<G4VXAZZ|J)̙7 vmX,FFF>/۬:iiis=|>^|E:;;;L|lX כ*[8r$aY|scL߶my?OQQxX,F8f޼yTUU.8n7Nh4*B!Bq5"xVXcҥK"Hz|\<9P,bz)jjj馛̟?\8z(ezAii)EEERRRBee%z+Atb&Wf˖-\RzЅB! ix<D*xuA  >g&X ]q:D""HSхB!^/n˲Λ~ÏM:rBq|> SEQzG<5ddd' H?h4hۍRA0MD"O<>Hqq1෎B!Bi>>ELO=ɴ?B=_YGi]!B!SO$B!Bq$@B!B!& ЅB!BI@t!B!bpLtF#ۆWB!Bפ c8XpaPRR2B!BtHXӴTOmۣ>gxJ$SUUR*Rj(_3˫:mS2dc7VYfO.\bO~(UUUA}Y~mn&Wf߾}|G̞=͛7sN6mDii)lٲ{xb6o̾}ضm ,H]β,eaCT 10 ] mqE_FPpl08kXt^E{SOIOWk = c1ذɾ}lq0eMmk97hkV<6; f϶y ;v8ؽAYͱc۷;غՁ 6Ji8NVWN֖t䷇@l; &9ox ::x_G{k?gqx11ωLJ.FD"5t45uNp:?NCӆ^|<*K< jw.Lp1aˇ,_ _-^9 ܃iԠPD(4lmʴi='_`Alec+ֳsMM/5}-[`&y]{ݱj2ݙK!B9[ 8q]9y$eq뭷Bff&N ݞ?>mmm9N< 3={6W^{ĉ熆jkk)..4M,pCnn.|_A gٸq#F իWxbL?D)u]@GGNbٲeq2sL, 5 ߞ` }4NGNF$AEcp!p8ޛ&;US̟oq m35v9صo뢱Q'-Me[`á5#l9+nkHKS|H^8tȠMͳ\c~2]zs5LW&fp6rW]b''0 /i4"HgXk7236}}۷;( {Z< ḺO,Yb5\cr ^uzN2)p.n[D(kaɟn7(ӉQ|n> 1?7m2\Rd),,2r<9C%B  ل+bB!W1#no~̙3Ekk+dffs\nt]4Mqrssnn0 ^/m388H$uiwѣqC@h4JKK ?Ob޼y(qigϞv˲(--p8L?O<J)V\m100@zz:大 # D"===z]~;3tnԩS),,dppninn/ ii [p8=,zh{zb`@Ug n޽CŊXLC)LJgg+556<gE,odfݖQ8axw'8yRQ'=]/ p#G tmv4xyV٩`69"P"ĶmZ9seaB_8Mb:B49w$pG{0 ^@@EomE "ڳVjQ[~Yl~3fXTW| 4yǙ:])^b'R̞mqA<>>Z.g&55eaˇ(iF_%:lI t%v8<r0@t'=IIF sh qr -Ԃpiĭ88HYf !Bq9]4 SL!;;0eXŝwމR\(++vcsѣ%K8y$TTTt:)--%;;zj9pkb6TVV{G0$++@ b PYYɦMR͝;oKɭJ{{;k֬x4PJNuu5 33qF ;bT9lقRVJJJرc@|>EEEjkR ŕgh Kx)J m4gi4>lJ_%WB!B\>Z}agnsj3J>vvXgx  QSSsVZ\yhiuܙ\ g[s a[ :;uo|#v>]'5_zsFҒ 9>s3-$]S[CuMVvQuN,Yh^E<G5ʮ0sMY=W|xGkQuz˴[ȡy8mDoy6Mn&B!ιHܙNǝNgj=~y]Jp>V; | T(-OS%3g>7Z:c*I=VJ m3%.Ebj[݅B!NVzB!B!& ЅB!BI@t!B!b]!B!ιHܥnv5>i~eJ-\z]J'KY&څkڹ de;L~jyMBqy+a37nχiĥ 33 X躎%33P(D(l:k@ pmxqcYe{=.ivTJ)tޑ56&R{<&0wЏRgJi ~_ϴ4rssS!רkF("wYh4 J)/~m@FF\VM'cyyy\NX, |"P(c``.\ dggt:~}}}n222&4@ p8(++TTiabq_1MCilih"?>Sq{<zR ӉiXW~FVV>SL^8m[B!Dʘ\,r] tс]kFww7Pb.KX̼,wtwwrp:5 ]^OM4M\.׸D'===U۶4 M[²:JT' '##J7<) ,l0NwBchXYVJ7NW MeS'( ^ԹiYaώeY#>#m{"p`Ƹ{5M#==]>pѯB!N⮔Gp9M\&˙LR%/XuJ O:|mF:9tLJ ГKo9<4Mjkkq\TWWMSSsvH;< en6\.W_ɺ'˔Çϧp"4MvMgg'ӧOgٴgf͚f޽,]Ǟ={aժUb ٱcxbؽ{7` P^^*î]hhh 33UVa6۷o'==˗سg}}}̝;*>L}}=,ZM8ruuu̞=ӧsS8pFY` y ea%Nr`"҂c1~8CP}z-ee vwwR R)(MO皼<M (;;;ٻw/apגݻorqa2e ,]vQRR… G̘1>6hmmѣtRn7~͛7Ř9s&ɓ=zKRZZJss3 ==k4ٹs'Xŋ +V qXlJ)mۆe#^{{bÆ Fg!ŋ/H{{;0?e``ݻww^z_2o&p8F:uxLDu}Y80y/~^oˢ۳g3#3fpCAu\Wu:Yl nFEez:.`Qn.hn7rs{e^v63<\UEÁ}F.@ww7XcǎϒH$=ݘj{ػw/k֬Isy(*m @GG{~yMMM[@ ロ|ر_O zh4JNNkbYN7oc&uuu⋣~,kSl^G? bD7x0W_M7Yz5OGoo/7nd߾}IWWMMM<䓬_NmƆ ò,Z[[}Q^xOB04W^[ow^>oÇyW_A{9N8/Lmm-}֭ò,t]gy#GcY< jS!BO9#sɞgygyT/msQy~my>|Yt˲b HǪK4e͚5b2>.\8 K[[& QPPg?YR3w}\{hnnK޿ttt@gg']]]dddp7HSSӧOԩS 9=B)e6'dan.MLgeRggsה)$ lbgq2*=[KKYmeeC;BYʶ9ie5}޼yL:˲z~픖b6n;[n4,ˢo9 |]nt]'77:;eYX½^/NCԔ91^lsɔ)Sx;w.mt:Yt)EEE̚53f0uTN"##ǝwIVV%M4VB+WLβ,L+eժU| _@uv?Oww77nd׮]a8n7xH$Bcc#*`05z`ѣG_"xf`b=\s ;wȑ#qy;v;w2w\y0Ƕmyٹs's=|3v9z(riiiZ!R7@-SJDxWصkg; ??DL 0~X,' 3Xzx<>g80YjPן~>s*mAF~hje`0jD"qA,Rl޼'xSNϯ~+^}Qӻi{kjjx)((E__999̙39uK,V"H2//9sV۷ bsC__/vLJvb<#F $G6꫸nhhh`_4MXf >y_+ؼya/CO4g,[X,… y衇Xf 555dgg_P(adee+W^|mȶM[ REE&0(xr8DW==´,n.-%hO r:q]`WGzz'|\~۲0 Qtm۶QWW#& ٻw/=zR1uT@z>/_ٽ{7dgg3gjkkYhEEElܸ49~8ӦM{tl6[9CHbNNP gYv}=,`w7itLzPOmmM$ qji>ݲe O>$s8@vv6O>$]]]<~ رctuuǏ_֭[yyGRUVD, ]tݻԨF9’%K.*x߿3fu;vM7݄|><Oja۶m4Yb===P]]Mee%'O0 4Mc߾} 200@UU---aveFݮq7x'Np=1 3g2|^z%^~e^/ ,`ΝGGq֮]K `޼yDss3x<fΜI}}= .X!r1|[аzs3g3gL=ڱe~('M~~G;c9N;|sF Bx<GisRSS9g=7yru\{˲F#9:///eY\. 8۶@4O@gt]O-65]>˕z%YZZt :u* JKK|$ NJYYyyy|>G7=9仨TsrrRsgΜɜ9s$33L,"Nvv6i#PQQA  PRRBNN'^r:q)xIKK㳟,-n7@\nʨrJJJ(//>͛GZZiii,^t` < 3efΜIOO-bѢETWW.vmD"u]uwwb ̙ôiL2oD"Ass3>{L),,~ '_O!B8>}}}rlQp88,B4<5DRATvv6 d6ɅSD"x\[YESSSQQqVqomm%;;;5OzpOX,v.>07^y4{۪0Tr-y^8[)$Sҁ[J4 ]p:(߻:.X ۬m.d9Wrm7yAPӴ\do{d$?.}A]!)cqwݩ!'O1S_L9h4ՃyS[%\.e#ٓƽ$GK7-Ǔ ".Gp8Փ/.LEiz:g>XG[[|QSl2/Od7<+-pLZ~?߱.~rνB!it BK~inχi H$.,\.Wj1K u]'--LBPzƪt:GY' !B!WFqBDU!B!jrF<6"@4P(dee'N>Cii)k֬駟|~9shoo'? wps=ǻKWWӦMKXz58x UUUD"]vtRoX~=L:wy^{Ç3m4xyw裏Xp!oo'Odg B!Gm3f`g?C)Euu5G᷿-~!dee /sϱd<;w駟f…={zIKKK}SSS _~ey?NEEPg>|E~;֯_離M6s!NJGG?imme<NǏS[[KQQF,문{.kϝ;}ktttk.Xx1ضMZZg{Yf \s5x^b_F' qM7q5p8XbG֭[ijjJDnn.~;%%%8NVXAoo/p]Yd _W9rG/ˤ~zniii!̒%KXjBqN뮻/ڵ::u*---xb^{5,b…AOOHw}z }}}b1nfΝ⦛nGaӦMtvvDII g'33Eֆi\.>qF7o_d׮]̘1??c188Ȟ={8q B!&1ʕ+yGiiia^^<7Hk`H$@OO6mh4Jww7ms-0k,n7z+> ^*TJHyy9v|>,YBss3i8w0|.]ʞ={8t%%%,\֏;Ưky6oތicń躮SSSC4Cyyy cԩ4662m4233)))!7775d?1w\lۦYfe~p8T;yzK|\.***x<(p\TWWOZZve޼y466R__7ߌix</_N}}=/ꚈBqxS=1 2rrrR߇|̙3۶)++cڴi<|Z[[S&]s5h?G}㡢"u2m4R=DTi8N;M7DNNn_$ &BLb^7磨(OSSv3eR׭[ǂ (++öm***:u* n;}XQQAvvv /F)~;vޝ>t:dddPUUEss3䐑AOOYYYz)++uw'_pI^x^S'lX[oEcc#=XaW"7oȑ#|Glݺ,/|Ǐ388ٴi_W|D"8K,g۷o28pիW/~"ygXx1˗/g۶m?~͛7m6x衇?cLӤqW!b׮][{\9m0;rS%E"ٲe |D">vWS߇^{-'G|&WJi&c=FZZuuug};v 4;w.--- o~Ljkk'BLbJ)mƖ-[WBVVֈB>,>kˇ~ݻٱc;v`ʔ)|[СCDQ6nȁxza,g֬Yݻ7w2۶Y~=_2Mx衇?>n3sL>p7? nY/Bkk+X~3g{vZz{{>}:Vbڴip7ygٷo-***زe msAV^Mss3wqn^x}rS#ȦL/~ H$|>ٸq#ӦMc̙hFmm-qV\9B!SQQACC/N#GG(5kְyf ,gԩr뭷?YlYYY|Cuu5֭#--۷[o>9 Hђz PVVիY~=mmmz뭩ѣ撓a(㩛eYaE?58^4|===q8Ԑ.S{撖Z޲,z{{u=hNOOD])(( p8H$~A)EWWib~bG,# b6YYYX ۶qݩrss%8BqNiK<G4 0M~`hWA?mx(,,H$i#o ˲p5M]),,$rb NNND"5grMoos~?H$u:==`0J B B19"n+,,$100@VV300Z,77whQQ`t88Nmn,Bux<"@ tww񐑑A*^,,,$ FSäPJt:S+'oPKnn !B!W|>_39RbYlN*B!B|Et!B!b]!B!$@B!B!& ЅB!BI@t!B!b]!B!]sikk?!\KB!.0,k!B\UlG'ukm6{s'B4^z)<B!.]ijjG?wq]p:@b̜9??!WF^uկRYY9B!޻2n\!B!&uFffDC!ANNaLtQB ''碆hwM󑛛;u(,,!+nI ҝ].Hu\h^4蠸cRvB!(x.JKK"++ ۍeYضm(RnnnIp.o?]Oܰ׎b\q !墼w!BK70PQ?vIuJbC/S>#M=fwjxdyNW0-Oo>6wd:mK^:Di- ),qE?^,lDxO"B1FkU M@OB+B)dz}CT y>$z}sju(x(U soHlv i(F߿<6\D {,l~ޡ^}SxN5N~&17j- KAB<]z#V-(U8?B!D !ħ>~`}Mwr:: -״42\44 _ ̠ڜc2/2 5יe|o/!J$sЅB\Rh_Onn.˗^KWuu)҉.B!]!I)ŊU㮻M>MtB!.ظ`0Hmm-x* δi4 ˲(,,d``p8Li=P]]MAAD[!β,(̬Ytcv8#:dLtB!.ܸ`0ȓO>墨O `̛֭7uQYY eÇ?swذagFVVD]!LtvB7cf⑇ k=]2!B3СC~nR^|9|0X  ;m;u[ȩS?yUVn>c1#!t-DZZҰZ`a FI.xsP''L_Sw@bf!Jmt-o7px@Ӱ;@k (P`wK ټi E9|]7Jc\z$pMaȔ)S7VՇq\a9lQvPk]B : OqhjWӫ~uB!,lf0ǸE1}٬]kRZZiq.]c= {߿ٳgίaǎl޼h4JIIɸ %w$BB 1͍;Qϝٛ`8ϟmh/cT[p0kP8s5jj^p`_@:츄]g?:nB!Pt4Mh㏳uVXh#Y``]v1oN:;e:܋,;L s# B!İlXR0YS4MGnnD˲k t!@Jx*]eri07}"KeN};cLƷB!x@s!B\$@BO.nB!W'B!BqE]!B!$@B!B!& ЅB!BI@t!B!b]!B!$@B!B!& ЅB!BI@t!B!b]!B!$@B!B!& Ѕ .ǺQ60RXGΙgݑkgwǓǙƓG~mmbnTQ$Tx1asNsb3\\h3w``:~qNk7(,ۉYsc,b֭yLUKU;svs OR;v~;Ʊcu9ydi| ;FݛͶm۰sma5oGEG}:eϏ9r%Bq> !>vD~LSQocw mC#Ӝ>f~ Gђ(9ee>_O#Jsb4Q}l ݈nt7 k6=qXF}q]Aysq3xp}V-?,=g=+СCcs$Gbύ\uãrPJb֭O?O?=cx ^xP(__sĉqf~ݻۿ%H}#awLWWtwwXy7ᩧ6B!1B? EWwc:cy5.$39oxʧ9A/QƝ8r__QsyeqU|BAzЅB!BI@t!B!bxV-#?BVuǽFy$DBvOsP(4tSl fc&lwPabOdxjvE~KK܊"#LCggn:IC]bA_ m&fU  Ns0hIl=uO#`5#h]f[&`7n $Q )BLN %33ۍi۷#-E;|8AujF`O>Phoաv\S cZ_qn{ƕX$0t8k&0T9㧷p塴Cf(4}uȵ-F!s~1윑y$mq ;NG4ś0{B`_39}:#2"xXch8OC%!6|ζ.(Rb ~",]Ohn]D"υBLZ ЧOΚ5kؾ};%%%D"87pCj֭[9t---=zJ)q: ͑&B;Ϟqο/#{>=stst@L4Lu7.1FluգShhhu1SQ@m8Ѧ̮C4>&o 04$:B1AEE_Wزe K,1/^znsX7vٺu+deeMt݅B!BIcܗ.\… |׿*]T͞B04t}hH4 Mƿe*|Z{ŶmLq[Ym@3aZr8ض}:sceaYJ)xkC*abk#ʡiڨyNcc#eQ]]}޲ !m~󟓞NGGYYYԅ^۶QJb掼`<ѕ8gsDBCs&V#)Uñc, $躎O8/dva%i4 ]nƘ3򸐺 !RJ4&up8nu] ![nur[?iɒ.B!%B!B!$ B!B1 H.B!BL !B!B!B!$ B!B1 H.B!BL !B!B!B!$ B!B1 H.B!BL !B!B!B!$ B!B1 H.B!BL !B!B!B!$ B!B1 8{m~,"++ A|>J)RnexRbY>c !B! ㊔Ǐ'##YfoRVVFQQ$ |AvEmm-_Whjjb PUUţ>*AB!B1̸ǏG77Dذasn?)sO_TT׾5zzzO~=Cvv3X"iVBqqhvG}Ϣ&@vlG78c^MB!ĕG)4o6;p^T ;::(..˅alݺ`0ȝwI8&{^"7n~fbwݘvB+ $4[3,@W-CB!-yxV}ԩSYf ǏP(D"n0 6m֭[ 444:? _]w݅v!M!ą4@ a3uOB14uɿpkp8XhEEEcC=K,'| ۷r^~e~a222&B!BIc\|ͬXN|_%Hp8F q;w.O>$eiڨF ]t!HWRC4u !ʣ]׸\kMp\g=:_ Zۗ¡.âkQwuRG-☚AB!- {)>4BB f`08Xh?Uˬюn+}s $BO5lsQE1tɝ?B+8Upz@4z'.B!>X0Eq755QVVƴiӀpuVq8DQ`GaaxD"xUHym Cf !pvrdjOS>n& ЅB1q,jK' y2~6XҥK?cYnDz,JFݠiUU3!B\]qGʚ>ۍ>q0|\8lSzc2]!.rbfubr#&Mƹ !bX6(UI]HW[7]tfBq v9nłQWQ|l\?˧`]EuB!ĕG)EQAnp]T;@wb!{ '(^֪*_d"BqdB!B1 H.B!BL !B!B!B!$ B!B1 H.B!BL !B!Bi`Ot>z٠DB!pLtB|nreYe]O7.,3s!BqYH.WY?k񉸽z Bqw!B!b]!B!$@B!B!&.B!B|4MC4t}o\g ЅB!B,HӃD)R 6 v:Gt!B!2K$~aRX,: ЅB!BpPRRN۶R`0ig3хB!B!6aNe`YXs$@B!B!>e}vv؁iTTTp-yl&B!B|t]gN__3gy !B! ЅB!BORl,kF ch !B!b$Mӈ㩸:z{x| =B!BqE,=NpYYYgM~.w!B!B\F;{B!B!>9͚B!B1 H.B!BL͚BqKU, 5B!]!麎hR ]G\ BA@ 6@(@ @ ] @  @ @pFb7JV (yq(,yojZ}97r|59ސW* F( @ @pB*~χ,˟(* ^@(B*:J%&}jX,,ˢϽ^/@SD>gIX,ʳ>uE:tMeصw@ ptJbI$+L,n1-IH^dYNӘh4Joo/xBzm$ l6/RL^/yyy O}|%IbffqɹD[nIb>Krb!Jj]zA}STT*bآϥ$I)@ p>rE e^Ju}GeYLl6.@4E/ZJfll붤%ntq}+I,#lh$y<W2))S}N^k4[%4 Hϯ%4L}a%<@.W8(PZ`~%drEX@p8L(b h4t:n$I \ucjjj0J?0~, )@ p>TA?|0MMMhZm b1*D$ N,(ZvgΝfjUgΜNG~~>;wDF1s+R<Wh4| xX,VUʽx`6lݺ_&ڷҶo }L(퉹$IQPʵZ-ja pbν^/ph4(iZx},(,,$==`0bʳD#r_ @p@=rnʕ+1Lo>q!n7۷oh4+PRRBee%O&~z0o6j]vaZfͨjFGGy7} gvv}vYbjzzz{URLFFF>Lrr2YYYܹ7%qY݋nd2l2vmIܹsϣR(//LpXe:hdΝ444MJJ ?0/pI;9}4ssszfggiootׇljDxihhŋp}a4oΝ;,$QZZҥKP. ssss)\.PV>L<箻bjj ׫X{[ZZl6nݺ+WCsٻw/p(L&<" r}܌d)--%~zVX3gX,*Yz=K,l6SPPj'N`jj JaddHx< cF#P۷s90 w}444z[qh4n233b~bVSm*L g(7dݺu|_R__r8{,ì_<)++cΝ,_L***8{, 277(۷obPWWŋlVo8t: BI9\>/;wrY&''b޽[wy%Kpa^uVZEii)۷of,dH$oٺu+CCCRUU/LZZ~SN1;;Kss3OBNEV/2?xW)..Y'j*xikkcll"6oLnn.0˗/g>|P(DAA<x^dY&??+VvZ=իYf W$=z￟tN<ɓPWWGgg',300@qq1YYY@ |=+Ǐo>x]wE}}=SSSh4\.F}3n0vՅ`P\DeYp #77 :NHXkZb~y$''p8HNNVIӱZB?Q'@__uuuD"<Zt[$Ib8RSSIMMo.z^qONDzO/Z$''3??& y|M ~=MGy^x ;;.kjjZv222#᝱PF䐚K/C=D$!Oeer,"N{y] j5s۶mCAZZ)--%''ob3W^ARqo~`0SO=ݱlT*Ybiii a4oSVVF(Ru$󳲲p:ʑA"6D<G+ '~7 y^Μ9C~~>eee<ÓO>)@ n!G_INNj~z8nG~RRRjRZZʞ={8q7n\ ^c͚5L۾,x,cҥ|_gvvjf'x{syf:::0h4v;@@ЄK1?L&[l)uheZMFFm۶qdYf۶mLMMaZq8dffb2xWPTX,l.JXZjQT^8 dri0nyj~.]z}މD"tvv({ ًғ%%F;Z:-QV%R 7DjP&1LjBUID?KN9 ⥓P(nh4z â6'"'ޕ?شiK,`0(FQ6-h1L/#h4ʆY-H~>??d2H.wߗU/ZʁKBnn.ɟw@ )^MǥR3~3i?D/+|DEպ{ۍ!IJJ('>mo|,L'@ T%'qAp+N:3UQoH%:`0H("))vt ہ/JC`GrX,LAe˅no|al6ۭn@ &166Frr2A1$2朅V$PD* Iex>F! qìy:yN'iiit`0!++ DWWڊFVŰX,;v\|+^d'ѱXA\.V<333.R.D=pi~wDAeX,FKK GnTW'hW8׋F!//Jww7D"FFFHNN&77͋S$+4,3::藺p$ 9HB\~dYf`` 8f%Kj'ڱ^EEEv?$2 Cjj*W\s=GUU_t@ y뭷K_x*pz) P(SO=믿$77~|h4V),,OOw/*oM6Dx8~8/^[R\\jezz˅, Z-n\z=###\.222p8e?&55_曼Knn.SSSq233 F$''$lH$Pת8%/'NEyy9;v_:sss EQ$#IOO ro~SQZN'ww***z|_'D~d*o&oo~CVV`!)))$''OO_Rtt:x< VIJJ{/kƲe(++'Dѐx4D"!ICCCh4(999>|_+wǶm۰X,~^Y755şOk.eLRR?O9{,s@nj5.@ Y\pv0'O>PA444ӃhdxxO}BO~} ߏ"cٽ{7> `h4J<'Feٴi?Go5k|˗_"(++o?bVO~~>crJt:ϟݻw~z?&?hnnb IɌ駟bя~D~~uo<G9rwڵkyhii'xB~ͺu먨`Ϟ=455 --Sp8]wErr2O=B!(`<}YvSO=ŶmXtGka=H@ x_1fggwCcc#]]]ˌ_Ʉ, qݘL&k~OII ۶m__^z%"wJ(BVOEEuuu׿Ȋ+0 ߿^OEE> ̲egjj!vM^^˗/rxW=쳼TUU133w]ptvv{A4eǎ|[A@ >C$L?^Kzj_o?OQQw?Ξ=Knn5$IG@VIKK _rMB ᩧ?6l 8IDQ'w^?3qH-l W6t>n=Wf 8|0lذğ?s=?~Xz5?y/Icc#w# 6 Ұl,[<|["ffff'? 0?$D[W(. L+S_$$t:iӦXj0))k0==Mff&K.Eղ~zE1 TVVzjYr%PJI3 YJ8fɒ%t:YlUV)A~Ӊbb eBAz!vAZZjP(͛IJJR֮]d??hL%?M @bffpUWv}U CeDZ7`oh4h wO\gߟh4(;7G0韄$dAe|>HD("h@ .U$*++oj}>~_~LOOc417)L&~'99Y㌏^HIIM@ $9;UWb8->>-p.gZTgy"HǽVȡ@ /ף^FIKKcrr&Z-h4JGGv"(n:CGG)))T*(JV0͊?n2p455HNN~Z-:~Z[[ 8^/MMMA ߏdh4288H{{;E imml6+}&cZx"/^DV/:=22… fhhoogdd$Ivsarrf%ZfrrF Nq$ ͶKww7{<J=ffggijjbjj ÁF6T*6dxVFFFp:aPd.E\4\><7^W_eɒ%?==oMEE5[建8s eee77.W;vs >ȲfeaZ[[ 8(aZ1 \:rzihh󑜜4*&$?Of vJEgg'!2{\!08}}}tvv*E222BKK XVwtRRzZ-T*%H,S7S1::JKK :ł㡡ANlT @a~~^ u9,\~E}Y(˗/ѣ>ξ}RA455LVVG_TR%ݻw/EEEɓ'Fl6~ӟ tz~D8z(lEahhE,[q}WT$''@Nq'))f~ӟRTTbQvM v9 ڸpޟhZGYY?<@ZV+>|~ͥNN8QՋizzz8s W׋jUp``@iŋ p8tvv2;;n'qEg͊2AV300barrZMWW###$%%144DKK ˖-cdd(L&dYfff8$1>>쪿PAfxxa4 ===b1f3@ 阜ddd`0 t:07)))LNNӃ``0077JӌrN'~駟Fp,YkF__Νn311Aww7OR^^\g׮]>ҥKill~V^M[[yyy̐ӧYb{{!Q[[K4e튂n2|?ronhhh`ݘL&v;ǎヒNĉdggsQ:;;+عs,OOOZSRR;Caa!tttޮl 277G$_qy4 dfH$ŋ ʆ /ѣG#pq233ٻw/yyy$ Lv ǩSޣ`0[oٳraXl˖-QONNK.2())ѣ|&#(<NL~~B:;;9vr&ŋ\>155Y`1AR9r166Jbxx׫C$!aZ뮻Xv- $-[pc2W^grrR`1|_H$`{兩X٤joo'PVV֭[R\GFFF}1ᆱm455ꫯze#='V+ Fq |e˖Q__}ǣ>NȲL(bhh\nݎ`vvP(ᠢr.]J~~>jn2ǖ$IBijj"//{lQX,lVt+(BӡRh4AT*uS@ Еfxxn7yyylڴ$֬YCJJ /^|r(O__G8ҮA`ll;_SNQ]]M$!ק;66Ə~#, DQ&&& ( K,QΫ3;;+d``O?Mgg'˖-#~^|EVZ(ɌVllڴY|>˲FQ~z=*JLbdffͅ C$=̙3LMMQTTD$AVvd/_(x<Z[[A$\..\4qwH(iz^9*x>q188$Ijs(--EV+׺IOO'--B{1V+MMM~^z%:ĪUFLNNի`rrV<;X ѣGBqU_b*ݹʿ7n`0088Ԕz6l؀Nl6hiir###C٘bt:ٲe wqeeeʑ,͛D";vy须bLNN߯“$uq!8u]]]X,{1yٳ={Off&LOOSVVƅ 8qv+W*nn+V`28x "ƃ@ wqU,,D]]~łREʕ+Ybl޼*V^MAAׯWΦT*<EEEh4E.SSS477+ׂ_xN4Ȳ1z.Je\6lիcÆ Ȳ̹s|ZMEEyfXz5>, K.E0::Jqq1477p8ܹS EdJ"33ݎj%77F<˗/Gwq999,Yd իJ\lIMMe``F N+W299$;wdŊJիWf hoom۶O<`ffF (Iuuu8~aZ->*P(DAAuuui&4 >$Ibǎ3:: ҥK8%mmmve㸴*z2>>ׯ';;FF#wu(? Ba8"zhPii)IIIʿw$QTT(}ݔ(G+++c~~|bL&/^d۶mTUUK[[%%%lٲ@pcwr) I& <~QOOOc2>4Jt98YYY</JQO;z,رcLLL,7nԭ`~|+7-̵AF:t G(#HYl6GYeYT*v]xU@ \388/vLn'\ZoHXh4zݮ’$)e|r>k\K%IB׳zjdY&++33V|zu$lG觪ȲLIIjl6/rPT|k_jwmUU+goW$I"%%Y?V;n @ .$tkEs07PH$,˟HAOD  `a>Evf)!@J7RAOzUeY1==[zaϺ$I}fFq=7F  - \(@ l8| )V_ Qtl@ Q8w:NɗDww7p8ӧioogxxөD/ohh ==ZM$JNzcva9%RZJF3ꢡA\n}\υ x"fLOOl6 f9uȲfV%Q~Μ9C__vVKcc#JJ133CJJ jQΝ;G  --!4` } ї?x+jFq󌍍t:j\xQp8g~~( J(nEߢTr^rCi>}IW~ >}Fq`pp4&''qݸ\.N:(Vu' uuu͑J6P466ގVf}v%RMOO*5@ >E'*}}} D"9x 'O$ ҥKgrr_~[b6/~ vڅhܹs? f߾}[NHA`Ϟ=466}kiΜ9f;C}}=۶mcbbf&''9tW_WdddPPPѣGя~ʕ+^4 uuun~mMW^y.FeΜ9ݻټy3*vywgttqN>M j ZbAV3`49t萒fkaezzp8L{{;J$I8NZ[[addx}QFFF(,,>>̆ PշnZFӣʲX,|>&&&|466^yv;JJ@ǃJBO+9?*YزeYN?@SN~zT*X9~8* o[">466rxwQ0lp>X[=T@ GAЄ˗/gJP~JKK?=۷oȑ#],Ν;G<5k 2|;F$j|^8p݃RD"tww^S?GenJccRN?Z YjHOO/}K\.X,088Hee%zzbf~OKK p7p8<@SSJn)--exx͆n"p\;v N>7MK_F1"77p8L(b޽`0hooot_UVQSSo:^VE$Z-FVJ"SWWgxȑ#$I444oaN'o6>(LLL0::JNNjY, _Z6;pYʈbAq&`2`߾}6TV+QEVl۶ )TUU_!O022Bss9looÊ>hv__pEN>]wuG  Gj# -۶m_|QIŨeÆ [ot:fdd^{ JE `xxx$zD"f͚=<<̛o?XȲ+h044DAAWƍٽ{7n^|EE]?st:oRw.Y_z%V\IEE,sA|>w@t/sT*eee<_aM?TWWSRRƒ> }Qh\nF#. CSS 8{,X,-W$Iٳ/} ۍcffJ<^Y(`x-HOO'--R #G멨r155(u4Ν# F`˖-?~FòeˈD" rssYvM E'a)/`gee-ڸj.ecSV+ꫯr/Rv;TTTPQQAAARv²xD,@ [χ*賳,]$֯_OJJ B!*++e*cllbj5CCCLLL088ӧxR}9>/2<<(%3<Ù3g()) `xxA{f3H$,D"FFFgbb^1~r$233fCe:;; n ۼK,]Kyy96NZ-IIIZ\ ^gYQT]!Ib1rssiooԩS\.$IRDQZ-sss P^^Nrr2{キɓ<ӔDwJᰲ)QQQfvSQQѣG9tP[[ŋH$ٳg!}eNǚ5kWV"(//ĉ+&%%dRSSٸq#555=zk P5 tvvxn~ njkk T*nAzzz_yCEE>rZ[[ywX,h4D"N'PH)9FFFR6l6ݻӧOS^^~F  χAbzzٌbJrr&(..&''@UU˗/S^^Ί+())aڵfxE}Y쑑V+sssddd\>SRR0X, :`0H~~>D"t:byOHLJb6x<(}>sN$I… l6j5n, n4z@ hdfϧ^JJJ[c6b$))|222XlIٹs'dggJ0d2Q]]͒%Kh4ϳuVBSSSdddk3蓓T*(* }}}q[e픕177V@eZ[[ p:l߾I]]ׯgɒ%\xmFQQt:# E4{怒X,F^^322Brr@Ogi,̤Š+$ C=`ra2x<)6N'լX+VPVVX%I뮻nI\ @ +s]r\$1==M06^Ad\KD0Ixou?67+-σ>66v߉,) 22I$Z}떓SO(c种 %wi\?KyEe:V [@ C\Sa`Gk ]%u?TJ{n}H; 9y|֐aW.=tw}~-Crz'8:q-V ~p, :dXb_B9#>ϧ@ ߐe;΃ F/{g~◕P1aQ9vv$I|&_uk'k/.磮Yw*5*TDkj>h~?lAQ]JկQkɱOoS+1 zHZRG?ZB%VBB\\En6˟@ \?׹`]ܤ\Vde>WzU9ꭼ?>19Ɔ &BCH1,mCcatj1oj"mSmWTUiY¹s**)t2qƚ5L&io*sf&F<#TVP(NFu9hoDFfcF=ӝtvQQM938sQRg)җG83t<595Fjk1Ҫȱ?OT\*S+qܜ=O0Q@UZ#(J.<Wӝȗ|cwQh/$Ŕ™3Wn,\/΢e8Ȑiˤ:P,x^2OEXTS*q9Nh5YkX1/\d˗}O=L=ze.w͑# ɶpS(ѦpZ#ݼH,r;E)E^K-/]r$ryyBЇ+r ˽L:39f.5/eC6JSJLa.ݒΊDQ}p,̦M$rQ7Zǒ%;8l@ UlzwɦME;ؔts:_$yT/W~ƀZ扥OŢ n?L8r@WVm۸N |m׮,ti!ѶUЫTVQI*;d\M:+fiRe`+/(pP`/`gNw=|a]:ҫPI*RL)8 nHxT$e Ȓ%fgCNJ̕Y|'9I9|kxt飤S)ppW]8 PI*3#mhUZtji4L:UiU|ꫤRx ް$Ы|ˬ^)@9-Nrjzͥ\-RK?ewsnq6m \ʗ)sqfVѲ`gG΢Ui-ed`yrNy v\~׵Yd׵eUj9sǖ>$I WbŽ>rmxJKO`+e_IbXQĞ= ƀGymf3%5s;J<'˚`iR!7ݳtNuRY]oPK6ĦMrxeF'FQYlBd y޾66rW]ȲVe=/ L%H,opa;w[e2ddFݟ_=Ő]gC(RU 5`\ )I)F=tv4:ktK:qq"Q(h.Z&[hlm OȃMoDQƽ: ѩuˈ{4K .]Щ[&@9bc%\y PEK.Kqĕ$y33f秗*ƉGh OTN,CH4_ -9((jIuGH ֨mNٓM<Gʨ B9@ rpڜW5Zm&E7~OJJ'*gzzxּ:ӘL&L&ӭn HMMN%e1222PXMG|>@@ DV@D"BЭn6" F?x<@ &pEwO4%-->8Nt8y$$''Dؿ?ttthd||cǎF! qAŪR__O0$;;w݃ǙngΟ?O<gxxwyx<%"2?pA9BGGpȑ#gϲo>ͅ Dڮ]xw՟h^`˖-Fy7h4{DQ?cΟ?Fa͚5⋌_.fc*++)//; PTP]]w߭lqF"LOOsE, Ԅ" FoeTe>O<B!N'$1224,*xTAFFF0c2غu+"It:v܉V%  ذa999~08qZv;z穫+v?,Ϝ?4^W|N! qE۩gjjm۶B  3<<9s ~277G<piGCNNx^q\?hZ\. *l2 h4LNNNV\yEj5* JFY㔖r4* Z$I),,De sssrJvjk{OSRSS.)A9'fŊ߿~Jy79rnfqbp8{pzzzhhhQe(RSSCSSx>Η%Kee%޽Jzzn@ &AlN'1rssKOee%)))t:)//j)//f3 ~N'8HP\\l&33c[4 xlbjfgg)--fp8vT*YYYLOOcIII!++K.jVerrߏlF+it K.e֭PXV0ddd 2zPTl6,YBFF>{ bڵK/o^Ozz:8Nq8dffRPP@nn.pڵu(**RnܸNG Pʽ, @b2&559nʊ+(..fffr6nHqq1jnj5Әfx%.B"HJRx\ShٔjzJ̀qrrrغu+flBqq1ӄavرȃCQZZSl6}vJKKjEqq1@@ (2$LVVyyyFZ-֭T|>7njzP;@ӑr7sn5 %6Ul6;w$tRZd qvڵȫA @zI.K1OK4`JĵAw\̰b [=,JJJnZ`0xE˅^d2]w95$Ibvv-˲ m6?3g\%I"(9$%%}hں,LOOrj5z1|J^g8h0L]IB ^@ "#IפkVP"l|(" > K_pw*ou󯹟TN>pMOY |*xH$r{ 7bv%/p@ HD8f+YY|Z..e.7U8rh4JJJHS9@ @ |hT D(O@0Tܿ/vc죈FWxOgg'iiizN:űcLjD"8{=N8lH޽{$33@[[g~~\$IR/>[o1??]]]L _'--SzX,}|xx^{˗d.Guu\./Xr'romme~~y^.2(ʅ opp}ѡX_uΞ=&77z:ԔA @ɹ(\.9B$={OJJ b͚5fdYfرZͯ~+~mvڅhȑ#? O?Mnn.J }hoofq)֮]|Yppf3iii455qmnZ͛oɚ5kw%==]o>yVZlٲ,~ӧill$++Z^ylѣG B377 JD9N}7ñcB6'hmmt2>>xF#$kqYINNsD"b1t:v---F?ŋIKKC$N<Ʌ jxXf p)dĉ444`ZٶmEgә b2ظq#x>\\.fcǎ뙟'))b!99d؛7o~W_'mmmLNNb0?^z=""""""""4)ЧiooI VBK/D||<===( rssQ.qqqHRR)/2۶miQQ&rR)޽FΜ9C~~ iD"'?@ 444OWWCCCT*e~~Goo/===7 H$r!͛?p8p:5ڵkI(!_󱼼ٳg)++Cb,bccIIIAp (..~2LLeS m6@ղFgg'{%&&dJKK?EUUoZ1J%2 #%fffطo* ՊVW^a׮]UX/SRRܼy~a ;Fgg'PL&L&ctt/QcZIHHTJ\\8222x"8N jytdeeQRRB^^ 477lLMMQWW'D"rrr(((@SRR%'T*FV+tvvT*9~i HÇ[6B5o4 qA 6RJJJhhhL&MMMt:N'gϞ6:}j5:V+xܺu_t:ưPYY`@VSUU˗y3YBDDDDDDDp~ݎ磰D"c6BVSTTJbii Ojjp`08Acccdeel- vSRR^v;VKkk+hhkkHBB===B! ;wdrrIR)䤐TJaa! QTܹÁN,fB$ <`mm mv#)**D"!33&&&0 x\ZZ&lv|||֐J{^ fggG?dffv@*b0HOOghhM!AYYY["Zf-!!QFFFH$$''SXXsss dee =__PP\.gllirssṰ YcnnBAjj*n[p;`v\ddd|vF"BvYYY!--p8 KKKGRTTD(bdzY__'==F#R^B۷o2RRRjIKKcaaLFSPPJw8333pvv^B@IJJ32kCCCH$rss|Ann. p8u677'33dan !JILL$++n~?300"V&"""""""Ԕg탬T*1[B?R|QuУYE'Ip8r {rȑ}Gɣi$_7ikk#y70OuEDDDDDDD=>@% ݸD"$/}UH$t4~t?o;^/~ QDauϿl"\f$33S(uMG_5|V%gD~?Dp6`ss@  @``}V[}}y"'! E" ~k)akƧB<"""""""""H$K} H$Rܒ, y-_G"OL˞@ا⾹lZ|:.rzg :F|z\}ό`0~ |>P񓰹| q8%Y__JlE?Dc% Ξ=B ))u_% qE>t:)++dollpYbbbz\?IDATp&>|HNN*Jpjn***hmm%>>S%x<( J% ԰Hjj*vϳDNNTTT,kiiի$$$`2;wDn7mmmB!q|>RRRgkk+.]ՊR봴G$ZN'6>***fȹshjjm۶Gyy9NS(mGPDkY|\]]dlyիF֭[ܺuKHuuhjj"&&H$BYY$%%j蠢5ӅxjFōu&''%77vnb@a.`F#@׹}6qqq~8a766%55ku" j,,,p5Z[[҇[J}p8Lss3:Noi Bݻ|봷P(~M;dee=s^N"""""""Np8Dd}@ؠ@ @II W\ayy4_΁X,r8~8'N^{ F͛79}4yyya6ܻwW^yBEWTT055b߿>*THIIƍh4^xE0DsEۇ臨".~:.\`׮]lllPWW/Lff&2 Ebb"ϟX***BB-9x *URRR(++#11\N\\βgp8 PTTįkJKK#..D2۷olnnKMM `0gxxP(ݻw">>n~_N^'n뙛Çf.]K/ŋٱc6 LMM ;wX677h4o}vRRRX, NܹCww7re:Dcc#`/FVVVy&cccT*Z[[immEV366dbaai, Crr28~ sDhߏRqqqa, MMMܽ{\VAlb. wy@ Çjq 0==MJJ ܽ{Q~mքz###TWW ksRSS#S(X__'--1jkkqBuD{{;SSS?E`P*SSSCgg'*Qqqq eN:E||<111ܺuZ-n399IJJ *iȗgz322(((,d>F#HCFFkkkݻLCC)))`ns!T*YYYv'ZFFF(--套^n&WZDATb4e( "VCa00LT* &L&bbbݻt:>^tMYY333lnnrԩ*//{P(0B;wh4L&[ %%<<Pü.FGGi D"aaa˗/ "1 ISSCCCu댌p--//S__O8!ԋd2333ܿ jʕ+vxKKK mmmܽ{ٳgd߿S#_GYXXH$Bll,dgg#ɰltttD[[===Ҷmۈ߀9y$6tqεkHIIݻ,,,g9s qqqTVV266?'Z[[Z$&& hii!55F۷ikkwޡVVVs& rrrz*رJfqp|XekT*֭[zJ%>v{9~:+++C\<|@ *߿T(|>!-\.|"{CQRR"6 τB!AERR_k;w/_?p8L$oؾ};¹Ͷ>??ϙ3g7AVV>ϓcf~~ݻw#J BB!677ۍZ58@^^ d2c߾}DȠNgg'LNNVIHHb022ʊie8 v@crrH$¾},//={j|grr`4Q(猏355eh8pB:tMgg У%YZZB'FZtT*L&iiih4Ǟx?3{oo/Shmmerr<J̐ BEII &IS/2b7$ aZIJJ>EP\\Lff&fY+++³,l:jZȠ'66 666dyyxJ%ܿ<#55UXcmFQQ LMMɵkx嗩G(Bbb"333}vX,߿| """""""""}bb{q}FGGH$ӃN#;;^?' z7xc00 rIIIX}q]N8Aaa`14a~*333Q[[Koo/mmm & 2<<륳N{;wjj/rU222YYYajj5ܹC?mmm={. ܺun߾W&''Y\\dqqӧOs5BKsLL 6 [o;wnDB@" ɐ&Gtc6.\ 2L8&j!ONNF.p:rAz=&;vOeccc3?D"ynRW_}UL3|Q뛈op8lF.D?Dt$  iƇDO[܈|~uD! bXwAPʕ+477c2D"9s۷oHVVz!Ξ=ˎ;~Ʉ^ڵkܺu MZZ@ @ @ղΥKhjj"..SY< Rɭ[~:dddɓ''??ehhh@"Dcc#.\b`6$''[oEkk+P8***y&.4y]Ξ=Kww7( \BCC۶m#p L'OΝ;tuuQTTDgg'.]buuU(m? ZIvݻGFFעdVtt:x"]]]$$$jƍlllիWquuuL& /^Ç$%%iiiիD"accF ԕ+Wp\ iiiaccKI^=pq:ܾ}ĄPIB!1Ln"M   jwNe8u2LȚiy!v}KQ(ID"RonnI K.v)((ÇFW^yP({GSS*j(((Q]]kƅ (..`0lW^n78p'Pu:P[[RJ=|^xχB ..ϳ~$ X,233 \vׯk.n7"dddp9 *"G磦V|PVVjEדJ?SSS8pt\.ccc;pQn߾d"99YhT*Vz{{q8ܺu VL&b2vc4fppPa>ݡPJF#ܻwd*++z6xEEܸqlD".]d"'';vpeJ:uꩻ7ggg}v ɂFCll, n# !JD"8x̡y]FQQp8h瞣Z8ߗ"uuu,=1[[YYH$Bkk+dddo>$ w%#JCVCFF׮]cuu K0{Ɏ;x"cccܺu<zsJ__7n`hh!zzz(,,tuuqmaEE".^H0lllp蠵;wV}6)))~+L&oׯcZIIIa׮]$&&r(//'11$:jkk@ ̭ɑ#GHHH6BSRR(//'<Q^{ ^/j<>ciifff,333K[ww7JǏcTTn<P 쳰ĩS8z薺 ߿ /6GQ{{{;VHKK kkk Q^^?x!CѣGLqq1wޯwyo̙3qQܹ\N0$ z{lؽ{7Q\\,XR)KKKdffR\\Lll,H4󙙙 ̌0066iPHO˗|;attD+B8fqqxuw޽jﳲBoo/fZͶm?3fgg2Z;w o><S4+9]"GFF+++呝MBBRp8L xl)**" ~dȳG hnnܟ}Koo/&LF#gFQQ$$$_~$, VTJoo/ 1>ijjwe׮]|ꆅa&''buu*innс㡭v뙛?!G!11$'O?ccuuzw蠸`0HUUܼyoIFFF̙3TWWt:w޾};T/~Ғ H$J%R\B~'ɐܹ6Μ9*rZD"n !* шݻVRԳWVVr)<f ===d2t: 8 R7MJKKh4L-.HTZ-W\ahhHS^+ CvJR!w߾}pYHII{=6qqq3>>Fd2QSS * LB@&!8y$LMM1<<2F f7oB ~_'ZO}|dpX3L&xД155%(J9wR[o4EEEBGD>|4/Pv#T*< ));w099 phXYY!99M҈G&'z*rrrÇBQTȋ9 DDDDDDDD>nQ(,,dyyi"6 (fff"Y[[E B,-- \F^gffNRRVe LNNz~,Gah4hZ RdxxX(o2bCY\\dyyDBff&& ez=Pqd2H$FGGrrrr@Vzh4FCZZ333x<R)8Nv;H$YZZBN)a#nVFaii ٌF*hp8j :nG?>łgjjJ'NHH`vvVx1rTbI=n癟'GFF,//Hbb<11DL&RSS+"Bf3J2Jx|>ZZĄ;F#ԢI"$%%q\Dammtr9333(J ZV+JVWWq:(J|LOOcلX~'xx<N'R^/. Zj333bA"F1  O. Պ"VjG0drrۍfl63;;`  }LL ,,,KKKQmgaa:Nߏl Qy gMD't:r ~cB zWEݡP艱O7@" ɾұ||5O>u^/O-y$I]% /R7flΧ/uފ|}jO[Cӌ׎:~vGE3~uOsWW=oEDDDDDDDD>&`1DP()1!^7<.7hf/{~z^FSuqx<Ĉ/d}accӉJ}q<\.~_-!(|T60BFrrr>s/999y/.fggqt:V' Bv1)Sdss˅Fy,1j nBWW/夥ill|Opyj5;wvL&cp)n޼IMMÇ455p5nݺE{{;EEEJtVUU177Gnn~޽{?9ŋܹsXN'gΜ!>> B[h3 }"񾺺*c6Tٳg ++󎎎RWWG[[:u $׮]}9_ ynng"{7Q(԰m6;\xN1 466rVVVHMMҥK| ώB.QT[ dʎ@' R\\ŋ ܹ/rmۆ`W_}ӧiooW_ERQUUō7ؾ};sss<|o}[:u" DXZZbpp^xSu£Buss;vPWW\.';;Çy F9wGVs=, ^J}}=v·-:;w|eƍHR;FZZsP[[(,,իX,exx {9x};wr ikkMCNGMM 7or^|`ZijjbrrARRR|2ft***ܤ0004CCC Herraz='N`Ϟ=w###=G@DDDDDt hXOHZZBx`6e޽FnݺE^^<|c1 IdzziH$hzl6SXX:)))t:233GRsN"l6jkkz*j;vdh x"mmmT*tD"T*H$4 VLV+  qqq/T*PH(l6VVV7n0::n}vXXX={Lvv6J˗/϶m(--ˬh8}4p˛͟t*I||9h(((\$ V<˙]سg.-Y[[#P\\L^^SSSJl6366ѣGIKK#//^|0d޽d2D"Lww77l?1 n0 #znB666(,,D*RYYIVVɸngvviY__b(V c}װZtvvFacc^>nbddNZ[[b||6پ};{h["zggg9s Ǐ'??_8oܑHz?DH01̿]vܼ{ҥK6 {G^^G`||Ν;ϓ(@aa!撟O0$ !Jq8KLL HFff&<2 ^gaaA(ϧ x d|{# oYYYhX[[r ;YY]]}bYMF_̿L">|::::8x 7n`||Ç{{RVVx<,..b۱ZXVt:xPĠhgmm B!n۶MLT%99:yǎ޽O44 `p8L0رc|>\.a innСCd2t:08NJJJX\\aᛗGrr2. Hvv6BT^^R!YZZ6` ~_ t?~V1 Ƣj1LlnnxkwtSmuu[n1;;+<^)jq8lllGET|llljxݱ1%%%(Jt:^DNNtwws},,,`ZIOOd2p8%55UHꙝMff&o}[hZz{{ZL&z=@vv5r8uiiiK(J?֘VI"""""""4@ `׮] x L&$$$&s'--BN'`P쬯r8v]waaj>|H}}=/§~?eyy ]vM>ӟ޽/Lww7,--ٟt:Y[[#33IX[[,w>&vY]]E^|E PYYɫIll,/ɞ={蠸 xvuu!HNNWVL&CTT*Jh4 J"Nb0qqqa2psQU<##㩋J.^K/Dss36 RISSJdikkcuuRRSSB*rfgg^җ>k׮s¾}#99ÁJve`ۅD\~Bz-rrrHHHDB0"8v. NGRR/HPT$%%D{{;###ax??R믿.Ygg'%%%z{AK ss!]F{{;?> pXv4lbB$H Aj5p8H$`03kZBHR!4~_$y<T*>O NNNQ*Bvq8;bauuZ-rdl6Z-v]Ȭb4|s\(JBJy!?я‹dbyyM~n7 [*<p}2pDJJ ˬ/l(ϣj[ ,[XXl6#˱ hvRHRED')) ܜ0nw~wعs'lll`XP(}L&cnnH$BRR (5f v^fVRRR? 299&*T^J^;w d9|1??a ìc2X]]ecc\Nrr28BXVZVFCcc#۲(""""""155%Y (Jf#G G!*П5Q@8N'llls}LOGIT?:$&&>(lI8 affDBFF/SMt'> tg/Dt:zeu%BLg=OjI#Hp:'mw4i'{4|5O>uzBTQ$B !J"_o&FQ3gDrS b#R՘"fwYR)2k&$ k0J7Ziͣp8,ӎd2a{rUM\yIw]n&|v럪`0TT*UC}R>t B:?qn_] G"Bp\}vGI|(z3ɦ~=i,44E b~@2== $~zO'Y>n]{9>nMc>j[~=~o`a}҇M,q|XD711AOOtttYǭ;FDDDDDD!$ `0bd2222ԩSܹsNT*ĉܼy* 0ttt_}.bbb0L\|r^/YYYH$@?11/~ &&&r9ǃB@PPQQAYYCCCdee311AQQ 9sZ~?ܼy_W$&& ْooikk# a6pUUU,---Xykjj8q$''#9}4ׯ_H$BYYLNNŃ8wl6͛7innj{=rrrLXXX`yy'=hn"//kQK7:Ot:]]]>}f3:sQSS"ܾ}K.Kzz:kkk455aZ B={z|>BhIzK.>2D$T'JNNb}jd2 \zjfffzl`yy'I8ٳ,..RPPZj.^غ kgyy9W\APx(++#.. jkk`sÇܾ}={|gyw"==Lƕ+W"M||>G/zfmT*ٳܽ{6p8ܿbcc9wCCCB&&F#CCCWh4P(F|?*Clllp}, n)++###Wo} X,RRRȑ#t:VWWرc@7,--qYڐ崶4SYYcb26߽{vL&TVVbZ \|v, }}}f ֲ`ttF Bv9uz\BSS* iBr~mٳgܹsQ82L(|(vF>LNNTVVm6***GCBnڵk8N ϟݻB>RRRBpyzzz%667|QV+BH$»KZZ ܽ{JCC*:w~w|2K.r9l߾ZMgg',,,p1.]Dff&O>mmmC^^z{~R)ͼ a]ƍ7|?x"""""|.[z###Bn__{Es vAjj*plL&W^y#&&Ǯk4IKK\H"G( ==FCZZk2fnn,z||܌`H$j%''۷os9J%.\ RIff&H$"vh4*BG&_DPB!Z[[ٶm>QJKKcbbnݺ\.gܻw%8r(++bPRRÇ|2>ٳg sJJ %mFBB@~VKbb"Vg2==Mbb"sssS\\P+V cRRR^/ $&&>&IIIsMZdffR__Ozz:理{\L&ҥK 9r*J8Ν;477۷zc233$11RyY\\bp<֯3_PPY\\djjW_}@ 9877G^^B ݿwL&\.f<  QPP@~~>βcAir9dgg366*l߾.X \.t:333$%%=2_QD"<|BٿeyyDAA,--aXajvJ%PZZJvv6z~CLL q}:::8<۶m7s= / $7AWWl6vAmm-|> (((`nnn\Çٱc6n q]{nP*ݻ˗/322"ln<|Agg'r1<jA4 ۷o'++1(**bǎ,..2>>NNNHRP*8C8&633S_TJzz:\rc DDDDDD5>UW^yLHLLDt:СC,..Hww7mmmܿ۷ܿVxdn={o~c;`:wMMM}}}8Nڨ0L|>{ݻB=RVV?G$VVV8qLMM >|lllpyNppp8HMM%==VKFF׋RDբT*)**BPN"  :dff@jj  * N . D®]!_* V'!!4eǎ[^gmm M$`0p8X, n:a666ow8HRp:rݬRd}}5j5P*011~lj H`0H <~j5d t::&XMQKtcc#%%%jJF__SYYkkkv<fl$,2Xa}yx"n|;ڊf#55`0ȏ~#v;v\hkktrv̓ۿ[~sssTVV͛79vاv ü曬0LF\BOOuuuXVz-v͛7yϓ__rܤinݺdϞ=lnn8y 11NOOW^yEp!ZYoܽ{VKUUMMMH$L&裏ݻwܼy%.5 ?NT*їb\P/&&D"$]2 L&f3~7np1X__g{۷oFNGff&ܾ}ɾ}ɡD‹/ x<x&D_v#G%99ÁRd߾}_j;tL^^f۷o*XPNfVx z{{q\BqQl6J};wRZZ /XYY!;;;vY]]ETQT XVoBAVV.]rJ,//o~Z-ԡ!# Q(ˑ#G8{,ɼ _,f$G__J88|0p~hZΜ9oMqq1fYPtwws=/x޽{?'??R]]̓عs';wK.!D"AբhHOORǎ#66LƋ/HUU/`+jkk7Ç_ɾ}hҥK|boRRRBII ===11\zW_}ͅ 0jgzNDDDDDIH^U"`|*HXZ-( , RC8,8v\uguuZMBB`u8$$$>C||<>E"ZVHI킥`aaAVMB`Y7 lnnbۉC Y\\DV xN b jt ,-- spxs!JY[[o lnnF-+n7~xj |>`0&FQ3ǃnl6hKF*T*6}>u666PT&PB$(&&ښqb4Jwa j"x<ºRf|:XVVV8{<z [ZZh4 0)3λ|s:$$$VPHX,H$nՊBc aT*=!tVwbb;w;vC+KR$( MQE͓#j5ZؑH5bbb %Q~0#1p|k:ѼODDDDDDDDD鰼BT1D`_p&ƥ}FU*WzOD"_6;*?<$׉&8S(O?#rZ- p[|o$g2=\GE置}&]ܽ^'vqM&j97aiGcv2>/gm]yQ*OuGG"!whٗߣ>迣u677١PckhG˂}|>CО>e1 n9&@@8*333>吾}gddcI3\y^5 [Cgg秞_"""""""_-A"x<'? 2,fffxwihh@VP(xw۷ ~ӟr!Z[[y7d2V9q׮]cBt%Nղkn߾NT  eee\zY^^vb~~SNQ[[&++|MZoo̹s稬dvv<8q>RRRO(&@ @0<\}}@l?)}ssӧOFy NYYYߦ`0ZwbZ[[x"9}4T*RRRիW9|0v'N؈^G&[oQ[[˵kعs' \x{B… TWW3<#q~nr%$$T*?zXVt:P(Duu5/_ a=/MLLԩS099I^^<ɓЧњӜ8q{r8q h48y$/^^Ooo/aΝ~-U4 [vt󡩩Yn߾twwHuu57of0}}}TTT033R?9 ܹCuu5dff؈V%>>ֆgyyu>Luu5ׯȕ+W]星۷#H^@",ǏsAN>͡C;wB`pp?%ADDDDDDtq7L[ff||\޽{h4ܸq;wL8&//d***@P򑱽呗$ DAR$HJJ a4ZL&Ů̶m$%%Q\\Lss3'OD&VUŋGP`B ==EZ-BY%=z\NRR҇ƲF7 JKKd /ܺu ȋ/Hww7v^yؾ};Fr)--^ʕ+AL&ϟꮒV^4;w$>>/K4 (JIJJ"++ ㌎2<<p8KRhmm~0Ojji\p;w|q)L&H+WpسgcntvvEff&`z>wE"000Jbǎ|[ߢ͟ɟK0$##_|7o>WFFF믿### 0caa^vAii)P]]M `ǎI~~>vQ*x$//zzz8wjj5۷O=>004tvvիi377(###j5߿/ TJKK9w/^ܲޯ1>>8cccB=E9cuu믿N %%bxx޽{ihh^9bhhβL__۶mcl6JJJ{.b033͛7پ};  uSSSzx^IIIa``sΑb! oT*YYYdee1??ld2111]Xl6 |7{<٧B),,dff a<ܻwrrr?^x>|^z=KKK >sAΟ?Ϸm222{0~ V=w}FFFˆшSRRŸ韲{nا\~??b;þ}ػw/eǎH$l&##DHIIR)^ㅾMLL$!!Nzva@P`0p?>'kkk8qJ:h4r  Ab(R'hzfg\[[0gU*}={seaDٟ>> W^l63>>Nzz:ꫯbu ۍN#11QxFn<NSϲ_I 駟˜;w+vEU*̛7ٌfjbIHH^F5f3wfϞ=̛7!j5jV"**(z=,|7t:INN&99Y\.J%nVKLL & Dzz:ccckv_n7o>_SO=~?.c00L^'::[n/ aQ*$''Çe͚5DGGP( 66_~&cƍ\x0l6on6q '''~-[-A)fl6ˆCD&***JQ466oŦM jBAbb"F48 IHLL$SOk.zzzjF,Y™3g'??^/B$$~zzz⩧bttʕ+gӸ\.fff|Gx Yl9rD̟?_|#h˗STT$bf3;wpB:###1 V%**"oKwwR萴OLL III۷۷|r`0pqJJJؽ{7wAףYhNRXXHSSh4R\\FR N8+8}4= V)_}Uz={#GGGLNNt:{SFFFFFkbjjJ,+ q\a۱ZA"""tLNNV=`N'N q8bwbffV+v%&&&T*QT8A, ^G2EIQ>ٌZ.KbFtt46 DbnXX@iJ%f`04^BALL ^Jj{thM&Vx<8bG^V)n05 "͚@Ӊ2j\.jZݺu^ V^jzK/Án'..͆f#voF|>n[.i VUýh4 . .t ^/jߏB@RvELA0dhhD|>s1>55'** ׋^q,*Jɨ(4 b,8PZݎFFӉF`0͸nV+&IJ)dC߰8Nbccq\T*1 NVKKK ???%66VRsF`0zzX,z=b`0(xOvl2KRFFFFFF櫣WbhPqjB oaZ9s 5k|C PIj R0]V6bB O#"-[ĽU ~***fK1'&&&--^'6Md~Zh4\oR)IAɧ133h|b鈤8[iwD{:OZۀ~f/ y.######e!eВI}G0DV?h=VP F)V`0| /B8z+ ~Eg`0'8NF GPT*Q*_鸕P(y=E?/ҎŃ< vNMC~+-͟Tٽ~aaaxG:o@= @ x<3 E@ pȒ'$A<Υq\<:Ip/F7.ָnGjuKkzYfQj/7~ÁzP? cccܽ{:zJ}!I`5+H$l6mmmlk}\v( rssfΝTTTV|\pC`L&dݺuTUUo&?Ο?b!//OK]]]W]Hz8tǎlկ~E[[˖-c``]vq̙3˿ III$%%~ƭ[:={8}4Te1|mmmRx9x ˖-# rN8AKK ֲ~jjjHJJbzz;wrY|9'O7$//O([e( |>*IV+~ B\JFJcǎQXX(ՕƉh>+Ww}/M^^'O? x뭷l6T*ٳgLNNBfaO &REI_@7*1<ȼyuz _G^/>'"%%@ܫ@?+ZZZLNNi:#9p S8)C蘲X,ܹ OJJ@)V+7od`` wԩSs1N'⺡uIRI[9$2:t'O{nZ-999qzzz4ׅOp]>"ToBoAee%r)=44Dxx8\zX|Mui***tܽ{>ɄСC\zNGbbcFaٲen]Frr2UUU?ɓ̛73gK/E SO555l޼Z1###__ꢭ${=lLNNzٹs'--- zy7 ⾓yrx^~?aaa;\~ā}6>+Wpyn7?~'O2==Fa``Qǭ[&))I,R]x4f ҥK۷jƍq;Fkk+|Gz"))3g/D].'227PYY~!}}}x^&''9t322;wHMM_ljjAxehh`0ȱcǨFVݻr ć~ȕ+WhkkcĠP(c444PVV&E}}="U܁hhh ..*>cN'T*\.KAaa!qqq=z׋d׮]\rE'::={PUUB ""se*%wޥt1ܹVhjjbTUU1<<<+̓H__MMM`QT\vR4 OfҥbΞ=ˡC &&ׯhѢƺzbcc.B %%!+vÉbL&111DDDߔG^^~dVXASS. dZZZHNN&99Y$=ٳgQ$$$1ZMrr2]]]-$ QRR۱jjjbT*>15ڵk gӳNIDATzz[rUŋ$$$}v:;;bhh{ 1L?~$JKKٴiG! ull,*;w|rbbbp:+zbccy{.CNNv@ V󑟟yX,LLL/399I]]we͚5dgg8>W_}Z-˖-^x"eGg֭͆ X`s1nݺECCSO=jݻ a0رc555011~FGG"h4OsUv!\SSSYhotuuQZZJii)E@|rr˗/sioo0>>΋/HXXyyy|8~8@HMMeʕl߾BnJUUv^x.\f#11T*)**d2q)Z|G Ν;z '''$??-[`}ԩStww͛ҥKDGGSXXH `0`2y&%%%BjNNN&9rDdLv[[[OOOvjkkbjj>{9xyy~C]FFFFFF phSO=EII ddd8waʕqujjjIZZw(++ ޽{l|;DQ?7orA^~e6N/~/\&%oK}}=ׯ_ʕ+bW_fǎbX8<>XVN'|{c…ΪԦ՜9s^{xwYz5/#rKPAHII!..{&s5tb ..̵k׸z*~)T=z8L8lذVt:磾OLTT $$$ꫯs 233jr%TPV@Z')) ,Bd^Yll,qqqs9<%:Zp[V$%%tCt]KVN\\$%%a4ȑ#LLLv&""5P(yyy8qM6Q__Z痲f搲Ln(--%22Yj'湤$ ׋dbՉjrr˅hd2=0GEEVWTvEy/_.> 0<<̑#Gz]B!vmr`f8Bvs֮]Kuu5+V$''355V+B`tt7x0.]ؘ0fe%IcM(p 8wZYx0$99<:::o~Caa!`2vDLL /zܧjB 66HL&.wB`ѢEQ^^Nll,YYYb>蠰( nHtt4999>|$^~e_!++&''ٸq#p;KT~ Vxx8رgϊn8kZt)ǎc޽- $&&~:|>aj?sN,Z|ZnJjj*fϲe8q]]]i&l6h& |r1 b6LbquϞ=z|PLMM-B8."\.NSh4XV']wfJ#⣍F#>ݎGVRpp8byC_>qzYΥHaaahZsRjf#v2l6 vc!$vVh$ bX vxx8NSaxx,r^` Έjnᄅ7FIRzؑƍq]/BF!`Q(hT^# Ǎn'Ƨ.&aZ.#K  '`ZEHDGGcYjW-$[0dhhdnݺɓ'я~Dxx8ZVqB-}'K.2Oݎ$66VI^Q,\HsfϡejZI7odtt+WB\LRNCTzj8)tK1Ҏ4&'',ps)J|>8t.JXX:͆E}+!RyU*8 vgR|%n[|~ iZ^&bl6>O<>#vV)="##E_l68tJ4t:ٽ{7?Ot:q-χV TWW3|m +tbXh43R$@"&B Ofq\.eeeB@U"O2dÒ%KdCJe|2,YFCSS0~ׯ_?KGpu/22 6<Н^effVJKK?ՃWڵke  _>11cu\=ؕ q&v?K]urbg=X/2N>ufff0'2$o i;4E7 i~P$LK;E)Aoʿ-sDrK}$i[>~>i2k%W? tߏN{@*ߖz+ N'J riHr#Ha"&k,/7o=P$NR=vF)5KO">I"y [R:) =Iw [7o222222222jOQzE*0z=G?6<\vg:ܹ*{n.^Ⱦ}Xx1&r~_SOQYY[oEWWfŹt=== q)_WrG9u׮]#;;qJKK磏>Q9s IJJ"99N<~FGGp/ў={8wmmm C޽.RRRPռ۷+V 9pgΜƍR[[ˡCr vvŹs8<KhZ=R$..N6ھ^/>CxYf W^[nsu, ؆H---ٳK.v:td7g.R.^?5УpBOrr2[lcӦM]Doo/۷ogddǏ3>>͛immejjz<ÉdddWa.F2Х殮.֭[H 8֮]KUUjŋjinnfڵh4 g\L:::c޼yv=J?-ƍY`FLVXCFsee%6l ;;FCJJ լ\HRRRXz5N">>"͛7j*˻vZRRR~:$%%ͪBwrY^/`>F#TTTo~9s˗/V"FTTnCq5jXx+Vz#55Wkq9p/"===TWWxb 9u7o&22~ٴijkcGFFûKKK jsΑN{{;W\֭[355E^^0 .]\~.^W^tߏ1+̗C^__Ouu51118X,`N<Ɇ ؋b`())t\;wh4T^Z%Kř3g_Bӿu#22222222c?ԟ`0!>Eee%URT*'Oa/Z ߏRWVm" R\\J"**J0Hjjjċdy9SO=EGGo&`8IKKlŊr)N>N[[UUUTWWS]]MBB۶mcٲetwwc1l߾AFGGz/x\WWÇyWNt^)?j+6n466RQQ+WPinn&&&zzz0 ~xgux0==b`Z:Aٱcuuu>}5kpYXl{hdΝLNN:VKbj"-ȢE8u~B>388bu92owޥ6:::liybccٲe & 6l@TT###O)dddddddddPׯGBBrV+/vժU (,,}v)A>#gժUŠo>PՏ)zT*~266|>>޽^R&;;J";;gy~?W5kHHH7388Hzz: |>9pV+/bccټy3n76m"//sv؁ߧ RRRRfa0|"h055EJJWRWŽ RTTӧeʕ={AYdp1 zp8s5v؁ZbRHIIh4p)DC#}hhʕ+~IHH`ŊVŢ͛7<%0Xx1K,aʼnE>c&&&Xl~99edddddddd>bjjJlQK].EEEx^<`FZtJ&͍eD|>.Kh!h%=p+vYGc4q\B1YRv:( T*aaan~PO҂ :N|>T*(B*9z=@@qn-T1\P{i'\jIMJ'Im%)KǨT*DžvhY6( 555B@Vjzj$.jn'Ƨ4%{-NRRƟB?<7oZo2HII"qE̗nt %{2Hs4΁YӐ~Ȳ!GUytz{{&\, Y^}TC1>ȐVh ᇡRA še+'3l6B;zj-Xu$V+F^{2=hyN4>M<%t\BAF~y8,H l|.########o}bbǪ<""sǝKBw ( VqzKH;_d|,&$X,"##  yrH%<<u|>$Z~`0HXXяy_<+hּK zKp|qY㞔p0a6̗Bnrq+########@]5]ܕJ}n_5aaax/lMRoI﫮 ) F |̿ ybT*nnjLMMax< #ݎF2==nGRHIJrSKj)I/EV+v]tbQ0 `V6XVj,h-.fvEt]R{<ffffjjJF9C0`ppbcc?s{JBw_Pw G\VP(bDRb>|LMM a>iY܌d2=l68C)K"BzGEEn`X tLhJ#yE[HK1Ҹ@ Ϟ#ě`Պ ϥrH8wy&###m?@g?s5\.QQQl6J -xƇ~MX|9. )&,>klI gϞLljmdQ*(Jz-j5Ye8NΟ?b!??+v˹鱗}q5ٵkvԩS`ZYdXPt sK0>>Λoɕ+W'??+V+YYYܺu """8w˗/ㄇzEy ۔EQQ j>ZZZvoPUU //OH~F CqyΝ;Gii)v"66Į]hhh@ɛo)B9±chjj"//O协\.xjZzTTT088HFF###"DAZ|Gsrf-\.fff裏(..O---?#Bݻwl2p8 - СC !)xPT t[:o @Pr?˗ ostJa]ʆ"e樹3iUbpp#GS<ҿ}}}466r9pN͛Į]z*x^~R]]f###{ .Fqq18p:1JX|M._LOO\xQKiiiLNNz筷ҥKPTT9z({GMM F^o!l?>aݸ\..]}]]hVfpeXt)?9rIII ^m6FE@EE. ;wB,Xo͊+YyXPe /hnnf<>}@ @||</ؾ};6l[|2:N AϟO~~>FW_}B!rss{JQQQGXX/nL&=Zwe^{rU~=zL&[n֭[l?/K.-))1JJJepp޽{QTl6~~- Mjj*ɜczzzb۶m_%1vjkkرc QVVFjj* x<r5o}Q]]͎;hkk#33s1<|˗S__OTTmmmPUUECC7ovSUUᥗ^X,bbb;T*aʕqmnJkk+uVٰaXl֭cϞ=ֲpB^ʏ?Kȶm8q8|0@+W/###?G/6Vbɒ%;wsNj5O?4/_Acbb(**y(JoG}Dkk+7n?ȻիWz*;v`rr3gKrr27n__0 77WrODd…k. g?ƍ\p466rE~?ϧ{ߏj{z*WűcǸtlذVٳg2}Ynݺ%1011mۄ;󫯾ʍ7ebbB,|errՊW^!''lsŠ+ؼy3Ǐ **J&?I"##Zܺuf7;iuuuNNN088(^M&wfddD_Tr]?cW  ==_wh4">>*jjjf+Vl2ظq#\pQ2222~ LNNeZ-/_&;;Μ9Cww7?Oc||aÙ7o,wWƥK~@ii)*Ǐ311Arr2ϟvEll,gϞ ӟ[RXX֭[Y|9DDD0::ʍ7QDnn. P\\K/p-Ο?OGG'BNNcI]bgϞˬX8.\sHKKc``Gxx8}tuuQVVƢExh4f~Ekk+cccAưZ瓚*;==Mbb"h44 ,]%K}vJKKyٴilݺ6oLII 7nŋ 3<466RXXYx1𛜜dzzySOqa\pAz=z.]*  QQQ z^K҂_h{#<<^{~lBbbXnW… `0HTTGDdd$mmm\.'55B _ٌܹA <III$%%aX#!!ٌZd2a6  HJJ b'$$$&&("##DJJ SSS"NBB@AqoL&Ľ orr2ɸnFGG}jX, OH-Z3w~Ç޲[ZZRdڵnÍ7ظq#qqq||>:;;9x ;vݻikknq8+++iii/`466OVV@ǏSWWDFFzjpA||}۷ϊA r {ڵkBkҥ#022Bnn.|>:;; xr 211Akkݔ\J&''IMMeӦM 000@tt4))) Vlݺ).^&''GxEzz:UUUl߾4E 0TVVlb٘?W>t^ŋ)++#++,XիWcݺuÕ+WXx1poQMMJJjRWWGoop͛8NJJJp@\\TWWvZf3w'? $$$p8(((`ffX"""p:088Hvv6v/xW?>CCC\p"~iF#v ;>,-FlBVV===b!hAΟ?$ܺu\  K^^׮]4V˗/tR֯_RĉDFF Ai.|b0ZB3$// t:~E%Kpddd`tR` 044Dll,%%%ܼy.j5%%%\|ɑ#GG ͋n̍7xb`rrLT*SSS" 77 F#IIITWWsLdd$ʼndeeNKK ,\ RRR=M,Ij)ijj!._RdٲeTUU–-[XVݻZ`qݴގJg!99J6mDVVUUUx^qdׯφ KII \xEi&T*'N@ϓFyy9}}}ر"qKcǎ l6RRRI0VFFFFybSSSb^P0>>墨HBTVCEcBm ]ŖVCUx`|w? zF#K+$hu%qPcEvsHnd"' 8j! $Z-~ΊT/R8 ^}vv;199OS!%_siHaj_%CJeԉIBR3i<[C@+)hK(.`!a\/2̭tv:::D3331͸\.~_+ftww 5cLff{] SSS}Rc||rrrDy3;F*tt~&}Ī{4Znt:UDimkVK}}=qqq"fTTr?k\_Cw߬, T9Z7߹ҽ:BCI,t%$:gYtM龐&z @X4BsڎRuAe BCCǙ{ͯkoN~~>BRR}};A l3wJmzt_H3w\JH>1˟vwЫ̷YBX,h4!B+P/3},]T>P%_FZ?tBz꓎ m?ɨ{޹es-߇o98n@6}RϽoT2K?nmt 7븹߹ Pמۖti?w^ss, ۃY=s9wΜ{a[·15쟷s3tKѰ}v4ۇ'ᣎOo:AecuCFFFFrĄp~ly^?wLBfV}챥OGo RWUaZ1 OKm#""y#J mw.(9> R)ݣw/k~{NiOFw9as ɶ+.w%7KITqp8p:|t훎B@?p:Z8f,in<>>%22Hq:Y*|v]ܕRMOOP(X,h4t:F a *nXxOi?1~HpB8::R)\JxkU111"׷'&&?)_NBB&IdxzzzD'M" y'&&0 i^R*fYIFFFFFFF[CӬ544Aϟύ7ijjbǹz*}˗/d2qI~Os%v$l6 *]ww7̭[Xf#U(4ؑ#Gr W\!33~pM2TWWsx"ODrr2<ϟ/',,pѣLLLRdϞ=|G 9rԐGCCgΜ˘L&GҥK={ŋsQjjjchZQﰰ0.察At:|"oZr Ӊ^>BZXjOpMVWWDZcǨ  믿Nss3 "oMM 555$''ϵkPՄs `ѢE(Jl6zŠý4kR4Պb ̒'xjj xi4 C((K iz>@ @bb,u{%,ҢrT*9{,T**2f`0{ǵkz|Ң[oӧYv-aaa ^222222222+|4k}[t)8N),,/eeeG?KJJ ]]]477v!))! dgg?d\|s7RgE6ő/(r&$$q~_`ٸq#---TUU o)Nff&DDD~`0oQL&.p󉎎F+ىl6 />V\ɺuؽ{7?9|0ccc$$$}q"""D}>@XX6DY` ƾ}7kƻKqq1\~ JJJxo6TWWݻwK/{'IΝ;Goo/kbPFFFFFFFFwJpqFGGq\r+V9qK,At:)))駟]v$ w]Z^;աT*Yd  ngΜaDEEh4'N %%vx <zsΑKzz8uXv-׮]ѣ(JFtF (((`0EOOׯ444fT*: .OJJʬ:l6;v ++ w]Z[[`ffJyιBW_%++Tz=/^$99R6mĩSDDDp'm4ƍl޼^b>@``߾}j%>>8C^^999_KE`˅">>4"##ڵkdff0call?Xxֲa>Yd jϟώ;q`0|\xBAUUzL&/EAA۶m#33'|_;v;zIKKCROO[V`J"11$jkk~Uxz0dl޼ZMAAf~YlLLLPYYImm-uuuF.\Hvvȋ\PPEb:`0(gE9u/?v8n\.V7xBO? s5p8ޣ\~j^裡 033ngܹs_|F0DGGdRSSu}Áѣ\z^z ͛7yؼy3ܸq0rssz|Gtwwcǎ% FQĴGGGc0 Z4^멨hl6pOtb0t /nRػw/333c߾}h9s@ 999TWWSWWc֭\V˺ux<۷y9x ~>222hnn&ő#Gx< zGww7$N8!8]FWW̟?t&&&8p@233 >66Fnn.D\\VZ-+W&''Yn~@T@II === n: 11>`CcЯ\BSSvի̛7M6Vr gy|_vw^wP\\, ~?.]">>zimm% 288j%99+f#22Xr%9993|-[ _`l6 iii477/b;fjbccgh4LMM}vFGGYf QQQ~rssZt:rss&""%KMttc'_7BcГ_|i4 *n"&&Ǐ300`BXSjа'']155%$rEQQqS( =D>`0GTc$X_i:66VJoV̭߃P?Pv BFRqM:ďcRRRD( ZZZNll,vɥ~NFGG{^ 2*J~3 9[(66=CBt>hNz+6bXD&P"q)塄桿3Pb:׽_B*k-=']AEO{h=6qxBaP(DyĎϭ_:N&jynԟsyX~0+{'v>B-LHux<( qgch;~w: n당1222222222_O>11ɏEPPxDn{]BnGVj5/KF;{hv: |Y\b`0PO}, -r,H^o/ߔuEPv|³GFFFFFFFFwB$:K"b._@G} u]DHuqf4dB󛌌7iQ3_?d;sE)f|[-R{>蒛O |Y󛌌7IQP?KDDDvgppχV%!!VabbN'###r1<1>Addꃯ) Z&11J%<..NZM\\za  T*###F>QDnn,<555,[ Kdd,$ 044h$66@ (~_iIHH@׋9d2a6팏: 299f#)) Fn9>|]Xjg$thPT9~8zj$&&~foFt:gσ:GFFp\c0tFFFF|$%%=eddddddd'M??<ݻfIJJ… 444b L&G[n} v^Ν;~:T*լ4k7oƍXV?stcj?:IOOnoڵkرc… |2LrrH#/b&''/Db49z(TWWS\\,^˙3gP(8pvb;v._LNN7nҥK\|Y@={*Ξ=ҥK9qℸ… tҬYVfffD Z-^`0HLL XVx.{@KK >t:&''X,'fsQUUd2jjjڵk444B{{;N BAtt4.͸nENp^Jt299ŋQ*dee=l6q\~^/nR033_urrr0X,&''j`0fczz=kHa"R/ G6Vi$yjj0:ĥK%==;wG$ʿܺu ڵk??vY`ݼ[ܾ}y7ill")aZj N۷y& .R`ll Z-T~?444k."""顳 RSSC}}={졬 1 ZV,TXV I._#pe***dff222"]shllիP[[Kcc#;w$99IvESSXܒں >1/o>'C Dl6~ ryyشi+WD`Zٶmzٰa QTTDAAnAzz}yGqq1< dŊhjʢk׮a4Yt)QQQvZYd ĉQPP@OOqqq̛7 Ξ=RIcc#KQQK,ɓl6'''prrrv+Vl6Kii)/^$--e˖QVV###lذɰfϟϢE8u .$**JCss3.]:&&&tttVhooĉbTWWS]]ffqIRRRܾ}Jvvczll,VvBvv6MMMlݺ:/_IOO[ray9s ӧOSPP@ff&{<}]nݺŵkXhc5###͛466rET*555TVVr5Z-W^%""#Gȑ#100@^^XPx}j, F:::hkkcƍ,Y x9reeeqq<n??رc̛7'=|ddddddd|[*j.\Hss3fbb@EE+Vpq,XJfQZZK/}~8vwܹNٌd"v?Wz*++h4hoXXn'NSO Q0Z-~s1jVy7p\T*N8AQQ7ngm& Zh4={d j477ϦM{9XzK>y$M`K/D^^f}{ܹs)v;,Y^{@ `0+All, X|9̙֭3~ W\yx/NG__ׯ_g!,, ¡C LXx1Ν… LLL0::J0200 ίP(abb??|%&&Loo/6J>qFVX$qqq,^{*1bXf+BNN|ߥCx]DDD`4q8lܸ'׿+AΟ?͛я~DBBJHf3ITT~c0j"h4b6ZBv;QQQ g||p!i+qR]]M\\111$E\ijrUn߾M||Bihh &&,Xz5~\ªUPTf줾8?S.\(4Y|9jbcct\t KLL -uU҈tMTT>IL&z^x&lȠ^N8;j9rD%&&~yxT*!v˧8u@^͛'v:rrrbWvhdŊ477ׯGTJbxxJEjj*K.ehh!֯_}}}$$$l{mm-mmml6+V`bbZYz58NVZZ+W`6ydff*JKKYtAtDEEz~:j ߏB`tt [,R٤tI+77V)++p! ŋcZinnfݺul6$33sV~sJNN>bccx>Nmm-6lIo0]155%|v%(@w^B!(H0|R{$؇iAyBZ:I}X='~n>*'i1  çb ?gR>oAqY0BhY%w7o211A0$!! |%ű8wtיA!@ {ի-Ynqd&INv6;{̜=gNvJf'8Ď{l˲lu");H QB?Cڲ-7Ɏ9&ͷy|a~;#s|1t~0}?qA却"D!BO^622 Nn-weaz7rϟ:aAFQms||=_"**D(++{FVbt~]?ofzL&xd2`# [㾃tG7s8|Fa7z{i'O{L"D!A6G!މ^/F6X]]  ۽V>33H$Y@ >_-+Cf';!!a]ԁl%*Sa_y)B"DLF{oiۏ}z(B.].nOeU*Wf!,XXX@PT*`HD ܶw//񐐐~F!B"DwD"q~nQ w}Yg_tG8.{ٱC~?#D!B";d*v)R)AfggGVcnnݎRD*x0 p8c~~^(4::lpRާjcüe2LOOPT055GRL&caa@tt{ Ǚ# P(0  R:>8( $ X,bcc䙙D" Ԕvp8a~~˅Rh4b0B&֪SSSLLLzSUUq///V3Jd2&''eiiIq?55fq8LLLPŽgLL̺ԄB?o*蚟gffF~iښ'OɹeaD0b===ddd|l*rp,"Z),0v&''*`ۙW_%66}qP(;W\z:b1o&b+W033$$$`V)d2uø^`@.<==-GGGc0nh0LNN2??/4L Ǹ\.&&&B W`||^B  '>>\yr9]]]dddܐc[o.|>SN122Bnn$i?{9faa+WB177\.G.p8~I\.j9f}ĄPcc־czamr$ T* LOOcۅwd2a0hd2D"app'O!BDC ^~ذa׮]ɓLLL`0̤~{9oߎFW_?)G˼D" 455kYgwvv /0447 aCU*rpB Nك`ٳIuu5MMM --,aV+o&|cbbxʕ+B9_|:BD"N:ų>+~wŋ300@KK W\A&P(hllsαyfΝ;P2)&&fnXX\\r ja@||<& łG"`XX,gPT " f*8n6k N^ʵkp:cȕ+W(**y %ƞx Y]]%//O(6НN'&Ix&yyy7NZt"ɰZFqilldÆ \rEFF:㣯7xÇ#JX,\. 0F]%I\Ntj*@@(1`0GxP*vYH 8NBBjZVHVJE?O=ĬaG^ŋlܸ|6v*.DtCCCXVx'Arss̙3"JtbXJD"`dFc0S^?p8~;6nHKK @ػw/*999XVΞ=c1>>NGGP! ZT*yiiiO~~>L&r92Flذd1DGGrP }466Fww7Nb~~x~_ȵk(++w455QPP %Z*͆Rp)ffffh4"Jż"ˉevvՊh 6L&o³ 7Wl6ea,+9~h4 >B`ffFxO=z,VVVz`0"8gffXYYAPx{ B\|N.^( hl6XL&h4bZQ*|>X\\D, J*]_f3gΜ!;;P(D"ayyY6B~L{{;%%%7ahhk׮QZZ|2mmmbZyh4!v***8q---477 %QZZO?M__MMM244/NV+KYY>,455O{{;O[p=3>>NQQΝc۶m( ~_ȦM>sM"Dx@OKKr7$??ozuV]#G088HWW@{2==` ''BpP(ؽ{7:W^ÇsIjkkV|aCU.SPP-[hooGP]]M\\޽ZMMM ?;vPZZ^'11\tPr$ dggSPP@JJ lذsQQQNJ^^,((Z(..fƍ\rlnʶmۄ={P]]l&55;wRQQAYYϟ VN 8uuu ۋdbuuaD"/SSSdffOOD"hkkՊ… 255ŋaii>IIIl۶ EEEtwwgz{{eƍ266Ƒ#Gx׹;IIIw!**sΑGFF t:O>---TUUT=663<---$''3>>Ν;';;@QQѺf*++ygappUzHR^|EKO~ 2~iHKKW^all7xP(DkkE{{;ӧr%bccŴ355%8 y233ihhM!=<999z.\VK/,SSSvm<d^__Occ#]]]x^, Z8\t|ʢBA__Rs=G0 R[oEMM /"11s%b1oAJJ oաRt ˕+WHLLdddZjkkyX,/K.jr (bB`^z%Z-~z[t:y饗RSSBiKkk+呝Mff& w^D"l߾~hmmrQ\\ o\.ԩS2::nߏ^d2ťKΦ.(.. (((_qa^`vv1oMffD(f3'''y饗0DCC:Hkk+W\!>>fg_RRB[[Okk+===tuu!8w|>yIOO'&&HDVV۷ogll '8xW1 3QDEEqE 7ovt:9u~;ZD"$%%j%''}{& S]]Mvvpnz^ɓ'{ ;c|i(++C*сho5zzzؾ};"@ S!==}]Cb2RRRx,//xhmmeӦM<#HR^/Z{wt!Dd6mĎ;p~\N[[#dñcǀwwlΟ?T*^INNsq9vuVx fgg׍^{7]+ IVV?9p {Ed2>Ŗ-[vUUUpavEss3.KP_%TѣGttth0׳̟ɟPRR \ްpd"=7 jjj(--ȑ#T*n7%%%tttp5!2H||<7ndϞ=\pǃ\.jkk׿V‰ڵعs'z{{eii JEMM SSSβeػw/} 8+++NJ˶m(--޽A*T*韨 <ƍٷo;w}av́hoo^pp8P*B) ._Lll,v]p*366Zm۶IDATsIRSS,//sEL&*>l6)))ٳBB>(… n2B7#ɐ(J}۷ݻw344$vmL0D9{{{1b ILLx<bbbŋl۶GyDgy^8D"gy={j@Rw6UcbbT*% hZF['\W2==MFF+++¾f J[.^c=ƦMHKK`0?d2rA[neǎT*6oLAA`0/áF%PEfgg1Ll6>6zBCL(Bkc".8jjoX$h4t:RRRM&Pm۶QYYӧz9y$jZcbb `ya™3gرc LNNC,vZwMbb"/d aa<66$vb޽ Kbb"111b )))Byp(.$^/A_ZZbyyYnvv6Jbpp[2<<  B!a<a{߾}T*)//h4ݍn'//x8tUUUsaaRӡJ$1::JGG===ǣh((($077RdffFД+WPUUELL C$]ww7v`ÄD=JB5 GC~__l޼$h4q}& M0dnnnk8bf%v\Njj*qqqvmTUUq  j'# Jcbbb1jLFJJ Z;ww^vAUUo$\x_~RߛL&)((`ppV‚jarrr+JQpĄհv\\\#IIIl޼~FCZZBɒߏdR~1 hԌ,rss吝***0Ȇ H$tww344Daa!YYYF||>^$66[ yi6}M~~>111#Hˣ łlfTJJ iii7} qA ;۶mpAEEs0d˖-H_SSIII?~l!`ΝTVVjbP*lذٌX,b$9998R8}zzh|APwtuuqFoNJJ t:>N+ ʢA(;$''av;[|>rrrHOOGP088H RIGG333t:*!A"񔗗uVTTGFF"D"*{6mڄb`0pAt)veffR^^SRR[nw p:VBRQRR iiiXVưBZehhHH癛# grr26^9">(&Ac! VE*!''M}}=111{hmmeǎر$p8G[[ U]]===qaaݽ{5>>ZF y4z)**b߾}]-[عs'\zb#uMzz:dff QR\\Lgg'111-OKK(щ ~?n={`2$%%e&&&XXX --RA1j<66Fss^w4HRIKKcxxeP,--GYYtvvjͥ(t$%%Bff SYYIII }}} ;MMM8g022BVVwqSSSrhmmERe;DբRG\~~>@q:B!;n7,fffHOOg$$$`49x !HqN;v`۶mBee%v"==9vLOO3==CE8Gbb"$''s!rssbpwSTTᠫnjj5w^fqq"\.8p7hhll$77MWW>Bѣqef36$.!B$]dZi x>0gvγHLL:(ò177Gtt44A<1Lt[Zh4#immDHMMeee_<=\]] c[SSbMMMLOO3>>η-233w===BNc֭S*$0:nݘp <÷i"||>_~LBdZiiM!B>ahd2t:ݺ뮘׆,ֆT~Ґ=ϗphvB.CVV_Zl?{^{+IErr2`PPJBDEE} NwB!Z o=#Hصkiii߅UZ/o5۰cD"7nª#DCG"xAg%11QR}"D!WqA_ZZj~Zٟ|>|>q:WcnL&lp?8UnUP($~ k/a껵TA߅_-ZPV"j܊DOLOODll,QQQn&&&f/%U(0>>.*.a^.V3d h4>FellYbbb(JAM3>>NLL BC*)&''׵`~~~FPl||yݰZVeyy vXzV`||c{^.*vaV+D"[* yjl6\..~zapjqXafffB000,6 FիWtw`0Hll P(믿N枵߅pՃ'OGQQ)]FAA.vzB###d놐-,,!Ell,NH& D溕|u>a, qqq /`2A,sINN-B^^LMM}`x<A!fDI__PNo\.G3;; 0LLLк:.]0t:FGGL&m}hhh "D'QqP}``_򗬮RYYիWy뭷c||\(266 / y~ƱcǸ|2 dV+?8^/RUUEtt:}vvg}n:!lJRΟ?Ν#55@ ?OGG{`0P__(lܸ6qRSS6׮]c?PC:::/299Ʌ /P%==wy{ݻw#cϝ;G^^###Q__H$BMgg'ϟg155穪BP3fP6Q(®F||<,,,d2@(`0F'xBj-Nkk+Fc=… O3??OCCQz-FFFX^^Js5n݊D"B`^Att4>Պc||q4??">}K.QPPL&cjjJpx8L&vJ "@饗Oʾ}hmmepp>ZZZ0twwe: 6g}RI\\:u7xVK\\]]][oa~ '&&8uCSZF*`RhD#8}4J@ F3g0;;4r^xG阚bxxQZp'd2ƍΝhoo'==W_}cۙ_$66lFGGY^^&66XdbjjJc'&&X\\D"}vvZ^Y?JVVv&6nف!B|CmڴJi&9r{F\.B=ߜRP(*QQQ~d2_7&?//ǏsOb/sk uoogppPRrDA&j׿G?CX0GEErWjxAVWWQ*<~_vþ}xꩧ_x&--Gye~r!2??NC"LVV333nN>Nc``??~;EEE `4Bb4ehhHHMM%=ƍٺu+o`LHR f  //2=zZO?͑#G7?f W^aÆ AΝ;<Ⱥ蕢"222祗^|^PPjeffyB{{;sMդC'qYbcc  HHHi]uii)333xh4BNְ3n#99|^{x$ 8NƍgΝl6###;wSOBqq1F3gΐD"ayyW"ذacccTVVRZZ??h8NN8"fF"PXX%//~cnnNpB}{z]Ʈ]('? l߾}瓟c=Fnn.łeϞ=B4Ζ-[mFrr2'N 33P((ddduVL&8N<ǏgeeW_}Z1͜8qFC{{;k aR=ʏcNg~hhhv][pbXp8(++'==HDgg' r=sGAA˜|xwGm۶z[NX,CTTb}s0+J|>u}>MMMl۶پ};јL&&''ٲe HRD"}}}444wKkk+%%%|[ߢDž={7x^~2??Obb"eeeܹRyGra49{,sx<< B/4B"DY|r0rgh46nHBBcccv|t:ư!j=bii}|FX\\č{gǎ X w~~@TRXXH b0??hpÑl6xŸn_ya'`ddZF<O<l۶P(ĥKxgپ}F\\999y. !JdDEE ‚4,//#DEE999|>b1N222jTUUqwN~_P]]Ve~~h=cjj Njj*sssDSSiii,//366B2ײJOO>l6399pmoƅ eٴi%%%X,XRIFF ߿;v ؘ[XX`yylZ-5559rTP`0Jb\t ׋X,;oo׍`0(,+++BTZT*F&??_xQ]][l!**F#|>ㅜnHJJ LNN CCC j)))j6oތF"ZО@ @}}0(W^E$j9wc]ZZZ$//OҒˣuHNN:NpމD"<ܹgIKK񐜜8bccgrrV+CCC@MM ۷o'66m۶!ɄP($FDVezz^/CCC477#Ɉ,//P(6 Ȃ (--6䛚"11!:::#j a0HNNF311b1::Rnv(--%33Sp"x<FFF@P??Fff& xBDEEaZQ(t"D!B>::*ct: MMMr^bccV~~>111lٲ7ƾ}Tgee>n*`A7Lyyy7ŖH$&'' r+˙cͥш%++={P[[Kjj*;w$ RWWǏGVׇD"l6hD*@cc#;Tŋ2<22"SR[[裏كN8:Dqq1x<ȃ#G]$. 188Hbb"SSSt:F#QQQ8VWW8Ny477P(طoiiif† hmmevv۷SRR"8N`||erssQdffP(YVWW]Dzz:X IJJ TJqq1)))- B!v?~˗q} NzJJJ0͔ E,cٶmPjEaa!;v@,Ntt4;v/h48Nn7Ǐguuk׮P(p0|_X"P[}3DBoєSZZJvvus|o8  KwLoj_0$--MWR_gLx~F~iX,!>aaRnwF$R>a"D!Bw"މ^/7>o>*uSVt:x<8pe!g5N>vZI(t"߷); h8D|BU"D!B_ \.tzV̽. C! (?v߬wHtKC노GqB#D!B"|q|:uW"w"|p:xt000Ԕj===*JG|T*3>>N0DV3220Rt]y@gg'333h4R) D388H(B0??/t:V+mmmLNNbXcll!sPq W;XYYl6HdbJLNN ȱ,--ݍ+a00UoȔDR}ƺfn+++8q?زnkU?y|>DGGc~  f3 +uj&4 }}}$%%|IH0dvv@ =^h\׿Nu333t:RP2}Ztwwfoo/fND"allj ݍH$̽"D!B'QqP}dd~*++|2ϟj200@QQ/{nj5==wy'uuuՑHJJ 333(=$''3PTLOO{ aCU.STTDyy9$''at:޽VKUU:FvEII zdrrr\Nii)rN iiidggSQQAnn.uuuuv1j򈋋6jkktR\\Lcc#EEElݺ*zBmq شiJk׮1==-я~b!aqobZyW?) 022Boo/rZZZ(//6昚zjj*555XVL&eeetwwS\\47of``@0villرcTWWs>L U2ccc^@TP(xHOOq8rw3)R)gǎz222ؼy3EEE\|G(mزe˺I% RYYѣGl8N^/~;az{{9~8ǎ[p-//  ᠣVB^OTTv{졻Kv^c6yٹs'"ljkkGRq`ӦMܹS8'** XT*%**={OS\\,D466KRRKLLۅ>! ѣ8\.7'VUU>(d2xCPPXX͛}kdeezx^FGG1 D"d2r 8x j۷s]wT*y衇rQPP={h4pq!vv< /ߎT*E*" H$d2A%si4J"55U!xzzFFF6 Y\\dqqݎL&ceebiiB!_}vvłbvM(4q\`dd |>gϞgƍ"p8c6umB2ł3%(BgTTk׮@^^~D2sss騬;(V+r;w Imm-,,,PTTD}}=W\!++ Fww2^吝 .sss2991 T*ٵk.:nJSS`PZZ*QT员޽{T*E$\.h4DAA:>T*@BD".yWW i&0 AIOO'==GqFHJJrhkk/^&&&vBDGG )6VHMMevvvxaaa:V+)))444pm1::jr!ZD"JJJXZZҥKdggP((ѬĄ:ֆ%99۷K^^eee~ iiifFFFXXX`aa˗//$''se)--e||+W뷰H$-x%:)Z[[YZZB׷(,,zpLOOgIMMbPWW7nDTr)//._Ljj*z.^㡦X̕+WLhjj"77 6ŋTTTvx"z[=d#D!B7 q@#HCTсJFRa!;;&'']va6ikkCRqqr= [XXhR)9997_=<z]]»hy'?ӯʊh$w[ݔ"D!W^/lBed2:n]uW?`n<X]]y"H8ǧ9ϗn\͛ B}i'7r5nUu8%zPPP (;}OCBR5E"jjBb[6f~aT*M>-5nE"555]|[B.Y2Ҷ呞"D!M{VUX߬LTOe;NA`t~|v B_~D|>|>ߧ'7re!VZ~QOc폵p+qeFK$}E8N"D!BXmO*JMM :>NNA$GG!B"D}숾+DX=—pGio\5]]]%b BYWWW?Vٯ77 BcC%"D·FZZZewww3::J\\>&!>>^P/"99XbZ-tvvZ֫l6ZZZp:$%%}U3SعZ^^qtvv222B@R166FWWn㡽]`FC__}}}BLMMZ(D&阛%YZZի2??Obb" DŽ[1>>?ggg׉J֪*GEE1<>S_DFY5\.P:GVwt^7JinnNPtN\X,7F#o4662<<OFVoH^^pl(bxx  ¸0ͼdee$! шJڵkAr---N\.NFGGD8 Oxinn]U^|EaXx饗(//G"@[[B /@||1^Rdii +E>n6NMMq$P  C?N|>/2GLvg499IggC"Dp|5'''yTUUqyxVe~~z8v;"'Oӧ zPۿehh/m6|I<wy2_ .pA}Y \t V˹sA}}=HRz)]åK(..'? ܹS_|bN>MGGPMOO(ǙfvB J`jjX!vmذAxna?HdW/RVVd"&&шgffgyZI!B>6@6޽[iM6?c߾}\x[FKK `B.\<2;;KJJ я~$뮛Ç9{' X̱cBZZǎĉB!233dll_ׄB!KwwpIظq#P\D"abb$ Ztuu1PTTVVFzz:Ǐ]0nn7|>v kN' :t9Oll,477 kY]]g? j5Z򘙙jRWWGjj*|?9?  dee|9s@tt4CCC|߼izlܸM6qIL&PY* ;>111`.xHKKŋDGG!E"0Ϟ=׾5;sp^WW c6h4PSSùsx衇8q999\|{w;w$%%e5ꨬԩSTTT`X΢Rxʟٟo0vGEVoC Q>lݺU蛵s ==￟zfgg@kkk#!!Ap8#(//7 NS0 E"d޽;vl<#p5ǹ{;Op)J!>77x|eYYG.X ;"rPNsqhBur9UUU<3 )[QQQBd2~?b#Gсhv:d2%\;EzoHxW!c聆J>]]]ر{ZZZ(++';;^/8= }_VVFZZ`D"Xy뭷HJJ"77w،!Bnj[,Ǚdiid6oތFa۶m$&&244Bqn6ٴi^qT* ~m<ﻮbddY?qq]F~~>n333LOO333ÏcJP[yvv)FGGX,s,슫T*VVV{V+sssF! 144###8_qqݜ:u^x2n7---?99>Updx%XLillj DB{{;6|VWWf155EII :r[ pU{1 |\.r9|>)Lii).]糴DCC^¹VUfffAFGG?vB!av\8Dž"h݂^, IMM%''d>L^^ipk¿/ûN\.v#||d2ٺT*l6 }֡6~JKK;3h<^sssBIZZgϞrHOO'))6Alm8ڰ`0<cbb : gyy,8i^hhFFFdr&''axx~?׮]"JKKȦ;4lB||QlBAcc#.\`׮]ٳ˗/S__ŋDR?>1US[[鱗kƙ3gOzz:\zFCuu5 :u["J Fz-^{5N'~ڵk$''SPPs=Gss3gϞf ,JoS̤FZ-Ӄh$))|9x `0`X(((l6o ϟffff0LNN266"D!BϋAaii RNCT =Ǐ'&&EAADGGSQQAee%EEElٲ|!dѣ`ŽtP*++놽ksPvRRRD  y^d2+++dgg311*2 6oLuu5"# rqT*RB .!8t"N4 *eYYY!:: nj0L޽jbn\R!SRRGYee%ٌnСCFbb"BAuu5DEE޽{z,,,zSJI$VWWlڴh&''پ};ddd066&8aِ;vP(>Ǐ ;pbbb"Vx#)H'LYt:QTDEEHII!&&,RSSIKK#66DbBOHMMEբHKKCTR^^..I$rss'33S0Đ!+J=jN}7'k#D!B"|8І`="S:9&-R)33Qd B!vdfpUǶBRIer2WzVAʒj\\Do%3TJ^:Q ',ON&OedB͖4].:M&T2SSQdt)ML$_``ڌ M&Bά, KK.-QBR#KKB&$!)`^/23QH\ BT$%ˤYZ-剉ؽ^Z bbؖD$83CYb"*6 ^GVKBkkJ.']fxq;N>B!R5zِBFKKdh4T&'cYY}nXtbfg;F激uЁDk}զ3c#Yt{C$ !Z RccJ$DT%'01$$cx5:5d6ebb\X`jۉ˩MO67ֈ!B"D|+?7]YYp[^23IR*fUb Lt9hh4rNL fT<=ޱgu]׮-;;Uzw<i$JHJL" A sh@>DŽHIT p*@9_xw{'B!Nu5: B?oǠV%;߭APV((SR u%/(B ?[̦ g2 6ggQ*{(4t4?۲T^+dfJJBj. - x_8j$A&hDP'7c2I_XHYFPHxxZ\))!ljEP`(Ƞ -KK`'%]c_QLLZ-f3yf3 [2oLr'(< E LQf3F#?޼]9T 9(KJWXƬ,~V[K^`Rg[~O Q*Q+֯$=}=MÁV8P~I$t@y,´4lF#H,ܧLw0-)(rfh!0Jy##qA`ho/ggQ"pmr;mEJ32p:;Q볲1Bqb(PO(YeFNJ8̙aVVP(8:J8CnLOs ++\%s~l 0ȘMYF`4J?۲L^jj(X^UUV+rrؙ3L픤aT(j4TZ|X"A4[eelͥ,#?2|y2R(XFbj (pFR'l'd>Hw7((n緪P)hU*SQAaZ [PߴJU*pFrL&-*bgn.E e iZ-{7ޝė%kj,F7:=%WW# @Ѱ3/),z=ߩ 0KKCT6?U^I2\:Q-N1L쬴ܢHQz:߮n+J~(i0Pl0+W8;T]!A t2rQ?4IER!ܞ~\w7H"T,z=ՙa\\dsv6iZ-V o`oa!9&zzѫՒd X%jwj=EA.?> S>S^/V+y-.:3kܚ#`bATEt٘Z#&&ؖK(wa Řie5B!ܜA!lu8]φŕ;9R(ͪ*VQΏ9Lg}E,ߪh?K]o8~37?}GG+袈-5J ,O(DHIWVD)..EЩTtZn`*JBhS`6>+ ^\dg^YUŔ{'*QseVAeNQZZ,SO[LRQdPAMV-33b1,z=&TjvlAt*w/HZM]N%[,l&dbquBƻ1벲0_vQl [| 玫(=7y^ϳlk }ʘEw"w{ 9;;!  9Z) ѵR0H <_ZՉ J%벲$YFYMqSpS*ﮝkLTddHr2&^2 zXgܡqQ?ۇF$HgM(Z)#E P1߬bOA Fw? 螟ĞNf9d9$P30X diΕ8igA&Pa2Ǚdhk :HpjxHT(K0fNRD lfYFQ)L|LDq~?sst;/-:;K=8n7ֻnsDQFnD`agr0盎U#Ma'232r12| ݐPR/{a`4N X ѪTL|w `NNF5kXz= ӑbX_PRunp8RDO vK;2Aݼ_wv"&ˬe~Po݇ˮ=4[DiJ u?u?\{TJ;uГ}|"ic5[\oBqF)IMdmwjG=YS|п#sf_o&HQ*\>YK5>Ě4 kBU_GDTbx\(bj1k4d99.լh4/eүGA\1k4XZo pkj c%'(jl:BAJ]#SKK\(3w0r1{V8Ǧ"ލy2$DFCZHVFFFFFFFFC\Ip}ii )XD,ngB(T**gW{G.|!rDAZژLjVWQLZWin<. |>2RSscOiA7 ?j\q\znura00|͓|Bff#x|>zҲFNF#SSS\xQV+ZV]F<… ,,,M$ŋrz{{IMMd2(uş@\ܿH_ ͡Rsy&>5mj 0 B!\BWWy<fngH$}TYG"n߾͍78{,D"~_PXXd̙3b1(◿%\~Gb0I$b1~_ y&nP!HbĉH$> H#s%;/^g?LNNr5rrrZB!VWWIMM_g:]hjjb~~| X`0ѣGzD"~?iii;z1Lܺu>JKK \xN?Nk}nkk\|>N:ieKl6T*& F$T, B!t:===k*:k׮ԄŁD"4551==MJJ =ߕJ%:,~:H#G0LXVΟ?OSSz`0ȑ#G0::*[?Doo/{;SSS|>;??188HOO555|% ,########T;^x/)h7ng9~8㌍ٶm;CCC>~.^5 (D"!Y?ҴYn[l~9s ;IAH$>|h44.'Ov;+BNNt_~ۿ%''>`mpݼ[yRSS4ddddddddd=$nyyRInn.277G~~>?^]]jEPRRBee%7ndݺub0P*t:f3fYvL^'%%_|NJ&KST$ rrrH$vJ%˔c2X,Kmq8,--aXZ8jf3ַ0 REɂL6Luu5O=puDVVN" ++ N@T&%᪭,Ƀg}VrO[Ւn'##\, GEEp'㥗^HZ&==m۶Q\\,%ܽ{7`0HNN I"vV`ESO=ƍ)))vSYYɮ]())ARI^(J U*yyy( )IBDBSh2Pzih3`~~\ۇh}QRR"Ϯh4Bp)//GVSRRBNNAi,DQDq83hؾ};l6VVVؽ{7v4;wDՒs4&ϗ^xD"AMM vBPQQAvv6D_~3PK8vKYAr y>>MtͱcXZZbӦM'-P~nɢYUCtD"! ƯTk(,r~].fc=JDQraZ`0R|`xC,f~vR0 _)2\0.|A 4 A㏵ a0+++KARoF8o&_< H'4.{@9H<$ ҡBRa{(U/+}h˭̗AD"#>CE4#w!0_;tqLQ 'Ť2_mdwo4}D8-{ݿ'X-F-a(YU5(euuE8faaP(cyyXP({Ybx<'o0$ =I$_IQs$\.皇OY܇8vjZ|yn߾MFFXǏs :;;`0055E}}˗Q* hiiAP`dqĉ\.>U5 7nŋ\.rssYZZ,--QXX㡡VZ-V[nqY2220Ǐ*ے455FKr{{;'N͆Fܹsܾ}b]˗ 88{,t:yiiiaxx2T*SXXBq1㌏,p8gΜappLt:MMM\rH$"g}}= l"ܾ}F#Y8Y>~ ^/@0NbÆ Y=8 Bddd|Ggg')))e|Jܛرc\?+++F^Jnna~~'O255k_NG}}=.q^JJJ G!HHQ9{,###8)GGrMVWW͕ɳg2;;^ѣarrrEΞ=';;ׯs%FK.q_ h4&z=p)<999R?&&&xIIITkd,t^/| ;v 6WANN]]]鶴oMeeT055o}[pY*++"55|>'N`׮]h5 z ^2k㤧sYF#6Nؿ?^χJѣl۶ +-EEE$ Μ9oAmm-~gSORtb69|0UUUҋ 'N`ݨjfffHOOرc88zN'6lh4H[[?w{9J%bXxwپ};EEE8pjnݺ k" 6"gΜa߾}T5 z__tttp8ÕGM,SSS455DZZ[aY]]ŋtwwK9;Ν;)**"--!$##ZZZc׮]kQ\\Lvv6CyyLOO… dffR\\Lcc#mmm˗㔔SRRBSSR)w}qn"6A~FGG"q:;; ?Fl6iLu)))+Wvcۥ\PP($%9p~Gzz:׮]chh^{5222tr<7o$tkٸv}}}wN 2>>N4t:*fjjjh4299)%鴵a3==M{{;äB}}=N .PUUECCvqF#a{=4 333,,,P]] 0hkkJ tuua65͛ l,..AKK 4f]FKK|>i^Ѩ… Pvhoog!ZرclݺU1L^{ 6H$XVVVVH$9r2yyy[)//ncX>`ƍdddӧOҲݸnJKKyWٳ餽FayyǏSYY)zh4}tttH _zz:7nܠU7|M6q!|>LOOs% iiib6"HsssdeevIOO.B~K.ʢF06 /c8FR177VI^xX,iii9rJJ%W\vuVZZZgl6?3f\v;PD"ACCj\nݺEWWtANN,//s guux<έ[f˖-t:(/^dϞ=kv:::C;99Izz:կ(**";;[SX,}JKK@FFx>.%%%lذA:]zX,  RYYI$JSS#"MMM8Nh4b6 55'v۷oB޽{ٸq#:NܹF(v~i1 j6mDii^~(L& W^TOIIT'~x<.\$ݻwcXH$zz)*++ xjjj>Ç LLLpUN<0 ),,Hcc#ׯ_Go0::ʻKZZ LNNrMx |Mx n޼(,..b28u8pR 33|ҥKܾ}~j9y$t:N>MGG.pxBŋܺu477sI|>ZBoI0$pAp\8pɓ'ikkDQn߾MWW R8t4 F_|l&''9up9yvvN<^_{СCXVΟ?Ooo//^daazKR{= .|ewjjHrQ;wdӦMzt:ر^O"jsp80 h4)//2;v@P(㴶w $ RSSˣVړܼyiooGPcǎ5#999LNNv ==R0=y饗att\YZZj؈餯.V+O?ԿF3h4RRRhnn|XZ:bÆ ޽(ڵ L" %%e͞NVOmm?p:Vɍ7$Ii<- ;wD!333Í7$CXiip8x<BQ]]M0d(J</"7oݎ<:;;dLVOK?#FFFS{|b |饗B>}Z:Uôg\.'N`uua;v\t CEE?Gz=. 筷b˖->p9<(Y9r(===ww. x<fff8tۿ-?%%%KV(Ryy)--%pRRRxejjm۶' 055ωDSO=EUUUUU޽[{U(LNNRSS޽{ZHaa![n### 鄷%0Z%~?&K1(..&==ӉJ"ŤyذaW(kONc[SE*++ygȐB4jkk!++Bi`0رc;v 77={gbbBR86۷K^vvd-***bzz~`ӦM5DZ;v~~?xZJJJ$kfCDQ$77SVVFMM ۷ogiinXYYAXn`q8dggFAbhBAUU~6n܈j%''bl6eeel6%''GMMM111kz=ϟgvvm۶k.L& AT3ϰqFi=Lp簱??5kg7nbE~?z-[`yE(Ubk233Cd5x<bbg׮]l޼V+ UUU߿~?lݺ#-- !$2yl6.jkk%++bj5(پ};v"''={,--$;ƩT*9y${ƍ122B8fjj~t}^2YQӱn:jkkY^^f``FCnn.XLV˖-[u4pg}bk\GGGvN˗/Kż\B__ ӟB,P~:No۔P(PTLNNri3 ۍqUĉQ\\L<Aq\=㒛9vzqΉyII ,JB@T9E*nݺq\RA`ddP(D~~> 㡽m۶IV[#9s /1 hP*QThZpBѰuVN>ѣGٸq#;8qP(4YErrrPT;w> rJWWSSS\pZדM&~7nR)MR);1ՒF22F8&&&@ k@K2HdGsE;ȠisT*)JvAFFVm۶j`0`4IIIq9x W\K.Q]]MII /_ YN222B~~>Fh4ʵk8y$ӔQYYIKK MMM3g8{,fRF#gϞKrnjjJɓ'%ϫ۷o˵kzB!ٽ{7۷ofaZ%%jV%El6_!6nܸ(bZ B?!iΒkZfÆ 444pt466P([N9BffuCAjkxɵ'96 vvQzaa!֭C׳a~Kee%޽[?vSPPF!SUU?;Cjj*555ZRVVFjj* H$\t$TTT "r ~077UUU>|/e֭Dmm-`V\x0bEQ#QTIO bͼ b?Ϥ9^}?g)HV7o277Nj/HEE46mBp 2{qQ1L8N_NGG޽ϩSpVijjri9BkkD]]jb կp\TTTP__ϑ#Gy&ݻtD0=3^9lJ%)))466b4ٴiFua69s gFOOUq1ZZZXn$g1'' 6멬pRl H$[J%. B Ԅ?) x<^/H;v}v-yyyI'vg{Is0۷oK'N@El6tww"׮]ȑ#\x^/ۘf9ܺu[ru9jl۶ Rɉ'0 ( /,..pO(#'N BAT꣒ n[ډ " QSS#Y$݇ׯ_Veaap8&Q,c|| |>i"IV7X[fv!%/YnC\.z="\ȓ.ɘnɭiӦMLNN2>>RdR ӉbR\bMM j۷oKݦMpFSSS ܺu ǃd>juֱ PXXHii) QPPRrIkBd2177GJJ H nݺ mmm_%>"VVV䔔 $R^^&z$:33Iq8TWW344 0??&IwuuFٴiPHJnVYY) Kefgg?~B* N."sssm2)))|>drTB䂘L855n288`y)B#"H0::66b!??bUUUǍbttt,y$ 0v<)^SWW$(J֭[GVVffԟR)'ú(--!穪"##jl޼fgglR \栠B%33* vSSS#ŚqiPZZJvv6\.0LLNNRTT"TWW"\.Œ'ܫ/LFFUUU`XXZZZ%ό z=$"LNNP(((( //6|>fjiRؼy3+++ "ŔHc(YYY8NΦ5㹲۷u똙addBb||Bƍ Hbz9DQz*#k$eeeX,Z[[ RX&#hl6c0X8H$Bzz*菓/zRAAO*vsQn7uuuݻI7WAܫ? n,un}߾/agG.eY:4ͼ+}y1JKK!Hz1Ljtt~~Cxw?zY|H*^WJRq mb|fWᤛV`0<$fd>ߢ(J._%'& -qiE%222K d\>q!jr/dup8VFHV€G'5:E{W2x<.ϣWd>+Foo/o6>_|#tՃ.D"(ps)_P豶I"a7Z=y$7GNX,F$yb{Ivn"וdG-22YO6|QFF@2GTmm-hۇFauu߹OAEF y1&˗}\ܓ QDm**FX,'➌Iy.2\oVFFFFFFFC(nݺUqF/_,}vf >I7+2~Չbx<B>p8d#)I'#wvzH$x{ֽ^/o6h[J޷=#D"nD"!)岂.#############os"t:Eg~H$lڴ χhnz.D[OFE8*~s;}uqW*ݻX,F<_c—8o:Dlvx{Uz & DQVVVpOz d!q|Gv%޲I*ߗ$neeV{5הY;ujWVVt_edddddddddddddjgAOy4<(l\ytA22222222222222_d]FFFFFFFFFFFFFKuFƢ%tEXtdate:create2019-01-17T15:12:51-05:003%tEXtdate:modify2019-01-17T15:12:51-05:00B]IENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-task-filter-dialog.png000066400000000000000000000722101414302661500304420ustar00rootroot00000000000000PNG  IHDRQS?sBITOtEXtSoftwaregnome-screenshot> IDATxw\%aH$ PPVP_뮢ҡVպ'VmuTA NઊX`R2dq4Mr$F())aj B4BBXH !`!!D,$h B4BBXH !`!!D,$h FKO /^j|~Ľ_!|1c_`H;`2ʛ7tI(vJs̱D·x{{ӧOΝ;]]]E"݂ sя} ڹsg=Baǎ-Z$HtsMbC׮]/^l``8f''.]:tׯ_xu~77~!))޾ѣG2O6441b]|@ 8pUZZژ1cLMMCCCnsM&NHMxzz$%%u҅f~޽{=z066666!IrŊ111gΜDw155wss|s'F@jvԩ.\BBv[nׯ_ǎ㋋`ӦM[xѣpٳg;8;;wF{Ν;iӦ۷?xݻ'I Fhhŋ>|hjj:sLjyCCÓ'OXbʕ8qٳg&L0aBYY-ckXIIɘ1cf̘_ݻw#^)R}}:cccW\{\.p8L&Sww˗o/Y,@ :؋<~8-WeeL&ܹ3())ٳgOm a# 6ŋ{6440`5???ܹϟ?gXο:u3tЊA]ӧ :p8p)CCà Z&PrʡC* xDx/֭[bqqqѨ|֎5ff =B-  B4BBXH !`!!D,$h B4BBXH !`!!DF}M=Z=zs~C1_ѓ'OZU6 $I"IRPP]pƬ|,$բ"IhOc 9|>AkjbB4h{$P9lm%ZxI2dȇ==Rzz:fYYYoۭ[76vZ6fmmm߼+::fе0i$6EԩS\R޽{?~ҥKcǎ(VÓн{w>?` z%:::)))))SNзo_]jjj `iio``гgOe#FB.+WggΜxzzz ڵkvرc]^l𠦩ӤΝ{n---ݻwS]'N;vfpppMMMDDĥK_nii o$Ifff6hɒ%;:H$iiiڵw'M8?ϯ[nIIIeee&&&ʕ:ujܸq il!d2j?~իWT IR&r\.UVM6ZPdƎ;|HMMtW\`0ry-=zT5LoUn}jjj455,Yi&Ց:Qij;wŒd555wMKKKHH>FL&>zC:Իw0j~G I .ɉXZZ9rΎZQۗzR9Z"#B&&&2,;;G555'B0??ĈǏW}z,zUNP&~CnݺㅄdffRѭ[[n|ӧVqΝ;GꁞvRcC̓ 7'Ӎo;Gu1zŋ^v\جY&OLMM_x4g7747z9--mԩvvv7o~=/Aə&O,H @ (hjjiӦA8q`رkUWW_zͫ|Bbu2رcرYYY?6lݴiӉ'***UjO/?gΜVWy;wg.]dWW׿z:...OHHJ`顡/ETT߱cضmRzߍG~zcAɓz?"Zx{j!N( $Iqe:Ԝ' J56 ᧿ޭB-$DҤPd2Risnam<jl!54ZjmǍ6FAkxhז\rh B4BBXHр#%''s1}}}wwwPS!4nրoӻB#O&A}АAH= `TVVFEEd2l4qy{{[ZZqȑQ= E~~>>r^ (7޽{pܹyǎ[zPHNN3gNoo[[[xcVUUp$mֱcG}}}77xj~BBɔ)Sbcc Q/n޼ILMM-//WkA?^tÙLfttRRR_+][n˗:%6|7oZYY}Bo0VK ;T̖r]zzzz*"""33snnno._ۗ`=W^o.y%K2!Cرc]666-~ll޸q㬭嗦}zA!QT/xy_|aff}AxBjPHm۶9s8::x_r-;$--#F;v,77w477ߺuk&NSSRRΟ?檾ŋ'''+Djkbbnݺ={>y$66vʔ)1O#͡I{III:::qqq#GlN0a„ EEEopf___##?ys fҚjc4<j V !`!!D,$h B4BB}CkM:7n[lDrѺ>oIL]Otv@=>k_[z }8]cY`Ԛ5ŧ8qh$~lmhG,Jj3h{;$twS읋hlxĢq+ ՏB2eF~gHmFS?6Sݻw۷o\RBk r|NNN555Ͱ&D-ypja&TRD"庺GyܹslmhWS;cMfXv?ڟ{\tI.H}5U!ꦧWTT,_\[[{޼yblB4׬66_]vR~~~HHۢEL[?~$$鱧0uQvXK$xXl`rj$ 3<$ɹDzqI1 uH\'ꡝ`ɪ ϊY/qQAH]1ʵҥlbj.ryQ [g͚5_#GΛ7$ɒBA暟$HG'Up?Jَ& O@*Wis4$ ^W+g{YU~~eRFDNRf2>.zQ^S%Uħ t3{ Ӌ>)jW[#M0aӦM J&Lp/^ZWTHVft2cUR}0%28hQ\ګF7sʋ\n9=.>|&zFFejk23>DNWIbB[e?B_uQ$`0֭[D*N8q߾}/_d0_"AygVY V_[!>)f֞1|)Z8*,6p0yV\u3T@ʵ{Ebݞ-OV4T&xy꤅JԒRT*>}tƌ湹UUUGA, &ђZl7!$ Z$$ȯd_KI.&A5c3IjBA*H^UI<- Lpogk`3ΦfƾOp=X.u4 FhR;%DsOqMܡCzzzQQQ=gnG{ ST95A?F4cӞ#%&]v2܍!3fTTTDDOv&rKa_j8bƃ- U2c~]2T/mY2C&,$Bf':N$7aiӊ]b&uȖz~ZS# }jtLm=ؕ13G?G'Qo`ry&iwI2 hXLc ܞ^\^YYzDwmmmkH⪊]jii5GQ1P=?kG j`0@---kkkpX,ȅ4١@Ahii5BHM'B4BBXHр΋ eeߘ^: i)͔FPۆHj}N:o|uÆ ƍ&b֭6l8~ӧz=Hf͚s%''̟?ɓ't@]HoSYznr9PQL2e UEe˖ŋՋ`nݺת III)--p8ݻwhLO?khhKWWZ~ڴi}Vhhhnn/`K,quue0C ۷c` .`aaaj!Cݨw!qtu?7+AW6"ʲUYXX9rdϞ=BGNLkkk&BJJyҥKvbxMmgmmv}8Q ˑ$<~S57XU'"RSS===UʛԯH${>2##l"hŊG3ɉi|b)))Yڵ;Þ ŵ4ƔBmzڵuKLLD-2D,fң@k]!),$h B4BB>ۖ¿P+{$h B4BBXH(Q DL@xԺTTT^EEEA(lt0u9ܨ4ƱȫtEqz%do>ٳގ->>>PTT4rH]]]##ٳgdZjSg1fYJY Tjf* ?u]jD"oUVFI$gfff;w466vtt\`ۛlԣR,3IEO70j-zzzfgggdd@ll iMMM\/5 IDATٳ€aÆUUUYXXyzz޾}7$$$///++kܸqM:u˗:::l1c^reϞ=ʅ׮]y̙<MUV%&&޾};33T5"66^(޹sGCCՕ^XXHuGE Ʉq[tb \{lllEEݻw.\,$ooo AAAb-X@*޿lݺuذaǏg:::S޵|rHroܸYYY 7np8`ҥʅ#"".\f,YIdݻw… Y,իl!r.cjmS- G=2'ßļ|c>wlllbbb.^XYYy***+GG[ZZۺ>33m}U&\---e2`Ky`0,--/^(lSSSjZPDGG6 \nyy9I̸ֶܖԾT)H2R>w|| |||?r;w ˖-{QRRRNNNff&ǣ~SJXZZR'W! b2O·P(|5P(233۷oڵʢ(r5}}}GGGpqqdӪ@/@= INXNJb9)ݖQvD"ϬξS_#4G@RϞ=bqDD ^~}{KJJD"@ ]v)s(̊.!!!Ǐ߿D"xb[D}]n+4iRXXXjjD"YjD"ǯ]~?y$;KKˁ~iii֭6mm/ӧD= i_v@d< $q7^#[\ݲS͝Z X,u]K.S^^N,^8--K.:twyĉ|>ܹs]v=u͛H$ڿ=p{v:h /// 9$!!ԩ΢Ezjii:t@&)O(G$c˖-d4 r;iNQ5N_ņ.]bX xjP'(Pc޿o߾555D...o޴i'^EM?fIٳggeeihht-**dwXRծ]GP rXH !`!!D,$h Z #[zҾZ3#!D,$h B4BBF 0!`B4s(ԔzRaP-W׹녢|VN7ڿ12uQ,K+z_v Ined⳪I𪽟1-8 G 5MlllVZw> zԞ3hnf>VԃiKi_2_M= m3mIU_)Ii4fx>]H%dY㑚.^5ph[J@tQB+<@Ӊ }4hڝ5ǁ~I@tQB4!_MC=DLz@5 |/4%qZHk ҧ5a7"G;iNV>Qԁi09'4愅faEsR rXH !`!!D,$h Z-=Z3#!D,$h B4BBF 0!`B4sl%G/LFM 5zR/ %=tV.󍤳 ETK kҲ*XLDZZudnٲcTEq?\OO8|Y;U: ʏgƏ S~P(/T*l̒A~T:rВ3g~ z2| |&hh8х1Hta<+Wݿ?22J__?$$DP ciitRWW>}ԩS-,,#""S'occVȑ#\.رcnĈ'Ntuu޼yrQ=zU3hmzlfbxxѣGf͚اOW^kAAA +!… U!lKI׬Ychhعsgww8mm8L&S>ҥKǏ?qℏϹs炂z111IIIݻwOOOܹ(z9a/":{QL:M[[{ĉ7n yfҚ?joxF ڵkuw֭[|h m Sq7sTsn]vaنʛT~C?6mrssb,Ο?_oeX[[+Ɍ󵵵QaEi tW+!n-=z[0^.Ynݾ}c}( Ƞ((zR P#{/3ؠB{CQRRlmmΝ;gX,3+I&>|… r̙3Ǐ5z˗/}䶭QlfقDz͟9p}`Z7!1ǡ7QM 9`0DWj尐B4BBXH !{vl! Q !`!!D,$h B44 hi(#.Adff6XQQAmPRByýd8 =!՞G># '8v( ϟ2e nÆ -=.uz?kJ*)ި$M_ +7qggglAbbb de˖YYY|//wR*;vu&}}}/_/`ue^z]4djK OO쌌 p5ᡩ)˃={VXX0lذ* pSSӴ4OO۷oeee7NSN|RGGk{_3FGG'77ʕ+{Q.v3gyxxPoB(#0233KKKUHQSSsƍ.]ym;Y!QVgѡ|[Xm'&?Xrw]p@(q8`Tz~=.n:lذdzl~)Z|H$r7n7r8@l5""b…l6{ɒ%`ƛ "88]v3f̠DS!onrG8-mk˯>ke_=^ޱݻwxbee+WBꫯPzC%233]r_KHjiiFQAI\&f L&?~|zz3gIm E\u8 A*+cm0.\?3ܹ3,[ѣGIIITǫ7TҒ:j P(KKKB2BPdffRoH!^xqyARBXb9H+i%E'S`SW+bӳgOXA킼ׯ_OT@IIH$k׮"jYQQQqq1u3$$H$UUU/^l`"o߾֭\~z]&M KMMH$VH$ @J??Ǐkhh()RBR(/rIjrxK:ɗkb_䬓_?}0+0$E]WN}||˩ŋu#??CΝ;O8;wk׮Nڼy@ Doxw^׮] 奜`#G$$$(w,-ݻ%SF` ]t)>>>>>@[[[[[חWz(>WF`X, L@Wo۷1)'7)RI .6 a!!D,$h B4hǽl!ѮZ/#!D,$h B4BBF 0!`B4s(ԔzDbYLk!W[#.i-_ҏvE0FѾ}{6mnnZUUCSKQHP^Dgs5Ƭ2l2a7yy?#4 #;9dݖP6>}˗ϝ;w eq^ԣ7}@ߘtaHޠm¢305!M=F>>>"YYYGLNXt T2e?@VC8i4sx+W̟?_6I L$]fb ,ފUb׌1och{iK.MII9yQh>Ho"v+Ԇ,(Yw+.LKp#(ͩ4ٳgSi?TTT,X4&@EϞ=]3QPǖ.rBaAAQ6{$fř_%s6 z={0F$ɴF QHck2gC!Hk@&æ;| Ti7? KfOIxQDDDfffIIIll+QB֐g %/Kgv U{`t$e1 =Ff(444۵kvM>}Ĉ;v$4 /޹LsqL(PcaEsRv`EsBj09Z=,$h B4BBTK-=z !`!!D,$h B44 hi(#5Xe+9zd2 ?n̨ԣDy*uAdyuRySJDߔ$܊888]Ub L-[>JQk֬122 ĦvL= IQZg+uL|35nE=^-deMUI(~嗍_^*6rI BCC[Fّϟ?u@  u~ԣ8?p`s5\D/=dөI}m|Xr9\K[[VVV!!! }h`KK˥KNjaagooA=j=ٿ:vGqvvr...ǎf~w#F8q͛Wѣ= O>¢z?6?4:E~|w~Q''Yf'%%իWz0`@?`@pB`,6Rҽ{5kv=..N[[;..j-ɔtO8sܹ^z@LLLRRR;w<`x#رcf*++H$k֬N]F=HJ5.K/=Y69Y;IY?yF2uT777mm'fddlܸ[[[0͛un BKKK5Ieԩ`ǿyDDĨQ|}}544vEݽ{wvttu5N۷/^ ?:MgǾeX 9@AWU%azU:Y;I Y#II+\Z~?bN.CQRRlmmΝ;gϞX,zC)'Mt .3g?~| D5V\ѣ;wL6‚a`DHſ>+jg1EAyb˿*ϕ-ZTRRꪩ9sLe0Dbcc;w,+,,l镕q}gD{ݻw#9y}7o߾ub###[X,:'Qo}2ͩ؄ `?>FQP0B- EDЮ 7QM 9`0DWj尐B4BBXH !߃-=:0B4BBXH !`!!DL@F 0!9҇pww߽{ǬC 100z8" T~tmn1qqiS}0.Ο-ngVk޽7nܠ=lMӧO_zufff~jCpZgTz[jkJV&x|;;Azzz;v400033300ѩ$G7B3erDZDPܭm t-SlC*((wqq1k,33/^hjj>}v3gXYY]ӧ[ne;wзM*JKK}}}-[6sq8j1cVUU5Ju 'NP߳gW^N0_Oz|0O|G]k{r?GG,SZ.o<~gϞ;v젺ϟS{{{{$'""b…l6{ɒ%!ո(@W_1LggӧS󳲲6npj+VQtԩ7oo~~~VTM!1f,zNs]X\(M.SROHJf{nW_)[qذa!!!kmmM-`0,--srrkCqVVVʻ,--󵴴ͩԞ>L9jʔ)uJ}0) VT?ߙVr~ɝJ yFj*wwzc``iӦ7nYB2-BPdff@;B(fff*o*BX,JT/|8q" M$tQB*QL^r N5yq4+yr(w{ussׯ{ر,022ѡv#&M KMMH$VH$uJ| IDATV@DrwAD}]n+?s鼼Z u)W+b}1?䑖@|GA/vZ' l|>ڴi!!!ʻ8p޽]4ˋP(-ZdccckkyYy>RMh(c\i!uE5_T3Ri=Ι3GIP1bDKSH^#F϶"a!!D,$h B4BB}wo͵Z1#!D,$h B4BBF 0!`B4si &MD+GMD= )b"d<3٘ͫ/C:FI͌>EqeB HIIϴ:tk׮zs环 A/^TONN&H9'66 :MK!s{Xy/ܲ;e)0k$͒ 8u]&x mՐJX\P(Czzzl޼944466XÇ8qSBѥ7;'v1E^DoBcZ:xN X?gK&)$4.]۷jjjtttƎK-vZ(,,7n k3͛xQP#333LLLڵk7k֬J ⧟~rssyO?~\.\2$((hԚSӎcG!v`ױv ցxIN#WK~:uJOO… pessX$e2Ybb7|=zaQQј1c:z}=z_Psd2ٴiN8qU{{*OOOgϞݿ?==}޼yʇ_xիϞ= ?qWWWepww;wPQQQϟETޯQ1__vʯ?rT]>O0HgǏ\rʔ)TGUV><***""ZuTW^^NMPjymTHчv*` k_u8PvYxQOݻ|jGqqÇccc7mTXXx…JOOOC2KPjիWKKK@={VPPS(,S}j˥ڑSJKK\>Ӌ/R/_V3*)1Gc -)vvD9{ zI^VZؿgvϞ=9֣GUUU!\IʢX222z4Gʻt"}ovp H\N[JJ>S333###jZ9Ps]1Gk2 H%gܼB^K$kjnEU%3:s\anA85e7(~ӧk׮_N YXXxyy͙3dܹ>>>oF(͘1cÆ >>>W^E$sԩz?`0VXQUUucǎ)懇:t&IR,D"?xjPH P Y@1\9K7({/~eP#w4 )//*v֖ZZZZ{?~; 7R'~>}gN6m˖-gΜjkk>|Sz(պy6O4Q`DKQ 10~9BB4BBXH !`!!D,$hzG8C7L@o{$h B4BBXH(Q DL@xP6j3d2Ao6CjR$I|&]^i~6j 8D:&RjZ,#W\z(-V[O|tdnٲΞ=K*Rhx ջPw0nLm[d|k©Cuy̬2OK=((RTS%(Q m18:HKaat5eNºO>AP??kegӥ9=infLk>4/// ٩6ƌgnn~Сwww]PP@-1|pSSS矗¿3)lb^|I-O }>>>ݻw֭ۥKȑ#۷ozs̳gϞ2e 5rqFZLLҥK]]]<Ξ|f/PYXXQsݻ7x}>}tРA&&&u^Oz쑔vݑ$dvޟss/3f@JJX,ޱcF|&ܹsq}M>z 700Ç+H* 'O_ك ?w\{{{NN̑ Ɗ+m*::zҤI&LRvvv_}k3EFQUљ}u_MoMo*X)Qv r*cjM>  -vQߚ+UX͞SUU`0dW|1q@P䋱XF(//$+ /*1a„ŋ}ɓ'/_,222?++++󳱱9p#tt|񬕾lx삲4H$233 1*H[ l;;UӺW(Q1P \P(lhh eƷyiiT*%#7XMM-<<|߾}QleS,xȑбgϞ~͙3gJMq333 nS5[lK꣍ Ÿ腄,$oS#y.Kҹ-j) FhQe7ڂmH333񉊊Dm۶תaX,%Y:2wܓ'OFGGGDDȧ'$$K$'QIID")‘*++ټ jkkeZ ,b;wOp$~MQ괯9{;?k$N4Ʀ6Lbݪ4/mP&9r?4hѣe=DSS3++ROOoʕ rss ,[fƦӧs8]]]B^#Ky팮8p`XX->{Sjjݻ#""_CP^5 w0|R4>>^xoR(..>zK>!Q͆OS._\s V^^.bddKq GRR^%֓P.\@5PBA@r$#!$ H (4q6D}hJ @@r$#!$ H 5 AH Fz3U [fԩS{R1 W^C OG#cg-Ys磳' ?:٪bFħZtҡCAE[[˗/N4ʊB_^ٳ9sA9GP}}}P"\8um?@udX!~%]g!&4 IO 3 ӌ{28[2a„JH|ww6OOŋGFFݻcͯ\C?&&&&&FdRRRpppDyyyNNN JCiҤ˗#Hjey,}**wEfePf\&/3D {WpHNNp8K,R͓{Gѓ6R_~ill`000puu]~}}}}}}=!h/33x<ތ3l۷]Fќ1D-*H-[ww 4aC^h !߃y UUU,sssSF0X%ۇ ۼy3$dsrrzd2L?Q>??`|L`ȋMhkk0а_~KJBQXNDVILL\fͽ{BBBd~ 5 ]TPT`~uQ5r޽m} H GB H9Aȑ@@tl6 4"!$ H GB H9Aȑ@j 5 Ah&(,|bb|-#HxL>V: 'p~b >y>u!<$ /O$מ}XzVۼy36MZZ{FFF$ɪULMM544)0 F^D᡽4< l<߷_S^~;cuA0 9D2ޱcǀ.\xa" "7/..8~2###bqqq>}ƈ\mYn}]-"EԇpS05pl]/#dkjjD"QUU~+L~,KKK"P @Ս޻woF%$*H@P 6lذ}Ԏ/^SXX֖p”R>O\ /7fk,ܻ"+O:MMM/s8uuu.߂Ĝ?FH]WIn޼9ebgСDPDƈt#_266vǎ|>…cƌO?UWW-x #IDAT@RSSw%˺tRNNν{,--WZE$?^ $%%@LL֭[>7l\QQ>Op$IU6d^ftb t{f⪿MRwQӖqwgXbqp,YBR͛'_r֬Y...T*uܹFl :(BBB0 Yxqff,_1 Ǐ|8ת ,--XnBq'&133*j?eTJgn o߰S2}aSRAS{ɵy4L*ע[ro>{,::Z"ܹsg޽/((Jqqq'N>ooo!oޱͦ&XLLzLall<J}~G???OOϙ3gD(!!a^^^&L v5-Zrٳgl33[bPb5V-ݖy-x*k֬Z A@j2S;BA AOH GB H9Aȑ@@r$! "tЈ@r$#!$ H GB HQ $(@j 5D db;x5)bc mDQ҆2{=:؍UVUUU$:$y|,Fc\<&{6+0).IoI qŅ#t皓gjȤ~$Y$ ar&_rg͚>y(?Ul>$mJ,^QPAn'mC0umhDATuz0n*؁VVVRԒBbΝFFF+W fX׮]>OR+++ŋ% >}hii߿8 1ڱcǏ{.A/ ۣG08۷AddJFF-'*+0_\(l (&?~|Ϟ=VVVVVV--qmPG%⇗0:1~  ?Q("}^^SwRVG!ıd3mڴcBBѣG<޵kѣ####""eL?<_~Ν"`Ȑ!7nxݻ-Z$y…+WqܷQ(--]tijjjCCCiieYxǏ XХFbbCMF;rի 2&M4o޼b HMMM%/)~Ƀ_ť=lP okI[{11{k>>A*/G}kuJ>}?r]]]wYL2fkkkt___sss337$xwT*y @U'C{+~|CCqxЛfCEZZZ'OVPa///@sN55#G+ԨL{{{ מW 鎂kkk@(2 [N8 (//'q|@ rFbbb@@Bٽ{4K( YFԜ> 6Q@,n wI.KI %$CP¢eI??{>Kݺu̙3j'zzzfffĀS__/S(.. jjjM6UWW._0WTPȨD"tZ]uQ @)"U+$eLdI0~/KŭHkB XwY[[{xxnݑ#Gr>>>D֔)Sx<91c^ȢE ٳ رcŋܹP(\n]QQB!ys̙O>uuuMLL0L&ptuu 9wܒ%K7l0vXӧO?qÑJ=z]L 㲿ƍhy({Uke'-d~dffSN%''KG 7nT*qB\t Q 81V7. QN!pZYU GB _w[صC H GB Hϐ?Piz;@|w9FB H9Aȑ@@r$#!$Уd޵5dѻwo}vu t;Rqq1a*QAAQȺP566:99ufEqrr}wJBS:ut:yȺPzFR+U|dA(h >Fr]uш֙\.-QtK{{ڽ{(C?A>;֭[8v7H$ڲe?}[ZCk-PZH^#8^zőA"'$$lܸo^p}>]e)33b߾}nݒ/_|̘1.]"W\9iҤ3g:966Vz߾} %VTTXҞ˗/zzzcǎ=vO< rW^%Y[[oٲn޼ymmmDVii)Sc``0|p>xyyɓ Io2@#ō1bԨQqqqAJJJ|||NN͛Ǐ_]]M-Xŋ)))[l9{5iҤʮx{{Ę7Ι3g<<<,,,q\,UVV;vDneeƥK_~C88zh۷o?|pT*yԨQ666EEE7n())-7B ӑ={_8vQ3fp8ǽmmmO>^SRR"kחxnll,;&111##ct:-hѢRy91 ۼy{222̌,7U>}I$yi-SSS7o*W,wmB!mjY^^q%III7n?ׯ_ſKyy9jn߾}!DrÇ_fڽ{wzzzXXXOJHHO>]SSА6e|i޽qOHH |;onjaիA{{kךƌ#6l RÇe{~oFKz:4hK|||<<<_~ի\}?NpӧOxx~wBBB'ݫjQ(iӦ]166v֬Y8\sԨQϞ={Ն} ҁ]]CCӥ 211 .,,H<x{{ϛ7/44T!?O]]]lll-8::\Р  %==]p,^@mĦ܌.Jw :z2uJvRSSCPNS .twu[$[@{'hDBOw$6-J1 S:BJl6cGн#٩гeRHGGcG#Ya:::VVV~dA(H  H GB H9Aȑ@@r$#!$ H ?ELu/IENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-task-filter.png000066400000000000000000005244701414302661500272170ustar00rootroot00000000000000PNG  IHDR"gAMA a cHRMz&u0`:pQ<bKGDtIME -`IDATxw睶}q ;Q`-IlI&Ƙ_"XPFTD"Ez9}rz{3>3KccB J)!1F9encL3Y [{{[B!бBDQ$XZ(ou "8Iv$I'l͠JAܢct:$fl6YO!BP]]כt]/***,,ܿCxT;я.AMMMk744X,`ϛrl"2@=@  U秔B5J5k" 9lbٶm[yy%B!NGRͶ{|1++n/^2$ at]oo w\V511q֬YIIIs\(aN)ZHZfܹOݻK.6mTUC?5j(HDuI6B{7gΜw}(99k׮~t D"CӴ{nqqq͒$3dffv֭3k,YF&B!:m߉w%Ijjjy饗(K,\9sIysmm5\<'))iŌniɒ%uuu}:tO<ѹskcǎƮM3f\s5%55ohh:ujz)Ž;ӯZ*V6 㷿gϞyƌ޽=3{_ `^F?~|&!JUUu-YD{GQ\#G=: }!B臣uon߶mۯ+W6773g:W_}XVuܹ=PEEÇ^aɗ\r5klݺuȑ^aaa4ӏ)#??wɓA?~||K/I&r-?~ѼH$iW^}7mRh"z۽{}j=XUU_~G}0_~gϞ>oΜ9N<8nܸ_|AA!B|'pIzz'Gi(ּo=F"kKKKu]EVPXQr(f> PgϞ>=C)4 Z4Ƙ~ƍ{'w3p^c@LZD7sփ`RRң>ZZZO˲j=<]{n݂,ˡPhW]u#ȲiZ44 vB!tqw8:uZ_J͛73xݘXoM9V'7/Aï\.UUE yJi\\C (J,ˆa( 5MZ \|pڴiG4 B!Ninnn5-9:cR8~\{t3@~>`O[QE~j($/x&e%yUJi,oݺwGQ-!BE|"횦a;B!:h4zp8QB!: :m@!BtuB!oD!B!Bv8 B!B| !BKRSZU6]Gt|dX,b<262WgS˗j뉝$_uB ɑS18!.¯R1FBc |2g> iժͧ1C{~ZG%~̗.:z%|~[3c ؑcb_`ߗ5~ fD050?0'93cG6?aD">Ym99RB]k#p烀ZV0B9(;Dcц99 htՋw |\M"u>gEZGWQ~' |cĚGv\clEFcp0U%~$ҵ٘aUm1슝 i!YՠFH ɢL5! 2eGԨQm, Q8i9b6V'4F2:aH,$i xtdө3ݜNa:cOĀL"8e'0AhW=!ĩ8)a=JVYZvQCZV3ZXDbka`w WXkT#@$"d)1$~vgnݑ@o9ѻ<]*YzOQEs-LKDJըY-%0lԂ,!jć~8oƘ(uuu۶mknnNKK3 fBV5kjkk;w ,SJ#aNSUU.i$)gA5MKJJ"TWWݻb8P(TTT$˲fu}߾}ɂ TUUUTTx<tRJ +I....**xQF-^G8p`zz:Yn馛~錌 ՚t-Znذnwaҥ3gμ[.X //o՟Mv{bbW_}w˗7SEΝ;ia(Bw ­V!D dR{wb;$ÀDHUH<{v355 eeg)]ҔF)xWK^B(Qb u_#v߸:XUW N=c:@z]ٍnte+UCAUUY!@pa aH(*%$ɢ4 o"‚AcǾJD٠%&&2^RUE.32XNWk++EQ"Hl6]'SV7l6(,}>Arǎ1p0nXT] b ՇSl)-hKt)#FD$h}:XMU`F'ㅍ/l/"*3`Ġւn||hGR={wMU fHܦ7/ HEU>>*Y ߻&|bJ5zştS&sF/?mqwKf濺l{{)\Oj zM$]kTcX%MYEjŢ :R%ɇ1HJuzwn>E0`ވ.wjHI=IӜiռQAxk|¯ J4Y_UWe_ugϞ7xc٣G~Wx$Iadee `&%0<x)k(D ++aZ驧O=eɡ;wݺ %;w^*Z%|'{)` X,`HlZX(:ᠪJx 3sRjP7Hą 'LD+;-N6Edafœ@uJE L-[JA a>ݚF{2N6ca˗۷zI3-:ի;PyƚE7mV)C.=[)(Fak+SF+*UUʕRIؽ1f^^.,^,<(/Tk r®]M1b_~) j '}]uQcQuWR.]Voڿq߽ h EerQ=ZYXE뤜Ic:Pͯ.:]VXC: >t@5ԥ}{ۯ)ox2X) 0`.ŕlO۰1M/+JW|S̓C׿+{^yDA_=j7tھצH{sǛӆD7w5O /I6P=O{ &?/>oT,w5o9(u~w xSզxk|K_qoS˒/][Bl̑/Խ0$mȶmxtWoʿѩ. rS魂~37?CzԗxkjeOÞ419{rjRk^,n, tOowC,ўhU BG#78 ٳ+++_-Y'[.\Ȼi%Il߾=77G?ѠA}tBȚ5kছn9rԩSGbw}{cǎe+ r(zW>3 ^|ž}*r?SG=eʔcTUu8)))J>I&z322ꪙ3g~NӴok׮a<'N|vwJ!%2l0rҥaѺYY4/qG4+ΞHl ) ћn On݌uf463lfY, (,u9'`Pf ~QUh vG2*IdhE8tHڥB4'!#G^95@N]D5x"8j H}hq|\V&tB͓ۈD@ $&2) 4XB4S9#\,=8ڹ3ݴI1#t]QtvV+c !4Cc nykE"T߆ O{75f_:״Dkb=n/OzG{?ʋe+n~%HTz{ۿ{(mplЗN&%{P &NaH@ OJʼe-b!`zȃ]Q H-[L) SvJ-[Ϥ]ԸmXMq.ťQͩ8-ђ벯7Wm9*њ[qxrf U+scp}~yfۚ5 {wdKo}($nj'?)UVo,'ٓ@x%> jwBڸ㎇z(77fY&???--RjRJ#رc~PRRR]]-rl(/7|s뭷 UUU555tw{z᪪*HNN޸qʕ+nԤ(JJJ cݻ7%%e֭šP(''端ZlYJJ ^ү_ꂂӧ,]tĉӦM#L0!ǯZFѴ4I4M;X8LFǍӞ}ZY)K.7EE¿m$mCND`Tm$- ".B$$iiV-rmH=!\y1Ƽ罂u;vVԘ?{d#D{7ߔՖjؕ*>?\( ~{0(EJJ anPUiI0U+rs͖JKBZ$(C8LRS#ڷQU%֊ J!$=z^%?_ɡ|љ3-Dc@ AQ`Ji~1QdRP՘K 4 `,ȄԙԂ"cEɊ; !<!;"M5#z$ӕ1"Wujju;"Me_-Ȍm[/lc:7VmYξw^ɽ櫃_)ʎUkC 1D":d"*7v1דH1"[*ү:; Vj^ 14>X_\ڶ&I6ƘfhjWoٶjj^ջjӶm[) >x~YϺUA-H珋u]w'_Ҿ}@tg tUKvꚮQ&ۓw];FtgN z}wĥ$Aj 76 /xv?SzoڴzrgY$|Bh B/4i҄ V\iZMdɒh4z}Y, 2$++tfee:t뮻 ?쳮]?Yv;v{-[/3fLh4*E~qDxꫵ<|&N7l Y&buL^2y-[Ĝ:xKXm` d17bp^|^t`QUgbOlOuz$OH M{^~I%a=l-UD>I}($1]%&_͜Nc0 QBUAZ׏(ɪ Aadm4-Yb"KIÕWj[E`-&7Jl=%l`ÎW_]Y,,1Md .ظQR4IS^zIf&KJADQ ,%/!ϫz'v ք[B'{PA[\iCK\d T&ۓ{%:hmZ=9w ~)7-n*MNIwv'ݮ}GO{oJCC[kz-)_sUU#3F"* /07CvﺾS%-/]N=ޠ]oOIzF7TmUGb{߮*fcƎ=*sԸq(&Z/˾ld1Yc ѨS}t)S:8:Dʢ\[qO<5Cڒ:u[59grH X{K[Z`GkB+*Y;w=T&e[Q"Lu-_;àej#9Dk,ߔq߄N/:;S}9q9;wjT+zye+{g'}0!:jcpPdYv81%IOqkl6X$ hpDdYz^7)'8?sV m6&Id KJ h0HNAk;R 0QdE"`"0?v8(IqȂ a^C*/KiTUxljH}gEV+2Bx: cf#P:L0o$A8LaA(<Eݻ5k$EaAMҨA8LVyD@5v;u7jeU5kh2YQ Ai!ETx׵@6QcZK/ uBHDR\!-D^Q~s]A h=~կU@H B="y2Sv}^R BM&;;$,ʪ"* Hc]/bV(cIY>v /1"u.).pχGOw+nY˅]BBZ. !%B8u=##\!FO[/B)g"tJf À2J3>nsvNp={Ğ= Y>2Z32 I|YQhdT=RFHD|[̏͑[vB<'OyͰ}1fYWk%~!v!,x]=B!ɺG3 }[{|Q` 9$GԈFJ8хy}7&(Q=QNvSB:w;D0c%GuOoE&^)B!.Xҙ]F*(1pW BF!B#B!3U͂3eՀ gW ƾ xqI{܏=r6|7 oB]dEQ4AƘINoq^RӨ|lWA ^Ҝr櫒ek8lV,ɧN1#~A:pu=lQ;73yts0 ^$|7!FUBHss3VkJJuuu|NQG]]](:3BHNNMMM(JRR(|)A@cciJ夤$Ykkk#)m/v1ERE~Y s9yMr'8Fo7 Յz\.?<֜H$uB\.*//o1cSN|0ݖo PQQD'VE!γց(>/ eddO PRSS%I:ȻRt:O; mV[?^UUTUcǎZX||NZH%ğߖw[F E@˘Y|h%ދ," 0 R[ aq B˕cƣeK.|V EQ>|`પ*vWo oUsT/~I^Q.]DomߜP(t]-yeDkb,~IȾ}zuAN>@B]*Cj(hBVkYYj?GO&33pLJC 8|pZZԥ@>KvbSJjKNֹ1Bqf B;ZVɓ fo;nm zYYYBB(=ʜU)JFVyr04}9@ `fx~~%b86K6O{K, _I !.m>NhnNeY$3W863V}R({[5uu]?$9FU87ox{MeY4CN˛- '4 C@Ќ`0gK|SU^qM5!;BFHJ?žbhѧdAvΐR* M&ٶoI6MPFQw^~}NNΥ^ -Z2~xUUW\YVV6a„ܢuM0SN|/Zhiii~ieee׮]'Nϟ;zh>[uuҥKCФI?P(d'MVX1qD߬+WN6-))/2d8jժ &dggǞYo+| 4MX,[nxV|jm bRe'͜Z.z /^yf~em'싣7f͚5KQB)Zf3ivl$'a$G$>hd%9ݚ.?4,tvt,A \+ fMtc΍Ò..'1iT4tws:,X`b֬Y꒒~Xh_ lٲOSaa۫Wlx' Ø7oުUŐUV]vС ЩS^{;Ι3O",Z/l/R >dȐ3gZUV}pԉWI}X|oiݻ.]ZYYIٳg͛KKKy֭[yղe˪ !ׯ$),^G{Yly{MlrA~6 `w}Yl6aVu߾}+VXn(aRb6`X^xaܹG7l\3sz֭|ŋ?Í7RJWZŧ|ű<ζĶX[{)8o!PiTitήkH )xewOk<6PkPcRiUM`3&MzcD* ,a\  ViӦ]q O~?OƎ v/xMMݻ_aWXQVVzkjjǯ[oQjj*|$5*>>~„ ;v\~[(y9997x5kh׮] nwFF_~'H4ܹs||m 0`@0|ICCûa}YUUU]]v\ZZaVk u{}N~V)NO?}cO$khhPKX5ꡇڼyUΝt:}F˗dCPRR҂ ֮][WW7XVG!tQ:f~t({ח,Y2hР_:tFf/?h4EQ 6roRG"'x?O?NSUu„ r =֭[VkhNꌏF@1y-R߯iZ56};vlg<=zWLgv|"+&( .ɥJ+&XВ;w[j5KգM& ~~} d̉.E),2C7~g0wܴnA}?cƌ?OВ /bsssyy-[E裏Ξ={<ܤ1cxQF͛7n8xܷo; O?(UUUZV?I1pwy'''jFц]כsss/䒴]vٳ+,--]t9r$/ `0hZ}>\t F,Xrʾ+mXcx***[P9a6mƍ 6n^_~}ijj4m|>_!E:ma{YrE~? i.rtD 4dȐ[o599Ŗ0]zxʟ6jbce̙eee#FXb]^V3>|ԨQEEEwy `pԩ]t1 oB<-p8ܻw3fBx;b8z/#(34)9ks քj|ĩZRCb!`wpӫ_}rSt H`6b GÝz:b@| jH3|W>bŊ]vw6lP([b\s5W^yeUU՚5kuV__fD޿7|sǎ? BPbb޽{ۥK(,,7ni7|/))inn>߿͛Mܜz~a6l\sMbb";tgҮ]nڴaƍӦMf4 BP{ݺu={%\F뗒bJi$X,pfZy{0>0:pwҥ~\$J)rٳg>|ذa$L2vչ\;w|SL[lkM{ BgoQ=ʼ5|7_<vaĈC q\< L hllE,p899ټ *[D<(pt\*)Fm6]4Mə6mZ߾} iG!..hBByl4 ÉnňFařy 0Go p\mC1bSgv.PW^FC) { j *JUWmںP0XQE>;\Vu1f q`T6;N\7uVSSPPPЧOYy人>}>|X 3p={4hNs޽h;tC=xQ p8Ν;;ut-ȲF ,B;rÇn~]nFݿիWO2eԨQu=;; ZK~ru(666\.>@bbb ...;;;55wޙ)))G!CD첲2EQ:t萜-)v{EEE||e]O᚛y~hؔh4z=?u6,++k 4m޽\rɕW^/d%$$D &L:5)))==}sΙzX,>G?Gwuzz:{:}sa!~Sǝ1(JUUdffb`3J$}ewB+S/e)77Tk(~YYYGסEa0DQ,**ſ}>_ccc^^^]aX̟R$IDѼ((JEE4==,m ΄y=ᡤ$o+U2`!=$ 2c,"XD eTDYCZ&"zEBS,"@gfhA(`6O9r:po;eUe3>yD(C$1xK[/NB!Ύ#EzT?,KJJuuu:*NHHp:%X/CSm(IIIi /*Y]z S{W 08}re4ɝt݀<~`!=uuuLLLTg|Z=he_h ;I'E!FU&F?7e.]N8wј 08}B"v~&?xcV8[r|S9v(Ĺ0 C!k]3\EЀs-OU~1>Rq~..aB}̞7B!BϾ揿 y%^;!B!t.֯!AeYu =^tao%bVwOU qoEu-HVkH5?7syi:bGm3 M8QZ# 5[!f8ʧf؟ƶ|0ԱBEo ͸11_Z¿MUGQ@47/[SSG3Z'xB!BF4F |]5M#6X?0[@ `Zvg7/9s >}+&L ^{w}o߾6mlٺt7f~Gҁ>۶m8p 'Xfjzg-Z4gΜ.]>C|G}tÆ cǎ*--|0̙|7|lߧOSO}ݻwwGܹsy||x_m"HsscA3YYYOwnaԩm۶A?壪B>kN6mȐ!eeeǍÆ 2eʧ~o߾Yf{ҤI=\r͚50f̘{nٲe<9s<>>>>ߙӻwoUU>[os0dJSO=zjDs饗BK"fbbbRR_j/ 6;vlcccqq3g,..VŜCYYY֭8p #9#B߾}(ݺu<III7n8p(III| M:5&''3f/L2СC=Xee%/vZ؆ ͛sW^yw177zȑF%%%{xK~vvsssc[ y䑉'A뿪>SW_}5EQ$^}O>fA'|iӦO>dŚs=jjj> `p:uxw/Y_|qWyK|fA(**ڳg[o%US⇦>@U z}[ouZEٿv%K]vԨQ<.\{׬Y͟AJ !O?ܹ7|;SN6msfHG"9X>|?ƧO>3?lݺ?_x$I<_۷WVV|].ys\G~0zqw477X_׹+Wx}>÷v۲e̙k׮_W /ҥK{9bĈ^xaȐ!V={vyyQg̘sξ}^z׮]o7o^ ;^3[RRvڵO>xDc, |tJ?nݺ߿˗/={vEEСCꪞ={M쳟y>}&N /,\0 s=}YCCÕW^|Çlٲx└^[`ÇowygÆ \sUW]5bĈQFx㩭5 CU: IbILLljjjnnGˊct:~ssf8; !CD)|`0 vԉ1V[[+˲$Iy^Y;vȏx%''PUUVVVB !~?==bQm6[SSS0h4Z]](JccMKKZР:x<|>߯iZVVbi޽{y$ɳ D %p? f]VoIZq9v:K!tv}k5dGťZ1vVQ"uHnLUUkkk333ynzdYۨ~~wV[Sf{5Ճ6&e:8GcVܣ}8h:N2>/o"A`08q?=b!Uz?OH!${f3 !t։ƍ4h3TpA_Oo B}Q.FZyMN{% p0@u-A1(!.YyL{G~=!tvv^{IBpG :pEƌn:!:+m6gBX֯_^С0e5ls!:Q333!W?sxn B].B}H{A@Q\DBvGpf$B!~CB!!B#B!`B!P;;B!B!B#B!`B!P;;B!B!B#B!8pgQJc@)| !BE:ӔRA!OA1fN|ַB!:m'q'߿۶m`PӴ;wnݺUp8z 777CK{ ضm#B!tǝw?ss9/ήf͚իW?F{1EQ!?8G!BckJ)!d֭vz^uU 4o޻wEb !+W$驧jllܺu+_@B!.q0DQlV4޷oߡC@eg=x<HHHVB!Bw>bĈݻw^r޽ͣF_ңG;v+WfeezU\\\ZZZ^^ޥKh!B!tq'0|y>y޽{'$$iC}'srrn6`un׿uwdff4g ؅B!ڥ3,B1&ruuu|||bbY:3D"~y{Sbʨ@ !B]lTU41f鴤$55U$Ƙtµ ov-T<|&Abn?Px S.B!޵iիsrrN;-;!Čm ٹh41uܹA=H#B1֡C8wa8Ρb B!j.ݼ90 F0W!BK,= x(B!~0F!B!BvwB! B!j0pG!B!BvwB! B!j0pG!Bh#"t0 |] sˎD,Ⱦd˂`@Oؒ!.XF!@ğ[re?iI]YoB]0pG@VFI ad( qP0$ :B@ Ybm$>̚PXeXa# kȍA9j' QAu/B]0pGCiQTAnB?7?>! !MjEB?l#qpy$S0e)^Έ0o'qXGq u$@]"Ǫ3K/Kz&˱Z"f)۬ͩ;YT#~B„ft dJBdDA Gi@H- "H|$DȂBDjYk R e!Ѕ !tS,1';:yB7')'9!)amʭcNbޓY F!t;^!7773  677r̛Ѩ{BSjN)a޼yVx<Çw:3gҥK=>|]w}77n|y7>cǎYfnqB|B߫c! tBD`{B}iǝ߿??OE@Ǚ@(3!#~mٲB7vgyfҤIvx%gB!!y2Nս~ w#A B]hǝB)o~sYǧOu]7nܞ={?:_ "կڃ>t:N{K8(7:B$jP(1]]ta3?F 2JQF)cJ5 0`Q(eRJ5` 5Ԩ1 f^~==J 1j/_">Ht&1oN 0Ǐ7n/ w_l\7~olmk $I XxFUR,  .pCkdb (VPAȩ f#ybY (2vEA R(dX|O 3,-_"D!t"MMMe:>>>11ь)Bb<:7g0xM7c3pJTqGm(Y~8K P{쌌 ;555YYY1 avIIIjj$IxSGY30 ueiw&ʨ;:p+/ˠ1fMos膮)**P!"0*0!(PZ VG'lo#膮+("(DHP0mMӵЀgO B`7k*?lhL5W, n~r@fDbj))(*BgwO?ac'Zu!p17bBg1i7|wo( !}E{97"Yfvm>O>֭F!BEm;;;{׮]˲ pO>_lr(//WZRk/^\TTlP SnB![=hL^&M$&&0bl6ظq֭[7}􆆆dY޷o#<2mڴz[og!A #xB!.It&1oN+;pZZ!0 >}zeeeRRggg\ `ZUhNHH,uL ̼A!B?L'㞔d1&bǎyv+(J\\Yj#Prw/3 "cnC!BP0?IIIr:FVk#4€0 jT۵{$è!B+]UU=H'8!O22H/gמ#B!tv| cS SB# (CQ0XDv.B}{`<N.IR9B!E  B!t3pgB***>h4:qĸ~[nAѣG\veF?ÚK/t| {B!jc_9!$|w~=''W_B9MG!B="Dh4뺮<v;GdɒhSN}!C,^wٰaí $.\0Ԥ@K4x7!}`D#\ 0(0 *!c$ f00 y:.rJ5f#cUe{|߿Q PJ;w=:77 taСp>k2-eDQVD "0ADD  DQ$@p " EQ$$ϼGì;%6?wРAc-ۓ&LWt2tP5V(>_ BF] P* GYPgUoQ9a9[Be_,T 8Q^cl„ fvW1 ;֒9Y-UQʺ_4 B{"![(e )²/(t5Nmނ;B2&G)N|duw'Bi:ǀPsλ^ET~s:Жۍ9C p꣏v[nNb;B}wm#"xj3n{ͩ `;BKtwD!`B! B!j0pG!B!BvwB! B!j0pG!B!BvwB! B!j B\ ea@F(PՂ>Bƿ]=Q3ƀ ?DH3W!bP"!xЩ! -$fbsT՘/r2+B3Ǝ?c@ ۵\BJgq |7 bc^}' ]7")t\iV8IAcB͓0Vk,/t'o;"&tδҥE1nBEI6XM8*(B{nҡ\"gMc2CZ}YLYp̞{1¼2lPߪY^}Y9ݦC!J׊Dޠo^ _BAo;~ Ji4 0 h{{b#Ѕh-&.dD-")*,i#rDI2wѮIR$bCn Jzp8I 9F.(NIvz qI*`'  D@r q;Iʷ[B?x'Ij,0 1:cG꼻t?TNw1f6R*b%Nz›P0 (3PeAA3tg=ǝ00 t 823@+a`-1@Xy2c_`<`y̥0vG!`3_PJ;vhFˆaq0dYfI'\(TsN Qk  pJA?B]x /B`0aYCPfff^^ 'A=< !(  <ȣv>'إDQdYfPPP0o޼f8hBa#đY9'o|9zF0s^s?BJn/-->}nZp;v߿Сh477WӴ:|]tinn~g{!Cl۶lɼKtHdёHdƍ{|Y'%%?G{w!йW0@%@ 0(kfra|coGBnC :0%An %#17_ 0F `:3DCR% PQ2C1W!{o^zBU=<޲eˋ/j˿ooԔ֣GInW^K/?~v]w|֭[bbٷo_||<`Ƙ1c.V/ݺ1@$"a: #taAA~^)tQȬ(9>렩 N P(2Q`LPT<R*J"袘[ dz&ұ"}NQšA" Iʨ Zy=`DH^y(U Q\E?5:$D IelOIoJwwYE)j1L~G1 1F3=_!iڤIh hկ b;w2dȦM:utW@[o-//_f޽{rrru6k֬]F"Cp K,k !V*--}g-[m۶͛7ϙ3OSFFFssi/mN GUDЅ v [%ܹB\(KB8,hT^1P,QK$,#B(ȌiaYUCQ{"JaK8IFD=NiQYD(iVeYF&aQ~C{0U]7)S&@Xi"~4bcJ xB1£3:0$I$I-Gijjvi*IjÆ [~,w87nڵkccc m6[jj媬ٳ֭[SQQ ]tz={ BX,;v$%%eddztPS$W_e+5a@ƀ`=dWG~N}5@jfᤰ XIR']UI7$ba@!"nwlBUHP{0V:dJ3=뺮*r!"*vx.X'Cea^G,~Xs@҈@]`D T"@$b2|#*` 0!BDh16¨!Pf0@b.wsE"L %BD*SQR? Dp B qFylFlVYۑfG^|c?{|[2vcaQFEo]EË㘩]0 p! !L82~{nd0o^%c'cGFc-Ea0FTKc _(0N@$$1bA8ԧ!v؉ց;B!Bݓ!t8L!.ҙ!L[Vs:BgwHPJ:9p$I;]ױ!/qGG@!~a;B]<#^u!<"oNE!B#B!q.dfiݐh|cpv*fA B?8p$]+R^]e醜<6ا (q^wB!΅3ƪC,IRbbjFxk&b\\ g퉉nj !~ ɲ,bmmm4=UBGRR|t@B#mq7NGMa0Ah@&ruufKNN4->64 c0$s20^(~/byy.+..ճ+beeaHF;v?u:nA+ !UVVRJ;t`9zJJ٪cͬa (?Z}? "t]o5)}B!tmh >>B' AKLg0;Ęi<MHHQK0I|6Cyxa3H b;>prr($AKya$6@[[sss-,pB(Rs{@o;!DP($b1S,<|,ddd\B+FNH$bZE1\5j3Jiϒ1fJKKUUu;ܷR37\ICn-p8c? Tbz<ϧzFF,h("BA0̵0 ,~Bͣ9s\2!!!99f\.[onfn].f{g# VUu|W_B r$I*--}ǎkZUU`ٜN'x<_FF (~MY:|yEQZλ@JJj}>>Ȳ|t,{ޮ]$%%%&&F ;wu(NnBNvv$Ipg;vlBBB$l󟉉yyy.K円3gv=[aZc.K4"QBhS #e˖\s5(~ᇄ+R/2?~˖-[n6mclٲeSL1 =zѣGvm۶]{;#FX~}N*++gۻvz+R/"c<ФF?}>~Ot]?xceffBUi(..+ny222Mm۶R 7,^O>yꩧv_ݹs)Sx<UUNJ)]dW\qI&c<4-++0c)3/;;{РA^:u*(o۷hٲe#Fҥ5 YM6mܸqڴiק._|̘1k׮OUW]e^8?B!t!j#1֭[;vg+Wxd$ʪ3gNMM /лw={$Mjjjh4e^\\\SS2n+((;vs~UQQZ,EUWWϜ93_r\KJJ̙ӹs7xJdfϞm۶7ݻWQԹ{Xwe%%%$n躮(˗CӴ'xr}˗/?;DQ|W;v옝z.]ϟq 6~GMMM~|vݻo/L˟xGyd[o=xM_{N:=䓍=ڵkSRR:vsBrhyd`0}vgϞ7o~wӟ~7Ο??kwmZ51fX>fΜyw;I-[6nܸ믿NEsϥ:Ʒzᥗ^ڵG}gϞ@ `X-[t:)IIIYYY/bnn;SsNt: fϞ/}7n|ꩧm۶zO>dݺuݻw2#B:p!?IIO?yZ#FmXxy"JNE>|xnnn8" ꫧNzu]z饼Zϣ뮻n„ n?:u;t0yɓ'744X=ztرW)))q݂ \S;^{mϞ=/_^__`}z ;믟|snݚ|rp8t]hT@ zh}}}ZZ޽{gz&4iҭުMvܶg@UUѣEQ\r1crrr~ȑ#cxG"*pጌ*+++ B!5jTbbb4>|x׮]N)SDQsUk;&N>Ek_ x^X~=(vzwMIDAT3hРF9 ZP(TYYٵkWM^{:Z:^4mذa'.^x߿b`BKr1IWXXrFt:׭[]nڴX__(ݻw=l0]1.._~cOut֭o߾;w,**7nf;tP=ḸΝ;dee555\VVrssӹs犊~{+ |U>t$I ;wVEQ5*../HKK1bĞ={y={ZJQ|۝o6Ɇa477~.] 0߫zVm?TQ򆆆=zp*CxUUm6[ee%c,333z]UUuСѣGo޼'455 |AM$,))juԉUWWwܹi͚5_r%N4//OӴ-[@VV;wI233w{UUHK.֭߿vv}233>ܽ{رK.()) B:u*((2dnݚ;pj!j:1# oX,Hciƫ[DQJnZt'8;B!yfߋP($I(;?` ^7;;[Uc;*ZecNj,,B[N3e˖kax#+dY9Nsh4ʿnUU- hpKʘ B0јNw@P,˼]]j't<'ù؂B]k|݊3jqCﶜmou{1 WZFb:+ 2*B!.n8po/Q{oo{+geWݽN B!tJ9|7bwi{ogw?!=tR,cB!,mV!BcG5-(I`f]9I0(fs8uNr)Q}> 1Ʌ|YsVKk^mjjJHH86m^h(͊"~]Ahll-0%\Q绥!EG;vRYYxOjxg8:!g[|V?f usl#sV#ݘc}_.Izqy|{@媪*BH{s^>+}WUW'#ALn>V/ͷ]4s MӠ%XhFSN#!j osmO>) UUf#Y֝;w׏=BBi<.Z_~;v WUe(6m|̉'a ̙ݻ?r ֫W7u]EEEK.5M3 j ÉcƌIMMEK oWUU+裏n~JCyqTUU|=alw}w͚5Pr]uUSL+wŋ !կxN?#1oa+۷oV^=pM6[C?LSRRVVgw}ɲ^AXfMssW\FV+hzg4MZfnXTUs0\.מ={yĸxpjXt]Wb&{ׯ_^za[1Xp!\y5^{oeOwBAl?[o5o޼]wΎ^0¹s禧 8b jg{awiKEi6&ļ1n-{EDQ^QTT첽:%o7a)939dճf hll,**277߶m۴iD"Quu5BH$`+ro?pmJKKN<P]]ŋ/^H&MdjjJ&#rssKѺw~uR9uTFJe]]ݲe.]TPP@R$vJ&M֭ۆ 6l@$:T[[ާOG 6d2ǏN6MPg1cC~zǏ'HeeeSN 駟4? J?2M\^ORsssoܸ[nX,OO3gh4ӧ?xBtm111ϟ?ׯNjR| t j֭۷okڡC:thȐ!_NII5jƍtNp֭Ey{{+ wo ^*))166~arr2D5jT^^^ff~t577ӧw`\ ɀqm$̏rgmm҂q?*@!yyy:uӧOKK{sssNNβe˼^0QJX,LEEE{8q]\r֭WTTܹsRt?u֧OѣGT^z=x **jEEEw8qݻ󭬬"##osZ,F`L766rwޝ2ewiiɓ'8qDLWAF {n:߿5f̘xP1ԶJRRIbbsuF ?z{{kݻw;;;kӧo߾L&/]`>>G3gΖ-[,-- ֬YɓpgggwwwTM݇",+77̬wާO6mZDDپ}͛/vǁ8r^g2zaC5ǝL&>}TwܯOqu[[۲rP:sL4pu:LJYBV+J8Ft:KK.]8;;;::|T*J9L&h4+WӦM5kJ511RUUUJ0Pd2lmmRBNKN-|r@ DϏ jjjp8k֬/((puumjjP(2 EQ0 0h SSӄhFYZZb]mBɓ0 HPBMMMt:FR}gwVTs5TU&.ZH,[YY]~_ׯD0f 899rhJO`L'>p\S* ;1lll8p3JT*  {X3^;::7H=>T(&MZv@ vqqYhP(8q"yeX0NI$4vLjZccS>|P.#h4ZZZڵk F@@@PPн{8 |BMHHxQ>}8T*C|b!5JZdP(ܱcٳǾ;љBI(Ο?_"|@WkVe2򋅅lfX 3&&?{JKKL&\j###:`??SI///>R'E Hz5˗}暘p8ؔ [ vf}||pL+[:NR) lf2`+s"~8pG{2Hliißc_KK z@$\.2L~t;(Sd2SSS:$]+++r9B fmpaV>*ȨF&YYYtpAx'$F HdaaA"j\.,f%zs\L!sZH$ò]h;a"H$]}}=NgX{QT"ҒF@AUVV0̵kFFF4x2_--- dxOǃO9PPލ0x35.3Fv U{lhll"Sh Y8pFrkkkz{cccCCM{ T*ڟ3HZ3Ho{@S6*JPldFFFy'NizARE"Q"@̑JcǂH$JRGŁ88vvvVo8e~EOK,[[[?g2L"`f5p7?EAMc- "u`u:]CC4)hVQ KD}ȐLә*NCHÁ?[=@D3U Huuufff*WW8pq;6Sv`mhΐ ~͏U,J1f'X+R!OL/3ٿ`[Hdll ?8p4MMM͇'Z;mn% ηKYj۔'f 61|}Ͼm[bnzO}|熵[vmN-[;e!@8|;u:NGTܹĉO 8~ĉϟbLVE`2XcBǎ/;wj|9...*sFe2YssKf̘!?C]h_WhlcccBBo8m?=goopY[[;m߾}wE*8pўi="$J!SLyqccV=yl\.F:ukD"Q="##ZիWΜ9sȑm۶}djj=cƌ^zd3uԘ&577;v#G"""رc4yIII#F`2vB,UC 8Ȯt:&888ܹɓ'W\ɑdh)@Jd2Fݻ,0::W\QT;w|CqqϓlѣGo߾`0vܙTSSvՀ7ojjGGG:~O:;;p .|;vtرc&&&uuuRtݺu$Phjjw]__߳gtӧOwѣG{xbx˖-FFF{u떷wmm뛛lvVVVEEEII dzaSN=}4˭9s L ϟ=z4(8p|:t:]SS4T*511~ϯ6lÇu:]UU՞={Z1/"(44f3QFyÃ@ 899#D<<}6ܼSNwqvv8p_~Oܥ C---ϟ?ojj:r^p7ťO>cƌ9rHhhĉ8РT*Ljy<^ssP(tEEEk׮;vpTq8px'Z;n666n޼y̙ oo޼Go}PYYٞ={,X`ggV7nثWP*ZWWD6d.> [l9s'BD"a+n\z!S!t֭_~]}K.jjjzͩS/_nll ~pllg}}{痔DEEׯgپ<@u}޼yW\A ѣG+[nJ 555ÇPK.֒H{-[ܾ}[GGGھ~Z744(]>ydԩw)***--9r$IPq^>|=PأG?eH!HÇONN622žiiiAAAǎ )B*R(S777\^^^N&=<<.^(8ĉ?~liiY[[۹sg^_TT4}>obb2`wy/hllLMM !!!2 b"HTYYIP!dnnjjT*U(LOфBJ6jڦ&:.Jb1aFYHVdliSSCq:bPrt:l\|JxT*,񌌌 F}}=@r譀 LL&d2Babbgh,VWW;88t:JT*hAP[L] B*`0@dSh&WT*SE@0X| OCCB177oiiQ(D"QR|333d2>ollfJL&P:@Wؖ x\`aaph4h4  ( +`m---! !haƔd!Z-rN;rKKKxl&z_m8pjz *>9s;f*i$hPՖegΜ8q߭9wT t5?˗U*Bӧ߭;VVV\8pFrps YԆvO[%#JR.,as"D"T>=w6}m@[\I GAq}E2bQQrkq;p?@inncSD^DGVFROR Ϋh4#jD)mR1vq`[ d2q 8p?F{Ha>h4w~4 rRih| uk7^ OjLP 1\Ҷpyޢm ! 5LE)1i[vH޶)Bjņ |~aaR|R:Kl>33S$1<ּyCjxzma'd&$+)))))Ao*W8ph&vw…ٳg/_@ 8qb剉ݻw YfYF>}t޼y+,,W1Mmm~zjԾwj~iٲe!qYfEEE!ݻ7j(\DŽ ^x!_x!tСٳgoݺURA)%%%K,YpB?-[BG?֭[e2YEEƍׯ_*J/_tұcJ7n̟?ժU `=oh$ Qݻ~:BXxاa&>99ҥKmh;:XrX,>}taa!F+o6"@ yСC0 -j$ذ_ !ÇF 2rBAⲳ PPPpyq?ygF]"j&9iҤ&J=nܸ6nݺq\6=y7o s΍3322r˖-#FHRfY,B2dȇIN"t:'554<<#Ft^^^cǎݺukhhqq1@#gΜ֭iLLd2˝4iL3B(>>7{>rȡCN:흙iii9uT333aggѣGGFFggg7n˖-+W,)) J!&jkk;w|Dliiy༼SNADC]rÇMMMǎ#ɮ6mzayyg}d2X,666&>™Ǐ711y-[ V^^A_6d~tkkk&O*`>##Ν;W.޾o߾$..Gƍ (//?s̚5kLLLΟ?7vXGl0@ZjƌڵkDbϞ=[ӧOqM0aРAcƌkPm۶o߾}ԨQ'N<|pUU~{//Ç1b|>K.WƎ۵k1cFÇTj?~]ZZzu1իw}gccsС%KL6MR(իWXqǿPc@lݺu,wʔ)!L)h򋵵\._n]߾}inn^hQ"޶mٳ]]]Bd2>;H$˗_|rJ $%%={fɿK]]{Utt+X,?QvuΝ/_>}F]vW^?/Eu~u|`o=ZT޼yȑ#-!zjggYfYXXxxxX"$$dРAs={K H$ƍp8d2Y,[XXH$a(-]ӳ"VVVHT'߿/JA3G888b:NRBKd2CN q@g /_fee:ukԩፍzذa˗CBB""";NW^^ᑑQQQѫWW>}4((hw%Ǐtɓ'|ٳsssw!CFw̙3 ױcǺvjaaqA>tw 1Yq 8p;=TwGNDbllLU*L&P(P(j`3Hw^;j"@ @I2L ڪT*\9|@8 ,rFQ*P** tZ622"Burq'Ɇz^,6 2LTB T*h4`83TRJl6E"BrZ-@@R}u:˕bĄJ9szjZ$d>BCx<fmJRp8>wN'a C$|^777GI$1q!UU3LE4440LD@@јL& ##ZP NNN4_mX NX,>+ZFawl[]]miiIRU*X,fX`1P`0t:\.7555 `0CH *ҖR1&E"1H$H$ tcaAb!J%|XBM0v:`0B!Hlճ8pիGN}{r@ igΐ sA{ˠ---:,bǏ+nooQm?gcc#`Nѣ"`aag, qǁ8h4v 566vP|wH$H48bUooo&'{ < ՜D"M2E$^>{JӪ& > յ5ڎRmwӆtD 2L*b&???hjkkWr\4X,Fw.iusۜ&xg[8ph4XL$L&T|U@ aAfYQT?ZWVXO4,(vl!!S`[1bCGUxVt:|x`t:Z"؞V 0q0pB` 8 "H&A k B!PT2LRnܒ\ӵyd2lxJ'rTuQH28pq;;V e n \V !b  4jr jD@UD $@W.d2,((z' 24Άq[0%0aX,wĜ !sssHjέV>|RPa=vgϞ B7ԿXa)$ֿT.gee2/j3[J 5@LX=:.++ :8p &v`K#GYիݻwO0!tyXBV-X`޼y:'˗/߼y3gjS[[7,_ga`?ҥKy<^KK̙3AŲyƍs=vBݻ#Fw4^*92ܶm[bb"B۰aBR /^t[n!ݻdɒ 6 8hѢݻwd[nܸ199Y*YfʕFJׯ_3gڵk!f*fz"10Vw DZ]]x;P1/s3F2Ao?D BRR҅  C``~aѢE+W,,,3:B?~c\#+۶m$7)Bƍo@a)8NGsss 4ͩS_8Z=/K$Zmcccll矧x<\3f̘㓜 fff_|ŝ;wBa߾}ϝ;7|}"@ϑfs8ss!C|wDӡ>eee@qĈzK.cǎݱcG=ˉDB̙3EEEΝ:ujXXB⌌B.]3fLTTT޽O8q3gx{{geeqɓ'fgggee5*22SNEEE ZreTTTVVV^^^}g2 ŋ]t9pH$|rZZ=~xnnnPPPff3g^zo߾W&%%ן8q!nݺQFFaz'b$<==qd Cϟ߿?--ɓ=8p sAw2L6mt#Gt*gg;vt֍D"WKKK߼y Դ(888##9s&666##ɓ>vZllGYY/vٳĔ&ikk euTa~ڵ71 <}^^^"hƍϞ=jC ~?vXss֭[L&_^|icc믿xyy%$$\vM&ڵ e׮]d2ˋB8p ;;`\r~իŋI$RUUUyyѣGj֭[_xy___8p qP]]]UU5vǏU*rttt|H$ׯFSIIISNmiiy7|>tzvС!sssșN[YY{{{!W^5jD"177322V\R322B=zݻwի#""X,ԩSi4K߾}׭[# 4>}{f0 Ly{{ÇGee%BիW{7oܼys~?~Ւ)StիW+WLNN>w1h$ ?:[:zٳ###AYYYW'U^>G&L .++;w͛ccc|~pp .^:BQTbŊE544|~~~?wСC+&߶m۔)SN:eggiӦ3gTTTds ŋ߿РA{%  A4<<ϯ?...fϞ=ڵѣ###w5uŋ ƍ'Z;ym۶m޼yFFF>>>&L|-rd͚5ٳgrrrvv mmgsttDo ppKBEܸqCV7nΜ9---YYYΝ[byEǏ3fݷnzeIIItt4JvZHH_ݥKO"曄+**oe˖q8T_˗Offf^^^˗/ ߿ccc@hRtĉ,ΎḺBypb;ހx0Db@ӓ@ L4iBD8FUR ĕ Lh4 @@$ 5yÆ ٳݻt:ǃ] .*JӕJ%ԩ0TPH$T*SSӕ+Wn޼Ąd2Nf #jюh4t:JlNB aZ-䧟~211d+ vӣ7NDDĢE ye˖9rSNfff+Nh4MMM-,,LMMa2*#J5k***i4ȑ#vرsݺu<.\huuuǏ1b݇ h4 f755ٳ'''L&`-2!&zꪪ:k |999ݺǔ.))qww2eJ߾}AXX]~K~g^_\\ŋ޽{'&&߿ƍT*uĉ/^|xӦMʼnd2gϞN vuuŁ<Ot9##cԩ/JP@R鬬|رc\rÇϏ=ZRH߿={,,,LKK P(/_qL޽[,Xp#FXYY6 6>rHnnkeeeHHD$w8pPe9UȈJC2JT*"uDPX,_/Jt:L5dVVjh73XTdLlD 3 l'r\RX,cn@ imMLLH$~w!p4XM Of1?cSb~DaMGZ)`1N㠷!Ubr '6(JRRbYV_3uvj]n`FjK*x:@ w}36p Nh0qohhhnnvrrNXm38La V!X,WU :| ڶmo[H$TY, I@1χ+gC BV?"&BA;9PH$P(t:Pť ޶VDV6}~!ܪ[li;ֶȤU78pсj g J;nx\.m|OHdD"Ld2䫱jaS0ЁL૨T*ssO ennh0qtCGӋjt:ݧDl2@0333Lб6|a wR*WWV ;oh?g0y)*ϞD@G17&`m;;;;@tu[]x-a'?}~Q-.JP(Ϋj&G^rv|tہ'3/J5d1tmI$F g_P8:$B`PDs Ӑ"!'66B4!F[Boara)S ~V JXV"H(BzDt:X,Xu\vҰ,a8w 8kpٳg ӁsEY'x?†C솆n6>}9~zgA3agcx!$JSRR~4Ķm mYAy"Fh|; :.㺺|͚5$PBF} }tn+Wb'''J%bcc=;t@ ҥСCwQWW7}t&7a„CD"__Ço۶ML6 I"hР#Ft_555|r=??6eG---B!DΞ=۵kWxdX,x]tjСb/[lRIKK#zuիWX,KKiӦQT''Alذ!))L&T*EDD0 GGW^Om$44ŋEEE48,,o޼yt:}۶m}ʺvZuuKJJ~״gZZZ\D"yD?y/2tPJ%ɦMV[[s [\թSA?Bܹ׷eӧOKrrrϝ;h.]f|ЫW4MXXXΝ{:;;wĉnnn}٘1c ECCÏ?hiiYUUdMMMse0]\\rrrT*@ Xzuqqq݇ r0 KK}}:zJ=|p׮]&Mvrrڵkׅ JKKe2ڵk333v=>ߵkΝ;k֬*--eX`2zҥ@ xEJJ/,--{=bĈ!CܹB8pjʕo߆E˗//__~611={grrr$ɕ+WT+ -h4<:AQ%%%JJJBbW^SLrJ׮]G\XX(ɊN 6^z599yo޼ N+J*cǎׯ_"\\\>#F(**rqq&h Lxx<4W^yK.~~~ȀO>}CUUՐ!C"## ᄏr劗רQk@͛ӳj͚5O>|.] }dll!'M~0NDݺul63:5Z$-YֶdС 94<..4M"%%%^:44MfoooggF"LdSSS@rÇ*aÆ֩[Qz…;vX`x-Lu/^G6-%%̙37nPT#F9s& ϟ_r%FŋnjgϞ7o啖>}B\z500pɝ;wBueڴi/^D566yfȐ!%KXYY) l>N/^=sLbŊ={{ϟ(J'M`0L͆_,8ԟk)mT*@ ɓ'8p& Fp?0֭[G".\R0Ixbd3se2B` ^_5_}NRW\qwr `h40Fۂ@尡DVcoor!R0wr1V ih4!+++.bNNNL& !`0d2Yeee^^^AAWJJJ"##gϞgΝ {gvppXpacc#3fjT*B5>1`/8Bb0N2i 7l)ͶAo׋U*9bi...L&N+ 5keaaa~~W^|r* Z-t޼yظe˖YfX, py<%@X6"LMMׯ__\\믿"!|ШQN_}F۲eٳ&\__!CL>}ڵ?ѣmmm=ZRRrĉ+W?~\ >|zyFFۺuD"4h2pN@\QFƍ=z`2aaa8p`AAABBON9hѢy=}$ ښ@ kbjj:zC8p܈P[Fs۷/Z0arSLٷo\.p8 ѣGcǎ;wGtK.tuҤI;v7o̽pƍ#1cܹd23\ww]mܸ1$$dj:~ȑo~B(44ӧrFFF`aafãǍN&\.BʊBlSN|eyxx͙3'$$dʔ)3gθq㜜 vDb?$ $;;;&9tpJeeeݼyɩx/_t֭ӧOϝ;7>>>--m9[[[3fbd2KKKW^Çٳ4!!!Uo߾Ç/\LV=vY__߷o_D{]v={;wi4 DbX`5l0PlccpF nNgdd윓3sL 477NNN^dICCC\\\KKW_}nݺ9sL>n@TSSSRRbjj $͛7R)޽{#Z7B˅~A|||ZZZt: Kg;::l6|EDD?z&<<|}Nҥ HpR466޾}{eeĉKJJoݺC_|hhhpuuٳ… 6f̘d*曬={B8/~!tҖ'Ndff6/{ 90 _UU@vo58p&S}}X,"8;6[DTR(.jF\.%iXbd2@`kk [uEl L&MLLBjC":P("`k捐AlW@@!7HR X`^ rv`GI!yg0pA\P@#Gd9s;>'L >as^E^p,d2rzTq 2m`ކp`Jdbא+ "B0G itzSSSyy9Vzyy؀nDF`T¢ށ>jeV[ LME@ a9` ?%---44nllByy=98Ʀ9C2qG㎽9$իWGd2nv^offg4llld00Qq9y&-- CڪT۷oK$FwOV"n޼iee6R)|:8pJjhh{CCCSSLvT=`QP^I$D"!L&WM@$AWbajz$ 8özHzs0BFFFFKH>nVr:\.m_@ 022 5 Rm݄kO~`7&?n.8p= ;::Nj帷STKKKL'#gZpD"%yS6L655mu;?a{(oL5:b@033ķ&!FӖv 4!_{~Dx.[[F6¹ؾU,ZL7L&bu&STBVP(FFF3t%@wc"K܏kBڙ}w;nC2CoJc9Ln{Hş1Dj %v^5Uw~*QkSΎc'3/iDmI$(, 8p\)$Otz=h{ag|>(¶N8 b'h|>WmbnK 2ATD"8jzp*ʆ,P(lU\BCDn(NxfpmiidX>ycO(C΍  O`=`k(Xh`755=}uhB8hnnɩ|%2 J$VbVQ?pNH +Ib2ְĶB"ܹsIII=ݝEVm0æϟ-%ɣG!bP [SS[Re8p/(|TWWWVVVUUUWWTUUVٳW^hx3{ٹs۷B3f +**B FnDXJOz.yfyll,,H$TӧOs8 ,^`=z-qG^|f`j {/^#I"j++c>}T$ . >< 8(((555 ڎ7"h/^;vl߾}jjj@Dl6ñ2dȇY0D"t:'##:,,ɓ'Ç'AAAFڳgOHHH@@@cc#@tMMM~~~\.7..n̘1zcǎ|2vvvFȑ#!ٳgw̍Ǐoaapkjj]cǎhÇܹٳg0)d2n߾-J+**RSSwҒknn~̙'O$&&fggo۶ƍwޭ8{BXrejjjqq1c Sb1ģ{?,yҥKD$mۖnoos5///yUU.]:|{{{<}/88pZZZ`aoLfllzʪ/HMMe0D"qӦMr$Uamm)H S/!8 ZbeeUXXX__?zhԞJC &`0 8HPhff7ߔ.]T&YXXbX,GGGE1_9Nppp```NNΫWx###&&ySA7bNӧ.]ghCOt5`fvvvjZ&y{{Z*##"4H#F@ @*___OOO@зo_~Ν;? sy<ϯ prr ;wkנ27oTT;w|ً/Jܹs9NZZ$ !zT^Ҁocjjbbbpʕ ihhhhhU(W^555yyy>>>Æ tP>N\.KZZڱcǖ,Ypx 2jRX_v-PT\͛MLL={ֽ{ϟŕL4)22RVl/_2dHppeH$RNNwnnnyyA._ѣAEDD466ǛM4… ǎjsܱcGjjĉJJJ._ܩSI&ݻ!wh4x2Ld2Ϝ9322߿5t%==` >ɓ'dgg@2BF9p@fffuuuhhGLRe,,,***MLL`3e{J[QP\|ښJ:::><---00w}JGGGÇ߿?''b$$$}z+++KK˲?@aZڵk---3gάd:ۻ_~gϞ-(( 3gά,((us1^zu֭{t:| ?Ľ233stttssϯquueٵ ޞ@ \vb9SNd}III.]ZP( h@P(r<22yyyl6z_~J‚喗C׻ƆիW={rNNN! zׯ_wlذaT* 11FfffO>8p}qq=z8qĄ::: @>htllltኊ 666?t:]SSS[dTjbb]X WS)ֿ ]Ju:$p~m[& [[[,͇8,r*zf:g@Ѱ4L^u09VUCMV0aTp?, `:6p3 :ca]uu;Ir0g 6llCCnFJIz@ 0̮]b~+ QD!ԩSKK˪UvTH$H$~]oo &X]1ޒXwhRH$ ?cCVwGo1nq_9ceaJoڭX Km3Ē3Mon Ԓ6 tvH&885ǫWSIDAT,-- GGGxCW{_B^K ~*6Hհr? .uB%y +~m.O>ՓH$Cme[ =Ca?OaB4]}J+ mUU(Q TVVBV20Cp8 x!TRRҫWH64v۹ձ5Pi; ۶54|MY>@kYC ?y28pB{≮7444559::v5̢)J~~6HL&fuw, ^722jN" uVDƟ>L$a;a;D"t:EzVI?݂ D@`ddz=J,?m۞t0-q ; Yb?3'lll`wkd2vnAχ3Jo^'|>_YXX`p.ۏ&|\f^ݐ!UP(N4ܖ 0ןn+uԐh\.Jj@F~FVR>ld4tRi`gުoy?|[QzZu+>7$Z1 z)jg d7"8pS3Fn{B|#z$31B'T? ,D쪏~hO=[O?:Ú˻m?X}=)0Ro'mF7emv3$yh{n['ǥ@6Ow8gŻNܬT*!@t!hd|>b("jucccبz* ڪ &0 6Ç?!0)C544 V& ܌;Je]]68!Myy#Gx|XPPp#G@ . |>֡Rbca&jjj5'Nܹs9B<3P(GX0nB ܿ ][[Îz Dmװ+**222oY E[T*233ol|juT**ÓCb Y﫼H$BxVbX*HFra@%r\ `l0@ EdPgH PϒC h9UP߾}4J}6nاOsK.ݻwW^ϟ??|[mllV\=zH$ZP(lvMM}ܥKu֥&%%Ν7nܨ󫩩IIIiiiXjӧO00( F#=r͛7߿N"mۖKPڵkBBBZ-fR)NOMH jⰘP(D"N7Pj޽QKK ZT*Vc PaÆ R-pLrYtz^^ޡCd* |>  x0, $bjz˖-)))>ٳgYYپ}LMM---Ϝ9x~988rZi3H$>ydΝIII\.JOOOHH3f̺u <==w9~ׯ;wɓ'aaa555k׮wrrr=lÇ377ohh h .qСC7nhkk^RRuk׮eeeEDD<~x׮]III;w&H+VsZBAN:?B~$ U T*ʛ7okZ33KD"Q(b ‹/{ir`v \pիWcƌ!HFD\.L\._f;(B*Q C"4MKK L6rwo ❩T*`z^4M"@ GaVzGIIIQ*(vZmmmnN8ާO-[ܻwxŊ7oD]vݻw 铔gϞ$Fjժ۷ot:OO-[\tW^~qPPJZz͛7 EΝwq֭''' 5kܹsNlܸqǎ9H\vG`` ·+-#qW666:u5jTFFT*/^2dIHHHzzz@@utt=ztrrX,2dȠAZ۷ܹe˖SNV6R  a'g$NC}?^SS흒2|pԽ{>!!!xOќ9sF$u">>~zFz*?ݻÇOLLp֭[/]cƌ211r)))MMM7nشiSLLoPPPss3Dҥ zv3̣G&%%)Ҕp |~BBBaaٹs޼y[nxo˖-o߾{nYYY\\X,hAƍ0d2900ɓ' 5w{RRÇ={`0k|1q_~ITT{,XP\\LRA`gH$655A;vTUUUTTp8cǎs޽  'o޼qFܜfmm.,)ؽ{wee1}ueddM<ʕ+wɍ7RRRBBBo^ZZRbbb@$55Jmٲٳ777>zX,IOO5kǍ!wP(֮]w^GGǻwn޼^^^GR={&&&qqq?qDZZZjj]rrrccMBBB8 5k,Ybeeum'OTVV\tl6["$%%y{{_pĉ/^ 3f̾}|O8::oڴƍ \.ݻݺuKNN~왵u^6o `"8{,;t\+**͗,YaÆÇdDr5WWٳg߹swމӧODߩS3gܻw‚FSƖ;88^r%### ݻNJKKsvvkD^ ussgСCb899?|gϞΝKIIҥK\\ݻw+++oabbbwEӷlْgccs֭~m/_(WPI \twްcرcuuuL&sGINN>wӧ>>ɛ6m޽;4551cB5j/̻ĘL,,, a+Gȹf|277W,[ZZܹsT޽{`~Z(MMM6lʊqqqYbjK@(*L0ܹs˗/=z4,[} MfthѢׯ_ 7%Z"""b„ "jŽP(ȹgĈqqq'O[ZZxOOe˖qׯ_8q",,,77ݺu~Ell3fϞ>c JU[[啜ckkhbb=|޽pܨA/NWL&s̘1ׯ͆;ƦŋNjnn&F  "~^߫W>JϞ=iӧâM޽ iT jjjH$\.ojjP(Umm\.j?Nkjj233߿w}JJJlv\\lv /++Æ  H$vvvDUe-uȮ]N6-??˃t钐@"O?h&X,dɒ%B… IIIO|ƍ[r%;pCCCϞ=2xӧ_L&O֗/_ RٵkիW?{Bz{{0nϮ]۷O>fff!//jheeT*kjj\\\BpSII Hx#L&ȨtGGG@ H`ef:88@b6mll|˅###`kk>|p8p~C$33sΝ BSNDH$qLNN>~%KLfCCҥKnj{Juĉ/^r y;e… D={fϞ B\WYYYzzsܹ#'O,r;w.]J$u:ݕ+WF}vXVVvI"x ooaÆkZ!Cܹsٳgĉ|>ٳg!Je݇Y~G:޵k˗GDD̛7ҥK$ >eʔ={DSSSrhz1 FtgJj4juuu5B%GEEENNN@YIJJ:vX```bbb׮]XWW 8rBd&&&`0d*D.222R(=z>}:[RB \`K9X/D>-[sJJB4 Exxx^^ީSLrGYXXx< X,Jڵ̙3a VVc h%%%ɓ;wڵkHHHCCCzz:DG^0,[ZZI$p{0ŕ܂Eq\Hh\RDTt:՜9s4M^lvQQQaa!8`+WUTT1|ϟƎ9[nή޽Çe2Y~~g}qJ''?<22@ tƍ}Y``௿JP233+**zG1W^---Ν4i҅ ;F$̙sgϞM<9442>>mĉ>tRuu%xL&3!!!??k׮={d2ϟ_fMQQ9mllRSSE"CC/@=<< gϞeffHysjC^|YUUiCu|||MM;~葽}BBBpp'8ty撒{!Z=y7nܹsgNKK QQQϞ=޽D"u떧Z󫫫STFuuuT*dРAUUU_|EAAAYYM~_^PPf B̬6))i߾}׮]֭B]]]O--N<WTTľ}J$"P]] $+aÆ֦=zH$N:ϟk477X@0`tMEǏ?/zTT---L~\>sJggg&XRR赯Vq蟛ڣG`s݅ SNX,sbbbFFرcSXXx#G{:99M8̙33f ȸxV7b;;cǎIoo/~Сph#55իSL֭\.m-C >tNo.x̙3ʰj___X28p*Lbi6m Eۉd2Phccc3L&c/>m]=ø߿+j;U o3773߽{7J@[Pjna*VQz)[#1d2l6:)B^^^O|ט7ohh(((ߟbaƇNx/_|j5BukfffXHRZ`b04Ÿ1$Buu%6 vFo2D2h ܹsgϞVX^oa>ҷ=}~n0@}|aۦϥwyp`5UwV ^bb\]vܹ!ԔO&u:]@@׭}zy:U)<@L38p[z0 pV׷}!+y[mD'VW} xSl;Ϋ)J bAi^; 3Ób|EV|X7\ņ@)ׯ29Zv۰`5HQΛÇD[}3b 4n3f̀;o[~~6=Ӫ+۞Gu3,86aQ\g KH M1[b4$&5Ęb%Vl) {,,lε$0;ss<܏]AիL&c BOt,~(ev8p ^3}}},AP;md2D"Pc jΩ]OO '\?,j<؋fBclȂd?LZ6D# y6O rD244T*\.3P(!cl QrcdI Y@hRy;QŰY[݂xA `qw ӟK!BY[[ѭ g6ɳg0H#C@.---X}}CfUZT*ݞ@ lP$ vO!b~I1G|233 csXPtuuuvvnf[[ۡCںwf.X#Ӂ`=$o0 oN།\8pxaT|.^XYY)7nzL6qĹs"jMMM!N3fhhv 2 ܹ\.JR*L&NT*c``kFSNr_~)!N}}=Nꫯ}Z*>|+(!@BD ]qƣG8ͦR'N鎎o&gff&&&fee%$$۷KүZVϛ7o̙σ҆8p cK/-_|݅o7BhӦMV.Xh֭)))/~zff&̽zTTv˖-'ODc=:uuŁww OBU,D_~,+--m```ݎW_}z;vԈb:~Ǐ߼yڵk^:u͛gΜ{8py`䯋ayyy__oQPP`hhhnno>A/!dddCT+ |MOOO\Vаf/^!DP`BPԣGCW}YKKː##͛7 ?$''ĀaYYY _nL677_p)S:t-6D400 7n411-Cd e65eʔbTjooqF rȑ)S455AuEDDx}UUU?c톆c;3z{՝;w.X ֌Yjllf{{sr\\>iҤk*s΅ݿ="` '۶m#Hxĉ\.ޢRnC~={6χXƍVVVP Z,A X@Tgmmr|X,uz@  +**@>( v ːF SYf|gMM /V'NhmmsyLHHBhΝgΜx7o*++ۻwoPPTQ\\\TTBH[[FY[[s8@`iiillLPR݌8p㿉" ~駏?!hoo?uTPlN{ӧ!dwww'|dWWW M6Q(kkk777GbD2ؓ{>H#rso| ]0‹/޻wO(͟?d[n%$$@^\K/}7)))UUUǏ'wqtt>}cGGL&HMM-..}D"1L---:.-[6uT1$Hߠh*L&JA wuud6PKK3?Q;} &b1e488<%\jժ`D V<,g˖-t:>DE&FI$xmllʸ\. DUUU'N$eeefffnnnT*T*jucc#^% ͛}vsNP} 넄^{o.**7o͛7߿kDs-]ի'NٰaCyyKKKzɓ'3K.yzz.\0333!!64ƍ;wlhhx񢡡9sϝ;rlX,&nnn---/.)))**Ս8Ns\_:::Lnc*fccs>www]]ݜ[[[n={4@kwbVZU__/Oӧ>|( T*hl###.hM[[ی;;;R=Z|)H~xuuuKKKTT#GDU<==SSS>|yf2_Λ78TvvvD:::|>ƍ^^^-ljj1|qqBK__Çs155!zzz .J'Odnnn@omm-**bk׮J,KGGeΜ9wyW݋BNNNǎ#+W{n^^ڵkMMMOqpǸ@RX,) Phhh  ݟ~"`Jj"RpdS3Fg)(p)wwy>Kv84n;;U(/000v i,F ١;*ꪭ hsE&*277񂱇\}j[O'?Dux:e>6b{8pcpMM 0Z1bBcW,l? ,DɊD" t3ٚdH3 i'r#S QTJ$.lS}#SCB ' #?  c<4Ăct8p1<f\@ʧc]8w%DHVpD"Xlzv۰jD"S(DYj* c'Zpl "`E88p@BT*G_VafG9F#wrmll<" :$Cek:r@"lJ233)JPx>4Pej5})(Z655Ռ5^ t AR 0G_G<Eh\F)gd5_5904ވCnA}q!]q )ş"āI"Jx</ɚ` L"bqkkP($2 n%Je__(6T>,@{{;̼D>͸eX5558] @,}b:;;1#[ZZHDРT* EKK VFDsB/0 &X&aC~RX`v|RR=W6 `|OOOjj*H(}[[ÁqH$jllz\S__?CF菭\ _ÿr.lw8SZZZVVOV&#{@fddok,$K L&Ɯ$PgΜIKK+))9y$駟Z[[Ο?O :;;!.f0 i>;p.aX ]]]UD"Qkk+WBBb׋D"xDrݾ}k.8Օ`FFF{{4Ud izPd28AJr|YkJP_C +ˆ;;;~2088ގl  bvvvBÇb-{ FVi@8=FQP(ľ_H'F )$ ܹbjjBzر}>}:555999((b%&&fggܹ:Nݺukff9s (R{!TSRRܴ>^zرc/((z LLL<<< /}]V㺺"@sBP[[[.ğ~)???%%ё@ |7ZZZ 7ܹkҤIRt``Z_T;#_B*X,% TM x<hn¸TOO?}tqqqPPP(ׇQ( vӣEP>sP(zzztttd2Ɲ+5ny</n%_|АqĎ=`0 ~+W̙3֖H$* ^3{akkkii]ą ޽W^y&Drvv駟-[v䌌)S߿?++H$D" qwB]%''8q"##ԴSP@;d2A߿ &OGfdd?~ϏBP(PSSK/EDD|g---'OD"(JA/lllT*9&O@pJ488P( )S`5P0I.ŸvҤI{(**pBzzzPPPOOϾ}|833FWWw #00~ۺuyobbP].[YY999͙3H.3[nEGGN0aܹYYYb822J޽{>>hAAAjΝ;W^l33ٳ'<<Щ;vܹsH$&''wwwUVVZ[['$$eee⬬,77'NՕM>^;|pllCjkkͿPOOO={|׺ׯ_wݻ+++I$RllԩS^~e'\v-**ۭ ..!꫟y*ԩS~~~ׯuVXXXJJT*MLLd ڵkt:=11q:::0T^^~ђmmI&믡!Jd2Ɋ/))ihhhnnzjYYӳ=<<?.aU!44t_uAAݽ{ ǎ311wޑ#Grrr\ݻw?cKK{uww[XX|g򋹹yffÇoݺe``p׻%&&Ν;؈b0 w8/c,>xɯzaa}`#ܿ_P,X!dddkmm277͐'cGo޼ihh!Ckkk}oFll'BzzzP~9 &L:9??_Tr &_L&;vlҤImmmiiiJrÆ 111d߾}.\LMM1(<[nڵk…J,g8aoܸqժU^^^_~ess{}} Bٻw/zS$22rbݺu555UUUDb\nHHȋ/믿SԫW޸q㭷Z~H$띝mmm1 <==MMM333322rccc=<<.]*Jʚ'Olnn_QQv7oN<̙3;w ӌ\P(T믿>wy9;;kkkabbr1E&gϞ-[_vM @  b V{{{###+**=oDGGϞ={ɋ-2eʌ3fΜ6{lÇCbTjbbbhhh``III**$$… &&&\.[Reee%$$@p)S X,L~̙s֭3gx{{|cii222!T&֭spp(,, 4-<<|͚5t:[WWRL&c„ !!!&M;w?-H`>[t)z曚H$kv,^8== ,pww_d@  +(((--xwfBbB&oܸ̙3SLillLOO'nnn&&&˖-:nJJ.,(>}zŊ=<<Ν;駟[qqq<W_}Z[[wbZ[[T®^9R~ e2Yuuugg9s\\\2ofҤIykk붶6wqqKCCCϬUKK Ne2RZÀаR@ז0LyGGL600077/Hdrxx8LByqPކ<駟lقruuv@NHH?c2ebb2qě7o:99566 vxip`o?[ @ػwP(\z5x]lr%%%/_3f+WRRR>#PwwD"III3gΗ_~y궶#GwZZZ2 Hddd4q{>|f B! l+V[D"ر#&&f撒~72 kdٲe 1d2Y&'1#BX, uttl6ÁFlkkJg~`t؂@w/&&&N8bҤIW*)HD"P(kaQtT* [z5H 6l:<7nܸu떭m__P(Tr!ڬY6mFw >/LZ~wL)X,[4,, Gxӓ*JdXv4AJJJ9lmmA|`Vk֬#QQQ&&&ZZZD"Fm޼Vaĉ|>Аb)Jr x ȑ# ]f0\.7;;iGGǚ6=00R K FܸqΎf+ `S(o>H$/ҥKJ 6ٰ#nI[[)T5ӣJr&&&;wƎBL&FA`>? DͶX,եP(zzz\5Vw:bBl6&&&fݺut:j֭[?MLL:;;ACCCxxL&khhurr+++#H'OxQQQL&`ظ$77WGGǧ(&M"HUUUEEE̓iZZZ&&&݃666@ tƁ|Tjmm}iX\[[KRgΜYSSxbcǎ577]tITp8~f$ɩS͛kJR,t&yi! G T@R7DRYY `2rt:='''44 55b/X`ڴiӧO744uI&h۷oرț̛7ŋ&Mz0릣3a„΅ VVVEDDsr';;;'&U͛F*<숸x񢯯Spf*؛7o~1L<СC$iٲe'NLKKKOO`rb:;;KKKcbb FVVnXX!,;ǧxjʕ+355]]^"hjjꫯD3gΨTdmmmsww_p%!!!...Ν ussӦMRnR&{zz'>>={[ OBoߎLKK[revvvRRSTTٳg֭[lmmy<__GnnnSST*]z6<:''֙Z͛FFF0SwkSNd'N9sfxx' /_^ZZf//gϾ꫓&M277?z37ovvvYӳիo?N?zh``ܹs]\\.\  yիW{xx_uڴiSNuuurJSSSsw}kmm Ɓǿc`QVS(GH$r1$@'ɆOa|M &tRLLL0U*7|cnnrJlՓ&lVTvvvϘ fH55~!A Ν;'WX5\ sraʔ)C Y,Viiiyy)v;.,,SS??;y2777 HLn˖-6lpppZ?DpD9QGd_!]i yD:'jJH |g_5J#r<88򉞔(g ;>KF8p15550S__l$?~Ǘ`>(|Æ'4j5o.D4`) qб+W6Dq* +ybxҤI8xMd^q78] t3:r0 [ 5SHZ !\@" \+6!e~ ǣhd2y,u;d#]O+:::RTRd:#F@0 Ł6`}ppdm|kkkliyDPrGLq Yadd4䮱d:sCtF_'n hT*P IJP*w՜"z@u!dbbeT__J#Ǧ(BT*(CK5'8l럠>H$vuuikk[6,< d141Z kzHyU*RѪ?m >4ˎ=Jc6 8:3#Se0QElqDgqCnQ?Q9cd+G+G' iZ4|3bG\3.4逵Jgxŀrbg.?IC|1Ʊ~%4;jٛrDǟ>13ؕC} R QͲ828"a``(@tuu5sxL&YSS#ɔJesssOO"jkk%ɐRďM{Jegg'!A.wvvQ\q"s8zf(舁$@ RE444#x<^eee]] ËMlG+5ŽՏy&4cL渤JNNF <,޽ֆ͵k!NbbboofI Аu?lf'$$?}=)Տ΃%vf655Jjll"www""e,^fJJ/MMMB[[@ NrW*mmm<OQi`B٘萒jVѐbxs=X]~^b!Hсu9Pee޽{Ai djB2 YBffp8p04rD"xbzzzBB}Z[[U*Մ N:o߾hCC3g 8::VVV^x޽{D"f֭L&3111,,LKK {ǎsՌ>DTj\\\fffBB„ T+0SN=|0&&Ç6m266$===/ڵk!z'rssA+'Nhlllhh޵kWiiiNNNddK233o߾' =ZPPf;vDmmm:fAzpp?W(&L@DЮJZZZD""GǥdŇ>potp +ϯΆXW2npe2Y[[Zhʕ+ dٞ===/^tvvƶQr`F&U*X,ʂjuww78W\ RT pܡ E__ęRFK$(8Ġ!==="N߽{ٳ$G,t7ɓ'sss ۊ;w8;;WWWϯ:ujRRR]]=== Bϟ0aסC222z{{ߟXUUUݓ&M"iii;w>{ C>yd* XF&DBR~X,&IP$ :cXgϞ6m(..~|}}+޻wO(N6pӦMD"1 ;;bD"//ݻwEEEYXXoӦM  8p09ȡ+p^ݽ{wUUUgggyyŋBׯollȑ#vvv7n #WH`|s(4_[[Myy& l$ Ϭ"{1554iҾ}/^L&_~Ν3fL2_~H4K.ݳgeaaʕ+1.^XQQbnn^PP0cƌ7gϞ;|:@QԞ ꦦ&DRSSzt5k֘m޼ȨI066!?;U*ULL̂ ZKKK.}|͔)S (=QT---@,CW$Hc@x0 NL& [ZZ J0!+++Dx|SEEb'NHc`ҥ'OP('OEEE:::N6аwE:naaoJ<|f+w^CC{WX,V\\ԩSg͚R(qg2Νc `w+ }}} r8LfjjzuX<ﷶ~WMLLbcc <oxzzﺺhCKϟ?w˲eˀiheeeӦM8q"FKII/]dnn+]r?44~~~S.STkחXYYW|9rӽ]]]!!!O!'qi4۷|NiimZZZ```||S,]KKL&_|#66_niir劵5F100r͞='//O__?<<D"1///--̙$IOOo֬Y===K, eԩ aaaOJ~~~l6t|qGq܀ggg [[[̚5+++N*Θ1CPx{{GEE7xˋf744uDOO/77wڴiǎ#VIHH(,,\lĉ .]{…˗/{xxZ@~OOOXXXNNNjjjxxY򊊊6mdddtiSSӉ'"T*UzzzqqJ1^PPPTTTxxi(Jddd#hii͟?„ D"9wǛ={SWWWoooYPPph+Wt:=77L&K$ &N dff677;::\z5 ݻ VjkkIE y{{:(0_cps\.Ƕ_b-, ό 2`rfppi2ćGp{ ̊m!,=f=XVP2kHy5/1 vR*FEE}0fL5_(O!־OfiYJIi6fUkd t!! #?C hQQQSLA5ۂ(f{ `G|s4[277f abq v-5R9j.Vźfqw?k^=szzz5sW.@!8pX܉?̸X,{{!ޟL&J1ytGQ D*IW,DjZWW ' ?,jîg/;9ȧcjmmmA3(=wx4mIt3T*|Ui;{LRT*B";z#8p+A r࠵qZs iL?;@򈀯2Frאyy(%? T*pIq_.;;ǭӿpgX)#J& I’с7ʰ(L&bqUULYPاK5*]]]UUU rrAsKdZ_{{{~~~[[Bi:0/++++r+++ D"Oyyyyyy[[0 ÉIPFd񊰓W^Ojk\RLHHj:T*%%%لGaCGNyfOOAcǤ}z~~>裏***U*ŋ_m۶^pGݻ9rDVٳի_}\.y&\ ˗/?~\V%%% ̙3Gݻwocc#Je}}}ww7 BRd2BwNJJb¨d(8]]]<,Ϟ= 7Ϟ&@ohhcXUUU?,++p8Ϩ.J{{{T*U]]B |>!'>(>Áeee===!+HN qWWHJR,P 4.H{=T #^X,J $Jhnn ܴi&}}}0xjvq[r܄fD={`ؿp".r[lllqq1ɓ'Ovww733}۷bqCCChh(H䴷ϟ? 8p/XtGTjvv6]hQIIuHHa]@ sTT}֭ bʕW.//x"rrr***:w?lUHO*޿?B㈑2ڵkB~~~FFFMP(r9 D}vzzUKK ~.;FIHH8| 6=88(B}BXp!. D人7oAXP\N$O8{!ڸ\Mu֛7ow},222!!_nDjooW(:I$Riiiaa!G6꫓'O޲eZ cccySNQ(zȗ.]%T*!07,,, ,p6_`\.(=5h4ZkkkWWL&\.wgϞ& P(Riee哒sMNhffRV\+}Imm P_tttH$X,!VVVׯwtt :::b1˅XJaaa+WD*GњJ吔X,֖d ^IVIDATh(%""b͚5t:@ Z*&&lۅ233khh100 d2sss sss+**dɓ'SRR֬YDvvv"H,C8pLjUKRkk7n h4ZlllGGիW/_vi{kk)S .,\000!_:d2/_,x<^@@(*zuP^^nhhhaaqaX,޽RXXp,--_~娨(KKX}}G>x`宮qqqzzz}}} ,HII~wWSQQtR˗/S(rSSS\~رכzyy <==ϝ;gii|rFsNii/@R?˗/[YY͟?ƍ@Q**JOO1^yR>>c2]\\rrr$G||ٳ͛W[[ࠧ쬭-,Xbtttf͚ZRRbcc3}t;w0ڧMV^^haaqNNT*H$B$88fff$}ʕ#@ x<:N"lll.]jeeejj'Njggw%&b-[v 6 ]\\,--ã&Nx"Nqss9r߼y@ 8sLVVҥKSQ8p㟏Pe`>.$%9S0q-Cta_|tQď%O8?{:PvZmll )|th45 )1G6NS_?hVf:-@ i4iR|7`D"4"ͪ^5\ sǡfƁ82p=== L>^yT*UTcܜ^@ )]E"Z})`0@QZ;;;ǥ/FLȂ |=<<"f Y{gxH$xOy$C|)T4,P{ Έ a Y|HcH(ᣝQ~}͟6ce7Ͼ0 ! fp #r o#ͻ4 ϟk\ݎ955>! 2lL.78p^ )..Ax&l⹭@$]]] :x"3B9&@ bG lvQQ "8E ,X44t <G^fg\\y;jukkkKK˸3ׯ_GAD"LVXXx}2B^ϵkU,{%'{߾}KA‡,ׯj<@F\R(a tCzBT*/BdAZHTRR 㫪 1.8p: ))){)))_}U~~>81IIIN{{;B(55ѣ555 6slЍ7yp1Q?p;У-c=eee2СC1B˷oBUUUk׮MLLD_||[twwT{m۶ c߹s_~III_J={+T744 ݼy[JɓgΜٷo_]]Jeeee{{@ 2|>_.T]vݼyTVV[nBQWW'ˁ8Ғ 0X,_|yժUOconn`0?.//{ƀ;"_Ps\goBR[d2r2@ M!:dX$UTT|ZbD"Ñd 6mjmm}a,$\.///2 6 H&fJE&I$E]rݻ۶mLHH8rHOODyyy;wwDA] r+++ww ֖8a I&~g'N$W\111wuu2eJNNԩSУ8;t:NUTT̜9stV+F#&&T ͝;JFDD;w.,,G,d???Holl}zHHHP(111~*H#""BZݻwoKK~cccJJJhhݻY,(&'' __߸ {899ڵdut|B ˋ'@-.]JJJ*--𨯯vvvW^+((:u*Ì= Pollr tttꫯBJڷo_yiiisssFFF#ǎ뫭۳gOoooEEELLO~ԔVUU%HTXO? J̙3...7o޴wͻ.kddT]]}رiӦ۷OKK+%%;---((ĉ>T(* 666?FJ֭x.]*..ikk8qbtttbbL& hg0*f]8p_踏-dff  |װM `3ɓ'/\gmm $DQ)@322R+2[YYir###}}}۶ml6[KKٳNNN0çWUUumsss???GG#G}bbJZd Be666˥Kbbbd2x2 ~2ZXXd:{===p2gkk; .\100iӦX*k׮+WL4ivvvXϩӠgs0޽7ޠP(s333Xu֎TtB4> Ho訮vpp W\9s?777JbŊwyl6ή:..*""(JO>mllLѣ``Iy{{׷lܸ_7omDD… -  `0\_Ο?„ 7nXb'|$"##g̘aff;/^tvv4iRDDĎ;ۇ255}؆8p#Se_~!p(tuu D]]]!oooP(mmmMJJ*((P===woop>'>>ȑ#V)^pjBgw 2͉ĵRT СCYYYo6By`` 77wԩ7nLHH@QQQ׮];{;CV[ZZx<FKMMEUWW찰0--- Cf͚'T;wΘ1ߴttte2믿%dJG Bkkk&900\'#"ԀVխmiiJr^:..D"R 脖<92244]bɓ_~e==۷[ZZ1 PRHP &0L.Fbqii)zDgggL6e01z{{/Ybۋ`u,22r͚5ߞ>}@ S՝JʪĄH$T+,,ϯ$ɇw[oR RR fff?PeJMNN*//722277?yJdfffٺEEEeee|ܹvvv[^^ފ+oݺ_PPb.\XZZ&%%UVV._|„ T*LR>}{Æ &&&NNN!oo+WھD"6h{͛7WGG'++k˖-mmmW^Yp}bbODD9H#ϟ7o^WWWee{pp0XуGJP\xQ N4&±T*___GGG---}}}kkk*joo/J]\\ƘPe(6W,--mmm>|(H<<8fou!( Rcz=/Rct}Śg,Ai4!BD导򊟟U\cR* ;H$L2Nf`  EH")B kJ,;Ga5L6D;;;71Ȁb1Ƿ+9.e-En*pF|]\\`"H:::-}re$<OP8pǿ]]Vkkk[[[ ~w艚T!)TͻF 81Ǡ9Cr|\:nD_Mf:خσIy\13*K\hy\3fp;tܟ  şNJ&!i|5CH͜zR,]39ftR~F3C<{<.5T`ĉ,4+4Cǟ$4P.,./ok4_)F* :w@oMLw]F6srrp߿ֆjjj@B졚|D!d2Yyy92sд8b)444bb HxKK 355!Օ 1J}]]]AAp8NNNH2̇BUP[\\XKٕٴc1;󃃃1 W`xYl?xu5z쩁3~Z Bbb<U(B˗/s8ׯD"ڱB B@@ nݺd2\0;xrPoVC"^;msT*ظNs = BAAAQQVa-X624q\JJÇꫂTW_UUU㞞#O:s-,,p8nJIIٳg,f> " g=߶mۆ}vFF[__e˖$(HgϞWSSsΝw}WR=zի|MUUf6BHP777x<.pd2YGGG^^BعsիWT\\G ASSS{{L&J`bя/ub۷?SUʠhVѳ555)nH300 *JXR.\_K$'''==H!KKKkkk H$***jllD]|/4 !TYYK `o@}}A$H?ojjسgիW Ekkkaa!ď>۶@hjjjll*t|GD" F͋K.۷F!JUVVV__/bL&Q7733sttܽ{ٳg1Ru8pJGvѢEZZZw ,w}o 7nffP(^yHddd駟[N&i[[[o޼ѣh "g޽ -[ *:uE ܩP(LKK{饗@D[[[,HիWS(kvtt#T*m{ݥK">󊊊%K?x]KKk͚5RT[[qqq7o*wן:uj}}}mm-[SRRlee%jkk\uƍ5k||p/ã|Q M6566b0t---,ƆH$FGGEFFB[j>7ntpp?J""##۩T v74lҒ[__`0^|Eo_~|ݺuuuuUUUK,Q(---]]]ׯ_ϟ?f?~ᘛ.Y? "H\.czzz, j޽{5kOCکS_~AOO(%%EVKmmmپeeefff]]])))AAAgϞ*!7򈈈;;_ᄏ} zkjj㻻'OlffV[[>%8pONֽ{R!6ͼyہ@!Ù;wJ:~3gTqww7BH"/J߿ORkjjTjTT;sotELpnݺT*y__߈gg^xATjkkL&1:bj@ Ef&A Jneeٳg!M33R]]ɓ'JRSSә3gBxӧϗ\!--ȨݝdEeee_,%%fŊiiit:‚@ oܸа!w ''%KDVi4ZfffYY٫奥iӦx{{E9::޽{+222++x{{kkkO0D"K$9sN8[p~r  ŵkry___PPSyCB4+33D";::h &)Ĥ1//I  E[[[T:99YZZ޼y!4gΜ???lKvv6B񉌌,((PTvvvzzz... D"q8H488allVYY,Xr1ussFA x<DJOOqㆋ˪U377puuP(l66((!bRSSmllΝ188vZ\neeeii)"""LfuuիLfYYࠫҥK O^__\]]Byyy3gΜ4iJurr2enDDB4iRjj]lly.eq~g:pYvv6̻̙3/%'5q@PTWWkT}}}$IVa"c d,*&)@ HQ3:6ʄ.-=]Phڃ ;vE )cKHw*4-SI$BXd'zp/DAU*؀,G5;zjX[cU'H$hJÊYr{]H$Z[[kkkB <9XK%=(ABׅbBǀX/EBRd2X :B#bZиXc=?De 8ps,Gy=RL&J']D"Q ܸHejT*ttlll mP|>y#}|A$|P(bt:dyT*UOOsn'I8p_Q>pj$cROZ&UoSeh(Ơ?F~XLgHYHC2ʳy3f88N\8B#m Ѭ!u~GO3*v0A~դ9=8pxN-?#222[800pݦ&Pmmmii)ĉDbMMMZZGz>VKJJ?["'hӴG&J̄ Fnn.Ūl+--MHHD1 M笲2++ l6;==f6x\Z-HҊ EooonnP(c&c'Y,\.~¿c`":u ǑɠUUUUTTKj:ũTz/14Vy +A\.HLHH:<ùv(Ej<"7o2L,͖'*&55ݻ,K+Br8SNˮY'HeL&S9 P\ Csh988x B188tSN$" ~:KOOrssb}ټy3hߺuٳ,!0|>8ӧۇi0)K.ڵ !d2SSSmۦV[[[o~(|CCëZRR288gH$Jݻw?V7oT*_}@ ~uu_~YYY) 322{V[[aXֶcǎ!A/HZ[[@BӋD"L&///999555K.޽Ḹh4Z]\\-RYYچ1:DL&۾}{[[D"xuuu ~O$` :  Bgggqq1(lDaÆtZd2>|(bqOOHkjjڰaCmm-Zhnn~!6Rr*jĉ)))|Ioo/H-))H$0}w8ptL& +)) nnn'N,// 455ݾ}N8q"Dqㆭ-D511IJJXp!BH.KR:N'LPQQ1sѥH$"H:::^^^aaaeee "88;??Μ94mʔ)qqqbB@d[[[;;333777 )S$%%999#ZZZ 100HOO믯^J".\RPP@$CCCRiBBYddd``D"hӧOrZZZ]"(J]]m۶l ]vX7n#O:޽;a„/yyymmm555_~T*}믿NRѸR| 2iҤiӦA'pPӧOVTTPTOO;;iӦSхi{k֬a0G500xa{{'|2}t2 ܹ3 ƍ4$""˦Ǐwuu:qDUU_eeݻw Lfyyɓ/]qw[YYiggj*{{x77DU*Ujjw}oܸ@P233;fccw!WWח_~yڴiNw144 LJJB&&&jnnnccoo8p cqoP()))J_vuu]xl6B@ 3Ǜ?αcN>MPh4Zgg'B>[_S2z뭷BD"7|[oYXXŐO?Dh4ZSSNcbbd2dazORyyyիW/^ x!+WDEEaj:p/r<::zpp&&&/\.7110a²eT*bqyyOnllgb>'<6&XXXcǎKjkk[n>6#^>@"H$O>dԩ!C$BP(---''YfI$!Jmll]\\ߏU(yyy/Wꪬܾ}{dddbb+hѢj I&y<͛7^:00`eelٲ^x"33sʕ֭#B~駳fJHHܶm[eeeGGĉ-ZD&|~pp[oUVVh,Xz{o„ &M3g4@ 9sfbbX,pK>>>[n]|Mf̘QVV_j8p0m3g9r\pOR) nnnn```__L&#l6;##d#''x _f?ߏ;``455uww3 \rJ2ʔ)r{1$$$$$d޽J2$$dϞ=3gן?~qquttuttܤRkR@绸tuuuuuSujbXPZ*>>C(I?KF@1reee}}}---հ#!mm꼼ED!@}||>|3qD}}}'''[[[cc㶶6oo'B(R(mmmhnnneeL fϞ;ydooo$E \]]}gxTgIϤM2齇$E{>>l6ɉNCD"\lYooV___77xKR'''cccha0T*u||{W^ fϞhL&IJJR(6mz---D+@rppHKK[v-*((`24L&nnn$ihh(!!ifff&&&0,X`jjJ$Ν;<~PKs PM2([aOCCef'TK4Lw9C=~T*>腳GC>N ca?'y:9LX޼AGъCĢtT߱uP E ̬l*~1-(;F5So:*  zhB بš~t6m:Gv|ٱP̰?6u7+ B`x(ظuꉉ( GHsrrz{{ T(޽{͛GJ޿@ (**9rHUUL&-**:|0PwwwR:Uy}}GdhhH*r܌ Tʕ+2L.ggg(:66VSS$H P.//xf.?9hkjjFFFΝbFpw(:44%WΆ:olllh4%%%oFIIX,.---((@#juuuugg'B?JCT wuuUUUA-++C|P-R4?? EBJe)**hooFQqRDRRR9P3А=11188H$dYYY]]]EEENWW%%%(⎎xQBDP466WQT777Akkk꠭h4?eǡo #211!|~sssYY }Ą ɜohhD |@ ߿2=uT~~>W*R߇Շ4lH$Rt…Jt||:sff&YX~AT*U__ pZi||B|>%%%dgg{&&&@&(:>>s@;lxxwA><8}tyyy[[[CCÝ;w.]h[WWgQuA.\ H___yy9L< 35 顇zxWXXXeeisssvv- ---)Jpp0Hwrrvwwu떭-;w. *J.3LCCCgg˗kЉD"e{CBBJJJVZe``{ͨ(DBPBarr#(/C666+HrqVV־}n߾M"l2k֬b*:{lX|}6/.\fy<BzLV >Hf͛w{ښeggS(gϪTdgg} ûGnnAr}>PhllL&CBB.\<@Q+ jjji4訽}WWWtt4kK>BP(oRoebb")++R>>>/ɓ'IJJsss~ (*L&{g2ϟ۽{7Vﻻgdd\zU(^vBܸqcѢE߯dX555.]p8fffZlٍ7ZZZlll|~^^KKK AqѣT*FFFW\|rSSSmmIdd$rvvpႇѣG5Mnnmn߾]UUjg͚U^^nddRD\UU|˗_r㥤LLL R\\tK.9rp||رc 111IIIYYYUUU111nnnvvvL&?wwwh~~~l6%##cܹaaad29//oժUTUVݻƺݻʊdZ[[999988 -...((HII9~ez{{bcc8??311/GFFӫ<`0bccgϞWYYdooM'''##@kkšUV9::[8 NOO'c*jΜ9J޽{QQQ0'N|t:=%% x _JJJC`֬Yf׮]...n9d###_ >Jzqx>gHDE׬Yk׮cǎZpvM(nݺٳ/^DQTՎ;::j~a |O"ydJ9|+vW_}EPBKK'֬Ya"xix@ҲT*jmmEQ/ 㽽 {uss-[hڰw}4gj|>?**J(XYY^ ~ggm۶T[[[Z`eeo,Zݛ3gݻ]]]SUHl[iRzoNRE"QxxM\\4aaa" !!!007pssS۶m{嗻333ǭ&''cbbw J6 `2|>wA -,,"""j׆ lmmRpon:FT*}||cgglٲgyD"Ĥ)+|f555[pavvʕ+wvvΙ3W^jժz2qƗ^zN޽dvuuyyyĕdz Xz7/988̞=֭[ĤY.Z7400x}}}˹\{キi&lNTFFF_^&577ˮ988/88"Q?쳳f͂) lڴiӦMmmml6{vvv.d2|e˖XũP~~~AAAbzK.UVVj4~^zA>k4,,lӦM B,Ϟ=ӟGDDƢEv#J%a;v`X733{wl|󳳳kjjx<^ggg`` L?ؘ l4ڵk A~ᇾ> Gy׿;#H/" AAAuMMMZZ{[[$XN`Ʈ*))=L&61jqFkkyIR7pM= ]w .={vݺu*jZtpp mooq777X\XX@&RRRjjj`ϒ}}}ccc㬀=ϟpš5k 2WP d2[.zss3 Bmbbd2-\PR566577Y&??AUV988E9s۫WH$--- [jr l!/44СCo߾+VhUVܸq`t///LnݺyMNN(Vi4Z===MMM'YAAAUUT*UT- CFFƓep>sT B(Q(& / a,vٲe׮]nݪtvvD"_рӠP(¢:S"bYjZ~STT h4$r9Jj@tuu~KMMʕ+KKK\ /:uBXYYyxx|<oppP(jX,d*JVC2JZXXWUUbBTUUONNNLL8;;@[wwwWWW744TUUA$miiw%r喕d2䩫jL&;X 144P(/ill@###PswwihhP*&&& uuu===/bTTBz\Zh ǎCNmk֬tR?lsa!YP~( tzkk+r.S EVbGGGР}=<cccvvvP90\]]Dٳ !eA}LRYG&-\PPxyy1p8$$$J$OOO8XO@f:99YXXp88>:::66pLMMtZ^pyII L 433IMMݶmGbb"466fdd7xYVK$1???A;w LLLt]vvBxj?xb+++xۧP(QQQ ɩfZXXP(0@`iiLѬmxxmii)>>>P666ιsp8%%%QQQk֬r FFFZv…s󋈈pvvNOO/++۴ieeeKK9LBrrr  p87o 1P8{l^z ߲FGG#""qXSSK/Y[[9sv{<]z衇*‘#VK&BaPP`s> ()ԪRijkCb ećDKKKX = xDZ n ga _"h5t"tf5@ T*VtEZ-B={+Z-'u6V-@SpY.( -8^&F[ZRS7֚`!~zWb!$wT4 /Ph )`W>PEB:͔) 0/A$AdcgXѷC`>П ZV$ `ٕJojP(H$bNokk _<0 JَO "\LX,>A5 VF,Ry?Oǩ.dFYC=`H:NOwVKR?Q*BelL*P=C=WARG/JB8N8?8]Z0'(>:\/|66`b_uVe8+łWs1r,~AvcY`~[GS ڊV;OSs7σj,,J'<e s׳N <6=MnOS'>댎k,쿏hn*~3Sj:3? 3Ei)z衇zЎ{wwwMM DdppǧB$EDDIiiEZ-HRuYYټyF"h܊,3ӱG&ZZZTʡ YfYXXï8L\]]CCC,00 {"OLLDEE1 `4 設ussx %::ZPkZ##ȮFPm7{_1A7h؎tROd2 D"QBBy?>.fONN}9rA>HT~iiiP^xv||/d2T*UV/ҷn݊>tX,޿?;xdee%;vXYYJŕR b||X,.--xohh@p#d'&&H$MMMbx޽.]JR4--Eѡ! YYYBEѶf86%WTT|g3rlKVWVVVWWZ $$$ LNN@=c/6~-KHұ1A@s=11Q" TWWZTɀ|߂ZoooOOOH$455%%%MLL`'Gnhh8ydmm-299Y[[[]]hIIIQQ"! DhaVUUUTT9wiwwRݍ H[[[bbRBgddRDWWWqq1E}N>-Jxmmm"A:@|}}}jjXVmiiQT###r<(((??$GGG =<<.]{L8_wC=M6ڵF"$''wvv x=sAAAsߺu E~kQ\.Դ"ɠUXYYkXP(:`eeo߾](xYfmܸd<WT4ظEP^x_$H<r177733NP/ ͛7^}OOͮd2D"q˖-ׯ755ݺu/Hр^zG(VWW:u A͛'OTD"bP´gΜimmO322.]_TUU;w뫯rt:}3NWu󙙙EEEA>:GKT*TWW:tHTb * KK䄄A?^TT~!Ν 2_|rMM@ JΝkmm~z~~?pĉ/:u*??ѣJRR:tرc{x{{ \t ^/_\\\\PPpMLӓ/^L_}Ueeӧ</<_=zĉ* j5ź~zz: |MyyhBZ.//ǚCqOLLOrįX,J"ȑ#cccykk+MPK.z|NNαcǴZX,>~8ݱcGUUٳgnܸT*$%%… <obb… ِoUU5 ߞyX011<㮇z_oH{Q(+W['N X,~ݻdɒ3g~$ T*^Dh;v@(AQT.9r7X{cꫯ̙ͦ3۷o?|Ho͛cCCC w֬Y|M?ʕ+6666mjx)򸸸(gς. cj ,dnݲݰa(Sh4GG͛7TdKKK"rmll^}Յ ٽM1gΜ;wc޿=)@@}}￿m6 #S^;B[8,ɢvܩhۑPaX* 9 .$$dhh7lkylؼysHHHVV ’w}gLJJd2### <00/00T!HfN߸qK\\N700hoobl LJ\,Y$99~ӦMK,innf0Q@@D Xh)lR܃qW_}V{שTjeeeppƍ''+VI$ K.7 cc7n\]]{zz~ueeedJeoo⒑gϞ۷;88֭$ZJ%& URP? G=C=~o:(U>}XZhB(//766600ijjBdΜ9}}}CCC4-00+''gdd$ yB$Nq9yŋ/^ 흝2ld2A&IRj!!!Jg||2 cc?r tppEs8ŋ?~ݻ . MMM Hii)h#G̙3ڱH\WWcǎT\EE566޽{ ++Fd+WFFFB17UT<ۻ7 ®ż'aU;??_(zabb,cL&+**b*TUUD"+++dqJj[YYqjX`ǻp@eZ/VP(eeeǎc0$ݻyyyFFFFFF=Udddgg7ry]]]ssscc#eXT*yyyᐋL&ir/|ٱ1;;tR{{2@dr\*666677755 Tr\(644Ԑ葑/,%%%cccoXTUU ]xޞ@ |www__s577YҥKxb.{հK.=s111LLbG\\>CT*,_!A\]]޽{}A=<<=z|D$ BBaccrڌfϞhYYET*wwbݻwdff;wqR)ɘLxiiL&{(*HNokknmm277OMMx599iddODϚ5gѢE+,ƦC,͛7755577;ƅ]]]{aX---4-##Ewy`yGGhjj*JZ-jllܱc3 hzz֭[]\\*++]]]Ab8*k0lX5TT٦ P0qX 633Rccc666]]]nnnMMM...d2 آ(*d2(WUU;99qgyQEE LMMŋmll]w[O[^DOzr```0<=z衇z`uV<ljT@2~an[ğ ~oZuID~1 C_z衇z1>GB쯎?D=Ա-F<ڬs u:kvӹK2|坞C~Xɰc!xavV1:)[G Pv(LٌIWH+xN0~=LBUᰈ|X:Nh > #\/;|v Z0a5n!k2@CP P*!Sԇ Ռta+Xb/ (Dga9^3{z/сXR!f#?k_u k bdX.4NN7o>GgP<΄s2ªO܇quB)aS vP(^zv ?aD*ޞ)l6 ں² lT*MNN022266ή J%JLX,D6669 t:=##JRKJJ,,, ;::rrr@@ ̼ X  B{{{E333 iiiw50001N$_}E,WZennYTTŋŃuHD*8q",,lV b`C___BBL⢢"e``קhnܸQQQD"JjuZZ A)P}:teee%%%T*ɓNNN111'11QRY[[(ZPP >"bJJJ_$\\\0?.??%%%uuuח`0aEJKK9[$&&ݻZPP6 "`- 2333 ?pjjj***l6&dD"믿611Cq L&L( ΦR knW0t>>>pf9F,^0dffZ[[EY,FqrrBQ>??PT*Ujjt GGG2ߟbfffddP(@hE꒒`JNNGJJJJ,))vrr"mmm`Lzz͛7CBB@)zU~U!tTWW+K.eff#ST1))NdCCá?[[%Ivvӧ?{H$Rii7| DccH$裏 ?wh%(Z]]gϞo,kjj4_*H8  <66بhN>]TT߷oFR2l ;v,'' Duuu ~ 2!!D{{{ y<^rr2GQ);;+P4Ы:|Srl***0ݮ;;;GGG?2|3gh4|={ÃJϗ]]]BɪJe||8[/((@ڔ(r{455;<000pvv.+333)))? ȑ#}}}300;w'&&Ι3gxxEAh4|ٳeeeOLLJ111>v%?? .XD .p܌JP#>ϗH$?Y,֗_~|{{{:^^^^RR299 7߸য়~8j=*/^XVVpÇCEdRҒڊ oI]]] Ezzzvv6t+++ё5ЀT*-**=>}}}GzF\><<<22ߋDx޽{<oKJJ-sssGGG'&&ݻDݱ* ;h&''Lg}cQ"x< O^SSPEEENNP(LMMjMMMp@. Aalll``윘Ѕ|###_}7rssbcc?>00_ x}bH999UUU}kk_RKVGiooxbMMM}}s:;;9jݫP(;|ʕׯ?~ECi4X|I???CzcCqd;v䞞Q@ ֭[{. mmmTd2[[W_}uʕBPgb˰"8\aÆ;vX[[={(IDAT눥={6n(Jrݺup#.K*FUWWx<cǎm۶d8 Jbbg 6lضm𰙙*// ܸ֭qYz{{az~Gmmm4̙3?~ۧORV%ɗ_~)Ο?__psεͰ1zvrvv~u$'U\\\QQFVSRR|gy0==}n{{; qddwޑJNuȈ!wUT ֭[&&&2?loo?~@ ϟ?D"/>>Yjռy󠋂 [UUuqpI ;s\.?p<СC2Ns!rٺ}}}GU~mMM'|<]]]CBb"##B!TpĉGNNN&''߼yS"D￯|իW~C ŋ1}uvv~W 'OD1110SlPzju||Jz7, vaiȑ#󎹹9\ y}WjZ ?~Ϟ=ǎcǎ-Z(44)__߈ofpp.]rtt\~F;wg}ߏK^{{oƊ+4MGGJ?f7oM ֯_T*333MMMi4ZWW޽{wTT[oaH۷o;3|>쳰m#Oͷu7xÁCCC@ #… o~d*`̟?Nϛ7oժUBAŲP(WvwwONN&FFF۶m{LMM=<<:::`zu~~E{9??*OW^yeŊQQQUbŊEH$ pvv>D244Zn/lgg7h=ܹEQ>?:: tR^;uTww@@Ǯ^PՂH){gy@J$y<^``DFFƺulmmf͚5|//Аoo۷eee a #==^e2Ygg'jcJ.\^@Q555oܹ|M__@`d2YV/]ֶNzyy-\ʮRD"Xj,kbbb^^^WUU500oܸQ.]v lRj;v숏J0 /_ q>2H$655i4ooe˖1L ZۇR+`uϞ= >X|9Lt*j˖-###gϾ /i&IK.466޾}ƍ_x1000k֬˗{xx!SJFH$233)))VVV/5\6<<,B!2 C&r9L4 : `SD"(HRabW\g!3e~gPh4>>>sA@z_] oロ7oH$ZlT*RAΝ[TTߟr ŦMaDpjuEEEGGGOO{;ϝ;wttAVT3P(xlDjRI"jjjrss˙L@\.noo yDD%K=񚚚 )**R*J2--277 眭m@@3gJeDDW^R"""\Lfjj*J H$K,GȞ'''~;qV[UUYUU4h5kk봴|J󳳳Abb" qqqPv‡'NohhЬpܼlٲ8JR)R)%%%999d֬Ye2 ͙3GPl޼1%%%33"##ܹLyyyVWWp8___LbŊ =<< C"LNNVVVB3֬Ys厎ggQ:8222w\RzzzVWWqܙ"Jʕ+}ٝ;w|E&''y<^tttIIISS)J)))...l6&77K޻wsprrrʝ;w.\X]]mll`4E!6&''bZQkllzj__ׯ쨨(CCCsN 2<11Q,YFPܻwtܹ7nܸ}gTTTaaallFY~hrr2VVV.] ȸv\zuWWWjjjWWڵki4ڍ7rssoݺER׬Y300r׬Ycll|մٳg_tƆBfBUU 3Kz'SB!NN8=SWWK/YZZfggktttuu /088XPP`nno̾>???d2ɜU*ؙZ(8q1{{kkk338+bJqWWWPPPssD"ӱAAA-200(,,ݳgА]kk;̯_wa2eee򊙙YooCGGAAAJ}뭷t:ϟ={@訬\`ڵk%;::jږ={xxx<3...555RޞdYYY͛7.Y f*2RTZ]XXhmm-}||W0`;w.J...B-bF(*^x###CC˗'$$oٲՕ4@ 8& 1*֭sqqhnnp!ñ)rqqٱcLqvvV###AAAR׷'00w޼y===}}}g϶ p8666l6<96o=P0>>nhhm6R޽e˖͝;߿dIIIs8"&ieeyfWWQRh";;nhqAf͚bgge˖%K@Yl5fllhllb\nuu-[<===== ~aP9s8;;߻woʕt: ۶mGPPPhhhhhF)))Joqyyy__ߋ/bZ[[ׯ_oooO _}U!!NNN0`MLLͽl64yɠL+-ZP?Zә*7qx1[nDzeU*< \aȦM,-- $%% ̟??** n>oذ(0qtArȈ=ɿ_|fxo<1~ |agҥK׿ikkKLLRxceeAz衇O J+Z0˩:@  0EN2 ia)o ',cןD"AX,`#STb?kq22<! 왇]Q:xr87H$uN> eJG}:52#@CCC`vJ R×]Tb4t$#A t"ǟޫԩ mw ~0sl lC8m?bEOS =DeuW|7  u:Iy͛@g=r42ULSJ8N1Bt?AR:m),Np_X d,d+2 i}*0@uaWO8-t>T[0Q䧃nH$T*SN /,lF皟됟"?=C=+ twiܹ(vwwgeexKVZR4**955ull,::qGH$Ȱ {H$4kkk+((rχ}`aa1̆UV1̶y999544TVVzxx̞={||<##JXBR"b``rJ.[^^ƀ$Pmkk100CuBH1?n/y5x+''G&\iR H"Z[[|M,VuF W/Ʒ 䒖|հ?Ϡ5nɁHE\tdd$--m֬Yj:11`…(vvv\d珍YH$JҤ$kks"7::rJ]oo]d'{N#Sd8 `lܸ1++0** EQ''-XCc{8pb` ֬Y#Ν;<>;}4DTĀ`gg'x '&kkk:;; _h B+SRrrrJJJ |f%rT V622RYYYTTbX,|iP޽҂_)++r:T}vmmX,.//SZNJ} ~J:r8ͦ_t o'&&9z(Tlqqq^^^LLLwwcHŠ\;22zVAe2YRx(秦*J='O>}ֶ?߿/ ݻ(ܽ{t`r[n,qΝx8rM&ZZZ._ '|BW\_3顇z@qڵk7olnnN GFFٴiS@@111imm=s N{sLLLJNJh4/^?p@MMMllΞ=rY>Lg@to#8qD]]]CCv\USVϞ=[UUgϞWg666III555,`CgςCo>'Nؽ{7O?T"0{NRo|3{nFK&_|E__x.+lٲ4++koĖ-[@oʕ+sss׭[o755ۍ=zT޼yXPǏg?H15KLL|goݺjii`GGG2L/^, +** t:hp`0֮]}vkk͛7ٍmݺutt:mTTٳ (z&{nC"˱$,HOf >N1"űcl #$$ݻK,PTmmm4M@:JIIIZH ɋ-B'$$ 222<>>.4MoooffΝ;̙S\\<99 ګ6QPP $ls= ,8t s X%pnu=C=#?RѣGYfxUVDtsssSSjXO?jjj<=={zzRSSkjjA\\\JJJUU>AJU\\ގq?|~!((M b͛d2BJ|>L&-Y&''@߮p8R677#b\\\.]{NLL466&''C [ 233 ; }/_V*s=rڵk%IPPPWWWRR 3#xBJrrr288"kkkkV[RRrKJJt"6R&''322|~\\ oƴTAo߾sݹs$!Y TRL&G&-[, W,+JB}L& B[[[6}e@MݻW__RQQq-Zn:XS[[rJWFEE_rܼ5??D"q8/%''_xŅB;vL$A^nliiiddty'''F#j5Je2YYY .TT6mBιoooA&&&`ƍy{{w.L&H\~CqqqvvvCCϩSlll@hٲeEEE...\z544Ap8]xʕqL,顇z>"E"Bwvv555 `2/YaaDrvv^`Ass3ڶm[[[ڵKV755ٳAR)ɘL&kmmuttTTnnn/J(*H鱵555---uss#,L& ٳ ***={|CWWFQ*k֬{w jjjFFFvmbbemggd2+**LoAb9s,-- Bcc%KVX .A@|[[Ν;U*U{{]x<^QQז-[\]] 6665o33p*:44b L:~Z-ݫꊊ GGG\->~R(`0 |fϛ7ެ@>}```g(D" BRA>00;44ёbs8ZVFP`MĄᘛ[YYl GGG.;::{nGGG6 e=pʓF1Z 2w\ ^{dlذ-00iժU*N///S*smnn \pZ寿xyy9YiZccc[[ۥK͝;Ғfq\GGǹsFFFJ$. T 'O(T+D-^í` wwwS]]];wh:N BCC֬Y700`gg"MDz衇z<=j0]Xlbb]TPGmUOqG^B>k.XϦj/o>22kyƺ 2s=gll }UקqC=C* 1=SOOd.?WQ']p{o:Z'"hLſT*< 8Hb 77,>Juq?!t-h~3>nćlO[-+R=6F/|bB$rB`0BX,H$2,Lчp|mD׀UAtn29J%M,@X!@ (J 7VTӯt^ MX@'& ۧ:Al`0}|CqSTD%2tfX~?ao;بLJZ<2T:\ x 9Fos3)*#mll|mmmwQvvvYYY...d2Yddd:::D;w"vvv`O`x2uEQ:G,ō;::*SSSLLLC!!!޽{YYY"ɩ899H$3䘔TTTDZZZbccLEMMMBBD"p8111ͮ իUUU---NNN ehh(??ɉ@ @ ;.`0T*4Fs=_1~9|;O3A0V://'KEQ@r]6g7zJScd*9addƍ...('%%ZXX S^ "x`.gG܅LaG*'&&;?ʷP(2s\G[@`hhc\.(j̜kkk&ޮV]1$ gP(bcc{zz00FV{9ׯ XYY=nnn$ rm Ϗmkkŷn"#.722斒RSS9d---<֭[E `-66v½{X,!Vؼ>> "ĉ 8NM:MO$'''?>o<|vvvƚEP>|X,{zzS1emmm(Gykz#666 -<#1,Gl-a*nܹcj%)))%5<<|M`ccf(dgg;;;h;wZZZd۷oQRRF&[ZZ,--MLL ŝ;w\]]Q b͛|>ziEE+BvL{{{Q[[{i'''~z%/<]{{;ź{nrrؑ#G,,,DgϞFc<(,,5k>>GRuuu}7555PS/_.--522ȯ4lll^MP{zz@S̙3y?@p?n*((Eibbطo߉'ϿqFuu5)))CCCnCQ3&y!HW_MNN$%%BСCFFF{E믿NOOOOO/))DJ722e2١CM299gϞꫯ o߮C… D"ztwW^fcccՅ ڵkanL(Bzff&x?lN۷o 15k֬YT.{-,,{ hZ_b288ԴgJe```mmN"y晕+WdruujCCCr|ٲeB0//oժUVb2APS߰aaff1׿Y,Vggs9w\\\ŋ *WWW9r&''ãٳ Znii!ҙTF۶m? Ao }z{YYٍ7bbblllooŋ###p̙3+WTꫯ0w0))iŊJɓL&- o߾]єFDDرc֬YRnɒ% N[XXq8~޼y/Z [n\.M:-ֹ^}M6W<0 vu̙ 33v###1:: :;{9ud^^^s΍Js '2 ƚ5kQ511H$6mڲeE``y󪪪0%AbqV*..زeŜ9sUvuuz*rr|bb!**jddFYYYUVV(iӦxN<_|sIұ1"866h^|ň/zxxxyy999ڮZjҥPB;^ B[(.[u...5$$_>vXEE9Xji4Z^^l,I&{ eee}'O311_~e5͎;{VZf&y崴4PYY tT*=~8驩Q*h(d2ƍCCCA&<< R{{{5M[[A:FFF<oÆ vuD266h4%%%>mۘL&D1uXb%*ܹs/Mpp0ϧFFFBphhH,nGGPC733ۺuu^^B133;vmRhDx! ~pppؼy30Xo7 ]nKnn.I,/Yd͎k֬ rNNN˗/_d t0IPx{{^epppܹ7n+V >;9&&&2 })|#:]N;0y xtww ÂazEÔ8p~@ 277| .LMM-++w^II vuu]hQss0,*` EnnnSSSssYU}]zήD6lADT:>> ]"hڵVVVbxtt޽{366fXj}}=,㕕566rb`W}ҥ~iBBh}}}\\\\\ ]P<㽽XX_$x<+++*ںl2{{>8PjzЕJ$BAR333'&&h4Zmmmvv;HD"JE:44|rLtR__̴4KKK+++D"466~'OTTL&3,,L _xfKP(h4ZnnnffT*>O$###E"QPPPDDJ{.4(zСWzxxB8{{{{YY_|_Λ7<%%+""">>ʕ+ €8 411w]???djˋ@ 777{yy-[?a2MMM0+ikksww'׮]rrrxg͚wnذatt͛===W>ydRRҬYBCCaf՝[h"o޽{AAAsIOO?s挹ڵkoݺ500~zSSgee͟?7n8{,^pakk+ٳkkk'z8=P(lll$А/vK&&&t:̟?v]7o<99ponbb zT> g\\\_@Q"l6N}||d2266677P(666&&&>>>ٳhᘑV]boMӛx<ޮ]$ >F W^yJpsss2 p8_S(Y(VTTnܸյDGGUhh(ɜXv#V{xxh4xU( 9qttyJbD"pR(*i4˗YQJ={dscc#uֱl{{ޥKz{{h4488X ۇ(קj.\mۈD"EѥK{{{777FEED"E̙b=<<Ν`0|||#"",]dddSSH趶0=Pa`Z*$$wppf/_<--mڵ0lmm mmm]\\rb 599!!!###V^dIdd$D8;;[XX@jVVVpX[[qgyB\h4֭[Y,Cssk```mm[ZZ֬Y XaKM655lܸ 866}v+n۶fΙ3'22ǧ^R;;;{{{6mcccffdookcc6k, Dxb'''fa:D eڵvvv<NXCSFVVVFFF?>>rJJaii9{잞P;gAss薖YfCIHHH__X,޹s3lB#œ q`@PPвeT*UHHCKK]TTX,P(۷og0PQvuuu,}ݺuD"R(E8;;/[@(N{삃7l?:: ݌b _~`Kmllf͚`n/jooߵkqhhϒ%K Bxt/ݹsEhhhGGܹs Jn߾ťgFFFuuu@vw+z_ZSQlL&  'ptCz<8)ecccOxj#S'|qƹsYccXO𸏌<>Zʕ+IHHP(7ntU!Y`%G֭xDEhҥaaap{oooLL .o޼`01yܕJ$:#Goq@9iu 'Ǒ#G{9wM\.ɖ.]g*C=~STXjaD:|>۔K( 5(c 8-SPa; ^*"l$bŪ>&b!GY-}||Nގ]e`mղ< "W^z֭[vvv999n~Y;;;kk3gr__ߢ\䇂pBqq7lnnʲcT 80 ᴶ>}888H$'ONMMU؜zFYX,87186^ٺuk@@D$,]e޽d0 6L&& ) Jt<;d={ l o _c$D") HwHMMų<@Ӯ2ЪðIhX|Th: FFFh/;pF+,,555[RRbccۛi6`ٳƍK.D>w$);;ޞfB "eddNMM<>>KKK/]'MtA]]]^^^__'ﹹBLf啚e˖aBi2BaNNNuu5z  ÌFcuuuvv6$:y;dr@577dWŋB7o_b2.\aX,Q(o3?ϝ;y1[[[O:m6X78q`Rb ~ƍk׮aVXX_cBIII7o?@FVaA3 VVV޼y;PKKˑ#GpHuuJͅ'|hFcyy9LN볲`?͛"l6!,a` Rt…QSSs А=}7ovss۶m%KlӤJ x>C jժ+VXYY^redd¯^:44 WPxyyA B7nZ|2k1Lhpի/_nccߚ:LG\oFQ ,__!ok0l)ƍ,YB}`F>11钒R)xoBH&555tzCC=<<.]$_-[ YO>3D! ::rȥK|||( sss[nKOOٹspAA1 KIIihh8uڙ`pss{cao^iڌO?F޽{755h4*~HrI;;󟭭f0---wUWWJ$#GTWWOjjjurrrtt6m2Lt:ðuAP=֋Dj_T]n޼988xϷ l۶믿vuuęw=w;;;hnn>vX,.,,ttt|7`944Izzzϝ;d2׿겳[bEUUZ^d Ny&__j-++t===~!.O:O?N,æӧݛk׮nZo߾(Jwߥ677mE"g}p|~~~;w:::Ν;uu*rA.}͛7[[[oڴ &煅ahhR+`MCE/_|ddڵk]]]|>9Grz(2_q'ǎY`Ptt:u 2H$ڼ!iSSdxx8C׮][l_`2|Qu! 455{> شxΝSSS c߾}yFFP($H׿xpvlhh \zurrD"1;wDUTT ۷obb^'n0-ïkty{/!!rjjyѢE:B8;;d2//7|3!!!((6ͅV 1S! ׯ_4KA!vGFF:::###W^L"6nܸaT 4Ν;K. W_y&dvo~CA+PL-Zl6ONN{&)$$dʕ~~~mc###׭[qƱ1ljjڸq/~ >o4!uT*Tmmm\.7&&dh_ D"с6oތPiidx˖-sss۽{\.~w.XGg?B{*;vH$Zd" E8n{xxAF'!}]SNl6;88W۸qc}}}nnׯ_|^Ꚕ2::Jӹ\T*3gdJHHظqH$jhhXj՛o G}4 ?~TjIIIKKBHl]k6mݰaTVV ǫ7Zd1ЩSB$ƍ,7MMMx_~eff+ qF]]ׯ_O&'''jxQQQQQT*}׼FFF ՙ3gN< di4Blll7:>:: Z`J"D"/  '&&̙#HFFF֯_gϞŋ#]"^?]v_^$yxxgggS HҨI>p8>> cܾ}i὾YYY׮].˛:uB(==]R=%z=Juqq̜?ݻwsrraEJ$8؜ILL\regg'8(r< |``ٹW_=uW(ŋ555$!ܫg#j5aZ(SNegg+ )ryjjήbpppʕJW^imm}BXfft:B(++kʕЪ$iNNNnnn[NfxK.]b(5:P(555eee6mZ`QU(RT&I$0+ƿi&2|̙/0P nnnf9//o---VVVYYYaaaz~>Mj**&&=qF*))!0?EDbRy֭ liiiii4$ w8UTB*xXPrAAA>nnn \|yCC;#KHHoPRRzN">z{{ f0 STd29D"777Ψ(:!xHHP(𰳳 ]p!0?dX4B˗T*DG1nJ;88%%%EEE&$$988 {'::ztt4114BZ>jP{T  wwŋ|>ؑ2lƍqY`pSwqG5!966pBx<^P(,qkMf0̞Bxyyyyyyxx;;;مDUVh4Pp򶶶kΙ3y… vvv:dnذa``d;::|OOO5aL&龾<BgOOO@B1J[oyzz:::FEET*ggŋ^{M*yP&IR|>$OHH x sVkkwyF nnnǪ)))ibbwƍAAA|>?(((&&fҥ s!. iђ^}U`Μ9aaaQQQvvv %"""<<<<<<""D"xUV_!0$L&ݎIII uCCCs 谵<eΜ9m͚5|>_Tzyy twww[[[._lĄl󳵵ezB@Ez-[nuvvYfvP<#+:~8ufT\|ܝϜB[Mǚk6B}}ǟի0Ʉ 4ƞBA>pbի}766|h[>?)4<' fg̩3wT `2ef4-eSgh3j\.z~TB;-Ӏ[2 76Rxˌ ,ݷjt H$Æ5\l4A?oC˂3M[D[&KQxs}CPFז>Y)8`٠qǻ z d3x>/g FҖ gteA/-,vOLRIR&N x_ψO>n{?34͓?#Y@(VP(\Ձg3xZuxA ^)0y H=>;e{ T*,3XJRϾn-MH@U*e÷sXPdY;He"'֗cTlj TLJtj'0?kg$fFAg!x%(RT/l6 |>2'<h[N+! xv ɇo? בř9g 3b=({Po_Y;^6  r- r``DW35b zR}qcזpRXn3C3 Kwo"zdr-uM%oY,lxPۢ f NKU^/m{GC>HUsQ(Zٹ&++kbb" ðƓ'O OOOȅ@Ǐ;l6 ####@Rf% u 21L'N F{u[[[GGGR`D"edd@'NܸqC&ߺu&Mn 333Y,χӖgϞ!988466fdd9::b688xʕ H2 ɰexTWWb@fL'RWl,]errr*++###> p mmmgΜ3gPMMݻwAcJwG F;\Njd2'xiq|rr2DrssCaX>D"l t<]e^ѤhZeD" Ecc#!wθsAAANNN(++lM%%%8 ^Bf]e("##oܸqő]v)W:588:::Ξ={…/|ϟvͧΟ?'}&^sαlFsB͛7]iiiII [nꚜJLL 7 2lܹRǎ߲exrrrbb!Α#Gk8sY\\[n۶-88믿Dԝ;w*Jd=<<|ر[nutttuu!jjjFGGo߾}ᱱoH$G)++0.;;;779}9ɀg޺ud2 NR gϞUUUΝkiiĴuuuGee%B(%%ell ;wNBcMLL`vΝQV[__aXggBܹsϟvuu¨G};v,--ͽxX,0 ,ϟEe8. !gSSАe󎏏9r/KAA`xbff`D/_V* B.r8055{ȑիW;99iZWWW;;yT !]bERR$zXkkk]]Bh3S]]=55(*++CBBlg^^Owp8֭}<~|pʕ+X,mذ#7n DK,w3666WPQQAP֭[7|@Cᣢ KllT*DQoBhjjNojjrww饗ڠ+VMgR;z(B(==ʕ+'N b2...h4~W|>ɓ{Jvb٩Νstt.h cڵ...Ol߾]VOLL( ~_rE,ۛL&0DoŲ0׿%HT/[:88xzzJPPaFٳ%%%W^ڱcGUUUNNjFݼydhONN߿!綅B;|}}۶o?ytt̙3J2%%9sF9x B&'vrww?p@}}]X,-xAAAd))))))q8>ysASuH$Rjjjhh/ wD"MLL$''oڴYڵk||N5Bð-[!!!Z]]"##[[[ .+vh4%%%===nmmh4,M&ƒfsEE,{˗X,־}|}}ŋ999%$$hZXT^^^j|||HHkaXII d |5OƆ;򊕕^bccmmmu:ݒ%KV^aZ~[_}UBGA5k,\5k֬^Z,r[VVtR^ SYYd_"0oooLhѢa>ٲ_+V`/?aZސvD"7|sΜ9ɩᥗ^z7jʕ+]]]l3m۶qFy߿ɒ%{AR(QbŝA|/`O8u /&''|~yyyyyիW!t!NPt:$E=qđ#G W9Pk4W>?s挝]OOB(//\*_L&Tႂ۷ow}7((H,dHqpppvv~w[[[Z\./++h4ZV" LfHHHRRommm-H kiddĄ\.R()))SSS/~H$x O˒H!\yM^?7pJGGSNQ(ŋ9sbd0F`?~kk[d2ݸqڵkO초iɓW\QBz궶[jZR8qqg#0rJ\.J111 !777111''ٳ\ l6B;w%K (o߾jF#N_jJIIICBB dsvvv|>̙3 mgҥK?ӘBj*:~|&W[[xٔ9s怵9t:NG">Z<99YSSs+WfԡC éJR9;;h9sd2)}]++(bŊkcP(~߱XQ)BzBCR===]0LRd&I#""R ,y{{;99ꠠQgggpB& o~C9N@@T*L/6jwN ^x1-'&&Ν;.""B,;<. 'HZNNN}<OPZ3""b͚5@P-ZhxxL&{{{x<㽼|Z~\\\f7lh48OtŊJAAAnnngҥF ((aFtgXaaaCCCL&w>>>svvv!!!0} 뽽Ɩ,Ya@񬭭CBB\.􌊊ͳ%B&afps\\\tt4M߼y&&&D"L6lfmmmCBBBl6;88xjjϏd u֙橩)&Xޯ|<:3s\.|F>ΏgN}ˡSSS;57|'2 Bww٪q1}RɓFѬ\2**߽{c(P(trr"| ~d Css3<,s*Bh4h7Ʀ$x /&HjZժjABh4 EVt:)б +<8gi>lB0!~O0 L&V \.Gb -CE,STO/@okt:R Z)>_!-MhzjX)|`@C ܪov%/^ 1-} ^{54=˕/\N&mmm7mDPr̩0 ѼxM9.~oM@oO@@@@@{̩(J^?ߠp x8Ͼꂧ[>3 2041z;\>g-ea?kxd^WT 8!J@@@@@{;,%YHe@RX~2 <%}YKef)_Vutt$2?2abbWpDRC5/փb'K%+Ae p~3.qgPXJ8@o}?<!q\ \vt|U*hǽe_ T4yO_Px7AT. iׁX)Gk nEoۢo ݊MgF9|Β|$ #!UFPhZgg犊̱1H^S[[뽼rrrnݺLӇ:j2NdBdvǏGGG ܽ{7""<#T*JxCh=gggGGG| W_r8Ĭw&HpfxJq@wi٤xsH$\~]hh"ˡ;7n8{JmooOKK+--urrKOO/**wppŁM@@@@@2?*s2,))(''ghhhϞ=aaannn!' ByTT`vvŋnȑ{o+9Dt/_Fpd2… lll(ʅ B*doٲE*חw#/\dɒX-[VYY -uرȭ[8p_NMMÇ'''ONN" l߯Rvcǎ1СC߯R@jj[[[0  7n8pzM'IDATo>55566v;w`VYYyܹbvƍg73L,O P(233_aXDzlQ__ۋbԩSﯪ0v޽0 nݺgϞpڵL8fpCa)Zmuu5aRd2ZӧMmoo߷o_SSh|2anD~~~ _xQԁjݻwyqǽO?tgϞMKKccc@.OMMbX 5͒%KN8\UU500a^i4HD@@@@@f.[,..L&^zU$566B$hѢ@h FGG'&&n߾xwwwHnՐx{^sh4Xi~WL&B~͚5,L&{zz.Xf$===o o߾MP^~娨(VBQQQ"֭[qqqr\ӅJ$溺:___R---^^^-rqqioo/--3gA/R׃}uZZB(33͛l67ouҔ^___gCUVV^|˫d' 3؍;;;ê۷omBa6?ׯD"022k.D;;vt:}֭ȑ#۷owvv~+WΝKR'&&ٳ7o޴߾}{YY˗ZBo߮`24-99Y. dDv}~PBa{{@(#`0:t!t]v|w<-22СCBd2߿;###>>رciii/_6 k֬L&h4uww3 s@+fpwtsD?/^Bawuu <=={zzjjjFFF5u:GM_$i111/܁N߼y3dz…}PCCCqq1F۹s-[.]_}|BIIIw߯P(H$ݻe2YAAAGGꪪZ-,CݫhJKKD:{lLL ޽{~^z)??pp166V655L&nݺu֑䊊 l6GFF,ϓX !;++`"СC...w)//t``Xb"B!J%2 "H&a?vRrss޽[QQ>?(_׳gR(N竪֮]jmmUT~aLLJbX"ȑ#stttuu}뭷ڦRiIIIMM ˕J @l2hѢ?Aڝ7|sp 66V$''de˖wh4xȋ|>`0,X7n$R)==L&XB$A&4SSS .liivZSSGt\q{=//+Vmii0eϱcw6V*r<(((..nrr2<.f$VVVNNNVVVc``@q\Zzqpb===... cbb&66J&͟?ή3>>^r\?xyy577wvv `q8Dhoo#JmmmKKKbqTT >bGGGE"Q@@@ggN[l(_wSta4j5zDӒqtTx~x4}FpYH$ZhT*R'ZP(T*O%e{@zdtY ,2^ qr˟-L à&IRAM>P(2vрPG˚>!c6Z\.qJfhZ7Mxjގ[vr-׻eo>rd2啖uCVZ\Nf [[9~BK,?wh:~f NwZgD"iZV]9 ס > He~{;f2 yt ,R)?yu:2Fǔ/Vp\B*C@@@@@#.؟B&*/.K{ăb'K{ǤAU}/,xy\cK,EVy-4pD޹ >PMnF>>35 M1nP6$lhbpAP-hKK3  cll"NHzp5 0kjj;< fH$Rigg?߀ ܻ"""\T*m۶b ___#HN8Im>uֵ uuu &%%ddd7پ} L^VTT+70LRH$&gjj*&&͛ׯd$44oYlΦ]v믿7oo?pJRtؾ}G}gϞ {{.##c6667o>_{g۶mp믿`0$>}Fwrr*..6ͥׯ_wuu/ OII۷H$ɓ'8˗ۗ,Y٦[gnܸVbOZ$ə3gH$}t:ӧWZĖ,)J ܹC"d2ٱcnjFFovwwh'&&.]thpΝk4i4ڙ3gjjjBuFFFgggXXÇ9JќRѣG*++KKKkkka2aL&?Oӟt~VZZgoopxzzzzzBrjkk̙ZPPPQQWXXyfooo//K.vttVUUݺu+===((#BSI$H$h4ն c۶meeeȑ#L&tddDR  Lq, gFNhѢ}ڵaczyyy!!!aaa.\or@  "Gks\Њ+@zaooK/9::tWWyA:::bo[X ξ|2BYre@@)CCC/^LHHV lܸD" ORmmm񮮮EEEK.Od~ǖ-[BJĉ삂sr8ooxЦMAvvvQQѣGi4ZggѣGn߾ +ڙN/[ N=pa2T*f珍A'r'{ KMNNL&sǎޅ 8 W9sF" 3g 0Le6_~^6ؘp顡;vݺukdd.%%֋h  111vvv۶mS*vvv111AAA!!!P+W\~}ѢE\.wΝpJ~~~}{HHܹs;::|z300P|T*YYYwٳgOIIIyyݻw""" W_}% pDDѣG'''G$ hce O_$H{IHHs|塡!Deee/@ hkk+//\~}yyy-[w^pf</ʣaXrrrbbe4 944W_Azܜq޽}}}T*u۶m[n~ Bh˖-@]AA+RQQo!鑑vvv۷ox׮]{ծ.Ff0)ի###WZEPjjj"""ΝIFA47.ׯ_lR*IIIG$>.`IIInnn dYYYY[YYtDѬ@b` AIx<^KKK\\DzNft:RtŊMMM .JϮS~dL&Jݼy|Ō ww PqqFDSSSQQQ\. "wDGG;88[nÆ FqѢEqqqBX*JemmkootΝ%K0@|É'ry{{kvС%KX,n4rڵk(JDDDTTGO1E$ 11F`0 p !?9''h4vww߻w@ puu/--===###T,wuut/ E{RybFG}'.\tXa\SSR_~ڵ[`hp8o|믿144$H*++{zz ԣP(F122rw/_~||`ؾ}Z^|a>lrpph4.XСCjlV*mmm...ǎ#HWJUmd---b:d2]pznMI ?rȥK4 a"hɒ%CCC}}}J255i nEQQQz~޽%%%O﷜~xyy;wҥKJݽhpp|0u:hd0lmmaکT*U*Ν; .]*JFN9Yj.99D"\p !>`F444tmh_~Ν;GNJJJNN޹sgLL Jh4AP|t:PH/bΝMMM !ooo@Plv___bbbEEExxD"t...F lݺ֭[JVanQGBөjRT* \.W(?BS$D" 7ouEE(ah4ZAAmll,Bzjjji4XWTE&֚f6T &&&`JP__/J!DO755T*ټhѢ^,<<<B P(!>>`Bs,XݡgX555ͳa. noo?>>^WWk?dX,6L\.7**ٹСCŕ4,,fPXXP(z=陘ptttssR`f2BhDxܻbꬬL\.wqqtG$yxxtvvY0lllbAGӧ܂!ЃZ8hAN&{{{U*MMx r82\\\HLj BGT*UiiiTTT*A(|>BikkH$Խ푑NNN&)>>~||F zzz8H$hv@P[[Ka166f0z{{'&&H$),,EEE6660@~% x pJpddnnOOǃ3qwvv~,}jj qGaP(l;3BJݟ}˗/766H$>-B& wV;22tZqss2)>я҉?!lt::No߾T*b>p*vf~툈`4.x8B<Ѭ/Vi񔱏Xt Q ׶hby{uuիW?SpSAf3wD.#<XO<2<'|hzA+3WI$Bh4+WjzlhJ>;\hL @`ظq#h40C&TeifX,e76V+i4LJ!g 8Hqv^/p_G0J$BI{Ag~af,C{Cnpl ~bG|R}Fw|U_IENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-zoom-in-3.png000066400000000000000000006466021414302661500265240ustar00rootroot00000000000000PNG  IHDR 6wgAMA a cHRMz&u0`:pQ<bKGDtIME )tIDATxw|\y{cA/$:6QDbI$VHnNMY:_$q8vl9HdI(Pb$@$۠ f0{?3 h&%3s{+m*Q( BP( ]eY aY֕FP( BP(w5irb a ĕfR^zA BP( BP(޻I,Ew^tt$dRt]2+ BP( B1 )-LDWg oI!Ĝ@}uC Eḓ !n,4MFVP(MӑBJ4m<ۙQBi: 1Mk,\qgĬ㝽@Jk3m?[:iH XVҝe߉ BPX4Mt]qeIUॄA #c:iiñ,h4D4jH6>~O%vɝAp˲ BiZ46֓ᠹ2|> 7A'Q!N\2<<̑#G x^^Ν;i,_h4Jmm-7t3˲Ɣx )夁]]՝ᦛnp DJ.;Xzx<^rLq: GKcɒ%$~)ONN6Auu5VU B*r\AU !Bcߑ0 re%:uuuDQN$Cl6vӴ:v­M R0k+9686`/+ jEG7}477… q]tuu]גs8AOO~"zzzw~SRSS ?~H$Bzz:nP(?󿐗Ojj* 000Hgg'."0CCCYv-deeeYzzy'usy())| _`~x,˼٬P( $O0F ]OV'%~B!j|oKIB088(0pÁimɃ n-[J}}$6˲Gh65C"ft+ B1;%'lp=Ogg?pܸ\.ya/r-l۶'nSRR~cn7))>|ώEQZZZXh~;eeeÿOhiȎx"Op7fܹslp.\瞧˗رdgPZZҥK8|{Or[BP(W% #ďiXۍngB.\8OVV)ٶ  XjjjhoԩS~455ՕTL-Kݻw}~X >o}BA,bddCsuסi_4Ν# //deebH!|> Y[ow://9paPVV?&^{5V$\{z4MpZ[[7 Lbxxp8 }k/}b"t:6wBP\uHi&ow?r0WߟD'\.b14M1ɭ0hoosGV'^.Gq=hNoo/Y1::x(..fҥdggf-Zb5p,ZTNE"JJJ.[!$//7N__lpEEŸ\.)..r%YYYv{Xn&<(W6իq8r ,(7tׯgٲen.]ƍYf5EE\nضm;wyeee:P(4fi"y4-1><<Ǔ2yiX6p8'\a"X$A5g[JIOOiz ѴŴd iJΌ B,*]vP( ͖f%W}iheL~M:a&M͸?Rb0 ]ד'Iȣia f%q~>?/F5t݆eIM;1SfY[d:###44cŊ躦v) IJ,D"3Jqkܲ$Xtov}N k-!o<<|Iܮ)Wv B=0qjPW, BP̄~.^]l%ޑ~>Y)+ BP( jEJI?;SDҺ BP( B!+t[6BP( BP(.J [a}荝ޑpq;wzn7W M~''O9P( BP(~ۏ37 $\./K9, 0R:mmmdemxf)rH,t BNs\VxRJbX=˲.y;_$2Mw9wxN8ASSeeelݺfz{{yOVV֜ʧj^|EV\܆k.Ҹ{زe ٬_ozRSSYd v}I˅tz9q@~Ot:,H$%W5Mo~Cww%O-vB!v"iRZZ>ٺu[Evv6G?J^^hH$B(䄈ftb j\P( BP(̨\. %%%Kjj*iiidddpcY]]]9[)%,\lv;8N222$77_|UVpBڒ+,X@zz:x|tM={gyk2b7oNWrͩ&gdd`&\s @{EqmzOJjj*V"33~Μ9idgg]Y`yyyRPP@ii)wu]]]BFFv0ؼy3oV+ BP( B.F LJ 0 \.X,jf#Fz89D"hnO~lb1XP(. vq:yI2Otup F|>4Mcdd$y[8&%%}Ya$VGGGIKKKzi$ß )%p8pӉa0 X,ƣ>C=D~~>碣P( BP(wt>_vc~O?Un.K:JoLi0]3% q1VZU BP( ]Sݻč 3k BP( Bxwc WZBP( BP(౥\i BP( BG{^( BP( Bx(]P( BP(+ BP( BqtBP( BP(lWZPffծP( BP(.WDf:WZ BP( BPSB$Wr-˚9L_KHII )e2|)4M$_Ty5MòIqJc6&i$-ᚦ̐-ÚlL ~&O g6733M&&O9㻗ٹ"?CZޛMWXߝ!?51>{KBP( BB׿w= x<躞T65MqE4 Fq8~- ݲ,4 Oww76FGG@uRRR0 zv~?x^cx^(~..~?n˅N? Ӄr7)<4ioo'i0 |>_2'1ŦQ\!48aJ*S9b# a@gF_B!A[F4*x$~CC劻imՈF!%w{zFb#DmnCƂxhBCt#H$6->wh H$iOD@`;z"dvg G:`O>Ĵ wY"C;6M8tFAAy⽉L:]Аn],~&"ZGhBC" ԝɉ37@4@H;#B#=Nͅ]cXm6x잙\P( Bx2cQUUE]]CCCTTTM8 q:AFFFpݼ曜ac*UUUTUUvG}j0eee?VYr%[lߓWѣ9rly'to ())Q1MX,ic# :;5Lz{5vIwȈ:. !⊧99P\::4nSSS[bů~#GldeI>뤫K#%EO=堡A',\(y6Q^n*;lyCinA:6JUOu:k߇#?%Ɛ%i% e8yp?K3`FbtہZĶs'"Bzt5)i:6)*J:;5OH&u:%_锄ÂM\w\AtGFO8(0 Rӟ:qd2!A0(p8Er wSbeEn"f݃PC! ѓ @xvݎDCCm{9yqܸmnzVdW8q@4@QZn 3? BP( {9_O Mhll4M.HMM˲4UVAcc#WN(~;n@ @AA+Wet} )%@OOV,Y˗S]]͋/?Aϟܹscib 33L>w. okw:x+_=ez P]]׾5vΝ;x<]7,YMHMM }렲L|O~2B_Ə~$+p7`pNА"#CrNMƍYY}-O;),0vw೫>iĬ[ws}iĬxI))lY:E4`3πa:EK"E?|k"bi q=gub1Gb45ŕo68vL3L:?\18(Ϸ8piJJ,]]=#kZ<_m6زΝwx/lCr-?uLwipgfw5&~` +L}?%-Mb&`,/OOǻ3Ʈ jFNzC9I'eYhhawn욝 W7 72{%0֢[f*랦y@ev%6J@;.`}z|NNݙ\W( BP(̩F"vwy'

o=Yg@@1W?/D7H졇!Y&Dv./|!BN䭷l:яx(钴xz;f_m+{_E, +KDRpM񉔺:mDŋ-7#2.#:kdeYORr=j*YnEEE9s*\.dffRXXaDyep]1JJL^z@a>;mm992  [uV2hlXԤ$̉ 7mQJJ,ΝʒddXÂ". V IG5"{G:pnMM:Sw`Ń?eY22]yzCxrR8) r!~P<ܶ6Do/foo##hMM[ݦ9KbqE}hH)ۡ] n~~<̗kyCWvJ,xNgt|$HAA\)̔`'ḵd^/!)+3Fa6;6&4qm 13ƒ%Isq›f\zB=Ihm#m!kvRl)4#P[CMo ggw繥zΡi{ id3HBP( Bb3BFFF(**"==]Ø~dffxXp!N]YbgΜAu֯_Occ#cY`ԠiZ3P-[`Y.\viiijjjD" RZZݻiiia``+Wrwsג]wEgg'|0 ݋N9u:u]v~x"On[-GdJJJhll}Cn6oӧYj՜g 9bEg*s[o5u:%7HI+oWH::4!%tui,_nIrIdz{1XddDpk1ٸ}lY|DPJ P!:G:)L-Į)J+"Õ%-.}Yuyi8 /R"SR@lN!v+))X99HaȬ,3gJKA&/4Vq%}3˓9bMcPHBNdŊvdεײ=sVux׶PQ?݁lC繭6m/)V|́BP( BTsi J3)LmIL4 !D"-Z4n+2Wh4HnzZM}S$Tsi a3pKӄܚ.Q9ٔĿOt;Iֱf45Q"?{gSnM5833UL|~S:rIALdl`rƬf7Vg'Dxڄޝ1 kI* BP(u$n@;}l}v=yD.4rE1?sunfPm,[!n}K*26RѧN$CֺBP( Bne߻0Bķ.+2~Ӷ';mSm[%G%BP( xRbƕC,ZmQ) BP( {P( BP( tBP( BP(P( BP( UR BP( B w~R։[ @ӴqW1ٖe]92~eW}u{q+yP( aV]JI   ŕa@X,HMMn3<^/YYYo[V!:o[NH$ pFGGD"hdeeM mRۋfn_ҽil91˄+8$/Cɵ `;S߭!uH$2/a022BNNH q\WL+0E922Bzz:>^&&,R BP($jpHÁ}GPv.>^Aoo/`|<;g$ p\RNbELtKLˌoyZ|˹Ѕ>gx1WBLiFihEzvZۙr$4 / %B4s4B\ De% 55ZAR722[iBLӜ<5MsRldO̓b1l6[B%P( ɜ[ܥ&X6|W ,B1)HʙNw8%Q'gYVrliTg';'KqD X~k=N:C1ΙO&%K455d<O&--b7jƑ#GHII2Y~&*v{ww7l6Xpab28|xx"\-ȑ#tvvƺu@JI8fB!|>V"33 n,_dÆ AYY# ?V+ BP(f孉 LǞ={hkkϤ_p8oA(z3'1軔K8fϞ=455FK)0vwg4_y啤yYҔ󱲏ɭyşëyH඼(q`6.e}zEd9p`yrM[ro]]Yk2!בeZXE=?[g_x\17Jbɍ.y^ANjkkO܌ng˖- ^r4}TȲ,{9Օ\Mb+NSS/Rl yf^/<ٵkUUUAOO---'?atwwsAvI?iؚP( BfCsSc``\gu?U靍ٶmHe˖dɒN\ʼ2u6{AyuR6lؐ\}-3>1 4;vz)//';;::GJɒ%K&3)`ibYVrYRW-I9?|]h)8pyaub"ý % E>tE}7bKZ\΃;w9ډ&p/8TRRBKK P_򎀞n64Mr8{l2pzz:ٓnavۊr \.RRRfB6lEp\sl+qz⬽i3! 3334q8zcY!HOOQMӒ['Kҧr%ΥkBc_> d0͏c0/'|{rX`?8dggpyob :;;DZlx^}YnJOO͛կ~EMM eeeOuV9ٺu+/]]],^]שg?㏳uV>ҥKygٶmS( b*Ó%KP]]͏~#SWWSO=IMM%--{g}'G㏳vZ~'px<|Io-B4,W_eӦMKH)旿%;vrayٱc7ofժUOq1(++6222G>5\/i]]`tt[D"nvV\nftww'ehii{w,***WŠ+HII{S[[K]]CCCڵ&`UVt:zvm1oW: Bqc۹>ikkcѢE&ì,~a*++yW4322(}}}޽&0Xŝwɲep:u]yl6tuu\uطoTVV&28:;;)--%%%Kww7>Gww7+Wdʕ AOOO>$W_J$BP(%\ |'WsrrϧUV: .$###ݻVXeY,\ z-~_'iooO`!Çl6'## x";v`'vΞ=ߎ,X@ffNjBP\ŸޖKVV>~Gvv6---TVVt:)**$o۶5kְpB,ˢv/LŤO!W ,YB,#x#33yΝ;Gqq1K,!++M6m۶zMӸ{xGHOOtF{9>R^^}_ .O~bٳ::āHKKs< savͧ?i|>piRPP%FFFhmmtrΝ;륯>\. /~n%%%|%??s]U( Żcǎm6>O&8׿p}(^\hO;|0#;;|QѣG?MJJ DQ6lj*`ٲex|G0XbRJѣGԧ>ɬP()%d߾}|ӟ&--m3`0O?9~8Gȑ#/}￟ӧOٵkNⓟ$nP(Tǚ5kpx^F餿6nH(̙3|`ݺuTUUl2/qwp btRnIg⊜A7M}{D0 ~_Q[[Kzz:+^!JKK9|0TTTp-tR~?6l4M{99ʕ+)..6RJ:t˲뮻Xx1~o!< q5װyfoߎ{!??-[]wEqq1O=C0d޽B!I2 BPLoh4 ,^xf,Xy| tRv-[,^[n [ BJuBP\'" ''0VUl6X"77(Bd}iaJaiaHaRRRHOOGA t&m200#%%###x<t]gddÁ0 z{{1 !.iU( b"aLrssD" i &+̤/هaْSJJ hߏn'++ ˲4M4M#//P(Ne]݃᤾:::2&t?AVVP\.ٴb&#ys{ qdffN2vEtBP( BP(tuu ;RJD"teTP( BP(W'~fC) BP( BP\(]P( BP(+ BP( BqtBP( BP(P( BP( UR BP( B ]i梣|;twwij.AP(w ]1MJP( { ˲x>[U+/2䓟䜶 BP!~{/~dee>VP(wMhii.sBV#K._EP( .\`ӦM|3JP( {SNcǎz[W( BP( *V=WZ BP(SNFF_iQ BxOaڻ~|>W:n DͽҢ( B0 fO) B" !-- ӉiXeYH)nffWu BPl^i1 Bxp8V{UoqW( BP( + BP( BqtBP( BP(P( BP( UR BP( B P BP( BP(WJAW( BP( *@) BP( BP\(]P( BP(+ BP( BqtBP( BP("`tt˅Ҳ%i(YG My"c39xA bikңnMn!fEkQg5%|xqsXNrkܲWoQjì “pg`9"r܎mBL >pB0";rNokZI>h'L;%f Nl3H \)s"P XѲ͝q?(ʛt֭8KA%71# 7ysH*ddߌz$߀ b6@,M.$9/9!)y&C([(ٓɜ.KYx$ϟwa̜vRbut2d D6&ǥ!)tz>8<ȳ~;EFiR`ATDᣃ^b,2rhhEyD [ s@ZPOIce!٘ [6•>w:NFNō}O5iZŬ5ZVZ~8e{DOnUCލG gѪGvٴ[-W>@ZN앧"@<`Oe˒X;b:!R&=F\I͈]9!&%#Wt3Pwg3%V14_ᔒ-;{6rt#N/Q2EZM<١^SjqJ47+VC9jd=G#ޛÉH?CDٻ<0ڥcO:7|`!ps#QJ$z堍."M7qKp}і>D慳Q&MG*bȧktnnϡ7FOn8ElY#uMZG:é\U-o5es!xZ.DYX9z07og8x4yg8]Ms8qv^xg 8y$ ,7T4vtw&+41ܼCQvEMkpΉsNzD.pE[LθӚ9/Eø:FW( q"8X'TW}#1FI?X~MZvz\0M؎72|<խm;YʱfN1^rV;kI]}/ޚlYC]=lK#X砰X ƪrU*sYlͽ g)4NF"CGV1袉vqv1YGY[ @Qoot{cR >`6JnI6wtlI3h1^6Dz1~,'db qelA2EI2D*.na݃ټ;>>2[9zbu-`1$EάbBI^alG D6NVw-!b9zZQ&Ed~LP k1`ыhYK0/›;mnVaAԡec68x;=963qz`^],L%JkZU@O^Bh@0F_/; q+Zb7j,=j~o-y4 9Ӥńfy<=Ep'.2fѻ[}hNmz>22f!L~"iNӻm *N֓om7=Kd_|Ile/F-D[>N} |#0Z̟>VRSò g/߸l6aPqN,*y(rnSCgXz%w G0i5K6|62ڿK[`$I _7|l r7U?-Vqg[ .=䆼TNy 0[QB #n\#Nz;3l+JNLl܇X9>xn釯=oY (Y>KI_EyC5b)N&Wz<A~rW~oHHsUN4n:FV}6!y^![m3wߞGn9+aAG,z-l`?~Y:ñoϮڴ9}~nu |qe[mW|EEg& #v'خ,x=5NWVvSÄjуv_INVahKz7Nn[i9%'xmezmR48wd_mv:Sr K(6JbGe/#q,؄uO􅹓a[X}Z[2@Q(#? OqɾE/ahN=qtY$N(9+/֓W.;{kր{=6[&#jj.SRP"v'q+ytI?z{Kywi|ˠ꿯ßfz~9ZQ-бا,^ěu.9_Aŧ X;ʚ<=.0vѴ{(w9p5'9X:\WoȲ Z近Z57 Dv -p~rE|g0ȳ}t+Ap?2}_WNț|ǡ76taΞ9Cee%ǎ_*/ī?&75YE1./C/|᝟%pgƎ[Ѕ;$oN/^Cv x탤2oϪ TyaYCe)K\,q &]ǻG~_}lw>F6uLźy7;'a 3o(m$[ /e^_y_#.u''o>9)oM?P֓T0XujzaBTj変ٸp{>uCoXp۩`nnfM2?aoB,'vU`[OA˫/FǾXF􊻉y ?^ng."Z4%gb1s5<#hq#_p?j qow~wrBVsO8r ,L1}o-nQ=/$wW&D|ŎESfndbzG@K׸l~X=fhqM.Xa i`?UFbzP}34&Bٞ >}};MCGKhB 4 Dx">+_ϴ7{LI .) 4f~oZOЦMxDgob ]hsd̔<cD6K=1me=P<6 4]l&ALk\d h3sz KX\JF@bK}6z@xx.f+^c?"kSʖ`bfpjzGUG'D\e$ı>!%)rLc쒃q;tҸ8g1e|.&? EgM]MLLmvbR4F2/Da2) m67(Qo&h&r9δ6~oD;] ~$ 68H)(cR*^FV'U{ yCn1]]1wu]P( BP(+ BP( Bq0-###;wh4JYYS__iTTT 4Mrss$ `v(//'''g* BP( B~p8chh@ d۶mO}'OR[[WU:::~F^^;w+_ iii z^H!_"5)B2/?SD %.,1/1$tN~WBJ64D&&d&n˗\* 5k&E&ܞ ytyuX$˗䲲e$cq@^:r|ͻRBX5ˈ_XP̳Ǔpy3׽KMx>ńfrZ3Ay411f1G;+kaOULx1T9V1'ܓZ\6/'M9=_r,}fNM)F9̔xU$QW4QOwULl_X ДJ:<߈DL&i[73G)yϥLzD,gJ]dsr3|[ͮ o~6϶ zvX͏?=c=4Nַgr'yh/VƅٕkM`\9 cJ?i{ quX.~Vɣ 7??rqg#ǯE䔰-rsZ?< 8{7Io4j.D YlKaѺG_υ@@ Iݙ&0?E1,_ G,b9 ȏup*lj.#k8a.{w6FP-%6}k؆hFc{у_3m;"X?iBZ Ȧ~Nmt9|!j%MǾNUas&&&;_umIb9ó/<}ezdB W[# %.'%B@ݫDoXK,GNLRsHX[i al'/a8w|6v9DlTuSU-~- ),Bn.V[FKŝw zbe3@ 6#e4`Eo53Gq7RD6b) #M@]/:Y@w5KZ#Cx[Ӊ.%',ykK>b߃&ޙo=bE.&¦kl.]żi:jpZF.ƹg ?l> f]z#l`F@ C'ޏs3 /B^QfYsh }) 8qgjN{9ULo>h(|+-%39:kI;,\[~/n>qdR[-m>+ ^W?)(6GM>f'X>ˋIoJ׌_e霾Oe b ?[<$elFV/mAĈYRu5cF^2:cg8V@s2tώ`d+Ml xBρ("3m$Z~DϋIkdo]>lnp+sAv3Lj@-HOoG1-?ʙQPm񾬋D6hv [ntfLO 8z\nkfuC C'KHֳ}V$~{|NmG9͈'mCG FsV#͟π5Z"QZwnkHHM#}ܖaVz,wMB;/$~Ƅ~0C%9p"\1=ȅ#o&X-zzsf9 V i2 ꨆ0\j tĭ],C^}KDO{qf"vdQRDžShIvx#"aBè5Vg5BX^E)@?őK85fzA+ edaL.%$7uJWA}ǷI:%Y063~/r$o[GyѶR6Vb9opkt~+e@ᚇ 30/}tt۝T^p">S__aoc#p8u]1 c^0.Hvl5*/YZ=R?]JAN㿘B s17p8䧃XK80&F$ Igy;f$qAt5_,hz<^U ]8s~Rr KHskJmr<5LG&+>7Bg9 BOQta^EO\y|ۜIs\~`J[}SЎL[e+c9Sd]?13A4^GNN'4[G)1Ov Y5VMrs.eǤ7'-'E"r~%}z/eG[(k ¡ XzǁMЯ˃˿и#DzEbm-nA_z Ȇ +M G 9ZB+B/.LIKÿ^\Ve֥}=h14f;gIۯOs&aei:;~7`uփcQ9 ZO4'i >SȹJVu4z`-}]7Lr/Q2J)\[:~ʹe3$7w10*%`G+ ] 2J19Xa-1}5 -c$id#+/ ; lgIhGVε Կ$!/8G fG|h(8`D`K/p`Ѕ%M==@@0p.)]zIbS1&H[|5Ȩ/mnF_0U0腂/}b(k]dS?^!i w"pvahw7s#[q}~ɧ[3@1j}_ކ$] p!޴PW(>y_NUcN8MNi.?)ޮǺq?\ UFY:P\J}uFr)M2U#V`!8 f# â2 H~6^hmǟH^}oT=uf`6M"8R‘!dfb^ѳoM" Ќ y!ICt-Daz7w&˸1JttOAD`ik-(?-ivR !DK헱#xۼ&Ǜ[[h-s aŰ,(^qߗKA_|9[la˖-,X0F\{|J'8u,_>nyѢE9r={)((Oq>tlZA fM&rbܾT;BnCMt $`%.XO+>@yq>M11fF)mRCxףkV,InЅe]aM&9%ƌXIcb_ ;cOu:fD$M2+&; '4I6fL:fN[Ԉow9:g&Yi0ir9 Lx& ئ:UDH0Q#->-<ތfk_L3#%X5Ud&D#߭pea kė.a'Ch:8&bЬxM] X,Drtb%ĄQq&ukR2$O&*9-,7̇C!+ ^h6feBdr,mָ̑0l$+S},q/\ooMheI+?6a] 5.b-/Nc41ۦ @tibrR%`ĴBJ5c+31sXnN+_{%051cL)Kh2]2.cDb86Q/ VՄωXR ʹ&n1akzb (LxHDD])mc FdYfC$.xZq!JIh#Y?K&W$ZKdZ6)Є4WOS'H&Ǐ Ncce,mV v49]s{ĉ+)&00%!bl6?x/%GOlĶtqKE]S`=Ī6V49/yl.&$$͚W o?"D~'NMA2ޖ Mװ ͊n[t)s |#!??IP( BP( {y唗m6I1O:r rK%f|yI8щ&⳯ f66W_zn.36!dc3s_!d|[D$c+GvĠ 15e|[ @x1s_[vႆi] IJ%@c+fSĠafE)$5LaRm퍱-4\|! fN1^A6߰Mn SCu e6k"o!bnnLNr}v 4t?$c&Nc |+Ӵw<#ZI- N3Y_ &EGOwd{AƧ)L+p2Js1<<ɀpOIDATB0:HNmA^+&Æ ضu mH4Dfa9EC:6NF~>">Ǜf4}``2vr~;G !q0LfoB{13@6dz&dD#m:@aLl;I};3K*VYLG"2G]K "U({Cf) aph$w1D"`kO6E_&nH1y"Ր5X] 7tܦ,dН\I;1s˜bU(ah!Y.--x4vtib$zY_L,;77T@i΀ISυ!xsԆ>%b@hhaH52!͡FdsPli j}2ct }`0LI=z u#M uX1.Y3B a*)\k\twI˝Њ;G9Q-: N,n`Kd !4EDe&D|n^Hljd=<Ɔ$4q w-Mk|ٌfup=:8>Z~ѰN+4& Lʕ+O(=G{(,jBw!ߺH+1Y?QZhjep^_z͚nԵCrrxXV9M|VeL3Ҙk棍\k5J&y[`Q8S<-!Q~ZݗRDDѝz.(fFEsǡ_ecIj,lꤿ ՖB_ĢU+Έ΋e᲋nD{K~-~ɀb~-״;FG+q6Br69Bmt ӯ/jy_"BWnUgC#f X>]y]pGgK}bnO=&R:lbZad|M7_c|󅨐)ڤHUEgKd;si)k6sh˫Zk +F2R[8(36FwM@Jgl"qGU2*<:7.KC5|T+&jPhdQ7RhTKQ֟D*qP"=>eP'9f*{EexQIwq̉N*̴69>_{W2q ]P%*?ܝTb;)#zDQR2+~ޔ8^z Yc MMMuSq466BkƐJ<+WxKO bX,bX~<-bX,b!B&輕1It#N T߃CD˪pIa͊$BT2BKqdN5|j5*V$߯Pt`h>}TѺB1=jyT`4e{GiuOaF`4UhvD+h@ ށl[ x$+3>A]<]hf&w0CÚFdSouH~3#+M ד$g.W&߃Xd\A1 aZ{0>D)/Y.7Ho0NִWkFV[*c*ƹiC#Ó"tVa w^Dݭ\+f&6*үpӀhh 7Gu͢i3݌4:+Pi]8a,|%wl/&;'-0]+;1sҴhpӨt@)*4FգUHŪQ[ 38Xf[5)qZ"z.p+%'Hôf0[AS#=qSL۬I  ZW#ܹӆrꖊDy F>CWcBE:iUsׄCxQV Dcgm4v1jJ`fG0S߾$SSh)Vʵ]AC6Kc2]lKc5eNmI9K h< 1Ud-r}ADc;my}G#YUC>&/$Sj?- ;X DOdmd}#(bpU_3ICjd2 $3ހTqG`F W546u͐#2 Vg4jdn5&*8x.ƚggAƣbcGҳ8S-4q  h[?RHGf#Z0зѱ!Ci$Z0sgts@@:!I:vGѾl falž$Gp4CHg0,Qvx/m `rVlm>'?K }ki_4 d9gb_JF:  IZã4=y)Kp6ϾG;flcu7#[HM-{%aLVoa|9hh_  6tYK\@b B*hoAoBdtE1ح>sjH39hZIvПESl;=}m>YDMxrm!}(j3<#Q;ܶ:͍ùf1fVL2i`iQft/8ɌG~^SDzlILxrBֶ@±dpY=FsROV=C@ :0<}gޣ ndYFe)C\?=TØ飈gya7Oi =9V/5!H#Q|z,FDݴ|fACE=y=q/y+j۩;FƙG?}5|妐PE(n]2>gȦo\1ngFub@_eQ0<2I]O{Y2}?`'MUPܗI#gB=I Y}呬}^d*.u3:l}d@/b ?*%o[Cy64>̴E0ſ?=XLr5MM7}রn^ኯzVX(ѯupv[k`x$-~)vQ+x7oˣ_4\u#>_F?Z^K7ni/a?3ؘ"i=!dS *"xG kݑ ;?-hT7\}xtOn#bcTw'_-ɲ0Wwv}5$<L#V6{A7[EeK޹6CL ?֫~~U|ӣ_YJ mL8{?'yv~g>$ Gjb.VpCG_' !ǎ⏫~R.CQQo zۗb ̥Л,^ݡg8}V6S;=@ l^R^[֑r\oy~*T,9bgbn彷'__M3Q8`\=GBs!|v0|uu|?_>ƿ}U$so +1&ߜ燾W>'w}A>W8/r~{o h7e_c̎wފ1aFᭃ()0 Ypow'8rW>j̥ט.kK7ƍ?x$">3//?M|,?;oKo ?7>Z|B?z<nb5';`x %n7>rD~|G7S+HuW>Fy꾶1\Q)zvcEnx]յ޸ѻ<́9@w)Kv`[ſ+Os?%/͑OC{wLw~mh'6v}OL*;\y;M ?h ᏮB?z3<%lIA Mgndva{޶eپʅޚ;DR\uj G蝹oW@JXJqߵ׷нEq|)0\"?xtm\.6{|TFmiYra&Au9z/2z٘y31Sɤe׳Aw cbiMo#a/"z,C4ǧw}Q0s5u~;g2™yPi2,y92MT2~-we&NT.7dX/u upI'$S6V░1Ҭ~F b| UcRS7-Y\,%S^Ue/}mJBZ߲Tދ r<,x+y>6l>+V-bX,b;vnX,bX,˓eoq}0dݺu!A'15y|ߧ ccch9qbX,bX,XX,r饗L&Yr%vApwsgcSOE);oNww7( p ݻ|+]v91ȃ>$E'rY<΂w618[%C`NHpԈ 82&u2w[0˾\{tAhFˈBǭM31!CP𡧅JG'2 Q6BZHsOB `Ie5bA% G,iZE'ш93A !v FB@ g5HX@038\hB߈Qq*trdx\VF/JX ^L+Z`83VLiEϽlq,/7S+\W1NvJj|^A$R3? 1yCl_sljpV-OፑX﨓)U0 4H@,Zn!y<1,䋂uq ̜8\G{`ʥoWHyBe Lƅ?n髅=1])N0_ڍlje ϱc?O[[swpgW/V Xմ(xeKpof@$}6l  )#Íxկ@dS^s.wrR@axNzmEUQ_fƘȾ,p_ IO2}@!W%G aq8$ӟz @i!烩/Wan, 0l`K͖{_KOT:{/gAV7Ccz^Q?̣3L\E yq;W朗Zq@8@? 8v"ދ޺'bv)jd^ .¼Wb]BظxL"4r7!O) qLT ǎiv25T[߁gl2` #Lkr AKp>Xwz#l-%K'=RC m?^nI٭ihc4;tax9!,M b!F2*%אg_2rz=ŋikPڰus`iLD&Yu .t hnkû,t*T@fGe#ƒU}@P3&7/Ada Y'b ؄Bh(if/F iK;q±mEoC=" <1[v`tᮗ{)Ù$>IH2SѰ&P!f%ax!J3X.p`<Eͮ$iYF0z^h(03 AfIΖ4mڮzUh6<|]'`"=e(mn {Ia~|M9)ր/ !=M 2dHmװ'RF4cccip=pA>яOR˿ ׯ_Vyx'kS߃1 1% s_#KhAIڞ?㯑aMow^_pfd. ˾*ĸ0!~V Y)y_ë>aM1ꐦ.0{m3iAq}?mqv9 &d"T)Oi8v¹Y[#`ERwqU|# gҸ`$q)P0Y~Q74'}b#wf:q{ьxsk^WKw%Y%xO(WW~ /%U4J0S֭ض) BEO-~st7o=E}#h ߦyu M.B]r;[ɶV-U5bμ{- )|Np}z;FJ0{3,,|{+^rsrE+) @ug WFt @-`ˇ^ie'9ej^?Y3y&>84s\|tN)ǍER'B9!Ϟ]|gڟδ?A皐%DC}gt04{t N&>uyp0(5gOgn~-Bf*zřsu&Oz5ūcFr_S렅5"EWrˆqօ#q{aōˎanK6*a .î?8;NHŹ/kq)k'v+M?Y9`D &;il+_0|c||z1ZiW.xܪCF~vfNl%h(7_O?+~l|Z2HG D\gY& N%Q cX7AqGn DI֯^U{g>'lhBF[*SS]I~j+a.!0uArG9}.e  9B9y>adyUTH΍?m6\/L|)Z?><. \C?|Q{GǞ߻|s]7W.=c7.Ñ&#h *|2`.\njQ._f.{铖Εܴ[iwO}"2 2/ǍkGoIEu}y}g %aK`+?=HOꉐ;BiIIO*Q`|0Dlen !pTPT/uHR^qoqQ?lP'*B $׉g"+"`;NQ7dOƭfX`atJ[ wN;bn4W)R?Y:1'" $+뗈&Zb9U (Q@J3ewV Zį\'ڱcDܮLCUL<ϕіoi Rx:&S#cDd4$8%-ΐ 0r/440̹v,*a_T#E4%5/E5UK]뗩;ΜkrLޖ)뷎R2*EeHD.W$ˢ)Rv."ׁ)JX!s#e`Z(d/Tճ8E5CEJ…#8nq,~]⡇/|!gu֭+? Z֬Yë_oqȦM8S8L[,bX,7==y ě{{sb9 CDqM,e70Nbe@:5zB (]bI񬠌fD#kH8XjfD3kNB + Jf888ѾyB?s@'.G 8fT쿄 O.hB=;Uu"rh[Ju "IJ.X2_&q8Eo t=KHE#pABF[s]+mJGq1ҭP p-5(ppfP "jh\_~IvAQĕAT^<q+$2ˀ}s6dַ!@4s/KD~"VO~ 'R&XWDE:_ $ 2D|:?mm'>a(pNdjf ׉F\]zF||r8 oD,E D7!E. $Z+ٜJZH8j~iW͒y eHJQ"Gī82}#pp+K;Vf1 H$Q:$d\G8q_[7ĜKvQ_[-rRY'K? MvҲz_EBĻq:D"r*̡BH!8)Q_J;q<>FL-ׯ/+DݾC:nxAB[.rAVD;ļUE IKHʨ?R<]7W \S[5N~\QcH<ُ&1@H:2q__BH2Q$cU_Dݼ#JKXwCD}r!;G VBTr[]:گF&'a1!^r3c;9؉YaHN8bdH8Շ W/~Ic#džB%N5I;w͟ᠡ7ބm>j*lF 0ygc0X0r&` s$ZWV&!,Z/ɫQNAGZx f\M e*2]4<.73ga.c[/W_ԑ$)^ ЉEF؃ !]Cwo<56QE8!BNrDcu~΍uT(I~ ?=A|̑ N-yLw #M{;oM_H^eEۋ 0m%DOe8o 5 .*#h&)Ӵ6NDN2A_nq#s[qOU]fj%@vߥ(.p1;<:_aW 8;IpD/?^!3Ki SM=k!x'5!ڈ PY(6@W2UmaH 3:PXJn[/mɤ';"t# 6dټHnZ?Bq {VȦJm8hjA&ٞi'mI >K,9i1h!qpb'2eƹKdiqT ŽW0ybI]!]#IAWrMjN HHѓyҁWzohO.|þ@3Mu*1 Qn0}x iF%n$'ho!  Ӎ ~ {vɁB'fXWͭɄ1?I Mb-a응"27 ͎p#aVd % H<^oH(-Nkk"{ TUR* Hӣܒ֌排* J>maL^벢B{f/7'PK е =Qd!acmܺ`_hd$%dqbA_TjLGnÒ 'V{F3HfY\UBq$ q-ʉPy*QڥP6Xv4q.璸'0 پ}lfg-eCVw^15Q-bX,+0Ƌ^"\]D./{KlX,bX,;aZ,bX,byܰtbX,bXbX,bX,ObX,bX,'vnX,bX,˓;@X,bX,I[,bX,$-bX,by`bX,b< tbX,bXbX,bX,ObX,bX,'vnX,bX,˓r0z kM ;Ea*h9 -Lz<X=Oa,&3\u6&5N#mmMO)k M@kbEGu| ~3[(l "I ΥCt YIi~JkM^IÙ ga}+p̓1qLfѶq2|q0 P>Tr\ڰ%wBO!W=-˪ !OD+a!NczDt5ia6&(IgK伬4䊈Sג?-OՓ(p$V6Ԗatzu ^Wb0)ikINQ4 $R k&ZGASfh>iHa $hti>i"sQ 0 47H{XChPUfvd$tp4o ijE᠍[hwf6\Q),(\ IӝL`CEiI*s '"ih3k&X#ekBCXӛMY5v,S>< |=] 3("V묪6-[O}z0p;qZڞApϗi4u=gg=})5iL_2Dۜq{) ȮӑKÏ3W(z٧;<0Lş _RDScճjNCБOEe E_6"{ ˞ ׽g3⛊O:5kONÿ(4wnǻc7;OuDu}ȗjϕ;La/ұJpY@bgiufX~?|?pOasi'v<á϶ӹ;)~s[}McU6$hydoÃ/Ʒ5nms=wKk&Mڀlⶑ/Ph,g~s$ϻ8ocW1t:>˸i6g߫>_U_;' Km߸WyB~5oN1er_i']{V~I2~f7닻إ'1y윽)[ƞ˓|)rYvWQwџ$p;Z+>kz2zp+eoB; SݷnoYv;G8gO&7+3~!'s#U8#jVKo/y|/^VEݶ #A!<у}=կ[`z}_99pׯq' o8#']7-ӐѼ$ږvo rsOwXV}49INXkIsO4q-Ok+ci>itMW?Kuk~xMϗ \}8w.zA]?&o0\p=#?s8_7Oټx[i7"|$=>®zpרއi8>>d}js//Z4p%{El?)x&؈c@QP&_SPrW( >8Ph"" 4yR%&__A}M+,{haTEA}odFab7p^1 <'vEԆ8Bȸ.*=4P,j )]1X@E(~"ݽ|_q:,hGj(W@BtttEѓU5c1 YrA961~0cZBh G?8t۞cтD')@B|x?N xL[Wb|Tv>bs=XK\ĂA˞XfɎXfh1?ݱxJUNkËB/\G[Q:cDm kߏk=N(W'弄[]vP,,ʴbnT`/Ynw<YHKOwbX,bX,'⮵&J#:sN,oll$R455æiRtvvkv[,bX,{aY# 8tmmm<%r r ֭cڵA[oΑ#Gx׻7|3<)Ox:HĶ"8Ǽ Pfk(E@Hn wrk,?qZ& #B Uλ˿zSHʙTq|' m\_cq"O-W33'Êr "ǥPƍ9#UY~ibb<LԎ.oU@SFMe4EsPd F-$rIB7 ۭ,AcDd3eO3Q"gg s}sO#-K<Ag۔L18HLdOb wzֳx_~= t|ruOOLMM׿tuu-n,Lf`!TVW]> wpTgBG>7Zd[܅#ޟ3{ȡ1s!Y=/M3} g w_5wiJM{8⃨fvv5Ascf riЗc04LឫP,S۞rGm*mR<ܸK"^ `69şތpߕ}lɠTi.Č b\hoap@i F9t>#. W ^2)vњBFO{d>ސbFA] ҁc;/?HO OxC#O1`, WmU;|l ^( Iʦh\{= ^bb]ɹ2Mw>XSp1#[ϜC֗U$a& ߷!Dr ˗]gw# bh%mpBb$S4+Jڜ4g?NGYOE4qoCA^Ѫ Ui*LhcԠvdӼWNq[ϠyH 'v 欧@5v"yΤ!6SC̑jsmny}̜J҃i˓; jCN04oRзR7J!882NXI FyJsgp-go' ТHZ89:4ЇU>`Ҽ~}6aj,Ӳ&֓ ~)Z !Fs֑U$Ѣ!G+HF3 Z0'6̐{ ]ȟr:zS̒t;qImL54+YQnթt99#3Mt9dLIKN*uZ94Ks8]{02O Z/rP09BG}ޱ2a0|p8Ԁmc$3L΢nPPuI$Ө`#m%MmCzJ6vQ|HdfCDwA nE*$i &'nޥY*ui*ÚA[+ĒI(& }M[{ UW>Lq:L[d{4G "w,QM7LgkvGŽ~XpV]pŃt(ى#%3Bݸ? n 0ɭLLuG^L<11s.N冄8u㤆h8\!%hg@ 省g_x7̫x0d c`d6*woHóAE]Hڇqx؇7y{9+Љ( g젓 INRzG`mHV~¬Ea8 :Dt!8i133SΥd2Igg'+Wν{aΝ|S*wM7qWO>~7{/hBW\A[[_H8"G Rw7Ի`DUϴ6wmUԡqyEh}+.~< S\ ۹;%9c/C1! xwYyr*NS_=ESh\^5]Q ?j@]9Ȁn2^ky}4 *heş'7~u/"K}ݬXwB2ߔv8kNuo&!TNk 28zUEs uʰwp.ń, ~E#ݼq!A3>?E"y[.d6bf;w To?uU]usU2/2)̡3aEg3azލ-P/>Py?qɃÑE/o)ظeF@tU},sbpޗn幜2o?DӅoU7y?93(G~g}Й䶿Xq3X;2{_֡i<; /ja֓x^G&=C >JBC3}nʏsstϾguz8o=~[?3ֳk?⾾O_07}WhBKMӾCw_DCF I49A܇+zgCN>e+ڇ0+ހ+ T{~!*|\= qTUiܛq\q}d-vPQWK=ct/ _D_8[78KX#_*T!dzoAδ"^10bC@KTn\ʔ ibU>m;ã#,y /=p:^T+w_;x1A휞Z[8iOǣKSe"\a5Gqob]3,Z${0)kz,^#}|W̙r+\1?wKr)pf8߾L.KRI'on9B K{ncDl.r>O¡3E|6j-^찛,r /z^{ɨ~__FNT4QBo._񡼫ݻY_`LiS lZy})2S{|Sw?-d.e,ySa+z겙oa*~Uu^J0d,Ceܿ\ַ?CX>!_N҉} \Ͽ+L˾h/ )ME*)L=#sq'86ϱX[vkoqbYdTe=v}eل{Bez~+ETֿ(']˒Y2bM/),K_u4vK"ɸ̋&J̵w8<5@?yӛ 7܀Fzp@.@,_*(ĉM zܖk-')•e;&qdp줐H)D8 #aoWeyբv%we<'DŽdoW8H_$WZQ$0RFiQJtϚ迥ϲ#D= cYoVtd̉?Qyp-x$ߨ뫔ג9Mw+a7ޅD}x#eՉڤ#"]a.F.]R ~/e[R"eK|х.3H!p9DzC8BD+gDZ'W~,]v8D,d[ƻRDuNnC&} ak都Ʒ""TtZE"P;L42QD I&ѕ9IluR4ّA!rp\[5cdΠ LO7u0GQS!3)f]FH mDba(1/Z͓(S(ngH^-8x(`%9d4L#HCu#5@ 1 Qi w"=(6>@͔€9E} ILrpPU [hD:\H](.^-dj㍒<'gBp:#i"0Y7173j fH?2Œ!:>ɘ1Iw#L]2cQL(VD*i2[p,+!8t0#j\.M'a)]BM8B/k[:t^U Um2Bh\^=v0{rpWk$K\cz"0z]D\+$@81nF)n|nEݍ Ž-'!$ י5h#Md. be%0CX Ҁ)6u@8呮2h" ѡѽ1RGMM %0aJѪ $Brat2~@HH,7@tF\+,kJ*^JɆ p4B0VA%Hh#hP8A;ѽ'~q@ P8Pbƕ DFDqD"g&&*Z\ ?cI/U-L%rʦ4Tg>^əX/e_c 6gD7.vq>Msb Cke>nYDFwG%s ~!nS%@(Wi]`0FT @-]D"1K E2XҦFVU} DwwIE"M bX,bX~<'n,bX,b-bX,by`bX,b< tbX,bXbX,bX,ObX,˓\./SbX[,by1> ':;bDgbX,9g>/>!( 455Dmp$5?Tl>k&97PК iNmc* ~E8$E 0സ>lOeCT6iv18/9(U7:'HF`G6:Y+kia:lI@Fv$*f ^jXP6$\p$&?@f(P]sW  ~3SW櫒a: hvu1TyNg3$thm:VsvKOBJQkbf#A,.`:)Q=7;yaT^!NK̪2@&iM8χ/ ^#"l*[1Z0W/oHORǧ_y|cun I4`)P>m*t n,@2Q#Sa{"h Sa@:15C ‘3sVOzD8s,&ΏHۤs0\Bf|LQfBdS}Oz)81 \3A45\|8LhO#ȎfBT.DQ_`I*lҐhfeL CC$|HKhj8 *@8 L~*ҭճ%L:Eː-dHg]Ѡ& hz|r(>PCj>}mHǦp%W>>=p;fdN){\  {SH5N/ 9}8G>n:5 (>o k^>ۚM}r|;wDŽ~Y].&dGߜM虀Kl璩ii ?w~t3Ϋ08ݤpоʇxd_JwclUS]O|djI~}%mF?܉Qvt< xOO7~z[}6 dG= (׎p3.ۣz<ᑻE2ɹ|sEzdQGRO!t6x𻄻.g zv*\=[r!}@f,^=YM~طnWܴ{B)6dk3GoO7vq[~/*]=>W| f=|E|Zӌ7&?1F_K藤>w/A>rͽ+1ƛfNrxibsHA$S S Id+o5j"L}&I̓$?q+F(̼B,{r􏯤Ϯ6G~s#kmk}~s#(nfn ]/ZjCE`{9ojY7Q{>n6>o-6xh]x%͇w~y{oS_q߹wik>|G0!{| A~vCRUuk7`F&<=؃gn ~U.&Ox;|d?~>Q.cVO=R]d/f󟇉!c(iɼ!S^蝊ږB9V]f&merO^L?C _Ux].|#Csd/k k o?:D'#}(vQnrOT]sӲ†?1%S w}I |`ݎ->xՃzq0ˇ7}Os'6:_$Gm|ߗ߶`Z|[s>5p3|u0}p?1AqԖ$ޅwՌ:]^[v~[Mki_ss}-BWu3Uϖ<ӳlwa6GxO >w!&]^[K- 埽{~㎐'OlW|-9ol /w'.+ͼV| :Ƨ Q38@U&7pa*`:Y,a ꩻF}Nefl KtQLy LH\xpTkTV)Tk oW^4t0sy$ ^6Br Gݴqßf0~&1ѬajO?5Sg}|4(z!@a0 0; ֭1iW09NWΨfY%&O䡸@OxM7Z`rf \uz^0=˻7KN+| ?M!vg Le ^B>TSvЀ?(zh'<_GK05NIg1S3>ڄ'cbd.'\l +`Ƨْ%RHσiEe3i"GMT7cHOR5p_ L>2Lϖc븮̫xxQ X$R"%Hv>ǻYyd7euu]'vlɶY%Ylb)6 ${3a(QՇxofn9={ 2jaP'tװzNVzƵj0Lhk$ %WԋU%s31!s[0cƅ3HMn*~?A.A$@  !E _.$Ib1.%loU1jhy$h Mu86>He$4S}Q~{ηW-0Ibprz=huPa@M*iPFSBƒSLpF@RI.kEP cĊceY QJTA>/q @# HEPXS#gA102H1sц:FN_CL(hi0iI HMM&ˆOCQ$_̣O6M~Zj*=(t¨ LxgXsiĢs{ŢIeKc9|*I9 * 0j`lMK*-iRhK B8[IeՌbA #iĂI}~4E#6!hNJDx4J|#W㿢mFC3q-kˋ%>zeń?>ŖP (3sM#1ϤzhdO{]|$bkbJo,J`R=Qs'=0Iz5XbVs xs)i B|I=p $=REp5L=e H4=0q~%>:`IɮRʿWg1K$x/iFG+O W4IwO# It7HfJ)Lt'UyII̢3s%| iˤ<ƜwWޕqrn:&?yIImn;^i ]'<004>jci6&˕%Mf#ҕ,R+ʖ$I _Wlzr_M)lj3 ͱI&䱚ϦwyU=m[bLF/|jsR=_94>!"f*l4J╒F!I>v+9hjJ\F++ץ)6Aɕ4h?OANsq9y<^zH)Mc9EeXR0^0&;YQo]}"e~,4nJbwϪf<}sM{_8Z 9<.sjw'WNLxK[wN׾jiA2r5o)\v%e^WAIŠ|rPݙ.sZ~2G5\޼zjh34KeIi&.*tM5$ TxAFY׵ % }pBcӹik6Ֆ*`" mXI 5y]YKC5 S&Rwrm3YA9x$Uur5e&k-IUg2ӳ% UJ/ˤ^2kg4|qtudUm1')،,Hkv.9\5\']I{c4fv:Y譭|_`0ѣG{Yr"v{9gff&7o۷ܫ>WKh$q8dĥ$L87$!1)cyP2mLOr3dPgrIB!FFeYLa0ф@, 8Lg`K#2H&FINIx'D)d@/( 30a\7^Ne j]-*M#}¼*΃xU09}':/fD 448a K+GH@KQ$v@qSX49,K 9[1a$IŢeJ|fl-T. 4M20;c3$hs(CQ4 ZkU;ш<⠧39T3a4WP aM%i~fIb$D^C@'i4yV/CShˢY5Ej2υ> YCӠ͝ aKlFJĹR෠h0R>;Bl,]B,Kǽ6Uǣ '&u pߋSj+JD8+Y^YPX61w!CfD%x5#Pxa-NzBcLMV%{)2C~UhGO,:%Xa<<=% G>GMFY|iZ0L=D!6ނEʡPKzA IC&ya ,>_؅KYEXCZ9Xڙ4uZ]"$F .q0!/MuF IDATԩ6 u҅>hw4i%4s8X* WdLSdKd"&,n2*"Ը:4rhI9 I$St  a"߳&DeOn hLAD#HjRL%z)Ê;ݏUz"DvLLgI^ڃ'qD($kX`3~-AMQL2 N4_ a4g2‟DgD<+Y! <5A/,h=fUa;JQKD4NxM A,L3:g27 5q^ M2F' 2ODӂDX,ԘLx?إi4욆6:!KQ44jʒ@?ŝу IUƼdBTI4;Vٝ}H!fF .hZs# hyAl0ƀ *)Rg-Gs)28%?o#V4IB> i+혧Y5WU= k74{y(oI4$} Lʕ=qfJzJ$䎕Wm#oҴ"߿LMjJIh\껕abXLc &kc 4x_~5%$it =ɤ,? q6-?od~aFI;$|N/).r(Ǿܙ 1 $ &x Ϟ1ˑ1K*X)Q̓tْ$@PrxfQi[AfQJA7aRKXh׿"о ɬNo:ağe) y)tE$Y#U}eW/MsGu]G`֔`'n1DL-Le:\> UBZVrgv&RM9~dpw?di2?x~ӸRiR(%z69s `& Hr29 {)7֓yk.QׁgaQ6vN&֯|ŖFb纾Mdd[u3w_-rY(p6&I.+b8dg$Qޮ5C2iHT|KX0  !pTպ^E|˜4w6x yǍ>WƋ ;ՆZ\ [u3#i.SU )N>v*y86Ӎ'G&wg fWo&Md+AYȒU}q/n^1<[Ym㍣If" ԰|YcȳۮxV z+ͳrL氉__B~GAI/aYaƧOcAj}bWXPSABB3Iw.LTL}v|`湂nhZ07[s t'67ZT5$Iup)sMo: -Rti{UMC1xT ϝ@-C(w%lT elˏIaҮ.[*2kLr"1,66])t]'f٦oM&}r̃YȦd%~Bf( *zFa;ż[G(BQ֯_?yٳgΝCQ4D"o!*++` P%ii^dTӭL]dMJ+:|\iuN^R4m?'l\]j4eUElKǕ&re5MJi &(<'ϙd+sgHj2u§h )LBf Ѵd*&6UEw@ӤY$=g L7mheU IQ'&5MbKSYUP$%ha*1S%T]Ʈ ;f<޿;¸|@lU@49ʗ6*kҔqL.I *Ц/{JӴtJ*Ǫkc4>5%3ɶ2CY/IeKQYWRe]2tIgn(iӸjj2=ϯ"_z䵚6)I$TebO^oW}˧^~@KTҒUEEd ݢ W~]"]Ne|t}eKЌ~ƍ _ j˦6; $}54EESUTYE56'gryy/񑪿?OXhG\59Uij;kZ^.BbVҤizscB]LihB9)V4^q'%XStw˲k-erfhHw6qLn H((dBgi]2{yKYՐeUr_.H3TIH54T$Ihljun|+ƛI&1]MP$ ]5M׶=;iȌ&wU M2$TY|r{iJʤPs(MVgA'gy9ƇMr>?e]U i*8ߣΚԠ'72>7%Ӎ/Y4 3e6khwߍ(8N$IBM}_"PnG೟,t:1g~=Q #t7+/30s I"HtIJ/W/=gxO^'SOhjy] Izɗ6x{Ӕ~f6өe yUZ'Rt~ݸi)5r_t<4&e{W 3==uH2]{I\Y?;9$IBsYc4EkwwxSsl{W6\uYgDG{R16zdO;-Ejoוj m8rzq1pthI&N4ޏ$?c| }8czq+6R>^ͮ]6k u,%5y>z?ErMJy[|54Rϥ4T}ٻA?fr` >|>[e{٘/L4Rߙu8_0s>tO##E/XJ+uriN394-eI&OffMd"++k΅d7(`n;tQs1&:)B IMrhjH2xB."]i|2ޡAZBީ*I+>sza hwĉ,DJHFк 6fmqpߏ2#K*c^mj<N.l#JAt>SJ"04><wa{'F31(iKZ0va Nq$0}]2 (8@Ρ83( Q/p+i"pPzX2u$ICB^L$|I(J<d":x"H]0E":DK3?L{dpzB ŇnАz UPOqs3#a3gp Djet5&B>^o14w= ㎴&ϚUDES54Hɲ72j]Dl3C" F'05l!:@ٮ@$D_J7M.0n7 ǀ.$UAƄ}q799G H,j0``ldVw@t dӖCQ-(=R, I(*W@ܮOS^-BV,tY1̠&ׯ|fafMX昚Lf&K[PZBͶY?[#dr,:ɊjEQJ%M"1wi?|I&Ï'r";bD8^ J1w+1>Y@IʗߜFd;貊fMiS#&7YO |Y2 \Z5?VmD &Gɜ@ dRH$Irro\Ӵ+~_@ @ qFGGX,hi @ fMF@ @ q^/fD[4(Vu5@@ }l6S\\f3vUUE4$MFZ @ &Ll6a+(D)] @ 뀢(?~'NH$(//箻"͚@ @ YBe\.դ}.@ u"//O}SA H! t@ @ Mff&LNgZ=DD] @ D$I"v],)nnt@ @ P( cccvMpM̜rvl_i] @ {c:ul(@ !Ҭ @ @p t@ @ nD5@ >b1L&KU ?+j@0.YeI4 Y'|i@ @Cٜ|f^1LE@ |g@ "s@ >|] @ a @ @p t@ @ n.@ MomD"(7YX,q#/o (d2EOzl6r<'Jef(@ @BA4MHFe@44ЭV+,H$7Hj, N9@p8˗Y$N1VEy i}1'++kNw?:E @,gX$$Iz笠LKD<MXp!V}ї׳DvTUvSÀ$IDQIOO`˱{JdeeQZZ:zYْ$( (2dEOdY&##cB.k-LueYQe$@ +si$A4l6|mG5Mb233g8@"fMJc``kI Ɇ~{\H z<7~ }rrjeVVMgu]f5˭ l&OtHV0Ƙxtg" b2T/]V&W"UGeggb1(NX,F,l6cZg].Iva>jkkIOO7AZZPIAAM7>@ W}8<[RSSC,CQcW6#IV՘H' ,˄wŎ;HOOd2M;qty3ͼꫜ9s=zD";D"XVakƁPm۶).[ty.^Hff&~;wqqNbzl6 6}uׯ^wI~~O?l Ȯ]{(0E݅fqi4MxBy k׮5꩷ѣG)))JD"9{EQ^x5kP\\d6>coFcqq1}}}ƽGnn.%%%رlA?[oEvv6UV}y$9q^YYt)K,1R'ߚq~mرcgϞ|y~IC讻ѣx<l6.Fx衇 ==g} 8<gϞR~Ү[aN8B$X|N=n(/^d߾}w@ps-LПگرX,ƞ={g``uaZbi&yGihhrq^L6{zzo@2ŋ/]wq\dddkʕ+I$̓>ȯkVM6!IǎjC:u*.]āؾ} Gr1v;{/uuu__~;vMYYO&qF֯_[B fbF_?LCC< [RZZݻI$,]޽{qD"~q8|s EQشik֬رc8Nʌ]˅ft,XSX,|СC 2~> 9I}v҈Fl۶'N022nٳ_UU1|>Qe7?EQX,v9~8lڴrN>͒%Kرc555l2?N{{;x<ٶmN:̤ t]jb9ra_ l6c?0/oR]];}xXnUUUl۶ 249x_:u;3Xr%/2B!}]\.=ztEVt]/_,ZZ4MYn]]]<444000… ٲe eee,[ӧOAoo/555_}FY`> Ν#iY7;~z6l]qwyx">L0QWWǥK4.-ZDII7@ 7wUU5v<Ν;AUUӹ9}4###fn7ŤnGKK vp4"166F$jɻbAQB^%''\Ý c?:8~łw$IbӦMPPP@AA?.6pO#322244믳tR0Pȸ~(裏rYy_ mm-dgg3o޼i/~t"~ljTTTb XNzTeN~d{e֭f(,,4cUUU/dٲeSΜV^R 2w_D"|{3dff"2YBzzzHKK`0o%KF =<Ȏ@džPUfxŋOs}q1***Xd =uuuO 7w@  ÇI,c˖-TTTgڨQf3pilٲ_r-aZIKK>PUb|A~_b۩`ڵ[r)//_Ip8!28NV+dffb2$yM8( ,o'==h4jҥKAR }Acǎ޽'Nm6-Z}֭cxxDZZ999[oa%SRRBZZv $HP__OWWb'{ɒ%S꯷grtE/UU%##M6{ny8r2hX8rUUU׿СC~"H}@AAXVE!//Fff&<.\  `VXʆ p8ל=,(,_OӸ\.V^m5=='x={p lBSSiiif Ƃ&$c~8̢"f3a27ov[~4Mc֭ANN8^ydYfQTT`ҥD"BTVV@ 7vhb1"&HDFl6V+P5!}nnFBqҰZD"bYŌFIa҃il&aZHNÌitvvi ,0rJAE!==Hwq!d2X,dY6>:I}nf,_ǹtϟ=OHO%l2a\{[,0,u7m=Z~d2 J}`UUq8L&A$IYɉ=v MZZpH$fnO(]ו?ټy3vcAcfXH]hq8FۧfcLׁȩ ] sE$Ic FGaUQ())1"}wվwPU~dYfsJq%J, }gbOg`ZIRzq8 'dw~|SoRϖh쓟3@R^/\@YY $@ 6~ t@ Ȧe8C >4g zX3F1##c>@ p]K'oX 7T>R @ ~{4#'GqBί퇕ߘLbu5D9Y\@ @@ fBD@ &@@ @ Ln-@ @ $ӥ`빇}>;ZUUTUsǍ\7 =G%@ h4b1lԠx,233'}l1HPPPD"DQ}|>Vf෥hH$jnN 35Mv_tm ̼E@ |@ n76lLb^X,6isRw %IzeY$ MPUd|u2L~N]PH>`2\zo䱀>zu֙,ޯsM:65ml">QYgLMO-@ '\oZ]44MC$1D"͛wvgBrK^^ttt Z,XN[[%%%8ZZZ(++3/0L(CMyvD'ъݍ&## jQ_^s 9{15MCQ.\7ꝝMUU1MMMO>$7u~x\XVfr222hmmxWIoX,~3:DKK K.e|ӟ` C@ @AAڵ(fUOEh_*_Wxꩧ.˖-#O|'|r:˯:?~FII H0OO466X"rrr4'??<~?L&zr~W_eժU,Y'|@UU !S^^$I`6I$o>olݺySGſ/O} ǃi~?νK8DYYa @ n~Rm3gH,3^7D/ٳgikk#--^IbQSSSO= p݄a>xy衇D"$ TU%H$ cؼy3W 6SOQSSCgg'… aɒ%466/r?8NL&_ר?q֮]jԩS/i&<t"I >/^dѢEx<oRQQqM*Vf)_ٸq#?Op---<TVVo}s-l2~_sy›\X,wMnn.$H$D"_|}{lݺ˗_^ωaë rxꩧ8w---Ái?׾pPXX__o}N/^֭[7ox<T(& -[F]]=w;֬Yng׮]l6-[C=UV?===⋔SSSsGrGˬ\1pY|>.]bϞ=455H$ؾ};_җD@@ lmm-555j%N{͌iz{{0.x<~]&( ^nPU_TTT/}RTU%O(ncZ$ Պl IKK#--/| |_eӦMHÇIOOҥKs=:t:ˉFJG]]>,ַؼy3ٟ طo/_w˗eoK. Xp!O=9~8eees>#,I~G^o po6Fn6@"0)[oŢE?CˍvdffRYYI4 :}t$o>p8ɟ o.^Ƚ9u`׳zjoq˿ۿQ[[K,_?)Ν㩧2,eɪUxgO~BGGg׾Fzz:999߿'صkuuu<_*K.6(*w`b|I/*6l`llZg}""@!AmS}JȌznn.ZxGHOO1{AwUŋSSSw]0"2x'p8\.x饗8piii/.~&=//JQQ6h4JEE^k˖- ÇzallpQ9š5kPUH$@NNl2zKK Xvؕo?M駟D8&33m۶q1~_/|Ljkky7eŊ7!&?owyZ.\8AUUexxgyb?O{ ɡGR\\l ͛72DQ7 }}}s=<9+WdݺudVf˖-[w?qV\IEE}}}pwd"//Xҟo3|rrrr:>3226%co۸\.JKKlE @ $I"3000!>/ 8)י/oRo$,V+WfѢEl޼J-bƍR\\˱X,lڴ0xv;+V `X?֮]K4Ee#HngÆ dddŨ9f3x tQ5M3v!u!߰a-`Ȯ]X|QM6/~Yo$1Y,ol26lʕ+ EQ(--eݺuXV/_Nqq1iiil߾u144(,_~pr]wvݨo @UU֮]KII <,ZUVaZX,,[KbZfQZZƍrl2222˭aݺuSRRҥK 'Iii)ׯgŊ0o<Ơ7O@ @ @"6y<j6vߒ$ e$I"FNNJey~?S鍤>9v.~tӟȲlM^Q_WorwV%I"D̜"z题ϥN$xHOOjNOjON7׿˅>B< /FUU<YYYG(uHd*3!ԾǤ@ `z$IbhhLzz$Ix^V+?@WUljF8z-Zd2]1lz8H=l~7 Ӄf띰P&ňbI @ >\aۧue|SM$;;-mhv%c6?юuw|S D0v'`H$2,,hF0$ #@<'Hg&@ _i ,VX>  \(iiiьp8>B,'Wcpp\# 2o޼ .'`p8L~~.@ kٱ߈;LژMF8܈ uL 幉D}'z973樓ׂ@ xeN?%{("HPXX0ϟbt:I$455Ivv6V!1Ldddx8wP\ƨgllf3466b6ĺqy0sP(b`Zŋb1rrr?H$Bnn.p:;;q8Mcc#NŸx"qN>Mkk+Ass3FŨ'33MӸpl6444ΦE<'//.]fNkk~gݞpa233gq6t9IOOrqyFFF 줡YIKK&z{{f&//ɓ'dllL&@}:N.z:~p\^/Ofhh C@+IãGX,;wX,ƙ3ghnnLxH$с&??r( :Ǐ… _Q~FFF }C$~inn^f[o166Fee!υ  I5m`0ȹsL뉢dYVpYä+D(vU 9s_ ŢE455qEƮ>}Cݻ)..%fY&gEG$ jjjxwػw/n***,Zñcfdd&N8n3`6ٵkW&--m/̹sضmۜA7Tf3`pp]vQTT,˼qw288ȉ'СC[b,X`D^f ng}y#GdΝ\rDm?[p:={Xnmmmȳˮ]?FFFx饗;8{,6h4Jvv6HcArP(je޼y \t Y_$33h4ӧy&ȱ(޷o /vvJgPWWGzz:}ǁXl#{hh>L[[W{! 144 /@yy9\pgp줣{"'==IHOOV, $//F=GCCPlTU^222B޽{{9{,Px @ ڵkٶmKR[[7 X,| _;'O?9[xWd2aZ),,iZ7J|Av}͍!2?0oKMM <*QVVg>wEŋFzzzhnnȿn2adggO~??2tuub\t:Yd 'OcXj !2˗/g\xm۶q9*++g>׾59s̴nD0Z8w ,ݻ)((̙3<ۿ<UUU477Gcc#EEEx<n7.]2v'?Ajkkٰaկ [ X,hhh`ٲeٳGyk#===SPP@[[]]]Myfc444ʢEx0̛7KTTTFSS###۷}s?jRQQAzz:`X,Ӝ;w*֬YCKK ]]]"I/^$33XPڽ{7֭#x<8N\.px<>f۷#2wq\466R[[˶m7a|>?9qr˄vuu( _w˅ 7oބ,Y*۹A4M;zjjjVl6wfɒ%h%( [o~6ٳg dƏ6yB?~ɹsԧ>??OII 锗֭[o @ sۼy3F^_ł,˘f233ٴi?O9}q ^w!~G~ZZZ&(¯k ٰa0񬶞_GW_%33x<)W x饗ؼyaq^}UrrrF PQQ>)dffs뭷/"IUUUDQl64!tϚ>ʪUXp!& *ΝcÆ <FJJJ&9s yyy\krBtgEeY̙3\t{P(D 9p!宻bϞ=ڵˈzp6mfQ]]́8<6l@ @('9rUUbtvvb6ٶmvݔ~z,Y;C,C4:::H$lڴ 6||͛|/]đ#G(++wJ"0,z(//gdeeQ[[Kmm-.0::… Yv-+WM6OSSSlr͛ Bx<)ύD"tuu1445W?).W&0;007MN^wuux?>؝ellH,wyJKKq\Νcxx^࠱ IrÆ Ȳ̢Ehmme޽HDqq1 I$PgM0?fzpbZ[[9s I cǎ122… L&|>,\\jjjxo7ϊ+Znl67o6&^/rm[n,6oތdiw8N2{<痢p_^hFzz:wq`qF=J0˗n۸tRYYIAAwyh6$D"fc``ŋeڵ{x8n Ԅ5\o6֯_Oyy9vq ?0NNV+.2HOOo nv2v.^Hss3+Wd˖-J4eÆ vyww7?%%%/_n캗<#^E(bɒ%[Up؈GQVVfB4X4Z[[ =3m6lذ 6 IVUUEKK ---lܸM6b޼y\[nO__vYr%D"#@ >8 vÎ$A><8@4 NqqZޘ..] @p&fEQIjkguTUϦN&l~Aˡ( h#׷@ W>00'ZFJNN6^N:,dgg3::ʉ'0<<̩S"//ψ^__0\S{<#R\wJSpYcqIzfIOOsΑiFq333b455i\p/mJ$ԩSdgg*O6gddĹsD"D_dffNi+EQi]zzzd2x< PUgF^^{ٳt: X,F]]c6ill… dffb٨… hFNN9ݿ?W77 ƻ@SNL?qΞ=Kkk+Vh4ʏ~#===455EAAR˺w^.]$I̛7oz^N< ill$''O~E455Q]]=sq\?~J7XӧOE~~;ϟ?o 9qx<0N2-2/^@ff&={x)¹shmm5dQ 2zGG?L$ٳHNp,X~3TUرc̙3 K/aؿ?k׮59w۶mS#Y;v>]voӧٺu+CCC3<o+W`ٳz+[oEmm-}}} oRTTlvw^B?E49իillgeҥD23::J,Ӊ,HD^^= bhkkUUta;w,XXP!;;׋T]CVVO?4,[ ߏ套^b9rNd ʾ}{X,7A"6f3ccc8N CCCAΝ;7ǹszKWW}}}믳{n.\nrssT]cccdggmׇ$IFbn&H`Xhmm瞣.]D{{a6Qsؾ};CCC455q 1LHdsǎ7 ` .PYY"?e~j^~e9}4iiio>hkk#''gyIxwXl?O 9r"?Ι3gv*/pQVZEgg'üX u>vvEaxx z{{|'?a,^p8l\.4xbzkdddB{{;w}7^^~e^/qrssD"G<?1k֬rrbL4M駟ra)++c׮]=zIQQo6gsdUUimmݎi={C^^F~ ݍinoRXXHff&~߈>F~@ w%??p8,˸n ѣ GZZ>,$q!.]3+V ''flBvvaP(UUU\t*N7ӧyW((( ==_ꨯ$ 'hg}˹sx7`ddBCCC^}Fooa8ݻ˗SXXho~y饗 |dd^z BNNo\tC*nywdff_ lsΑfp}[o`^{5A$l,477/~Im۶qmsN /|( |_vN[[16ߏg|୷bڵsپ}sqyV+ǎj~֯_O~.\`…xb.]Dss3O= (BKK Gɓ,[KMCC=/^eVZ(ロ&w؞={hiip`Z9~8Նn$SNh"#'yCC'?I(++駟6toyy9x^ijj 'x7 O_ s9Ef$I?9Vg}yoSRRѣGYr%f'NddYfdd{_!E8fϞ=1o<:Ľˆ ؽ{7pL~婧g>CII GRYY?Λo ~߱cQ\\̉'ؼy3wqozEGk1Яz=uRuV:;;yH$jȲLVVwq=gϞ5'q> ֭d23f ~q^{5ذaô_i iii~zzzX`΋/ /p]wQQQ$]_立J>S\\%++ex<Ο?lfѢEqf3& Y$MFC=իYx1=.H$@CCLvv6ccc466h")++CQ Xt)k֬ѣn###F6gfSYY <`x@rU74Mc޼yTVVꫯ}vVc2|,c2PEQ0͘f#>~O=E[59lw=ݟq3 555?dggh"V\ɺuؾ}q(ӟm6^{5)//nqq1TTT|r͛gE[$ χ磧FxرcK,5kt:ٲe 'gxxu><~O<G%r=P^^Ν;Y`Vb,^e˖Myϝ9s 6CQ\\Lgg''ٲe ϟGQ#բ.]}݇i(¢Eظq#-G5.TU5l6( [lѣʪU 0LF񸑪/U&t9㙤ʄ~.Ww~_PZZʆ  }qN`*W4].tttr(**bƍdeeq-a<;wdllϬ^vm;<3TWWF[n!??իWm*`fZy9v/& Dhjjnzzzq:ƮAWW---\..]J<Ahoot0ַp9{,]]],[X,f\ѣGinnijj0>-܂$ITWW›ol6&s===477 &9ub-2V՘2ywq݆KdâEɔ㡫Kˊ+nÇOUUxp_bX@ [or֭[GVVwy',sI =+Ǎv:~8.sZGMӰZlذ0:֯_o .Kr!^qmVVpTZUUexxe˖CMM w}7fyվJ.]Ă Pň7˜n=,]<-[>9(pysթ-[F]]{%??P(Dkk+wsNٰa999ٳӧOj*VXÇٽ{7ϧ^z-"l6vMcc#k׮e…D"W6y^N(###̛7Iu6TadY&H 2v:::ۨ!ҥKeESSK,aX, WJwq] p\IKK3vrssK]u9 FPm۶G]]6mfغu+ .4Ɗje… ]XX 77K زe Ɂ7 e˖AJKKZ8N/_ix^nj.¿-ZQ]],ˌrJ,Y!33HYZZJ<' lwHEQZZJgg'[neTVV… ٲe A4M {Yx1tttPSSƍYp!8N^˱X,\.|Arssijjbxx;3˗sq*++q} l߾*l6XX)++# =Nl… D">On 1f"uпEn y)))|[?3/J}fffuЧ~]M~?w%$$p/0::JuurĉOr-$:`#Dl&tRDDDDDDD~?пDTb47}=U%Qǃ~Pn}r\Cx<$R8|0`'̓g!4[E(lAERmjco[AsA!}B|W5oPȓ"}DDDDDDD^B6gEz,--ƻnX1WWWx<ۍD"rWVV6*v\uuV Y[[jf~SQL&u䘾x<"% l|Y뛈Dg~@/+=dgq:B܃AŰ~CEDDDDDDDD$,;/("/d>5$E I=~*?K~2XDDDDDDwVqDTb0Y  q}$ &Y^^&&&Yh4R顾JEdd$`Z?SB̕J%]]]rX,,//SUU 111\.jkkFV鄶z NMM n$innD{0LjkkDT蠾5, TWWݍjNSS(JhmmE"`4P(Z!0Om\.FFFVxijjj'** RIgg' J<^4 2ƈaqq2 >>L&TqJ)9˅VԢ[!M[__ghh^/z<^}ttT8]]]OY[[ٳ|.9Qԛ0Lܺu Ӊf}?N'PYYFT\qtt^LNNR]]Ą 3B[[:sIMLLPXXHVV֧=%%%,..tuu׹r @irrRXSEDDDDDD>?\t K^^oߦ DB}}=;t:ܹC||k׮iW\\??rz=SXXHAA PXXHtt4x<ݻ!<>'O~.1ӧO'&&_0 qqq|f׮]~$ $''Gسg`p LMMy9CFrjXGUSRRػw/8q.m~VWWq\|'B8}>??a._LOOuuu|{Gww7JKaa!ODp\~F+WOS^/ Ʉ5ܹsSWWGII ccctvv )J78\xy eeeTUU122¹sp\zueamZ^^fxxxSػwzr9z{{Ν;ܸqM ~`ff(>Loo/SSSzr sssr|Y]]$HJܸqF:;;|2ߧ@ lnnիRdz }/g}}WO>xbc4yW9wBhc ||3<+olQIDATlpEسg=<|9Z[[QT$'' xO8}4 1Lر N:2H$z{{ٵk70L~8vR)v;t:Ƞ Át~a/J0BLﳸ5*++!22o|PVV&"}}}ݻwKiLNNرcL&ȑ#l6\^}UKJJ"??_ S H$DGGfjrt:v!B&o{nrCk.N<餧hoD^L& ~mfaa9FsqӧO iH xJKKٱc|>IMMW^2`0ЀaѣFRRR%<<Çsidggw^:::XZZvt:LOOcy!$%%oL/`LFtt4XV߿/qvRɁQr9:?YZZb~Ν;oM- ݳgGayyYxv>|HVVַX]]foO '>N>NbbpB!! T*qttt|e `<""">m(<<==DbP^^NWWצgenn2FFFZ@.#H@"t:yDFFJHRIII8qK.=!m68r`؇;@pcz=>l歷"..&9Nibcc f}jy<t:111HRƈGբP(h4|>qqqLMM 6쐬hff&넅qaN'kkkcوe]ax7dBh7M|>}}}T*H$aۉaΝoZ!??J*N"##$CNNDGG#Hjk.VWWh4뤧P(jO~~>iiix^, eDZl_']bۅ6D"~t^J􅅅gAܸqoof^̖렇?G-|>͛b0ˣ@ Jӂ!yz=o_$"O cDDDDDD^^B٧hNRhܔVԝgcc5\"vx<ϝ&HzHҧP}E"x0ﰰ0^}Uuzg}}m< B^˵MLq<]llleޯt:ǫ-|kކ C!`K#:ݚ!"""""""UMG0$,, BeKҗ2]*>sי|HEE`8,--a٘AL&2J7U~|ȭ[|>555؈nTVV244Dyy9op??P__餺;wp8^~:J | CCC\t ȇ~6 ݻwYXX… 2::˗Qդx(++.=D"accjn޼x<f``7nDyn߾Mmm- ###z~?ϟgvvv{ۿ[ikkTUUt:qWxhoojAY]]euu5~k4/`}}Zͻ!""""""""|AAA'&&\ڨGoDww7.;wRhllj zZɓ'JOfqȑϜPcR)'OW^A ɰX,;v RI0$667x r92{) R~"##9u;wDPln l6ގRDѐ NHAPpqzzzضmwqݸ\.N:%f~webb2\"W\Ç444P]]M]]`hh_H$$ @q.^( DFFr ۙ[=wX,r9:Rؘe}vA'<33mFbb"<@PPPɓ_h=$ ܼyp ofhh{Q__|zb.q5550;;O~>#<555LLLj1 _>V)(( ᾭ`?cŋ|LNNGBBo}Bsss|Ǽl6QnKLNNO0$==G oơCY0ރ @`0H0D&1;;˥K7ILL̦>_}Uĉ\.n7RAx׈"+ehhj$&&L{{;vۍ n7& @Ш"//oȽ{#e~~Aݻm$%%BKK v]vqzzz8t 333tuum1`n Z[[Ql۶M˶X,dee뷺vލL&^0~? '[Vrl6)))$''DݻwWWBi>|eVDDDDDDDDD>@N&''h4V9rguusα̶m0LѣGimm*~?~zijjzjѲe炙sA466VYXXr ;J%+++n项y;FTTx<&&&: ƒ;>>Naa!eee,..v)--gVR)VKss3[zO_BJN $ {b033C[[ݛ<ûaߴVqM***X[[n77D4 Z$nii Tfd2j&>>^{ @rr2.'OngeeGfaaxx !9--l6 bSUVVVHMME`Z*l6~?111d2HOOGa0zR)W;**X$''ݻwP(C[o ŗBBt^/777W_\\D.[oaX^^fuuW^y;w1 dggP(bx7d 6 J%;,,hbbb0Ll6 V$yy7HJJ*`o>RRR0x^^yJP`0 x8CLL ZM^^fѣGDRRuرcp Jٹs'ZVNHT*!`0N=^r 5fffѣh4Z[[9r,,,xxWT*IOOguuUǏB 55XRSSY__TQ"qzx"++T0 !܇% پ};dddlw~"""xPJ&4O8n\.666~t^J􅅅gA\vE9yV7yQ:333[>==MLL̦p`0ȝ;w6s۷B?~\PJ:Dt1 8NJ ԝgmm5>me}wݸnVWWv7U{x~_~~y,x<ֶ x<>5#>B _s,tB}VDDDDDDDDAyY#r>Bwoe/e;!_gB!;Toy#**ꉊ"_?wEw/nk1y~PZSsuJ%Uhii`0A{{;%%%~V+CCC377G||<ۋdRZZJSS*JЬ~,7n`qqԡP5sRI]]weqqu8HXXQQQ455QZZd"22x X[[ҥK477 UݻGMM >M!\v * iL&{.vJKK oߦU FZz !FFF&..3$su

sssގN#22R\\*bT׀SS tݻwzq FFF ƯkA_bISS~X^/]]]$ ru:\.d\.ZZZiY`0PRRFbNKK ǎpt:d\vy&тxqq1gΜa׮]PRR‘#GHHH@&1;;Kdd$/^dzQ78s d2ڵk߿#.::xt:uuu( EEEr-DDDpErsstBe2uuu1<<*G"{,ZMTTg?bAMM ݘL- @ˮ. .\`޽\|lL&"rrr}`www{nj5455k!ɾ2zDDkkkTVVֆRdxx,--QQQ$..nA?==ݻwbֆ\.glles&''/xhjD388 MMM sҥK를IAeq~j5uuul6QT!zQQQAzz:.ܽ{h,VwIDDDDDDDDwy Ouäcaÿh$99N0:u L__ HhiibN?f?NLL 橞4zR)&??JExx8&T* XV?Nll,( IKK t:j5UUUcHMM%<<|Srgg'kkk QTzZ[[jh4l6}}}a4!99cǎǶmx뭷|\.?NJJ jiٳgq:q-~?׮]f*++>`ttgJ ֋/Rjr5p8;wnˋ]eeeqQt:^\.0t:)))h4p`0ףRaee'OnYoC"Nyy9QQQ( ݻG?ݣ]ã3gxhjj~s$ <$7ӝ;w?9100ŋatt6F#6 J:mmmo~>})׹u?~(4 HR|MRSSyVwADDDDDDDD9;$Ɲ>} n޼JBRVfo}[344$xX_{5`ffO{{;s5VVV8{,wBRd!(++OO^|2.!?JJJp8LMM'| :/_fmm! l۶Z9z=HJ|>~p299ɕ+Ww'- bX8r۷og+xJÇ"Ğ={XYYyQl6l6===,..AXX@LF ſLLLHKKTVVsNZ-wjd2333gϞ-Imm-p8|0'Odzz666:>|pjOOOjT(d"--mfCQYYVh4 G.c0ÐDo!!I`XhlldH$jkkiooPT~?>OԵ=S qiiiattBAtt4 cǎ~666xq\dddꘘ;Fcc#.\JE?\.gbb ?---x^fffp:TUUC[[}}}Ri666ꢳZfggy7Phpqq1wf`Y^^tR]]oIIIHRr9\xk׮t:|qzzzh4B+@nn.CCCFT*p%NdHRR)2Lcio߾&_‚>D $$$ JQ8Z[[)(( 22XٳWBV344RD&G*277{ ,,hj5OF"@RRSÆn77od~~fggF۟{?1L ͆#66ML&jIOO7|xt277)))s1HHH@Tn2% F68tdn|ٽ{7?,&''?GV322bAVs.<'>5}eeRSS"""e!SӑN ĉl6cHOO' Ajj*JXf3XVAMdd$ e=^,MRBran7FL&qqqfT*111fjNZZRp\X,N>Z>GT 1޻cj5DDDobZ#GK  && r9QQQl6J%O<&[RaلLXX;vd\.R'ObXr9~ˆ`0p!233QTl۶ &Dzj5@`0HTT;w$33\rss1L$&&)̭t }P*?W2xz虴X,8qTJNNCӡINN`0hHLL$33@ ѣGIII<']bD"aaat^J􅅅gA\zNAA?3!t\Jibbb6i)p)..f||x>qg DBtt4N /Q]DDDDDDDcllLpB&NRh1Tr.HX__gcc𹋏I$JZE^.]nT*V73˘'":n Bhx<d2r1p~Qg-xhTJXXsy{E&y<zK.H$H$@?`(<^wS3^D>̟^}|Y|V*vzO}>`H& = T*1L//z@ Rgq: qb04`4*E("n4)"""""""""/˅Lw/묬lu3DDD^`mi|>[n7.k+gX^^fjjJHGyV^/,--= 8N1CDDDDDU>|Q(XVN'7oޤ^^7ox7n055Ebb"ܸqNF#7o 111Bhz(>+>;;+T~VB̕J%UUU4V||< |'͑EEEF~?&R***fmx.--q9ܼyRl466RXXHMM N$ʸ{.DFFr]Y^^&..N Um166f{\ZZ*\~.Ar ͛7{.'22`0ȵkfy]]]dffP(*[)%rj5|hh /Wqohhl۶~O>4C ---ܼyH$PYYNCTR\\LUU 3 \r4 )//gbb<oߦNƍ455 .\`dddr(,,FDdʕ+TVVR[[Kll̃HLLF#s HJJb``7n044f{vΝ;ܻw׋dիTVVR]]by"zh4O-෴ĵkhooj>5B7nt:"⥳WRSS8WrKEEɧQ]]͝;wX]]~7oRRR /^vA.l|*j\.jkkzqUIHHʹsؿ?nh4'PPP@KK $%%Mww7󱺺yWPT u>|Hww7ǎL:33fpbccG %V˥Kػw/n2, FŋܹݻwyWINNF&BLL |  &ڵk\p`Xxt/_fΝXVF#۷ y&w~ˆ=wPפݻwozxwسgX,'B###͡V9~8B322P(ܺu~dTUUq}n7.]BՒ@}}=󬭭MCCa69<ܹhy&X,R)wޥQ{QQQ[o CCCl#$"""""➔Dff! <<DOO---L&9baxxGTT^L&  ZM[[&N/+Hطoiii(Jt:]vP(DGGsA"""MRR玎<{D555h48lFl}okkg!_ֆhDbX`61LX,^/Ge``tN< <.nXse$ TTTj),,V***A'066իW#22(׹x"ZxRSSv&}CmFAA;yz-`ضmkkkt:4 (JRSSĉ[sېH$tttp}jǽ{˨T' Μ9BrJKKՒL&l6Ξ=ns ==]4οD9r嬮 nAS`H*Ovv6rYYYlllx8x FN%::\NBBܺuEݍN Պ\.nc٨:f ͂$` ,,>`0Hbb"kkkdggc49<@Vc0蠧vdmm Jcc#<1!oMM DDD%55'9r>Mr<)'&& $%%188Զp88y$fXl(J ;wtddjjjhjjbǎDEEaXHKKCVHrr2 VիLNN,,, HZLOOsMn߾M[[JRXSRRX\\ѣBgǽOF*R^^FAz x<, d||N<ɿq^/~^v;}$//O?jOT8,sUSֆjQYY`dd+WX, kkk\z%z{{󑞞1==^//ٷoCCC466%ln7^ߏL&#**"==M}X,϶mdϞ=gd2ضm{d2 IJJ"77Z[[gttJlb000۪ !|>x^1::J0d޽G^ݻwV(MMMt:a<&&&C$ 7< dddGUU۷R9|0o333ܻwuNAQՄj'==e"""E@^\.<[IF  ''NGuu`61Or99|02 - (J(..7)JnՅFӼTTTv)((G?8bccٿ?qqqtttPTT===BTje2::Jcc#ӌ ~?nRI0| gcc۷ATTi&;;ZM__3>>䐔hjNrr0<Bz=|G|ǸV[_XX.?'XZZbbbAYY]]]466C|>Y__V_A~~ҥK\~$n7"ccc8ݻٱcZNgϞܹs'ի|G`4455+(/Fpy>#DžpBD"C377F.^"2LxOC\.GѰL}}=@բr֭[9sxjr&''GYfgg)((=$ZJ[oD"Vw2??Oqq1TUUG}}=Ͻ+++(JR)/x1LOOoU( l6d2aAJL&ȑ#a4پ};*j#!}SN1<l!<Ν;444FA&q)rrrHNNO>a}}T"##ceeFCuu5EEEB?#""K"T*p@QQ555{ÇyZDFF2>>.ܧ={PTTĵkسg9sFhwRR?gvv\.\@KK˦{^[[ˮ]' k28pxTBTbXH$˗'Jܹs8l6###ۜ?!xr:+`6j½ijj">>^ȅE'""""""rMM?`aa app`0Hrr2z„bZsss je|| l2<>2.666P*dee,lA&''Ex^RRR0 DLLj Ō j5\.l}SՄ399baeeDV^HZ[[GaX__gppTV%66a###,// EY3BѻP¶maffXX[[caax$ `4III>dddP__/$a牏f >>`0HYY۶m#!!x􌍌mP(ܹs'O ǡ1 BҒp `Zlܺu,pqeff8n7333$&& (JRn ɂL&cbbӉj{N'JXXZZf ###( """yaATb4x==->;w099nf)..<)))8qB .""""""""r033Cdd$aaa~@8n.pD:n^z% 0!e;T8T0@(Dd}}]Nx^,--̸ ,-- ҄9JR8 eo"""""""""_$ KKKO5OyބxC Y~˚'xnUe{jc'T{z^Լyj?aA ; 2?sי5!yv XAP/"""""""xgEDb۷"_s SSSLMM"/ MZkkk[64eL~?[.*"""""w?5|>NΜ9#4v^ʃh4R]]͵kX[[#11\IIIqZ[[`0z*r^/j >CLZ[[CPT*)//͛<~!ddd0??ϵkרB"`ZŋX,>\.~_Q__d2QTTĝ;wXYY!!!as~~w}D ׯ_׋j޽{ܺu)㩯ʕ+ܽ{AJJ 7oΝ;(JbbbGڹ*ɇP(~LLL099)TS~#))+!'r%0ͨjnݺEii{uJKK{.zǥKhoofG}DUU---P(p\o̘B>qctt3U䟘׿5z8}@{V_߅}>hrn߾Muu5\..\@cc#SSSrINN,// zHOdfffAP<@VSUUErr2RGee%EEENW؈cyya UQSSLGGጏᠲ/Kjkk3::JMM MMMܺuwىʕ+ӃN0Bнzww###X,.]Dyy9űDCCB?NYY)))477SRRBnn.\pX\\B^ cO~ꘟ$5===\t\r9ssswYHu"TY ={vLmm-766reIJJzbw.\8j5ܼy (..Ӊl׿5Aq2::Ç9vg e(++CT$=z  &O>}!Hb磰7osNVWW7 ==L#)) .)l8}>W^u_QT( 4[[[1<ȕ+W(((n244ĉ'P(BR)%%%Յn\Y__GSXXHKK t:n߾-H.UTTԄh_ j5%%%477c2t/|?nyZZZ0L[oq%rrrHOOjR^^ή](,,$..>Lbb"q d2W@`yyY+ X,%%%'Ry&###RWWGcc#L&nݺEQQHRn޼Igg' R^^.0 ]z&v86Vyw&11QGSUU`F~Yx@6!}cvvÁdeep߿fƍh4)..voAdd$r :"FFFhiiСCDDD>|QnݺE\\LDD)**ȑ#r(--fuu7o/~ vM~~>@鿽{n:TuD q\lll`4GRWWǿt:;;w2)N , Hvv6B6668{,wx܌DRq=f3<`TUUGAAwܡd)//7`ǎgNQQQ?Fq !KrjF#eeel{ENN%we~~N8N<.{'Np=Z-rpաR8|0 pvMbbP3pevASS ZK. ߿W^ԩS\z۷EII NxL&Ԑdڵk3==VSNq%p~\uX***8tWZDDDD1?5=..T( "HNTT{l63>>.rݍ^r ^eyW7ID=d"++S DΝ;X,rf3:d2`(vE0bRضm&`KK :шlRj5vBR6MMMd2 pNX,t:Z-:taxW匌p]8S|ϭ[tRWWGll,nb``N***m"&'')--%33L\\`˗/IKK#''+W0??T*ٳ[ޜJVV>XAªp fUbccٶmP= ֆ\.f111ǿМ{H$inn&-- H[[===TVV211AQQ ɯk"""Ν;TUU h4CVV|GB˗/;v4.dddj,9zZܿn7//_F"p---}v._,ܺubܹ,>˱d2aJT*, fhf3r>JJJhoo'22W_}_ݻ9#HCpPUss3 ;;7|u*++ 㤧J묯HXX&T*ezz;w066D" hV+&X4 333ܹs:onBR{'rQYYƆ^^^ؘ )((`qqa8z(ASUUV%>>H\\@ @}} 8>1<<\.4,--+UUU0??o磽E]]]  444p=XYYauuϓ& yyyLMM s֭[444066Fxx8r9Hii)$v;W\Ç133Coo/eeeH$"""AףjY^^"x!T*֭[j""" %%bB"T*ٻw/lllʊ=T*S8)//D%!!A4EDDDD+3/ӧOjyz^>Mtt4@ss3'nhiiavvw^277ٳg9v&]7;444ggA!yLtt4?G~R[[ᠯ7n(.B蠥Kjj*?$ t:տWڵK0뉉!::0pƨ679tذk.RSSٶm;v>n FVvr ro "Hx ܪJ}!h4"gzzzG0 U< l߾ݻGww7A>7M}6{Cc!^GѐERR. ZMTTZJl6 DEEmzfBT^/x<rVKLL LOO3??b6===|Bc5??Onn.;v`qqGbb"鬮FXX* JEXX` mXX. x9CZZ~6*JA^[[qu x^X__>/$o>N'Omobb"w?S9D0d2jER s~eeE\L&w&++ RIkk+۶mr ~j;voͿaΝ(J0˜A ۶mٳx^oNii)333,..R^^4V`\ٽ{cǎ'PQ( TWWD"n e2XXX)&''l6GRRx<vEVVRprrr0(JanT*J%aaaBtᤦ266&Ý}gddYJMM h4$//FCNN梨T*ttt}v:*#"""""|HPPP^mN:Łhii'? >۷ u>"}}}BV>#킫!dmll<At  x\B4bXX\\dbbJERR ’C2kQQQ044h4ZXX <<Z-I T*'`4 2??D"!99Y8G řd2H$qrp\B{0dnnN0CJHH ""11 _,l0X\\$99Y+x<,--aXJ,,,V gnnN_y?v;* χF1я~RFlfrrCBB`Z1/|®lfzzi㔔$\ALL (z^((477Gxx뙙>==dbii (z^Rs LOOcZY]]eddD0м^/oɞ={tbZt\.3::*DI t\DFF222J"&&Qֈ F#xACF&** b׋G&122BbjennnS@Hf-** ~_ p8 ͑ xTJ&`ddχV%22R(t:Y[[4X]]ettFCRRcl6vc6xdff8j$ na<xbnn#P1))ZDDDDD333t:„@ @0dyyۍhq2_T~?2W^tr!vܹf7П'!}+uЧ 1??M311@JJ Ǐ< Q^^N @.sԩEy@MtvQTTE&q!;"hjjxdĞ>}F<|mX__P0srrl/YD"ȑ#/nb~o=y>H$ GT PY˅Bx@neggw(1d}]x/_6|j"""0͔qN'477sEIIIatt/؈N#ZVWWIII$sVWccc( B۷qCCC077ǯ~+&&&bnn/RQQ'>> >CbbbNg?#..~P__d2qUn߾n'))iS4OA6ܽ{5(//ŋHZZW\L&*++޽{dgg#6155SuTWW FCgg'ϟ ɄZڵk^Jqq1 n71ƲOyy9P(p\oiB>qBPаzȗNO+**uyyyttt022immEPh0˗/-T׿x"w.]DYY.3I  GEBB}ȋ$f4v#ɞTǎ;t@|._LTTׯ_6nBpUoՅn'''JÇ'!!2|MP 4Yoo/GLxݻrRSSs^/:X.\}PTaXIׯSQQΝ;Y[[o|dddz\p A Z(J666(,,СCt: njk.233 ::eyWt{a~~311Q(BR)׮]6)--ER!XYYAs%EsUz{{ܹszz====$22JEQQ AE򸁾NRRv&f3|撛Kbb"UUUpUoߎB'Nfdd'N2M_=""%\Bcc#rVV+0>>έ[XZZBp @ @ww7ugΜaxx-'Orr2׮]رcd2 n۷ֆ`~~^>˗Gד̮](8,--VE*N~~>avرC%"""""""{1?CBBtwwEnn?>...ׇNcuu9RUU˗xM__/_ҥK?D8fxxٟQVVׁ;}FFIIIhZ^W+WBww2GQf3PXX Bar9V ŴƠ77o4( F#1v;2kw^F#ַAPoH$uuu\Fk͛$''T*}6"3  BBhR֭[imme͚59s>֭[ǫ4tz<DZX,$''Jjj*;t:sQ"PXXHzz:ϟKeee,[@ 0k\MMMc-[Fyy&x<0:jjjя~4K@yf Bnjn,2.q555A.]Jbb"Ns=իr o&rb:;;q\dddyfikkcjj"8{,6|{&ccc>}WRUUŦM>1[o199h$55ȱcDcRRo/͛7˗E__`۱l̛7~jjjl1\t8._LJJ jb0oկeÆ 388fyVe2111( j5j\NCRVYp!G͆JB#p\D"lvP(\*N>^HONNb+ p8HHHMH6==d!h48Nj5pXrU/~\\Ĩf&_5G|barrH$B\\LNN2==MRR~}e2NL&0===!QBBJB\\v]th4ArWX-2::JZZ^ n|M^x,Y0.dT*h¬VQ(FIII񐐐˯hı, px^p8rz=V*zl6h"N4%99$q:dee000@0DRFyrB!qMOKKC7 o~xjYJO&3/ ?jyg ѣGq\_3GʟKf _%>yGGGIMM%4EQΟ?j^p"SQQ2\9 t'qģ"OMMa`JE{Z x$ɰ[ǟ`o~Ƀ[ d2I}&!!!!!!! ɘ@T~&h4\.|_JP(hr .WPS?& k(z(+?w{~D" ? BO GϳnQT BL&`?fÄz|n ÜnF$򇾮JHHHHHHHHVU3C߹;'}iσI8R=3+>^pܯ>if}SmnH$2ffGY%>Lww7yyyLLLosm.\vٳbJ{=RSSINN1/BNNv_477IHH`߾}:u gB˹sdggSYYѣG%''&ˉ'ݻwsIoKUU###T*gcrr]fK.SRRJd2h"IHH455j*ӉpI6l@BB*ӧOɊ+Xh׮]Ӿutt /o> dÆ /JB.{nhnnfllSNZƲsN.]DGGٳn1x}}=&n{=L&*ÇsEL&}0rq%9w8t-bb~5kp-[^… lٲŋC.mtw惡RŋIOOgpp/ɓ'C+W8|07n == . z*vI$a-s:+ b!))cǎ1=={r9?~:4 6/"ɨ7ӟ)ݻZMYY'Ol6ԄRaz{{ygٷo˗/gᖐyO5'%%Ҷ 1[qf"B1<<(nBzq8rMX,{k2B‘L&p8 @NN:lQX#??ĜIIIЀhd…b.邂.\={P2==-2'66VVPV ''^hdxx@JJ ߏng͚5 Gii)* Ayy9===l۶p8ŋ)..qM9F#ws܌ L0>@OLL ^gbb nܸL&`0c=߼y^`hhvjjjzԐzpnZٱciiiPUUEvv6o&555dggى㡨'|R̫ wϟq:ܼyp8L[[,^zӧO3<Պj%++\p:hZF#2 BFA#LkZz=ZH$Vh4Fq\D"/_^Gp8HIIa#&&il6rXZ-6T☞p%$$$$$$$$ >UIMM `Ea6E^`մ_NGII mmmLLLSO=ECCv.\Ȋ+hoo緿-ܑN<ɵkר'~HwLMM뉋d2q!:::8<)))QYY3ɕ+Wp8,X`͖O>Y~=.\NӧfFGG BmZ@R /%K-]?v6lUVq5ӱZjV\sbbA1Mׂ .\ 3l6uV1h?&q\bcc7oxJ%\r#GILLD.sA6mD]]6:::OO,ב{Cq%6m͛7OJEE[ne׮][0$$$$$$$$$ȬVJX&aX|p8&T*x<,  l6vF#.)j5( \.5pw񐔔c||h4JLLgڠZ,1^W4MW*LMM Qդ~pGҵ Zp8$r\,@\Njj*~J%8af3)n7qqqDp8FfZoR$~$|ELp8~d2jZQ׮]c``NτaF#PłL&Bz4G߇vc6ll6"FQnGll,`ǃd}'''1 $$$ C V+>gllL`0 neChKLFF `bbBArr267+111%!!A$hD|>&@ @(G4errBB VE0VC*xvh)cq\Ɗjvbcc0gqx^FX, )))|>af#66!yF3ŗ qFAfeTa2S@"%f 'plذ.3S@*̃>::Jjj,6R]]駟e9{,qW___/f|Yģ"OMM)&~ߏdBq:TGNp8A2e|Y!h*Y4wk8 Hh4z?ֱu DBBBBBBBBbnDR}&#\&FD"_2 χFykd2^W4[8yT*4 *jN3T*j_a}SBBBBBBBBߐdKw+JC7/\H{6qcFt:SwӉ^IUr|2hp8B rѨ|* ߹[Cx~g)YZ ̆۝iJ:+ MfLg m##NS/˅`">Ax>hfass3]]]bûg F`0H("&&'O{nVZEKK ===tuuJ("77W_Wx^ϟ/~ٵk LMM{n!55u=;v̙3۷BTr!***ejP@Gȹs#>>~1 9y$Gazz|ٹs'׮]ݍVɓ2k,o ԒA;wMQQ=d9sp8>,sQZZF!))˗w^HLL# 999 u&))Q;VX,#bOHH;l6+Wdtt ttuuqM ǎ-@P(eӦM000@?Νd2ގb-[GII &GJyy96mСCB!ػw,-\``pp%KwAZ4HHH֭[+z*6mZjlhkk#STT4K8bΝdff299Iee%ׯ_g޼yP]]M^^6l`ٲe|hZZ-͛T*|ILKDRuVX,ϩSعs'XY-PD+dhZѲin:Ґdttti&T*cTVVrN< /֭[)**(+V`…>|NǢE8u===LMM1==͞={}6ׯ_' qqXp!=6m{/0?T*?~Zp8PT0o<1L5//B;aT*˗/g^B4 JBBK,֭[\xG=-ZDii)6mBՒͳ>˱cirիW{, @5kְ`?Nrr2۷otRvw^FFFHJJb:-!!!!!!̈Û7o!IOOpvov `tttd|||6ƍݻ_|EwQ~0˯hioo: ?xnSWWGMM ?я0Lx<V+tttP__Omm-O *|;dgg EO\\Fłf󑒒Bvv6/iiiܼyJHH 77T}r9^XDQjj*f6zX,'VRrx<F֬Y݃`ؾ};ɓl6d20LjZBAbb" |>jkkikkaXe|t:^ ''^^ZZRdbb@ mHss3>)|>b}cbbXV, \.vxXB!4 raٲebj9uF9qnvcx<$$$KLL Blxի?$J_|n,¼Z|dffyfL&+(JFFFpƯ塣'6 )--%%%>N' +V_QRRBss3SODSS.K޸qE[0Ǐ:u[~f!0==MUU111r:;;$--?b?η-ZZZhmmedd,~rP,_!***p:Y`0{GBB'O[n#)//gbbGrHKKd2w^zlݺ@ >,+W_,Z+W;3<32xTRVP(CXx1ӉV%11QL/wA%''$oݺf)--ٳg9{,+W̙3a08x 񤥥166Ro۷QT<tuuQ^^~OmLĉlذVZ%OOOhXrWVGL( L&EEEv,X@||>""jh4Jbb"F͛7s)]ILLDRa0hkkcppe˖a6E몴4MnAnn.z'NFy'ܹs\gϲj*o~hӧOp¹j22 ł磴ۍ$b4jLOOT*C.lƢjq\\.bcctx^v4 bV +ǃ͔m6hFX,bi~?hxJ%SSS)  RD-CwU*H͆\.'>>h4f# "HLL$ nB]V+HDv;>` v7ւZ& bZtfbi<ZV,RT*`D D!cEWN$ a2$v.H$" Fz=P/ >FLL &I#!!At|>Z-@R)ȗI4ettTB87wy|;,X@0Lnq'ΥX(HA4 6 Bhn]UoB$%%t:EaX.Vzƕpw9w4 4l6jxFGGq80D?x3 *jV!_0DVC4jP(j|~qMD"vqt\xGܽ~ .An޼… E~#K/~t:l6Ӕ#5}"@ww7K.d"lOߏDR|# |>qMU(wZJ8&..Fux<'sχn(**5^$$$$$$$.bq8LKO&3/LQbp:TTTxX~=͛?03A@<肀>R!R__'bttl֭[7$0S@x4R)1ji[t:Q\o!Qc!rnGYh4n53yf5 1 s] AKHO>(Jje2h(yfY检`ztz /4N9>OL7FgJ"tJHHHHHHHH|}d>(U*_,hhP*ۍV}[ z zT*t:ݜ e`|_R>?%$$$$$$$$ !~gSwHD $ kw|>h4# kk&郾sBlP@ 0KF Bbߏ; ~j}vw ^W,S0 mgP=ܾ}3LZhϙf-a,zxO33w Uc1$$$$$$$ L& HNNҥK?G&QXXH__~!555( ٻw/GappsYSfF#>x ǎ|&''y7q cΝ;f ~ߐFZZ}}}(((f1:ݻ9}4}}}̟?V^ALKw^Ν;TVVr \¼yhnnf:t yRXXHCCwƍjFbddB4NdᰘY&7BǎB! ]sƉ^;wR[[`h4pyȑ#>}={`6棏>$\.۶m̙3={kעVs`ra0> BsAO4oj\. B655NAAo¡R(Ƿ]3BYfq:\p" pp8H bﺺ:Yd & ǎ;HMM'.UUU(JyDݻG244Dqq1رVl\p^O||<۷oԩSLOOSTTDee%{졳300{G}}=ɨj{=Μ9C  --#GpnܸAQQ=&'ObPTTt߱ٱcPYׇB!8Ç%9r'N{nJ%.J9z(Νc߾},^X m۶RvhqN6R]];}!oΥK͛;w,>Lnn.YYYM2 /Y$rΝ;),, DQΞ=ݻv9OoݺŻK]]qqq >***p\p Gww7ܸq>&ӉF={h4JVVȑ# P\\LCCo&111:,$$$$$v;Hd|(Q(XX~n2  h"ۇl'`ǎR[[__s*++kaڵhZ:;;#99f^u?ŋ1tNG$͛lܸ35LA566S[[B`ѢE( :;;ٰaJؽ{7W&##ׯc67o#G˒%K\|~2t:X}QTTDbb"prJ1XV.\c=Fjj*H3o<֭[Gyy9]]]044 o{%%%?".\HVV BL&wޡ:8uꔸ1`0m6.^HSSIIIH$ӧArm>#1EijjBՒL]VS^^ҥKS__~N8%KXv-lܸ}OHEE?ً/АU\V3o<p8FbccyN#)) d2222%`T*IIIc00ʹQVVFll,F;UUUfäj*dt ϟ'--狚NV易V^3!՝f F۷Q*8qYD"a 6~&󤤤sۋjett㤥rJ|I>L$!!!̹bRR 7ob z]Pp5%55}|(a||rssx<\|zt:׮][,vMff&Ӝ={>JJJXlcQ^^Ν;tpQe˖-rd2qףT*cƍ̟?222Xn[nѣl69|0n{FQ,^M6155_-_233gEz$'' 1׸MAA~80w@rrrebb| FFF&[nV 33aN'999b˻o̒P(D~~>.\An4Yt)6m"33sցj%.. Z̛7B!}ҥn:bҥKc0HKKc…¡Cظq#(l?PXXȫӧ,XTN8}}}( =իWBRLMM -blݺKf͚{***_%=z^xLN8vG__˫JWWH˗/Bff8].JgѢE;PXXjDŽf``  qSPP 3rssE.s-IKK#99I d2xbgϞ))!!!!!J3p=,_)fa۱lddd_4RVV֭[ի-n/*s^y1mP{߾}X,^uфQ0pjkkE+ /grE~b0p:LMMs">>~LMMuIII:0L166bAnn.[n%55YuFl6H$"B!p@0+5s%â_ZIMLL;Oaa!=ׯ_GӟP(p֮]B_&33I^^J7n(++hF0n q:|>n7+c4{*++Y~= j*P(ؾ},_p8,ƖRVVV%%%D \.󧦦~zT*YYY+**yt:"''͸RD&T*gQ|'{ Q(D"QNNfeЈglli1K\.GTncZ 255ؘfttJEZZXV\.A 99Nccc RSSc||ߏVEV/#gjjjVR!(^~6MlP(%L&V)D R)τ:99)Z%x^/j|p^Vu\.'&&Ft-ikkP(4B~i%;; 6|rnݺ\.OMM155%of `0C0DR~-[騩'$!!ڨc>ڵkl,[) իioogjj˗322$==]4G}4q?y$r\.eeeގhdƍl6zzzxgPTԄL&_&11F())r'0TWW˗ 1==MFFWRW}``F ,`ѢE8q<֮]Kee%dz|rQAT288H05_(JV+#Xh\.rssD"zW@̚5kP*hZ֬Y۷)--ETrMV\Ikk+YɢQae˖qUnܸ4+W F# 7 ƦMF ʕ+o!9qN_|\Ξ=˵kx'Y|9TWWSXXȖ-[x<+/Lrr2O<3,Z/Hyy9l߾ .xطoZV"ʕ+\~ f_΍7X,\i իwFFF$11Qojt:<0119@|7l@8( /&??ӧO- LLLNWWK.%++۷o[lSYYB#99g244Ė-[D,Xd 2o<yHJJ!T*|>顴qP"r9:ɓ' <3TUUyf4 vŋSYYɍ7غu+˖-KKKyꩧZFmq:h4C- 111Qճ,`P8A^ o?)2 ZM$v#PTj|>` ̾{x<n7fYHD ÄB!ؚN35ccc$$$R|Xuf "[4ettTQrFyOaa!.K<ܚ ɸnQ[DzB!T*111nD^5iiib{ )o|Qx^B8i2(vzAf>Ol+a B$V3H$DR`0T* ø\.1]# X bP^Bƍӄ$XRF! (ZSwpܙy3Uhk0jX~a^sAr Ķr}a ½fOVEff[) @JR#Z-`I=)QVj|hZ1МZ%1q{FӡhfS@;zP(7q~7ZMBB¬3*?Lf _Lr8w>kQ)\Ah4ŋ [n߄ \cccd2233Yjt744Dcc(ܯ_9i?Vf _>55%?,{$o G%L&tVނV_YO!'.jbEQ&}wwلTT=>-W" $ a}P#(5gЕwQ0ͻ_tGll0ZGf#[0_hpσ6s`5MRD̩PG)7P(o<(J16΃;P($@K 'B ;B@+/tκ&t:?Vz$k#@~Fx<1XpPI Dsp%dfdB@u|8L>ݎ0*pm PH7uDxvҠ Z;;ncgAGG= %~gbpƍR`0H[[}V&&&]Loo/_HYi߄fwirrY6s188(,a L>5ڥK~?H$BFF;vɓ`N:ѣGikk#//a|2>>NAA.Νn3|ؿ?7oޤV;ނy桃RPL   }}}:tb( u~̌ ̞={Aa4O]]r Ξ=Lrr2|455eǎTVVr֯_Zr9 %f0?r\c4B!oٳgCJfs4kGajjL %'䏏D"xur92P($ a> Q ~rP(C&c* p8رc--f5D"!ͺthiia``\D9%uGeyꩧؾ};&f~p90UUU'?͛ qFT*׮]f //ٶm , >>~.u7nL j̆ GTd4 lذZMqq1g߾}^\zzz0̛7͑#GbńB!Z[[y'Xp!z\VZ?>ÇdŊdggc4t|>n:V\IWWK,a``qO}G}DQQ%%%dggT*2zjjj}6gΜAz=>---Ԑo[D"TTTP]]R1===Dضmpp~# QT|tttΝ;~:H:Ν;"++Çsv; ۷o3>>ή]bG}Dcc#O&''G̡pYvMcc#ׯ_ŋRZZJ]]'Nl>C.^H8fll ӧIMMh4w^$vd2oHMM V?1~?cccp%233ȑ#\|Dњ'++ K.* o`0ȱchjjB&hؽ{7555d2ill 6qbb"/ύ7z*1::ʡCpL&T*W\3==M0{~!K.`0t:ٶmXfG8d2k.BFvE}}=SSSz!^Jvv6/^DrM.]D^^---8pZFFF(++!/!!!!!!?=&&Fܘdggs-fppx'dttJV%!!RRR?l6=h4}adnݺE4 BA\\]d2ҥK#66;G0$++~F1ʹ%,FTVVA^^h:)V/**BV9~srrHHH`ddβe˰X,dddV>F#ͪs$axx͛7_1&&&"77W^yE|f_˩SHOOg3 f3/W^6N۷oIii)ׯ_իaV^+VujqTWW366Fcc#}}}зm4 ̟?gy{n Ü.<֭[Gkk+|[FJJʧ>777s!^}Uf7q:ꫳLk׮JMM (JlSO=(ǏoALLpó>8Aqbcc `0HHH`ddQ~?999qFf=hDJJ 񤦦?+`Z*E qbb"&zExTl2##~zN.w)++cݺutwwO? ' ڵkd|[ߢOQQJׯ )))HB `jj@ fM 3bz ?I.hDP>_?fOBB \vgϊ`>dL&Ctl6c6abb>@bb"2LXh4Jbb"=:$'2h4J\\FV+)m.Fir B!JKKIOOʕ+nQVVFOOoΦz:::?>7oZB7o& (}r)8v?glaȑ#d2bcc9thɹse+\xׯ311ANNwcϞ=X1?e˖-a?hd߾}\r4ϸnxDZl8pEYYIII>|aj5b@8A^j===;[e˖1::ʻヒ^G_.J"11ZJ"##C.]{r-|>z^'''#%%Vy穫ƍ,Yd7\zP(D$aժUGEnn.$%%W\AK/000 \ [;w7nUVq5ӱZjV\S&aZysVKFF& @zz:f}zĿQVVӧjdeeP(G eoSRRBFF)))bL\NZZK.exx>{BZ&++ LFjj* t:IOO'11 Q^lk׮󤧧/sdffj*nݺEYYz^\ˍF#pyhnnvEww7SSS<hطoh$[&T^z%N>MWW-"--[nw֫˗3>>ξ}tG.]˗Q*xbL&,Xs%Ѐ^8hnnҥKAlق墽=Ѵv$ Xz5Ǐ|In7Rll۶ Jʕ+ZF233$%%lk'2*d>Y'jR띕MDkZ @@ VET #h@^/pGS Bd$pG.ӰX,t:z=>OT zARr9111bh4* d2:N #h^t:HdFKV.GD$ STb(!P pM$·PbbbfUhCB`tt'd2Q$OTjZfBr|ց j1^8lB[⽿L(ӧw߉.B#hg@`ˆvz$%%sLX#a~_CJ%sR) Bq.]o! RIvv τ! MV&pgwrCe\ ߵ2>O0/~>3zgN^Y_}f)j~ B`g e[,VX3HHHHHHH|G>55f{Q h4~nYSRh\LDV?P  ?l ' hÁdsO!o`[A=bF˘wrLHٗGBBBBBbdkF4Ba!*Sz S?2ނ78x<_h<p9@ s/Ődn|>W>n%$$$$$$$$gU׶W|T*GʹQJU"?y )!!!!!!!!ǒ |m v#Nn r NZ&ch4pv1L B\.1OxDD"\.BX׋`0eD"}9qݢGt:T*1xrxxz׋d2!ɰf`0<dd  #0 6BFJ%C %@&a4 b:9Z-QڵkfĀe_-~_ &-F~aNa8 H13 A  HNNg,X.oΥK|dffm6Ν;Ǎ7X`G̙3Mll,|SZZBs'N㌌`͚5s-f3ppq, -"ʺu(++d2QXXʕ+9|0 ,l6=$dggc4<p85kְrJXb}}}XV{|r6nHZZ7ogAшdŋTWWsMΟ?/ GIMMW={(߿DN'h4JVVC3tĚ5kMKK w9˹|Is=GJJ 'Nॗ^b͚5bz|mtĭ[xy&JӧOMWW555QWWᠰpVz3gpZ[[INN  9qccc?gu2S@ommD nr(--Jqq%&&vq\,_\륶WMoo/FPQ^^N\\b ɑ,&$$$$$$$$B>2V;}t233dggs166;C8&66Z͛' h 233$ wfP(GAA& /pdIMM%)) F#WCC .D"LMMϒ\.6W^ebb))**.8N*c4$##UVyf?@\\'O|_%& IGG6md2rFۦ,)((FFFF\lذaNI\NN٨j.^HSS/t:g{ܾ}ŋ3::B_|yuurnJgg'( (Ǐ>`q]~ B!] B [HK$i8v fy} >`0ȷ-d2KwmZ[[5kְf, NwZ- hkkZl6axxMyy9n)))!&& ~f3V(DL&fYLI&(P*~Q:..^Omm-mmmzM\P(7o?B %KP^^NOO:#@/^gaѢET*vh{D3>>brZ=`2FK/ɓ'Yn|r^yؾ};2 ZJbլ\I1՗]71,_SN <'?app:a=> C{{;\vM/w!==M6ONN2555M!!!!!!!!!qj~N>0fZx<,\)Μ9Caa!6m˗/Bʕ+Yz5jrVX UUU,[UV`>88ȁDRQQkSoBmۘfxx$BvbxxX hw!FGGϧ:駟fʕr6l؀g\z'xG}D(bhh\"nˑ<DQvMcc# .dѢE8qJt:O?4J+WOl֯_ϢE' vZQHT*abdV+(JV^ŋvSSSlذ… | T*gŊ266ƺub||97q?w ~wppK.ƍZOT*u555t:^}UL&W\-~PgϒLcc# Df lA.\@4e,XJϟʕ+`ppytR1.ݍ"++6^z%Z-vVKFF&:f!1}rr8VZEww7EEEFRRRXlccc(JăL&999K"/_Nyy9˖-l6kBss3D", ˗/G&q)bccٲe=&U_]fZEL&b(--Ib@ B< T*gRT4G& 4&JJJ" ddϔbCpX.U(aᰨm BbTeR)hF"@@aRFd23L݅lH$2n/A>;E/\w epݴ0884\.'QP}*Q̶yx<n7fY,K$Ӣ=ٶ`};hll G-ݯ’ 2::JjjOsׯ_g)A1͛7E~||J?f a3!v0ڻ}2-^H IB tfQk?2OW޹~c7P{ B&eN^|EтAH$ngrrLR$w T3p1y!ד{4SSS9C+L& >. J%m) ,1 ILL̜iiF}w7 bV'o<݁X.h܄j ǃ2 V^kd2:Mv?1E4%..nδHH$BRRҜn|>/!!!!!!! Tן*n, a?,z _u=90W) $7 ? ŗ# x^v;t:(6@ @RR χj%..NG0djj NGll,ozR)lh{|N'Nd" bZaV+PH t:x<NjH$f͍- `Ʉdfz' pdB&1==M0$11Qkr0⽜N'r@ll,NMbb"r 1Z|| a(++{6 |EjT*IHH@.}'(Yd2X,Nl\BJJ bB?<ɿF⺓x.r8?f?3h^L[[vl{=`:t1U||<7o&{n֮]+ 3Ӭ[o?Sf;|<77o[Ŕa李7oRVVկ~Ezz:4GJJJZ˿ J`466Bii)ZV,O[[7-[Jĉ466rUJKKZܹsF^{[n&77{rgyNszzzؼy3/'O$ŸٟaXn7O<]]]bm6NjXLFnn.FF311!ZLOOSWW'^˚5k;N?(D#`{E$%Q˖,YN2qflLݝݻswg7f23(qݖջDQNd]v9:)>Ι3g%uVv;fvŶm;6mDKK 111|;ʾ}xauuZ~gDEEaINNfyy z=sssDEEo"1"& FCtt4jZ\y:::X,\xFCff Tu#J(Omh4"X… ܹSpӗdµϜ9CZZzIff&7q8?~׋RҥK Μ9CFFIIIn[^^D"ȠTH6>>nj & b9rT*o388baee7oR^^SO=%XE"7%==RիWIMMe˖-J%6W^yL&MMMdffFii)׮]Evq$%%F0u-..rI477o>^yF#՘fR)9rDsz*"u+ǎC&v)..&;;~[Pp8HJJ">>GFFٳ\nH$$''Bss3F^7!B"D!ć `PȮ C*RTTDqq1)f3;v4 ,,,088ȍ7hjjprx<8λ^7 7˜;wG ܲ z<n7?~HġC d2ECCMMMpk166c=L&h4 444eÆ b0XZZP(TTTT*LMM122%11۷okEGGjFӡRBABrŠhP*ܸq~t:vrRP(s{=11s=ǦM(//g||JşٟzvΝ;A&aR)===DZz 333nfggq\FP(DVVǎcdd3gΰsN._dG}T^}U,pD"!::Jݻٶm333lBIXn_WA,ŋy%)) B!B!BN0DVT*ٱcǗVq/IJJbhh!^n7SSS9sX^zE!B"D1\r$$5r v;/_ݻwA[[EEEYv;*@ IJJ N P*K[v;9]mڵkyf._4TVV 1*8YYY!##~{1j56M@BBºR`2 #OlAOIIQ{1d|ߤxN>NRf3^Wߘ{ݤ"D!BO.Z,vSVV&X\߉D" "H ÖYX,| H$(TD"PJ*p:$$$ qufJ` O8Rڀ` _4{[[~?[~1kdmU*GJSS8N~p[c}yt:q8$&&_X,G  /b4ϣB$''#y+Hw?iiiBD"* w\ۆd2*JKKﺠ܍=b0g"Y<ڱ/ mM!B"DdzzZ0BߎfC&wM:BZ 5w,,Dv!nZ!ly֞va~}p9>kk7&K$ 1999u1cx|`r }:ַG?~ΰzo !;;Jg% zDk<ܮԹ]a0ڵޟ"D!B_fHnAX,XVRSSH$zQ՟"ÁT*E.m6"ݎL&,a!5l*Y͓r͆JB*޳lܡ0X;vZEزq_"JˊH$Ϟ"D!B؈D"P(΂N"ZO#f *} k] BuqB!I[III<_OGXv?!B"DCHq+_I?d' lH8&|]#w;E?an_1:Yo"D!B:s3}nb鈉! !%%(&bbbx<F-..jJ,,,INN^Wg=d2ReXVV+Zxc~Ʉ%99BjeuuU('\lx^tfk ,,,H$baa׋^GRa6YYY!66Nbaii XLll, ,--aHIIA"077%** ^Gbjje*++?r~N'E T*%99D"ybb"*y\.RDJ%FHDrr2n@(BT }uv>VWWzt:0HIIYaلz׋h󑐐@\\[$,,, Q*$''(6mqqqwu8={(bbbwnc4 B R[[֭[X#}>(Jz^IIIwu B;!> )))QWWGeeq^PEJ իXVj5;v@^9|>t233gqq[޳ncf4OII 6mR={RB`޽8n h'łn'>>FC(b^gqqJUU"D!ב-?? )++7x~tvvAQQo455B||X,FVs8u6l෿-eeevZZZxwX^^ ɄnGP ūH$&ʨ#;;HBnc2B( N<{g$%%V2FQ@ lF" 8q/^^$C@y&ou%ֳta,++ܹsT*t: \z V\T* ϑh_zd( whz{{G<*TfGZZtuu111Att4bPRRrdzoruHOOhs6nȯkYYY~ƍYXX蠾^x?fgg#׍0DPp }n7ziA$vyֽ/~:NxU!B"|$e>Ԃi&FFFz-a7/U="--:x<<3e-9rW~55Y{tt4sss<򗿤Rzzz0LTTT ꢫ \N[[":tO&z*jjjp ٷo@Gb41scӧo{/%Y,300oIVVܼyo|266SXX< l'N`~~<+Wxٰaǎc?ٴi .`2(--e֭HR***jOLLrx'0 twww] 2t☜wJ)~?uuuLMM!7ASS_+:;;v%%%(O; ߇B!]C=Bweǎ^Z'|l6 QXXȣ>͛y嗅9~U joۼ,//B`jj, Ν#66Z9tHJJ H$:;;ٱcSSSPZZJ]]6l`֭?pB[[?G.]͛7_g|z\.,..㏳k.~ӟRSSdŋ,,,PVVƖ-[xWJm0p\'`02_ atLNN!T!yyꩧ'?h4 cV^' 233CYYٽ~\#D!B/5J$u 6{KKKj DEEQXX믿N{{;˜={F^n s+bd2٧)Jn޼L&֞7** Ù3gؿL* 9u)))ƲJVVO?4RǏvH$9s2[ѩSHOO'66ܪM]]]MAA`hJKKZGGGq:Jll,jL&'y@ ;vBx'jp8hhhz`0BRo|,dܸqjjjسg.\ R5 xf%h&%%*.]ĕ+WX,Bٹs=mv[KBaS."ΝCp8hmmrw^C?yyyٳ*}R)2zl6[ZoNVV6lH$A^ZZJTTԺ5DŸٟw^***ؾ};$&&}LZ[[j$&&255E?ȑ#o)))G?6d2Νlfff" o jW"D· >Uv;~*~T*a6fqqL~atcv'j5۷okF@ fpt:?qΜ9ŋyᇉ& n/~ صk`){3 B[[ntp\8^z%yH$b4q: nxLnrr2.)DrRSSχ^d21::ʶmhs8ZVT*jrV0DVcX0nܸqQzvMyy9ǎ ygټy3LMMR/~.|޽۷T*F*ՅL&sqllL:fggYZZh4b2>6B!8z(Ӝ={۷sU, :t^uce2qqqh4ώ;7TG"`x47oNCPpU~?7(,,quؾ};]]]S^^ΡCظq#;v ..m۶q㆐ԧu1sss?ՊH$#[ñӧOp8!))@ ᅬf\o޼)K^^---`ZСCl۶vލĉC,FFF⡇b˖-pIپ};\z7n̡CDLNNgj5zH{{;?  7nem x]nJ?XV݋X,DhD"ƍg~~{2?? z/|®Aonnfhhݎd֭B@QQ;wdyyۑJLOOSWWG\\?8*JKK ill$))t:D"L&Ns] gIrh4E"sNrssqTWWs5\'jX,&++ BA0~|>wf||@FFjNtݎN*(4z=8NR)zP(DkkrV+.Ç a8 %%%GNNPFAA Ctt4bXxSSSٿ?!INN&** %&&|111b28u^GRTT8t:6o,(شiWCPp{uBcc#;w^{2!\ZZ---XVqaƍ J%6mB$aHKK#..a6nHRR!mh4_2q8LOOÇUTL&լۋRd˖-dffԄ'//;w244>(bgϲeR)QQQsUbccyGr >\ e! hjj{pуb٨R,f3XZZBPZZhx<{1T*&4YYY҂dѣrh_"DO.Z!\GvSVVvu[$ CЇn~Ӊ$!!a_vv[ D"Ѻ_{޵AA}vߘfT*]CnfqMB?Xg {X[=|_kGoшNu煌kӧOPىbA$Dyyj~p8p\q wfyy^Koq"~|G׶aeeEp|>r3Ӊ#ch48^}v"D!B"wM d2LN['5IZW?ۿ??^+,`~o~=X;}}v>7"**D(--CqQnn|Q Vz=C|Iºrdu'|q>$''QץOc¹>Dp߄O;?OgJJ缛bh9tg5v"D!½d{p9/>+ԣ`ۉB.m^vdO{b1"h]Wb|VWWQT2 JLL(D.. :_[[8q=o#D!B"|9D,--P(>=l"NÙkN'J@7(FX$J"::awϰNH$dۦy2v|F!B"DWc WH?d_P ]k:~Ve'ܾϻytkk?3B"D!'}h&''R0`YL&111H$VVV@*T*q: na7Yzjj шBڬr\B?l2 @@(^iL&JL"sss( zAPe PH:?77'ZjJ%PH(&ˑdFF  `2AR21q gq &''X ^;uXn311f#&&X,yX,$h4ØL&v;ZX,dqYv }^8n=svpfq0l6~#{nXV&''d(uA&''l6#˱lB9ɅVVVøy&ׯ_gll JEll]h9wg4#::# ݎ([U+c  jRGEEP(xwP;|&3555(J顾 6Ioo/.]"==LGG>Ty$77{y_NvvPs7,/--a6q8B6rn%a |H$XZZ" a2X^^FVϯk QT,,,`ZY|Z:h4}Yf3K? r5zzzpMZZZ8{,wQQQ_*= 5ץR)N\cuuU(V233ARp90 BjÁbnR!raXX,B٧<t:cnnNhfffӉX,ޣYD"P[yffߏRj$WEpY+bXp8D" . H믿YYYvVЇ/r|Z<쳌Fii)B2~.xW 0;;˦Mhooz}r0 b >9VVV555j"..!vMLL dddp%vAII $&&dիB!ʐH$E~~>ɔSQQŋ)//sUppINNfddnjjj^>D?'==!v(zwƸ~:`4 !xט'##gD"hmmj {^._LNN\ra,PdĶmp:B߮.COO[neƍ0::C=ĉ'8|0ɜ>}cǎQ]]"III|itFC__/2. \.YWW 444011A  77WV~z-z{{ikk#&&w}FFFp:LOOG^^===ߏ륻wyNGZZWvE^^tvvEnn.OhjjBŋHGGn^Oww7LNNJzz:'OdhhVx饗gddANN=ZwϟGR[[K__ϟgiiY zg}FGGJy&&&aiT*jkkҥKqF233ڵkfώ;p\DEEsN蠾B._L]]vsΑhdddIL&܌d"==zRSS#..W_}>@TrMe^6.6mZzE?2'Nd2q R)K/<}}}Bn=mmmB ^JBBΝ{qqq466b0(**Ür9 b466~%~mFUUɟ [n󑗗)..F,s*++ ny2ׅ7ݻ'rrr4)--e׮]hhh`BxNkfdd6x oQQQAYY{ERq}O#D"ƍB^y:::0|{c˖-rp1118gYg`D<@II Z??AQ]]!77{RUU>Ȏ;hhh 77]v뿰ZqA?NBB999~h4>&&F+++T*!`eeXZBhnj`0(xrr9¿j56 χFAzZ!B"DPvjPZZ}GLL TTT`Xfqq,8@YY\VennyBzu~?&w}k׮qAd2@ X,Rƍ͓jl6cŌAOOtc0سg $ ccctvvݍd`0mK7iR]]MTTF F6+Ja'J  5.fcjjtp^GѰa;v݋{{{ygٴi͡T*y'x<;-[cj5555H$:;;Q*u.bf3˜}^B!xGXXXl۶ׯcZ)--ebXc z88;r$ ~TdZ-7nGA*}h\v \s)LNN211ALL ;v젦s 9Z-$''sQ6l@||<<lڴ ccc{|X,IHR!dn)-P`dd)bcc0iii,..ҒT]] Ess3;wn |x^***X\\zDJb||yn7`P(fjj T*T*4Rf3nӧOIHHrG__BΓZNްQQQbH.lq8 sp(Oc :;;d2rtIVVyyyՅ\.a ʐd477Onn.tuu ^ LMMՅ`Æ x<^OKK ~& "D!WuqÁNCPp BX,jjj7ƪ*8@UU۷o'11m۶P(x"###۷rD":wq\b?F<-HvG \p#vww 1L(v,<֭[IHH`׮]~Ν;FP__J$ ￟-[Ͼ}D\x!Kqq1455}Jk.T*zezzz8tUUUD"!q(u1n\Vybb"` 4 [lall1ٷo >)!n?y`ۉaqq:d2{!33z*++͛LOOyfJKKʼnR$%%aE.RD*RVV(~={055` ==VKBBIII+랖ǃ"--raB!bcc<333RRRBuu0Fqqq "==t:z>|VOZIIIA ቉ڵB#<<<# xNN|;v Ba۶mL\\)))̐CNNnl6ٸq#477c0! /ăF|A1LB1--/288Ⱦ}زe nr9ddd֊ضm 裏"ɸ|26mn !hYYn>f`0E4 2LȅRZZO=IRUUEss32ÇSSS>|2BMMMl߾-[멯'))CKKK=zbv;.JwFT'mL&' >>k"D!B{Ox݂nXZVgq^Wp4nUOK2 L{-lXp><(޳RrpK_]]%&&cw;Dg`X;_WsF,Jp<>H$cSU+"D!B?D"KKKBip/Z@w88N?(d#lVTDGGA;➔S$S`v7_- 4ַ"D!B_Fh~ɾ4U/ܫ |ᐡ߷eaE!B"|$⾴RJE `||94PhhhDBtt4 vjD"cccd2L쬐Xp044 e2sssjy^/Z((J q{|T*155E(BV V122"XGFFA.P(hk4fff`0evvv=fcA366{<,˗&,+++ aZjH$a% r!YXX@P Jb*===ͱNC, Y;h;㳶§HFYyxH,ׯ_@ngiiIв^~}?.n[Ȋ{|2ͼ8N>ŋIII!v7n`dd&6nHkk+Ǐ'%%,oocǏ6p +W011˗)//_'߸qf֭DGG׮]FFFpBӧOLRRկ0tuus=*W\!33NN@_XXh4bLOORWTPh4H(bnnNh_aqq{"^fj~:ccc[ok..\@ZZ>:x<HRr9=rӉbzz1/~  ѤaۙU_djj۷344/~ 4 111$''cZƍBtZ֭[X,4oXYY2^}U'55Ux K.ZfttǃF399"~K.i&V? )) /_&++e/~<+++8NFGG줪 %?ͅ HHHtsp8G&qUV+tuuQQQ!(?Ohjj^yWb~~7nP\\3<éS8popKozz*pk}ԩS$$$T*y7fjjFoΝ;yɓh48u@@(ݩV ,..2??n3==Mtt4RYF#»kjjWRRRRn9<\.Ǐgjj7o!** ͆e``Ǐ#)..KH"DI5mڴ룴M6_68?~FSS_%ouuudddBYYW{Urss?2ˣ>ʥK>qgb= _ LYYǎ1?3^￟^ P9 ˑH$nd2<8oU,±111ۋl&***Ƙ#PUUEII ݻ233wcvvHD~~>333xZ[[%99N:c=9.]DLL ?grrt\.sUj5j|~_o~`0͛7!::}ßO}}=#caa.( f3&T<+++l6&&&l6\neP~:---b, DA&vRG}|>Lkk+`ezrVVV8~8twwSTTh$**h4477V婧?@cc#_>---ʢ D< VVVxGfhhl B\z%l˗_&99aD"uuuI6l؀f# XO>-xO,//s~QXX9uZ|IpK P(Ncqq&''ʢ J~3nܸVeiiZ.k׮qanJ[[o&X,'__#\aijj" ,//s%~RTTddd077^'M~~>gΜAѠhعs':IIIzyWZ>|A[[ddd__/ގvC=Į]䌈!B_8ןl9lxױ8N LZfƍ˴r8y$* \j RRRX,gK$q9bccgXVN8#<"m{G||u@ZZG!;;ELL d۶mx^` ˅RD.vڊ8 T*9vdddo} k{{;555<T*^/III<$%% Ԗd˖- Ծ>axJǑ#G| Ax((( !!A?.dK9lB!RdvvDz!6mDEEwnͻP(ľ}xGd<ABTb2Ap;ꊇ+J|A*++v#_h2?R){'drrIee%]v ~8婧"77">(/_j"bxϧBH$B!xؾ}; sA ٸq#{존CQRR¶mؼy3 `6y'?#9<]]]<|6x^AyaN`іJE|AXZZz BB(#oR8v444e|%;;yjkkQ砨T~FPPVVDD!B{ÇJaVɄ //j LSS رr$::Zp\[[[׵x^l6ƽkܸq;v6=sssyM&?O@ &yl6Z lb+X,tƍ  377Gll,sss388hdtt4E7B[kkkٴiƨ# 桇\ Jd2V"  FBBSSScD@vv6^W^\\$==X*++9z=.3 M2 (CjHRP\\|D.  AK*騯|G B`0hkd2^W-1!!Y a ;`l6cZt:|> kZ(cǎ $JJJظq#R7n000@^^p^^8X,Tfrr ejj &Xt^"\C300@__355ECC}}} 1LMMvIKKٳ r6nȶmۨvǑJ18uSVVFEE[lnի088Huu5>tJKKz**Μ9 'Oh0ܼySx ̤NIKff&'Odxxf[kOu;,)) P*,Z&==xlܸS]]D"a~~8|0rHEEźXp z(b``D&''t*~_ Ǡ"233 jFѰ` 33 Z-hZr9YYYB!HIIapp@ @~~>QQQw 7 h9HII!##>W1@dDdeeOrr2 #HII!''L&$KIIAբP(سg6MiiihAYAWWLOOg***XZZ"55UP Ntt4J| LJJJl~rQRRBbb"7n`nnCaj5t:q455!PB?0H$INNF#r111All,zl6G%77a߾}Qff&&Ixu:FRR"??~fgg"!!Ca2h4dzyf^/QQQAYY0a/z=B8QBBp8x衇xdB^^j\vލ`AصkVUUQPP@ww1 deeQTTH$-[Dww7P-[Ra˖- "//Og!F,D||<2;wb41 ‰"J7 bܧ!B"Dt8 :#苎/v88Ouuq_\\DRrqD=\#|D\#D!B~x^!G;{|{yL>e"ŽrM^Z |s2>YӞe}ƿkJ$޳v4爌c|CL&BVdrrXd2 tww#Hayy.N'Ķ3<<#>>Xfݍ~Tf3K\\vnn7:E?BMة),pKGtt4>60<<АPu-^4 `>DžHze||ngpp  :v-C`qFGGIKKrXXXsY=Yxqq8R) {zzdffRT*YYYE(D"Mtel6_H[v;i]FAAֆϊ:D,.]nd2D\z}?.NNl6w4L&opݴ 'ODVsF#\ BLLLՅh$..N&ϓNWWxu׮h4CGG`V餥QBкjϟ󱸸kFRRҺwE(brrAJ^v &ʋ/kcnnTnjrh… ܑ-\T/$"X]]w!//SCݎjE0jkz||' ܼyLv;2;;Koo/N餧x< 0>>B ::Z(P(@@^  %:;; {G\\>!aj)HJJr-p6(&&&CTTBՄ^/]]],--B{iG!&-$VWW?ݘf -Bccc Z,zzz5) >Ǻ10NC$1<<8|>ZZZg~~^2440DEE1}T*EV366FWW&IxVCcxoHwwP0B_ $ ü|>6lk׸tV~233yg֒o[illDmoF(ϒ$ȁ`7ߤN Rׯc49> gϞ%%%@ ,ϟ_׬Jzz:/~k׮FYYfggZ~FGGwXNctty\.2iF#` jϓ+j$>{FZ-Ǐ'**sQ\\FwB^FGGZ /\CZ'fhllJ}ˬR[[4 K/ 4 i Dpj5A%9 dyy8VWW{yX,dddܱ|Y+_v s4f7|!233[Fz711111BpDLL Rӫ( d2~ǃbڵkLNNR\\[oΝ;pny衇팎 /ٌV%==](622Boo/?~NV%%%(HRo۷ogpp_W%L&###466 }jٺu+F a^+~(++_`0@RRsŋtuuq}vaaa:477' `bbID"B#HJJbzz DLMM177A ֍H$d2q%4 ^ Ay2330 233,q|>bvv9~ A rd2fffGT8s 555L&R)j (@!H333,,,Rd\za\j X*N?|"yT*sssbNNj,.. YCCCbfttXZc\~?rQT{`6ihh`nn˗/SSS0QTZ->,HRfvvSNMKK 7odttUZvū$b,N aΟ?OVV{巿-*%״r? xq5NRIrr`]+šVb‚\.2TTTbRYYN]vQ\\4zlfffhnnF.SRR" WTEyy9999\~jA3955ESSr 6H$< bb׮]CGG49wR)~q5b1BE"7odppyԩS‹#;; !!R0==="innnZ[[1 LNN 5H )))TWWcZ1EQQSSSرRbbbÜ>}xΞ=c=FII P]] U*Acc#_n69u B?%&&Kww7tvv Y.^͛E]]zgZa_ɄB6jeee~hll$ 2==+"XHJ%_/ k&YZZbbb+BNNٳdee ùs瘝ettłf4\ 000@||sssdgg̟ގᠢ^#DZI?{nFGGyx<|>HR4 ۷o祗^ˉ'" a0_;v^\NK?KKKJtt4III_;wߦw]amsNN?***xiooGPOSQQALL lڴ~L&"i D׿fqqχX,F&P(|5$77WX+ß>::eFFFhiia;v2ٵk|>()){yxGj q)))!55P(Dvv6O=BHΡCسgڵ L# k.9V&*.ZZZłQpS,J$Ҹt^rj299ɹs8r6b1v9!_A,X,f֭K,f1::ʝ;wJ Aib-27??O<K`0(;#==}vZ!,eee\~m۶1::B`qqdAl6BWnn.TWWP(匿X,&A755 2 /_fllBn߾Myy9i?NNW\۫t233ldgg~FCss3whjjbyy9'33S l6cٰZ:tB6oLjjR622"\q0GٳlذH$"y&&&X\\D"!;;H$t:X,{PB&33Yz777 P\nݺ%hHRb`2(--ennp8Jb~~r*++^.]DRRHt:jXVill)\9 ;vf RbΞ=+THܽ{LV4T*v\NNNRXXH}}=wftt9^/--- n-X L&q}Xnsк044n' rM~_vZjYXX`lle~322Bee%`',,,INN.,&A||\(ӯ˗/1 BTyy9*uvl672==MFF.W2??Onn.EEE466r 233h4n*QTTjeOCxhd2 afeYaٲe uuuQ[[K^^7oFRz--q_XXJERRc ۋߏBp`6Kj5CBv֭[%''[illdyyW_}U(W*,--`ܰay8@AAfv!lڴ J%Is!, tJKKǓ撜LFFPCZZ֭p055f߾}F1x^J%TVVFYZZbx^AA"WO{K b6mB"ƍY~=+++hZ֬YT*eaav8x %W%zelv,x<(J~p8D{B f!&--RSS QPP@vvPHII!++ B5kz^cyf6nH4e~~jAlD?W-TMwL&UT*h8JjP(`0֭[ LNNb2BcZIII 6a֬YZ&77A233ٻw/ڵkzR$77B!⦤PXXHRR+++ mA]]]g򘞞ڣinnfiiRQQ``hhJee%@.jP6~]VVV8tjv;yyyTVVb0/1 f䐝Mww7]#??RتOh*t:l"l6"-- ƦMBLLLpjB_f\.l'd2CJJ RT(Slddd`X0h4HJJb BFIvv}TmFZZk׮h4J(2xXYYl6SVV0HV+###dddPYY^rrr0P[[Kuu5SSSٵk*,t:t:dXVD"۷"֭['\*d2y˅NCTBrr0wE₂G&a6OR.q:B/QB|WmAw8jA1a\.Ν;,Vg僞(~^x\Xy>G^޽{ȗGAytvv-Dݻ<|0lݺh4*,f|vp;~dq@_WꫫڮDDDD$*y< FqU%ecPJ,HE/噙(D"_{[TR[[K<j~cW5Oe?}<D9:D2 ̳""l6 q8p\.%_)q&J܁^ǟYE,q *H|P+y2ֿܫ{n$lDD%1F¦IDDDDDDDD~>33Ccc#r\noogppRdrrR]8z#H477RPЀ&##CLr؈###t B 鬬<44D[[B6:,߼y>b:._Ķw`0hiifSRR룭`0dw244D("##>:::HIIAV3>>Nss`v`xx!|NNN yܫ>??ݻwd2!吝 TZNFFFP$%%8Nnܸ sssX,d2~oqXg2VχVJc$''۷ ܹsJEoo 8v]p?hmm%''GT}Uq_YY젒H$͡>wx<.Xa=iUGVHR=9Deǹ.[na0p8iee>{_#"""""""$* v;.pj.^͛7 /~ R)/_&//wyX,Ɲ;wPl6k +X ZMvv V8}4ٳN½6kwp9L&JO>fv]]],,,p%jkkwb~W^'? ֭rqa IKK#))f^/OJpwG]] 155ř3gذaSSS8>cAtrEVVVHII&s-l6o&\t|zqpG"`4vχRdhhI8LLL`4ioo_'77z{{+/z';;;G_ӧ)//vy)..͛2>>,yyy244˗ٿ?r|U>;;KOOMMMz X6k+++  0ccc ~x<\.ת LMMrG²L?k׮8r92'DQIJJ"-- N__ra4#G8|0999DQd2  Rv:rHKKcbbnnIVVVH$'?!cp:INN&''0s.><<,&< fߑ9"X222T*ի"dz:""""""""O' ZvZv!`R\\̾}{.oFVB҂ 7"Jioo ۍx`lnn.R, ?^{T~?VC *;v OvQ֯_O<GT"ra0?pAU=Ì~zbF!B$''SVV (JJJJؽ{7ݻN㡣H$/L0eո#?ihhwޡcǎKCC|  >|B@ 8s ׮]cǎ=y_GRDT *͛7f)//gxx-[P]]͵k0 t:ٳH$\.x v;|1~ӟt:ɓ\.XZZ .vrrcǎ8~= q8={x7 qex }a6\hiiȑ#\.\.|ijjȑ#pYA1sΝ;󱸸nɓܽ{y__؃~ok݌qa"X LD"A*b0عs'hkk#rq$ ~I<GByI ?~l6nĉ|q;Frr2^ }v9pa+B!;Z099 @AAW233q\t:~}v\.r $%% Y}٧D+ڵk)..W^aii@ @OO6l^`0Da$''t:ztvvb0(++^/hT֞'v;q,//$( \~ z=ʕ+?h4D"tÖ-[I$ ?EgM<]vaٴih4$#@et:ݪ^Dz~~>?%<CCC|>rssټy3h4Jww7EEE!^9ah4277ם //h4***fyyr6mĶm(((`F|?d׮]bX?cd2v8@JJ ~|5kPUU%/hIFFcccH$2228{,֭xD]__͛H$288ӧIJJ"//rrrˣz՘8RLT*E.#H .Moo/nt"Hdd2q\BfO.r Hee%| ,zee`t:룮tct:vލT*ݻdddכIOO'N&&&exx9ZDž똗GGGmmm84 === Wmj 188(T ^L>IDAT6ryX:r2::ʭ[(..FT ׇ% v2 N'̽wP(Dvv6>B"\|Nl& H>uB!\;@q===ffggv+++U>ARTTbadffrUp^aKPP[[隣Rn޼ɾ}hkkbP(F$''p8#77fۙD"燈gxhh4F#nF#/2f FGGٵkeeeLLL0>>ٸq#P\\,hn |V$t2<<,\=սӤvX,H$z{{IKKD Onn.###D" YYYRSSCaa4wuuxWj,--hzdee 7n"zy饗n311멫#!JY~=J T* ddd044/ƭT*h4deejX,L&t:yyyf֮]+d;n7/"Jzz:@ZMMM r<vp333gHL&# Jٰa* ֭[Yv-`4ʐJ,--Oqq1/III,//SSSJ/у0LLMMQXXHEE@d"2 R%33+NrF $;;z5h4j*8deeCZZVшL&CV sfLUUdee199f#77kעP(_$''Nf#99Ͷ/ʽ=B/2Smm-^lzY,z=LNNNjj*2<9ZHld2=#"""""""Txt~A xt'|<g>;;}gffrqe|>6lxȃ}EDDDDDDD} IxP(UIX,&5>+B eD"ٷĹKJJϪT*v@ZZ7\%2O>F! =r.˩"ϟg5oEDDDDDDDDH$UOJ҃(L>R~Y^^q-H|9O `0i z:D"gz<&""""""""A"P*}zJb<|U%:o[{wQJܿ<xրj n|f\.ׯ_}>wܡZMjj*444,͛t: .]z=ʹܧHIKK#qP(ICC+++C}}====233蠩RRRb1L&pr0<<||M^n޼8iii( :;;{.ح[hnnVL&͛aXX\\ҥKtww355Evv62LPqJ̙3nl63kBRF VYYY~nݺF>ߏFaqqrX6sW\˅j*cǎ O*E !JWI|XׯT*!%%>st:#"""""""?4@?$S]]͹shnnF*@vv6/\xlyRRRhllD.ͭ["x.]g?ׯvs1֮]l|#'NTxΜ9~3LNNӧٸq#ӧ1͂׵k$''{jvl6srss1 333B!HIIMHkk+###nT*nc2hoo_'++h4>v?W0C[r ***Lc())ڵk,,,0;;8x^ǹ~:'))iU>>>N{{;---QPPLƚ-J]]](JPո\.t`00:: XVŧA֬YC<r0 iڐH$HRo`0HFF`Ogg'r:::v&O80UUU ( #HMMݻw `4q\444v}}}u`֭[illtb2,N'o&تiZӠp82x |>qX~L&j2::Jkk+Ja@|ڏDDDDDDD~1;;+l?;;˵kѣ8|MFGGԩS=>~~oFnsi~ YcGE*_%/"~!.%{=GUUoO,Yv-8pC @"9tiiiDQؽ{7RiN'===RTTDII ---\.B繿hqnܸ?X\\Sa.ׯft:/27oҥKy]\\d``͛7~D4r^{u=qQWW7nd߾} [<AhFfcݺuZLJ|jp8?c2YYY[^O<"YXX //={`49-qYZZbeeTJMM ׇ^W_\P^^x'}'77t:vb͚5b6B2X ֭[illDTRYYjFhgINNfLLL0>>NQQ(ꢤh4JJJ YYY_1***8p(JoK/$с륰X,Rt200@UUF2ݻ?ypU~_"#gFFo>R)dff eK @CCH$Z[[~fff}Sͮ'%%!H())۷o3??OJJ mmm477 WmB0=MM\񸰨;088dbxx&QTCGGp/222¹szR9'r?)))dddP(D"d2al6hlln ( qw3g0>>.A%`20@bᥗ^d2{조yعs'555RUUEyy9`/=9l6lGc񐖖'33S(Fբj(YYYLOOP(HIIfQ]]MUUeeelܸ$v; W^yZM$,B¶lܸR8H|;0;;"7ofӦMb1j5( t|>:dbrre^z%rssW[Tb4ZzV+F4ZTVV YZZvs0 wjj*6lV ;vV}xς{{н^"P( ;v젢P(jTa|| vލL&#PSSJ; уbpPYYIyyOK쯲:!P(0ͤT*eqqlY\\$''UV`0xXv-0??Ovv6yyy`XZdddVA'PSSCYY,,,EAAvy&-- łNf=ǬAh4\.b1  ***HOOrfBn˙aZ¼-++#Vپ};h4*s߿R)\.z=zX,PKVVՔPUUENNz^ׯ'##222Giiidffց""""""" ]t:tD"p|U;oxdtɩSp8K/=dsAbx<ΦMXfs9~Ո>"""""""">Dž$gx<( F ä}Q4}}`P(K~HDB8J-H$BPE(J^xz7'4 X6F^xH$T*~:]]]V{Y233t'N`$%%8s LLLjgWѣGW'>.;wG$!n޼Ivv2@ k&==]xG"Yl60<p8Luu5| h4ldggsy233ywZ466"H?3B!9BEEǏF*@w\ܺu.X'^^T*gϞ%55^OCC---޽%fffD">}7277G}l&??xPSNa6@.S__O,6Ο?ρO;Fii•L&&&&ܽ{d2x۷`qqZMkk+vh4JKK 믿b!55F0LTg> ߏ^wޡǏSYYJB&q ***t@%>Um}6/@Oa6)((x&c|sBrMh4\xx<%99Y+++҂\.'A.c6 RIJJ ( FFFP(\pZF._Lmm-ř3gشioΝ;( V+III444̦M/r v𹂂~_Bzz:YYYL&ضmr%~_RWW\BByX8& }?!:77Gss3JZ}BǍ7HOO' 1==@R؈``ddJnΝ;HRZ-MMMvfff 477T*QRRR8s *`0φ 0Ÿr ]]]b1:::>QT8qF#r[n/g o&N8FTryz=eeeY\\իm6pU/lի}_ss3."""""$@hZ!ba͚5s] &|>555(JZZZ`ll:8d2QTllرW L*e߾}lݺFL&###]vP(XV^z%JJJHJJB&qFʄ1p8ظq#xFR~t:\ꅰ)lLZZ( 4 xtdeeQUU\.g׮]{nt:x\ζm{`ya47drr˗/Gt:9~PЀᗿ%###׿F* ?11ѣGIJJBբ9uLOOsȑg6?5kpA222HJJ"55B8 VKyy\VV%%%pm4 D"۷j%l{%vΜ9Crr2HQZ-xy ϟÇ355EOO1'OdhhDx\Xܹ|2رc\pA_Z4Z[[9s0/ sss,..?\zI@ cŋ sQR)owˉv~ǃF!--.N8A$fvv6B;wdhZd2&@ 4~zR)[nEvFR܌j TjT"sjnn,iiiVfggZ,}Nqt:6m>))) onnWoկtpO>dϻh4x<}~_qڵJoݺٳgH$ Raٿpٺu+PahZrssϧI0$|^ίx<˗q8?`vv`0d̯_Nuu5)))477su`aa!!#x9ETrG.kIdb||^x[Jvv6 ??1q\DQVVVb޽ٳU lڴa())FC,WhHMMjRYYܹ\J%۶m}O JŶmرcjq\d2fff⋔ر^ mlla'%%ꫯyfv;JɄ%BSSuuuzzzzhllj VǽOhll?J(3""""""ONh4瓜Ν;ټy3>|MII & Fff&۷ol~ H#Q*ynf~e<ijj"99ÁJ{{{P(x<𻖖سgB$ׯ_֭[ %,8ܾ}Ξ={HKK\tE7ŋ ۷ouVR)@&FFFhjj"h%2lxN-())2CO* Eww7֭Cד϶m۞ 7L&ͭX,l޼4 G/"Hhll$;;xbeeU{%##>b`۶m W;;;ee\zSNQRRB ҥKnap:qnݺE]]𷡹!ZZZx֭ LFJJ r|]ZZWZAD"Βݻ*((( ##Hvv6֭# Ffڵaٸq* DT*eXVuaZ|\dffrLjEaZKso`KFZZІGaa!4۷o BZZ& D¦M(**ڵkra20̈́aL&R&T/P&]YY)T\.|>{존h4Nc͚5˴Veff+pܹnܸgӦMB%^'`6wʎ.==r(//f!JYsRua63L]R8EEETUUQYYIyy9k׮%33͆c޽s:99\Ln7&Ixƪjعs'*iD"AP^^B@׳~AW oX$99NGee% P(N'NHMM {އ<+>33bJKJ#gϞ*y`)8>H3g?&Q"BPJ$aiieI^ϒ{^Go Bx< FqUUߐϊDf3 lN" H$HoMD"! *} > \~SB/5O>w<'9yfa\rM"8v֭lܸF̟OjR<7י/#򼞏""""""$ pKzEU: `/A7ױDVxwVVV;.ߨ׍{$e+_5P@ Qχԯx<ˏt""""""""""6>88ȉ'ddd̥KhiiT^۹pHgϞe~~,d2~'OFzJQWsZZZHOO_E$  \rAVVx/^HCC4z*NLZ[[9{,w2gΜWD}6W^2::JVV#τŚj}suqΞ=KooPuqpٳgo'Qqhrr pjN:\t o[*++9{,{L4%??+WoPZZ"/^>WgϞTn޼͛^QF#ϟGѐAGG޽ۍ!))>M6vO08{,o6֭ryvINNM8z(B8uo[nd2|8q-[D:u LNN:d2 p%^|E܄wwb2۱,//s-Z-IIID" W^94 ofxxX,FCC===믿.,ܼynҞK9 21zzz0 l޼?|y***hnn9b?^w7@۴cZ)((͛LNN2==N#%%+k"@tttp Cvl6,.. wɓر˅hdzz^J[[F@ `IKKzǩݻ466T* |2X,hkkT^|jerrnfz{{ BӞhBAKK :@ @WW\~a1ƍ"Wfggl d2qu_`PB^^f֭a0X\\ܹshZ[DDDDDDDDr;@h[XXڵk `0KWWF8@zz: H$3:: [nE*zQT1::}g"++ ZM(BǹsJgIMMWΝ;磳f\"̃SNq]Ν;GNNjN'x:_z.=htvvrhhhXf_NZZ2z9y$9y$NY9D".]\.v  o磷syD":u FCff& ~?eFFF!QRR__jCNXhnnFד{5`ΝS^^ζmۄiT8ر48yyyza~~aj5VFooU*OUnz?`rrh4*dv;`4#))P(D$A*"ɸ{.mmmɟɪDRؽ{7UUUVc˖-xާ֏>66j"&&&p0<<ЅHff&VUX|HܳJ׳f^/yf IKKΝT*effT݋dbrrƍeaaaվ(..._ղqFJKKbff-[yfRSS1??A:::X\\(j5֭c͚5x<4 6,RSSټy36l ##cǎR(..~VU`ӦMܼyf6l@OODQR)ֲa1Lz1ݻV,lڴ DZZVՊb.^?0L_K EDDDDDDDz6رXlտ{h>11Ass3!1$%%{nlB 7 >R!SmXصkRR)( 6oL~~}ݰa>|'*Ag?p8,ׯK{{; Ritvvrx),,D*8gΜ… BO__t:q:x<nܸ/2BGĉx<(1Ǐbl۶Mh9uB{KK ===ܾ}y9qQ^^NssLM"0< ê .//9墰P6= ㌎ OMD"TӜ? .mذLz=7n\E̎;PQUU%'qNz=:M6qi֮]\l***`nn*jdeeaqgΜabb^ϭ[h4n9'''G8RTpHS*\|_ZȈP'j1L ݻw~CDDDDDDDX,F0$+U&HNK$@J&''#QZZhʇ׬YRdjj!add1^'''vBk׮vYFtuuLuucY9Qܽ{W(]v-455DlE,CRSS8d2֬Y#􄎍a4D"tww#HD.B @TRSSDQAP(DII B&jR\\L,cddT*~V^/u?^@V(V˅T*%55Z-PDss3SSSx<Y^^LV%770%%% r((( ;;OĄNOOgxxa$ V "''BfggDp8LMM .v$ :ZR)4( zh4 ZB<9aAǙbUvRSS VnpB^' sss沸( B4EVR%;;Q&'')(( 55l6h###b'''%T$rATRYYl6 BnB?zZOR)+++ (//'tuuT*Qdddhg?OL&3Y@*RTTD Gqq\p\TVVV cٰ~B(H$, 3TA&QQQDEDDDDDDDmLMMPիhE(Z ?K*DmAO"t:裏p:lܸ;v<d П&σ1`DŽ;(//&<77ǹsDYYng9<~gv/a8ps}QY  W xO{ފ|}D"H$֭[G8f~~]vP(XYYy6xBz3$J܍F2==r7<"0Ṗ'zRl?'Q筈ׇ@ T ɫ%Vobfysxz_1~]I;|KD"ajj CEEC_C-'pP(eχ_uV~IxG8D"ZyyybH$$''GAcN ]Rw"AL&k׮D333Y[02kۄŞ `$fggxkw׸\. rx<.O+qH*JO|I c" {㌍T*d_q?z~}{}t O;{}Yȳ_W~ssYTu|(>yIo D޿9BH$x^Rw__R2AaJ"|r9 b ȿXLONNfffi֭['III(`Pp(h``zPRR"2t?y8Vn>L8VK|A> cO"(tc^9A|IbXh4JMM F#`]ڊ|1xh4JRRgϞ=OwLƎ;D"DU)|1b7W8^ _Y^^t>s YYY! """""""""""""I;N!V7WD▗Q*}*5ԯwyyyUDDDDDDDDDDDDDFs} AmIAd,"""""""""""""5@ EDDDDDDDDDDDDD$Ԍ-%tEXtdate:create2019-01-17T14:26:41-05:00f%tEXtdate:modify2019-01-17T14:26:41-05:00ÌBIENDB`trace-cmd-v2.9.6/kernel-shark/Documentation/HTML/images/kshark-zoom-in-select.png000066400000000000000000007435171414302661500276440ustar00rootroot00000000000000PNG  IHDR 6wgAMA a cHRMz&u0`:pQ<bKGDtIME IDATxwxǝq{rI0GĤLYq-{{p{߻6gu^dٲr)*bI @9Mgc0MJ@tWWWuuWW͛3$I$I$I0]׉D"~D".tI$I$I$=M4z{fqs,w($I$I$I޿4M#IcgЦqzɞ%F@~rR0 ҚNL/W/L%$InuMPU-u@0`bbl61(|>ert]'NcXQt:j1٭&>}"OE:Xd ]$IM>Fyy9'zhnnzsO@Te$n099ɮ]Yf5. Àq?(̟?t:͡CXv]קx0f]022GXr, a`BFFFbɒńBa.kaEig[o`:v0w\~]@Adtttx"N$I.J1qB02,SSS,\UUQUÇNZ`2f4M/iM"tr:9V $Itַk8qf||6FFF*9LRWWball`0HCC=cc|/~sn7XoJ|v8SYYpxal6$I"`/y˖-chhN's( ---˿+˗/[n!J:LN pPWW Dlׇa|.F_br8u$B(466pa~ӟ/}# 馛uBW$I$"Ds6AUs7T+/!s!^; ҅LLLH$Xa$dłe4S55(sX׬iML%QTܭd %I$t 3V^??0<<~Cl6;6[o$HEEׯgp8/}F~bq:|Osihmm+C166 ?=}}l"tӍx<~Xh!s!r=?3@LgoݻzAV^Mcc#w[oɯ~u'555rl߾~nZFGGgL&ǏgU:u~ϟbϞ)++ܹM+4$I$)ri3 ,\ݎlSNRZZʹs5B!6geN"dר04Pl6=ªUhkÎۉc|>&MISw-ɓ$It17FcA6׶W]u=== kr睿d֭tvv288ā+9H!0u7M^zEO| >ĉ1t]'cNVZ(:lj;%dYRHK]]-sq7an\r*կ yf477|I.\D<\rJEp~˿i:$InKss3_WihhDH3XV]$IN2.׻];Yd)Pв-Jqzf! ɠ(?kZ!lAd21tuA2nw(*㔔H$WLJPT<d,L$Itw&|+_ѣ? +V,xXf5~LuuVJKKXhF}}. ǚ5|di b;wvf3!X,|>TU%LK/|d24M{d2TVVxb**R,+%%% ԀcWYt `PSSC6a|~<aȶmq=H]]=dk#ɰtR '`hh]ٵk]]]̙31v;< Rl6[O$I0rnkySo˅kDZmlv4-{F:w—.]d" qP'͊hbf`ZcZfoXpFYd).x[Oxys~p0,I$I$I$]  1>>3EBuK$I$I$IT=rcI$I$I$Ifs\L-s/Zw]8ݺo.EQ~/ϗ|@$I$I$t/se =gFYY[ u]'b200@iinLՊ Y{{+y6 J0$SWWwt[Zad2|a|Tt}OwǏS]]޼+$I$I$I$I7_(Hgg'HC:fR)ZZZ ꮪ*?8w}7GpJl<裸\.^yX,.~:EQnQ0bҥcf3'O䥗^bܹanηBb=<< ===TVVRRRRk>oa2硇bٲe!tηB&''y衇hjj狀]GwAcc#~У]_$I$I$'B&&&z|k_jr!da^x4McÆ Q֬Yõ^(lٲχa{14Mcڵܹp8̢EG.'ߝ~uu5r ?OX|9266OvUÇswFUU\.?gi7o殻b||'O255@ii)/n`޽s=lj'믧~a.\Xh/xxg(++cʕ\~;v ܹs1`ٰlXV\.{ejjO|l߾_~.nV8z(2::J?ͣ(pw_!FFFxhkkɓ޽UU4.V\IKK 7o~ǯ H$I$I$IYt0;w.z+ ,fAuD"A2s饗BTUeÆ |trTUEQ, Tt:kp8ai ,_"ZN*rz OEppM7zy}fR)v{!oxłl6J4&>s=wu]|#|t:M*"h" 7DL&VL2O%I$I$Il6ꨨtrpx<~?7x#322n?o`k~Z0~V+~***xYx1 7\ 0p:PUÁeڵ=z{K.f2 O{X,b14^EQFݒ$NjH$xӼt(g{vq28ﭦe !d2ٳŋrdvI$I$I8ddQ??̚$I$I$IfJ&:$I$I$Igr::$I$I$I􁧼$$I$I$I$Izd.I$I$I$IK$I$I$IE@$I$I$It0] 6cK$I$I$I_UJd*:$I$I$Iy#a!DIg|}hYLIss3aoY?(2+iNϯ(>k(N8NO\y*|.E(37M}F@4E34̪yd C!B6 UQ3nHcVXT $I$I^wog>|H$B[[$IX Պ (vg}}҂(J LLLH$0L'B4I&<#8pW_}y188mF `ʕ=z͛7k.7oO=~;- -[o} 6o~,>l6~;Yl& ]ٱcrt:/~#G8uuuu򗿤ݻw3w\}Qvͮ](++# _C|wc߾}߿+VeiLM OM &&X.ź鴠 ùXUarR4- `xXۭ8 S)x3غD}*>j !; )ڥ2[ص믛hh9vL8bԔ{Zf1̤4w=k1# 1Cw1`n(FjyӬZB<ՁW98,(]lbB(m#{`2if,Jé)::UEbjݵ\p4&ڐ VRV7O&L&)AIA&:7fya 5dpƆ Y\ܓyM iش)O 7\,RQXPc4B _B2pʕ٬X;5m,MMM̙3\bxZX,l6?N{{;f)-[Ƨ?ibwygiO<  GII b1^/vUUtǏ*/`ǎLLL|x<`SO=ƍzo Y +WjX,OQCA㳟MaB2)0 n9Ckϧce5XX3l߮ <={Lc⮻,:{u `R q;T|݉ f,\>U0z \vx<ꎤ"-nJ%(Bmq "7@*.;dz^Pj/eY2^ Lӎoc䟒Oד1exx݁|EfaN\2e⥗̟/?_8:xcʕ;$3,Yt|z{5qJy*7ܐQ0rYQxE>A$"8xPE6dY&*:gYR#]яfH&sMGFZZY:!hl?GvSj/eN&S,.vU%_fujZ|-\p%R&/S`^tCʆ+YQ2{Ÿ¢ZeblUW09pY\,XŅWSOy\@jtuXqNRp: >4XFpJOBsNy#*[0h4>AԒ,\ז}kYHlSS QI&S G 'Ås[v#Bܟ!Q0 +W('N Q8|U9{x8w7 FGzʌ՚.7%Tb\|gz6ݞk沤i3w0 .kK.vsW3<<̓O>I(#lW_}01 p8̆ 0TUU1<5,W?_c,>k(/7, :xcovoW Qf &;ftCo2ځdeS&&{w ,\Ί:#4ӁX QzP&D,Q[z8כ +4W 6eYP)MPH6hopR(tfBB PZ{eb=Yp **r7S֬PU8~<KB*J=?vLajJܬmbM`Α#*LӺ\~VxExЙ]qgTrUUԹ$NXY8{F`7i9މkQ`cF8 <VVVdeU]Kd;wbQMl4xX_ cǸzeX*I$I$I|t0Wߝ>韋"JzFg[Yu4~hytx<~Z9,WTFGs*4;/'?;2O+N nqzm"!z.>K w4g8ߘfgh(qxQBZ*ttd TWg,gѡ&̽pU;=iR3f>TÙytrEhM“70tiC~;)>uL$I$IvwEo.5Ϲ>o61%:xl@坭ӿ0 |>9sBp~t֧v,9WJTT+xOseMfْͮS{23s.\{4B䞚zn"xKink˽\˜oxhe}([ bg_K$I$I}όgr0 4M{OZ,~>U?Żay䭤#I$I$ILߴ]B7BO_\딿 }3uqt]/ 8W\_w+@/]gC704ĿXJ%I$I;l-+000pF ~L& &ѣl߾|ylݽ|fXw#jVlS\6w+7hodhwd%zJ-X03Sgc}z 3=YQ Kk:e2>Xwc.0nE,ɼ/122=ñcI^|SSn,/Y>U 'QnTf[Vjllx(&J3LCXlg())9g3]EQXf MMMAn4^{-an&RԬ(^ƹn\veZ Պix<{Z‰ 8i3hsd'}Q %{X'"'FrjxKJn蹧%wtY_ /o)o%HoB.]J}}}FZOOl-\ve r1ZZZHR/LoaF@^zg"̝;[#`ll7( ^ѣG o}vFGGf]@ 痢&QU!grr  k.VZk$I$IRo_p8g}R' ^ljF$)0~iaGYY٬6]$!͞wi{+>tdX,ftuձzjZ[[lM7VwuBJJJ(---ir\.B|>Y(J){q;}:WlBPڳ##`"9GGgL&89qP"Y1s4xFfgx085Hde\쓃 5##a‰0d,]oƜ|o6%+Gmmmy茶Mp\477SQQp`ZihhL&ܹs i~JJJ¶fXd2R),X@}}=Nyy2t{]:~K@fYشi-bΜ9i&''Yp!^p8`ӦMtZLMMQRR7Hmm-MMMꨮZB-pp8XbbB !F\|0S$I$I"q.5f+ߏd O[L&j |s Ls2{4>E]}ppχx5)&ܷyxatLw17vg-c&/Fӽ 6}#߃N.P5$OOSW_.Jnd2I(nu_];<}-ޞY+~L&üy>O`ìVEyrϓ?;{aB:?mOu_!|H/h4*;Г$I$Vkw?:gs귓,\yM&x<2̻t:be;oz78ZM 'Aci#j5q/J>9}8#bg[fMt-fSSS,`8޺|Qd+?[ȯs纩zzfY$I$Igq'@!ȋbՊ%299I&yǙ7Lx<,K3w*vňboiչ?n\Nލ2v87I?< (UqŜ+p]2 l'ux t/;da:|/B`6MdwI$If;go~87lMd/4ֿ{,(4g @ٍ ]ַ?I$I$Izz^~WC-B520~$I$I$$I$I$It8Y$I$I$I$_z:&]J$I$I$IbnV. ( G*I$I$I$Ioq\.0$m~h4J,jΊvu!DI=+^܋u0 |=-a.(|I$Iz3N?o>·g;_oyg;g6cDI$l0~N6{jVw*:c?!H$l6vu]'Gȑ#2::mFOOK.eddロD"Ass3=Iuu5 ~&"?ػw/l&y>3gNagy_tvvR[[K4;d<,]/̽%\BWW?O B,X`0o~^|E"---lٲ￟>Νdz'E%I$EQ|Az);w.?)d9so~^}Ul6555)m·|dѢE<(ʕ+F$ /===$Iuc\z饅պsDXj+ܹK܌ng͚5#̎;xx<)z+GEu$X <Lt:ʕ+׾Ɗ+ؿ?CCC zjٹs'wftttáC OGGGb^˓$Iٳg7o泟,%%%sM"b0_D"Q8ܹ[RVVE>p!x<|_ns RL坞 X|+8N1BTVV/|M!AN'*Ga۶ml۶D"sWrWj6tM TR,o9t>D"c\.H&vɓO>(mmm_v WF4~vꪫ`˖-tMl۶T*űcx8uW]uuuuڵ ƥ^`ŊTWW355ŦM<?~r9x }}}\.ZFGGy0 oqA6rI$ wSh ^SS='N'OrwzD"ey saذaxロl2{yW4z, o1L̛7nN8A&+^z n7?CUUZ[[yxD"̛7O%Is6HN<Ƀ>Hoo/>|{K,'|W^yh4ҥKhll$ rW3::}GGG\r e۶mn:}B+^z'On:VZŮ]ؿ?s}uVf3^{-30>>7_΂ D",^jE0 tO48qÅBB^p0 @nEYY&B&d2, LNNh/)))d(RH3Nx<\.0d2"L0(ʬ;p\$ B㔔`IR$I$\,`t:r,pȍb2躎f`0H"@Q8@9͆iL&' Lߏ`jj J&o1͔I&:}WI$If2 PQQA**4Ax<(D@ZYYd0 (Nt:M0l6SZZ S4l6MkȽ( HxNM$/tVYeEs9~Ί$I$I&tI#x6TƓ,'&e.I$I{ %I>t=_ I$I>.}hh~(ݧ;$I% QFKC#]ܼU Nt oh{%I$b:r ԧu裏}v>Ϟw8I$0z=kY57b B Lii(d.I$I$I$IK$I$I$IE@$I$I$It$I$I$I$]d.I$I$I$IK$I$I$IE@$I$I$It$I$I$I$]d.I$I$I$IӅ΀$It! !2r4 E00H@ 1=_S@FaR "9?]a*/ $I$I{E9ũN7_H0W¨^1 ;v̓3Gz)kIcXGcCZ= rf1pR0}qE@SvsFu4QgQOhyNq/}Qy( dyq50h/#Z6N Sc.WJ&|Q5d0@U9Z'~{&4ÄLn6dc Ófbi?%ɕ @; <6ɑe}%qvaRXmh);ձ )Þѻ8Ukt\s kƤ\6oL0a骦q2L^Lc^&v3G8XYMjі K}r$dZW7Qd &CYhf0*0;Ƅpn*ҁ*b [v3/qړ.&UGg砓n9JCYyVL( VI2ct8=VFLn JVd}d [ܔ2u7`̝"P>R1l*.)JYl o4ɔ'Ѳ1&1E_^@S=N劃X{I }g~5%,V;vT (d*^DC#̾Q(%@3jOcuY&BX%@MN-ʐR~qd_]EڰҾN=ˆRI2}̎D )Y描2Qd\"L> P᡻ (r%#M2PM֑1m$JҤ .-N,LL0aq *L*,jȉj3t!pSa/Jo*NԄu܁9 +!}}o*Hb qN VlTŤŬgPGI +I݁L]dS:?PE0%ltà|GqJa=YFMNSP_e\b<^Os V9Aczd3JF,=Apa~뀟 X6;pxǘȖ׆]'i)G z0bc)㼞XK&BjbT? N1XQg# Ț@SRf5N RG`aʲcA9 ,89 (O,%Z`I0U7IgˆY WakGZ07ۊ?c&pVKYD%j{cV㲄 :T룄`F_xwD2 <9F7=|JN?G¦IiOoy?qͅ甋!G U>N:iI2q,8H6._E[Nha?+;1WiL*#ڵT Q\T_$Zzj՜"R`LT˩"#{EGDҗFͲfn3!UX0ejꢫх+aJT@pze!8ʘI.+f$K֕80.^l .x[0OHRDReR:Sm'&)4m%ҳXkf|q2,6w̢ Ԣ ulIl,1Ew>jm)8&I;3+KNhm,Bm,D֮ SR%~rQ2¾e6ZEQM^q&a N2^f8YÌ?YDlƺ݄u8*SG:lJTW;YO$WNTSYKbܨdh_bI(JACv}v45 uJE(Ię07$T+YV %]uPJ ҄+aO2K$'!|$ 5}UCA<"TSU(A7qAGpj"deI҆d\ƝN4oSU$ M X8\B[v,N!jD 7YD'.dA8#~;. MC ]37[n܏P NHU8=eNaֵc72>A!ЇhP:w/AۨƼ J8qA`$!&ҥqlaxl!f]#WTfiuk*clt>rg/Cc#^ãGQИ^"];{BW.DUP= n;b:N0SIg>:!k <{u&'IjN q?QH)4?r_elN tyh%QE]\)ϲƒ.=1Vl+_$%-,MZDJU&Ewjfe8JLSz) qN&/AxiI0UR1d2nOcTMBIE7I`jDڄMjLI%0Oȸ)9XH2b^2&Aچ=L*{0A4W(4}^ E8}# :I39!C Yl%y>E.&MvH;XDuk\r[Ii|CfrCzE#cv~ kp{0f µM?'BMCs/ۇLN`x*_%7ncwGO@Dq3L}̕[Ńs %v]=ܿO-rPM~6]_{^=r6 EuKe, .O~5e|S$d3u9etp/üW\$4l䆞þ{=J60kaMs -\pJ_M>9?\s+~ʹ9ZQ}5Kz.gCŵ`#_ƾyG]:ȕ''۩y'?f#lf]bf;ʄn? 珞xJk_އ??Š)noϞz#~Vl1fӟP8nm0)5a Qպēp9\f*a/<̟'b}j$cW04f7ro ootG7SQ}o^KmRq#xw6.IphjTi߫`qq.Nwdw9^\@0D$,x˲Lel t~u".{5KWJ&&TnUs u>bIJ|IgZv>tՕ\{m>/iINUWп,A9۹5{'1[c\H`[nVw<įS_ai(neѳ̻̆%One;?'z#Ue2Et^zHNgzݥeTjf+y1vq KYVpym1N {386+n-Ʈ:oGH\z8yoz %5@kFl%oE҉C[dV6>ƭ܇?cWƟ'bN$YN }/OeoaGpxz1k~ǣԃaT~$)ԥuH]|ؕYKP~+x,S=X\,l<.el> 7LS6Fwvt Ki=οO;rrn1EWȯ:SlS.SC/i+%Oȵ Ss'u'{*p?(G=;Kϛ;pG>@G-{/d'KbxcNk$˰׼Jԗ9.ɧ߈n<{<#b4uNI{ß!b @m||R>?ndzu=%< ٯ>ʞN*Rp`/$4{㦫O5(j(|Qj!/lʩu%__Vռm v=vUv6;1of2x'Ƶk{X42Y^w.3jmQeA?ҽS?'.3O3o|Ffh{r5kc`eh/\@z-eh>ޟX>As^W?O[dn.trZc|.<0]"eL15r/#O-[&fJջg~HpQ?5˃uba5;LqOmd_?ʡ]|ns?K? :k)QR~LbߣnNͧr]KKrdbXvv}]LOa3k.c~ZRXDMރL^u ښzϱ# q>%fi3wRJL/Z=c' &q7ctd!ך u-_E?UocS|DůP'k7R/Y|$NXx9bo&ըC%\OTmD-{YAՒW9\GLzP[r497S밮É=7h&[Aw'9|_TcTU*SxS{'x-mtfQ:xE?YJ:ȩFn\u91p駮6}̆,7o 1u ~ԶoC騫>SE;[+Y<:|YnlG͡_sbw\5.Ժ8aC->B*_v Ɵ]-V'č|jyѿ.o,s>}/u{%v'yZj@AZ Zd=|{f-|LJMb~R@` &2HR7Q T uG(EJ;UUAQ*?ENQBUrBENńPrEAQD. %X1*T!rPɥU_IrB{OUr)jn:K* (\12kZ*BQQ(.7^\E*r%PB)Ij;UŔº)yRrn 壀PQ断\}8NWUrեysOC~}+;AaeLPrPe&RX~nz[RwƲoDnuPPP %v:]BZL7 Ηeao1]OBN_E|Bɕu{PNJ(2u,PO_䶋D),#\]*/2޷:uo{U)lCBYMQsG2b >\}9}Pud;CN79W2},Cn_:sNŔ;-A/|y(P~mGbuz>}B |t`~NrsΔYV>߅m~ՙ}n?=w ?VgV ٹ< ;!Lq;F_8U|,s w"ӿ w TSSp͟CE}?Ogϡy,u fEu8b>oEǝjW8r.'@Ugփk @((+r;mY8º(Nj\y_3sPs;]LaۘP H2͝WT0yDQY叱3gOtre+(2+e~>+f@g󢘮 c뜿)\寗ɕ]:=)QtScuXΩ\GѶܕ>E(-)E7"wєE_䧝]_fkGL)JxU|\TLbبN?e]cY\l9R(߾%`L_k|l_WL9(ZU)\#LQY<)3B镙2_*(O۹:}oYp~[peΊ U>?_ mQ8|p<޵r+L4}׼o;I$I$I$I$]d.I$I$I$I7=rq4ͨʱcP6hFEEqjjj 200@KK z%I$I$I$h4~3, D"xXh7o ??a߾}:to| _J^xs-@ӣ|UPG E` tB(͙ЋafB3eqQHK2A&g(n:m FayLwsC&1{$aEuD Ӕcze&BVgΗQ4(B(Q)Ř 3S1s8>酕?+Za 8sn2ʶP9.3V|9 |Ǭc9P탅:>'3Sn׽^V~STsqD}+6]&_~Eº6E{0fB10YSЧ9wefϹmJ^E1ku1E~PV@~EuCf3 3eDL#K~Cɗ(32gsfjez(s('ωz!p|~D6`El;E m͢(?jngoh)!Qtxp,YC|Eԙ(d8-cØ=őh**i5j~3K33ϕEF9L}1Ӯ?7SgCQQ:3uY(sfsqM ]Qp55on^^SeB*c~?ooM5q?x H|Skl6SVVFKK HT*" ]9tvvRVVWU4o!EbiSɧ`iSZ8V{=aj[of2VNOr> Aڂ:g+@ 5abJeYFr,z]ymњEqGQC.#U K,GEr*ʤW!Idgf %j{2Zebcg6+eKMxJ&7D~G9ǫ4gF]C:iw &3=Te찯%>ĪpP u-?,cTR?92"hs-h*Oe:Nb%vX5 5@:Z̝5s L68 Gq&b=(vŒJљX6vrGaNsLu-FۋiNˣ0쯩Bz= 0O͎dFLZʨ}L^VzC֮ᴅkʠ0Z+}iJO-V#Q3%ԡ=T:P]b mOWcl3bo{ vѧ\ OJqCjB1DE$ e8ѳJ1qF[ζԞ]דa:܈6@mnIY=Fԉm6 UibfBN+KCgy Nh9S8 L- \/S2* O'q G`飴v+T [ml_Xv<9r{qh$h9Ɠ4u[Lj0X̐^G頊Peu=IF-%,lAͪcZ(2&dgJqbĈotZUjTgA.6ZNRZqv{:Kvxx.;pD!VcN eX TX 6G`nxF]51%m.@ T Gܠ'Tl?J&Tl9FeA [{:HT.>Jj)BǗqSx3K컈:ADI<2j|^aZp 7SS}ʱ$S6jjm;ph~UUa&V%IĩuQm 2*aw>eYNN-bG x0Kc92TtvYdtjZtud&T=c=#t62/2rl-Nu>Le|\be(zqSgj^uN ΀σ?!= O׮$}^zXRj!v/Te3Nܮ=1p^ z&&0'mei2ZO86~ 0li WJ=*f/K'B pomcXG9i/ɰaSkrib,S#dxChl,a+J1(}XN^cgAɊ ÇQBAzO!._GM2)GIk)QY/$]gVJ Ǒj&A})BdXIu:e,cm/%Jщj&]~^s=|7cl8*רg" ȜiJqjIbz{9v[ǡe;5ƙm?ķO96 #W([Sv1sDJ"{yrCWeDyB*Nse^RNܠX>J ڡ ;'gܤ%GI5Z' l$IÌ&(Lkȉ2=QG^8IcT0H#XPЉhI2VBT[D/" qt #L}>xq= mźc09U&BcZkP[јaW&#iӜbUF ݤ^gt'h0$F&wP+GoMpfr=FQ_|N.# # Zuj(I5NkWىMr1*%R3TIƮ;ևMvMqSf #i4sktfR#tiMRߜއxW:r9Gx,غ~v}zԏYIQqH#5)q#'9}W9(W'I\'9i.GEN{*B}"F.Av{c$QqμD/~tba3 aDZ, ˲'z0 p8ih\| $$hVonۇ FD6Z8hrq]#Me!A<^Bg=>K(ڢbO MzF m8^#jD ,{cq.b."]d3BrBԒ4 8d]1]-z|EvܿNQHN;&7 HAK0 8MjD5ŠXBc.1iT9B%+-b"3qYNRPna"Mj] K&ThCLo 7b[c36 ,'HK4 3$ bۢ%djC5w TCI9lIiUg)2Y1K786Pwي92Bip^>cXqF2PF8G4]<`Tp+O3rD'md-ImTYӦ]W'1';Db5<5"<"U4{Z+he5$cY3M6f@5`#Z 8"LqV1Yh%90?v\|f9 ݱ8Y`kz$ǫyVR\:F-:: ;:~Qxѡ]F$#3#iȲlArHcgI7"fJNXצY\(G/ĈMc:+Ds zh1BMd{](9:Imͱ%FkxX1lIr5r!ӷL] w'xNj]6̬KT/Je2Dai6)MHFZ=D;By$>FuڦP&)R!MVm2ʈ"i 'Ì# T/N;.ut© =LSIDAT4E=ji"ntR,A/Hm&9>$ m%jhA:Iht&$Xq=O=md 9"a $$5yZ :*JI:9VhsYbX!\pQĚ+n Jr<6NE#E*MA&%ӛt$C;O9G4cPO0H$U-Mر(q!hEBbD l^JH aw؜H9mO2өpHlRSDdr<܎E׎S8dqA%"R!gg]tgF( Dc® #GBX!H!Bug sG,FX-K$z82+)t]F2EHy%yP(f+tJ=q #M2SDSevjMJ,_Cc3s=)CwK5I2s7S=b*4Xdea4 _?F8b$R@t41'LN6:7iwG0۔Oub,3[$6MwC"VD:8N3N_AMPȥ쎦8z"QYLb.EԡNpFΐ3߁zPY=ONƥ3gOO277eY>sq%.^ș3gxyv)V~ɔkzP +J e8[1XVT8J(ΐ^>P"ҡJÄGK 8+4(rQ1_2/t^ #e cX _+r4vw@8N/uA!={ ū~ _:X^"$X6ˢKP5-~)oP,mB! ;@؀Rh`9W4@_1pDP%GU(<Q+qqiNP~znYӀy;﫰Gʭ! MEVHRxW?\ݏ_%@8da@w& C}$®rK[*^y@ g} ƕXs*RA[MӻGْϾ̂ W.A8^`-WDߏx | 鷙koҠ1 %(^,|rξwuo{6@D0POSO8.:U^>A`_*l*u'^p>_" \)Oo|_3l5>  =+/T@Y1J :׽10?[Jp < +wti}Ӥ'?/*6.~FAY9R"9}u[ S/wm9Pr.W/e}Mu_~g2EЮ+c(ẩAV^O: 8)ۋN _31i#T_u)?[}yyP A) aS% t_۞\<*?N Uٷה27g_ kAz']P}Y*#Xؾry Iz-./Vb|,8M?y;)O]|` eʽ_1 _-vW?7n.敨x<w@@ ۾nTrNxN{C{z]?ൠ58N xzo?P?gĻ6hmT>=Ǡ}_/ ?ߚ! 藛Kp/ a`+ R) QJ>3Xτ'gMsWR$ knpFj({h•½ !tOǻG w.N@jܤt[HtdcM ϖ뇤{ҕoc:Y8h޸-UO7r~wƓ^Z,M^|Aƕo³yMh} ͓.Awpc9!y^~ٶ("k_|{a@WhD`RtK͕rڢz~ٵꨫ~}'|y+myz /KWnmolF!`LL{K^K xQu?BetKOuSʕ&\_'-Ak"׮^Chnд~R/NpнPKRioi>?\]>/Gr3); r OեoҍCgRNh=~j3^I>F$M3!]*7Ǖ}{*}%ݍ "ȿ{<_< MR*Ϧ\ Dk^^H70szq/n?ws_ssy?'e#vmT|Cz17/ ct//ՃB yv&w~"Dm ] (G>/?:҂ 鞽 }m FCz^j5nDJ)K~4 9g.GGCM?M1#M`_Dih*|qS7W"74Qr yFx eg_$ܽ9[z!ELCF'dk4q,A.q˥+{m Źe~k9-zdW2t8-l(^*^36خ P5y$*YiݠU}^R7(5#gVi*nYث<=rx;7+ XY)>!u%:yuzmvZ5[W4sm*5Q巻&<ܥb6NNh7cZ\oc|^\מ.haϹ@k:xޢCьs|K~l*XmDU3ų&Zur;,suG!fb}s&jm?ֵ5.g)|r-:Cqm)SkdB+Ȋ+T_{TM#[78o&lMm"hX`&JǦՠ,Ӕ*$:kDBKYsiQ+1 7i+hF 'kyP`6 n p<**(+mj7K;~|kej;`hmM b{VWAAXEX=ߣAi:bxlihYv;dCk!yMas-XW:ϟoPk7C]zV4_FoQ~p:6fc"uWB{llՈK [ ZI}٩heur0TH-!y+a(̄$(Q~U|,*D&s6Sϳyk%Qo|I{ݦ4ɵawF,ܪ|fV@֮o$n^cJxY J:U_-RMy^ZK-- !Z`Jj1Zg+<^lRo_vӰةF|OHpKLk4,6Ϡ6S2|U\%UN96{6z.Le%ώ 2wx<۠``KټzLJզh6oV7mlvJeK_=C:uj\!ޭsW,5ʥ}J 6>-*oP<0#Hp-NXΣ 5E#b ~sՕ.Za4r>mdMhJ󄅃vؽAmae/VF_vibNMv}d֥&6ZXW6H,z%(m@<ۤ;$3Vu(_&\+ \ -|e$[sde[&*_xFD8u^֕4޴.ܢkQۤ'X`-MnuqCrFc3<:z@j/KHqyPx#R3>W{`QT rL&all/{m;u7θ}a'n(a2ӻhl~ߕ;ri{Cۛ58=A=-~<}/]*w 'Б2iAu+Exs]poYؽ^&{$!9kGs-0"s ;z6x)dLy}q8^Ǔ7{[-8BC{ހ=A߯oP zAOn߰M< >~p?'GM*Wq=>}!TEp|Gȁ^,^cwH?v+0`M^?fxX`>GS\KspE.|:۟wP5w< )8Qo!}}J2j`xGj-7A)~@=VO('~?v_^4_{eA& ֣a5@߾!5xk7l[?ڿ_?г$@ߤʋ{]v"x.t3 .x+Y'J<v풷 ?nxvBY)~\{FC I.:S@\G $a{47oS/ `@ |Ǩy~o 0jN7e+7^r W{vEJ!$~PneO#^t;^OP8~`lzy|~[i =+A'%I:TG |taz-Ǡy{pNn?`Rx|D:^ݷI S />pİ'[a|U: ؐo# }]תGp@G``qd*Oq?9Q'jtxE%oqVEx|Q#?IQn|?mr\]vxctV}[t;#_ |kq5 !slRfi"m8>? mll,8 ſA4ɉb!_[jX8&|XB5-"$ge3C 1C gƷ}!b`(ΟEOLğ!b!bD|S1C 1C 1C 1nЇb!b!b![ C 1C 1C 1C| `Ab!b!b!bo 7C 1C 1C 1C -}!b!b!b!0ܠ1C 1C 1C 1ķ!b!b!b!p>C 1C 1C 1nЇb!b!b![ C 1C 1C 1C| @&`!bD J  k }(Sk= P*!?pJ ,C:b!b!V{Nޱ=MC*7m˟1>vAjǰ8fX G31viyhI"kPL'shVg2u=Sp'M32L=Be#:|dD:faTBDt4ĢUte$zA.0s3Ib~njP+B-fi[)¶¡wl]c,T׻Ǡm/("yZiEwFzM(5sqӺ -Ǩ]G$ڤEn ĭCʦF.pC(9L:%4Fܦ]#/&2C|b^BQID5٣pVZ1iUߗln3W1ƺ4wE:FT26{4rLFVpt<2#lN0z "$(mELo hBݣ18Rx֨S$xF8ʸ*8 tP=a$ė'69LR4hͷϖ15Dta+Ѝ wH%IKYXB:1"PsE&Z-68rfuŎ}+!;(n$8YA65]؟\;i*>灍ݐܞDE4\^vlټAWEotjFZh#.3Rl'&# 7H+ Mϝ!ߛg)z1K#c"(3p4E[9CoK)VCkc "I2\}ha}d؝$,*&$ *C:4&R[Ä& ƋTOFZ6ś si% Q^ %ϣ퍱lND[e Њ8Hq3IL^BD,m"PFkLt6%fbf`V.z 1?}HWQQcd sCiQL;B!nѰG6U2& LMTn%n5m\"a ֳ *8$*CuBc.ʑd9iG5d@PL"G+a&43ncv,EF"D),'D4YjFB8BF'd0ђM phtb$jMz,b2O+ƪOi7u89FG).L0S1b5Yp"~P6CoE̸~wtOE0ߥ(cTi|DF\&uB:MT/ªsd2O4K{%㣤69}RJz0T.j4g;]IEr3Hͦ{-'EhD {+߯1TNEl)%{8JcIiL ʌ4Gbs6 REVơtb zS̞(ݡ1i` CB4┦*G'JZXբX *,n8#]wqÂ|N(LAL8qTdګPf)FKL^{XrWmT UKcHS#n$ 'p: Sx\|Dr$im(gf߷Y(F3mc+;ebp}bLȡR˳3,q '|G/eHhs&%™ &Wfq8^.05E͔yNƨqAyX$KWɴ{Yfz2<"x{-'Sqfu,'DńT\Ƒ+n1"F4N-#=FRFh[YZ2ƌQlLS..q$}^;-myseX[XI١aG:v(H*0iNZ&iu9NR#P GMXt8g71FOat w.@DSԭQZLݦFؘ5,"w7Z܊`Zg.SM1룴R# .-;2,DH{YKrvu =A%~6%v%b% NB?u%̨". H5KUȥtK3)tzQ'&v XQ.Q:Z;Lgt/D#/!5L۠ ѮObJ6-Cٙ M]ft4EgiI4G,VXa7MEiXD8A=ӿu~b)BB_Ͽ+_7̇|~o??7Y%/G06򝝯Or:|ؑ+\Y.̟_$< \>@wO oSg S!n>52S]3Isd z3[k=:TY-4^0j#g*{\}v9X/b0Ya pŇ9_~/r~_j{>ЎmrwM/8i滈o3;}sXJǺ}8~93LaūfY<=&*pe_N{3wurr3?GϰQ;G^%:Q$/P^{>AaZҾt?,m_b޽g=eVdp_ék[|fg_;rI"c<(x7s,}S|߸|ۣM~ Ǚ9tlYp~?x?$)㜺j֪d[G4M>{{[ݤ%g!=WoQ{w|F[wÙKQG2/+]iؙc u/]-G_?|(/;"#c~?~_?W 8|6wsw= nr_[~M>{Cl;>Oyq߱ǹяkgk\7iJTZ{q(Q7J̯H>ڃ]B[㤫ӣ..qyn ye1^'xr"[=W}do=`^ Fa_Enr'Py#y\WLS\Hl~;s;Of9{S|{|2^Eez&s&o凿T$ǡlɻ^¼zXswfxs._ Dzpq}L\hh.(oS6?./fz/?KB|5מg~Ͼw)¯.̓OF k _^ѽp9Ʊb"%?zK<1>e|;ѧFX}Ç5œ]'~fyhogs_aV 쇾̏>wo<P׿eN|[Rz>U|]'/$#]laܵj$y<+g dS)x{k/ܗyaӼq|5~gxqE|5K5ީD_ o/rw;Twy6Կr(|乧|_#| <^֟,~B4Ý- kc3r,E=Ҭ[1F3sG}_}sYaCq}rd~4?|{ȥ|ɽ{{ȹ<5P3%B/rݬy۹gw>v&W˭/M}|&n?'\xwHdl7?J^?4't?'OW~dxe~7n0wP#?+'*$/?sT αOsuds\k`kҋDKQ޶ |>Ic͎(qΗÿ$L,^ၵ<~Tq~~׹x/t?ėCmy]kO̻q5V>/J}ޥ{YygC->EAW?o{侦@ \f~:A9ʿ/}z?R5 _pԻֹx^ѧC Y y s --jPЏx`AYǼAy6 s@9Hπ4uPz<_KW*= Ao$VTY˅o0W0<`+|c"[iw:ooޠ(|{p2? pxDmcۯXb.}֠rA?w/;g=onIJ9}[ԇ~Pt(Ap9Ӿqqg6~׈}z+4񇷮m8c ]h nt@W:n#o' ئ?m_7 O蠹uZp·Dm9Hqn<͟!s)u. Qz@rП 864d!ufk_'x5|o}-_w|W6rݷ}C2`? 68M8%ޜ<~yo_ MXmr?no?P/w\@iٮ\,]It F_K<:-ҽb|?\@!RHzgkGߔ雑Hǧމh''P<-%J+(! Hywk?_4JYE1IRit}G~/^_wtH|}7'W׆x/g`Pwr<2P DaC9E_"O\$Xb{[ .GIѷ[O_]_T齟coŁ-_Pʋu~ߕ^ 77FZ O}*ƮhE1(~y-=y9W۾F8 g Yec>iܼ@=ks)~+xnݛBRJb~ ܗ1#1^[`ӟCIW|K/ͣ|bY?pt Aύ}>i3'};@Tr=]Mhʵ8V]\}Ӽ^(T}{^^R9LhV) }9꒬;gR)*}yH ϊoի?ȏPJ>666T*itD"'?Iưm9a Kl`qqb#UCwҌK0X#yEyƦ1P#üb="m'.2FiNvї穚 6ZN;謝 zQ‹ZHaZ$˓[^>Au.zQb8p)AgA2j*I oG7h<3_'LVTtDDHvRA3=jLZTLiI oN`Q),!gYރn 1d3JGxkClp"zވ=b1c`m{JmZ s)Kz5C8^GGgI=SaC[R gh\|;fwi42]P.l܉L _[$, *cّ[$HNkQIa-wQxм@c$B)L]"m Mv_<2VVyHKװF=´I&~]F}n41& xyQEFܚ$:fdsA*1R0`Gp)yޝ,4*a¯X^bĬe:"= N7Y/(4Cҝi.)SܓFRμܦFvqhtUqA N$zK&2coLrxuvzGM=~hKFC+.huGF$ZWkGhelǦޤF mNQ'ȊYq"<գMTy.|Gx:&;\0=tSMk {c5Clr{ƪ)KoT*Ny"*?㻟|;6{4lkRjo.lM,Zh;C0O"Z'PhB `f(7lc]~~^8;X.swӚoO}bH bCɊ[10D irf(9a$C,xn\ZmV 8A.~s\>2ΫsKNܦF} PO Q8Μ@Lm1dOգlS']y&LA.ijM0aT;ʹw;o!Vqʣ4O[/KT lҙnQ^>FgsgOfU̸7^<*rMXP%C@#՜$̓1p ZZS\B4'ExxBZ)K؋юdC$g6xqLͽ(F9c"{}1"fx]̜mEڥ96f=:Kb~>Hr^d;=^H6='B981El'CD5trMvl0E;M.|B7O*N:p<,tHͬafg1 3$>߸HXvvBl(ԚsL7_P [a*N͢i?k$eP8dV 3y%CȲ(%4#!5l*L=Nq YNr~8cF|<ŝ%nN&ab&bk&r¼?@wK{scLJb8; +c̴g.O9d4'O8RJ$8p[NFPERZ?lb)nF7E=sl٦>peԫ̅hfX2cmi^NƢkw9w="-j%hMIN:l )5̄1֦a2_jQt1FK(Ua4+3'@L4ڬqfj<+l ]  H# fHpex"xɍwHi(]9>ีKstǺYUj'h#dã Sc_tXbd D5Hʣ>4#}(#wm0fԑ(nuIsvs(Vv7&kFSFd3:c'Ň .N-`Y(t]Q+y<n311*EOrĜ v['{ɦ|y (iVhk c 0bg(&㜝\bK.#ܺlc\ao"I6ĘhqA+ƣ$C qPNWF5-5E|Nx3Ρ7S eh%$ DVrpcx]xS3iQKy9H(;28+3VB7L['8:nHRVjsE#um(q…-8Git4ϭC z4ek,C]2{VnĎtcN=,{s㼚G1NLkRwH&R|+?-XU'q]bNN0퐍3I:G*tss\HOL%.`E9kD6SX-K.wgݘ*L Xeg,Ԉ;]o,CjT !H!.\_䓟$[)b}3m<ֽO6I1QafHynqAorgY4Ƽ w^e(͙ wTVZY?ATu)cDmB-ETYdbyRN'߉%VSĨt[_hEF%d9rMorKtjn۠0UbInT {KL6[TLhddڄ'Ѩ^M7Il QD;FCp?Ew6Г fv5S{q;Rbل{fA1Vz;j| $9*2"de(8zUCoFX_{ET;Ѽkl$&IZ!֌bi֍3Ⱦ maVcɥFH[cS<*-{i'+)ftf{"&B@*#9uyRy1ű[*Fn6mq\C cb8M!ژe< nc$rMܺzFR4xy-50W3Dlr*®A+&3MrC)8>ёG5)/rvRUH6S7[347tFIC*;Ow(74@#ή68ӭ:9S$K{]&ܑX#m"}nГǘM8ō"v& C=T/LDVrox vCӬLQAˎ1_%W+xtyAM6.ᦆJ7)ē8u*vKI sCeԤ$&5HPݠ6{!&mVRlG/ʌ3^12(& Ff6tg/5%2ZB&l>x~K'G4 -=8b>ี'ٓtǻ[Uj*h;GEE9N;a1]ph1QG(4,,!}|{ r.Qw~a~%q&m(Hl ؞Ɵ,ڸg0(ckZ"LX> 4=F uY(69ݠR[Z/?@. uvg|91r[Y-&x#ξs s\[r7όr> 37Z?r( L] dK^=J~fh=)n%CdXKp4ybk'O'l4ao6aE}F1`vצ|5֢%xqAzt2B6GxzJ4̎۠\!HYu&"eiYijH1ArbiИ6D ,I`Ӕ 2BnrwًpN^g$wI aboUZ.6oCӉkM 6$K`p]+I٣\8ki֏;t:]ue>R\y|]-q:v3␷fI`2C,龣C kYWbz$t z%v/v~ r[[[ܼy0xɟIw3;;;;;\~~JzNR D-o=_K@)cPug)%yrJ(8? @ ֈ(n~ʳ2[/o !{%@2D/7|2ctɯ.__J3+qJ\G [[:{"GzJvgk0g3(峤ą_~_&Jhp[_LPep6u{W8yxJO@:~y_KxK/~%ˠ=+~KTP7P2d3~\T]CP\;Kp_&.9:wH:A9r$~M旖e GIs/[ J}:s{t" '{= ;}KA#t%뷻fy6PYo|X -bkyތ΀~{ơ_+9N/Ӡ{~a?\)[ 3A]x'dnՏww|~\y^2tǷuQo)qbۀ~;_e)Uχ:m Rn_ IS ;^ɬ 7~}`Eg>>GJ@V~?_N+mOu8Wb,C XOURc.(??:mL~@.F΁o&]|ܶ5/Ρ髡㗕 K /u͋9~p>Ag܁6[.Rvo|18ʈ"{? 8lNύpV>!hRʳ1O6^y#Dy%A,v+r ʸ-@^DsO/#[-9 -hgss&^ _z#'([xBym^p\ߨ%]pܞ(u-q}Cy{zⷘۜ 5& u^@ ,ԳSaC`|~sp?ᕼ@ ]987Tr x1@L}YM:tO}SmoرcLOO<yI>z=DxYXX Nb!b!b!bM?SߏF|S?:&R B HkH$B]Ci HMPhDhRhR ]Ht)Є.%hRC=M4MCMJ$:RjhR ҂1:GJzonMk›W MhD )t] 4ͥA hҽ.$q.!MxH#Ѫ*]~tVp.$!!:BD zR`KͥCsґhjR ҕ# !uO^ʥAx ҨkHWn4MsAׄ'7-[k;B/kBjµ/)|u&Bz{e+RCJ8 !90G/:Jjyߓ&4RC,5=G`y~IlM8KMC~BJ&w\_$hBp-!Hw!$/=+p^㎂^[7){ӻW_?WpwUɧϣY}!)е;|.@?=!tRt~l :)DȥEw㕔}BGy۾ێpϑ:H1?I=.|h!Wt&I@Ӎx"%B\)5jͳ5M˗S+&D1] ‹ӮtU<ԅ$_5oJx2FGh+r_| {>HI!XW.oߍZk_R"gsz~ϧp1#?צ&|O|?ǥgOnDc攮3b?SiA%4=Ӻrc.R*/7t7q H->7}ˡ|4pܱR*y6kKokn\hkϣ{k{H/OW\tJt{k$(w\9w^R:H#gBzrmv;q 受 /##qPqϯ=.4M⪳[x|4ͱ8PA@rVgzTni-uM̛Er5pnʮ+ ɗ-;V!ť,;MKm²Hk*LF:P"LKս5FT"Ҧ-v4;ϑnj5YIjLuH~۸E]dثZq@=,W6)CdWW6}2׊yQ`fͽdX1mKY4٬eYQtWsV_.78^'VmH \WQRIll2ֵy˦̓ v9vcy3[#0YpuC.:V|1o搛egJ:m^4 `T,ݠWh5:^eח5,kz5h.+g9VȶmME3![IVqiáQ^rm}4K0Q]|Kg#K|KIwn+[ڪ`Ԯ]Q-Y}ȓklR=ƍTx4دI -fMHZxȆS/QjkVy}u|)6Xa,ya'ދ lNXٻIY=EyWyB"7<[eqNVv75mjinUPXƱ,O~K* ..%ٽV^.Zk}:jwڕ9N7:dU6J)J6zVNVe"_{Cc~ Bu(w{0yzkHi4lw.vU}ce\ ˣm6C6l{7om v 6/ۼ*Ph6x9uCR墱NE v5RWJU^DQDxlfoPcK[U^y٤'^lI:^u+ |@fa.*ZW/n^ʲWwZX{2ozhZDI^zզW3ЫQNZQ`vZT6fAT[EIP dâA  - Dٴ6]CNK;O+hi`lm¶InwRdU&OeT]AEj5:).7MBuhMNFBPRanٷYJTl kZ Sm41uDnJ>,YBHnNSX+Loj2bFW&cake .R JqBrn*nbUNiP%8a[m/o[}%`IprQc5LB;D7jkWYڡ\ާj~|rnA`ڢ[3&{[3ؼrw[{DjSDUF==ʛ%EJ z9b'٣tNju·L.TȽO rmQ 'kMѫ{MnWQgx^6] %vy#ז5cnswb\\ctil4:Xۍ{f[ro ;w>99gfdh$hF#! 0p1l1`g X@`hr89ww+Wc!JY{U뫯TgZr4g=Y\t7ڮX 8[e4յ'Y:B}ޡ~ruVyrsK>+16ZWs&AwAάԹ> E>QbͲBllaf>6To^b]`$!8\xFumj+&ETMkU)ly$Ӭy'`\x;D]n嵧PN a%^Kvejy\SD^RwOϳklrY% $׼169(6N7|ZVOqepzq{ ZgѿF,zD:ϋKTkO8|ZE}NwW\f=OT]VD2˝T%$?]g=ń3O_siLs ]iŕgنno8?1Y |ݚasIr4]W3b¿` [s$Z;80>2۟]W?7-Lg be{-[22222222Zc(<ضCCCr9RhZcj!ccc mJND}&GC5Q9DlS:hG3H NHU@r}ʦZ䈉">Ƣ6(2a s\d,WY `%P#'iw ,+#xĈU#$N E_#r! ž4$c"&vh=V!Ǩ3Ԙ V90.M.4#qZ 'kb&u .SSNBN.#Zb: ,C<Qub̒ɤNBetKDXː Rc6QU!t jza-Z۔ebñ|t#r$Q2ϰi#(bLHM(TB$8[ # Kgޑ;7EcA}ȥŔGL0t2؆O╩ y"t³,{ z&ဳ@.ԬQ:v!N0.qD!˳*Cr:F9HDDe$RXVKDҦ$zc!qe0)ay6D!Ě@[(/FKJjLS Ӵ*8I16$S4)°c*tXO1&,FoZe#$l(4) \،Ѩ(.W!ur:fJ ܋ |2vC1nm@lE% |n2Ni?RwyFd5D'-6vBajBhƌ$j%En4S2F .C1,b" Hݡ42@Q.ӖL$BbϷU\M/oQ L"%Ђ7lq?2ib בF#v]!V'G\^)t;)R{jF*(儵$a$)#T i&!QfL;!%Bh,szMY{Тwa:TpT~rl8`jTf{nZKClIW&]H^AOt' QX0' zÆ:RGiaLòFun4J$)|acQ'jf )1k<іe[5XJa$i,,M[{nVr6#E#-(Q1V6ӕ}U "aEAELq$t%]`uHYtб(MJaDӓBoRyW):y5;9P]MxI(kt vd+9^ ($?`(Ya?#݈vJ 7 ֠Pc<֌x1:o "UL- Q2k1*ː`58MTLx]Vpu:BĂ8āJn;%J z\ [ Ck!yt)`(1WWahEtO7A?E|%C]qᯚÿkb~|]n}}sw[OS_{> Q9>|A\4xpq.;ý i~WrFޠN`2}7#_F{V6l󃿱1?"p>DLa`U?_|zoOz#ʷp'l~+?ݭ9=ſyף|ׇiq_pOl~3wL>fB5-&bw_ⷝu$?둥]k?K/3<< ec7&L| 8M<ǟ= m'X/9֨i(t|_V 3x#SNw]{y}_<ɣ/wOp y8#c{ȹ,ް|Bx;bfx »~ľ+~fD;dz0x~Wk޽هe"޼w>C[H[{KڞW"Z=^:n:/331>:5dy$8xn1dQǺ|3ܚ-};WD§PL_]Ϗ`qY_IDAT})5r{Y'_e{7>FrhG g|yyyяp8Xo_&?+ Ko =9 x;O߆X͡yPx'y20ӏp`%.SYK̭yn=؁̩o&?>s{cGև'Yg?λ7>s[gY~~OEn>Oyk|.˧yӈFhfԭ|=\} /~+=M!{Y.=o1{q}+\?McQ,wsQݍ_όWx|37Or":ǘ(޿pBN,O_M>v<5u_U>8^&Br2OۇևpmoVڧx\pHzP׭/4:/:?̾gq~wRv /ї&˗Gx:>XTO=B~/3+Osm\v۟=|)vM<aD/)J+%T)K_Z9Wwp>s7x+{ʳ V#wxO}'T猺_#W#+T]CU&==(ezo+KT1\X=qtNSsz]|| 7ɟyf|%ws{?񳜱Gm>+"܈Wbn/7S p<6j׸z0Nj_r߻3y{[npodljů7xhiNoGg}O9>.֙RAk_̏/GxW3O>ƒTnė^",{/yhC?ya_{O?>)K~oo1<)?y71s@gA=Ar<;yU+͏ >u-pɿؓ\=a^4[fsNwx)&?eOQ?y{ć?s Ϭ&_v I/=a<#ɏě3W,!OL_;[znys}3o?>?{0,O=~w56v ^oylgڛ!W>O?X. _cz~JN[3v߇̵_<Ȍ95lwZ8'9 %~{{훠'qBԕx'P BCy1az=Ϗ 4QC^ DbB8$} QQ૘$ &NbtyE$V@O?& %'I( ƨ#>: {8 1G!NT⣒X9#B4ac8$B#@0G'G!I$8 1bt#c"O'!ØKБOI{$Jc$G8&ךoqE1TW0J8 ςOmD&&c($ t|FR0„ CM$ҠD$=@%AL($vo&ڏHDvBF h/4DAB`mMDG+b/շ 2!LCMRHRكԏ݋nL$χ? iXcF?& !M%$85cB"KۆDFE1qCࡃ$=p˘R1Sˠ ;0"Օ@$Ab"_a&zƏ^T(ўI>("ƏL0Aߎ4QƝ D=b/~G}jB#ƺ0PAY B Fď&MDyP.0CP$A " A{mM, 4yyAeBiä5G"vb *P;>I1q)b( 1aDGi\b_!TB"bT2>:ȑ!Q ISࡽT.z[zi$t/&I" $!4*Cݵt@|TI@C!q,Qa:'?Vh+‹4J$B"'=0q|iݜT1F*[D1a }C(kXo[tO0IP龯{iNRaH4Q„ Q>xI㈟24ăz[Ictޒ`>2I؃~V~8a@hoCC'$*&Ǘ݋NO*~h@Ko4_Ok# >&$"B&I}8>N$_{=Avxß B jGvvk[X=sqokKf9scn&cŮ__|!^됛rK2x 1h{kʻ{~ū[7)n8Tn妍lM#ܠHWf)Mtۥxx qCb}Fo{h vAvkZ6ղ7sG۫r\7kȶ݅ϑk~~@ u@Lu>v&>I5;c75c7t`97Sy'>㼶x9f&^|tn?[Hyג'vk瓛 vnF¼=0;UJ%g m?n(o|w7^͛"Ywufm_fv|ynީρW;E57b{on^3 .,MMR`Ů $^KUVMun=ᬛ5lk>8l^Z_7K`[rwQR|dOqs]kMB)va1crqR|>unF)0}FFFFFFFFFFFFF|N38G>•+W(˜2_r!Iecxn&]c@O譾K&!Ne2;A@b[FOCj0R"X2cal/b`K[KCR>Z^JeRAh2Z at}cLuaLۭ5~R` 6jHm/]}؈ P}m42p>؃F=s4f-"KQ J qzKg?TR1`kly(0}ҕ޲Fk1bߺosݾ-(7}vے Kҷ4-z0>F$cؒcmlm+nǬ~6!Aa55Vۂlk&uw w3#rӅ2z5r7lȭ+ѷ=mka1jt<'~ݹاVol RPom??;cA .[1ݰ}EV_vC9k*vn+r #wxO`ގ˜4oC/ ^R[M?[F#wM(iҘ1STMer+=Imh*|S=3Lx}G5A=ѷA2Zlށ gT 0e~[/iݘAL݊!P;3 mlz}ߑ4c+c;O3ƈmfGݶw%w?7Յ}4-E{L!1fg@A4/eIoS۪ LK=!`mb [n#Kx8wvїGݪ:bG3XY>vѲ?@oiw֑JrٶW5A˭ 8DZw j~l/䎸=0: 6bLgkR-,^?#jiX aӁAL6!lm? 4fk,HkTd䋭:8o i>ޞl-!0f{ kj4$3܅a ]%u$v&JC,FǨ>]QŠpWZt"1Y>;YSX- dJH:8"pAÅr"Q~EV&J<ž%;je/ذǑ2Fe*"\ɵ FtCiL)d>+5ȅ40ËՃ1A}k#{Yc{BT(F 2hYe~fIgZ0E B1Nŏ8sP]cC8{K׬.ЦQkv>GiQ"W3|y {ʱl01TL^`&Iw*<j0X8ɓG0,uBu׉~m~g6XOPqXd0"+jkX͏ctOYoaFG0:vܥ;xJ1Ný-W8Y:ŚOyt gZnz!aC>[yK,V`su^aAf)9ʭe~Z^g!"R[p}|&b^$SmrB= UMzV֮'NBTNxr7GU\ǣS=nyȑM5 )9TXn;R;eb9coMg(WhCY&p"Z`wsSЬqC ܑ\#lA:vbXϏ0v+E/ppb]!?w'}*~Fb؟lk[hK0Ď,bqTםĕ!QsI IQ0&Fo^FC}Z;Ki 5AN #Z%bB7vB&Q96T}``R6Et"(Iu#t˒yz]z1N¾Q6 rzgh]n)]DxydZ婡3F\h؛[zC&ңb{Ne3w ;hU =VMQ*0b>ufh%OG4kGʴ<ƨneĶ+>:̱X@X wn#@Mt;NkX32@l\z}xC[籉R>hܥSp)=BαR`6ݓ U#4kGP2-/!r9#9Ft˂5`r9bx!b5jÔ*Ţ:BvfzzN^'q ݼCŏYR*B) )Q\r'ۈpKHUOqǧ(7O0c/ 㰧%Nη(D1!q<@(۹ؒh#醣uY*JN L$-\ ,=a&eSB>UK겞akeF0rFĚwRNðlᢰ݆.05Mƒ6a揲i`9̨ "*hJlr7w2^u?ML7%²h 4JQ5zo?EqL!JRU׋{([mNʼn #Vh%dg,8>Ȅ# g~+b'68&qP^ ]"0FGp&𺓄šNaJ: {T=bK}"ˢqcT6膣]|u eq0͉hY)tG/YDzC{;cAỈc#lLL^Ec,+=9}U1F\)!r  Mqĺ e <3t/ù*VHaECQA\r= au6oX;3q`Pƾmyl0W( =QkhA!&ĕnoMgbG04d\Gf*_!2.f/F.{&2aSL1}ca#?Ħhi9&j X4=(nHp %ѓJm5]vX*ۼ29nPj{5ǯ4om2Qz7R)nw mO3<<9 w8w/kwc\nI* <>\e/coؗ]'QaȶU\2w03:ɚދ5=;kn tzgJ@^޻H8^c^go]n#V&=S`ދ_UY/rZ31Sdž;ԊLrF_j2]OMa4A9_g]L'9:y?=v=r.;<}ħهWgxyaZ8U*,&ӎ<beϙQu_]NqX%a%ٻdQahm?f]I:G8}|.-s0l^@Fyb>N,\+ j7k\=1 w;XUws8Gz x!;{RH+F#DŽ|M8͊3I%/>Cw*pi^{7[O,尌x7Ob,0!=[] nǡj&WC P3O| uqO/=FŒ8b}1pK[@HAȵN[Q4C1~ zyb0V6bő/S|Z6&q]Dm3ʞo`iX-؟Csi>5yIwRn+a2nJI,Vz|Gqn1NnްN7DZA^<9qCFh}/ t{g2m뉭+A%9r(Q} +.6VFJ=pl3Gqi7gT4(t˒Ǹwi%/ JvCL"8*2j̞N8gXp8Qf@ZGgw,4qKONs},]Cw|/r)/9Fux!1HaF=Fex66!n{Cyͥc ?Eq ứ1̱%Ƃ F1Tbz>tpg, K14dz{2)иEPc]^Kek,ޏ96'xz,x.rs$x(9VzQJ(qTƨV Qz Ý[G^aq(fk1/N0q䥑阍~gc#7ns<#>n*mFG-Car[cXҳ<;zoVqw?SGiT-ܻkO;kővcK=\d!tl& ~H;Oa^ߋg[n3D|Vvݽ_N| g^Z>qG ^TqW.qgNk|j~*yHp[w^~y C5 .TwxgaG;ρgXYN+\ `wyzۯ2 Ǟz): J1ňaJ(M,Ly0[8PUgEKNwI|S䚺;V,M=xBI]0ix>F ,p-HKm }yZW웸ӷ%8@5xyd?jҕI86ѹo7^;ΞCL8+V''尿z<5Q8EbsH+i!ETcb;3ti?nסQScHPrCcWIuGkӉwL {o-7OЏ9 W\lLǼoy$t:_n|] a̎?\f=XyR݋k^sK\juave/y^T?gv.3;N)n/,)XĭӃ%7HBiZN=28`ǯ[ ; ,+/g^+vF/ܱ~(ώ϶ll/47>ЍCcw,wJjhhƷ,1:LjW;v`v_R<~"НKq_}%vsZn=2>XsһK 2>j-ݨBZʔs--;&/ymibDnۛs> o-q[Bv89N3#~ӷ H["j ]hv/ZƾAݾ9Xu]cv ëltb< KwPV5NߕvhUNaV 1b[w;Sn˷uBke2;oٹvNvvݭnKԷkifnb0[qlfn40X;XĦܫtw-;SJ3ZޙGvڠe4~c$ێûGvwniZlפK?Ԅ1iK_]U}f;pm)砥Aͷ%MFƈ};n?ؾfKQ823Sz2s63ٽݯ㖃 lZc[ ]ݬϹ[5NwUb7s>{p;.?/*vʍEW}sdOwN |N7?~|#m~CT²N^377//S.y{޳u9}40{(3322222222222229MХmoG8:Rqmۻu]/2J)7=f RIOXB DH!XFH,1H)Ri#AKB", )+)DJ D )R|!D"Ra 'EsH~baO۶/b }y}/ZRnXX;%W2[Of:udU/C,$1Ju2tR[ MLj~V}6RʭBz %vDb D*=q{ !]dzt\~ϒ[ˁR`KRqĖL?/T7u5&2-2m_KHkKOBZ[*ZV aadǁR">#mꏁ֖];~"6m}On78/s[5;?~}=%Hc0Vߎ@H;/-ۖ }za-oWw-Bi\sz!4J¥!B>s$l/`Ù>oȠ[t6E vެ-_[~-oazvƳ_qB )ɖ gmLnO),Ķgcv,Lv䶏HߖLj*~߭~ ۱[X;|?Џal碁}_ʱ9tcR1|+ʁ~ [mD b鏵ES-m%lDߒb-NXa߶@k`G3kKio[euH?J?FAJk˧r[Ŏ#rE۬Z۱sK,݆jW`4o?~Ld+sڠ`;;Tn OHvlm鿟0Wr5nd ;vE_-5'דuCΉ۱ޖmvo;qvlK ~=TBJ%r;^ooWd?[n`3nG_ҏ0ϕRX[![dߦHk۶bgӯӨg!A i==;i}mL@~ (c+(MJ}k;mڎ9[cm#[+ 5wn>eR9 ڈ~mӶ:q^h5ҮNamfBu4S rV~ 4o=mo r՟ZVS}_6B UWˏJ;zcE҉azwLG+l6jbz5.4EƂ+tW^bvgtfw4$ds1"9.m.1c:kϳ.V{&1Kegw, Hupz.f+,ש;,!4s$Mֹ+^co)b.6+0:Z%25Ò2b MjnHs+C fq"A[0+<1!j:Al蒣[K__K 5}BgEƙ$U_eKY\IT+^ǥfmɕ$eVj1kl\uY 6IYX Ԙ5ٌ7Y^^/s^/љ9ϵ2fEG[Nxg2VU3](g~}fZJ] 6WD \irzN"YXuq/[<q~s疪\Ѭ]g{2kEô/Jhfi  6ygyf"i H;qx)Yen0vfZ^>W6yv!fKbjtEiECgka4ë3 lnnpv|ZeY]47Aob"yi$",,+,t(Rgv4:y^ ci:8McUl/i%<!m4^lfTg2LrNu>zuB@ؠkXMӜ_CNQNE^zE FVFBl5 c֚%9l6kXrBo_ޙcQe^JMڋDxtѕ.R@w,3k fCifl.Zhl kxm41"ky6" YuÚ"6]LoUo2^iK5+:ܮg2NT!=$/ro6{Ŭ6,]ˆȪrFyGh_\my%hu]mrk"fkį\;:k\بBã܋TiYB4g\/,oX6v+"goxЋNqimI;aNYf6h& txby%aws\"tϱ^?(^_TUDXX(t[ <ݹU[E=6eۜdyr,s4zKjڊ^"%mE{NY#̚ǒSk*WM9Ý6yATgc^sq(,Pwiwa%<ϕ#Y[g^QU*:s1vâHQLHQZG|}a}}գ:.<[.k/8_m fau5A3v h4۷#A^gxxx=/B?s)W1N F8X&FzB#Nw@PB U' o"ҭ K|ۢFHZHRbiocRt('տ_HC",$16Ac-c"R&"ʤ؉I:d%iX VvUN8:!ή7$-vJвM0F[iW*0J$0:3emQI7c0i Nn'mPXZ$NH,ФOR6 H@ZttLd;/D#$!5R$[[|#@YX2F+WHn_AtKNێ $( ʤ푚S[S*lѶA'ImUv%ҩ]n}?}6 a%hm#&,P&- _e,Ԗ:"hI?tct[!pLL,v GF 4J6gE"[sTCBӭ2ѩ!Hbl #I e!BH dɴ-cFP&m Z9ݘA쐨vO.q AVR}X"1qHr&BcE ʚ HщMb:D~|pDO%4Ro/I"墤gob1 7{g`h~ZW(0rMտ?v'z4[[P ~UDCU>N:]8hccҭ=թ"ya%mm Sm2IcTlmlm(X2!Q.X[wI1N㳔ӏD(0eamm0(mKChpilߦ-V.XK(b"ֆt+D*`-cqܺV 4b!U^A!]^Nhmq>[J~ 12N][J-A96ں| X+/`kX"4~]#Z#R2k$q#&#RXX@eRO,KZI(a A4o:JFjSˤLac.m#Q 쾝X ڤcyB{ a쫕Hk+h,#JۄVL0H2F-#rEwuB"-T0HeMml`Hm~wZi>3MZ:F`mҸ۹mi M(^Ɖ5J4 Ҽ%ibV=_iLM0閦 Ēi9xI}ڠߪ-PHt[1 HXX" :"B ST7hl@6A gdddd|~!q_*|7"=####c`0nǬK4#######㋉lE\̩WSOQVIzFFFFFF%/z9s_xR̃>[7+PJ /={Z)#######D zFFFF A /@\ƶmn?ߢeddddddd|Nd􌌌o}g}}ӧO311eY|Kɖgdddd @-M^bM!vnx[ ^]C'xW}=AE7nV'C@1 (IS$ Ԕd"VhSv&OlID"P|q9!tQơqH$2c28!p-tD^GaDyƠaUKbF9eɎGWcOG&cEJ/*xh$.V<0F[ RS ד&W䓘EДq($1H ʂ;! FB1I(mLRwpdmBǢEVԐqT @d\bGC <>t)H%бȫv2a8pl̕NCC.Q" \A%¤H^ENQ@KBbLԑ2KDƱ$%FmYyk)%)ъ(B#(NK=tF( :$m&M],;Š%~Itz CdR&B&^f8⊈z Q[PE HlKTI( *a`\j&))'  1qul۷KpU~Ė}hWD4Re $!l\hWgvFLNK:%MӮkJ ~AP !ȉ@.'i /Y&IJzrI<-f3\J F h =Ikɛ|@Hl`{6Ӿa0r.Ps]pz2O.$`s_죄E!P9C!дsi|9 `Gibac`"d0Gcdl%6J6Bh4e `$!6҉QHDN I`$qfPQk$A FH~ (lZ 1Rh 1ZLbQ=?D>zc#D1Vrӳs,q(eᚘD(۠Sȥ5"h Cc(=AbZ>Z`ekʞB+h(&tDÖQډȡg)pK%ZR(CTRndwL'I 9ۂ`L C4 pIbXe GH:BE`9(場2l"J9M6tMdیzvѕT_ORqR=<ҊITF P E$*'-b"8:ȓ؁2]@uI@4!6Zi648%ÊcB"DúC.<¨ F!BF"J*H`j6Z+ZD&.8„n.Ԇ|`]pCK@) K(0ӡClr(!5!C 6&q8^hE,- B&9!eвɇK$?/K)PX8Yvq< j,7 -;@i;1h 8Ƹ Ug%%9,bˢ,(E!\$H;&΁#"eVL` $A&gx;x v.C.RߵaQ6=FB7i ]8-bPa,;FC(;M1H۱ vK INcMr(l J EU¤&&ˡJ!$,ji#Dh QR q ez( BCI("vYL?5.`,7i,Cv!tE:26e塰!I!Qms&Ơ 1%!@R` 잃QR ƢHzvKpe$yc*2t+Q#5tn DX\.p*T%e!HX2U7E,\ iq5Q.J4(#b\;vMkl+,!MZY)#}K( qڽcْ!ӥ+,;"YJJ ITWiHsM.QM ,t=P%1$=+Od o1{yINĶD9@%yTX.#V6Fe4#TP: F($*]4M]{8ˎ{˝gg''iF91^fzwYe^l!F(K(QHz:}7_1 +P_}$~SUNչT"Ҿ!'1b:! 0~cr'J"iF4;P_z"-PT1TO&{ȁ'bVe1'$>b#2N G:&aibZ=%soFϟ~%ZWS8/>1ő#_!hѷ2|<Ɖ+KJ3~fxȺGI-fȿ.yo8wv v>yΫ9g>G8#GF8Q?b|o%l>$93E%i/2u4p"bG|Oh6F=uO)}Ϗzo߻6fm\X{MY/Qw'ߺ>ƂCeܼG?E r,H~gyg+%F'?T+N&:?sy:)>.!x?C{r+* '_o͞Ƈ?6~'F&?~bß/«35\sinR& _wG#-8}it6q(=z|k\~=_߸cnح{yN;Q~2֞MOrᥟ"U~?{l+_y6E_"_4ǬݜgƵҡop){k]CƫxnSW5~m+o9p}|w1V=0iߞ̹UO|lĹL>KqCn`}[[בOMߠm6?E*<_>{-Scğeϯ-D Wq}t9]ܳq;9>O2y߯^ы~91Yɽ՜K5Jg۞c>Ej&~ ?'>Ə?~lhݰwNSßoλ=0~~қ'@r[N.w6lIgd&6GR=E'YY5mGE0n88dŇ LjkܯurbBnAGk8;9!^l9/ή=qOyi/^u7!i\Mg>yhhp۷ob31iSҧk( `W,>2T>x{)ߖ:='c4Nz_p-?ɘRM&k'9;jsxt6ٵ\}/⤿_؄0cIZ8D ;X7h [.ǸxuR@$Y[x|zټY(Ű*ky\qoɷHa~zGb)v1l;-*.'|8Oܷv73P=;Jx UYWuy7:'?(k̟1?SbP0LjUn ;WIwǍ3{pk'ĩNm{M~B9~68.'c?/|YpdiSF*J-ѧ^,s5wΥ9 {ôuql_?݌ H?fڮյ뭟`JɳVDn8wl?.U掵`F+!Igkpn fg.pF.G GSlYg|qoEj\.p 5gݟe݌%{Y6<][!~[$rt>{}.٩^.f!=QSy' ג,`A+O^g_;n}G<\BCʰI6?ǹ3,?^ gΕJG>89^ .;Fgwxuf]OrN8<86̘µGuw]?^Oqfss5?sۆA6WAJElSai)lJ4}rQ@SW[H5ՠ6N@lPRq2%J*15I#Z jP[4uRVqY@x m`ԚIZv0kIbAy]kjy䄁YijWFfb3D M$g**%ִ*MmhXDlSɇFzgȆU ]i$)٣NULbeKC/QoH5pdA,"# ZQ֥.ؒAq 9J _UTJT!%]7KD4^NM)uJfMDVE8c,xC ci|n8 TQRE"!QvCFLbObG)]G^e-g0j*NJsǔ}\S 6Rɇ(S6h$mfբrJX=G iWZdr٧e[hYb%)6"fd#z֩5&p+e)dEìT&a@#cWj+,.n3Vocg}U [Ǫ8F'kPi -\z2krEclDЪp2ߔTt7i$MjXq:6cvZb8Ҫ 5*u ''o,}66m%Z6喆!U Z+YmI Hڔt0_Uk tzˢPX3viw [ԱFIUQKK:KfDR6-E)m-Ie$d RL|fWӨ[Mir"0UlQ+xM]2\RbáQ5![Um $.6i-LPxD4=\|Cñ<¶1+{ @}L7<(Bq3]J 1\B  5"tN=2i7R~"+BJ88>PzO̷O~^}g 9 -Eۥ^3X2|T.zߊcX56KQMEc֫ :Bm\ZF3aFŢhKf4*n *W/D5(?heMECl\?V%gZ,5CQuuF%'dS!"Ejf4\pҒA˨yyTC V6ڴK>-JY10J~NTevQhPXR+ŗu6)Ԡ!)BަmTI,v,ѪQ3~BPĆ4-rfHr1 k6Kxe.P5Z SdqA5k`5-Z!V*fX'@sq+JI _ˎۂP&),ˮuxAc8IPt;cIݗ JeKVg eJC!MY]K-j3E({ӆM{yw[Z ;'6x*Q6ژ&fBX"(np,m - "R Zz WزYW7()6ni h JqVL6 5uL)nbV4VV#Eg}dMli۴K.!%rMEgKӦ8vF3:D2ɢrTk)ShaTCp9frÞ(y%7 RmFfR˴ jj ؄Yj(Yte Ĝ51K-mݢRq[EKf[2z9i)ix N;יy&CªU1ű4QE])@U*1~3[h_6$zZ"NƮU!ע5lli9/ˬSo17iX6ƨK=H6IJ$ޮTԭes UUMkɥ4k.m*RIN55*]XͤTũ:T}zF1Zn7T\Fa#DիTK.РZ&M j)6mԚҐR,^&e 5ډQVSZyFl-YPI*q)&`h+mJUit? ,FuI K!1UrhUDiJP*Q9E #hmN 9DUYp MdS3/2KV@Ózz@m5%J]IJ[4BZ gTmhj0kjHq,z yNXGf[4qL*n: rmh!Q[jEJc+ HVB"u|ecv&$(V{6m.TNш&uY'ߖi,Eь,Ԛ&FɂekV-Mf/8a #5L9*3bef#F -QLHj`ZLusXJ´ xv 0~`eư2Rw]/R_ggyskɬ?yz)Xl>hSV9xJC[Lih7)=D}Nѿ1i?^+dE.W۪h,Q^juϠ Y=b/-f{"޳pJѵkA,)U <0v>\\rퟧהּ@jsWJ;ٵ=t`YwSR/Vާס=خ04_}k6V bγb\`,`9mm),- iFZe瞣P(PX\\?44ĥ^4wuVN5,c@EhIe #pDr*B!70\1FBF Z"E*4iFXIc*ptJҌp|THʷ줟!!气%f2023F3l$ͣkJVLОpɸ6FF"nFaԀFJcL.Q_1D',%$6lCcIaKA PTij&39mLJ$P_ڲS7^X#tma$$PCDZg׏`1!E pH3i5.k >jCD)I p%S= t{aH<O+"!jaJj'eE `1J+!3줰t8A,QHpнGSmL:)QžuS:mr E ʌ=F6)SPcmN@SI R-C5%)F!OgpC4̩NpuL@`\t&Eѡ6C[(%*CTqBV$\x+L!)!V{ [Q914A)>hNA}D_4q3čE5G&`ԧb.*Afº ecGqt Ҙv)L[0ٔب(mbx:Ff)=B±q-^ 4N}Yv -z4q@"tؙryzh CE9ljLmo@XJ t͋[Lqr|׭cۄgOqpgC" jDD4 ǣW1*emѶ:(> &,4 K=SGɨ5bmcc8-$OmLo]qN Y5 i88N6=BJT -5I5퐧la82Z6'6ce8d=²bP cyZ>0#DMCQ&e6j MB|'EyL#0S1$8FCIZ'2bژZH  3DBz:)NoD:N̤W%LaN[c*#r 5Behy<ـ-.ؚpśhWDJH;1r)kl)afɤzI!5AIlEsH 6R!`JIZ"?RHgj M31îID8kZ8 8!X)+r4A,0r=EJnMϭ#mz1 MH;Cgm ^&JYXI !Ƹω r3Gb)U!jQu [Yk%Øpj^YB g8oaԘhT!f<'3̯MJ35ؤ6`CI+N);:1'RtFg2*QOx#&V{|&pIf0CIM,pDq2kw4ᵇ6z aF&4k"3I?6ߗ>??ϺuضmCCCLOO*BIDAT馛;ֽ:(B<Dz,nJ<SHy+ϖ&^&F?:߹Pv`%`5YUnM{kw{fIJh(z£Ō޻ sS= EO2琣ҖG{EY\X -&I}CR5]Z*k>s ?9Ʌ4.=DV94[Qno`ݢO`ie쐞pl3~i}h#H6Ra F,%cϼVB"Y={|`3Ry?eN[Va=oxTñ:ۥfDS3e{]G Ysq> )ņCqC&ǘ6L>ṫ9!Xa䶎T_^C^3Nןs%w,'$*N`: _߱Cg3˫mqpWHxٷMS?B{3D'v s"f$3CD~nq&k%5 hiEO~ Zτ̟agSkֱ]h‘-.3?g&QҦ>2kQci*΃>ϕjsZ5p.) L&᳆YPoii/uܖœ8%,[7Z%ܙbwLTapgఴ+ǽ%(n<}zp,“WVȧ1j\g?G&&H۪Ƨ;'9Ȼ]q⇘(#5ft!rxh=sSD]^Ce]QwY`Faj0'^1xx i_ʹ;k_wZ7㩩/%6?T)IG,㳬i,sb䞧x<3 $tKbgc KW3c식TdΜ/"k;Z#|}">|K[ /SJ*k}ldGR)Os\w^lSX0z,Ep?͍ݯSG-RK%Β.PF<`E7) 򙇸׿^"dr}?8\dr9ӳ<} OX~ck r$`}Wx5aowO~r Gyfy gq-~T̃mJ/q E& v^+Lo~caǙ̇54 -V  Ja"+Jr?<zߧĈJAm+:{;J1pn}_aP~$pnb7RQp^(Q?n u7cV@\mmNh ^8rՠ.X E*׏ ZgoH‰[J CBTQG]l ʬkm?%eHqru~R(C޲Va7\Z+,@\VʷnÅa#=R.#)Z&^ DrM@aWKV1LJ+/:T$@عp=O|%_+j%JOEDrҠ;m!+eھI2:Kl[ȷ^_2: %"pe^R?czDbE% KF N0'^aWrdFH%TL(+dbW*}2X},Уu`N%i9~5vveNܟO i9glYi@a._;v7ߒV>B/!/C\1qe-HR>Á2H DWEϝJa{w]dYnh }jXk^,gwLQm{&W蒴ZW7 F (1X/aDZ.߲et ַrnmi灱'MꍯrzSm]?Vu(2ݹ`P=x`v,s?՜4ձ酶/(I9<0$D|iՍ}* SVa7\؛ IQg|;?zz+|6ٳ}^;Fq#:Un}kp/3HeDZ]ݒ]:&;wK/ӟ4TN;t:͆ HRs9:t??$"wfz뭴Z-6oڵkb&xD"mƍ'"4o _~ްTF][),!uѸ|܆:R{W]{;jX֊{rq0/`^Iy+M2Pfy9o$" Tvڃy{*{y+}yz![Vꫛ Rȏ˼˿ٹܕWDq._~nE;X˧ xyꎁ69x4o2r4FY!נ~!:Ҫ=de}uxE~uei9 w@_dr[1^_-ԻGߞrF/o#'wOeҳcM[9vuǖJ]}ݗkڒE`hn׃ڷA+ӷ1}pJzepPV!ܻo@vuX^{U}vNyq@ZUݱg`ރJB#c9v^Os ym箬`;RSrtρS'+Њ-t2t{Oy_<ܤ7zeG`fݕyo16fyC=~?0gcoK杲BWwǦS]{:`9zџ{u@W:=?0] qh=> cΩԠ\s`^!uus:+vWJ6x I!m˴m0hX&hDO+N;e[F :t9֤XHQ\Za]'lxxMǦXN -7 OECܶ4\p E^`kb1ZVFbUc2f#.RD95 u x VA!,T4s{eEr'CmP &nLòI8vДlШU25KxK'8jnRU 'G+,:4[VvFDc6 :ՊVĨa FQkrĪ!\%E;Pk P5,իHaB29F2IfvR`rҪ&IHȵW  gP(UɺUXQq.S# YP']OP7%FZIި&UFY2"nMj d"95*nmslUXT< Fh*4KIBlQ%kIzUufy%Y>US2ы!f~A@3rȶkXœTy6 GArjm5lQhXkrfRUh4NRԵ6z; giTZ"ҢC~Ѡ\.M<$Z[D 8g]bEyaE4<\z+ɒA!R4:Ǫm*jRT霬թk ('BMQVsyJvOnQ^X0HV[ʑ3#%SoQ+L"o&i^e[rp#DyNtmnAb,J4";w\L56XZe1ORD`!Crz#>k+ M` UpUʆI*P7o4/&lH:OaM<֩kE jImB"']jR_*sVdfw~`]jIV 366ù?Ol ܈vK'1"Qm0b V@ " SӉ>ȧPA| R')!2I14AS,|E&A?PڝuNN ORQq$q'$xA~GRBq5 - %V,DH*B(J$ T+6/5-EFmIZZ[Hrh4$RDJWQ@A<"=@wCH!d' 4,M%ĵx*vDqHS%J$ki(bD@ZnE2buILdOGUX넲.X0#ziAU|E&d͋<:#r*B<4P6юiubx(jBq@$&M)|UA}0)(GiXYgȖFif\ ORWUa'$FmV#JBvZ"~0RнGǓȞL|룄!ntZ Y0UB %!xĭzP@ΎiߦH6d]Hd0uvH7[ ,G06}Pp.H J8(m[SQ%K^ɴ:#-3)2""edD8RfL%i NIjJ5$,?ֽ@% !P [r.B0Q ,NjJ~j+8F$HYļv\ (A YHmI&%d@G$3RP B YuI6&a;Ý9UQ倸iiōI;k{XǮHa"iFqX#q1GGw T#IF C"%"Yj%N?[_z/#fI.~#);#M%JMd6jر3CE dl]E#t%[)"zL"QmTP%Q0T e$}XFw8>q' d|oԘD4!{2iJ!xz@3C15&]b$8Jpq L]CdTTG5#TB 1 "!Ɖ4b 6HeRV@UWPPTDgOs UP1HRmcjQ$ D$z4Ca KtPbر dX Ð0 F8 !7a/@_'X/"룫grŮ[@ .(" Sv9!Id@ xy}Y@ @"t@ @ ^] @ A@ %p@ @ x t@ @ ^] @ A@ %p@ @ x t@ @ ^] @ A@ %b @ +I$ Y{/t@ @ ~xG\F4(""00 b)] @ 1h4PՕnwE8맜#t@ @ ~Ĩ4X< C(0 $I:[h@ @ ^i(XA@8s9A@  y}Q|gvvWxfM @ Yپ};,SVٹs'D/ޠ @ @1>>λ.6SSSܟ 1H?U@ ^(bdd! x<8mI@E=B)Y~zF6@ H={{>yZ-i4MdY,OW:\9@ WA V%xE L&W_|L@ @ x|{@ @ .@ K @ @@Ye(˥*A-@ Ae,˽a(Z}Ee(&p@ x!|0(Ϛ \ b @ @s. @ @@8@ @ @ @ /.@ K]}'[Y4 zyq\,+P[j^UUd+YQUu.@ ŏn&v(^ʲL,qK]udY0 |EzYitt:{0,G_|Β$N{}5#}3<9,$IHC;Vi+n2-Iqq(b˖-#-珢-_ Ð͛7^$ q'JpL `vvx<#_IT*yY~)[$ A]VVy,d2Pپ[dYFe X{_J@ Ϳ:#m(bd=">4CCCuu|'JD$˱}MZׁ[Fm6ðז/9'[n赪? :y||jOk{׍Yp8(B<ՕՎbF, uqt:뺸}%I`ѣ,--qJz8qD4ILNN@ {=~MӸ+93p] zoe=C$t]M}GӴ~\{R)Eyމ?̃>lܸkM}D"A>;`˖-Hau{!AiZ0 {awA*" C⊗Ķ+u閱wNЭǮSi~;LWU567 u}iFb Q~ۯ}o/'x}csAK{5MUU pE6v{jeHLLL~TU=q!nvyk^LOn_b1q(bzzzvo>Wn>C̰͛Yf mAޚ@ wu}+&Lf۰,3(FYٵk;v=p|GQā;I$\{<=z 7/|8B~y衇b1*b||n'NJg>C&<7Osϱ~zz Ve裏RV$۷si ~t:6Z q8x wuarWS*0 ͑J Oc]"^{-o~l6K.sAuۇi\tE߿7<3TUHGV; d2Z_ ō7ȫ_j;<*Lo%ك9r7} 0u.Ix9y$;w5yM=cl߾g}{kf z~x(Rx<_ϓO>a@!Jdzz VR78q}qĉ^}8r ^x!z׻0 }j5y袋gǎ\{qLOO{ny?`,p}X.r#P, o^_ٹs'wu7|3s۷o窫s]3V$_E֭[N=\2 ###]y/xFg :Ҿ~z&''F<<6n駟[ \ZwW߫(\wu\y啨ÇỮY~=f|+iv}ʚW_ee׾|Ķm>O !2笳bjjӴmnVv؁80=333ttÐX,֋6\{߷m׾~7c򖷰o>;>.@"=x9\.cƍ|رcܹ)2n:$DQe]-__qft]'H055浯}-a2==ٸq#w~;g9s%3;;˾}[$d2ɚ5ke4355 Ik׮]56m%\B*q^(KAk.`&wDƵ^w>UW]֭[ $sbEQH$2;;7 bcccX D 8 >ɓ=dرw@g0dllL&E]woy[xcbb}vqs%؉{LNN255A8X!7q66mO_2>d><N;4PV93{R)wo~G}.ÇH$PU,=ЄΞd/vݻ5kPU(Pkǹ++RD&atti$_e7b1֬Yylj'صkmo>LdbCE@ V}WOu]lFQ^%۶qX,똦$݌v;:ݷeݷ=a$ 4׎{Ðl6,l۶ߔJp*rq֬YzoWN3:tmFAV#L255BV?߫7lep7\:z6l+ @ ~0~t0h6t\,֐ Q뺽v~ Nκi3̊ߛ&a ՍjQ݋allEՏ4p@ _~,t8!wskn_G(5 udnN5,r @ /6?@ @ /%Ď@@ @ @ @ /wM@ @ Rܮpл{0 ߜh5|?n|\ғ z_,9/V @q4Mh{0CCC+?e>xmq4Mt]'Rǥ܎`'Zt:9QQy?tqm\ehhE @D.cllx<{a$h4p]su[gI^n.,#IQ!~uRe +,`~rwr'jVضڵk_y{B-Fq8qv]ٴixcǎ133C2ȑ#lذ,Йq("8@{dd۷`.#Ç>yt~\rQ @UUfggd2=z5kyKKKaÆS^|?)en{>&",iy7AoDQɓ') aH*bΝhBV1xV[l!dH-رcLNN299yqٳgy{uGpQ @`&_Wfmoc͚5꠻˱cԧ> 'N7~7ظq|88ç>)nfٰaz׻?L"@Q6o}?{?ǹK<w}cccm$Ibݺu}E>O{n '~'>ij[n}s|scff۶YXX,&&&9tۿ駟ӯ5k0::\}&&&j( c6lh>w'?ɗeˎ;>[\.GLMMy"I _cW^y%t%վTJ%~|u^ETaGy뮻˲8z(aÆ.@ x3<:tuyyAm|+<;vD""?IÇ|C~7iRհ,ˍ7 7܀mOX=g#^z)+G?Q?|>qg077eJ;vСC/>tEQ-6nǩVoFu{1;ƍ7E]}G.#Lai$Ibll\.ǟɟOqmY>Os7O}+N;_-}<ò^TwG.Z}z#GpM7f;$Qofd2G'>۶m+=/y:qP7{n??|笳"sؽ{77p??޽{Y\\o;RnFfgg93^rmJdvmէ?in&CR0O>$fg}o~>|k_i@ ˈngыuqfmqq'NN޼y3xL F-`&!l6 Ð/}Klܸ__`ay+dfuIu?o`̠wH[lֱu6ٜ=9g9qMl)n,(ERlbo g~0 ER,>><20xm yh4h4o'ļrc$q*RIee%KtMniarrr(--ikkCPPYYL&?ȫVezzTh4kocVXLjERaۉ.ڸq#CTp\r%fgg1͸\.Ο?իW|2D"|>f^/*r\|Qvh5}h4$?OHNNF.z1 lݺ*}]o`0ѣTVVRTTSW^ZeCCC?Ν{_0011OS B?gΝlfz*{EX,1f>ٹs'?<WEqq1d66ָ8X,lܸ|_t1lڴ N\.j\>}ӉlbۥSc2ro>}iRRR{$GB c"]ڈEF#*2yYbBȚ5k"99+VT*yꩧDGVSTTAT\ߏL&jV^^'OJJ V bҷ{N8&==rZ-pW__>_|;v\.qFF#yyyfZ-999a4)++CTR^^εkP(sϱqs[Ѱj*l6& @QQ%%%8NlBA0$++3E:VȘ^eʕ+×p8SO=7Ml6=˯)J}Æ 8N'^bQ~HII!BEE*+VFaǎTTT0>>N8fŊ$$${nm&BjqH$ʕ+q8t:/MII * RIaa!T**++#%%5k`0^/){r TTT`p8O񤤤j*$))??$))Iz^#~?& NJ /mJ033# 45,$~/%b峖Zd2mߛGTc GKŬα? {5v͝G$D&XK1k';fJ@}- | d"VfNYgL vŅv>㏖ľ^L.bkqq\t999D"n7FQc}l3m~>KgqMJHHHHHHHHܙNaEۥnߏbY^~GP0D$])"a0an? U02dYz]$v~N>Yw\!'tޱqˑg Ä[ #l&?wlyIJJ"%*3ux'ټٖx܆COeI!"@4ۥ;(Q =Z8Z%]eg1|hy\ֱO"%JR\Og|ވw 8:tэ3 fʹsL&P2%_I =CGD99r7w}JHHHHHHHH|kŷxW;Zq<­GR)r>r]#?Gw&=}^.5ʖ|~uh9]Gr\Epm#|y1??q>>3MN2c|tX;/ڿ%$$$$$$$$`$ j +Nڦژϊt6- ZZV@ mM jV(/ĎT[2<ޭ+=ރSr-|K0>2AF.R{)I|kշ)uZrf7)Rl.e]r,9sZװh,j4* _:D)CTaKLjrLYc(?Y')P^nѪuv^Y / (N,~|k>Z-*=|l͟mɾ}~H1PXD-N}3A ךKtS:Z,Kۋ)M.EPSb//%yNu)ؑgsesfV9V*rA.~ߡw;ſsѼqG>8=R7Bs}xb|=NGyR9?1f=9{8{pgw#Gؕۉ#G_nKj##j?ė  fÛdo"9{"7ՔJ-Fd _G8&A@A1xUqtAG[\sA^76D.ildI la!/SSd2F|+W%~ ro?mgIOb77,>wT qvebrq+qюtI5IqLjf|k>Y,a?+WvۏV>ANjGk>t ^$͔F8& 08 Dž [Y֩VvfP! q^.|#Ge]:"XD#&/S;R/cO ߚO!D]"O;+PU|DQ3/;FNv".tJ 4 YɊ{ٝ3 cd~E\q3gH%.{.zǪF EC>Et00ɻjL]VOBBBBBBBB-QȄ[a?Lx_,~y&&>|]Fn#Qv^*xc7rrᗙ͡)IO?^GZװj#A‘0pL)X:k_C)Srj8py2 ax~ƂEcbVŤ6a  #O&Ș^{ILZMD"d˸>|wakl##|n8y+qy]4M4Q7\dž hZYw< xD"V:Vo`A -xr-D[`cF]L/Ls ;w;g7q8:;{s/SS;13>7VOT;7Sj/ugWţUioǿͦ!m2AJ"ݘ޳A4~8y>w.167&)2. \g^B$A@ ߚφ  / 'r0 3Cd SO3_vqy@IHHHHHHHH<8wT|aslJĆ tMw-i|jM$a}zPʔ*2͙'lH毞+<Qrx;tS:&aLٖlM46Z+8- *-[H75EaR!), fR?(K GôE+~%,SNZs+Kipy2fJo'ÔqG2 trAΨgk++1ř%"SOKg\I8gata7Mx#Gڏ29L.Neb3Vyri-7FzgzQ'# FcmZi |A8#Ȉp,\`A0 GīzA< \RZYq~_M:`AqS&Jy-~&٘dDUAKyIܝAI>tݩģӗ RF8&u~,˲7LJ"^O@g# K  ^U*n!V%*$M-S߾=Y_4BattA!bjo/͂r$O,"CR|8wEHAD!"bqj"˄ϗYa'*+D' ( Bm0vpvhT eVBBBBBBBBⳃ(lHFQxtlAF 6kY\\f}vh4t'Z0I,..@BB#EF$% `aa7 A@ pk7/HM$NG~TbU=>k5%$$$$$$$$$~XNoc?"PDFGGFRa0i `V,(JT*׋9_.H]]t:t:444`0Dk磶@ ʕ+DlS]]M(b"}}}TUUۋlq%!!R$v~V8V 1 Øf)JJMww7]]]| a6_9tLNNRSS(VRIGGd2Z-555ܼy^Z- FFFHHHS[[KWW(pD :ɓpʪ}q< < jkkIKK{d..]b``B<>ABy{raxx,d2V>3;;K$h4e޽{ =/U9|0 lݺډ) *8qV8=ʍ7زe ܼy N>ͪUhoo7$)) Ν;߱rJn7{%;;ՊZ?!pϓrVtt:[I8r;wD&;w255bݺuTWWs譌W^%77DŽaΝ;GFFfyٸ{{{ajj@ @kk+d2Aj 0HvQ)ohh_'##^O[[L/UM&Z~6nx_ո8rssˣIQQf6n܈d^ٸq#yyycȠ7nj)((@p An@CCNww7 r bppƺutsssuDE~zz5kpexgطo&1??OAA8nAwʕ+tttvioo'҂ԩS,..o>233?N6z{{+W詩):;;DӑLII LOOSTTDCC)))OJb``^xcǎm6f3ǏK_>s!ٲe 2 ǃVe~~GիW)--/266墷ĜǙ3gX\\ߦ+WGkk+UUUl۶MnddOvv6'O*uq~?h4fgg^OJJ_\ŋ1L?bpUy&& ߓ(7o$%%'TTTH8 pFÛoNcpp .0<<,2>>ٳgt:_fCo#gΜ!-- >>ɓ'9<555c6),,k֬رcϏ~#&;;KBBBBBBB7Q?1Ie~ f^x^`zz@KK ˘fBܹF 466/\vy0cccO<]]Fww7[ \.A/\p+V`2ؽ{7gϞɓb Bc4YXXX |e"jm۶ϊGz+WA{9vqۢNNN?NJJ կ~I&&&c˖- }, ֭[F vݻw]Dضm۶mcllSNt:ZOT^41vYYW\sU tdd7nqFyIMMeݺuc0׾Zή]HKK#33B 7nWhhh@222 /`49vؓ& /4wUЧ顷:@GGCCC?p;?O"''E|>mmm 100 wt {vvv2==MAA`a4 a?N?yyy466===\.18rrrXQFGG%^o2xꩧ0LZ+W9q/sL d2T*p^,I\jj*\rA@P ˩vM(BTv易BQQ{Y$t:A]@ aff6֭[@ZZFn/_2!!h4JCC===͛7@.P(Devjjk׮vhi=;@NHHe qqqX,ضm/^$//T8<ɄBB>,\vmADjj*8NCjj*xPD ۍJB&a6q:_g2ZZZB, رLꨯgrrZMKK :.\!11LB 3>>0Ì~:O$g@VV YrVrMHHHHHHHH|Q SSSt:f#K]gffl6w_ɱbq$%%ڊfCCRHOO`0J-SO!MMMa^xRSSIIIkR^^8HKKc׮]T*Xb hZ())J&&&h4xqZK/ntڵk)++[$...NGJJ $%%aZ1DII LLL0;;ˮ]v|bQ(βyf~?$%%=RgwN2P(L&R,_R|>6d2ӴΝ;xptшjexxlVXCѐDrr2Fٌlvp8H,]P`XHKKnc`ttT\ X,RVVFrr2dddgp`XHJJBRQXXHYYndb!!!~T*l6RRRyaddBFF"W_}TsA>`bb,^z'{F.?Nff咓sKzdTTTbŊng||_lذ oAKHHHHHHH|A677Jb,^UܩH$i?@ @(" >p=fA6w$qe.Zfƍ ibO#'Bl>p@ pWp;;|>:@ \.g͚5aA /Z~Xϕ= JHHHHHHHH|6hN Ak~?`P~v/̋[fb~?2[^IFY\\sܭ*JGQfff>ڄBA@R177G$$$$$$$$$>?R̷)h81fq\c~_4w\~.g{4}.h~W ]BBBBBBBGHs?Ho_ } į BJ˅B~FL%,sёdI^|h4J XUYXWw" =p,\zv#u]}zz .0??Orr}fRhnnZ,I4;;ŋ')) CUU---hZ TWWc2D+F~?OH$Bbb"CCC\x`0HBBvjz9{,MMMJbdd BܸqF qqq\t\.\.NcMJJ=ϧ㡯3SziQ._ 6 JESSׯ_ >>WR[[K{{;:\˗n|2mmm ƭhcǘtp!Bv5n.sss򗿤LLL~JKK*ƅ }}}H,P(Dgg':£SNQTTtG9>}4Q~=‚XQa)^Q*fǹtcccvz{{p---͑LSSb}wם… XV\.W^ ɄVe``K.y=y%<2 \~V+jv]Jd2y%$$$$$~Sx,wU ={LFff#R}jj?Fnz_,-VWWG(ft:gΜ-[099Iww78qUVoMRR>}7RRRnGPNٳgIMM044DNNNL?~;wcǎsNn7Gehhuq>CZ-ϟ''''bɴ q~zz=rA0,jVD"455ׇb^{  >1 zww7SSSӃd7 ==CQTT$&Z{wLNN2:: YYY088ȩSx駑Aq6,Ο? ק F||<2Zzzzh42y$9t$%%QPP SWW`rqFF  /pI~iz='O䥗^pi4 7oF&xj@UUŢ~E\. ttt|26'Or`bbB|w݌k.QAW deeqI b``7np8y&( < x<}N'ϟj[oa6/~AVVBrСC477Rd޽g``߾}"ZSSRڵk8Ndy(|>"ׯ_ ĵkgvv7|+W"ɘƍ177'P||>NSS2L<\:Ɔ9{,ׯgӦM?~\N 菸v~no顢I/G ƃ(w5 D"߿L$===77ڵ033#*;u|g+L&>p+YT]]6l`ttǏVddd>nܸ[oo!7nܠy=(VgyRٽ{7|>A yV+p lقL&cddZZZ0 䐟Omm-n@ ܲx'A4ҥK ꫯrz狋\pbF#?>\.=_Vx%//+Wb0YѬ2n"cccaF#h6֮]ˋ/0>,999R@MM _W~rNii)v&''e||Ɩ-[Njkmvvׯ3??/$''SRRr[R͛7o~zoNZZz 6PQQA{{FŗL1t:" c{Gcx?8OU~ݬ;;;h4kFuu5vYE.w#Zf\.WFV3==,Ԅ` 77{~ E^nܸTWWN#;;8z)癙viii~t:eeez֯_^z"Fq^Ve2JrS$!337or\.XNL&\.[DVX``ǎr)jjj\ˢ1+`̒ [1/^|ڢ"Bs]GYY&blBNN7nܠeI2Tضm555$999b ͛7c49rȲqK+W>}'*5(2l.\kBT*;FGGc+&vBXcJO v痭酅1ƻ RIJJ pr ì\R\۷ogӦM|ߠA8}Tmm-uuu~qb!NbvvN8&99P("iqq   n)//GѠVŽϡChjj*zNCj͉% ]]]ߍn@JJx>::J^^^O{{;֒ZAn3??/5^OYY+Wn:t:mmm\e׹v###ry^JFFIII"6H$Byy9.]h˙,,,zjL&A<|x>=!!YV+>͆bydY>77(Fk,ŞfzIJJB&100@jj* J%:P(DJJ ###T*q:Q\\Laa!WFPӃJ'99 X~=Ÿn  #Z˂hXbEEESVV 333$%%Ztwwc4yj377[̵l6t:1L$''cXZdddp8(**rcݤ`۱D"z=V"77xٸq#hMrrI}nnNLRXr%F16nȊ+8X-[C&/ y,`0$EEEt8N1$&&b6|$%%ݳލX 磷$oNqq1sss,,,IJJ III b:;;%552qV\yzlSZZJVVeeebZMee%999dee~z|>NS'%%aZ1cXcrr5k֐Rl~?PTTTVVb6q8ZXVRRRHNN&)) Ʉh4bΦbJJJ&&&$33Պ崼\TdHNN`0(+V%33QJ%8NoLOOc٨$11Afll ɺul6SPP@RRSSS~lLiii~1>%Ο`(Jr9R;P{pqYjxI  !!;vFbb"t:)++ٳ())]u:ϓ &SK^^qF uSQ^^N~~>8l6IFFFظq#6lvHMM%// fYLѨIHH ==[Eղj*1D,}p8̮]tW>p8̉'FV}cZkk+UUUDQZ-;wX^//g h(sssT*,˲0;* 51 j>p LOOI(n rh4hOw$v`2>W ⧒{arrSŲpl|bx8 ax|F0~mX-jfغxRsg+d2F '\-ܗSCP:/&%4x^%%/ I>=Q⏊KCnATb FV|e>~# *$֖Xͥ {w_ܦ}DQ{rqd_HXٝtwD{8&!!Aj KHHHHHHH||}.2*K@`gF L|6D2 >rEAAӌqq6n܈BXwwwSSSC]]v,V山10]YTUU$]rt:~!.d<.]bppN tttŦMD$p dqq * ߏjիtuu155N>BxdZ'?Xƍ477eb }Lb6L&rk׮؈`D.rQ*^k׮҂dbffK.1??Obb"---477K0ZTlimmv366Fss3rх*F{`x8j?|tp%\. ZZZtvv288(˗immebbz L墶^N'===\~FHKK, "8x eeeFژ'''G$ZÇѣG7d2q5\ P(``0p5Z[[1Lh4|>@@|rɓ'fՌv//8NN:EzzXpkjj:P($$$p###b)ԥse<X߽\.k6d2 Bv//8N>Mjj}zz˗/, r mmmr~055Ejj4KUUhZdbb&> GX26߱_S\\)w5]q KdӦM8qېdl߾E]\.'11-[p(ASS r֬YCUUh hoogjjիWFEkTuu5hՊ |K_bzz6 [v6***駟Fs N'^AT*ikk#///GBB͑졆a~QYYIOOjTZ+W%"o6EEETVV_tttpq B AZZO^z%9"+[/K]%y8= ܲ566a9~8HnD":tB={ėH$B||RSS"33.yxFFb?Bl۶;v*VbŊT*gϞ=[6wAj5{졤\Ί+x LLLx(B,8,>z`lذZMCC,,,SʓngŊ\caӦM.!!!!!ܹs,,,P[[+ZIKK mF?LMMjV4 wd~~O?B! زe SSSx^CCCttt099j[o100֭[j2??ݢeHff&n;w211!۷oGW_edd"z-݋^d2qeQ)K-ˑdҹD"R]]4SSSd2r9 "\.j5nfV\"33S$Fikkc݌X8R* T̕JPpuEَYN'sssr4 [l޼C]]G%%%`0(ATʛL!*&''%̑#Gpq:p%:;;)**"q"++ 2LKv%*++QբMEEׯ}# pkh4"ɰttt,C~~>555^K{.];444011 |g׮]LLLJ$᭷bll{]Ç~ dggVEȑ#twwäСCD"y&.]-[hK,Afpp;vIUUCCC|>6l؀pB 337nс^ƍ$%%pY\.6)N80\.zj8#w}Cꫯ2::Jvv^]cpݔyG64}aay{UЗƠG"NM.3==-fL&& L`jj Ʉfpb (..R{rrrcƍzEkbŊ毴шZ&77)((]e2BD"<3L&&'' BܹL)J$%%aZq:f 55U%077,<  fkגb! aT*^Wlq4=RDRVVFBBn͛7O8&## A-?lذAt]lݺIYYJ}XL&󑝝Mii)nJHLL$99BJJ $RRRHMM%!!1ͤNAAA\\8YYY`6E055 1b2X:Zb|TNNnVKNNiiibb2EWCp\OMRR9990??ʕ+)((ؘN'PxV+h JJJ!##Cgu:eeee5esaXj*Sپ};)))8V+III޽Bvv6Veffp8LZZ& ^fCӡR&77y6o,dggll۶M\kFJJx$ 19d21??O0$33۷{cժU撒"P<fxXuЧuclffF3-//gO㪃>66렏P렇B!:Ɏ;z099|lٲ8u鐟O?Ľ0R[466+rGΝ;G8\1 gǎbh4JYYٲ|W\annN zܸqZ(fݻwn[[-Kģ$z'mnnJbYzG}aaai&f|u~ۙ!..V|ij=;܊~؉8^/^Sɽ~uef=糰 ƃǼRh4*zTN So~ٗD8S1<$ ,..G\\Dĸ~M.jCh4J0DT~n.IHHHHH| 022p_ N B!Q{\bLQ~T"7p㎽-..>8? @'BF w5w#foL" XQ煥qEbgR)&咀[ ge\K{*ᦄD}{ަ}DQ{rq.=?jWp8]C6K<$w /},+g Ϸz'fY`0xGKםFx9bnc|VY\\СCTWW*fZŋdffʼn'p8~8 t/^dqqQZb;%%%3VbpgϞ%11Rb|Nkaa .{n ?O|2۷orhk.A`~~P(ā(((b\vz{{YXXʕ+bp8l󴴴0>>N."մ`hll_'11^˗iiij>w (2~1۷5kpZt:=Jqq1'N@PxhiiE&''9vXiիWihhp˗btt^cY[\\… 444`0F;wVz=O3>>dvvgۋnqg͢v@PpeiiiARq%1Ln͛71Q]]M\\ܲ{w LMMqyES($&&riQEgzziP񶯿:. ZMuu5^EJJ Ü>})ijj\OO/^bi䃁@j:;;Ťx<4=466⽃ l6<^χGP0::Z^V\X֠Ľ ]h( kb$֮]~dlܸrj5ʺuPTDQrޫR\ |{ ~?g 9|0ׯ_^?P(Fw^Bݻp8Lmm-~!J7|e2xկ~Jbrrp8,&կ~}}}{<66Ɖ'8vo&.]zz{{Zp\hZN<͛7/)z\pӧO399gΜ`0|W\?ܹ́sپ{_Ӝ?A9u߿_p\~z㿐97$$$$$$$$~Xp+d<{R. LAinnh}'s<===477ۿۜĒ>OH$ǙW^ahhP($… \x/իW]VV__F)1]VeJJJ_ղn:z)I455QUU8>,YYYB```ǏĊ+Pռ QRR¥Khkk#GJff&uuul60 r92zChrz*{{۸cmŞ d2A RXXHmm->SSSd2  ݍ#-- LVvS__ի18VZXeN?~hZzzzPTr d2&&&b͚5vV˳> oG.Fq:( >CZ[[d\r1@r9"K===$%%=Ҙefff'p8(..ϩ)4 Zj(--EPSSC0$%%z刺LFii ߏb! ԄL&-*1˻bR0r|Yk `ppT:;;Fp8ܸqǃl6HOOWMMMڽ8Nn72Ltώ,,,ֆL&CדNGG@<=+++ZBBtuu!":::!--l<cccdee {,Ccc#by1###(JRSSGGR111lf||OmuF,&S*n`+VrdllL Qy&> Fcזa 77A] Ϟ233fhhݾ,,~?ݨT*RVKnn. /CTb0`Ŋ"FEH8@{{; ɄᠱVK^^pk[XX`nnZYjYYYFei@ @KK  ~~z(**" ڊ\.100 #!!!!!!!!```@̳QPTX,e{RzLAd{9DcffիWq'{f(Y? b zRRC 8vdeesO- qy:;;HMMeΝlBnn..]" e˖zzywx%ړtCvvc bb vQTh]"333b2Ow4I?ybCN˅`kٺGI4r/O1F oH/>OJ%>-g\\r\̫0Eb1&6h ? 0::*~Swj(8 A|>ߧ`0 #`PCb{0^B'/ ]A)K>MKp8?鞡PH<`x.=Xʣ'V~ ~)hJj}F"/{4g31G-`D]Zs% 1w"!!!!!!!!x<]IzzܲrxB$avvCв2rC d7h4~l!`a<]?;;c񪐐xoc?b%C\xvXJasj;0>>.ִWQ*T*.^ɓ''55)y&&&azzGrUJ%v*}0Lj#))~_QSSC("%%7orafggIMM-8p&seAVӧɡGՅ${Hqq1Ξ=˕+W0DQ:Dss3Ǒ#GM-[,s>t萘=`߾}D"ixD";h~\FY*$..kp8i⦥ 륭ΦTQtr)4 .ټy3B!ywYf ~ӧOHff&p>rJ<gϞeǎdeeя~ի9{,VU,vQ6l %%Zj% RUUŮ]z+555l߾yV+ b 9{,;wDTb2ɓlڴi.9å 񌌌؈bl۶w}bRRRX,F#Fx<:u7nN8ASS&3g0??iii\.N8Agg'IIIx^?NKK lٲETgffhjjBTDCCqqq{ฮ3OF9 sΒDIe9$ٙnjC֬ggl`9g D 997htN@hQLx*{7**qyHKKx_Nmm-*p8LGGܸqLF}}=cXI1*@P(JMMM$$$pm455QWWVd2ʅ #11z^D"9wwh4runܸ`6{|-:::شiT*HII… \|[b6 ׳l2{=6nHuu5 k׮uW`rri^y^=k4=~Gqq17n@*|rZZZXt)Fp8LCCx^cccQWWd .0;;Krr2TVVw c^xf3s%+W 1r4J͛LNNn:^tuu 6*<333X277 ˗/&,Y(ٳg!==ѣG1Ffgg9qСC9sNjj*|F[rJJKKd ֆlFdt2>>Nww7رFC[[`;vP\\LWWX\kň<~kk=TUU=ц=67l2 }Mw+^D? 8vVnݺErr27Mp\B@ E"v/Kr%Mlܸ!.\$8x <:Q [8b~z (,,d|>21 Xv-D"(--j4jX,233#/{ZΣAN:E _2D"֮]K8fzzWj*Z-_WBw? SXX(-Xz5VvE$aɒ%,[jbڵHMM4&&&avvDFattkײzja'dBSUUs=ǩSp7o255А,[fR)Hp8,T$7S/bccIMMh4FYY>dll Z-LNN233baddjl67ndɒ%t:ظq#,]˗p8fҥ[Dr9/`ٳ 6PRRBkk+,_Q 333tuun:صkLLLL&#7o|E s t+s"HDXV+Ju֑$))),_L!`4ٸqvyڵkH$∋d2a0+jm{\\6l0x<n]LFFF[lAVzUFC8zhǏ#Hx7ty@z*'(ʕ+Whkk=p֭[222nҥKHgg'o ===x<innի[o|rz=z!>̉'HOO^ϯkY|9UUUtttuK,zXHMMd2o4z={r)Bn*++p8L__`{-HP(g&,OTii):td2pLCMit8ٰa111FJJJvٳgywhkk#&&\(pWO{rrI! 4Z_ghhw}DD"PT9sNd2W^ RL&|||g>bVNRD"ann?ɓ'&Ja۶m( f3eeeX*\]d I$f֭ 8.T*H_|LGii)h4JJJpܹL&fqq.]DiiX'#̡)v;iii( ޽{L4 ,_˿W_}qyv/JYl\p 'Odbbgܾ}&y&''eJJT*`ǎZӧOsqV\( FBBoM{{;W׋h4222BRR?1P(F~~Pפ۷C\\K.rfttP(``xxXKLrr2R(455"sÆ _{R]]D"!77Rz=%%%w^nܸuҥK155ůk4 +V %%~N֮]ˉ'سgp7iG2>NBB;* ףnZh4hZZZZJEkk+PB||<===At:K.ett1R)K,B0 AJ뙝dErh4\.grrLl ))A&&&)v2??boVV+xL- NDBLL hZfFFFhjjoopݤx 000 ##'8U}\.wt %% n7Vt#ۋd"77Egg'yyyw L&J%LLLT*b@ +zH$88N " 55ՊJBՅ%77^OOORZMJJR/pLMMPFd0iiiLMM1>>l&++1l6jOSlBrr2y"l6qtuua2d$%%D#T*avv;wOVV㌎b26<]]]HRrrrp8$'' ϼL&nD?>RIzz:cccX,ܹ@*`P~~>FI!:000$$&&"SXX(l{n^uRSSikk#HBBB!t:%%%BF||<999ܼy /l͑EBBx<j5YYYׇh$771FGGIKKLJa1dddpn7999LOOC8&55lov^0FDD"FFFu:;;)ett\q8twwc6f``Q"<3GАPg͡T*1L6k?IC@tУA;v Ά 9@,4ПQ=))nAΞ=+Ddgg/>|ϑ#Gعs'bY$I+"""""""4yd"F"xO'HY $Bhge$ ^W>vG=S~D"fgg1L0 B>T*}l}D"Qţ[DDDDDDDDD>;D NK2vh'I(ZT` B}W6Nj! ̅ujI>A'?vgۍL&{a0j%..N,9 UGz!?#x^fff0333|>V(1p8\݌n3??/xp8 EED>B!_&"""""""G?o$ n[8p88qՂ" 9r۷o Un seΜ90YYYLOO{nYd ?~W"HHNNCaXZVyRRR緿-A222hllȑ#̐%԰~ZZZHNNrw^ZMss3gΜ;Fgg'8@cc#˗/'pUN>-TSJB?R4]]]Bn;#db߾}Xo18:Ot:NGRSSdzy4͢Pcǎt:项KruKybbb̵kטGv=.n 222-ddd<еx(**bxxCԄd"&&r !Hرc233Ñ#GIH^OCCǏjȑ#GtX,8~8ݤ 9v555ݻdzzG"zill$--MpQ煵n!sss8qJ|> """""""8p8<|dE2!! 9x 333lذ၌ETan޼ɑ#GD"űcG||<+Wd2q ^{5$ x<K^^LNN2<mFzz:;v055/KAq۶m;w/"ɘ{}6^z%}Ipe|>6m`0Rd֭d0lܸqxF""ׯ_6AqvvV\T1'',vMAAO{J|d{(Amm-o~bˣ@ HAH$Xł\.<%%%d2"f+WDX,j @SS9DBB.]ˌhXn mvs1ZZZPT022͛Q\|2Xd 999B!j ˨B`ff{O~>L(bɒ%pM]Foo/EEEl6v[[N"=='O222ҥKioobs000eشisssGz~D8NM8&66͛7syBcH$RQQƍIOOQ 8v455zp_#GHIIAv9~)t۷#Ν#ޙ\NGVV8qYd v9|0Ӕs9Ξ=իWx^2.]Rl6^w'xx嗑d:u %>Ncc#v233)**b޽lڴa|>ܹs? ݺ: pMFFFeӦM466bZ}6[lh4 iool6VC00eeeLNNGVVbGL4]VىfllRcrrRPz^Z-ۍh$??dl6@RRFغu+IIIaZIOOW^!77ٶmr!N';w6zzz>.D0LOO366Frr2gΜAPrJӉattۍJ">>^8OKRd 0 ( 0al6$&&1H8fRRRp,`6 %%an7iii-">>^x59233#QOlv300@llP2aYw\ Q8QtC`0ׇB6/* b0/ɛo)7044L&C+TmH$aXXV9gln7A BԓȣfhhHpB9J%&iQ} 'BaϚG7菓BCy&D"z=-(r/ tf~~s AqiXt)7o7DDDDDDD><}ff9X% ^W<Ï{ÁRD||ֈ[RV?׋h|lH$΢'M$fG$Ya՟.ǃM.pXCq~|ZH$BtivQzU>^ط'OX>hDǓg>mr""""""""{ W4IP(؇!;8#?C8NVngNjr=kFã'&&khn:`'&("""""""""y Oζmعsi"55}kHсb _v[ogϞnf6nHee%|_eɒ%]|_E*{nJ%k֬a˖-rurrrxWkEE555F/"J9v옠'Q__OCC?hiiڵkhZx Nm6/_NMM uuu\aZ}BU455K/}Bs[[[@&/ʩS-[p*C={TkJԩSͱj*6l<<ر'NP\\̺u[% aX=r o! qm^~e)//>//RPP@$رcB!z-FFF8wp^{egAX,$&&RTTD}}=U{z$ajj.m@Y)))\Nnn.6۷ouVp֭[ZBvv6@'NPYYɊ+p\~^{".:W\A .\@*ϓN#??LF[[/"v={͎;H$ K.l6h8s yyyٳG^LL BR)Ǐܺui.\ZF&t:1>|7nՅhرctuu x"F:::o~`@Vsi[$Xxf Ν7ȑ#RZZJff&W^e͚5;v" lذZf… ر\.KRx"---呓줽]zDuНN'x^N<p'OqܼyTʑ#GHMMٳgr *H$Çg||NG ta3  qU˙`0pF#t:7 ZOD$ P(\px穩ARq X,B!V( ̭[8wN$<۷d|>nRä Z[lrXnկP*,_4Q\DDDDDDDIt2 x^$ W~b1>TmDBqq`dC^^Pdd2Q\\t:IJJT*˗/'`6IKKҥK:uQZ-˖-### B!>Lcc# xz{{ٴiJK.rJkKbb"nLf38rrrh4dpppQCUUU133CKK \p>:;;|2>KRQQ׮]cժURѣfXz5GennF޽{JOL233q:dggc6 8pVd`00==Mrr2yyyrAùMԸsYYYD"add .i&"Ȣ0s׋b!++K@>fgginn;wvZΝ;Gzz:ZW.D"k׮Q^^.l$211ڵk9|0466vZ㩨E6N>Mnn..\`||Ǐc&''Q444`0Xd 6l!Zcdd7oruFGG9x @@09q>O d8N\۩Z HJJƍTWWS]]Mmm-V4rrrp8t:^@ainntr%ZZZ0<8Ze߾}ܹSWH$¹#}P`0ȹss7nܠCpM|>~χB BlڴfŊ\v )X~=\rioot !ڡP3g`Z׾Fzq\ËD"$$$P\\Lff&,Y`0H(B*bHMM%??_}JKK#;;>_,d2z=111LLLp8H$x>M<DӃL&㭷"366@MM k׮ER|'G" +p:NZ-dffWղtR9K_R)rL&n>(۷ vAKK @_WlݺJvArr2/|曋-Hjd2J%JTFAPT*)--ɓ`Q(t:!9nh4rd zFٳg9|0=׮]#-- RImm-J8.+Ww]. _!Ν;&..H bcc9x }}},_J, :NkZ&&&u#jJ%jB9|0nMTJff&lذӧOSPPѣ CJJ T*o9uoЇh">>K}}=?яhhh -- VKll/VF.SXXȋ/HGGHt, .]͛7ƅ  _HRihh@"R())wlŋ۷;vP]]ʕ+1ʹ|>ay:Hl6+HZx^ BQmnn7f%z!`Zh4hZp݂XP088H$`0jt[(HHMME`jB!FGGJBbll D||I||#66$^/艉 L&J,JRHPTXd2!gtb6:$0>>Nrr2@%ܿXcccQ__ϟ rۍhjL&crryҐJ\.☟̠h>h4|>œx<$$$033J,nJQrxqA]DDDDDDDD#1gffp8B@"z|BN'=OjFH$8T*;=H?}>^ǹf#&&BTQ$*gh/ $E {%"""""""G"055\. H$T*}Ir`0aRL̅FI(7`hQ51L&ȳ'yзE\(GI ɐH$}]L|Y&"&&橆\.zhJԞ|ct|Q]3*7Q$D"BwmD"~~6?LLLr` :O[|2*9r1x8}4CCCկ~ș3gH$| _@r v;+V`]TWWt=1;;㡻(LMM y*EEE>;;˞={ٟ*i7YDDDDDDDD !я~ߢ?H$n7`Oqq1H^AKq wR9zzzضmvP(P(H$VZEUU9viiia֭ad߾}[HSSl|>'N+Vzihh^ݻ7Auu p%r9;w$33JJJP(twwK/1==́bT*刺e˖^ɓl߾;&+ RSSSCcc#;wNf`0w^hmm%..M(Zbccw( ?N}}=? ':P(Ē%K˗׿αc(++cժUR[[ˆ 8r+WDQUU͛tRQQ?\.dӞf~d2f̤'=%##㡌#DBAA F!##CFrss#''G\_c}5z=D"ˣC1::JLL K,!--1 K.EPp!jkkv6oތL&ŋ]@FF:NAAqqqdee166FQQ>Jmۆ`ߡPzzzj***˗/#YnuuuLMMq-lBff&K,Aqq, ˖-cӦM=z׋^gO=,<55EEE$$$xwh4šj"99\t:SSSLMM%a#77SY0^JJJHMMedd^ի$%%cl6} ~ӟrU222hoovSPP?/l.ZBijjbnn^v؁bhh|oNZZS_^^SK.ILL 0zHg4CMMMkl۶۷o"ٿ?v"//wih;=;` :;;ɟo~6B^z`0H `͚5_+W[=44ĺuڵk455QWWGKK 6qFGr}~EmD"f HKK#''l![*t:X,@JJ s5昚B*VQt:QT,_i^ٳg_~.  BDe( 򕯠P(!%%p8L^^?IDAT$6x@ ?>F"y稬ڵklڴrٴi_W8X׋ffNVVFӉZF#HdT*t:ݢ*J,Ξ=Ν;"..Xrrr0Ld2d2JV\.jbHIIy{Z-vR)ZngAdpMeeeO,7wllgŋyp_W̠0r1Z[[ 11pE^yqdddgg8N~? se˗/gٲeܾ}A*j*._LRRVVl6/",Yxbbbۿ[&&&###R[[D"!>>^?ްaΝcΝx<RSS;Z _*hP*BhZFcǎ% $PPMc41L|>.\?ϭ[礟?ӧOyfCpyt:  Ylp׫<55B_"CCC>}MJJʢSزe ׮]cݺufCT uSSS  2]LOOSPPd +( K^|gpp:a^dffrE 9 lܸ jNtNY,*++1ͼ #1Ou|پ};ǎm۶C:uNN8[o%<#Hl6H$XV^/&''d$$$>>NRR",pN'/MP(ĥK ++[>P^}mm-]]]H$xE@y6x$ 'xχ#66t:Q(ϜQ177JؒL S>K\ g,z}O$~ca=ip: ,Ý;ww?K'Qfff+pn#D"a~~ydrr/z;Fms$GG?r X,ձ~HOOQUr Kmm-F񁪸G+ ?Ή'hmm%77i~ˊ+gϞ=\t ENNW"))Dnr??'? ̈́B!8<```AO̙3Ty(//+Wj|2{aժU׳~HIIo>*++qݤsI~m󉋋 166Fjj*H{gbaYJ%T&&$Z)ߦVKJJ#<fQcǎvˬ] .`9{,)))?6DUƄ {5$>j}rFFF(**пGQ46$ GEP`2P ϿK   ~d D[*rj/;v!---ԠHNN&Ċ+͛H |rp @7_".۷ozT*e8Nٸq>BCUѰ~z\\.P(Dkk+[nE"Inn.gݺuX,Z[[IHH ;;imme|>nܸ](--effZ TVV"ٹs'YYY VXRdpp^zq=۷oG׳zjsׯ'&&)y1444Krr=U(//gzz^{r5Yz5mmmZK.Q^^j%--ӧO܌T*%66Ly8rrM6qQ6l5Ξ=iii^^JQQd2顾P}6zfggs.{299ȑ#OIIp0dffr% R~;Fa&++K0~?Ν)f3477ka߾}<99ιs{Xt)[ltKMM P_]d2Jعs'\pG\~{J Q__ϗebcc hZvŋxcuuuܾ}&&&vP/| ={^FFFxILLԩSrEoҥK,]fǎAz{{)**_&99>^xg3Ֆw444pu< =z'N`4͒%K(((W_v7 nݺE[[lܸlswa``y0 b fff^@Vp8 SYY{EDDDDDDD5k[B&t:IOO =f{Î;>y8x _ʺ`'O222·mC Bmm-555o|+w c0 زe~ʕ+iii`dd1֮]\~Znݺ.k׮e͚5|>wl6ejjJ8&Z=>>^fFCc=EqF XV0ٟ:K399,R|j`0HYYZӑORR`0Hs% 2 Z-@ɄdGZl6V套^ĉ&` !!p8L  ==]ؐzH${vn:1L$&&RL&#)) LQQR{rʏ-ygĚ5kp:\.Yjnx Z\J" VIHH@Rz'55UȜbjji~?޽+B[[TUUQ[[+N꫔GDDDDDDD9ݴT*җh|l Y~ Μ9Z d?o(r ^_hZfggڵk={qضmK.pn: Rv8d2vEMM >N=/)))444jYv-:իWbΝ8qׯ#ɐJx^vM]]YYYYsEl6E!)))Y,&''q\t:V+7o;w0==ڵkrp8h4҂FaΝl߾jH$B\\ wÀj5sssA<kj஗\PHRdl6111hZ\.r\04 Z*.&aAn~~M8FףVlH$6 'NTbZ?Rf-Z>hp:J%׋VaQT E>-n\. D"½xTLLL`2P*x^\.P  "4Z\OR \G"IJJ"d|8pEee% JD"h|]EÁ"IF#JݎRD ~$ R͆VE"^Ǐc?~CKϣP(|WӉRRtV>p8Gsa%T*H}P3Gee|>@G"|:H$LOOT*@D"'ꁎH$|yDB @Rj`aF;"<<8׉+ʧ2HǃNC?D7*Rc"""""""""$*A>=(ɞxt$rV<5T*3h>g4iGpw()""""""""( s7p8[. khQ]Bx^<v^ߏ-H`0(|>n0ؑHdu^xB18۽G.:[gt|x{ҏDE v/~_8\sYfppJy|^p݂&9ܝBAG,|n< sl0ֹ<]]]B!!5%a._α`0HGGP_}E[TM~\>xDe=@H$Bww7W^,Zgt! |Eǵc҇B!aܸ͛q㡿kQFGG?$["""""5+O~$ LOO˗/|'eڝ;wOJww7k֬y,;z(N\OJWWWftt˗/cϧ_$'' }nimm%ɓ'9|0,YD n~^'77+J#)z^Ξ=dE[|j\# >\nݺ%lK|[jV˗J by뭷xwضmaٳ\.&XV}]v& ŋl\.l6{0::J0СCN~~>'Od۶ml6N>MBB:^zݻwp8hlldժU>^/| Bn:yw'&&ڰj*9q.\@" illdӦMB!.\ƍ}błe||UV!P*B! m_W8N%˖-[n/SWW(cccTTTȮ]f /5yyya08}4ɬ]Ǐ1L9r䩇fd2}}}Yx</gLF[[)))deeDkk+#HPTA,Y5Hַ%h?i昙7dvv[nFYYqo|>8q^W8_zz:+Wd֭$$$PVV&Qfff H$dffyf^|EϥfcddH$;wϟܹsc||+_AVgǎ( N>ҥKu555MVV}}}~JJJtbZ. Jrr2IMMZ&11\Nkk+,]bnJii)w`0֭[d{ܼyrV^֭[ z}6%%%&֭[d2QTTD$X/!룣o}[q\dff)]IKKclذAbff~/_ΪU8w.a|fgg|a),,ʕ+{,[ \N [پ};?~zˣWrA|[BVDaXHLLDR/Gtwwcr)P((//ƍH$VZΝ;9}4'OD''SYYI\\K.E"tR֮]+ly^vM||<@sOzz:۶mcpp-[ J`䏌 pwsرoی~x"uuu| --@ }H$q1\.lv~?Bd\AA7n7 ˗/W^-e-IqqqLNN2;;K8~ޣ9CKK G7P(NCVBET kk@@| 344$R\.g||QF p :;;效g߾}cǎ100@rr2eeer ֯_HC栏~QT !-~6 L0dtww\\R999r^`ٲex<6nH `޽444^"ʹstڵ~?9rq^yy&+WÆ &sN:O}}=lܸqD"l۶ ([.ҥKt:#99H$ºur LNNqFv;+WdffQj5J Vbll IJJ O|.A?{,HR)))z=[nn+B:$ osss{QPPڵki4 cccܺu%ߏn'P__OAA#5:XV.\RYn: Z[[cpp9RRR\KII "1L^:(..pj*ꘙYOZ۷nSTT͛7}vưf☟ϝ}dX,֯_Omm0vYv-all LFrr2Β5V\IQQK,R233IJJ+Wd󩭭hmm/B`xxH~~>mmmի9{,gΜ!/GѠxwPTB4K.e,[ dž (++>N'*SSS022š5kٳ믳tRjjjy&6l ??aʄ ȁaC{9ɡRGp9FGGy7(UVFqq1555G 5klڴ iiia۶m]6aٲeTWWsx饗p:8pt:;v`Æ zL&/"Hzy.!]Fz=/n:㙞fŊ=88!77˅bbkF&Auu5 l޼~VXH"jHG7ʘ ^oPXXڵktƒ%KOaa!d2N>7ޠ86nHKK ok֬! RVVFQQ^DDDDDQ>If _Պ른+Tjl{<( nn7f@ x/ * ңV V(T*aCB&+Xas~~D"3 t:h4G1{-G?݉zJP8*9Rp:FBBY5ՊVEP*B!#Z'pm?!RI8r!HP((J|LL0>ZvQvrHHHg8FR#.ھ1܊]-_ L&J@ A. ѱFD=}H$8)))rY~#1χ\.GR ޥ*y6l؀ju[~d2`jxt' T*qt:( ~0_\.p^/Dx<A.zg ˅l6 yt̢z*Jxs. T*\HRt:z~* t:Gn|><P0:_ r9+. χVBs(fE(B. ( ;$FK0"znEY`Rt^;z~_&??Q |>!`adGRz%111\.r\Ssht:Q(hZ!) ^ޫcK hpMTL&WvjFj5Z s_ kAtlJ%2LJw] R)^Z߷""""""O! AP*LE)Y5П$ a,@Cse^/7nLU]h?NOjepp+V|X{{;MMMqEzTUU yyy=VW >k֬!33g!@~~PC@?p7%n۶mfB>33n'555|aά^E]XQ˳R&*=T*?V^ux4OQ߇':N'>i"sss 9*~&*[! C?=_8w\ -KFd2=χȣ#>t-y: {⾢dh`0< PBqggǃT*}yq,R*O@ gG|v:Cd2#ͧ8B!b{OhߡP@ ~!6cH(b~~^y~NP (Z@)s$ _EtG"^;??p8 zg-\3 c q:¹[g8l6۷ochjjzi!*w$ ۷o?V$xp:]#=pp8 h żQ!-p~w|+Kkpa>yWf`ɒ%ooձ~EBz8իWjS(9rs@nn.VgtttvZFFFػw/LMMdNrr [ˏc ?Ç9q ^cǎo>ܹCZZ.{reN<ɺujLUUSSSdggSQQASSyyyB%hL|l6ͱo>9z(k׮i< eֆo~իWJXYTfM& NSUUũSؼy3NnSQQARRaQö!Z9z /+Wtj65H8r6mi4O4&!Hy v^ʚ5k$$$~B!|>DPf *nGjDp+ s}TjݻIHH*hG*ED  rafe~_>A| _}*|$axxda8qH$BVV=}Z:00ҥK9{,'N ɓtuuϻ˕+W_b:w9:΁@F0$>>#g!n墤OUU~,8SP9vyZX":{9[Lx<@ 7=.D䣾Q{rFGGرc̒%KLMM ?ؼy3.\sw^hDtttGvv6===o>~?CCCQr8u$%%ꫯR^^,%%%X'ŋdddrJyVZȫ>8dddt:蠱ՊZvsR)#J r!Z-?</ؾ};|{c``$ /2@ӧOI(TTTc-[PYY4W$](LLLv)//'!!‹/ȡC}o~̙3(J^z%:;;ikkCկ~cǎ1;;K  55U<ܰa`  (_1^LH\\.]b~~+WRQQAaa!455xصk&ضmz شiWΝL9s :N|gpp N"9v8@ff&^zv,Yٳg3`+AtA, ;)QD\d[-[Nd_$DZ%Yeɒ"DL Hksx$̼s{{}J# ̒%Kxg_5v;wJKK < k׮套^"55^/UV}vnztŠ+o~Cnn.:8Z->7f_Tj* ذaxN?NFF---y饗hnnfx<._,қMBBW^! f0LL&p8A.k.._̵k0 vr1 [nRS۵k===dff 8p--- իWsYG7D&111cUV裏Vx &L0aܞF#""jbccF566Cww77or' b  111b`իWCtt sHII!''ŋٹs'===+LNN)9q׳dN>ͩSuuulٲGYY6m90͌~zrHtR?^j|K? k.كbbbjַ%) &??:9x ׯo-RL&,ZH>H$ḳEBr۷n:\@1==dbٲezN8]/gyV˵kxEP}vvu-::jjj9bccYd :u Eee%ٳ$333DEEqa:;;|2F~!8q5k /T*|2?QT\tq6nҥK1|k_iV+7#''իWSWW'4ْ%..+W3ψه";;˗8<.\ **??aٲe9r;vׯsE.O>$LƳ>KOO۶m`0DYY=[lY`m2oFGGdllNyINNV+R$V%..Z-[Frr2; +06l %%ŋl6u<333DGGo|fzzzp:׻`{Jf޳tuu6zy[Xa%--d1\.ЌuS$[?Q^N'i6MBB{%664333-(? 233O rt:1 /ԇ+V`ӦM=R5 . "mt$%%1<<0 tbϥKp71L0a„ s{̉'!99FoAoo/r%K<0?>Oχ"//ˑ| /"LMM_gppNw Irss rssyGYv0zwM6yfl6'O$..}qe~?ݼ{㏓Hss3Ŗ-[Xt)r={p)q\bss5VZƍRɮ]0 |XVn*4C^ٹs'>aJ%K,axx4111x]˗innGDhZbcc1466233ʕ+ S\\իW)))') ^i`0ҥK~JJJϧ0LZJ'Ӄlfɒ%QUUZ 6,6|>SSSvTRݥ\T*t ĺ 7nz)j8$^quGzow^jQcٷ055Euu5GDZZ.kw\XVfffBT*233s?駟&33SS=q'tXb,h) &L0a~J蛱ZjXMy:׽~`͝u\ҦBPr|gRݥCە3L&>/tK|1oyso0ܮ47ln~7ʺ ǶT$N>0>>4iii,^Xc~{t0v׋nk_ZX873!i>Kgҳ5N5N?999DGG/({o?."Nc{ժUpN}/qS&-˙AJo|CqֈBrJJ 111j~?#55uܾ׃f &L0anAl6fuy{e2v]h?%2 &̑-i>8V+z$B!V+[2 7FW)"##46H~7sst@`84_&L0aZJr]l6 V9ra6 vd2a4E-܂hp#x "l~.| l t:xOGGwlfcvvVHdX+F#bv\SZ+fyz%;eHP(ngvv)?,)0;;'a„ &i֮^OSS||>rssXEYѣTVVVȸr{9*[l'Np%bccIIIb_fގdi{>0l$''.iii?~RZf_~+Wy`t:vs).\ѣl߾Ǐc6"))(yA!22riTt`t:~ʕ+EP($rK].HyZy)oitVq\v:!F*[WGGǏg(JnP>Of3*DFF뤜*{HRRRD/Ӭ¥Gz^ )eYp"C^WdҐeܷϫJ||<a3yBp8|yHAl6xR}rXgT*8/l!e€RRRDN< @vv-mȑ#\t.VX'8u$$$qInn.edd~FJJ |Onk^#p\"ƝzKK fcʕ\~w}J7ޠv D5/$2<&H"""By^q,ESK֥HRl1LƊ+;Fzmmmձn:&_1kVILL*HzrX'is P(h&L0a<,']qFy\d S^^޽{J*.)sr 7oed2KDDHGG{'̙3Awd9p;v젣pޯDՊ D(b044Dkk++µkسgpCcڵkIHH@J\B||<]]]tvv SII 7oȑ#S\\ŋk prJVZu[@ 4MMMtwwSPP@FF$&&[o 5ᅬl&..RVVh$??/? Xt)k׮_dÆ < 孷bnn6233x< SSSb!22ѣGE.5kN>b,~G`Xx1[,ۉwERaXxgo~C~~>˖-96mΝ#'' Ν;gŊb^ AҥKT*vIMM FrrrxݻRbw|ӧEEo~{Պ%%%DNN۶mIJJt&66v-.. \2Ƞ c=FBBo6[nEr9 lڴIǏGVV/ĉƊ sss|ߧ*l6b̵otR 李N8dKKGGpCLMMeŊ(BhX~=˖-nsQٲe=Ä &LҖV]q.** ͵kرcC˓m0X,tttcǎ.'..vaL&I}rJKK%22rA~3gΐFzz: 8$/2SSSzbbbHHHX`yfV^Myy9~!pCUSSÖ-[pݔqFt:@l۶&F#k׮8|0W^y[{`rrg<\r$@S(455Q[[Knn. p!vr…BZZIII[6۟\   PzK`0d' 55R3-[t_vyrI6mT*vLTTUUUͱ}vVXf6墠sUr9FdrPTdzrJyt:Ç͒%KsE?SywԩSp)hnn?vs=w&!!.^ٹsscJDDw0tvvb4bbb^x ]JVQ*h4z=Lll,|B>==֭#==ɓ'jfoAOOPÇ,ϟg}rV{L&CV/xFFFr ;vtELL qqqX,ӧٳg=gΜazzx v;TTTo+W233{ NRR=b4n5^OшQQQTWWdRRRK.q!nJ(̙3LNNxbrIzz::thp 8y$[n?!IIIfx rss`zzZX,Fѷ?CŋÄ &̗jCH7L_}U ٸqC0oظq#]Nuu5Ν&=R( >L&Kq\\rVK~~>7ndrr_DDDt:crr7b2P(`ll >f3Wh42<<$޽ŋocѣG`jj`0ȁXr%uuub ZRRB0drr~J\.4m?)(ZDDO<477Ѐ,_=!11~ *~l|>~< :hZod 㩧!JHK(i.t\PPXXH\\ΝaZ(BOll,z(U(b>d2qqqhZN< 111"dέRzSOݒ9 Tqqa***0rRRRr6o ?J.SBBGtt4 Ɗ,w#LCX SO=EAA ?i -qZlٰn K~̤:{ &L0]}Л9s ccc$%%188(ϭV+K,y`&}ϝ;G]]. Œ%KoUP9HHH[o166Z&pQ&&&TWW355ENN\֭[x<۴c֯_ԩS#P[[K0F?99B [nVݻ9wׯ_֭[wy پ};*jzll,+V`Ŋ( z֭[蠷\Κ5k0ر`0H__r~lj^'))zynzvZ-f/L&cѢE\֮]L&1 Onc0`0ƍY|9.\Ep8(**bvvTbvv\ŘdAQ l ###϶mۨYv؁bnŸ۰aׯ_grr[2118qqqT*F#W^%==9J%EqE %%%jvލԗ>IIITUULnn.={Fc=999Bh$''Ί+"++Kt_+WRRRBII DEEa2!!!NҥKZFT*ڵV\``ڵP0%%E'%%z9wF$ LNNj%..e˖1JQQ2q._iiilڴ lقbIQQ6c4y7Ÿ]t)TUUaٳg\z͛7rFGGٷoEEE;wjYx1tuu+WNaa!& FCii)W\]vb Yv-%%%Yx_·~FΞ=K0dffn7Of޽[lʼn\XFdee111ANNiii?nbbbX~oX,Ν;'|](l۶Ip:b̬ZJ%K㷿-`aT*4pMYh{errQ(\| 6KUU Ҹ&$$PYYIGGѴ266M<>99SXX({ժUDGGSWW'Gjj=Ä &LAL&^W&133@ \' bQ~?Aӡ]BIIxjZ B(J Bzd2Qt/iCR97k4vR@$=#'t@233CDDHm!TOi/r:8a!׃N699I\\jZhz9 3g%Y&P RRRNR8^p1"{aaZ[~?[,ZZZn7~L\._0$iŋ}ί4nl8\.eT(B9}yIskn4iz%ife2X5O5PX&~:+ʕ+466bHyݮMxfK'ɀwzJLo~wGtVX!h8}4333<쳢__w3,9}"ujj)B:%K-l楗^'11Q<ۍ;Y= &L0B }3VZM\\܂7w}I|yowa+!I,I0yE˹wjMneA!m%?&A Wgw12_pX,ΊSR'55$?iz^f3& @Jy^oフym?nFJd¯122sd2v049ԿL|-z픢O^Yh?H 咯ݐ4WH,ƒZ~oyED~ff˒`0 _vIyM)„ &L/;l}su{֠KQ% ) i:B~IOu:M_p\"x$ XiJmp8O &L0a„r ϷӛQB}U-P>vJsOva|<-L0a„ &̗)';HgzdjjjAarrOef|>FQarrRlLMM-H] HRsv}>ccc`4Ez^L&Psss"t?B(d2( oGuu5Fۦ#gb.L?NS(O?4;wN:׾cF:˗/cرc;weAN<)6w  1?b!99??{Glذ6o'r_KfJKKyG 3cǎTJ@.G15507C||<.ƓO>F_$//uQ\\LEECCCn~tp`2(//'::/f͚~* LDDZ?Aww7G! vZ8Pxp\Ցɓ'oo9v !::Jb/\ҥK1 DFF X,r pC87|>* EDDJf# YF\vq:NX"vڰZ(Jy#a-[V:A^z%lقVŋ @ lFu TVV266O?Mdd0Kos|Ёz1 ~s;** -rL|;ο~***{>z &L0a„칫f}Ŭ]ǏRn:Μ9CCC} r{ N??Þ={xꩧ8u`dyfffGvf˗/第,rss'Wڵk<# Wdd$˖-#66~QQQիW!Z-@ 6}vz-ZZZXjr,tlܸŋZ>qEHLL o& !^l6s!|>|X^d Vy(b ֮]˿˿m۶] Ass3¢"}?GA.ͻKRR۶mcff*زe ccc۸\.MSSP;wz9<~պ@ɓ[_ٟ<#TVVb4'99P(癛c|GB!8|HW^%22300Аȿ.˩իB!nڵkE]h$#z~غu+YYY>|΋/%**,/_~[w}˿fq!v-kjjXx1'##6FGG9tcppϟ(~$%%ȇN/dbb??bٲeB!T*=555ΊTDc۶m54nn7)))jΝ;~@||<|;!!!&>=<Νc<h4rr9/^ˢE… \..\@cc# FUUsP(,466 /PRR"n唗/SBB`6sK&b z)222HHHGVS[[KSS/YYY\t ""[Vرc\㹹9l6<388(R=BgΜaǎG?bѢE\.qtsssx<^/( bbb#66XӞ̲eHMM}c.L0a„ &]`0(KnNDze|D__/"w9ϟ<7L=nK/L&Zoǃ6477sjkk RTTl&** cccb41űzjEמl6ŘL&fffVo~Þ={DTRPP@aa!Պl-޺u+71L={6BPVvz^OLL "55ZΟ?O .Vz(~III.4 * \~,8xt:~䧾("33C͙3gh4L&l6~`@Dղj*}Qt:oUj$''SQQ9uK,k׮'Jzz:`!׿uaJ? B{<ƚ"EW^ͣ>"CAA,zjg6DDDhe||ӉRrg? a6T*h')˄lfÃfggQhZ, SSS"{{{;MMM455҂`zzq0や &L0a„lP_d8N~?IIIpF# 8>a.tVχ#""JZZZ\.,Yr8NT* #G`X%)) ;П={`08yyy\rW2==Mvv6cÆ h4mۆwٳQNFF{;v El2 ۶m(vIee%?W.[oã>JJJ ǏҥKdddc4hJ`0Oqq1zL^ezzzUl۶ \NWW2Ӊ 11mLNN'rxBys?B!&&&HIIA&\vߩNwCP !!;N i +X̹Sj墣CX(|)KZNݒ%KHJJx^y晏)V/Bj?/1r&L0a„ PBߌjEV w]̞%|>7 I_Bs7o^onFo޷ם:_x2o.~=n.{~4>|K֖uqq4n#d}2nV*"2;$4Kl)B_pQZZAǧ>&""'fc||P($͏~;F#,ZKee%:˗/~ۜ_4GqBLOO377'rj?(v;:n~UBrtl6 .]"**Ꞃ}:DFFtr233?0A)GFFhkk###ふ(v}Aϣ.Ν#-- J%MNN5% 299d8Nz=n1ĄH(1==o[ QQQ`KTz%Ass3'N 7IDAT7wA'NmYưX,hZ^/###f4HVq\\.~^'''QըT*`NdllkT0a„ Dq?? ),,nl򓟠h>U/sy|s9T*9qW^ /MMMlݺQ>C]FGG+W!--MjjjXbsss?rVINN׿5׳l2ȑ#={Azz:sQ[[|mۈ_^cSYYIee%z~3:/Hww7.]";;; V͆\.lfjj'O3gX~8P*rq(yymz:::xhiid2QPP3rŋrxٽ{7Gbp5bbbPt7. ͉=33j'@ 4.B333ryl"3~?. \bAVt:E< ł^Wf, &rwbNvbXpOx FGGYx1nB jhZy.=o)d2`& V\.d2133ѣG)))AT8s Eww7o6]]]BYY;Lmm-LMMLMMQRR"7<Nh4Rf(:::4k׮[V^~eZZZsu~199Ikk+cccRXXHMM Z ߏd_N xw@ Z>`tt~_+W022BVVonj5o6tuu/>377GDDeee RUU%bHs]vqY(**bƍbA&tRٻw/k׮T*Yd gϞhmmezz]v!ɘf333ebcc m6.gffrY8}4;`ժU444b bbbp\`0---+ѣGijjrjyC.366ƩShoovӧ02 NLJ~HSSJFF`ĺuD[/^ {JJJHIIeǎ$ 355dOO8y$z˗/ggLLL099֭[q:466"(--J~ &L0_dG@MBXPXyy9~LvCkVehhv}.GQ]]ZZZ-63* ɓ'ٹs T*5~!`CT/c4tB=_vc=FGGGnh,\͛ZB BnZ-sNw\.祗^8v[{;vlדw]EfHNN1|I<q…E\\A߃D& (,,o>^*4m]v@!E6 d2*++9tIHH ..{TZZZ8qX_trx >˗… d2bbb'**J\.ϟzFFFHLLիLOOp8lx^BgTWW僣B!!>#gb,WUU4Gľ}Dڸz*o&TWWsϊ=deeq۩{XT*w&66FåKPլYFCGG$$$ |԰qFHKKȑ#uORUX巬^SNk.Ή ::q@FC\\E(f8iiiAsqZa1BITXh)))T*rm:;;ˢE4%˨C/H'CDDj&**Xl6] &L0a|U@|l6v;~cZJ_΋/Hii)YYY]ɓ')++cz Ánl6JŖ-[8Nl6ED ~:\v Mzz:8p:tvv2::Jzz:΢&!!AUgg'n"V+.jakƮ]HNN -- \.SSS8Koo-޳g?X,?~F'=22%a111$%%OFee%'OD&''>}quZ[[ņAjdL&9dddPPP BjEȧ(bѢE< s9zcHz''22{15zCBѐ¥KطogΜ!//ZZZHNNxnh"##Yx17HMMp099(pÚett|J%fۍ^~uuu$''Px^&''1DEEɢExgˣL4 ͉Ktt4@ @dd$NɄ! aX|>Ą𙟘bjh4bZCSTTāXn;vҥK\~Çy71ʹDccкK. Vu`AAtuu1<<@[oͿa˖-$''3::ݤwmff&ttt`Xd `6z{{nHtvv?!&L0a„yĽjaw^lBRRVD|ZlxT֬YCWWSSSdggb ]b!55²Z& {nv;v"&&Id2))),]46oLKK 6mӃNcʕX,:;;~_kZP*ĐGDDSSS$$$sNr^شi>nj5Kbb".]bddDV,YIJJ QQQAl"cbbb(**ڵkr%2..BZ[[gdeeGVVyyyq# }}};wNrggg`2`8N>dBTRt@ V\IBB.\ ))}144DUU6l ::åKcڵ[eǎt:***llذLuu5͛73<<(iiifINNXXR\\̚5k(--e^(b}gffD>ە3MRgݽo]INufffY佔IEb~;Ń`rr8anB!&&&HIIA.\>9`0(g!P\"rOn5s\ 77}~;V}ܺsnnzzzHMM%5R%K,7^n_{i|ymMӼ߆ &L0a8  %XVj5qqq #mnb=y8S9w{wǕivu{vavYwqu:zF# I{Iʸ{T*o޲|U$^>k͝u^&WPTTtnKLJJ'$4i5L0a„ f𽢼]ARχC&aq8lFjd4NC}6 E^fHLL$))IgrrAb22NHkdU0a„ &Lvw]Ұ|}V>_FvK1$NL&8J)|9g}w0a„ &LOd2P@w* r9rߩ/H{%K>g<8&L0a„ r?FqX, T*j8DPS@{e~w >OTdV1 C7zj5ӌj322V%HOfX'sssa4~zzzfBp055ETTVAN'QQQx<[g6  s߉A?Qs+"n300j%** \.RDV300(" fcpppu:f.!22 tۍFU`~w$Rl6n7.^fH'133C__333zj5cccLNNRYiii!&&^D6Z***8~8 -J͉,bGa099GӉPZʹsZ0 033#R9rBWW޲AQշ|bdd˅`tm###b0Q墿OddXSXrK Auu5dgg[m&+ l6F#x^DGGȈ h4\.i?Ngg'v3gΠ9s 333 peB} /255l̙3(J>C^/MMM\~ʩSԩSbm! q X,/AL&QQQz{{ikk珑1fffD8yȂ0ځFFFp:DGG ebbBC2e2J>FGGz 9299)ͦN&''Z Rxt5 L0a<8']V~Djr c}ЇyWhnnfퟨIPU*:uvΟ?Ozz:W_}FmgϞFVZŕ+WW{ի(**d2LN#!!_~jjjXtxTTT HOOrرc^{_;wr5ꨬD`/I("**_ ***D333"Ą8\grr9|> 9BFf3ttt_KTP&Ex/766RUUEMM v/~ fffdҥ믿NFFmmmڊ#66*hhh`ڵ(/. @RcӉF}>###"|^/###x<"""X, ӧORT `vvNDDDX)/9rbΝ!YF̼ 9rD?q~e)**_gʕ455ضmN j5jQSSݻHz-HMM%**q@ ҥK/ W\!++(ưZ@h4r)p6mZ\zׯ믓 X{;w8Cܧ ??E177'CÁB`( >C~ӟe9y$]]]f4 #PT\v/^L]]Ν˗7 t={{~ދ2shdzz^0od2t~?/2o6ޣ4 t2'O_Z|hiiRy;öm8v9998jjj(..رcRUU%қձe9Bnn.CCCLMMΩSX~=}999l6)--7dݺuԠRjlJ#GP__$##B8mmm vx<?~jybʕ ]p8deeQUUʼn'0$''CWW?OHJJ"**@Tӧŋ8ENOO399VzYZqff)t:6+W‘#GDJر1r9zZjkkINNFpi &L0Еw+^! SMVKttCkHNN… ]\.( qvÇ9~8`E366??vٻw/|>F#Qrj5 299O_W466 d%[eeet:v6 [ne׮]k P\\,M fN>n_n?? ~233IOOǎyٿ/e hkkcjjKj.ZZZP(dgg?1p/^RN:Eww7d2֮]ѣGؿ?㌌d~s!l6'NyŻp8k{n\.w}%KPTTDyy9O?4=== `XPT,]d!~{=f3N{rH299Igg wuu Xj׳~ÛJ"::gϢzx^HLLŋ"ҡhDD,]͛7g߾}$&&raǎ|'NnNa۷m*++  G}B\.G׋ h42::uuuBs Xr%TTThHNNfŜ;wNX=|RxGappB; ?d||ƍϧ\Bccc9rD<rBALL *nIII HJJ_;---bZy'//9{,/_FѐVezzyh4B?YYY 055 555\.O>$*~-ZD02Z-IIIXBcx}8{,+Vիx^qan'??_Xӌ244DvvhLMM100@jj*>Y&&&"++1Ngtt fohhq&&&$55H~v͙3gXn:JŻヒhdxx[hx^f188Hff&`pPHxGndgg\.GR' k LFAAIII:u֯_q\t:"##?UoR^^\.'11s \tj`H0a„pWL&[)/**GTꫯF2 T*.\@DD%%%lIQ*vN8޽{PcǎNd2ŏ~#yWFբh\.q={a>]SS͛yx<8T* LLL{nrrrHll,կp:|>Ο?M@>|˗7MZnYv-ַP*x<bbb8t-'W\!99kײi&Ο?Cp7jZZZ8ppÜܹs(JqRU]]Mnn.ɬ_20ºaΝ,^ORDT"ˉ'==jYb0ōXlzzsΡp\477ٱc[nl6oLQQ'Osɚ5kؾ},P(Ν; BA(=zrqJJJcvvV&JZz]trU6nȢE(**bϞ=e&::hnn&??0Wv477#3000ǩjh"f3dggꫯֆd⣏>kk裏lz]ƅ عs'_0 w WSSâEHNNRqVXXHYYj@ -\._L__111tvvzy(**7ߤǏdǺu먫ĉL&~?K,?!:fJ% Ymkk;bRRR(,,d˖-lڴ5k֐牌fѣGٻbkXDD$%%kŋ),,vz)))ᣏ>ҥKl6 k֬?sssCh)5`0Ҏ\ؿ?EEEl߾JJJػw/ٳUVk.6mիų۽{7k֬aÆ b|ٳBvIII k׮8p+WyfXr%?X,p}qY:::o{(YBHMHH[ /@qq1GYFѣ:u JE||8NJ%uuuÕ+Wxٶm111¼QҞr׿``pppA(:F#|тЊ011Cj"==%"K{+WrС乭_]4t|099ᠩM6PZZʦM$z>n-cQ~333a HJJLMMq6l@EE&˗uV,Y|V%99X14l ߏRdnnAJJ ѬYT*?q{# b0ضmΝ 9p?O`||\\ #Z,Y¾}f255@kk+*<1CX&33o|h4qP"111l߾[i>OMMMx<O^^\dYz5?8iii .]׾5ҘfjjJd󨬬\0].uuul޼YɲIMرc`Q]Fcc#űxbyP*Ĉ{Hʹj*oNddFX,,^X<\~,ټy3;v젧ihNMMGii)x&R{L*qqqݻUV!hkk61 O kvJEMM uV֭[Gdd$%%%( FGG. 6aqVXAWWp/?IDj4vnWEff&ZVz&&&0嫾^? 1;;+żo׋VcF.STTNCLNNR[[KSS3C0FvލR$%%E[1 ={# 1@oo/vLvIHH`˖-~N>藺^OUUl۶vZ-O<#|37mDqq1l޼YD'O299ɁX|92Zعs'ZvAILL$ xb ׇlfǎhZrssTPCqq1sssLMMsNF####B%}[ZZ)6l M+VA֭['6W\!))z ӧf޽,]TtAIJJx߾&99U $mj5۶m###˗/S\\Lqq1 SRRN#55nf3999VӡT*),,϶mۄizz:$$$>;vPXX,ǣh(++cxxGyDX>Ž;L8\.f?htl2233# qZ[[Z,]@yyyx<DL ~pj233qdee d Bedd@ %%%_^IOOG%)) ˖-< gΜ999r룷UV7*hkkcƍkz<lܸM6Bii)={vEVVcccf#55Riii!99իW ?8WfGTT999xbrssQոn, III]e˖qeyhooGѰf͚{y &Lk]f2GvSXXVtt:233NiKYbPQQ8Z~_O?L&''\OLLG󩭭G `0H}}{MMMeժUa/׷bZqx<D I3|Q1BˈbAVSf&0ͨ'L0aPBߌjEV%ޒ)g|;}٧-ˆ9},222Rg08l6~s>B!l6-Pi9-#%׍0/Қ*U֥0a„ &L2R,zR1)UgYy).﷜i䫲^nd➔P)>Wwv&a\?@4[0a„ &L/ZJ]z(Tg8/_vVyCVҿ6 "˿mp&w. 0L0a|]%ʝ"UЃb~wAWW} j-zDGGxettTI^/|>t~" bB!D]F#LLL磵L&111(JV+###DGGc2n\.gnnׯx0 0<<`Gq}/LQ-0B\Phꢿ)Z-JnfggE.lj\yXR= fpS0(LNNb2GD[,$EORcnnVưZr;vhE~>X۾#`jjT*P~qrr2^ٳ<+QRGϷ`퉈`jjz roxE&thR:nfffE9Vׯ0 \.kgT`0 7!|71LRVVFzz-AB[Ad2{^J644QQQ8Ξ=Kvv,p(ȂC0a„js?Q*wtt_ʕ+W^fVYx 裣477cǎOT$*JΝ;G?eeex7ihh`팍q%zzze͚5\z^zT233?,RKDEEEtt4/\qoSWWV%==Oss3=z]vVyWx뭷صk---q%OK/,2EQ]]K/DAA%/OMM199j%0</ZfppPxl6&''X,DFF.&&&%""χbA099Nl6300\.'""Br\"Bh4haxxX}c`4ٶm:(..fllqz=@qG@111r\=55n2::^GRa4Al6JR<Ǔ'OR^^N[[~8{|nnIkk+׮]ŋ-[py"##ٸq#sssb,jL&ٺu+NSO+Bgg'*ŋ//Dn_X,._LQQ?f( CCC P[[ˆ nyJ}'LMMa4z|>p: Qt:X,t\RLMMqU X,DDD`4 tuu100믿Nvv6UUUx^ /^Gׇ`0 ɨªUHNNsM3==??t :oصkΝ.~k׮ AT&/388Huu5ٔf[ưdb``LV̠xd2. 8?~ǃf[oPTTDAA KCCC_*+Vrr9?OlT*222PTTWW)94,ZӧOtvv/xXr%555ի4„ &} ʻvZvڅa) '''xswr'|cffB:ѣGE^~ //x^+NFBF24m]ٝ $ H &Qv-Y;N$3S5I2de]$ݭ%[,.%. bPmZl}TD{p!ZZZHNN <</HBcccyg@PjAmƎ;xW_GG7o?裴~j<'? ̠d f3ccc8N>#t:?PłlFncO?}硴s  R={066F?={'||}ɡCR9BQQ@3go|^FFFZj1L¡wvcعs'/^D*"daa1fffaxx\ihh'!'EGG'ODrvѣGINNf~9Veiiz>BAjj* x7ؽ{7.\@p%~-=χbn3<<Аknnٳj"##СC1d2/Kkk`JJJ444 HX\\8 SSS)?jlذ+W멮g??ǃ^GP~zZZZٟH?555 ޽{appN<)l6>|ӉngǎF% ͉'h4\|]v.fN'& Ckk+<G}6j5ڵowy|>IIIvMswnn_F?8?Xv-SSS۷2008h41Ldffc=\/;377+҂B`xxEii)[n>6oL]]KKK1;;… NBBҥK|ZXXW_%&&yyNT*%,,I:::q$--{ww1<~= \(԰eV+N"##CȦ.ɸv߿_^ڵ>q!>DFFSOQTTDrr2>,v^/s!>>{xd2>:())aTVVrdttt}SN x'HLL}Y&::ZgddPUU%xivr%d2nnv֭[nÆ qiDX~=7o!Y^UU!..+ž={룳B48No>JKKikkTVB0$,,\1:pE版e233y'X&!fll Z7Mrrr䩧bdd*A0<Vioof4CCC>A4 {eqqsαaln:rss9qgC+^Ν;ټy3pR ٝfFaڵ8p@8ɄV%++o~8NFFFX~=MMMt:1L<BWWa٨DHKK駟Ԙ0T8tV%''o|B^ LF0dzz3gΐBXX^Ow~? ƒ3>^OFF< B$ ~VKGG^TT͛Qlڴ0`yyl555 `6x͚5 211Aee%11{1233d¡磼ӧO yAgg'hZHLLr5IKK HDDAذa .H$RRRjrAT*& #))D{1RRRB;BuB[[$$${nt:֭C155EWW¡8IOOgΝLLLo""""""gƠ%HX^^{~:}jjZ uzz> bd2| `JAp=2--6, nٰalٲ@ KZ裏 0L(J6l@II f7ݍdqq0֭[磽;vÕ+WXXXvJ!9^  55pBVL.--k.J%T*EQQv)ě&$$R|'BP zRZZJyy9v\.Z,ct:t8p@ӡ`0HWWqqq X, J_vp?jjjd EEE1>>ΦMNBlRHNN&**H  y+4VfppZT*%..'xiP*vZz=uuux^rrrP(z6l DEE\:$#22R8ڰa hHJJBTb2dgg#˅ÔIKKC*b0yƍHR$99HIIc=bm۶1==MJJ ӬYFRTH6HQQ.T*6l`˖-䐝ƍ1p8HMMeddy),,dƍf֯_OBBuuu裏d%())attf3%%%B{nn.477n:R)l6fY;ٌ`TA㔕QXX[nh42<&''dQQQR__OQQׯg``{f`0`ذa `0(<>t򘞞fbbnƍIMM2T*Af3ʹ =.e4ٶmpX yꩧmX0 ڵA!?>>{!--M0/""""r[1蒅w\. iN'N&cV#22򦬮_w"䉵X,hZoe6:w(155u_렇6Vʕ+TVV7x~?W^ezz$˿;11A]]@L͛p8|Mv|=r }ONSȨ;A_'x䋈|Пf!t7?5[0šȐvH$~GKBRoBAAAyyy|لݾ{!9g`0Hrr2wh47/`4](%**L|;jyo"0>E*V<y,i+z)..fnnhlldΝw@X,Q__:!C5,,K.155ũS0 HR}x衇Q*++Ynmmm%11TfxWIHH@ѠT*/ FÇimmEӑ$>`Ϟ=#G{n:;;|>j5/. \Nbb"%//pCW|Vh0TWWAUU7ndqqˆCttFݰ@>`ff>֮]{ڹ@c``k׮T*9}4o&{?nq@`0f||i"##z,-- ώ\.!vtT*d RJaa!R f%dBPZ+WoAdd$}}}wTEb~?O~$mmm/2~/R\\\.7W_eݜ9sf!yBB/#11A, o&LLL0::ŋ cjj>%1L 22Zh>>Ƅ2FLL 333BwzC@ XVz*jH"r`tt>BDDDDDDv ̀vZv؁ --4&''IOOk RSSedd Jy?fiibx }! / կڵvac766F__ 2YnСC Bv'>>r h4\rEQ ٶm۷oW^aqqzh4nyGhjjq蠻ͦMp:TUU 9vPW*"J?$11LNNRQQJ"??|!C:6o̺uя~:]_"`8tF QT Ξ={׳rKRyWz PRRBMM YYY|7|o|BjZX,v&&&G" JvW\AV /pߒ=;\.jl6牎Q ,..@}}=333A(..ɓBN?333()) zzzC.o~p^/iiix^ٽ{7o6*lقBPk.'77H$ /l6ؼy3ώ;P(ϳrx>}N233d˖-QVVFCCq9/B?&66z Hgg'%%%PUU%\fqijjbaaA """"""w'nݺ(2o!JoL?$>>rXgرc<䓟*w|Qx<, iii)))7jL&6!8墮[2;;KEEFQȞ/Hdaa`t<補9s1[\QQsJ%>,AAZXXs='xR)]]]tvv"HXXXjk.|I^/?Okv|DDD;]G"066F Yv`ٳ^FFF^ϷmJKK 211zo:0,..222³>ˮ]\tE$ \ڟd^/ zrrrزe x<N'MMM$$$PRRB^^UUUx<DEEK^^yyydddv9z( mmmORPP@tt4oavv'N`4Y\\dqq={PYYG}pRxǩd``Jq\ݻ[222[o*˿$111,..b2cpptZ,-- oŋ.T*.KNlmmE&jl6sQ{9~?YYYttt055L&C.3994 !~i;PVVZ& HWW===7 L&L&$&&r HJJe,Y\\$66V{G xڮ.dž lBww7j׋"''玵h4R[[Kkk+nh4d2ћ> &&^p\aUff&nݺȝ# Ntt4|& ׮]󑒒"xV+sssdddCVVzAjff3!a.K ۶m7^D"ȼd2 477 C"8nS'({%;;J<)))0::z7_DDDDDDD~1胃"j (--R1466"x'nZӃ\.gnn@0("""bnnLf#55nah2ؼy3eeef6oL0c=FZZ֭[GYYDDDHcc#P(XXX 77YndffR^^(`NDDk׮%,,>vMff&uuunAT*oA`0PTTDNNZRJbݺu8NV+T*YnZHMMEӱaJKK_ dXZZpO#ZfhhDAAz$Q*aQ(x<\.!::8 (Jp\HRK^^n˻ T*)..h4)//t2>>^h4~ir|]X>88H__k֬aDDD0>>NII .h pp8رcsssb4`ڵ[uQPPJkג¶mۘnzfZZZXZZ#;;kRRRBzz:6mbiifL&h4Iww7=yy BHJBR@dd$O= :&&&عs'yyyQ(lj||8:;;Q*zكdBf cP((,,DV3<|? f׮]b"X󱸸ȡC?O^xpdffRVV&(|)Пf!t7(?%nH$|>~wےvD"\\ƃ;5O>~mWܮnD"aϞ=d;]0R=}En^ۯ1rSl0$'' Z).]DDDDDDD@ȦU>B{x-$"nrlWt~mw@w8ksss7p8~oWm6vN|SۃT*,0aaa昛V svH?ZV,'"""""""r,i [oz)))˜>}p.^Hyy+@՜nnn}^VYv6SNKDD'O;v0==M{{;;w2zzzx7IHHً/kײoMFFzB/~ ~?.]"%%N#G'))$ມ<::G}޽{J׿ڵ>z*NJK/DXXѨjl|Tfm2;;Jz{{,ٸq#sss ˅JȬW/_ԩS,//κua@zbbb8{,o{ᣏ>pC `yyV{G;v;JRH&V3==!n333T*R$QQQ'̇^ MF$HRZ ?9/!]P044Dtt4^1^ȈH$twwGXXof#))yU*0::D"!**JPrAR)}}} E__֭j~oÇiooGRa0Č""""""""w;n v;@bfff!66ƦM&|n4)**bjj FYYNP ++lHJJFCoo/۶mCضm c0HMMehh&%22F N'266L&#%%xC׳i&._27o&;; cvv .뉌Bz* t•+W8{,Fv;.]BPpQ$ lٲnxwd\x,, /^v~@?v<|ᇔ4oNTT˼KH$^JQQߏC?Al6999w !#8N~ߑǕ+Wk׮k.s>|OS2228}4x<jkkg?YYY,--133Cgg'* $kd2*++INNԩSBzz:}111fD}:䑑DGG3::JUU011bazz/R^OTTRϓO~T*>}K.Q__OSS:< Y\\dzzsIᥗ^BT &&~ׂ1[tm~~]-osUFGGyꩧn^GLyyi||>o|Bσ ,//366Fjj*7n;#jE&!Hd78pF.s1[2==MEEZ)fgg8{,NGy7ɥKgiiÇ{nFM>< 111<䓬YgIaa!O?4&IӃaeeEmƣ> /H]]]߷Ch ;K/HG"o}R;{n@"T*yGؾ};cccw`0ڵk)--ellgϞD/..d(((gvvٱcjǏشi Hww7x<^͛7oS^^Nll,^x(++ō5kP]]M}}=EEE\zU8[rArrrHNNfӦM,//÷m po>f3iii呛KNN544ɷ-hii!**IV+{ F|IDDDDDDD3 ybqqez=,,,h4Kdgg͵ktrfll?R2>>0}}}ϓerri`tt(TTT022Bvv6--- 399VUJ577P(D&QPPbb`Z9qvrssQTtwwG?KKK \.M~g_!ywp`Xf&&&hkkcjj DB d2BRR?0 ;vǏ??{ro<1 h;z`0H\\`ft:6oLUU>L\.G" 鎵#tEڵk444Tn-""NGww7;w,ҥKDFFhnQyGX,\v톄o$''c4ٿ?˗/O<`pA/֦%%%())aϞ=DSS( :;;faaK.aۉG*gff &''X,x<7222xJrr2&!6l5k&::Aww7f}!q:GTTǚ5k%22"##)..&::1ۇ``~~hl6f$2X),,DףT*tY@ f,8gddRRRHLLdӦMhdn y bcc ##| IIIdffb0(,,$11$J%qqq( \. _ J0bcc1 z=X,yݶm %33(--%55<<FNGBBr^~2䉼^|gx<4ЍF#ַulޡd2ׯd"Ͻ"""""""""_$m}}څ^/n+u}["}JwDJN' ih~&o0daa ƝZDDDDDDDDD:H$\. `0HDD=$2LA} ×#JEDDDDDDD;CvYYY~<ڞd2} }i<[,\(z\N[[P]TR]]MCC(Jd2W\addʕ+tuu s nVԩS)鋋V΃)?F)u7YnBύp8hOCڵkRJ9ֿ@ @kk+(ۇnFFF07ŋBU>: 266L&cqqQx?TVV yJTTT0==.]BPpa<555tttɓ' رc!\Amm-+++p8FCTTTUU155Ebb"---ºt{\xϥ. tuuлuvvpgyWTVV2884(J>l6k׮vt k`bOAvNG{{;uuuz0V* W\WXXXzCB .011AJJʧn3<dee8---444P(RP*z]Çiii!''3{I._L{{;}f\.ZF^aw35::QQQ455 cKK ===Kuu5^O0 JExx8]]]DGGseA`X_{ȧq;Y?@RRR©Shhh@*r5ٳgimmeΝte֚TTTjQ*\pv,,//SQQAyy9### 8w/Bii)KKK{c0 \pdbccx ++ шT*eyy***ػw/`_TTT{nFFFֲR׿5F84կ~EJJ zuj!777RNAP(tuu122B !bcciii_d2RhiiappNwwrDGG300]]] hxWIII> ??_Hx{ͥKejjQәd||3gΰuVd2ٗ@WTLLLJAAAzzz2<<Amm-1>>NOOH$Z[[ztvD__*1eyy:&&&={paSrc||^"ziii<W^%33:6mDWW(JGll}IV yf&&&hhh`nn\L&1Z-o׮]#)))B3??ϵkט#..NxCdqqx穭eiiseKkk+yyyJxx8111X,뙛kjj#>>Lddd HDEEq%rrrERӃRdii{n[Nx穩affVKGGmmmDFF|2999\v-[ D0$22Tʙ3g8wHRjkk1 d|Gtff_W sαqF{=X,ɓ'ٰagΜ!&&A{{;dzzFɓ'ILLN|> /h0:tBd"))@ @SS===|>^~eILLevEDD===LLLhy^~e r.\`llt=ʆ 8ufejjj(//'.. . LOOG{{;T*VVVxh4@MM 3::*ࣣn_&55>^ϛoIII .ӧO#ɨ%99CV9{,9rAkk+444000FP`ل!EIDAT|``^~e㉍~4 >:NfggQ477344NC" oWD0tr9Brf3:K.ԩS$$$4/^! t:333 K/p8HIIarrFd2*ZZZu&磹9={,鴴~zhnnJ}Z,a绡RDӧOʦM K.k`̙3rjkk1 y^fa9;;o͎;H$3::RamZ~ڵk=\.IqqqS˅Bbbbx.g8NG^dBVs!n+?K/QXXN#>>^{(#99vo~x饗%..Kdd$f~ED9cM6vRXV Hrr2wԩS} Tq\IHH`߾}AL&&n:::H$l޼z grr2/<<6y СCtvv \< NJJ )))l޼֭[Q՜;w^/oܸ mz{{8==FC__@>_|"`0KVVPի$''k?9x<,//322G}$B#G'** \2DGGc6#55l;vg}^JRzrR) ;L&y7ٽ{7o{KؠEDDuXZZ"&&ǏqF.^__j8qp8XZZtoSNNff&^92B16ccc|xl+O ,JҥKꫯ#{QZZ ^ٯ}}}$%%+Baa!.>(,--022T*6c/[n6m& M}}=v.]Ě5kxٷö́qIL& 3! rDB `~~%^{5o|ƍAPPPPz"""ϧ|yiΟ?/}{\p" XVn7'BBB6Ep\FRRRp:l6yW7{+//200쬐`pqກLYYC* y( R)QQQl6"##儅P(H$DGG#JQ(aXXYY7OOyYYY OLL VT͛Xv-Z1$ yyy\tQ^v]P-,,~/ /ѣGپ};( xwaX8w'P*M]]?DۅēwI Bd۷o*, qݼ\|W"̯6a淿-iiiDEEDž LOO3::F!//BpC2mC뉎?)͌_&v!y$$$PWWGII }}}|[⭷ޢDP:uὮV識&9ŋinn;ǏgaaB Gee%OĹs瘚B" Jٳg111twwi&d2=== o>tuuqU&&&l `04::fիر*~pqbccy488G}D^^o=|[leqq9^~emaaa+³>{G^^*)N8!$͍'diiI ;;ώ;v|l6 īWRSSdW^'**?xw?W}@x<=zx0kǙa- 22RxСz~8!anXX 399IggaL&>uzmnٳgSSS>|+\.>Lff&eee¿n'NK%GA*2;;+(`/,,'_t?~,[bX@P066&HN>NXX.PRR‰'vn:~a zTQ(k.ưl4Fr333LMM1==Mww7CCCڵ]vMFF:N0''lrrr0| U~'(;Zb~~={o߾K,// !'^5jerrD$ j;wr)aXXX`aaK7@Dg|gffi4 (Jn*H4!}}}u`0/~ 0 G!$ xjR^^B`aa͆bvj5YYY=zy YǛP*ƍY^^faaѣG9|0)))͑OTT555wY-JdHRoikkXVS*2"""XXXW9k׮*ބ_W$''%<6?DGGc4ò&4/z4 唔4VVE&qZZZxϐl6HMM `0JbhhJKKjR^^fiiIc xC?@]](JN'?hkk#>>^04 ϓFrr2nJ%455 邷yvvVhիWaCӧOcXÚ& |aqqQP fN8+W())իb4vOиd2INN&99m۶ӧ9B3!!E(~} 㕕%yn۶M&''c6),,vK||<VKRR*hHJJBՒ ,YYYXr#9x FٌbaӦM`XgLRRIII" Øf(**`0077GJJ M^^0999( 233'33͛7 ~fbbIطop8gݤ,dgg4۷o , 2bF#PZZJDD.'X3B6%%~? ))dfggٹs'YYYdffbZa͂Cll,^ݻwngffo|jXZZbC+rQrrrشi 1JRPQ(ڵkx<ݻUAA(,,$//20 XVa/099)xYsrrHMM#<"r9&JJJ())A&ȓO>I\\ LOO ϏbATb0%22{lXL1$$$Nc~~ݻwlfbbBAVVBsss꾧V>=ԩSLMM=^!cHFB|-_gÆ lٲs˗/ɞ={/?=Ϙz9z(N??̪2YZZ?t"HXnj?ffffc׮]ޕ>*u|޽$"1::*8?fC. jjN%+++{ux% DDD* iR((ϼ7^iVVVp8Ad2jJ~$ _@Z,..R;|zv]z?H,//#oߟLtU [~7B cbb&es_D(н'_}|8E_ID߼}֝[f~;gfqoooҥK͑@uu5 h4;*3^}tt3<>~So&)))IDDDDDDvݍ\.ҥKH$fff8<111TVV e an7===nݺ}eֺP(TTTVh4Ȏ;b8qLOOs1 iiiAN>͋/Hii)6'N~z/~!ԉNLLǎjRTTh$,,LHv9G ׿5ϟgX, ,,,͡C0Bї^z\N>-F q8155FGCCG]]6mbddWReii Juߒy͹s稭%""k׮~;&_m P__Oss3Jyvٳgq\dffvT*6zFFFP(tvv܌B`rrR<333Bh288^ ARR@~樫ƨ?NSqqq 555 bZ1 D 7xrss 7xD|>/_fvvimmepp7Ba$UUUwwwS[[KXXp/XZZB&%骮bڈQ_ZMbb"ᬬpU:::LNNP(%&&Fm:LxIHH@R[[Kgg'rW"YLJ$""""""uv 9o߾۷ ZGGk׮Geqqґ~an0J޽͛7L&#>>z\N0h4r C&Q^^Nnnannr DDDP[[HRx RSSڠYXXڵkLOORr۶mCRQYYIRRH$سgZ\Nss3}}}Cxx8*Q=d``zCڊRdjjJ8{,`IaxwLMMP(׿5fbbۥ7O`XXXXU5x7  ] ?%22˗/se4 N?E:;;'O`rrJEll,vӧO  cxx+W5Cu\HR~mazV+UUU477s ~?*CCC% r|Uj,..233Cll, bbbXYY!""/RSSCUUgϞ%66JN<6_~ߏB#G Hxioo_F"311!ܿi^u~?ôԩS( tSNE ࣏>q1&&&8s rZV~/&&@ jvsU@PDDDDDDDD:in9BRR[n% xeΜ9"O?m_tKEEG$&@#GzOr \\Z8p;III|Gl뭭l޼ *** c|>~@ss3---,--\.TӧOVy衇yAٳgIIIB`qq\墸m۶!J9qw~.R@ ij(H"""SRRB0$ C1==Mgg=n:)--e˖-7W?#22@AAJS266wrrrgrra ~222xGx<͑ʖ-[jXֻ>6_5x {9VVVL7L&&&bjjA eeec4Boz8pR&''1֯_OEEddd`4IKK%L&'Od֭TVV`BN__6mbӦM$$$Ϟ={())j\3-7\pZ4k֬#G2i:uz{A_z"##nS[[Koo/]]] r͆~,;w$>>^7>>Nee% 2շ~Q v}}}tuuqEu!ORZZݻD"azwyLLLPTTBܹsBL&#""`0㹩< ?1|G={V0ಲ) "==lt:6mBsQ.\@AA?Oصk]߷KII ׮]ä AJTVV->Qܹ: ECCkHO]].\bh 111B~H}A]]6Mj믿r~IOO'** DBdd$uuuPvv6|( bcc.16ihh~_CkKK uuuhZSB_b2X,;v ERR B&P(ARQXXVet:Μ9}ZZZ!PSS#$z&77&vAoo/FpЧrrr|2.]bbb0MbrJ1qqq|>L&`^O^^F~ZMeu )J>uVǠ!6!!L<قRL&h4bZjz+xÙ!&&Gy8233Y^^f۶m䰲"xg킑U\\LLL ,rssYv-F#2rrrHHHto>rrrHIIa~~uQZZzS8DJ"33RQ՘L&MHKK#99N ֬YCLLhqݔCZZ$''ld2DRRZ@ l6識lӱ$''MNNz˾}0BX>cЃ DEEqA lܸGNNEEER$99Y(1 fqqH 18NvMZZIIIšINN&##Nff&Bxٹs' h4222p:B ezz̶m0 5kh4F233Q*~6o,rf3 Z-&$X2p;1蒅u\ߩ:sssd9djjAX,BNbyy`0ƍ)../ȃ$6 \NAUs~?N5\"feeeǃD"A*>0ɐDA\.<'wܯ`V.sN!&_PXӑH$lފ|9H$7~>B~qOvq8/dn!A |}t:[ P~qK2LȺ#d{޻>oEDDDDDDDDǷȽ.!$wJ<wmwχ^ %""""""""NbۅA>.z>+++5`~D"$L,455qYHJJns IKKYƨF#}X!#ft:9r~F#===|8@ss3~! N'|555tvvJDDTUUF__Ofdd$9z(uuuM__8FMY?iHMMrh4~Q\\|߼ŷ3Oq\={zbccoi!BYCrq?%, }}}ֆѣǣhhj5b6Z&s1<N4Їh4TVV0twwsvqGsW\]]]y}eֆt>}Z(%*]ZZfƱcX~=KKK/"\px ǏnS^^NRRr(N'>&= Dcc#hZVVV&)((7KUU@\ܜP>VfӴjbÆ whիWiiih4r9۹x"a%>>|T*\.Nϵk'<>*㗿pH:22BUU~X*++F*rv`)ٴiccc?gjj-[+HFF w\ȃ-ilڴu 1111lٲoC{{{cVJl۶ Ʋi&r9`vIbb"QQQf233㤳ePDEEQUUEkk+cccB]T6$$$%::鹩]]]:tW^y!㙙Z^ZfzzZ9Btt4biooСCk ~P^^΁eaa^_"033~;j5SSSAbbbXv-AAxw333O .,g,'AZkmզixc&M^M/U1۪5jz@XC˞wo  |v|\zwRWWGFF~󧷷SN{ٳ\~ÇD}}=ׯ_ƍX,=J[['OgV駟0LnttuuQSSCLL O'N`6ijjnƍD"$$$x8w={vD$`0@ss3466R[[CCC>}JNN$&&qFN'$''s):::8~8`49s G~ĉPTTݻ'..G}}=;w$>> nܸ7oo!Bguz gggfNVr6UQ}]>sFFFUrq1\Ejmmŋ|zP(Dmm-.nv;:to1==M$! e߿Ca٨9vvA޷ XVᠿ*E!/?M{{;7ojR]]MNN~^}}}sN233^ƈ' RPP@ee%QQQ\zuQQQzfݻweJ[o8---(je׮]l۶ ܏CkuVp:ر۷/H@Qعs'Νf1<PQQo/)**җoεkhjj{166F(BUU 6BAA.dكjexxX)))[L233IOOo^p?۷osFGGioogdd'|BQQ/B!xhmNYc˗/( n._LGG+R 'ORWWh\VDos@ar mmmܽ{N+TUpz~!6 UU1 qy~w)))l6s(//իs]Μ9C[[6m]n7n$!!OTTr ~g,ߺu FRRYYYX,{(//_p믿/rE}l޼R__Ȉ/bV+$%%/p-oؽ{\ڶm7nرc瓔\?`… 7wx믿Bz{3EQ+WF#YE.]_!BF8zevvVJTfebbBEtz)))Ν;d|_6k9͚ᠳBIISr:X,bbbhlldjj r, o& Ejj*a=0룧(5$'' (Bii)Fvv66V+333twwLii)FÁgÆ >Nnn.333477N !Bg788HBB111fC~ͦ/k_ WꃮZ%}% _-@;[^._jettxt3m׮]^299ə3gx<(k֭[y555۷o?O.B)``'|>߂}i<(zqɭ( ^WUv/yk=8y>{"~@;99>@  iOCUU}"^l9|gLU`0z*P@ ~im֞e<`0{5E" >]Y߿sgC3՛XϒH+fV!B`EQ$0::od,͂=`2HIIYՃRܵu_p8ʤ g'&BSܵ5)헅V!BZv(TWW^\Sefiz.CvwkAJTRIN^r\*`kcpp2QJNNݔx ¯sDİaÆD!udff266FJJ N󉊹O2N K2-nJZZښiii!''EX,Uy!BP(d$>Ѩ Ӿy<,˂mTql6蘶rV(ܿG"z{{&**j}ւՕ>_dnP;s_kcd-Z]1qA!bOD?c`0^\.TU}*F <꿫*D"^hd2=B!B&!, CCC8*++@`0`2 }>`psN9),,ϟ% ]}rmB!榭OMMqqzŶ]̒z8fllL/  !B!0.ZrbEp8L(ibcc IB!BH$B(`0w^yewzl{TTo`P(4o _8!B!p8LFF֛-7:f-O%vxѯXAP($B!b Z =VW|>߂"qn9 KernelShark

KernelShark


Introduction

  • Graph Info Area
  • Graph Control Area
  • The Graph Window
  • Table of Contents

  • Plot Title
  • List Area

    The Graph View

  • Zooming In
  • Zooming Out
  • Graph Markers
  • Deselecting a marker
  • Graph Plots
  • Task Plots
  • CPU Plots
  • The List View

  • Selecting an event
  • Graph follows toggle
  • Filters

  • Event Filter Dialog
  • Task Filter Dialog
  • Advanced Event Filter
  • Multiple filters
  • Sessions

    Introduction

    KernelShark is a front end reader of trace-cmd(1) output. "trace-cmd record" and "trace-cmd extract" create a trace.dat (trace-cmd.dat(5)) file. kernelshark can read this file and produce a graph and list view of its data.

    The application has two main viewing areas split by a paned divider. The top half is a graphical display of the data and the bottom half is a list view of each event. Underneath the menu bar is the graph information area:

    Graph Info Area

    The graph information line displays the timestamp of the time that the pointer is located at (or last located at when off the graph area). It then shows the information of the event that the pointer is over, which holds the same infomation of the event in the list view.

    Graph Control Area

    The line of below the graph info area holds the control buttons.

    After the buttons are the Marker buttons and information windows. See Graph Markers for more information.

    The Graph Window

    The graph is broken into two parts, the plot title section:

    Plot Title

    and the plot area:

    The plot area contains the data of the given plot, where plots can be per CPU or per task. The top of the plot area shows a timeline. The numbers in the timeline are seconds. The time in the timeline is taken from the timestamps within the trace.dat file which are architecture dependent. The time usually is the timestamp from when the system started.

    Below the graph is the list area.

    List Area

    The list area starts with the search boxes (See Searching for Events), and the Graph follows toggle button

    The Graph View

    The graph view of kernelshark shows graphical plots of the data stored in the trace.dat file. The data plots are per CPU or per task. When there are too many events within the resolution of the graph, the plots will appear as a rainbow colored bar. To make more sense out of the graphs, you need to zoom into a given location to see the details of that time frame more clearly.

    Zooming In

    There's three ways of zooming it. One is to press and hold the plus button above the graph, or you can use the mouse. By scrolling the mouse wheel up, it will zoom in. Scolling the mouse wheel down will zoom out. The thrid way is to use the left mouse button to get a more precised area.

    The left mouse method starts by click and holding the left mouse button and then dragging it to the right or left. The graph will then zoom in where the event at the start of the shaded area is the starting event in the graph view area and the event at the end of the shaded area is the last event in the graph view area.

    The area that you selected will now become the new width of the viewable area. The smaller the selection, the deeper the zoom. You can continue zooming in until you get to the details you are looking for.

    Zooming in further shows individual events and tasks that are scheduled on the CPU plots. The thick colored line on the plot represents a task is executing. The vertical lines that stick up represent individual events. When the CPU is idle (the idle task), there will will not be a thick colored line, but the idle task can still have events which are displayed.

    Zooming Out

    To zoom back out, simply press and hold the minus button, scoll the mouse wheel down, or select the double minus button which will zoom completely out and display the full trace.

    Graph Markers

    There are two markers that can be placed on the graph.

    • Marker A
    • Marker B

    The highlighted marker is the "active marker", and its button is highlighted (as "Marker A" is in the diagram below). By clicking the Marker A button (which is set by default), you can place a static marker on the graph. After clicking the Marker A button, simply double click on the graph and a nearby event to where you clicked will be highlighted by a vertical line that spans the full graph window. The timestamp of that event will display after the Marker A button in its information window.

    The list view will also select the event that was selected by the graph.

    To set Marker B, click on the Marker B button, and then double click on the event in the graph area that you want Marker B to be attached to.

    The list view will also select that event with a separate selection than from Marker A. That is, you can see two selections in the list, each representing one of the graph markers.

    When both the A and B markers are set, the graph control area will show the timestamp of where the A and B markers are, as well as the difference between the two. All timestamps are in seconds, with a resolution of 1/10 of a microsecond.

    Deselecting a marker

    You can deselect a marker by right clicking the graph or list area and select "Deselect".

    Graph Plots

    The graph data is represented by plots. The data on the plots are either CPU specific or task specific. If they are CPU specific, then the data holds the timeline of events that happened on a given CPU (which CPU is shown in the plot title area). If the plot is task specific, then the timeline of events are for the given task regardless of what CPU it was on at the time. The task name is also shown in the plot title area.

    By default, all the CPUs within the loaded trace.dat file are plotted. There are two ways to plot a task. One way is to right mouse click over an event of a displayed task in the graph or list and select the "Add [task] plot" option. The other way is to use the Plots menu.

    Task Plots

    Selecting the "Tasks" menu item will bring up a dialog with all the tasks that were found in the trace data. Clicking on the check box will toggle the selection of the given task. To select multiple tasks at once, highlight the tasks you want to select, then hit the "Enter" key. When you are satisfied with the tasks you wish to plot, hit "Apply".

    Note, in order to process the tasks, a linear search is made to find all the task's events at the creation of a task plot. This may take a bit of time on large data sets. But after the events have been found, they are stored in a data store and the processing of the graph will go back to normal speeds.

    Selecting a task in this dialog will add the task plot to the bottom of the graph area. Unselecting a task in this dialog will remove the plot.

    The CPU plots change colors as different tasks run on the CPU, and the task plots change color depending on what CPU the task is running on. This makes it easy to see how much a task bounces around the CPUs. Zooming in on a task plot also shows some more characteristics of the task.

    The hollow green bar that is shown in front of some events in the task plot represents when the task was woken up from a sleeping state to when it actually ran. The hollow red bar between some events shows that the task was preempted by another task even though that task was still runnable.

    Since the hollow green bar shows the wake up latency of the task, the A,B markers can be used to measure that time.

    The above shows that the "migrate" task with PID 28797 had a 14 microsecond wake up latency. The same can be done with the preemption latency.

    CPU Plots

    Selecting the "CPUs" plot menu item pops up a dialog that shows the available CPUs that can be plotted.

    Removing a selected CPU and hitting "Apply" will remove that CPU plot.

    The List View

    The list view is in the bottom half paned window and can be expanded or shortened with the paned handle.

    The top of the list view contains the list area which has the list search and "graph follows" toggle button.

    The columns of the list are:

    • # - the position of the event in the full data set.
    • CPU - the CPU that the event occurred on.
    • Time Stamp - The timestamp of the event. This is in seconds with 1/10th microsecond resolution.
    • Task - The name of the process that was running when the event occurred.
    • PID - The process ID of the task that was running when the event occurred.
    • Latency - The latency is broken into 4 fields:
      1. Interrupts disabled - 'd' if interrupts are disabled, otherwise '.'
      2. Need reschedule - 'N' if the kernel was notified that a schedule is needed, otherwise '.'
      3. In IRQ - 'h' if in a hard IRQ (hardware triggered), 's' if in a soft IRQ (context where the kernel initiated a the IRQ handler) or if soft IRQs are disabled, 'H' if in a hard IRQ and soft IRQs are disabled or the hard IRQ triggered while processing a soft IRQ, otherwise '.'
      4. Preemption counter - The index of the preemption counter. If it is other than zero, then the kernel will not preempt the running tasks, even if a schedule has been requested by some event. If the counter is zero, then '.' is shown.

      Note: These may be different depending on the kernel the trace.dat file came from.

    • Event - The name of the event.
    • Info - The data output of a particular event.

    The list search can find an event based on the contents in a row. Select a column, a match criteria and the content to match to find the next row that matches the search. The match criterion is one of the following:

    • contains - the row cell of the selected column contains the match data. This works with numbers as well.
    • full match - the row cell of the selected column matches exactly the match data.
    • does not have - the row cell of the selected column does not contain the match data.

    The search will find the next event that has the matching data within the column.

    Selecting an event

    A single click on a row will select that row. If the Graph follows button is selected (which it is by default), the selected marker will move to the event matching that row. If the Graph follows is not selected, then the graph will not change.

    Graph follows toggle

    When the "graph follows" toggle is set, then selecting a row in the list view will cause the graph to move the active marker (either A or B) to the event that corresponds to the event in the selected row. With the mouse focus on the list, using the keyboard up and down arrow keys will move the selection of the list as well as the graph cursor.

    Notice that there is a small square dot on the event within the marker that shows where the event is in the Graph that is selected in the List view.

    Filters

    The amount of data that can be stored in a trace.dat file can be enormous. To make any sense out of some traces, it may be required to only display various events. The same can be true about tasks. Kernelshark has filters for tasks as well as for events.

    The Filter menu on the toolbar consists of:

    • Import Filter: import a file that holds a saved exported filter
    • Export Filter: save the filter to a file, that can be imported at a later time
    • Apply filters to Graph: When checked, have the filters affect the Graph area
    • Apply filters to List: When checked, have the filters affect the List area
    • Show events: Display the event filter dialog
    • Show tasks: Display the task filter dialog
    • Show CPUs: Display the CPU filter dialog
    • Advanced Filtering: Display the Avanced Filtering dialog
    • Clear all filters: Remove all filters

    On start up of KernelShark, the filters, by default, will be applied to both the Graph and List areas. You can modify this by selecting the "Filter" menu from the tool bark and uncheck the checkboxes next to "Apply filters to Graph" or "Apply filters to List". This will not affect the filters themselves, but will affect if the filters are applied to the Graph or List areas.

    Event Filter Dialog

    The vertial lines that stick up from the task and CPU plots represent events. These can be filtered via the Event Filter dialog.

    Selecting the all checkbox will select all events and nothing will be filtered. Deselecting the all checkbox will deselect all events. The same is with the system checkboxes (the top level ones). Expanding the system tree will show the individual events in the system, which can be selected.

    Task Filter Dialog

    If only a subset of the tasks are of interest in either the Graph or List view, then they can also be filtered. Select the Show tasks menu option the Filter menu of the toolbar and the Task Filter dialog will pop up.

    This will "hide" all other tasks except for what was selected in the dialog. Again, the all checkbox will select all tasks if selected, and will unselect all tasks when it is unselected.

    Advanced Event Filter

    Filtering on events may not be enough. The ability to filter on the content of individual events may be needed. In order to accomplish this, the advanced event filtering is used. Selecting Advance Filtering from the Filter menu will pop up the advanced event filtering dialog.

    Selecting Show Help displays the syntext of the filter format, and the helper buttons can be used to find events and their corresponding fields.

    Spaces are ignored. The example used in the dialog figure:

      sched/sched_switch : next_prio < 100 && (prev_prio > 100 && prev_pid != 0)
    

    The sched/ is not necessary because without it, the filter will process all events named sched_switch, and since there is only one event that has that name, including the sched/ is redundant.

    The next_prio, prev_prio and prev_pid are all event fields of the sched_swich event.

    If just sched was used and the /sched_switch was omitted, it would still be a valid filter, but it would behave differently. By just specifying a system, the filter will run on all events within that system. When a field is encountered that does not belong to an event, then that compare will be set to false.

       sched : prev_pid != 0
       sched : !(prev_pid == 0)
    

    The above two filters are not equivalent. They are for the sched_switch event, but not for the other events. The first filter will return false for all events that do not contain the prev_pid field, but the second filter would return true for all events that do not contain that field. Again, if the event does not contain a field, just that compare will be evaluated to false, not the entire expression. This means for events that do not have the prev_pid field, the above filters would be equivalent to:

       sched : FALSE
       sched : !(FALSE)
    

    Letting filters contain fields that do not belong to an event be valid allows for various tricks where two events can share the same filter.

       sched_switch, sched_wake.* : next_pid == 1 || pid == 1
    

    The schedule events that have next_pid and not pid as a field will just compare the first part of the || and those events with pid but without next_pid will be compared against the second part of the ||

    Notice that event names in the filter can be regular expressions.

    String fields can have regular expressions used in their comparing if =~ or !~ are used.

       sched_switch : next_comm =~ "^events/[23]$"
    

    The available regular expressions are described in regex(7).

    To remove an advanced filter, you can select the Clear all filters from the Filter toolbar menu. Or select Advance Filtering again and it will show all the current filters.

    Selecting the Delete checkbox and hitting Apply will cause the selected advance filter to be removed.

    Multiple filters

    Multiple advance filters will act as a union. That is, if any advance filter matches an event, then that event is kept in the events to display. But the simple filters (events, tasks, or CPUs) are then applied against them. For example, to display all ext4 events as well as the advanced filter of "sched_switch: next_prio <. 100 &.&. (prev_prio >. 100 &.&. prev_pid != 0)", selecting ext4 from the Filter->Show events that selects ext4 events, will not show any event. That's because no event will satisfy both being in the ext4 system and the sched. To handle both, you need to add "ext4" as an advance filter, and then both will be applied.

    Note, when adding just a event system (i.e. ext4), all the events are added individually.

    Sessions

    The state of KernelShark can be saved and restored via sessions. When exiting KernelShark normally (hitting the "x" or selecting Exit), the state that KernelShark was last in will be saved to disk. You can retrieve this last state by selecting from the toolbar File->Session->Restore Last Session. This will return you to the state that you were in when you last exited KernelShark. That is, the current zoom position, with Marker A and Marker B at their previous location, as well as any filters applied as they were when you last quit.

    You may also save the current state at any time by selecting File->Session->Export Session and retrieve it at a later time with File->Session->Import Session trace-cmd-v2.9.6/kernel-shark/Documentation/Makefile000066400000000000000000000052631414302661500224240ustar00rootroot00000000000000 obj := $(kshark-dir)/Documentation src := $(kshark-dir)/Documentation ifeq ($(VERBOSE),1) Q = print_asciidoc = print_xsltproc = print_install = hide_xsltproc_output = else Q = @ print_asciidoc = echo ' ASCIIDOC '`basename $@`; print_xsltproc = echo ' XSLTPROC '`basename $@`; print_install = echo ' INSTALL '`basename $1`' to $(DESTDIR_SQ)'$2; hide_xsltproc_output = 2> /dev/null endif define manpage.xsl if [ -z ${MANPAGE_DOCBOOK_XSL} ]; then \ echo "*********************************"; \ echo "** No docbook.xsl is installed **"; \ echo "** Can't make man pages **"; \ echo "*********************************"; \ exit 1; \ fi endef do_asciidoc_build = \ ($(print_asciidoc) \ asciidoc -d manpage -b docbook -o $@ $<) do_xsltproc_build = \ ($(print_xsltproc) \ xsltproc --nonet -o $@ ${MANPAGE_DOCBOOK_XSL} $< $(hide_xsltproc_output)) # # asciidoc requires a synopsis, but file format man pages (5) do # not require them. This removes it from the file in the final step. define remove_synopsis (sed -e '/^\.SH "SYNOPSIS"/,/ignore/d' $1 > $1.tmp;\ mv $1.tmp $1) endef # # Most likely a docbook.xsl is already installed on the users system # instead of creating a new wheel, lets reuse what's already there. # FIND_MANPAGE_DOCBOOK_XSL := $(shell find /usr -name docbook.xsl 2>/dev/null | grep manpages | head -1) MANPAGE_DOCBOOK_XSL ?= ${FIND_MANPAGE_DOCBOOK_XSL} $(obj)/%.xsl: $(src)/%.txt $(Q)mkdir -p $(obj) $(Q)$(do_asciidoc_build) $(obj)/%.1: $(obj)/%.1.xsl @$(call manpage.xsl) $(Q)$(do_xsltproc_build) TEXT1 = $(wildcard *.1.txt) MAN1 = $(patsubst %.1.txt,$(obj)/%.1, ${TEXT1}) all: $(MAN1) # Need to find out how to export a macro instead of # copying this from the main Makefile. define do_install_data $(print_install) \ if [ ! -d '$(DESTDIR_SQ)$2' ]; then \ $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$2'; \ fi; \ $(INSTALL) -m 644 $1 '$(DESTDIR_SQ)$2' endef MAN1_INSTALL = $(MAN1:%.1=%.1.install) $(MAN1_INSTALL): %.1.install : %.1 force $(Q)$(call do_install_data,$<,$(man_dir_SQ)/man1) html_dir = $(src)/HTML image_dir = $(html_dir)/images HTML = $(wildcard $(html_dir)/*.html) IMGS = $(wildcard $(image_dir)/*.png) HTML_INSTALL = $(subst .html,.html.install,$(HTML)) IMGS_INSTALL = $(subst .png,.png.install,$(IMGS)) $(HTML_INSTALL): %.html.install : %.html force $(Q)$(call do_install_data,$<,'$(html_install_SQ)') $(IMGS_INSTALL): %.png.install : %.png force $(Q)$(call do_install_data,$<,'$(img_install_SQ)') GUI_INSTALL = $(HTML_INSTALL) $(IMGS_INSTALL) install: $(MAN1_INSTALL) $(GUI_INSTALL) clean: (cd $(obj); \ $(RM) *.xml *.xsl *.1) .PHONE: force force: trace-cmd-v2.9.6/kernel-shark/Documentation/doxygen/000077500000000000000000000000001414302661500224335ustar00rootroot00000000000000trace-cmd-v2.9.6/kernel-shark/Documentation/doxygen/dox_config000066400000000000000000000011471414302661500245000ustar00rootroot00000000000000# For detailed description of all Doxygen Configuration Parameters see: # http://www.doxygen.org/manual/config.html DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = "KernelShark" PROJECT_BRIEF = "Kernel Shark is a front-end reader of the Linux kernel tracing data." INPUT = ../../src/ ../../src/plugins/ SOURCE_BROWSER = YES QT_AUTOBRIEF = YES TAB_SIZE = 8 OPTIMIZE_OUTPUT_FOR_C = YES CASE_SENSE_NAMES = YES SORT_MEMBER_DOCS = NO STRICT_PROTO_MATCHING = YES DOT_MULTI_TARGETS = YES PROJECT_LOGO = ../../icons/KS_logo_stacked.svg trace-cmd-v2.9.6/kernel-shark/Documentation/kernelshark.1.txt000066400000000000000000000015341414302661500241720ustar00rootroot00000000000000KERNELSHARK(1) ============== NAME ---- kernelshark - graphical reader for trace-cmd(1) output SYNOPSIS -------- *kernelshark* ['OPTIONS'] DESCRIPTION ----------- KernelShark is a front end reader of trace-cmd(1) output. It reads a trace-cmd.dat(5) formatted file and produces a graph and list view of the data. OPTIONS ------- *-h*:: Display the help text. *-v*:: Display the kernelshark version and exit. *-i* 'input-file':: Read trace data from the file 'input-file'. By default input is read from 'trace.dat'. SEE ALSO -------- trace-cmd(1) AUTHOR ------ Written by Steven Rostedt, RESOURCES --------- git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git COPYING ------- Copyright \(C) 2010 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). trace-cmd-v2.9.6/kernel-shark/README000066400000000000000000000077241414302661500170370ustar00rootroot00000000000000 This directory contains the new Qt-based version of the KernelShark GUI. Third Party Software: ------------------------------------------------------------ KernelShark has the following external dependencies: Cmake, Json-C, OpenGL/Glut, Qt5Base. 1. In order to install the packages on Ubuntu do the following: sudo apt-get install build-essential git cmake libjson-c-dev -y sudo apt-get install freeglut3-dev libxmu-dev libxi-dev -y sudo apt-get install qtbase5-dev -y 1.1 I you want to be able to generate Doxygen documentation: sudo apt-get install graphviz doxygen-gui -y 2. In order to install the packages on Fedora, as root do the following: dnf install gcc gcc-c++ git cmake json-c-devel -y dnf install freeglut-devel redhat-rpm-config -y dnf install qt5-qtbase-devel -y 2.1 I you want to be able to generate Doxygen documentation: dnf install graphviz doxygen -y Building: ------------------------------------------------------------ 1. Follow the instructions given in trace-cmd/README and build the original trace-cmd end traceevent libraries. 2. Building KernelShark: 2.1 There is a simple and expert way to build KernelShark 2.1.1 Option 1 (simple) : build KernelShark as part of trace-cmd (from the toplevel git tree) make gui This will build the necessary parts of trace-cmd needed by KernelShark. 2.1.1.1 By default, the installation prefix is "/usr/local". It can be changed by passing in "prefix" to the build. make prefix=/usr gui 2.1.1.2 Use "make clean" if you want to delete all already compiled objects. This will also clean up all the files created by cmake. 2.1.1.3 KernelShark has multiple build types (See section 2.1.2.3 for more details. By default, the build type is RelWithDebInfo, which will build a release candidate with debug information. To change the type, pass in the option BUILD_TYPE= to the make process. make BUILD_TYPE=Debug gui - for "-g" option make BUILD_TYPE=Release gui - for "-O3" option make BUILD_TYPE=RelWithDebInfo gui - for "-g -O2" option (default) make BUILD_TYPE=MinSizeRel gui - for "-Os" option 2.1.2 Option 2 (expert) : standalone build of KernelShark (for hackers only) (note, you may need to do a normal make from the toplevel git tree before performing the following) make cd kernel-shark/build cmake ../ make This gives you a bit more control as you may easily pass in your own cmake options. 2.1.2.1 In order to create a Doxygen documentation add -D_DOXYGEN_DOC=1 as a CMake Command-Line option. 2.1.2.2 By default, installation prefix is "/usr/local". It can be changed using -D_INSTALL_PREFIX= as a CMake Command-Line option. 2.1.2.3 In addition to the standard CMake build types (Debug, Release, RelWithDebInfo, MinSizeRel) KernelShark supports a "Package" build type. By default this build type adds the "-O2" compiler flag. Package maintainers can chose their own compiler flags by providing the corresponding CMAKE_XXXX_FLAGS_PACKAGE Command-Line options (see the example below). -- Note that when built as a "Package" the RPATH-s of the executables are set directly to _INSTALL_PREFIX/lib/kernelshark/ -- Note that when built as a "Debug" the "Record" dialog will try to use the version of the trace-cmd executable from the build location. In all other cases the dialog will derive the absolut path to the trace-cmd executable from "_INSTALL_PREFIX", hence the dialog will use the installed version. If no build types is specified, the type will be "RelWithDebInfo". Examples: cmake -D_DOXYGEN_DOC=1 -D_INSTALL_PREFIX=/usr ../ cmake -DCMAKE_BUILD_TYPE=Package -DCMAKE_C_FLAGS_PACKAGE="-O3 -pedantic" ../ 2.1.2.4 Use the script "cmake_clean.sh" if you want to delete all already compiled objects and all files generated by CMake. cd kernel-shark/build ./cmake-clean.sh 3. After building the code "kernel-shark/lib" will contain all libraries and "kernel-shark/bin" will contain all executables. trace-cmd-v2.9.6/kernel-shark/bin/000077500000000000000000000000001414302661500167155ustar00rootroot00000000000000trace-cmd-v2.9.6/kernel-shark/bin/kshark-su-record000077500000000000000000000001341414302661500220250ustar00rootroot00000000000000#!/bin/bash xhost +si:localuser:root &>/dev/null pkexec kshark-record -o ${PWD}/trace.dat trace-cmd-v2.9.6/kernel-shark/build/000077500000000000000000000000001414302661500172445ustar00rootroot00000000000000trace-cmd-v2.9.6/kernel-shark/build/FindJSONC.cmake000066400000000000000000000024171414302661500217270ustar00rootroot00000000000000# - Try to find json-c # https://cmake.org/Wiki/CMake:How_To_Find_Libraries # Once done this will define # JSONC_FOUND - System has json-c # JSONC_INCLUDE_DIRS - The json-c include directories # JSONC_LIBRARIES - The libraries needed to use json-c # JSONC_DEFINITIONS - Compiler switches required for using json-c find_package(PkgConfig) pkg_check_modules(PC_JSONC QUIET json-c) set(JSONC_DEFINITIONS ${PC_JSONC_CFLAGS_OTHER}) find_path(JSONC_INCLUDE_DIR json.h HINTS ${PC_JSONC_INCLUDEDIR} ${PC_JSONC_INCLUDE_DIRS} PATH_SUFFIXES json-c) find_library(JSONC_LIBRARY NAMES json-c libjson-c HINTS ${PC_JSONC_LIBDIR} ${PC_JSONC_LIBRARY_DIRS}) find_library(JSONC_LIBRARY NAMES json-c libjson-c HINTS ${PC_JSON-C_LIBDIR} ${PC_JSON-C_LIBRARY_DIRS}) include(FindPackageHandleStandardArgs) # handle the QUIETLY and REQUIRED arguments and set JSONC_FOUND to TRUE # if all listed variables are TRUE find_package_handle_standard_args(JSONC DEFAULT_MSG JSONC_LIBRARY JSONC_INCLUDE_DIR) if (NOT JSONC_FOUND) message(FATAL_ERROR "Json-C is Required!\n") endif (NOT JSONC_FOUND) mark_as_advanced(JSONC_INCLUDE_DIR JSONC_LIBRARY) set(JSONC_LIBRARIES ${JSONC_LIBRARY}) set(JSONC_INCLUDE_DIRS ${JSONC_INCLUDE_DIR}) trace-cmd-v2.9.6/kernel-shark/build/FindTraceCmd.cmake000066400000000000000000000057731414302661500225450ustar00rootroot00000000000000# Find traceevent and trace-cmd # This module finds an installed trace-cmd package. # # It sets the following variables: # TRACEEVENT_LIBRARY, traceevent the library. # TRACEEVENT_FOUND, If false, do not try to use traceevent. # # TRACECMD_INCLUDE_DIR, where to find trace-cmd header. # TRACEFS_INCLUDE_DIR, where to find tracefs header. # TRACEFS_LIBRARY, the tracefs library. # TRACECMD_LIBRARY, the trace-cmd library. # TRACECMD_FOUND, If false, do not try to use trace-cmd. # MESSAGE(" Looking for trace-cmd ...") # First search in the user provided paths. find_path(TRACECMD_INCLUDE_DIR NAMES trace-cmd/trace-cmd.h PATHS $ENV{TRACE_CMD}/include/ ${CMAKE_SOURCE_DIR}/../include/ NO_DEFAULT_PATH) find_path(TRACECMD_PRIVATE_INCLUDE_DIR NAMES private/trace-filter-hash.h PATHS $ENV{TRACE_CMD}/lib/trace-cmd/include/ ${CMAKE_SOURCE_DIR}/../lib/trace-cmd/include/ NO_DEFAULT_PATH) find_path(TRACEFS_INCLUDE_DIR NAMES tracefs/tracefs.h PATHS $ENV{TRACE_CMD}/include/ ${CMAKE_SOURCE_DIR}/../include/ NO_DEFAULT_PATH) find_library(TRACECMD_LIBRARY NAMES trace-cmd/libtracecmd.a PATHS $ENV{TRACE_CMD}/lib/ ${CMAKE_SOURCE_DIR}/../lib/ NO_DEFAULT_PATH) find_library(TRACEFS_LIBRARY NAMES tracefs/libtracefs.a PATHS $ENV{TRACE_CMD}/lib/ ${CMAKE_SOURCE_DIR}/../lib/ NO_DEFAULT_PATH) find_library(TRACEEVENT_LIBRARY NAMES traceevent/libtraceevent.a PATHS $ENV{TRACE_CMD}/lib/ ${CMAKE_SOURCE_DIR}/../lib/ NO_DEFAULT_PATH) find_program(TRACECMD_EXECUTABLE NAMES trace-cmd) IF (TRACECMD_INCLUDE_DIR AND TRACECMD_PRIVATE_INCLUDE_DIR AND TRACECMD_LIBRARY) SET(TRACECMD_FOUND TRUE) ENDIF (TRACECMD_INCLUDE_DIR AND TRACECMD_PRIVATE_INCLUDE_DIR AND TRACECMD_LIBRARY) IF (TRACECMD_FOUND) MESSAGE(STATUS "Found trace-cmd: ${TRACECMD_LIBRARY}") ELSE (TRACECMD_FOUND) MESSAGE(FATAL_ERROR "\nCould not find trace-cmd!\n") ENDIF (TRACECMD_FOUND) IF (TRACEFS_INCLUDE_DIR AND TRACEFS_LIBRARY) SET(TRACEFS_FOUND TRUE) ENDIF (TRACEFS_INCLUDE_DIR AND TRACEFS_LIBRARY) IF (TRACEFS_FOUND) MESSAGE(STATUS "Found tracefs: ${TRACEFS_LIBRARY}") ELSE (TRACEFS_FOUND) MESSAGE(FATAL_ERROR "\nCould not find tracefs!\n") ENDIF (TRACEFS_FOUND) IF (TRACEEVENT_LIBRARY) SET(TRACEEVENT_FOUND TRUE) ENDIF (TRACEEVENT_LIBRARY) IF (TRACEEVENT_FOUND) MESSAGE(STATUS "Found traceevent: ${TRACEEVENT_LIBRARY}") ELSE (TRACEEVENT_FOUND) MESSAGE(FATAL_ERROR "\nCould not find libtraceevent!\n") ENDIF (TRACEEVENT_FOUND) trace-cmd-v2.9.6/kernel-shark/build/cmake_clean.sh000077500000000000000000000004301414302661500220220ustar00rootroot00000000000000make clean rm CMakeCache.txt rm cmake_install.cmake rm Makefile rm -rf CMakeFiles/ rm -rf src/ rm -rf examples/ rm -f ../lib/* rm ../kernelshark.desktop rm ../org.freedesktop.kshark-record.policy rm -f ../src/KsCmakeDef.hpp rm -f CMakeDoxyfile.in rm -f CMakeDoxygenDefaults.cmake trace-cmd-v2.9.6/kernel-shark/build/cmake_uninstall.sh000077500000000000000000000004771414302661500227640ustar00rootroot00000000000000#!/bin/bash CYAN='\e[36m' PURPLE='\e[35m' NC='\e[0m' # No Color if [[ $EUID -ne 0 ]]; then echo -e "${PURPLE}Permission denied${NC}" 1>&2 exit 100 fi if [ -e install_manifest.txt ] then echo -e "${CYAN}Uninstall the project...${NC}" xargs rm -v < install_manifest.txt rm -f install_manifest.txt fi trace-cmd-v2.9.6/kernel-shark/build/deff.h.cmake000066400000000000000000000016751414302661500214110ustar00rootroot00000000000000 /** * \file KsCmakeDef.hpp * \brief This File is generated by CMAKE */ /* ! -- Do Not Hand Edit - This File is generated by CMAKE -- ! */ #ifndef _KS_CONFIG_H #define _KS_CONFIG_H /** KernelShark Version number. */ #cmakedefine KS_VERSION_STRING "@KS_VERSION_STRING@" /** KernelShark installation prefix path. */ #cmakedefine _INSTALL_PREFIX "@_INSTALL_PREFIX@" /** KernelShark plugins installation prefix path. */ #cmakedefine KS_PLUGIN_INSTALL_PREFIX "@KS_PLUGIN_INSTALL_PREFIX@" /** Location of the trace-cmd executable. */ #cmakedefine TRACECMD_EXECUTABLE "@TRACECMD_EXECUTABLE@" /** "pkexec" executable. */ #cmakedefine DO_AS_ROOT "@DO_AS_ROOT@" #ifdef __cplusplus #include /** * String containing semicolon-separated list of plugin names. * The plugins to be loaded when KernelShark starts are tagged * with "default". */ const QString plugins = "@PLUGINS@"; #endif /* __cplusplus */ #endif // _KS_CONFIG_H trace-cmd-v2.9.6/kernel-shark/build/ks.desktop.cmake000066400000000000000000000003671414302661500223410ustar00rootroot00000000000000[Desktop Entry] Version=@KS_VERSION_STRING@ Type=Application Name=Kernel Shark GenericName=Kernel Shark Comment= Exec=@_INSTALL_PREFIX@/bin/@KS_APP_NAME@ Icon=@_INSTALL_PREFIX@/share/icons/@KS_APP_NAME@/@KS_ICON@ Categories=System; Terminal=false trace-cmd-v2.9.6/kernel-shark/build/org.freedesktop.kshark-record.policy.cmake000066400000000000000000000013551414302661500274070ustar00rootroot00000000000000 Authentication is required to run KernelShark Record auth_admin auth_admin auth_admin @_INSTALL_PREFIX@/bin/kshark-record true trace-cmd-v2.9.6/kernel-shark/examples/000077500000000000000000000000001414302661500177635ustar00rootroot00000000000000trace-cmd-v2.9.6/kernel-shark/examples/CMakeLists.txt000066400000000000000000000016231414302661500225250ustar00rootroot00000000000000message("\n examples ...") message(STATUS "dataload") add_executable(dload dataload.c) target_link_libraries(dload kshark) message(STATUS "datafilter") add_executable(dfilter datafilter.c) target_link_libraries(dfilter kshark) message(STATUS "datahisto") add_executable(dhisto datahisto.c) target_link_libraries(dhisto kshark) message(STATUS "confogio") add_executable(confio configio.c) target_link_libraries(confio kshark) message(STATUS "dataplot") add_executable(dplot dataplot.cpp) target_link_libraries(dplot kshark-plot) if (Qt5Widgets_FOUND) message(STATUS "widgetdemo") add_executable(widgetdemo widgetdemo.cpp) target_link_libraries(widgetdemo kshark-gui) message(STATUS "cmd_split") add_executable(cmd_split cmd_split.cpp) target_link_libraries(cmd_split kshark-gui) endif (Qt5Widgets_FOUND) trace-cmd-v2.9.6/kernel-shark/examples/cmd_split.cpp000066400000000000000000000020041414302661500224410ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov (VMware) */ // C++ #include using namespace std; // Qt #include // KernelShark #include "KsUtils.hpp" int main(int argc, char **argv) { QString text = "echo \"I want \\\" here\" \\\n \"and \\\' here\""; QApplication a(argc, argv); QStringList argList; bool ok = true; QProcess proc; while (ok) { text = QInputDialog::getMultiLineText(nullptr, "Shell quoting test", "Shell input:", text, &ok); if (ok) { argList = KsUtils::splitArguments(text); qInfo() << argList; proc.setProgram(argList.takeFirst()); proc.setArguments(argList); proc.start(); proc.waitForFinished(); if (proc.exitCode()) cout << proc.errorString().toStdString() << endl; cout << proc.readAllStandardError().toStdString() << endl << proc.readAllStandardOutput().toStdString() << endl; } } return 0; } trace-cmd-v2.9.6/kernel-shark/examples/configio.c000066400000000000000000000032411414302661500217240ustar00rootroot00000000000000#include #include #include "libkshark.h" int main(int argc, char **argv) { struct kshark_config_doc *conf, *filter, *hello; struct kshark_context *kshark_ctx; int *ids = NULL, i; /* Create a new kshark session. */ kshark_ctx = NULL; if (!kshark_instance(&kshark_ctx)) return 1; if (argc == 1) { tracecmd_filter_id_add(kshark_ctx->show_task_filter, 314); tracecmd_filter_id_add(kshark_ctx->show_task_filter, 42); /* Create a new Confog. doc. */ conf = kshark_config_new("foo.bar.config", KS_CONFIG_JSON); /* Add filter's info. */ filter = kshark_export_all_filters(kshark_ctx, KS_CONFIG_JSON); kshark_config_doc_add(conf, "Filters" ,filter); /* Add "Hello Kernel" message. */ hello = kshark_string_config_alloc(); hello->conf_doc = "Hello Kernel"; kshark_config_doc_add(conf, "Message" ,hello); /* Save to file. */ kshark_save_config_file("conf.json", conf); } else { /* Open a Config. file. */ conf = kshark_open_config_file(argv[1], "foo.bar.config"); /* Retrieve the filter's info. */ filter = kshark_config_alloc(KS_CONFIG_JSON); if (kshark_config_doc_get(conf, "Filters" ,filter)) { kshark_import_all_filters(kshark_ctx, filter); /* Get the array of Ids to be fitered. */ ids = tracecmd_filter_ids(kshark_ctx->show_task_filter); for (i = 0; i < kshark_ctx->show_task_filter->count; ++i) printf("pid: %i\n", ids[i]); } /* Retrieve the message. */ hello = kshark_string_config_alloc(); if (kshark_config_doc_get(conf, "Message" ,hello)) puts((char *) hello->conf_doc); free(filter); free(hello); free(ids); } kshark_free_config_doc(conf); kshark_free(kshark_ctx); return 0; } trace-cmd-v2.9.6/kernel-shark/examples/datafilter.c000066400000000000000000000066271414302661500222610ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ // C #include #include // KernelShark #include "libkshark.h" const char *default_file = "trace.dat"; int main(int argc, char **argv) { ssize_t i, n_rows, n_tasks, n_evts, count; struct kshark_context *kshark_ctx; struct kshark_entry **data = NULL; struct tep_event_filter *adv_filter; struct tep_event *event; char *entry_str; bool status; int *pids; /* Create a new kshark session. */ kshark_ctx = NULL; if (!kshark_instance(&kshark_ctx)) return 1; /* Open a trace data file produced by trace-cmd. */ if (argc > 1) status = kshark_open(kshark_ctx, argv[1]); else status = kshark_open(kshark_ctx, default_file); if (!status) { kshark_free(kshark_ctx); return 1; } /* Load the content of the file into an array of entries. */ n_rows = kshark_load_data_entries(kshark_ctx, &data); if (n_rows < 1) { kshark_free(kshark_ctx); return 1; } /* Filter the trace data coming from trace-cmd. */ n_tasks = kshark_get_task_pids(kshark_ctx, &pids); for (i = 0; i < n_tasks; ++i) { const char *task_str = tep_data_comm_from_pid(kshark_ctx->pevent, pids[i]); if (strcmp(task_str, "trace-cmd") == 0) kshark_filter_add_id(kshark_ctx, KS_HIDE_TASK_FILTER, pids[i]); } free(pids); /* * Set the Filter Mask. In this case we want to avoid showing the * filterd entris in text format. */ kshark_ctx->filter_mask = KS_TEXT_VIEW_FILTER_MASK; kshark_filter_entries(kshark_ctx, data, n_rows); /* Print to the screen the first 10 visible entries. */ count = 0; i = 0; for (i = 0; i < n_rows; ++i) { if (data[i]->visible & KS_TEXT_VIEW_FILTER_MASK) { entry_str = kshark_dump_entry(data[i]); puts(entry_str); free(entry_str); if (++count > 10) break; } ++i; } puts("\n\n"); /* Show only "sched" events. */ n_evts = tep_get_events_count(kshark_ctx->pevent); for (i = 0; i < n_evts; ++i) { event = tep_get_event(kshark_ctx->pevent, i); if (strcmp(event->system, "sched") == 0) kshark_filter_add_id(kshark_ctx, KS_SHOW_EVENT_FILTER, event->id); } kshark_filter_entries(kshark_ctx, data, n_rows); /* Print to the screen the first 10 visible entries. */ count = 0; i = 0; for (i = 0; i < n_rows; ++i) { if (data[i]->visible & KS_TEXT_VIEW_FILTER_MASK) { entry_str = kshark_dump_entry(data[i]); puts(entry_str); free(entry_str); if (++count > 10) break; } ++i; } puts("\n\n"); /* Clear all filters. */ kshark_filter_clear(kshark_ctx, KS_HIDE_TASK_FILTER); kshark_filter_clear(kshark_ctx, KS_SHOW_EVENT_FILTER); /* Use the Advanced filter to do event content based filtering. */ adv_filter = kshark_ctx->advanced_event_filter; tep_filter_add_filter_str(adv_filter, "sched/sched_wakeup:target_cpu==1"); /* The Advanced filter requires reloading the data. */ for (i = 0; i < n_rows; ++i) free(data[i]); n_rows = kshark_load_data_entries(kshark_ctx, &data); count = 0; for (i = 0; i < n_rows; ++i) { if (data[i]->visible & KS_EVENT_VIEW_FILTER_MASK) { entry_str = kshark_dump_entry(data[i]); puts(entry_str); free(entry_str); if (++count > 10) break; } } /* Free the memory. */ for (i = 0; i < n_rows; ++i) free(data[i]); free(data); /* Close the file. */ kshark_close(kshark_ctx); /* Close the session. */ kshark_free(kshark_ctx); return 0; } trace-cmd-v2.9.6/kernel-shark/examples/datahisto.c000066400000000000000000000067501414302661500221170ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ // C #include #include // KernelShark #include "libkshark.h" #include "libkshark-model.h" #define N_BINS 5 const char *default_file = "trace.dat"; void dump_bin(struct kshark_trace_histo *histo, int bin, const char *type, int val) { const struct kshark_entry *e_front, *e_back; char *entry_str; ssize_t i_front, i_back; printf("bin %i {\n", bin); if (strcmp(type, "cpu") == 0) { e_front = ksmodel_get_entry_front(histo, bin, true, kshark_match_cpu, val, NULL, &i_front); e_back = ksmodel_get_entry_back(histo, bin, true, kshark_match_cpu, val, NULL, &i_back); } else if (strcmp(type, "task") == 0) { e_front = ksmodel_get_entry_front(histo, bin, true, kshark_match_pid, val, NULL, &i_front); e_back = ksmodel_get_entry_back(histo, bin, true, kshark_match_pid, val, NULL, &i_back); } else { i_front = ksmodel_first_index_at_bin(histo, bin); e_front = histo->data[i_front]; i_back = ksmodel_last_index_at_bin(histo, bin); e_back = histo->data[i_back]; } if (i_front == KS_EMPTY_BIN) { puts ("EMPTY BIN"); } else { entry_str = kshark_dump_entry(e_front); printf("%zd -> %s\n", i_front, entry_str); free(entry_str); entry_str = kshark_dump_entry(e_back); printf("%zd -> %s\n", i_back, entry_str); free(entry_str); } puts("}\n"); } void dump_histo(struct kshark_trace_histo *histo, const char *type, int val) { size_t bin; for (bin = 0; bin < histo->n_bins; ++bin) dump_bin(histo, bin, type, val); } int main(int argc, char **argv) { struct kshark_context *kshark_ctx; struct kshark_entry **data = NULL; struct kshark_trace_histo histo; ssize_t i, n_rows, n_tasks; bool status; int *pids; /* Create a new kshark session. */ kshark_ctx = NULL; if (!kshark_instance(&kshark_ctx)) return 1; /* Open a trace data file produced by trace-cmd. */ if (argc > 1) status = kshark_open(kshark_ctx, argv[1]); else status = kshark_open(kshark_ctx, default_file); if (!status) { kshark_free(kshark_ctx); return 1; } /* Load the content of the file into an array of entries. */ n_rows = kshark_load_data_entries(kshark_ctx, &data); if (n_rows < 1) { kshark_free(kshark_ctx); return 1; } /* Get a list of all tasks. */ n_tasks = kshark_get_task_pids(kshark_ctx, &pids); /* Initialize the Visualization Model. */ ksmodel_init(&histo); ksmodel_set_bining(&histo, N_BINS, data[0]->ts, data[n_rows - 1]->ts); /* Fill the model with data and calculate its state. */ ksmodel_fill(&histo, data, n_rows); /* Dump the raw bins. */ dump_histo(&histo, "", 0); puts("\n...\n\n"); /* * Change the state of the model. Do 50% Zoom-In and dump only CPU 0. */ ksmodel_zoom_in(&histo, .50, -1); dump_histo(&histo, "cpu", 0); puts("\n...\n\n"); /* Shift forward by two bins and this time dump only CPU 1. */ ksmodel_shift_forward(&histo, 2); dump_histo(&histo, "cpu", 1); puts("\n...\n\n"); /* * Do 10% Zoom-Out, using the last bin as a focal point. Dump the last * Task. */ ksmodel_zoom_out(&histo, .10, N_BINS - 1); dump_histo(&histo, "task", pids[n_tasks - 1]); /* Reset (clear) the model. */ ksmodel_clear(&histo); /* Free the memory. */ for (i = 0; i < n_rows; ++i) free(data[i]); free(data); /* Close the file. */ kshark_close(kshark_ctx); /* Close the session. */ kshark_free(kshark_ctx); return 0; } trace-cmd-v2.9.6/kernel-shark/examples/dataload.c000066400000000000000000000033731414302661500217060ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ // C #include #include // KernelShark #include "libkshark.h" const char *default_file = "trace.dat"; int main(int argc, char **argv) { struct kshark_context *kshark_ctx; struct kshark_entry **data = NULL; ssize_t r, n_rows, n_tasks; char *entry_str; bool status; int *pids; /* Create a new kshark session. */ kshark_ctx = NULL; if (!kshark_instance(&kshark_ctx)) return 1; /* Open a trace data file produced by trace-cmd. */ if (argc > 1) status = kshark_open(kshark_ctx, argv[1]); else status = kshark_open(kshark_ctx, default_file); if (!status) { kshark_free(kshark_ctx); return 1; } /* Load the content of the file into an array of entries. */ n_rows = kshark_load_data_entries(kshark_ctx, &data); if (n_rows < 1) { kshark_free(kshark_ctx); return 1; } /* Print to the screen the list of all tasks. */ n_tasks = kshark_get_task_pids(kshark_ctx, &pids); for (r = 0; r < n_tasks; ++r) { const char *task_str = tep_data_comm_from_pid(kshark_ctx->pevent, pids[r]); printf("task: %s-%i\n", task_str, pids[r]); } free(pids); puts("\n\n"); /* Print to the screen the first 10 entries. */ for (r = 0; r < 10; ++r) { entry_str = kshark_dump_entry(data[r]); puts(entry_str); free(entry_str); } puts("\n...\n"); /* Print the last 10 entries. */ for (r = n_rows - 10; r < n_rows; ++r) { entry_str = kshark_dump_entry(data[r]); puts(entry_str); free(entry_str); } /* Free the memory. */ for (r = 0; r < n_rows; ++r) free(data[r]); free(data); /* Close the file. */ kshark_close(kshark_ctx); /* Close the session. */ kshark_free(kshark_ctx); return 0; } trace-cmd-v2.9.6/kernel-shark/examples/dataplot.cpp000066400000000000000000000116371414302661500223070ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ // C #include // C++ #include #include // OpenGL #include // KernelShark #include "libkshark.h" #include "KsPlotTools.hpp" using namespace std; #define GRAPH_HEIGHT 40 // width of the graph in pixels #define GRAPH_H_MARGIN 50 // size of the white space surrounding the graph #define WINDOW_WIDTH 800 // width of the screen window in pixels #define WINDOW_HEIGHT 480 // height of the scrren window in pixels #define default_file (char*)"trace.dat" struct kshark_trace_histo histo; vector graphs; void usage(const char *prog) { cout << "Usage: " << prog << endl; cout << " -h Display this help message\n"; cout << " -s Draw shapes. This demonstrates how to draw simple " << "geom. shapes.\n"; cout << " -i Input file and draw animated graphs.\n"; cout << " No args. Import " << default_file << "and draw animated graphs.\n"; } /* An example function drawing something. */ void drawShapes() { /* Clear the screen. */ glClear(GL_COLOR_BUFFER_BIT); KsPlot::Triangle t; KsPlot::Point a(200, 100), b(200, 300), c(400, 100); t.setPoint(0, a); t.setPoint(1, b); t.setPoint(2, c); /* Set RGB color. */ t._color = {100, 200, 50}; t.draw(); KsPlot::Rectangle r; KsPlot::Point d(400, 200), e(400, 300), f(500, 300), g(500, 200); r.setPoint(0, d); r.setPoint(1, e); r.setPoint(2, f); r.setPoint(3, g); /* Set RGB color. */ r._color = {150, 50, 250}; r._size = 3; /* Do not fiil the rectangle. Draw the contour only. */ r.setFill(false); r.draw(); glFlush(); } /* An example function demonstrating Zoom In and Zoom Out. */ void play() { KsPlot::ColorTable taskColors = KsPlot::getTaskColorTable(); KsPlot::ColorTable cpuColors = KsPlot::getCPUColorTable(); vector::iterator it; vector CPUs, Tasks; bool zoomIn(true); int base; size_t i; CPUs = {3, 4, 6}; Tasks = {}; // Add valid pids here, if you want task plots. auto lamAddGraph = [&] (KsPlot::Graph *g) { /* Set the dimensions of the Graph. */ g->setHeight(GRAPH_HEIGHT); g->setHMargin(GRAPH_H_MARGIN); /* * Set the Y coordinate of the Graph's base. * Remember that the "Y" coordinate is inverted. */ base = 1.7 * GRAPH_HEIGHT * (i + 1); g->setBase(base); /* Add the Graph. */ graphs.push_back(g); }; for (i = 0; i < CPUs.size(); ++i) lamAddGraph(new KsPlot::Graph(&histo, &taskColors, &taskColors)); for (;i < CPUs.size() + Tasks.size(); ++i) lamAddGraph(new KsPlot::Graph(&histo, &taskColors, &cpuColors)); for (i = 1; i < 1000; ++i) { it = graphs.begin(); for (int const &cpu: CPUs) (*it++)->fillCPUGraph(cpu); for (int const &pid: Tasks) (*it++)->fillTaskGraph(pid); /* Clear the screen. */ glClear(GL_COLOR_BUFFER_BIT); /* Draw all graphs. */ for (auto &g: graphs) g->draw(); glFlush(); if (!(i % 250)) zoomIn = !zoomIn; if (zoomIn) ksmodel_zoom_in(&histo, .01, -1); else ksmodel_zoom_out(&histo, .01, -1); } } int main(int argc, char **argv) { struct kshark_context *kshark_ctx(nullptr); struct kshark_entry **data(nullptr); static char *input_file(nullptr); bool status, shapes(false); size_t r, nRows; int c, nBins; while ((c = getopt(argc, argv, "hsi:")) != -1) { switch(c) { case 'h': usage(argv[0]); return 1; case 'i': input_file = optarg; break; case 's': shapes = true; default: break; } } auto lamDraw = [&] (void (*func)(void)) { /* Initialize OpenGL/Glut. */ glutInit(&argc, argv); ksplot_make_scene(WINDOW_WIDTH, WINDOW_HEIGHT); ksplot_init_opengl(1); /* Display something. */ glutDisplayFunc(func); glutMainLoop(); }; if (shapes) { /* Draw simple shapes. */ lamDraw(drawShapes); return 0; } /* Create a new kshark session. */ if (!kshark_instance(&kshark_ctx)) return 1; /* Open a trace data file produced by trace-cmd. */ if (!input_file) input_file = default_file; status = kshark_open(kshark_ctx, input_file); if (!status) { kshark_free(kshark_ctx); usage(argv[0]); cerr << "\nFailed to open file " << input_file << endl; return 1; } /* Load the content of the file into an array of entries. */ nRows = kshark_load_data_entries(kshark_ctx, &data); /* Initialize the Visualization Model. */ ksmodel_init(&histo); nBins = WINDOW_WIDTH - 2 * GRAPH_HEIGHT; ksmodel_set_bining(&histo, nBins, data[0]->ts, data[nRows - 1]->ts); /* Fill the model with data and calculate its state. */ ksmodel_fill(&histo, data, nRows); /* Play animated Graph. */ lamDraw(play); /* Free the memory. */ for (auto &g: graphs) delete g; for (r = 0; r < nRows; ++r) free(data[r]); free(data); /* Reset (clear) the model. */ ksmodel_clear(&histo); /* Close the file. */ kshark_close(kshark_ctx); /* Close the session. */ kshark_free(kshark_ctx); return 0; } trace-cmd-v2.9.6/kernel-shark/examples/widgetdemo.cpp000066400000000000000000000060211414302661500226160ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ // C #include #include #include // C++ #include // Qt #include // KernelShark #include "KsUtils.hpp" #include "KsWidgetsLib.hpp" #define default_input_file (char*)"trace.dat" static char *input_file = nullptr; using namespace std; void usage(const char *prog) { cout << "Usage: " << prog << endl << " -h Display this help message\n" << " -v Display version and exit\n" << " -i input_file, default is " << default_input_file << endl << " -p register plugin, use plugin name, absolute or relative path\n" << " -u unregister plugin, use plugin name or absolute path\n"; } struct TaskPrint : public QObject { tep_handle *_pevent; void print(QVector pids) { for (auto const &pid: pids) cout << "task: " << tep_data_comm_from_pid(_pevent, pid) << " pid: " << pid << endl; } }; int main(int argc, char **argv) { kshark_context *kshark_ctx(nullptr); QApplication a(argc, argv); KsPluginManager plugins; KsDataStore data; size_t nRows(0); int c; if (!kshark_instance(&kshark_ctx)) return 1; while ((c = getopt(argc, argv, "hvi:p:u:")) != -1) { switch(c) { case 'v': printf("kshark-gui %s\n", KS_VERSION_STRING); return 0; case 'i': input_file = optarg; break; case 'p': plugins.registerPlugin(QString(optarg)); break; case 'u': plugins.unregisterPlugin(QString(optarg)); break; case 'h': usage(argv[0]); return 0; } } if (!input_file) { struct stat st; if (stat(default_input_file, &st) == 0) input_file = default_input_file; } if (input_file) { data.loadDataFile(input_file); nRows = data.size(); } else { cerr << "No input file is provided.\n"; } cout << nRows << " entries loaded\n"; auto lamPrintPl = [&]() { kshark_plugin_list *pl; for (pl = kshark_ctx->plugins; pl; pl = pl->next) cout << pl->file << endl; }; cout << "\n\n"; lamPrintPl(); sleep(1); QVector registeredPlugins; QStringList pluginsList; pluginsList << plugins._ksPluginList << plugins._userPluginList; registeredPlugins << plugins._registeredKsPlugins << plugins._registeredUserPlugins; KsCheckBoxWidget *pluginCBD = new KsPluginCheckBoxWidget(pluginsList); pluginCBD->set(registeredPlugins); KsCheckBoxDialog *dialog1 = new KsCheckBoxDialog(pluginCBD); QObject::connect(dialog1, &KsCheckBoxDialog::apply, &plugins, &KsPluginManager::updatePlugins); dialog1->show(); a.exec(); cout << "\n\nYou selected\n"; lamPrintPl(); sleep(1); if (!nRows) return 1; KsCheckBoxWidget *tasks_cbd = new KsTasksCheckBoxWidget(data.tep(), true); tasks_cbd->setDefault(false); TaskPrint p; p._pevent = data.tep(); KsCheckBoxDialog *dialog2 = new KsCheckBoxDialog(tasks_cbd); QObject::connect(dialog2, &KsCheckBoxDialog::apply, &p, &TaskPrint::print); cout << "\n\nYou selected\n"; dialog2->show(); a.exec(); return 0; } trace-cmd-v2.9.6/kernel-shark/icons/000077500000000000000000000000001414302661500172605ustar00rootroot00000000000000trace-cmd-v2.9.6/kernel-shark/icons/CC_BY-4.0000066400000000000000000000443411414302661500203670ustar00rootroot00000000000000Attribution 4.0 International ======================================================================= Creative Commons Corporation ("Creative Commons") is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an "as-is" basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. Using Creative Commons Public Licenses Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC- licensed material, or material used under an exception or limitation to copyright. More considerations for licensors: wiki.creativecommons.org/Considerations_for_licensors Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor's permission is not necessary for any reason--for example, because of any applicable exception or limitation to copyright--then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public: wiki.creativecommons.org/Considerations_for_licensees ======================================================================= Creative Commons Attribution 4.0 International Public License By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. Section 1 -- Definitions. a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. c. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. d. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. e. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. f. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. g. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. h. Licensor means the individual(s) or entity(ies) granting rights under this Public License. i. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. j. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. k. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. Section 2 -- Scope. a. License grant. 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: a. reproduce and Share the Licensed Material, in whole or in part; and b. produce, reproduce, and Share Adapted Material. 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. 3. Term. The term of this Public License is specified in Section 6(a). 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a) (4) never produces Adapted Material. 5. Downstream recipients. a. Offer from the Licensor -- Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. b. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). b. Other rights. 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. 2. Patent and trademark rights are not licensed under this Public License. 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. Section 3 -- License Conditions. Your exercise of the Licensed Rights is expressly made subject to the following conditions. a. Attribution. 1. If You Share the Licensed Material (including in modified form), You must: a. retain the following if it is supplied by the Licensor with the Licensed Material: i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); ii. a copyright notice; iii. a notice that refers to this Public License; iv. a notice that refers to the disclaimer of warranties; v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; b. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and c. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. 4. If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License. Section 4 -- Sui Generis Database Rights. Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. Section 5 -- Disclaimer of Warranties and Limitation of Liability. a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. Section 6 -- Term and Termination. a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or 2. upon express reinstatement by the Licensor. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. Section 7 -- Other Terms and Conditions. a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. Section 8 -- Interpretation. a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. ======================================================================= Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” The text of the Creative Commons public licenses is dedicated to the public domain under the CC0 Public Domain Dedication. Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark "Creative Commons" or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. Creative Commons may be contacted at creativecommons.org. trace-cmd-v2.9.6/kernel-shark/icons/KS_icon_fin.svg000066400000000000000000000024201414302661500221600ustar00rootroot00000000000000KStrace-cmd-v2.9.6/kernel-shark/icons/KS_icon_shark.svg000066400000000000000000000044461414302661500225260ustar00rootroot00000000000000KStrace-cmd-v2.9.6/kernel-shark/icons/KS_logo_horizontal.svg000066400000000000000000000146411414302661500236150ustar00rootroot00000000000000KStrace-cmd-v2.9.6/kernel-shark/icons/KS_logo_stacked.svg000066400000000000000000000143251414302661500230410ustar00rootroot00000000000000KStrace-cmd-v2.9.6/kernel-shark/icons/KS_logo_symbol.svg000066400000000000000000000114521414302661500227260ustar00rootroot00000000000000KStrace-cmd-v2.9.6/kernel-shark/icons/ksharkicon.png000066400000000000000000002351321414302661500221300ustar00rootroot00000000000000PNG  IHDR' 7bKGD pHYs  tIME %fiTXtCommentCreated with GIMPd.e IDATxyUY{ gs ZOOHDA]HJ;E)SB%񐸂I%8ƔcJD B$_o oOcsv'9oZwmI)`<Ɨ0s<߱b5'v7G6;Õ`3Kqa47Mnݩ4cDDJ)F/$97B2cGMMqm7^ן}TW'< _CX/XyX݅ƻ}Auv‘5z>1Fю' >l޾[4;ST㠍h4ZkJ)#H-҅#'XydzeO-RHaç_m<?up{?;UeY)JuTU0_]ZS.z.ڶ(to7Hm@DS D % DHłxTsS,^tc4 HS~Y>2S2}L?NM)= |$;uy*?Xz}v_cyBMD"1'),.yTi ʣK\#BE Q!!^!Khh4)%B (fJP/"R*V׏к1{s4i Ӏߙҍ;BkgL))W^y ~ ߹Zע1oTih" JGDC۶RC"jA$ZbR4Z[LG-1F-(ĈI%Jc1Z)і&vK׎穋V"uoH< V,UUх:^{nE [*y/Q}ˉsQw|[c iCg<`RDvYVtH"tQHPT e#b=>MRGYZlYB")hkL7S m!D) )H`J UP:A\PlY4V+k OJ}P1aPSJܥ/`<XÏ~pIv1MMVD:z^Ghр"ER m 0'3Zm={T=\ wı#N=5EO$X]\GJ#1ĄE(SfZ[&ô5 RN1eBPմQ8"$N7u:aZԪ:/p !5S6G_&H;  iH QbH ,k=Qԕ%)Xx('(kcWFQ&oIc9Sd(%R@/X^?L*Q!H7fsmn`=X'%)S=]pѓpd;wi6wPЙx(a&|gCaPo 1( (+LYp'M\?K%v9g ,oscxשCq` @ $Ep$ gY9đ'NS N -ӫ;|9=ztdf!g6JB , D%B8,\g*xƻ{l]X0XZ?m׷^nM~xsyʃUrj6V7Dԏ!$ *kFLSǩG桷7|'s$mY9}# ;[Ѣfg{^x6bFGP!!Q4c|vÆ#g Y8}T+v[X1>!B)׆ tDx6$4D*-087ٺz.v"ӑ')~0"5GN(_K߼;"3[qWi~'uS|NcZ3 ɳ~kǎ0^3^ N"m 6a&vՓX;J[f缮H@pyc9֩(cc-(€ܾS8!'N`aTÒ(* "IL7 ~9ܼ·ӿ[ LImJ9Gp#Jm;'yFDבTi>_z~oDOiL4X꠱「[qJ*)g^E~eێ<|?echϝ~:Xsɨ7]to,jMDVѹ)fA?9dgSIcm&j؎iܔŶƇ^g1`(/:b/RVǤpt b=zc nt %7t?i <}O+;=LEA:#zJ!9x?Ͻ)w$и]e1z"?PA{ut6),%XoVhMTWٸ**DEcT!9OP}F[SO/z/qo]w(-ľw)D +k;HْO{OZLaA1"JI*#ʲa0B$ui""۔״F#X, 368!&%>|m=ۛ;|.@3a`I*ǜbyW$ "eؐFQc^܃.\1^w; 2,.QbQ 7|_O=X}C{?+"?XڃVd.kcڨjBM =D- GqnaUAPWKĪ ee]Pq"tz[-"[_3{PJMF'Kks#>]ZYmT򦈎lS=)3 dqШR, AME+?rٕ?E:ֿuֿ""߿0>-jfu֤l(B(!{(cBVǐ_/J m d*c09k=) -f+HQHIhvH_R92 kg$$wcZf3*{'$s/[; Z״-* b@ݯf1~@s -"ѧE4o[tL4.kWs[_-jn?iw $"†,dT+}69ͬYE"Dpsr*Ma:bmbhZk^fþU3e<8"= 2Jce*J$|tHXlmA7K ӑhbfcH4)*!C'48\tti(%E]6@p%%TBdI]"-)!<(QJe0 birJj೏ιth2h#".iw-V .<(=| PV DDBݳ?G;{=`ܻw8[|s #-"wЙEXOD! ,]8ޛnj$ܹV w DA2~L^âo_뱃sxk09u c$DL)`xͻOs? "y"[}op*ŨY|M|r7 ݼqvy.YOe染3O7usA%^l|wOsA.\z=ffs9٦%mZ$O_~ǡo?C~_m6f̨6@R 7$[$:Q=-&Kc}BQU"=DP".z5ęEq8aEC$ *Ȍ#"=y(qsab׌a>L$"̘umMfDPS񯾏CozϏ}!+>sHbL&}DkMիAu PRBYU$!Gms\Ô&B;v-QFrHk$i$GήKvfqFg Ѓ?1spϋOTd"GYT\5,,t/Za˜3!r7Щ{/h.HO{FѾkfa0fsK+PJ}Drf2ML(W4d0M Y_(Cuvo0FtDWm.L$IYVfg1v]o1=&?sf==B2фS꺦rȢdyf2m"7=ݶ?}g;׿g</k-4KmoP3p6*yRif23wYb7ۜ ){%ՠGAIBx& ۻL;U D>1s{?9uƜ?{+Ik3UUeOEbf!9`tqnIأ#RQV*u%f(;PbiG`e| )E f.v.'ΟA{ @m*Ɲ(+rބVL4Ǘ8~(`]P3˴8c z:؉¤;)DI=$uIGŒ2 K\(Q1:LaFN):e  PdsI,ZD;fB)BY T3ISϡƑ.P3Q#A7_e|πӧN@=,>~˴ڣ8 =D z'{GqV> X)8rljhAj:ЩC ңfʘ7nskn1ٝfAr狈f ! e^"0AjKO,IALjJKC蘀{u41=B(zqHL%RhC (h',)tn)fN0}nl_` MCӨ!J2 Ӭ9'X@+7-fF%Cǣp?ĉWEY"miB/hf*d(=)Zdx:%(U(J(TeO m4u.* uа3a\M-uѳGYXd5A1FNz6vz*qk$ OBJQaFWnqK챋'ЧsGY; faŇ8gV˴47xcϱw}+J :ABHQ ) W@uraѴcwĄ]zm@Ff A吥6Ħ٣4EAoeY]+b*R +ˋUtw0$%(:&$"TR5< 77HhWJa`PM"@2k :aqb/qIr)e2ia(-2H$jDJ JV"!D e)v9?賸@ݫhcC ,]aoc?;/m`:EjEJb.:҄PDaV : mZ'H(6m^|9^ L]M/Mf^d$JxEOX8H}eVfYV%a8гUUS ba=r UST!+Ey^*baes+ VX\]nw6hf8rV)G/+gVJM$P״Ȑc;#_:V:ȧ>in={ [t\0bɩ_~췿Xo?|tMo6;vn¾Ca=>CBm]rBӄXj]qǎJUl_Kh6vt*bDzEN@4˧s_} Д>7px vPbZV %eE#Aji vݲ~(qXg5Z"aݣ,+ IDATs \ٹ+ϾpW 7eSR)(H:^;.,pŞXb:3I*d ܚpHm9&[ڬۍx %fL,)F] 4 mF(Svt*+uŒۣZ3A-xӟ}#c; Yf-~Oݤ1Ō q7RFUhuBC7/ho_I%$JcCn 䃙g,)1PG1]$M4ii(&m,/& іS$j&S$F553\@(3*)pOp ŝ`s_b/;|:^UaJ&Vc %FP.&ðGvb+4s8bl(KFRk[˅"t44)wyLK :knA謧ZQ./`5BIYMFܾqCݢ] ԡƂ1*v.BG:VlhcC_B (FCO4C=[ Jt ʩ0)UjPW$9G__'?5]DR-eӪ@kM7hGmuܵ2kht"p2? .p혢.@{\t(b(i2"ҹ5LQhMQtՎpԡ&GSl^U&&ER4Qj< fڜ J*!2(si-W *bbGGc5M=pNF%B$$5IB.rp̎PCi,J)d;YqE߈@^δUP粕j߽?`j1'O!(hJ ÒdoH0쒂Bb$urhi *Vd6@o__>_=ݏ> jyo.R\𙀛P >S"LO҄r`%EvqۑG!yR?3p6ơB)ѡzdaYba}\d"L ,Vc2` k-mxBH.K#(0:xœ)4E$ih\C!7IFBj"-WY)3k Y=Dl޼vw0JQzD<ϩ UEAܼQ)OfR42M5"굀C[ @h)T3pchh '8gZ_}ْSȏ*I;:Y:y]cv7wq]\|bcJ + 7uq @KgVY>/}%""9X%8FBz8sG(18a-F7x2i}K*FHa&SF6$BgJ􏮱Yu#&;Ws6zHb҃bf$b.vTF`"tRQ W !ym[&SDazUϙu\V%qZJ!bt.5r/R_\8v4Wz˘4Sݭ-OdЦMk_EԂP9|~'){?/N)P,Y:~ŕelUP_TR"[9[b, tas#nu- V9taNR_HVRCNV%~άm?pѫ kii>:NsܚnGu͙s~9zGJṄ֢[G^Ac5AARb> O 5x_U1+\Ln:ˉX]]bӗyg9e(FڔHˤYYQ"kH\ZBi|B+C q_ s&zꠙн\S""i])^K%C4TuiDŽT%Gs.P=,Sh@&7Ɠ8SWeΊ)fKXPyOr+rRFLsnlc~k~䁻cǢ _]6g2\?D ] L}|iLF=5f&&zz c! _dS@3Qv+ j$Ԃz PH bGR_ІK);2ʵ|CG^$nUGxٯx%yHxΧ@a*wٕU@& A GYpDkן$>".u#gp)lYp[;Q*y) h$wȨ` Cia^ALr*gpl?>p[Qt'p#Oxx鯰xtso~Wn/Y !"I7k?xƑׂ >`qJMN08*KxB(kpoZkEeJsG.J͎9ee}YQ`F%p̘[N\<˩xCO32@.)MQ -^;BGAi=gX)ój&ĝKzg>t?8t(oevwXY;r1 MaSf.^,GUIAQq.|Xz ^Ї~*g9ʣ6Uc9zP~!y:?XAd2BV:ri< 0a9QhƎpu DW8rj7&,ufe6~fh8|~:%mL(J457iwvh *=ǥr.(qV a7_/ y!Fα7v~}&gΝ0-={s]U=&ERԘXb"LIC (#؉8.PHp D1 Ʌđ(Qd]CWx5biH6eU*Tg׷}kы'~ʿ[/\ŭP`-xT,GJCL֢|H5ʀJRSvYEjDpbG_ G9SOP1`" zJ$/xkԴQ<'w-]NcFA_*!;ι;\y9\__@#W>oȄGZ;&ܧcRޔB4gMk9,{㐏4l6ă`lt^ybȑ\e@1{{{vA%Zڄ쐨%R8 pP9[Z;VdHْi4E2@iLJpW%r47 ZZr/>ɳ<]^lݖ?E(,}ѠF9, J,&GbHzϹ1|Ē5%U+pQA~x_=ctJh}hYAU׼;qpt䘞T4H9@G.ua8.ӽ^rlR.S=Vt ALcKr͎H!=Z+z>:KsB;zL(E*Ae"fz=L5|^:p;FmIiEnrʲ( *~;!%bh>WNLͲ۷ 8|LL3U%2/QrnD`;5~Ig]ڄ?ejLoԿ{ ]πж-I%Ҿ$ۺp@% GvWKܐ8kO )@'$.xrF&x2!/$y @SغA5I>5@Ie SL)ZҢȐ$ "Wdz!ED枸 c@/ [5L *DwAsֶ=4iTR1Ȏ\DcQDe<3ۖ VV[td EQGr@.68*.Fj%)z9:B-Fl:9-5yAx>Cْue@EF#X&'R7誄hbt WdQdpe[pn]PMK4'.jO9A , ئŷtй!+5"Iӄt);㓰iNneoȧ]1.lH>_Gt?RIڨG0[ vęK] *mR٥J߇N.\3ʻ'w@*ǣ$20ZE]B_uq4wDğU~_?[?~)y'W<%Xo? P\ڑ@JAkAd?I_W2 ۙD*Cws+B.kR(R5Dol&5\@$232i-B *HtTQJYMw. LtJTQ$U !1w OLX2kru`kyz4 .#G̎̏*挮YUC@ӪMj-ާp:sz'$JF ߨTq!+-S"uȉ%RNrIcpv_%zm `W]g~oX@ԄBI֙μ:|'>7+ȿ^IE~٥5-b (!DuȅDiM)j&fN'iqt)wUu%!ӱCk- ~[j5*'BoWM1h?Q""ڳ<<ݛ׾\&\֧7({ȝyox&cy*c RT >@ Lj3s42Lc0A= 7#5QO" 4MwbC ǿS W~vۿ|OwsМ !NY!F2_74uM ɨfC}5RӜ"Rw_=x9nt1SEc*D܁RtsX!Ҳ֦Ɩs4HWuؤŻ^wedH pqP#tI5xA^|KDS4yx2)ӚZ"ΗԳ s$"wۃ^Mw8"`O!ω^1e۞5;k;g ^=yƫw1t+UޑŐe bEOQ-nw,\DBGT*'-E)l$#h2jJ$N *ADg-3uРE乡,2By}ӛ| Cn <9sMlN->cxyýOeP 2uWsE|AQ)A'4pܩ)jp&&"H:hn'Lp' =yݢL٥:%wp UqiF`IdTߎ;K_F9.SZi8t1$<фhafv'힫#&4 9T'B|2>s$73rh!!אXϔ|)׾ 7ކyDnAq W3]Dw~8XMs4Ml8xje')"B#?gpw>0.9빐$'U'G Soխ\N"E\jXX2=!9ǻX[+chp U /[:Z=#WWl˸~kgqR IDAT?#n\p`7PSWɖ(d ʣgj6 /8V|3gsU8x 'v3]=CWq|뉎ύ|j$+.P:]m)bHDE'p蚣I7w킸J((.$BkaNYBt|ZpӔrpWDޯ&!Z vz;gwf>^qe PUF:g< C[mU -NHN2N `Ig4Dy!%z N{'U*uFWIQ"I.՜6}vlE 1䬥^V Yd δBf$<W7ԋ%¥ս*W*]T7IE$jٝi`6ݮUEXvΠy8'sg)R87^qEWTK%˻77^y5qK *#srGF.1(޼/H0>}s/{@ ({9J;i5]e<[,|Il=;gBzѮ>əZU""HTF.0i*&S\0ihzٰ.pΣB8甫/EJQ{D% 2T2Z 4"b,hTf3̞ 5$[KWn7Zr{{Iהc"i!4r=ۜ łsshm!X+ۡsa- G}H$"hI[U6U[,(˒J"1_]w}/Tϟ_ҕmKheRJHg Z LĦ]VT%44RZi|$ )rV <(2L ]Tǝ/h Lqz$vqOmy.6kqxkn߰z+(TF/y@"a$!*6CH>QˣCpngnzاQg+K:ݑZ5RO"c?+S_[?G@? u#={cθާ=I°F):T¨+"JT/ܶ-mݠ:Z\BW^kq]>|_,*k) ȿ΍fcqu…"ڌdvd;o6y;p|$ 1#4Nm=.TxTd;I?dx2Ep4Mg5Uhn);ͲƠ2ӹiqJbK??~?Յ[ cSΟlU /rPmȋ>*3h o2#(E*2dRY:ԯb mpEAfR]t>AH'8RCc,l0A9)k!aJ(zH/aՙ-$US#e{s FώY箞ʥvkǷ5Bj*KԲ"'~=➦h dvt@5xɃ7Vx6`'(DHIs*aMbŘQ`ˏ*#<B\\K%׷%Iލ!wo?>bv 1Kr# zRn0TڥP  \"B!| ,3tPυ*IHdP %~Hb'bK,*cņ7AK2X+'̫t2SJC >-ʮუŠ1f,kn]._/1)~QM$z*O_֙cn~.8(mVԚS;'}\۳Ke&.F &RjE!Zb:5`3 k"v5DWp\Q-%T0E J)h2N$4*#M* =:E%9#yyH(#3)ssxz:# CB9@<<?&)j=I"jlo12#j~|0(tT~&/_|)o8#x%XL5(v)B -b0kn;hrJ+e7JBhJ^^)Ȟ s|Vod.,%yIPـ)*Z"6&hM:`-Oz"R%sQTJ;lEQ VrwSDuqF[d/&@D_Crpp}BD0t?wOOm]Ng}ɐr5u]c]%Upʢ ٰ G=bwpRS--!E?GoQ"5RK9ߺ3x7`6W&,sLQk׶陒ݢzOnJuNpJ"xp! dfǤ7kWX;`zkf@A>qY{7WoV@1gcʼnbcXqiñ=8$"7:䭯pdztB[rHoX"Z"id;ޱ1DooˊKyt<¢r؎,D u]Gvͥ:MGsL0u>X ̨`FT =֘{)B d ZD&^P/{>7ٹr\zssqvQHK>sl_&1z{=$,WHs剞 췲p|ŧ_ǿߜZ,Pb52| ! C+nL[7鱌Mwhby#Vs%VƤT!bgDyeBqe6?z,pxd.dfz#QdR#TJj"D$ $Ohr}pZh#un?wMтr|Q]4 ꕠ&,zJ/9w<{`q4*0嗞8.o5x:Is&Txq'f|R˅{|ʗ*<[ 23YFn4Z$Rw.ƩV25ewSg5.,Qd6ykW`e ySZ)G_iV1`3C. Pl^q9 dhe0`zkh:iڥD.SLyr-A`s=Ȭ#r*3 O.1ޢ{B^ ڀeB_i|]}o7b~;:x|a_ eL3Z_cm{W@SWJ`>&W^Ey~т)v\K\熸<`sɒ踦F#ȨXRȸZ}Mo?"[  Q@e2KOsSQ>"p[8娠z|ȣW^zWq,d' @ mgX"kWv@I6&chZ滇y6 ㆑-(A>chP>x͊jqñ8e 2k :hZµ̖ q2/5QuyNe(Z|ιn$c xkާUW^ +\xvMDaV2 |l;@5`5˃/8{;:{7s.m7tCAZ&W\u k2c* !aǽWoGm$V]lr;V*?wyAߒ-*o|D 9--s5D("JdOEyjtLjP U@FMU\Xʊ6Okjʰ ,4Ufu!}VJ3C[uMF{\ P=n5EӤ>ɒvٸDDf#LR:n 5Apro0!!ԆjZ64+XmvG /gzczYI[`mn<`sC AWHlETQQ,a}.|.NS{b.s8qY@(0EJ&Og鴾B^!Q.ZoZ2E{]y@_UyK;kA0(FVLXl}ZM,GyN,q9́d2ж-{!h рgύ5ח 5ww#:GaX3XqbLfHdˀwRU* i$sP9|Ӛk+k$-E-WCngߙc8$F}$6&\5jɠ();29fuJ\6G6aFЬl"I[UDdXMX8q޸gx=T I *(M UI E4DOwd_-cIT>(֨egN*sMUUQS6LI`.1*d p>bI3m| l6< =|KQ, q -F(x%"Uj4yZCRTRoL )b})CH >nO}`/+D2Ss*} #tvW!zT|9=1޲XZZ2zMI!5Ͳ&((tk,l=xDz)%MSN;YΗ '},K^ZYf )z9:SyM&NBLn(kQޣ}o$p*U/ܝK]n:KA"S([)MЀ.j)iA Yg$˄~QD~I.jЪtnv2%rR[RxH*хBi)2iDiNk. dNc&C1EԞ "]W*F*Yj`\U3Ac#t3FaɔB64Q&/p!YZ'AŖoyZQI^8ɵSQ#oW=' M娲CK$DM Aju6KyvsB4I44QA$ 5 =A{l) |`kH0'xfLmux*/˒pue#YRbȴȲҵmDT@fOи"UU1 ֚ xĐA%@)&62)&-@u%3DpRIT(DL)1hU&ku<&8 LEZnN~[Z6WeeBVR!H"N%*2Bv,Y(zh5mD@hls<=b32 KFE ī'ʦoő yCǸ2|9- 1rIdHء8e h*g;:DqQH2.0ĵ4nT<* V訄Z\@UZǑ|d_<{rm˫_x͚{w$9$X[E9&SLzNz+8g+>iR2佮iv*&Q:c*S~>@n`ɲʰBUp>CɄMUƒh82 b C^κTT'[HױC@ CF%J״(%ȄisH_8(=9YԨ 0r|5)[G]s /k|ږڡ$“9FD +cu>Oi mo 9z|#{L ց09L.S5tp]5t _[sqI8.Sy1%32,h-DӸt/nv~u{GQg\:n΅$kŤ1Q*cܪ ٗyKd»z^C#9!7$޵,5)%EFp @4$t!:敀 - Ao2,v F4 z!]3d9IQ9w5.B$lC WJ bHAZ'mx٤' YF:^V9HbU&*.tUZ%q"5])qed@4bcf ~ZZ">"@*Op-ށiҠ CW~OOok룟'GEP1`|ш:@DODv+GruU˗Ʉw1o9 /L!="ʎ=~UShRz+ /0\(Lz:.=&*5V3bP8eQ"g9_~a Mhog=F׶3\vM / ]br~voW/ph!'LkgqbDi{DI X-zϨ4&j D@AԔ qd"P54lp>Q֟:7or|xD]/ټ| /<+L.n]ȐuHS:(RMk`xe/4 Ho<`rask,ʒ7vӈs-JL5R&0whHrTeu6_ŗ13 &tOP <aI|m[Tq~Ob̏\ox’C& ީ8<*dHdpa\Һ9X&CA >j m)Vc1'Ew Βx1ڀǭ]n3J_};8xp.хu.\psJ ㌽;}.QA#҃$dZkr4tb1#@c41^_#؍wq;]C+4P k$h4%)#F9 ֆLt(C1SWXC>DdGܥ=0Z2rKAަ3/} 3|V-\@ȐĎ֐6WԄ!X6.'^3WXMr Z4 ˌd/Jr#-;Y'KF{E[W/w~1mF}d(D} ar':L'ˮ[,Du$ڦA+AhD˜ ׶/S\YÌKY\GSiOtO݌Le(YЦwq K3Jɲ8z߯KX<LdYik.ؚ8 IDATŘ@VmX[v3D)Ժ8F1-Zu u,E]y0+ +\T3n:}M⻇/mx?~*[ZRğt6F:0+ %d AD :G%]f%sܻy"w#gwؘldk_=DPPQ@E=\Fkmpm>-',G?d6{UΫԉ r*%@oPRfa+(c%.4>r 1ڊtF1*)hi בt #fet2շUDJz_x#+@%Ӆ5_y׾dRڡDmYS ""rc 8"EtѮM-ܴ="Q Xe/2ވ̔Àiνxm*[Sed_ޣ1X-`Rt1:6)3bmDٔ yUl멦sTёDW"5%VieJLhO=hI6dtqsLa;ːKֵԾ6`<ї/o, kՓ,;s>_77`2Ɠ`2]dVDÒa9A "EM /z!V68bJ o6#%hpmOuސ)s)L`! L 9^P1L)@HR(Zp22 "HM.EQ tPATiLZ&:΍m RPdq<:`lyI1*J]+Gu^,q5A\xjڃivĶ!G樝zg?55M/_ :d.!AT AYlɔ#= i2/46WGL 1eDiق &'?sDa#B{.x5NX|fYz>+Os7H0iDEJ4MmUG.j<̔mIHI 4ηo:a9vIuQ}{޿K0閠 eB{ T{PRf ,FvrOP{ }KOc9aHEt€39p :lsg7/|;1&}p`5bi}&au(46'"1C xlt?8"k~f8.m1f,z]IMH/)$J$5*^$LգmNeʼnznuQZQ`h`W#چ VȺb _~ qaBC{o#oqhmIsLhμ[jcˉDDd6v"Y.cppf4b0^!\/71{->[5[M .jRch=ހ3uozT`"pdhQ;#g#Ց 4-S4 q/ȅRY)g7нBtvSFfÀYiJ r+#a Lo-VXhk-ʚ|?x}FCz֙'.ՌGwܺo0!`̒$=!$Jh&! Y3$/Qdȥ`!datQbe_ɲ\D@d!)ob:0(9X.X'IRWDTJGrq-Gzvu]OpkHqLl!M%](zZpeqe5. הVBM`]iv>W45RG}J45[;H~`~t0 (?Қ=H7_5i/ <(%DuY'(}& %P {s:*A4AQ⫫]hI#Opx&Rj&Z,+#X#CcV|zW^S@CdldHpAh5SxDZ9t܇!eSt"Z㕫+qBu)B:N#{sCma4ajlQz|Z #u:oVF+œi !A>DLlhh Y/hChC+UVta7檭$RFȜO1dItv$P` Ne)FStSe~aX[k> CѶ-ucÑ̳|8Km-B!^x1~O+K=)5rN+#+hDep)0aȪ| @x!VӰ.]9F}QGR5z D apZ VJӒ1 ,'h&GM >Zbb6_F#ƈU[<ōWH~{o7zΛ}[Skئ:OSh >\!ETᆬr=HTmYI.@k% :'p"U6ҥD aph;R...ϗ3٘d ibyd\0-!8tNANJPV%ȗD)(|N1ɇm!fXYTT*ᤒX Y|V"D&L66.1~y !xWf\U"a'#2n5.>< %QJ롼fH ;jR(k/e)l)K s"3e2Y,+/[J-OwRbT !`d)bF]g.{_2|K1>]~]xnW_9+wi4*Q@ʈHy@Xj<$42iRY~Fd%!#R9$DCJ)DV.(R(P% RX_%VFHDߒ }ģ"‹X|qJ0ɉla#=r0 ªs Dɗo1&ay`rR2-YKH"DNAʭEAJJ%TMϯB𧕅z^">e\4'UZ3T 84>̯3,?_͟?V_')EyhNUS#$9=1ろ1[R+olkdٳJIT9(0!ڲrθқ$0(EOR|\uB}o~ᘳ+CwOKxx ?t(c::bWg8. JXTJX_+i4ѻ<ЊĐL'bAIe %I;D#$D;HԠ*MdU 숗VIْ,Pgp%^݅G N{bUpLV6' eLVl$W2+Igϭ$DHx?O B2(%x0 wp㿺\o7_q?R g_R;|< )U~QeLWf5 dТaMgzբ>u5@wst«XlJ'{e6x U`!_~p3s[o{^yIʏ,onudcQ&ggk(R(Q:e WwPBLR(qqZHg$:nrt._o3cF Nl'y^"$L*5"ʵX$z.|o|Z?(~Hɨ0҉/lf灾{ecrάl=V\%B>ښUXmʀx](޴D2*˥IkE$0 X "0321VD(OIU%Y.ga1=I E3էOĵEbX-gPQv D^NIdĎ\{f̵"9JS+kOn/^|̙Ϳ#׹}w[~wK^ќ1,%kzJSCLKaAR  Ri@DA!&RZ.CSӐDRYL;)'hD&"KY !R( x BX2Fл\Vk-Ir/s~5V$PBt}E6r+'THThz/LS#Nj1̔$OVeIEHx{y)t&H1ATheVH| T>ۮ)C4T9)N>!ا=Ls)N NyׯE3o\叾ux?~[|xHSKz)~ $dT9B*OYS$z4vQgA!B)+7y5,ZGU$x% BȇV/I D`IeW*K& jݲ^ ~js?*[>s߽؇r>8O\*T?G^_s.o_6֯ףȃ)JD[ϱhIB0+Z}LH!Wn2%|A(!We~m3\%g!Dy¯ Ìd r!rfs788xkoxc~c+Q$gLY \ ">Ʉ~6&IJ@\70yJJ$ѯH 7C,.~Hmel yRrN{ )L(3@㇀ *2IfPy`' vNKK2t6?aYJ)ՐUQZHA^EI!5Ze' ֖(Bn5*o=<,kn#s 4][ɨe$3q>8 n\},HZb樦 ?Х?}sj \ -1%ݒ#}^3$+3߯y&ݠxy3r2ݐ!gp"@XKҚ!,ݜ!, DkRA ĀeQ8,֛("%A8B$Ed}1㊝`9Ry.B&Ʉ{Sg=e_Cۭ-CU"9TxDeX ZN@G _Wݶ.y3z/YGW Og\%rQ dRZ2Nޓv>(!YkDvB[, |-_,SW*6+N@5 e B\Kt}]ˉML}=&Ue S6֬ݽzcH<if|ጟ;pښQF#D$,#V% )"zu >f QPyy-"t"MR ĘetS% -)-I."eL )h YUʘLPH-H"ӽq ,gse},Ȏ$Ƙ2t>q5+YÁk6U)m]?apt]mF\DtnٞT RP<0k ܯAN-޹\*)I4Y~=zXJ$ÜdzM EK 4)|"B`]r<ڽ-":K஖̆Oiٱߋ쥁knf< $, څGˆb4C§:I xSGf rȓ"`<ր?$V0Wyd IˡYTyX>AшoE>0O9}Ng܇q0KGe_*pיy4ٯ:oO 'a.vd]u\I.$>W~rj-rMIyAo rbAH߄=<Ҳz*(Et).xK]S=k+#{@6V? oFi턑5;cir8% fSipibCYA~:K,j[JcPH&id.;OS Ό$|PhtvVWPRxA&TAH etydBr[apjBJ3=a; qW2}Ȓ]O%$Z)}DJ"s.Ã3p /=*>y xi=ȘrAWUo)S>b̦uaÃyTzm=Moٯ}^?c|ɞ?JxZ_nyĭO+)*J̀P r ,2$ )bLůKEVG:T)Kd>+^nV$H?hFÅ #8B(OMeJ3o]\Ȟ"J2QS_6ulEg}iJTIy&$ !5&p}0kw46z玐aˤe(+ Qa+F^PE|&gs͕'gzqh)8?PF-;cϟ}k?tסwPl% GKdŤ :E:bP*uDof~bSgUh|^V(%p69D ;xzmG?yKX!EgF&*9u>k D`qp Qb2F|0afTc c8Lcfcc C'*b.ٍْۨ&bk"Yhk`y2V#\y& tFAUUΥ]RןlTc!#w(%߹O54f;Ϝa bD !2\(r-VBKYR$XZF=|9ftu{n`cj1#h[C,}?`%YOzTRJa5T[SZQièY5_FҜߡޝR5#cǨS}f]JWAEBbrzؐ&: IDATyD7Zkb<{Eמꑽk=?{-~:pE*P"h+6)yH?g6ATqȻ̽ DZJTb$1Jne戧o1ٽYFf˲yI`rn̠:#Guy#7 [Fd$cv *2ژubJsR4(;ɵڧJ2|QUDsv418!&)֔D`qpDwD\b>1r 9w?t4&i=3e|ee/Kn߹'BJkA[.rwr|.mߣF]bCC/*Мd#oHA[&81A9G}cΎrZkMå3 ۆo</݂͜[7+JgTD-D ER=|_N'쭂3]Ҫw4Hi.H*"eBJ,/)Ţ)AptwcIĹjc=8~[|c\f˗o G͹9G|]Iwu"bP>zԉaXKZ? f1e2`9G۶t)@c1fz‘!bZ,.1Y!A$Ikv>thJmzj9uhSDŽ#fxQVD)̹GnE,vwy'غ3Ó^̿w& H MhI $#p2 E"e$fIƐ Ķgcc6fb6j~iv4}kos{ $yIȾ;)y$?lLG#9hUL.p^DHS4ĩW<8CSeQZ9wr[¸H/>Fbh;x@Q'ecg ;11.z91L|=M_^z>f)ʁ'5HEBN1cSJgQ<5C Hkbswz;EgK g) ;!za_>3?8;ٿ~G&vL} =t@lm00҆o^eP[z" )u#g-âz""R*{h=6c^xk/P9tݚrtpĭ72]2#\Jd SI@Դwg鏳_ηhD])ڽc)%IbwR:ˌSY6 L.r/\Bo)T0e{w3rī#;d\'Rtc'*$؂?WF i^HD+{BY`S!ݩL}H=c$ &Vϻ?|˖ͫ繸smrY\|:{ϭk׹޽ǴטB. PF w kOI@YCuvdv0sރ_!亳?ZJGK 10{w?fv} ]{Hj4bc<Χ!=22I`ȸ2U+H{ .屯Hs:h~obJe`3ԌE(E(8Bt/ػv2^Bln*тru, ̢0V|zLX../n6gwRDd\ݜqx.iHV4x2?)Ĭ۳p7je ^n=,8{uW~u6Ȫ<ꉡGƁIcG# %%>-1!R̠!g2@?m);()Rή1I!fK>*ЩBZ^`I}&?w]v7wO{rÏww16IOW|txH6bҦRM !"?;?&5 DYGf(9Iy,K;ӹpߐ0r(|׈Vi"B$EE Bg_ X"ɺ4G"T|cg*bB EwIL灑L ~1wtsY!bb`ySKȌp@h"዇P2f]gSHeס'ˌim^n 0"NfB*IhC^'3fg\I$#ik euH:WDZ 38< 4BnrD-is|ѣZlI##Q!uRGJ*uiciJ+rVfzĴjXdzCd%.51I QM 2Yz$;ecsA5ьF+[ T ]>楤*yp1 $d?Hl(Ո2BEꠏa??ޚssO1аـ=޵D?`ƚ !k E*iY4)FhZR36Y /=A*blo#FOKθtDžC臈7zt2z*' .PKzవ!'lH&Cv"P`vhBQTi@VhE]lҐj)CTcupvcK3A*, \HDdkF$,TF`*5_4_l9}-~ F1hQcv3jDk|h!(0&1{Iuy^Ġ~CRʼn>fEL+D  fD Ɉ#Zjkq]A7Q;ߝpk ﴴCb1b1_@vBA((a%**!jg+F'A5dh"Ret"mQ'llT9*iB,bćV-D\$Ze2"F"cɝw0=PH:%4Ra̖Q=& a?d16` `H:pfNzcH%34x)'M&\UY}}ZSB@sK<IBLҗBeD$cfLw71xcqKOr3t]*%IRdrwEÇufՈ" &#zLuEZ╆>':xCqw1˜6>K&C 4hV=! $4ʻXYJ #RQ]M?4% d*"lG"B`XT#%jXGGgH_:'޸*+\f򜸞4tTP5 2\*BPɢAوM*)|Xt3P9Vcz1&zUҹ/X@H5ಘ/!ϳ }s6F[39*kdo)0(Mf 2[dDD =,ÀK=hFfs}xz|D:ljFVta,Hh/@i/ԕ]QtWxքkf-{|ϑ_`Ȇ`BJ2˫]y꜇myoD$5>xߛ=xK^{M]̎1tszD%n60Ktvs 2YXt,KD (S0!S6Қg:@I" h-d s@횫O=Z`UglM<I$ CW0 S627><T"ƬSef8 ͖$P % ò?hZ7u=*iTq"KCNK)aP [ "CCѭկa)Q)xH'h?Aw*z*g%ʭ VXW3NhY?WDfKzʚ ]Hۖ^ҋOp.[5QڐayqwG1@4('T#%D4$h\77y㵖qF`*3,"!D = RTH*%y?BE5^T $굆rc.ENbupG\UEi|yE[b r=2!VȠ-as ?xe/!J|#\{7;Hd2-3[' + j8# A0sx-7~,VVY.h]KeH<+p$z{nLv6pD1bK`j]Q! FB)}u*B$KfZtd5^||ǿp-T 4[cvsP#xn3*êL^[^\9Iך" Da6-_o1x~X?DÙqǹ'L#ígΡά$#e0 cIgxKճ=~z~^}5S z`хjA% . H(*r.ǹT0,[Or=C#lI* y'lܜ@kW"aMYV0JYd!!U;J3=f|U&U*QSsfG쓞u]9ޚr>yzw SMz#C N( /v23dعzz+?Az{M?x~"׵ RKd !dR57y[6v8d{[{0 Ξgg{s;T{ qmK- 6Jzq`dd3~fK|+_}j=A|>y-73 5?" _F-ڜ%~)nUIY)A꼫Zy"_u"19Dq !AsV)hF=Giy~,݇8Kow8x:rpHQJ+_ &R_;8?O.ȡ}+17qL?njjز{7yW܌g_asԖO\Wx{|ec<=_m8RPlY sh`ѱ*H688Y.4k$:5TS-Ǒ1I2EѺKs#^ꄐ|87zlؙnRHqgAGʀI9-I,ĽWeYz,qdDzo*uW7d aF# /_!B\.F4]lS]]ˤ&"[FDdV5!  Yg}E^!EamTϰFH91?x]HlU XCAiˌCJc "RYȣ͂GdpH8KAC N\#oxah.爨dwZWHx|j >ax"DF#e5n1+a`j9<,~I#hE%[݀;stIЂo3ztpbd ǬRB·^RmCZUBPZQCeN]̀\X/Qle+)iI󂦖hcIoA`@>p aKrTab^5BɓDi,rNq4\:/~9_|~Ã]¦g#^5 9WzCocQXk~e^#[}]ծ>.(]% IDATf6XZ}l*jz/^8)+vzex=x CۘꒆJcxWVok8=X[ )+#j"N*I6q%tNbVW"^x+o%\Qt"}ɜБiI`U8<(|->C(ktTuŚc &.A9EJ3)7NG<+lIܺ`ieqƼ\xiSVċ?{w5RϘ]RMGxׅԫ nT(v1wDèޚJ9w@h"+P FRmOxm6xdh0UeM|iCsVFi̧9j!%ZKd~/~ZԿ htۄIP ٬6,ǺkqFeĮM$6ՈvƔL@$W7ٷnj`c)gˏxZ1ܗt&Bx`lu#%,5H'PPxWupۻբB/vg\Ǣ d S|Yh%=#]ɵ74B˒(r5nHB[g1^Gx / rx8pNQڄjQ ˜i(Ւ8s#Y֗rW +M:4&l1.ƄF3exqrǿ@V ]Gx` I\%qh6QYB@hTv~!`A@x_!'Wh!ipgOqQ&$!86i[34څ jx*TR$ꗷkXw['iVCΚzTO3URLZ &=:֤&yXюd^78K9p@e חYodc UUrw]Ãu/Sv ɨoB\-^qe(fڴ ꡑ6:8@E6\UwUY_OaHR՟,"w;Sw[/\W$Ʌh_;!|=':P &mRO2uVԨ#(\'g%EirBiD1ltiVk AɳrNPl$ !$N7 !(H9T,2H )R8^hP^G8cD#/U Fc66 ٺf5f,B!Ɩ΅xX' Rm~pcIA!崊V` gmMGy'=rbgPz7(Ÿ{|j>|JE&JD2CJN 0f䐢,ylUJ^uq,1N)U?RH !P$VD`}uz@/u'J?l*!wܣGPW ej8z /^JN/NtOhlk;f|ٟg\xAҞQ INO9s}uph)f5=*FF7v5b>ZօToBo85pRWG}#i7/-:ߋRBx!YWwqQTum:p+ txkv_}Qoc.@BPyU ~+8"{, _K4% JThLn@|Z@,ң%끥9l E@>.-?)ܾ'X.h3SeEkyNО hcFHbiN]MyWVPj P0,HtP݃~Jƹ31oiy~Ms>Q{?>Qgq5}sǽz$F'̹r.v }P %RQnQprاjF|e>u\CZwZ=eY%05`-Gw֡}@C렪AWn}9]Yv= } -Up!xJ)7k>8UWՄK;*_TqQl;iL24CW 7y-:RЧ'&1ӏw+~ 7aqέێ+{C]b>Z64͸ڈl{ȋ9<}a2LQUiR&1$diY*XZ 5RҘeOW _>W z=--._7_krJD.&=w`vvcbע#tLf#iŶ*w)'fd)[V%܌8GK^۳S 򬪍2's݊!krJaY0,/yڱ' r4sC_+'hRHJ 3-EZ:h]ӻXȟTqœl=LF HRAmX;8{q38z3臨pN"C[OwÊx3 LE%E` ӑ'U*;o.k. h60KvLPDWu#1\)+!eUsm]DRRQ%rG9nZ:j2_Pf̣#_#\ȌsPf9޺_Wr Zhյ6o͋k^m?^NGr5I/ܹǝ3?.fa Rc(9:(ݘ{_#Οt uE=1Z5uJGpb6_Ÿ71,e` =dv'^Β9)wDbf8#9֖lG Ӏ'O\qb3 2x @'@)iSg/ FHU%#M=VFo)B Hgg <ߚOZu<8hÒc[Y4;;8Bᘍf:f8Hg%m ^ ¾<<[,LЋ)T/qCe㫛ү ֎G;]HG w݆w쾑s3N(4THeQ:X"8 +"ëoķH9Z tCБCi WT`;OoVҌg;&KQM< .\k_AP##sD鐕 EoL%qV]!*8+KX$&h֧uz{<߳|锟}~b{'`_!LPۓC3(Dhtxtv7`emwKm>:x# FHc$kUU'S5NZz0+ꪶ:\+rwqRڂbdT9t rv^ XYOw)՝4 8t I,_c /[A=fh=˓nܻ'(0*t+Kjダd8)dc;皋CW\Zn(wأb0 dZ 6/ H>Z=5 ->}vW2mŗwHu"3i֚C_+\;okEZŞhHY[+Ob_Tܻ-xxÌM9ɳZ #  QdI;{G3(:<3 ˇ8'OKKVO,qI:`@_+HS`6)&LG `[==Z^:Y]T1v{Ŕ9{)Wo9g0|Cɟ[vY2&N,),ᭊ!.^8}~ڰit IÓĒƙ-8+YV0?2ڽ#=sրϻ20ER: agZɛo'v~Y %+(w 9kN75rv)dy_}7Ō4ytb{0z*M;?c\,УϫpW[J3;HiΕtQVPy*£xReh>^,Z镘o_6eJTTEPێ|.Oŭ;ƒ{'4*"SbmJMA08{8yl95S&f(8,(J`RЌ9gMX06bgs5H'E2 gt l>g *cEbI#kؘN/[n=w*._IeU*~)8,℞8@)sv ;{; Eghu< MqhѪD.<̳7jfSF;37'l=g]v0^`DRb7;!_ 0=*pٔa fo'p(rMF"(+G{guDt$8LY(IԓK/[??ڝ Ƒ[k|2hXI@%tbh0^ADUp?EI>[oKng"&/2 >?{OmDi~A~1rv*67⥀ I-ɦg#hvlZt(F>y.3JE 512J(h0@GM(%"b !TļdKt=!/}h/Ⴊ(܌tI~s 7TV(p7qUtgmzdnF.^=kk Zm'ϜLJI/~>}go*1Nb`ʤ^2.4.]UNJsGQdYFcgx$ݕiEA`2f6b#5ȈšW֪ZI X唶B&?pw뫇v0[\Q!8!:!CS(b$o xᅯ}9%$Nt@7Hqfz0TL[c9jDs͂Lx`& a< Gq ǣg;{cP8Zc~A IDAT%k#xU{G㐩5V4hs8〥/ixnWsOQZ<^aqLPCIoXTPg2x[1:FU]cyRuET)IjNv:mO . ~)oBYբJ\Y6 5CԂF9&+CS "d"CGU:pıwX16 $DDH¸Dn(;o*7ފ8ݏ"&VlEL\575Itw/ SYhOݐ]pp`*9,YA~wQaŕ^;z%)8T(&*e mEdILS/_GqeDp87 h/xjIҁ祃cO_wǥ}O=gncXT-&G4"Zv:D4?E>xlLfXwq1{rJVT( 7Ȳ+02%%'OiΝU;r\ʅ '6vO ډe|'Sg@ߢ<[ 8=u nrܽ[1fBO C-ĕ`%KP%NIz,&/eU2D+i186h/ݸ`)&̧$8Mwŋ1䀏~O;JL5H#M6}J Li2{)$e0MT'TfSQXSsJ.]Q\t%KNy}Gw߹:^K9sO?sΌgL,z sA. }0$fվ ugPi(A3: ah2à*b^ RJf)C>y{|^$vTK!rO~vӯ_zo?'xmmCEQ(% Б>^G&!-J4BPK̲C^<E-9=`5T` 1VP#E:p2\r Οq$H &[%{$W6z4$i@9p$\dV{ď-y%BmZld1 a]GHi u]!,(ıDkPi!N;oIv3 uli(}ų9ɘuDž8լks:4D[Z+ޣ;s S*U u05n{AU(xmP@'V8+x^{#!^ '̢*L;T&y扂V >{O[{~fu-@j.IE_1̲kbL3;;Gn (SsdӔu:6|4dY\٠Z:0+6ڊ9Y%9v*6ZH`.qXQimx"pd_dӆ,( 8@'زb);O($hҰTq-˲.#gZ%D.R4&篅K3ឭGVJRQ8մZNKi4hEu++'=8MzH +^pri?9`,9ew/r-:#ml/F]X>K+3^ó'Ox`k+b{G080L&pmN dQ9v$-A'h4Rʙù '.@b T;/a Z(RЈbKV,K2Nnp/̙Ut]<r"ЏLfc؝ٛ޳7x%1KJӜcg L2.f6~NcDV? 88*e$钧߯r"f_y<,Sƭy4qA"``g*l0R0P, /,H[wvi k`J=V9IBY[4f3j.)+UAN9|59E9$h_)ْ9#KYj'i:KNWfBtڎaumPo0-g n >PCYNP~FIӘ_L[Y>O틂ׇlq{-`a{9ZTā#ѬmHO鋊 7bΜXImIp|dGO>Vd/ *P+*ZMKEdu_~o[\ NI]bM5iDQxʪFhGwIE$JXG7鱶zeCnN;uMlV+csko+AGtxtR2, LHC1Iڀ*x|L+Mrp18JY:g>uބNz4kj$7cu66G?{?h 2ɲRY:xM.R3E)4BX*dߒ5 i -nT -3SOiM& ԑ*!l' F)3bcF3Zmt[08wꒉX3 fH %wAmuRvLđ ^DsxX =Uo ò4* j:\KQY#3RcUſsVSW܉Vu¾Gw8}~rDG H V3-X"Y*TI[ K=Vzhg((%0 g ]n*NJGqɇv<,crаwpk̩St6i42,+Xg6g2ZtuTcTJdY[ 2x u+S{|YAi Qp5DH7{XKкR[co8$J#d&hJW+vQ]prsԡ tEч~⽇Nο~m3F|˟a] ٔeP"#YGˈJAn+|lO͍[?ݏ "~"ITM/| :9aQ:=ZHbFkMkCҕ ݌bz4h{pF=(QeD=qh4uqOZ$ܬPyq.J8NƒO B|,J'DkGצ%35!R3F+pZWI5f )Hr6kgs:g?f<8~yyV)ξCTt@31oyM;o{>f91CF)J!Cpi+S/,@/plY9Av+iָIΟ*uQRF96/* K+"/dsa&Gcv~qkSkء-2p$@Jp%ж4PR*O[T^q\z2KKHZ;~΍mnuWbGo! [xS1.#C 5 hJb$1E$Q@"75@6ί CC.2ESjnuoq1=ǹ &w–ԥ% UoݑvO}z6RX!c>wZ^{k7&2mE$ Nx/au%&;" l09_.Nl(WcF`g~$PW*I/7k0>ƎPENc5ϻ G[7vb Ҍ ,J&884sEY8B6K%;vdGkraA35 ׎0(:H,e@GiRLyd&q-%^ <{QGraujsx$x,tV9sjB&4u{cEV^ýVYD{Lys88>9?+xݘ"VWϷhZmsn:XeL&$r(Bqvc+/phu'9x>vXpg\bDT)G%I8p~eNlQ nutZ}w%SMgYFyN9ͱ"G|![ LY!Z֩>]&up`g,+}Noo.2>Cf1E"um 6sT *QA2~,[?J9AʥgKtחHbnQ+RTqi-i&>/-$Nӯ|ρ;)_t&j 㨄J/IHqBb{LMH6)Ϭq+,+>_{0<>|!™ ;`4muXhh>h$6+[A΁4,ui:8ZVK̼clic*'P\bi}2)-8·7y[o3;R/>=oy)jT<,W|͌_^is\ZdwX3X7GNg  vf\`w5є7o PR-::el53 [ZϷx)W ++yklQ1(v`pzt^9' )ˎ9 ^;28.@Xm||_Th[Ƃy_Wg~U3&~.)(% !;,͈C99ȃ. )Ik >*{*v8M08̱Kzi 1E/sxl`y7!!ʼnj2)gұrf˯ qTJ!T g9uvC1-x]DhʒΒdfٗ;W_ s;'0&1. ` fQ! ^6YXI{ew_%;& 2[\X-"Ξ[sgyg=SJKL"(i!3oTjT8ۅ{3hg(YbR{ #m\F/%)^|K!y^? vJ\czkw$#Oeh g$)^X?'IS=o{3`w?6\m [SRZJb 6kK ?uKQ Z\\f?ဇG5FU= } +ޯ+.-Sl^@!HDk-^J|[u}jRshkE[F$%m.3U]P썙DgDJSV [R >[/K8X~ӾG_~gȍ8 \9eY"$0?IGrt/shg EAe]ȱ,( ԆI>^Ělᘱ]_z!r\F-̓”8ɢDf`vՇbxjk"*28J`|? IDATXv/naӦlTd*&[K>1\^]gYglY%HG(c&:47^fs(H %}{qo|wK}T_Pւ*JJUڌq0fjo;n 纊~.?:~Ԕ \Vlմ:`ii/~Z ggraS.͈WC_#*N/a.vq6vw(J ȧ =$+6 G)f)%ݴ)NԢ&TǤAkFy1p(,o1=RU#L8e2me*%nIӬ$4oo=̉$"jH/R>zȅs烥I?f-n߻Mh78NPa%~o_߁<?˲y TX.Ȳ^,s JadehTeN"ިB5n-kL}S+d?yZ>: 8>*P$=.)1i>f:`aTS* kIlZ`$+B$ VH&P(؅uYx_!\ MĄA|(Z+++$qCd4 LiFM;h8G7[cKڭ:To2aakw?<9)fLOE ҌsK^xW^U*g/t8:7eUFǹE}W~>O~>҅/o_wbl DxZD᝚o}BI,,t:V7Rİeq\GYbI#.44Sɬqq'̤  I8^17N'wwsW)IîX&=N7>YhIi 6 s2Fʐ4E0{͉W^Kׁ/=t\0L(WJEX+P{/zHbc20OkGiB+ܚhY"q%8-dsʙ0Z.[d8$udfuMplZ~llbKݥ]>5gGlW~Ϟ{D%萫ԱJLjsK-/0cax(f%c:LGJtdtGU0B#8K;s(U' oNʹ<9ga ^4M:9Axd}f.fu]7'EP h :vy3;w^V-jP(l }Bd:-ϛ7³e#B5wRJ:Vl lZFaf[4تD{-ƕ<^B]$crBW0-g#= Bi,HӈV˲8{>ԩ6k]: ZOşb' nt9 :I'aZ| ?sv)o~hCy"cV?s#^lxӖ#8>ZHdSUD(YTX%glKZYWﭡM>|cߩj2Q; 39;(*> 8[@.mkCITnF΅YN v*偪,Cyc[³rzR8޵w4B{;Ӌᗜ)Q.ܡ8Q*p"_h$ 1V40ӚHYtu[D; 5%E #\(&Q97 (CF #6G(}LS)#T$I-h OMFJYfXD2!A;- EBL-iXd61=.]@Ej5UÝ)~y~Ef8kPhS~Z76PCߦ%亢;"0BѱBF#I9(Q3F3tRX5%QI\fgjUIkU#j N'1v^ع{' |HS{|b)0.q'B;4IV cX;8"`*UUS7n9*HD2BJ%}-IRaIغF($~wonyf\_~Iipv+"CkgQ"|-jjuiw~n?{b|N(\R,@l=xƂ?K/_D U[\ayS4ƢʒJ&UE _c[  'pR`j tJb#Cf2QyOzF jQFP]yJP6Ϋ"]S̾i{:<2}J5~a72wXeYK K;jgB,pH(-)уc|ߗ8uĢ 9)b+ B(754s2 t`Ԅ v ^RZN.`;0f8GaAzaj+0oEeOMH(p}4mD*vquMYp]\ʪ$6b~sz,f8RaNnuE] sq±]˺' ev>y~=\֓ZآZ|'3rath hьX$}~8gl ԾWoŭׁ pd %1q@ )Xh[j yG8$M>Ɯsn(>hnBRo)fq"! ^mūYlV,nR+v5;.T"`Z'Xb"g%Ji\ #o嬠6ɄQ'IU,* `Ar ^UQyuH`UHEw;Χge3YHDw̸`Z/SV!A̟WS4[r:9nBIlsUo+M$0MUQ{|Md<4\9Ex.MQZ%qm$Ky\ f ~ q/3gdƵ&p0im]8?|ѣiBc\$Ṍ Ix>8*PNIXl"ɄDYZHChA%$-ɸl#snqmsoU(vCl$B4襎c(6BYt !!m0^+RH5%Y:O(oO2N%;^$'w*BP^d޿au^yK's,$I 9,GX\G&|"e4 "Zh4 !` /qǝg(\JOKR*yO\UeQcm#FdwjCjeN2ttX<ۈtT&䪢YII&t\|Bz i(tE)*r_[)v%"D{ۻ䣜\*AԞnrVCptCbYrmfLM$Y#EB51 &Hv Wdqvo1m gNXS! CG-VZ Ùc.C;@A% t*PDVP^_ut3Gyօ-H2)Qh#-hM.GyRoq`mM%mζ$:Ĩ,AgI 4X(Ԣbtc5mRj)/"pl㷇_"?dj\#ZNJ ͷormJj^+[$"nINpˎ/e)-xu|*TT]XG(Xɖ[P*zCY(+=>yMVPH$2FX`p8΍c !MνXLSf+\YnP37ٹ4O@ Z7"vsL!'-.lq~2/9۷:wH刄#RR`_skf}YϬRkXzHqd3<wṵDa MeE5vN"c<'/Kjk@E[jC9m:WEI=<D+gO9G jzL=uFx8fHcz }1ޭegWY:D*(JlD=6%L>C{.-p3wVB/?Bτ74^JdZ٧;FMs\^b{ }ޛ1"B"/_}%5*DYLN).*@j sy Ctn%P852VX:Y:BF$|7sn/_O@Fcq}S"FphS:(VE$N#VϞ" abIT>e3yK!mp߿{]+0B bLk/%E9>!^J) SVyKY"2Fy0 d @+y Gl2l6iRZdYF׊dh8Z0r} F 6TD)B xg tO/q,8q;)DL,5%l wD.Z$":3^ D/i؋t֗ GV aW0`ϟߒR~ %z$Y7}nq.jC`&Bd$Vr$JU6."KWN[{Ȕt֚d) M_oȊWz̪!V(OUFia*TWC̋g9˜~"YDŽQ= IDAT*t0orM9B]%MdjtK*tέ牷,&OqeiR;nqt!w3cjT[wn=5pNg[XQt=&5!Ь]+omZ))8 7ʇc30h@-qV"QhIXw!pH"ʂ4(IYAFؘ0^JԥY h/q\f ڠ;QGSD%X?JgY>bbR .Ƿ="'3H|1qHTkJHt`͌g8Y:VH{$iʤ̙{o#jheiQbHI%4Qz(DL$Q[cKtK^\c)#Di9uQ< rA@GZaͨD6H+El:%@ʹGiF> IV{vަ&74>g{w[g @&-1&c 8 B\2)U!$hZ#1#>L}n,gy{{4F̨Oͽ}m RoV\=s6W3AfKQu/E~?!]q>S$4jB(n⩧Zw4 :8QDBQ}VqwEff^O "$z#zL@|->a!~uzsJ_ U T.UcBzqZC HrYa2=_kOPY\X¶-׷(Q@*츅ZIdF|J[Y2U+#) MMUh(X-q" S+V6M$[ZN?鸕I-Ӫ쭧L S,O S ߦM"`8%f_2'[>UPAb4Qu=aIsCj̤{T %/`,K4`:L]p%d~OU_cMDo*!geOpkgAY2]C@ # rk 2P!|\ IHHRv8~uNĹ3wQ7 ZiV89G,DI?/iZr%S@q1Z10eZ6pm!cA/k Ɠ)Hf F8XYZ.ۄXh+K5Eda6EN+TcJeoYćDIJ$P qM{m h1)S}+\\děΪq&UiQ"fg_%RE2!Df:砛x.za(qE%0%Y JZ%2eQB`;&MnRdXi1h(PV`H?+#(LP瑱nɅQK1/UH4mD#=H[ "Q;؛1b$xۭn~M :@eKM~":-AxͰmf6ٜ2z…4AS&#Y]&"SG߿l1t&c}:n'J#I|.T,7Ib]H9Sh2eh*f3\SdO*zwN7s^#Nsη?y(٠-m\M=%~ȣ$1R8?3ɔnQM)1R!JΩhqxIIiu&M9ίZ'.\vM& kÜGQloluq"Bq_҉{]O+q_]_Gi5Z$.p@ѯ^i5ѦCDbTa6[2oT-,>]GY:bA]O"$8I^qK\~,nݦUA&yp!mG;`]Lƞs(=%O~a%؈9Iﶬ;E+Z8{G\F}C}=ܳ7 mLQUDH:wЬiQhY6wu@AϘ)?ъu7Mش ;MRDz^H7P6( MSdBxஂM HoX2\>G jb [6qC_(B+>ǿԽ$K<>CB\*(&C269,BBt'/E"{Oru||W^COqÏo4PoP s!]hG XPDZºt,z9m³x}ܸz'aC爧F( 'x7{MGJU+@vq߽@=0;-^hhFȩS8ëqޤ dېA!Rƀ nX],I%Mx@~kX|Q4D4"&d"mySN73 UVq0?ݮ"}y*b%"s-"2RB;S,wlWכ?_HBs[sν|ӑۏۿB00i*7B N$|e í.+-پ!KwbϡUfs\㬆>Di45qrX;D[Ju-Mz DAaƅi ko#;f3܃rcg]SP>'γVW9v1TEDO!ts7[ҒV$BgnO6YP+ul^Byh|C=}10lUc 4FF(# F]KĨLW/y ޑ(Gp}t OIɐU9 ,u#{L$ S:(阒g%&P=L޺bj+Bbsy^"n}: %2fO;T#j7+#/T!oz?;p_Ա>gUYcX#ԁK^oV5!aU;S'7#roVK^K*05"Dи1 f{'vLh!iT3qIcDV=ʅkTצ bGmMsm>DVC|5F[YNh+vQ&HޠOabB,$=TX1r5JGtsCھO1҄^~ʖu ^:Y(CC߿#h/Nܠl%PnQm/'9rCG΃?AaJ"`&5Fjh\XL@.*Hў>$n\n[mJ$wf>$kW.3nQ19~1:de>UAҨ6T"L " +WѨtiΎ_}<0G+E4JzG%5+F2%w" g@HFRFSpN޵&]ڡ g>c}l`m}-_ew[|K%VWB;enwISy! O>(qjM݅Y'fqvligD&1!НiĸlMfЊgN䡍|\F'}~hc@'aP*ϾY/&>ٹ~v#Ua׮"еwGq+4yϽhl;wlALϊƘ_'~/_'~7[>cDh9w<{3[wBH"E3xxo $+ktx ƞM0K[l%3bj-VI&3FXٮH,k UP6\u"E !b jjt~ &V}~.ssד ~~oK<=-^f]C…'@ȑJ3 Qdb8^V@ #}Chb"T\ ^vTH ?, Ԯ"xuJQ 2*Ddf*ހ"b@ D%i8:TDJiJR(Hm Pnji+ꨡ(P\e.bW| Ul@D%&G:㺔I2ɱUē I4i l`˛ RTYJM!4ZnL>Cx@#^% ljia B_ɷǁ3geWD;j #fY7_R ep{: "Yb9䎠V5>8/#_/¿Os wbdrĘYCge QI!rf4Iz$bG׋ &LJTdHm51__=p_N/H\^]zvRtNL.6ƛVFԔN,J)2iQ.>i!ѡ"=Kn D%RL 4 ZE>t}[++`gŬ=p7/8ih@z֊~큳_ fz.B@ =6n`zyʊ_ERI,>S<5rඃ@+tg:Zd^6X>2*tV<7\c z6rc+=?F/&%tdSzېZOM6?rlwRIDATהcPffr_ADkrr'A@lJ&Z %؈B\Ax >x\G F=SH/RW "nX1%:0UATPbCNt Brp9ڍܮFM!6IB z{3M,{a$QIGM"c5 bÜՔPaNDsmJT%(Dcu9bv;牉R`V; 8Z 4 \/Ћ$!b̞GD:"uA_D ȅ>"m߰ K18 -5²!b"aGcchc:>CLj`$ܤm%bҞyReIQ3|}畴5xŔ7{;UTJ4urgUK8DoqIFX7E%Vc0,s'q7R )UN) skhipc˅O=+d䘬Nzb?kvdċ>p=9d:)mNkaI''J"bcj> q϶:zQ#vTNjtT WXΗh7=L}J # ӭ1qdS׽%WN r zEhF7Wx^4y,*y`)m3ǨRHf#mU3TlۖitHHhAS)MSQu)2HM*!ik~n܃†~o2/7U\}2,Vo;DvF~&7Z# pSm_?5J:&/5lΙ=Ngez m {&_賽c7\~3D۵H4wW>HP]d uɇ:FM*>T= O$}B&0Òf^z{h'@'1C[kۈʑGM=E~fih@zdPVNrSx" )sssCY&WiORP BJN'(tq1YVQjWP9&8":䢏(5'J=Wj!dN/)%~=,ݶBA5󑥥e O?(>iۑ"h|!STJ(AGE[7"'0 jOejCCNrr6So`5.q.|q3}X<0d`VY䴊;?M\Xe@zAh=-{ 6e:wK{h:Zp.B_Wi,L*^CpKe['29&%Sr޿:q>Ei=rii(Ȧ3<޿~1|kl"d0"OD@&C2]_ 豾ď\<+oK#?Ԏ#7έ񙃔,[ahJ(vs?.cVmP H]\5:2'8m-YOל#\>sS8}p/`ri}> |AUC%4$sn"h)d4*ιh-:Jdifm~L+=EaӖMQZdy F[D9NIMen i [2>)j(2Tg:D̑Ґ9CXoic>-<:Y(U$ SfO!Ddت>?\?y7?_ ojh=c`])%j`pZpP#,>vEžH)ɤBIb(z)&XL)&PH>/iƸ4uKRv5dHݾڅgL*{A|&YQQ D~Q׉ѳ+b0#Ltk tXdZDHx֮BꪘgvYQP`"E_cՖ~ĠqӖǷ @yj`ɽFAR%3]TǢFV w^j[WS䷟h_n) $"0zr>R6UnEt"jPJIIRʩ|AZLc@, :c\|U!GHӴz3ʳjöd)R{٥we4RJڶi%o^iiM/+y<Ƿ &Z2g[)4,$[]|Rf ):D5H-2C\*a=J@"DX۠(OA ,jڐd}H!mEsoU6īٿ׺O }P)p:1nBwQ}ᝅC(ڔw[&m C9Sraf%uF444Ո& \Ւ ڦkΓ94ʜBy7X$>jJ=C| mE6ürCdq$ôl Iiju[=ѴS2{L& D5}evsDn S˲ )O[(SZLjW[2U L&Jg󢗈&ls.FږLD'N?w]g~ժV>x_liQ+iKss:lGtZĠȵ0#G3! Pm1ҠOXh'0I(M} I$uZO"0+"@XLG {CzkK&l+$6~oP!#7XFL]K4DJ` `'a*bIfm;6䚍z0>H=Iٵs :?R+De96Nڣx^÷;z৯^XG?\h) #s(g2ٟ sI)ؠrkZaQ8qlG ٺtх5bwS ,˰ǵ-YQ;FJ'1E7}=<i2|c:WoЮoSxEQu4(RdXR#< /O?d~JyA^tR$Sy-Qڐj_'+=G:##Dq ?8?q߶Ct#rhP((\ܶIKD{wqwCZ=l]b|u'>7N LzJcg[dMb^Hj)Hȼ'x#_u85]{zpMlfB+mrg>`Brd}ZہgLtKiCI響ʗ_.oO?孃< =^TLvz'ZQ+Iρןய=ّ!/_C3Y!Ü.4]l5V M;J1 K"f`錄8s\'׷XZXd#yý,\+h',}f:X!Iw3b222YV-s+OS OcdTE I0;/k"SvJ[2%-Y,އ**ГT|țJu;$HħPsŗ_noxW A ?*" & |lECcQ\Bk9<>}מb˴[DSFtwr gJ DiX8ȉNo˗pGΪ\a2`,S8|,=9rikJH($N1zjA`=G8| %7u&f) с%41؛>g%LϥʜeI6ۊF9Rໄ< S۸5|'lH=_O?#i6M\<ž*t™yXիd6:&ֲ/]cϞCE>'q}:Hi46F|2XuجVci}`yn^cC3}z|O!/#tTH<}pX\^fXpWXDH޳;[g @*}>lLGl]fj+:QSfP)%!^ 5]oMo9?!yۭsn]`zfAS QXōg >IyX#\cثnJft7 ,(7Xܷ7f ]SO_etó8 6zO]Ӈٱ{r:# H¡s 7ƃ|gQn0]:~ALnlS*EȢ] s :Z- "=DG৖.:ijVB^xyksg|Fp_Ue:Ų$zt醅*g*W3^b't̃)57>MF[7]p`ϛW~J5qx]GNﵭ?E+q!$kUUu4EGGcTٹgX\]!+rx|N*pNO54 R:NDĝl|$KJ-P=6ty̐b!Zka<L]\wsDtUwkd5_wt4nevh*8$jE9,)jMz@8=reu23n'Ӕŝ*DLGcF B `!?w*A0BDcېӂLYVpq/4|k >1La?o]a&|k8?̿7u;b.@ii"<2#IE!_\HLm$*dXVjtVVN/1FT|EW4MAEL_Qew 4d"S۶sピ2 !8.]y֕tk~۟yWxPm>Gd0x"JtnHe4iG`mUKEBk|1=uhgQJbʂ.d%Ad)P p-4>&E'x'Ƈ߳g[W̭9W=w#1ƿ:F%c@d imRZ4EKXA0!!BDĐhm1iۤ4<AךyVIF֚Le4X;#:@F:{ːW xVЃ3럏>x­}ō|\ 8-q@_c|~!cw{bvQ]jmV]s'mѻ ݊;SbǏo GwxgQMB4λ&^|BD>|Ɵ]oMWx?x?ٿ.+wZޮIXDO $SeQSDMh=й-Df־@Ka,ґ2dn3 &p Go}|}5ql?X=nxW>#x8c'XQ.9P ! )D d׶I)50&6 7k2px]vn}O/!n]+ow`!IENDB`trace-cmd-v2.9.6/kernel-shark/src/000077500000000000000000000000001414302661500167345ustar00rootroot00000000000000trace-cmd-v2.9.6/kernel-shark/src/CMakeLists.txt000066400000000000000000000102641414302661500214770ustar00rootroot00000000000000message("\n src ...") message(STATUS "libkshark") add_library(kshark SHARED libkshark.c libkshark-model.c libkshark-plugin.c libkshark-configio.c libkshark-collection.c) target_link_libraries(kshark ${TRACECMD_LIBRARY} ${TRACEFS_LIBRARY} ${TRACEEVENT_LIBRARY} ${JSONC_LIBRARY} ${CMAKE_DL_LIBS}) set_target_properties(kshark PROPERTIES SUFFIX ".so.${KS_VERSION_STRING}") install(TARGETS kshark LIBRARY DESTINATION ${_LIBDIR}/${KS_APP_NAME}) if (OPENGL_FOUND AND GLUT_FOUND) message(STATUS "libkshark-plot") add_library(kshark-plot SHARED libkshark-plot.c KsPlotTools.cpp) target_link_libraries(kshark-plot kshark ${GLUT_LIBRARY} ${OPENGL_LIBRARIES}) set_target_properties(kshark-plot PROPERTIES SUFFIX ".so.${KS_VERSION_STRING}") install(TARGETS kshark-plot LIBRARY DESTINATION ${_LIBDIR}/${KS_APP_NAME}) endif (OPENGL_FOUND AND GLUT_FOUND) if (Qt5Widgets_FOUND AND Qt5Network_FOUND) message(STATUS "libkshark-gui") set (ks-guiLib_hdr KsUtils.hpp KsModels.hpp KsGLWidget.hpp KsSearchFSM.hpp KsDualMarker.hpp KsWidgetsLib.hpp KsTraceGraph.hpp KsTraceViewer.hpp KsMainWindow.hpp KsCaptureDialog.hpp KsQuickContextMenu.hpp KsAdvFilteringDialog.hpp) QT5_WRAP_CPP(ks-guiLib_hdr_moc ${ks-guiLib_hdr}) add_library(kshark-gui SHARED ${ks-guiLib_hdr_moc} KsUtils.cpp KsModels.cpp KsSession.cpp KsGLWidget.cpp KsSearchFSM.cpp KsDualMarker.cpp KsWidgetsLib.cpp KsTraceGraph.cpp KsTraceViewer.cpp KsMainWindow.cpp KsCaptureDialog.cpp KsQuickContextMenu.cpp KsAdvFilteringDialog.cpp) target_link_libraries(kshark-gui kshark-plot Qt5::Widgets Qt5::Network) set_target_properties(kshark-gui PROPERTIES SUFFIX ".so.${KS_VERSION_STRING}") message(STATUS ${KS_APP_NAME}) add_executable(${KS_APP_NAME} kernelshark.cpp) target_link_libraries(${KS_APP_NAME} kshark-gui) message(STATUS "kshark-record") add_executable(kshark-record kshark-record.cpp) target_link_libraries(kshark-record kshark-gui) install(TARGETS ${KS_APP_NAME} kshark-record kshark-gui RUNTIME DESTINATION ${_INSTALL_PREFIX}/bin/ LIBRARY DESTINATION ${_LIBDIR}/${KS_APP_NAME}/) install(FILES "${KS_DIR}/${KS_APP_NAME}.desktop" DESTINATION ${_INSTALL_PREFIX}/share/applications/) install(FILES "${KS_DIR}/icons/${KS_ICON}" "${KS_DIR}/icons/${KS_ICON_FIN}" DESTINATION ${_INSTALL_PREFIX}/share/icons/${KS_APP_NAME}) install(FILES "${KS_DIR}/org.freedesktop.kshark-record.policy" DESTINATION /usr/share/polkit-1/actions/) install(PROGRAMS "${KS_DIR}/bin/kshark-su-record" DESTINATION ${_INSTALL_PREFIX}/bin/) endif (Qt5Widgets_FOUND AND Qt5Network_FOUND) add_subdirectory(plugins) find_program(DO_AS_ROOT pkexec) configure_file( ${KS_DIR}/build/deff.h.cmake ${KS_DIR}/src/KsCmakeDef.hpp) trace-cmd-v2.9.6/kernel-shark/src/KsAdvFilteringDialog.cpp000066400000000000000000000243251414302661500234420ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsAdvFilteringDialog.cpp * @brief GUI Dialog for Advanced filtering settings. */ // KernelShark #include "KsAdvFilteringDialog.hpp" #include "libkshark.h" #include "KsUtils.hpp" /** Create dialog for Advanced Filtering. */ KsAdvFilteringDialog::KsAdvFilteringDialog(QWidget *parent) : QDialog(parent), _condToolBar1(this), _condToolBar2(this), _condToolBar3(this), _descrLabel(this), _sysEvLabel("System/Event: ", &_condToolBar1), _opsLabel("Operator: ", this), _fieldLabel("Field: ", this), _systemComboBox(&_condToolBar1), _eventComboBox(&_condToolBar1), _opsComboBox(&_condToolBar2), _fieldComboBox(&_condToolBar3), _filterEdit(this), _helpButton("Show Help", this), _insertEvtButton("Insert", this), _insertOpButton("Insert", this), _insertFieldButton("Insert", this), _applyButton("Apply", this), _cancelButton("Cancel", this) { struct kshark_context *kshark_ctx(NULL); int buttonWidth; if (!kshark_instance(&kshark_ctx)) return; auto lamAddLine = [&] { QFrame* line = new QFrame(); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); _topLayout.addWidget(line); }; setMinimumWidth(FONT_WIDTH * 80); buttonWidth = STRING_WIDTH("--Show Help--"); _helpButton.setFixedWidth(buttonWidth); _helpButton.setDefault(false); _topLayout.addWidget(&_helpButton); connect(&_helpButton, &QPushButton::pressed, this, &KsAdvFilteringDialog::_help); _descrLabel.setText(_description()); _topLayout.addWidget(&_descrLabel); /* * For the moment do not show the syntax description. It will be shown * only if the "Show Help" button is clicked. */ _descrLabel.hide(); lamAddLine(); _getFilters(kshark_ctx); if (_filters.count()) { _makeFilterTable(kshark_ctx); lamAddLine(); } _condToolBar1.addWidget(&_sysEvLabel); _condToolBar1.addWidget(&_systemComboBox); _condToolBar1.addWidget(&_eventComboBox); /* * Using the old Signal-Slot syntax because QComboBox::currentIndexChanged * has overloads. */ connect(&_systemComboBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(_systemChanged(const QString&))); connect(&_eventComboBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(_eventChanged(const QString&))); _setSystemCombo(kshark_ctx); _condToolBar1.addSeparator(); _condToolBar1.addWidget(&_insertEvtButton); _topLayout.addWidget(&_condToolBar1); _opsComboBox.addItems(_operators()); _condToolBar2.addWidget(&_opsLabel); _condToolBar2.addWidget(&_opsComboBox); _condToolBar2.addSeparator(); _condToolBar2.addWidget(&_insertOpButton); _topLayout.addWidget(&_condToolBar2); _condToolBar3.addWidget(&_fieldLabel); _condToolBar3.addWidget(&_fieldComboBox); _condToolBar3.addSeparator(); _condToolBar3.addWidget(&_insertFieldButton); _topLayout.addWidget(&_condToolBar3); lamAddLine(); _filterEdit.setMinimumWidth(50 * FONT_WIDTH); _topLayout.addWidget(&_filterEdit); this->setLayout(&_topLayout); buttonWidth = STRING_WIDTH("--Cancel--"); _applyButton.setFixedWidth(buttonWidth); _applyButton.setDefault(true); _cancelButton.setFixedWidth(buttonWidth); _buttonLayout.addWidget(&_applyButton); _buttonLayout.addWidget(&_cancelButton); _buttonLayout.setAlignment(Qt::AlignLeft); _topLayout.addLayout(&_buttonLayout); connect(&_insertEvtButton, &QPushButton::pressed, this, &KsAdvFilteringDialog::_insertEvt); connect(&_insertOpButton, &QPushButton::pressed, this, &KsAdvFilteringDialog::_insertOperator); connect(&_insertFieldButton, &QPushButton::pressed, this, &KsAdvFilteringDialog::_insertField); _applyButtonConnection = connect(&_applyButton, &QPushButton::pressed, this, &KsAdvFilteringDialog::_applyPress); connect(&_applyButton, &QPushButton::pressed, this, &QWidget::close); connect(&_cancelButton, &QPushButton::pressed, this, &QWidget::close); } void KsAdvFilteringDialog::_setSystemCombo(struct kshark_context *kshark_ctx) { QStringList sysList; tep_event **events; int i(0), nEvts(0); if (kshark_ctx->pevent) { nEvts = tep_get_events_count(kshark_ctx->pevent); events = tep_list_events(kshark_ctx->pevent, TEP_EVENT_SORT_SYSTEM); } while (i < nEvts) { QString sysName(events[i]->system); sysList << sysName; while (sysName == events[i]->system) { if (++i == nEvts) break; } } std::sort(sysList.begin(), sysList.end()); _systemComboBox.addItems(sysList); i = _systemComboBox.findText("ftrace"); if (i >= 0) _systemComboBox.setCurrentIndex(i); } QString KsAdvFilteringDialog::_description() { QString descrText = "Usage:\n"; descrText += " [,] : [!][(][)]"; descrText += "[&&/|| [(][)]]\n\n"; descrText += "Examples:\n\n"; descrText += " sched/sched_switch : next_prio < 100 && (prev_prio > 100"; descrText += "&& prev_pid != 0)\n\n"; descrText += " irq.* : irq != 38\n\n"; descrText += " .* : common_pid == 1234\n"; return descrText; } QStringList KsAdvFilteringDialog::_operators() { QStringList OpsList; OpsList << ":" << "," << "==" << "!=" << ">" << "<" << ">=" << "<="; OpsList << "=~" << "!~" << "!" << "(" << ")" << "+" << "-"; OpsList << "*" << "/" << "<<" << ">>" << "&&" << "||" << "&"; return OpsList; } void KsAdvFilteringDialog::_getFilters(struct kshark_context *kshark_ctx) { tep_event **events; char *str; events = tep_list_events(kshark_ctx->pevent, TEP_EVENT_SORT_SYSTEM); for (int i = 0; events[i]; i++) { str = tep_filter_make_string(kshark_ctx->advanced_event_filter, events[i]->id); if (!str) continue; _filters.insert(events[i]->id, QString("%1/%2:%3").arg(events[i]->system, events[i]->name, str)); free(str); } } void KsAdvFilteringDialog::_makeFilterTable(struct kshark_context *kshark_ctx) { QMapIterator f(_filters); QTableWidgetItem *i1, *i2, *i3; QStringList headers; int count(0); _table = new KsCheckBoxTable(this); _table->setSelectionMode(QAbstractItemView::SingleSelection); headers << "Delete" << "Event" << " Id" << "Filter"; _table->init(headers, _filters.count()); for(auto f : _filters.keys()) { QStringList thisFilter = _filters.value(f).split(":"); i1 = new QTableWidgetItem(thisFilter[0]); _table->setItem(count, 1, i1); i2 = new QTableWidgetItem(tr("%1").arg(f)); _table->setItem(count, 2, i2); i3 = new QTableWidgetItem(thisFilter[1]); _table->setItem(count, 3, i3); ++count; } _table->setVisible(false); _table->resizeColumnsToContents(); _table->setVisible(true); _topLayout.addWidget(_table); } void KsAdvFilteringDialog::_help() { if (_descrLabel.isVisible()) { _descrLabel.hide(); QApplication::processEvents(); _helpButton.setText("Show Help"); resize(width(), _noHelpHeight); } else { _helpButton.setText("Hide Help"); _noHelpHeight = height(); _descrLabel.show(); } } void KsAdvFilteringDialog::_systemChanged(const QString &sysName) { kshark_context *kshark_ctx(NULL); QStringList evtsList; tep_event **events; int i, nEvts; _eventComboBox.clear(); if (!kshark_instance(&kshark_ctx) || !kshark_ctx->pevent) return; nEvts = tep_get_events_count(kshark_ctx->pevent); events = tep_list_events(kshark_ctx->pevent, TEP_EVENT_SORT_SYSTEM); for (i = 0; i < nEvts; ++i) { if (sysName == events[i]->system) evtsList << events[i]->name; } std::sort(evtsList.begin(), evtsList.end()); _eventComboBox.addItems(evtsList); i = _eventComboBox.findText("function"); if (i >= 0) _eventComboBox.setCurrentIndex(i); } QStringList KsAdvFilteringDialog::_getEventFormatFields(struct tep_event *event) { tep_format_field *field, **fields = tep_event_fields(event); QStringList fieldList; for (field = *fields; field; field = field->next) fieldList << field->name; free(fields); std::sort(fieldList.begin(), fieldList.end()); return fieldList; } void KsAdvFilteringDialog::_eventChanged(const QString &evtName) { QString sysName = _systemComboBox.currentText(); kshark_context *kshark_ctx(NULL); QStringList fieldList; tep_event **events; int nEvts; _fieldComboBox.clear(); if (!kshark_instance(&kshark_ctx) || !kshark_ctx->pevent) return; nEvts = tep_get_events_count(kshark_ctx->pevent); events = tep_list_events(kshark_ctx->pevent, TEP_EVENT_SORT_SYSTEM); for (int i = 0; i < nEvts; ++i) { if (evtName == events[i]->name && sysName == events[i]->system) { fieldList = _getEventFormatFields(events[i]); _fieldComboBox.addItems(fieldList); return; } } } void KsAdvFilteringDialog::_insertEvt() { QString text = _filterEdit.text(); auto set_evt = [&] () { text += _systemComboBox.currentText(); text += "/"; text += _eventComboBox.currentText(); }; if (text == "") { set_evt(); text += ":"; } else { QString evt = text; text = ""; set_evt(); text += ","; text += evt; } _filterEdit.setText(text); } void KsAdvFilteringDialog::_insertOperator() { QString text = _filterEdit.text(); text += _opsComboBox.currentText(); _filterEdit.setText(text); } void KsAdvFilteringDialog::_insertField() { QString text = _filterEdit.text(); text += _fieldComboBox.currentText(); _filterEdit.setText(text); } void KsAdvFilteringDialog::_applyPress() { QMapIterator f(_filters); kshark_context *kshark_ctx(NULL); const char *text; tep_errno ret; char *filter; int i(0); if (!kshark_instance(&kshark_ctx)) return; while (f.hasNext()) { f.next(); if (_table->_cb[i]->checkState() == Qt::Checked) { tep_filter_remove_event(kshark_ctx->advanced_event_filter, f.key()); } ++i; } auto job_done = [&]() { /* * Disconnect Apply button. This is done in order to protect * against multiple clicks. */ disconnect(_applyButtonConnection); emit dataReload(); }; text = _filterEdit.text().toLocal8Bit().data(); if (strlen(text) == 0) { job_done(); return; } filter = (char*) malloc(strlen(text) + 1); strcpy(filter, text); ret = tep_filter_add_filter_str(kshark_ctx->advanced_event_filter, filter); if (ret < 0) { char error_str[200]; tep_strerror(kshark_ctx->pevent, ret, error_str, sizeof(error_str)); fprintf(stderr, "filter failed due to: %s\n", error_str); free(filter); return; } free(filter); job_done(); } trace-cmd-v2.9.6/kernel-shark/src/KsAdvFilteringDialog.hpp000066400000000000000000000033601414302661500234430ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsAdvFilteringDialog.hpp * @brief GUI Dialog for Advanced filtering settings. */ #ifndef _KS_ADV_FILTERING_DIALOG_H #define _KS_ADV_FILTERING_DIALOG_H // Qt #include // KernelShark #include "KsWidgetsLib.hpp" /** * The KsAdvFilteringDialog class provides a dialog for Advanced filtering. */ class KsAdvFilteringDialog : public QDialog { Q_OBJECT public: explicit KsAdvFilteringDialog(QWidget *parent = nullptr); signals: /** Signal emitted when the _apply button of the dialog is pressed. */ void dataReload(); private: int _noHelpHeight; QMap _filters; KsCheckBoxTable *_table; QVBoxLayout _topLayout; QHBoxLayout _buttonLayout; QToolBar _condToolBar1, _condToolBar2, _condToolBar3; QLabel _descrLabel, _sysEvLabel, _opsLabel, _fieldLabel; QComboBox _systemComboBox, _eventComboBox; QComboBox _opsComboBox, _fieldComboBox; QLineEdit _filterEdit; QPushButton _helpButton; QPushButton _insertEvtButton, _insertOpButton, _insertFieldButton; QPushButton _applyButton, _cancelButton; QMetaObject::Connection _applyButtonConnection; void _help(); void _applyPress(); void _insertEvt(); void _insertOperator(); void _insertField(); QString _description(); QStringList _operators(); void _getFilters(struct kshark_context *kshark_ctx); void _makeFilterTable(struct kshark_context *kshark_ctx); QStringList _getEventFormatFields(struct tep_event *event); void _setSystemCombo(struct kshark_context *kshark_ctx); private slots: void _systemChanged(const QString&); void _eventChanged(const QString&); }; #endif // _KS_ADV_FILTERING_DIALOG_H trace-cmd-v2.9.6/kernel-shark/src/KsCaptureDialog.cpp000066400000000000000000000400641414302661500224650ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsCaptureDialog.cpp * @brief Dialog for trace data recording. */ // Qt #include // KernelShark #include "libkshark.h" #include "KsUtils.hpp" #include "KsCmakeDef.hpp" #include "KsCaptureDialog.hpp" extern "C" { // To get access to geteuid() #include #include } static inline tep_handle *local_events() { return tracefs_local_events(tracefs_tracing_dir()); } /** * @brief Create KsCommandLineEdit. * * @param text: Defaulst text to be shown. * @param parent: The parent of this widget. */ KsCommandLineEdit::KsCommandLineEdit(QString text, QWidget *parent) : QPlainTextEdit(text, parent) {} QSize KsCommandLineEdit::minimumSizeHint() const { return {FONT_WIDTH * 30, FONT_HEIGHT * 2}; } QSize KsCommandLineEdit::sizeHint() const { return {FONT_WIDTH * 30, FONT_HEIGHT * 3}; } /** @brief Create KsCaptureControl widget. */ KsCaptureControl::KsCaptureControl(QWidget *parent) : QWidget(parent), _localTEP(local_events()), _eventsWidget(_localTEP, this), _pluginsLabel("Plugin: ", this), _outputLabel("Output file: ", this), _commandLabel("Command: ", this), _outputLineEdit("trace.dat", this), _commandLineEdit("sleep 0.1", this), _settingsToolBar(this), _controlToolBar(this), _pluginsComboBox(this), _importSettingsButton("Import Settings", this), _exportSettingsButton("Export Settings", this), _outputBrowseButton("Browse", this), _commandCheckBox("Display output", this), _captureButton("Capture", &_controlToolBar), _applyButton("Apply", &_controlToolBar), _closeButton("Close", &_controlToolBar) { QStringList pluginList = _getPlugins(); int row(0); auto lamAddLine = [&] { QFrame* line = new QFrame(); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); _topLayout.addWidget(line); }; if (pluginList.count() == 0 || !_localTEP) { /* * No plugins or events have been found. Most likely this is * because the process has no Root privileges or because * tracefs cannot be mounted. */ QString message("Error: No events or plugins found.\n"); if (!_localTEP) message += "Cannot find or mount tracing directory.\n"; // geteuid() returns 0 if running as effective id of root if (!pluginList.count() && geteuid()) message += "Root privileges are required.\n"; QLabel *errorLabel = new QLabel(message); errorLabel->setStyleSheet("QLabel {color : red;}"); _topLayout.addWidget(errorLabel); lamAddLine(); /* Disable "Capture" buttons. */ _captureButton.setDisabled(true); } pluginList.prepend("nop"); _settingsToolBar.addWidget(&_importSettingsButton); _settingsToolBar.addSeparator(); _settingsToolBar.addWidget(&_exportSettingsButton); _topLayout.addWidget(&_settingsToolBar); lamAddLine(); _eventsWidget.setDefault(false); _eventsWidget.setMinimumHeight(25 * FONT_HEIGHT); _eventsWidget.removeSystem("ftrace"); _topLayout.addWidget(&_eventsWidget); _pluginsLabel.adjustSize(); _execLayout.addWidget(&_pluginsLabel, row, 0); _pluginsComboBox.addItems(pluginList); _execLayout.addWidget(&_pluginsComboBox, row++, 1); _outputLabel.adjustSize(); _execLayout.addWidget(&_outputLabel, row, 0); _outputLineEdit.setFixedWidth(FONT_WIDTH * 30); _execLayout.addWidget(&_outputLineEdit, row, 1); _outputBrowseButton.adjustSize(); _execLayout.addWidget(&_outputBrowseButton, row++, 2); _commandLabel.adjustSize(); _commandLabel.setFixedWidth(_outputLabel.width()); _execLayout.addWidget(&_commandLabel, row, 0); _commandLineEdit.setFixedWidth(FONT_WIDTH * 30); _commandLineEdit.setMinimumHeight(FONT_HEIGHT * 2); _commandLineEdit.setMaximumHeight(FONT_HEIGHT * 9); _execLayout.addWidget(&_commandLineEdit, row, 1); _commandCheckBox.setCheckState(Qt::Unchecked); _commandCheckBox.adjustSize(); _execLayout.addWidget(&_commandCheckBox, row++, 2); _topLayout.addLayout(&_execLayout); lamAddLine(); _captureButton.setFixedWidth(STRING_WIDTH("_Capture_") + FONT_WIDTH * 2); _applyButton.setFixedWidth(_captureButton.width()); _closeButton.setFixedWidth(_captureButton.width()); _controlToolBar.addWidget(&_captureButton); _controlToolBar.addWidget(&_applyButton); _controlToolBar.addWidget(&_closeButton); _topLayout.addWidget(&_controlToolBar); setLayout(&_topLayout); connect(&_importSettingsButton, &QPushButton::pressed, this, &KsCaptureControl::_importSettings); connect(&_exportSettingsButton, &QPushButton::pressed, this, &KsCaptureControl::_exportSettings); connect(&_outputBrowseButton, &QPushButton::pressed, this, &KsCaptureControl::_browse); connect(&_applyButton, &QPushButton::pressed, this, &KsCaptureControl::_apply); } /** * Use the settings of the Control panel to generate a list of command line * arguments for trace-cmd. */ QStringList KsCaptureControl::getArgs() { QStringList argv; argv << "record"; if (_pluginsComboBox.currentText() != "nop") argv << "-p" << _pluginsComboBox.currentText(); if (_eventsWidget.all()) argv << "-e" << "all"; else argv << _eventsWidget.getCheckedEvents(true); argv << "-o" << outputFileName(); argv << KsUtils::splitArguments(_commandLineEdit.toPlainText()); return argv; } QStringList KsCaptureControl::_getPlugins() { QStringList pluginList; char **all_plugins; all_plugins = tracefs_tracers(tracefs_tracing_dir()); if (!all_plugins) return pluginList; for (int i = 0; all_plugins[i]; ++i) { /* * TODO plugin selection here. * printf("plugin %i %s\n", i, all_plugins[i]); */ pluginList << all_plugins[i]; free(all_plugins[i]); } free (all_plugins); std::sort(pluginList.begin(), pluginList.end()); return pluginList; } void KsCaptureControl::_importSettings() { int nEvts = tep_get_events_count(_localTEP), nIds; kshark_config_doc *conf, *jevents, *temp; QVector v(nEvts, false); tracecmd_filter_id *eventHash; QVector eventIds; QString fileName; auto lamImportError = [this] () { emit print("ERROR: Unable to load the configuration file.\n"); }; /** Get all available events. */ eventIds = KsUtils::getEventIdList(TEP_EVENT_SORT_SYSTEM); /* Get the configuration document. */ fileName = KsUtils::getFile(this, "Import from Filter", "Kernel Shark Config files (*.json);;", _lastFilePath); if (fileName.isEmpty()) { lamImportError(); return; } conf = kshark_open_config_file(fileName.toStdString().c_str(), "kshark.config.record"); if (!conf) { lamImportError(); return; } /* * Load the hash table of selected events from the configuration * document. */ jevents = kshark_config_alloc(KS_CONFIG_JSON); if (!kshark_config_doc_get(conf, "Events", jevents)) { lamImportError(); return; } eventHash = tracecmd_filter_id_hash_alloc(); nIds = kshark_import_event_filter(_localTEP, eventHash, "Events", jevents); if (nIds < 0) { QString err("WARNING: "); err += "Some of the imported events are not available on this system.\n"; err += "All missing events are ignored.\n"; emit print(err); } for (int i = 0; i < nEvts; ++i) { if (tracecmd_filter_id_find(eventHash, eventIds[i])) v[i] = true; } _eventsWidget.set(v); tracecmd_filter_id_hash_free(eventHash); /** Get all available plugins. */ temp = kshark_string_config_alloc(); if (kshark_config_doc_get(conf, "Plugin", temp)) { const char *plugin = KS_C_STR_CAST(temp->conf_doc); int pluginIndex = _pluginsComboBox.findText(plugin); if (pluginIndex >= 0) { _pluginsComboBox.setCurrentText(KS_C_STR_CAST(temp->conf_doc)); } else { QString err("WARNING: The traceer plugin \""); err += plugin; err += "\" is not available on this machine\n"; emit print(err); } } if (kshark_config_doc_get(conf, "Output", temp)) _outputLineEdit.setText(KS_C_STR_CAST(temp->conf_doc)); if (kshark_config_doc_get(conf, "Command", temp)) _commandLineEdit.setPlainText(KS_C_STR_CAST(temp->conf_doc)); } void KsCaptureControl::_exportSettings() { kshark_config_doc *conf, *events; json_object *jplugin; QString plugin, out, comm; QVector ids; QString fileName; fileName = KsUtils::getSaveFile(this, "Export to File", "Kernel Shark Config files (*.json);;", ".json", _lastFilePath); if (fileName.isEmpty()) return; /* Create a configuration document. */ conf = kshark_record_config_new(KS_CONFIG_JSON); events = kshark_filter_config_new(KS_CONFIG_JSON); /* * Use the tracecmd_filter_id to save all selected events in the * configuration file. */ ids = _eventsWidget.getCheckedIds(); tracecmd_filter_id *eventHash = tracecmd_filter_id_hash_alloc(); for (auto const &id: ids) tracecmd_filter_id_add(eventHash, id); kshark_export_event_filter(_localTEP, eventHash, "Events", events); kshark_config_doc_add(conf, "Events", events); tracecmd_filter_id_hash_free(eventHash); /* Save the plugin. */ plugin = _pluginsComboBox.currentText(); jplugin = json_object_new_string(plugin.toStdString().c_str()); kshark_config_doc_add(conf, "Plugin", kshark_json_to_conf(jplugin)); /* Save the output file. */ out = outputFileName(); json_object *jout = json_object_new_string(out.toStdString().c_str()); kshark_config_doc_add(conf, "Output", kshark_json_to_conf(jout)); /* Save the command. */ comm = _commandLineEdit.toPlainText(); json_object *jcomm = json_object_new_string(comm.toStdString().c_str()); kshark_config_doc_add(conf, "Command", kshark_json_to_conf(jcomm)); kshark_save_config_file(fileName.toStdString().c_str(), conf); } void KsCaptureControl::_browse() { QString fileName = KsUtils::getSaveFile(this, "Save File", "trace-cmd files (*.dat);;All files (*)", ".dat", _lastFilePath); if (!fileName.isEmpty()) _outputLineEdit.setText(fileName); } void KsCaptureControl::_apply() { QStringList argv = getArgs(); if (argv.count()) emit argsReady(argv.join(" ")); } /** @brief Create KsCaptureMonitor widget. */ KsCaptureMonitor::KsCaptureMonitor(QWidget *parent) : QWidget(parent), _mergedChannels(false), _argsModified(false), _panel(this), _name("Output display", this), _space("max size ", this), _readOnlyCB("read only", this), _maxLinNumEdit(QString("%1").arg(KS_CAP_MON_MAX_LINE_NUM), this), _consolOutput("", this) { _panel.setMaximumHeight(FONT_HEIGHT * 1.75); _panel.addWidget(&_name); _space.setAlignment(Qt::AlignRight); _panel.addWidget(&_space); _maxLinNumEdit.setFixedWidth(FONT_WIDTH * 7); _panel.addWidget(&_maxLinNumEdit); _panel.addSeparator(); _readOnlyCB.setCheckState(Qt::Checked); _panel.addWidget(&_readOnlyCB); _layout.addWidget(&_panel); _consolOutput.setStyleSheet("QLabel {background-color : white;}"); _consolOutput.setMinimumWidth(FONT_WIDTH * 60); _consolOutput.setMinimumHeight(FONT_HEIGHT * 10); _consolOutput.setMaximumBlockCount(KS_CAP_MON_MAX_LINE_NUM); _space.setMinimumWidth(FONT_WIDTH * 50 - _name.width() - _readOnlyCB.width()); _consolOutput.setReadOnly(true); _layout.addWidget(&_consolOutput); this->setLayout(&_layout); connect(&_maxLinNumEdit, &QLineEdit::textChanged, this, &KsCaptureMonitor::_maxLineNumber); connect(&_readOnlyCB, &QCheckBox::stateChanged, this, &KsCaptureMonitor::_readOnly); connect(&_consolOutput, &QPlainTextEdit::textChanged, this, &KsCaptureMonitor::_argVModified); this->show(); } void KsCaptureMonitor::_maxLineNumber(const QString &test) { bool ok; int max = test.toInt(&ok); if (ok) _consolOutput.setMaximumBlockCount(max); } void KsCaptureMonitor::_readOnly(int state) { if (state == Qt::Checked) _consolOutput.setReadOnly(true); else _consolOutput.setReadOnly(false); } void KsCaptureMonitor::_argsReady(const QString &args) { _name.setText("Capture options:"); _consolOutput.setPlainText(args); _argsModified = false; } void KsCaptureMonitor::_argVModified() { _argsModified = true; } void KsCaptureMonitor::_printAllStandardError() { QProcess *_capture = (QProcess*) sender(); _consolOutput.moveCursor(QTextCursor::End); _consolOutput.insertPlainText(_capture->readAllStandardError()); _consolOutput.moveCursor(QTextCursor::End); QCoreApplication::processEvents(); } void KsCaptureMonitor::_printAllStandardOutput() { QProcess *_capture = (QProcess*) sender(); if (!_mergedChannels) return; _consolOutput.appendPlainText(_capture->readAllStandardOutput()); QCoreApplication::processEvents(); } /** * Connect the Capture monitor widget to the signals of the recording process. */ void KsCaptureMonitor::connectMe(QProcess *proc, KsCaptureControl *ctrl) { connect(proc, &QProcess::started, this, &KsCaptureMonitor::_captureStarted); /* Using the old Signal-Slot syntax because QProcess::finished has overloads. */ connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(_captureFinished(int, QProcess::ExitStatus))); connect(proc, &QProcess::readyReadStandardError, this, &KsCaptureMonitor::_printAllStandardError); connect(proc, &QProcess::readyReadStandardOutput, this, &KsCaptureMonitor::_printAllStandardOutput); connect(ctrl, &KsCaptureControl::argsReady, this, &KsCaptureMonitor::_argsReady); connect(ctrl, &KsCaptureControl::print, this, &KsCaptureMonitor::print); } void KsCaptureMonitor::_captureStarted() { _name.setText("Terminal output:"); _readOnlyCB.setCheckState(Qt::Checked); QCoreApplication::processEvents(); } void KsCaptureMonitor::_captureFinished(int exit, QProcess::ExitStatus status) { QProcess *_capture = (QProcess *)sender(); if (exit != 0 || status != QProcess::NormalExit) { QString errMessage("Capture process failed: "); errMessage += _capture->errorString(); _consolOutput.appendPlainText(errMessage); QCoreApplication::processEvents(); } } /** Print a message. */ void KsCaptureMonitor::print(const QString &message) { _consolOutput.appendPlainText(message); } /** @brief Create KsCaptureDialog widget. */ KsCaptureDialog::KsCaptureDialog(QWidget *parent) : QWidget(parent), _captureCtrl(this), _captureMon(this), _captureProc(this) { QString captureExe; this->setWindowTitle("Capture"); _layout.addWidget(&_captureCtrl); _layout.addWidget(&_captureMon); this->setLayout(&_layout); connect(&_captureCtrl._commandCheckBox, &QCheckBox::stateChanged, this, &KsCaptureDialog::_setChannelMode); connect(&_captureCtrl._captureButton, &QPushButton::pressed, this, &KsCaptureDialog::_capture); connect(&_captureCtrl._closeButton, &QPushButton::pressed, this, &KsCaptureDialog::close); if (!KsUtils::isInstalled()) captureExe = QString(_INSTALL_PREFIX) + QString("/bin/trace-cmd"); else captureExe = TRACECMD_EXECUTABLE; _captureProc.setProgram(captureExe); _captureMon.connectMe(&_captureProc, &_captureCtrl); } void KsCaptureDialog::_capture() { QStringList argv; int argc; if(_captureMon._argsModified) { argv = KsUtils::splitArguments(_captureMon.text()); } else { argv = _captureCtrl.getArgs(); } _captureMon.print("\n"); _captureMon.print(QString("trace-cmd " + argv.join(" ") + "\n")); _captureProc.setArguments(argv); _captureProc.start(); _captureProc.waitForFinished(); /* Reset the _argsModified flag. */ _captureMon._argsModified = false; if (_captureProc.exitCode() != 0 || _captureProc.exitStatus() != QProcess::NormalExit) return; /* * Capture finished successfully. Open the produced tracing data file * in KernelShark. */ argc = argv.count(); for (int i = 0; i < argc; ++i) { if (argv[i] == "-o") { _sendOpenReq(argv[i + 1]); break; } } } void KsCaptureDialog::_setChannelMode(int state) { if (state > 0) { _captureMon._mergedChannels = true; } else { _captureMon._mergedChannels = false; } } void KsCaptureDialog::_sendOpenReq(const QString &fileName) { QLocalSocket *socket; socket = new QLocalSocket(this); socket->connectToServer("KSCapture", QIODevice::WriteOnly); if (socket->waitForConnected()) { QByteArray block; QDataStream out(&block, QIODevice::WriteOnly); const QString message = fileName; out << quint32(message.size()); out << message; socket->write(block); socket->flush(); socket->disconnectFromServer(); } else { QString error(socket->errorString()); error += "\n(maybe KernelShark GUI is not open)"; _captureMon.print(error); } } trace-cmd-v2.9.6/kernel-shark/src/KsCaptureDialog.hpp000066400000000000000000000102101414302661500224600ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsCaptureDialog.hpp * @brief Dialog for trace data recording. */ #ifndef _KS_CAPTURE_H #define _KS_CAPTURE_H // Qt #include // KernelShark #include "KsWidgetsLib.hpp" /** * The KsCommandLineEdit class is used to override the default size hints of * the QPlainTextEdit class. */ struct KsCommandLineEdit : public QPlainTextEdit { KsCommandLineEdit(QString text, QWidget *parent = 0); private: QSize sizeHint() const override; QSize minimumSizeHint() const override; }; /** * The KsCaptureControl class provides a control panel for the KernelShark * Capture dialog. */ class KsCaptureControl : public QWidget { Q_OBJECT public: explicit KsCaptureControl(QWidget *parent = 0); QStringList getArgs(); /** Get the name of the tracing data output file. */ QString outputFileName() const {return _outputLineEdit.text();} /** Set the name of the tracing data output file. */ void setOutputFileName(const QString &f) {_outputLineEdit.setText(f);} signals: /** This signal is emitted when the "Apply" button is pressed. */ void argsReady(const QString &args); /** * This signal is emitted when text has to be printed on the * KsCaptureMonitor widget. */ void print(const QString &message); private: tep_handle *_localTEP; KsEventsCheckBoxWidget _eventsWidget; QVBoxLayout _topLayout; QGridLayout _execLayout; QLabel _pluginsLabel, _outputLabel, _commandLabel; QLineEdit _outputLineEdit; KsCommandLineEdit _commandLineEdit; QToolBar _settingsToolBar, _controlToolBar; QComboBox _pluginsComboBox; QPushButton _importSettingsButton, _exportSettingsButton; QPushButton _outputBrowseButton; QString _lastFilePath; QStringList _getPlugins(); void _importSettings(); void _exportSettings(); void _browse(); void _apply(); public: /** * A Check box used to indicate if the output of the command needs to * be shown by the KsCaptureMonitor widget. */ QCheckBox _commandCheckBox; /** Capture button for the control panel. */ QPushButton _captureButton; /** Apply button for the control panel. */ QPushButton _applyButton; /** Close button for the control panel. */ QPushButton _closeButton; }; /** * The KsCaptureMonitor class provides a terminal-like widget for monitoring * the tracing data recording process. */ class KsCaptureMonitor : public QWidget { Q_OBJECT public: explicit KsCaptureMonitor(QWidget *parent = 0); /** Get the text shown by the widget. */ QString text() const {return _consolOutput.toPlainText();} /** Clear the text shown by the widget. */ void clear() {_consolOutput.clear();} void print(const QString &message); void connectMe(QProcess *proc, KsCaptureControl *ctrl); /** A flag indicating if the stdout and stderr channels are _merged. */ bool _mergedChannels; /** * A flag indicating, if the list of the command line arguments for trace-cmd * has been edited by the user. */ bool _argsModified; private: QVBoxLayout _layout; QToolBar _panel; QLabel _name, _space; QCheckBox _readOnlyCB; QLineEdit _maxLinNumEdit; QPlainTextEdit _consolOutput; void _argsReady(const QString &test); void _maxLineNumber(const QString &test); void _readOnly(int); void _argVModified(); void _captureStarted(); void _printAllStandardError(); void _printAllStandardOutput(); private slots: void _captureFinished(int, QProcess::ExitStatus); }; /** Default number of lines shown by the KsCaptureMonitor widget. */ #define KS_CAP_MON_MAX_LINE_NUM 200 /** * The KsCaptureDialog class provides a dialog for recording of tracing data. */ class KsCaptureDialog : public QWidget { Q_OBJECT public: explicit KsCaptureDialog(QWidget *parent = 0); /** Set the name of the tracing data output file. */ void setOutputFileName(const QString &f) { _captureCtrl.setOutputFileName(f); } private: QHBoxLayout _layout; KsCaptureControl _captureCtrl; KsCaptureMonitor _captureMon; QProcess _captureProc; void _capture(); void _setChannelMode(int state); void _sendOpenReq(const QString &fileName); }; #endif // _KS_CAPTURE_H trace-cmd-v2.9.6/kernel-shark/src/KsDualMarker.cpp000066400000000000000000000207611414302661500217730ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsDualMarker.cpp * @brief KernelShark Dual Marker. */ #include "KsDualMarker.hpp" #include "KsGLWidget.hpp" /** * Reimplemented handler for mouse press events. Right mouse click events will * deselect the corresponding marker. */ void KsMarkerButton::mousePressEvent(QMouseEvent *e) { if(e->button() == Qt::RightButton) { emit deselect(); return; } QPushButton::mousePressEvent(e); } /** * @brief Create KsGraphMark object. * * @param s: The Identifier of the marker (state A or state B). */ KsGraphMark::KsGraphMark(DualMarkerState s) : _color(Qt::darkGreen), _state(s) { reset(); _mark._color << _color; } /** * @brief Create KsGraphMark object. * * @param s: The Identifier of the marker (state A or state B). * @param col: The color of the marker. */ KsGraphMark::KsGraphMark(DualMarkerState s, QColor col) : _color(col), _state(s) { reset(); _mark._color << _color; } /** Reset the marker. */ void KsGraphMark::reset() { _isSet = false; _bin = -1; _cpu = -1; _task = -1; _pos = 0; _mark._visible = false; } /** * @brief Set the marker. * * @param data: Input location for the Data Store object. * @param histo: Input location for the model descriptor. * @param pos: The index inside the data array this marker will points to. * @param cpuGraph: The index of the CPU Graph this marker points to. * @param taskGraph: The index of the Task Graph this marker points to. */ bool KsGraphMark::set(const KsDataStore &data, kshark_trace_histo *histo, size_t pos, int cpuGraph, int taskGraph) { uint8_t visFlags; _isSet = true; _pos = pos; _ts = data.rows()[_pos]->ts; visFlags = data.rows()[_pos]->visible; if ((visFlags & KS_TEXT_VIEW_FILTER_MASK) && (visFlags & KS_GRAPH_VIEW_FILTER_MASK)) _mark.setDashed(false); else _mark.setDashed(true); _cpu = cpuGraph; _task = taskGraph; if (_ts > histo->max || _ts < histo->min) { _bin = -1; _mark._visible = false; return false; } _bin = (_ts - histo->min)/histo->bin_size; setVisible(true); return true; } /** * @brief Use this function to update the marker when the state of the model * has changed. * * @param data: Input location for the Data Store object. * @param histo: Input location for the model descriptor. */ bool KsGraphMark::update(const KsDataStore &data, kshark_trace_histo *histo) { if (!_isSet) return false; return set(data, histo, this->_pos, this->_cpu, this->_task); } /** Unset the Marker and make it invisible. */ void KsGraphMark::remove() { _isSet = false; setVisible(false); } /** An operator for getting the opposite state of the marker identifier. */ DualMarkerState operator!(const DualMarkerState &state) { if (state == DualMarkerState::B) return DualMarkerState::A; return DualMarkerState::B; } /** @brief Create a Dual Marker State Machine. */ KsDualMarkerSM::KsDualMarkerSM(QWidget *parent) : QWidget(parent), _buttonA("Marker A", this), _buttonB("Marker B", this), _labelDeltaDescr(" A,B Delta: ", this), _markA(DualMarkerState::A, Qt::darkGreen), _markB(DualMarkerState::B, Qt::darkCyan), _scCtrlA(this), _scCtrlB(this) { QString styleSheetA, styleSheetB; _buttonA.setFixedWidth(STRING_WIDTH(" Marker A ")); _buttonB.setFixedWidth(STRING_WIDTH(" Marker B ")); for (auto const &l: {&_labelMA, &_labelMB, &_labelDelta}) { l->setFrameStyle(QFrame::Panel | QFrame::Sunken); l->setStyleSheet("QLabel {background-color : white; color : black}"); l->setTextInteractionFlags(Qt::TextSelectableByMouse); l->setFixedWidth(FONT_WIDTH * 16); } styleSheetA = "background : " + _markA._color.name() + "; color : white"; _stateA = new QState; _stateA->setObjectName("A"); _stateA->assignProperty(&_buttonA, "styleSheet", styleSheetA); styleSheetB = "background : " + _markB._color.name() + "; color : white"; _stateB = new QState; _stateB->setObjectName("B"); _stateB->assignProperty(&_buttonB, "styleSheet", styleSheetB); /* Define transitions from State A to State B. */ _stateA->addTransition(this, &KsDualMarkerSM::machineToB, _stateB); _scCtrlA.setKey(Qt::CTRL + Qt::Key_A); _stateA->addTransition(&_scCtrlB, &QShortcut::activated, _stateB); connect(&_scCtrlA, &QShortcut::activated, this, &KsDualMarkerSM::_doStateA); _stateA->addTransition(&_buttonB, &QPushButton::clicked, _stateB); connect(&_buttonB, &QPushButton::clicked, this, &KsDualMarkerSM::_doStateB); connect(&_buttonB, &KsMarkerButton::deselect, this, &KsDualMarkerSM::deselectB); /* Define transitions from State B to State A. */ _stateB->addTransition(this, &KsDualMarkerSM::machineToA, _stateA); _scCtrlB.setKey(Qt::CTRL + Qt::Key_B); _stateB->addTransition(&_scCtrlA, &QShortcut::activated, _stateA); connect(&_scCtrlB, &QShortcut::activated, this, &KsDualMarkerSM::_doStateB); _stateB->addTransition(&_buttonA, &QPushButton::clicked, _stateA); connect(&_buttonA, &QPushButton::clicked, this, &KsDualMarkerSM::_doStateA); connect(&_buttonA, &KsMarkerButton::deselect, this, &KsDualMarkerSM::deselectA); _machine.setGlobalRestorePolicy(QState::RestoreProperties); _machine.addState(_stateA); _machine.addState(_stateB); _machine.setInitialState(_stateA); _markState = DualMarkerState::A; _machine.start(); } /** * Reset the Mark A and Mark B and clear the information shown by the Marker's * toolbar. */ void KsDualMarkerSM::reset() { _markA.reset(); _markB.reset(); _labelMA.setText(""); _labelMB.setText(""); _labelDelta.setText(""); } /** Restart the Dual Marker State Machine. */ void KsDualMarkerSM::restart() { _machine.stop(); reset(); _markState = DualMarkerState::A; _machine.start(); } void KsDualMarkerSM::_doStateA() { if (_markState != DualMarkerState::A) { _markState = DualMarkerState::A; emit markSwitchForView(); } else if (activeMarker()._isSet) { emit updateView(activeMarker()._pos, true); emit updateGraph(activeMarker()._pos); } } void KsDualMarkerSM::_doStateB() { if (_markState != DualMarkerState::B) { _markState = DualMarkerState::B; emit markSwitchForView(); } else if (activeMarker()._isSet) { emit updateView(activeMarker()._pos, true); emit updateGraph(activeMarker()._pos); } } /** Get the Graph marker associated with a given state. */ KsGraphMark &KsDualMarkerSM::getMarker(DualMarkerState s) { if (s == DualMarkerState::A) return _markA; return _markB; } /** Position all buttons and labels of the Dual Marker in a toolbar. */ void KsDualMarkerSM::placeInToolBar(QToolBar *tb) { tb->addWidget(new QLabel(" ")); tb->addWidget(&_buttonA); tb->addWidget(&_labelMA); tb->addSeparator(); tb->addWidget(new QLabel(" ")); tb->addWidget(&_buttonB); tb->addWidget(&_labelMB); tb->addSeparator(); tb->addWidget(&_labelDeltaDescr); tb->addWidget(&_labelDelta); } /** Set the state of the Dual Marker State Machine. */ void KsDualMarkerSM::setState(DualMarkerState st) { if (st == _markState) return; if (st == DualMarkerState::A) { emit machineToA(); _doStateA(); } if (st == DualMarkerState::B) { emit machineToB(); _doStateB(); } } /** * @brief Use this function to update the two marker when the state of the * model has changed. * * @param data: Input location for the Data Store object. * @param glw: Input location for the OpenGL widget object. */ void KsDualMarkerSM::updateMarkers(const KsDataStore &data, KsGLWidget *glw) { if(_markA.update(data, glw->model()->histo())) glw->setMark(&_markA); if(_markB.update(data, glw->model()->histo())) glw->setMark(&_markB); updateLabels(); } /** * @brief Use this function to update the labels when the state of the model * has changed. */ void KsDualMarkerSM::updateLabels() { char separator(' '); int precision(6); // 1 microsecond precision. auto lamSetTimeLabel = [&precision, &separator] (QLabel &l, int64_t t) { QString time = KsUtils::Ts2String(t, precision); int i = time.indexOf('.') + 4; /* Insert separators for milliseconds amd microseconds. */ while (i < time.size()) { time.insert(i, separator); i = i + 4; } l.setText(time); }; // Marker A if (_markA._isSet) lamSetTimeLabel(_labelMA, _markA._ts); else _labelMA.clear(); // Marker B if (_markB._isSet) lamSetTimeLabel(_labelMB, _markB._ts); else _labelMB.clear(); // Delta if (_markA._isSet && _markB._isSet) { precision = 9; // 1 nanoseconds precision. lamSetTimeLabel(_labelDelta, _markB._ts - _markA._ts); } else { _labelDelta.clear(); } } trace-cmd-v2.9.6/kernel-shark/src/KsDualMarker.hpp000066400000000000000000000110321414302661500217670ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsDualMarker.hpp * @brief KernelShark Dual Marker. */ #ifndef _KS_DUAL_MARKER_H #define _KS_DUAL_MARKER_H // Qt #include // KernelShark #include "KsUtils.hpp" #include "KsPlotTools.hpp" /** * The Marker Button class provides a button that deselect the corresponding * marker in the case of a Right mouse click. */ class KsMarkerButton : public QPushButton { Q_OBJECT public: /** * @brief Create a default button. */ explicit KsMarkerButton(QWidget *parent = nullptr) : QPushButton(parent) {} /** * @brief Create a button with text. */ explicit KsMarkerButton(const QString &text, QWidget *parent = nullptr) : QPushButton(text, parent) {} void mousePressEvent(QMouseEvent *e); signals: /** * This signal is emitted when the button is click by the Right mouse * button. */ void deselect(); }; class KsGLWidget; /** The KsGraphMark represents a marker for KernelShark GUI. */ class KsGraphMark : public QObject { Q_OBJECT public: KsGraphMark() = delete; KsGraphMark(DualMarkerState s); KsGraphMark(DualMarkerState s, QColor col); void reset(); bool set(const KsDataStore &data, kshark_trace_histo *histo, size_t pos, int cpuGraph, int taskGraph); bool update(const KsDataStore &data, kshark_trace_histo *histo); /** Is this marker visible. */ bool isVisible() const {return _mark._visible;} /** Draw this marker. */ void draw() const {_mark.draw();} /** Set the visiblity of the marker. */ void setVisible(bool v) {_mark._visible = v;} void remove(); public: /** Is this marker set. */ bool _isSet; /** The number of the bin this marker points to. */ int _bin; /** The index of the CPU Graph this marker points to. */ int _cpu; /** The index of the Task Graph this marker points to. */ int _task; /** The index inside the data array this marker points to. */ size_t _pos; /** The timestamp of the marker. */ uint64_t _ts; /** The RGB color of the marker. */ QColor _color; /** The Identifier of the marker (A or B). */ const DualMarkerState _state; /** The graphical element of this marker. */ KsPlot::Mark _mark; }; DualMarkerState operator !(const DualMarkerState &state); /** * The DualMarkerState represents the State Machine of the KernelShark GUI * Dual Marker. */ class KsDualMarkerSM : public QWidget { Q_OBJECT public: explicit KsDualMarkerSM(QWidget *parent = nullptr); void reset(); void restart(); void placeInToolBar(QToolBar *tb); /** Get the Identifier of the current state of the State Machine. */ DualMarkerState getState() const {return _markState;} void setState(DualMarkerState st); KsGraphMark &getMarker(DualMarkerState s); /** Get the active marker. */ KsGraphMark &activeMarker() {return getMarker(_markState);} /** Get the passive marker. */ KsGraphMark &passiveMarker() {return getMarker(!_markState);} /** Get the marker A. */ KsGraphMark &markerA() {return _markA;} /** Get the marker B. */ KsGraphMark &markerB() {return _markB;} /** Get a pointer to the State A object. */ QState *stateAPtr() {return _stateA;} /** Get a pointer to the State B object. */ QState *stateBPtr() {return _stateB;} void updateMarkers(const KsDataStore &data, KsGLWidget *glw); void updateLabels(); signals: /** * This signal is emitted when the Table View has to switch the color * of the selected row. */ void markSwitchForView(); /** * This signal is emitted when the Table View has to show a different * entry (row). */ void updateView(size_t pos, bool mark); /** * This signal is emitted when the Graph mark has to show a different * entry. */ void updateGraph(size_t pos); /** * This signal is emitted when the State Machine has to switch to * state A. */ void machineToA(); /** * This signal is emitted when the State Machine has to switch to * state B. */ void machineToB(); /** * This signal is used to re-emitted the deselect signal of the * Marker A button. */ void deselectA(); /** * This signal is used to re-emitted the deselect signal of the * Marker B button. */ void deselectB(); private: KsMarkerButton _buttonA; KsMarkerButton _buttonB; QLabel _labelMA, _labelMB, _labelDelta; QLabel _labelDeltaDescr; QState *_stateA; QState *_stateB; QStateMachine _machine; DualMarkerState _markState; KsGraphMark _markA, _markB; QShortcut _scCtrlA, _scCtrlB; void _doStateA(); void _doStateB(); }; #endif trace-cmd-v2.9.6/kernel-shark/src/KsGLWidget.cpp000066400000000000000000000533661414302661500214210ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsGLWidget.cpp * @brief OpenGL widget for plotting trace graphs. */ // OpenGL #include #include // KernelShark #include "KsGLWidget.hpp" #include "KsUtils.hpp" #include "KsPlugins.hpp" #include "KsDualMarker.hpp" /** Create a default (empty) OpenGL widget. */ KsGLWidget::KsGLWidget(QWidget *parent) : QOpenGLWidget(parent), _hMargin(20), _vMargin(30), _vSpacing(20), _mState(nullptr), _data(nullptr), _rubberBand(QRubberBand::Rectangle, this), _rubberBandOrigin(0, 0), _dpr(1) { setMouseTracking(true); /* * Using the old Signal-Slot syntax because QWidget::update has * overloads. */ connect(&_model, SIGNAL(modelReset()), this, SLOT(update())); } KsGLWidget::~KsGLWidget() { for (auto &g: _graphs) delete g; } /** Reimplemented function used to set up all required OpenGL resources. */ void KsGLWidget::initializeGL() { _dpr = QApplication::desktop()->devicePixelRatio(); ksplot_init_opengl(_dpr); } /** * Reimplemented function used to reprocess all graphs whene the widget has * been resized. */ void KsGLWidget::resizeGL(int w, int h) { ksplot_resize_opengl(w, h); if(!_data) return; /* * From the size of the widget, calculate the number of bins. * One bin will correspond to one pixel. */ int nBins = width() - _hMargin * 2; /* * Reload the data. The range of the histogram is the same * but the number of bins changes. */ ksmodel_set_bining(_model.histo(), nBins, _model.histo()->min, _model.histo()->max); _model.fill(_data->rows(), _data->size()); } /** Reimplemented function used to plot trace graphs. */ void KsGLWidget::paintGL() { float size = 1.5 * _dpr; glClear(GL_COLOR_BUFFER_BIT); if (isEmpty()) return; /* Draw the time axis. */ _drawAxisX(size); /* Process and draw all graphs by using the built-in logic. */ _makeGraphs(_cpuList, _taskList); for (auto const &g: _graphs) g->draw(size); /* Process and draw all plugin-specific shapes. */ _makePluginShapes(_cpuList, _taskList); while (!_shapes.empty()) { auto s = _shapes.front(); _shapes.pop_front(); s->_size = size; s->draw(); delete s; } /* * Update and draw the markers. Make sure that the active marker * is drawn on top. */ _mState->updateMarkers(*_data, this); _mState->passiveMarker().draw(); _mState->activeMarker().draw(); } /** Reset (empty) the widget. */ void KsGLWidget::reset() { _cpuList = {}; _taskList = {}; _data = nullptr; _model.reset(); } /** Check if the widget is empty (not showing anything). */ bool KsGLWidget::isEmpty() const { return !_data || !_data->size() || (!_cpuList.size() && !_taskList.size()); } /** Reimplemented event handler used to receive mouse press events. */ void KsGLWidget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { _posMousePress = _posInRange(event->pos().x()); _rangeBoundInit(_posMousePress); } } int KsGLWidget::_getLastTask(struct kshark_trace_histo *histo, int bin, int cpu) { kshark_context *kshark_ctx(nullptr); kshark_entry_collection *col; int pid; if (!kshark_instance(&kshark_ctx)) return KS_EMPTY_BIN; col = kshark_find_data_collection(kshark_ctx->collections, KsUtils::matchCPUVisible, cpu); for (int b = bin; b >= 0; --b) { pid = ksmodel_get_pid_back(histo, b, cpu, false, col, nullptr); if (pid >= 0) return pid; } return ksmodel_get_pid_back(histo, LOWER_OVERFLOW_BIN, cpu, false, col, nullptr); } int KsGLWidget::_getLastCPU(struct kshark_trace_histo *histo, int bin, int pid) { kshark_context *kshark_ctx(nullptr); kshark_entry_collection *col; int cpu; if (!kshark_instance(&kshark_ctx)) return KS_EMPTY_BIN; col = kshark_find_data_collection(kshark_ctx->collections, kshark_match_pid, pid); for (int b = bin; b >= 0; --b) { cpu = ksmodel_get_cpu_back(histo, b, pid, false, col, nullptr); if (cpu >= 0) return cpu; } return ksmodel_get_cpu_back(histo, LOWER_OVERFLOW_BIN, pid, false, col, nullptr); } /** Reimplemented event handler used to receive mouse move events. */ void KsGLWidget::mouseMoveEvent(QMouseEvent *event) { int bin, cpu, pid; size_t row; bool ret; if (isEmpty()) return; if (_rubberBand.isVisible()) _rangeBoundStretched(_posInRange(event->pos().x())); bin = event->pos().x() - _hMargin; cpu = getPlotCPU(event->pos()); pid = getPlotPid(event->pos()); ret = _find(bin, cpu, pid, 5, false, &row); if (ret) { emit found(row); } else { if (cpu >= 0) { pid = _getLastTask(_model.histo(), bin, cpu); } if (pid > 0) { cpu = _getLastCPU(_model.histo(), bin, pid); } emit notFound(ksmodel_bin_ts(_model.histo(), bin), cpu, pid); } } /** Reimplemented event handler used to receive mouse release events. */ void KsGLWidget::mouseReleaseEvent(QMouseEvent *event) { if (isEmpty()) return; if (event->button() == Qt::LeftButton) { size_t posMouseRel = _posInRange(event->pos().x()); int min, max; if (_posMousePress < posMouseRel) { min = _posMousePress - _hMargin; max = posMouseRel - _hMargin; } else { max = _posMousePress - _hMargin; min = posMouseRel - _hMargin; } _rangeChanged(min, max); } } /** Reimplemented event handler used to receive mouse double click events. */ void KsGLWidget::mouseDoubleClickEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) _findAndSelect(event); } /** Reimplemented event handler used to receive mouse wheel events. */ void KsGLWidget::wheelEvent(QWheelEvent * event) { int zoomFocus; if (QApplication::keyboardModifiers() != Qt::ControlModifier || isEmpty()) return; if (_mState->activeMarker()._isSet && _mState->activeMarker().isVisible()) { /* * Use the position of the marker as a focus point for the * zoom. */ zoomFocus = _mState->activeMarker()._bin; } else { /* * Use the position of the mouse as a focus point for the * zoom. */ zoomFocus = event->pos().x() - _hMargin; } if (event->delta() > 0) { _model.zoomIn(.05, zoomFocus); } else { _model.zoomOut(.05, zoomFocus); } _mState->updateMarkers(*_data, this); } /** Reimplemented event handler used to receive key press events. */ void KsGLWidget::keyPressEvent(QKeyEvent *event) { if (event->isAutoRepeat()) return; switch (event->key()) { case Qt::Key_Plus: emit zoomIn(); return; case Qt::Key_Minus: emit zoomOut(); return; case Qt::Key_Left: emit scrollLeft(); return; case Qt::Key_Right: emit scrollRight(); return; default: QOpenGLWidget::keyPressEvent(event); return; } } /** Reimplemented event handler used to receive key release events. */ void KsGLWidget::keyReleaseEvent(QKeyEvent *event) { if (event->isAutoRepeat()) return; if(event->key() == Qt::Key_Plus || event->key() == Qt::Key_Minus || event->key() == Qt::Key_Left || event->key() == Qt::Key_Right) { emit stopUpdating(); return; } QOpenGLWidget::keyPressEvent(event); return; } /** * The maximum number of CPU plots to be shown by default when the GUI starts. */ #define KS_MAX_START_PLOTS 16 /** * @brief Load and show trace data. * * @param data: Input location for the KsDataStore object. * KsDataStore::loadDataFile() must be called first. */ void KsGLWidget::loadData(KsDataStore *data) { uint64_t tMin, tMax; int nCPUs, nBins; _data = data; /* * From the size of the widget, calculate the number of bins. * One bin will correspond to one pixel. */ nBins = width() - _hMargin * 2; _model.reset(); /* Now load the entire set of trace data. */ tMin = _data->rows()[0]->ts; tMax = _data->rows()[_data->size() - 1]->ts; ksmodel_set_bining(_model.histo(), nBins, tMin, tMax); _model.fill(_data->rows(), _data->size()); /* Make a default CPU list. All CPUs (or the first N_max) will be plotted. */ _cpuList = {}; nCPUs = tep_get_cpus(_data->tep()); if (nCPUs > KS_MAX_START_PLOTS) nCPUs = KS_MAX_START_PLOTS; for (int i = 0; i < nCPUs; ++i) _cpuList.append(i); /* Make a default task list. No tasks will be plotted. */ _taskList = {}; loadColors(); _makeGraphs(_cpuList, _taskList); } /** * Create a Hash table of Rainbow colors. The sorted Pid values are mapped to * the palette of Rainbow colors. */ void KsGLWidget::loadColors() { _pidColors.clear(); _pidColors = KsPlot::getTaskColorTable(); _cpuColors.clear(); _cpuColors = KsPlot::getCPUColorTable(); } /** * Position the graphical elements of the marker according to the current * position of the graphs inside the GL widget. */ void KsGLWidget::setMark(KsGraphMark *mark) { mark->_mark.setDPR(_dpr); mark->_mark.setX(mark->_bin + _hMargin); mark->_mark.setY(_vMargin / 2 + 2, height() - _vMargin); if (mark->_cpu >= 0) { mark->_mark.setCPUY(_graphs[mark->_cpu]->getBase()); mark->_mark.setCPUVisible(true); } else { mark->_mark.setCPUVisible(false); } if (mark->_task >= 0) { mark->_mark.setTaskY(_graphs[mark->_task]->getBase()); mark->_mark.setTaskVisible(true); } else { mark->_mark.setTaskVisible(false); } } /** * @brief Check if a given KernelShark entry is ploted. * * @param e: Input location for the KernelShark entry. * @param graphCPU: Output location for index of the CPU graph to which this * entry belongs. If such a graph does not exist the outputted * value is "-1". * @param graphTask: Output location for index of the Task graph to which this * entry belongs. If such a graph does not exist the * outputted value is "-1". */ void KsGLWidget::findGraphIds(const kshark_entry &e, int *graphCPU, int *graphTask) { int graph(0); bool cpuFound(false), taskFound(false); /* * Loop over all CPU graphs and try to find the one that * contains the entry. */ for (auto const &c: _cpuList) { if (c == e.cpu) { cpuFound = true; break; } ++graph; } if (cpuFound) *graphCPU = graph; else *graphCPU = -1; /* * Loop over all Task graphs and try to find the one that * contains the entry. */ graph = _cpuList.count(); for (auto const &p: _taskList) { if (p == e.pid) { taskFound = true; break; } ++graph; } if (taskFound) *graphTask = graph; else *graphTask = -1; } void KsGLWidget::_drawAxisX(float size) { KsPlot::Point a0(_hMargin, _vMargin / 4), a1(_hMargin, _vMargin / 2); KsPlot::Point b0(width() / 2, _vMargin / 4), b1(width() / 2, _vMargin / 2); KsPlot::Point c0(width() - _hMargin, _vMargin / 4), c1(width() - _hMargin, _vMargin / 2); a0._size = c0._size = _dpr; a0.draw(); c0.draw(); KsPlot::drawLine(a0, a1, {}, size); KsPlot::drawLine(b0, b1, {}, size); KsPlot::drawLine(c0, c1, {}, size); KsPlot::drawLine(a0, c0, {}, size); } void KsGLWidget::_makeGraphs(QVector cpuList, QVector taskList) { /* The very first thing to do is to clean up. */ for (auto &g: _graphs) delete g; _graphs.resize(0); if (!_data || !_data->size()) return; auto lamAddGraph = [&](KsPlot::Graph *graph) { /* * Calculate the base level of the CPU graph inside the widget. * Remember that the "Y" coordinate is inverted. */ if (!graph) return; int base = _vMargin + _vSpacing * _graphs.count() + KS_GRAPH_HEIGHT * (_graphs.count() + 1); graph->setBase(base); _graphs.append(graph); }; /* Create CPU graphs according to the cpuList. */ for (auto const &cpu: cpuList) lamAddGraph(_newCPUGraph(cpu)); /* Create Task graphs taskList to the taskList. */ for (auto const &pid: taskList) lamAddGraph(_newTaskGraph(pid)); } void KsGLWidget::_makePluginShapes(QVector cpuList, QVector taskList) { kshark_context *kshark_ctx(nullptr); kshark_event_handler *evt_handlers; KsCppArgV cppArgv; if (!kshark_instance(&kshark_ctx)) return; cppArgv._histo = _model.histo(); cppArgv._shapes = &_shapes; for (int g = 0; g < cpuList.count(); ++g) { cppArgv._graph = _graphs[g]; evt_handlers = kshark_ctx->event_handlers; while (evt_handlers) { evt_handlers->draw_func(cppArgv.toC(), cpuList[g], KSHARK_PLUGIN_CPU_DRAW); evt_handlers = evt_handlers->next; } } for (int g = 0; g < taskList.count(); ++g) { cppArgv._graph = _graphs[cpuList.count() + g]; evt_handlers = kshark_ctx->event_handlers; while (evt_handlers) { evt_handlers->draw_func(cppArgv.toC(), taskList[g], KSHARK_PLUGIN_TASK_DRAW); evt_handlers = evt_handlers->next; } } } KsPlot::Graph *KsGLWidget::_newCPUGraph(int cpu) { /* The CPU graph needs to know only the colors of the tasks. */ KsPlot::Graph *graph = new KsPlot::Graph(_model.histo(), &_pidColors, &_pidColors); graph->setZeroSuppressed(true); kshark_context *kshark_ctx(nullptr); kshark_entry_collection *col; if (!kshark_instance(&kshark_ctx)) return nullptr; graph->setHMargin(_hMargin); graph->setHeight(KS_GRAPH_HEIGHT); col = kshark_find_data_collection(kshark_ctx->collections, KsUtils::matchCPUVisible, cpu); graph->setDataCollectionPtr(col); graph->fillCPUGraph(cpu); return graph; } KsPlot::Graph *KsGLWidget::_newTaskGraph(int pid) { /* * The Task graph needs to know the colors of the tasks and the colors * of the CPUs. */ KsPlot::Graph *graph = new KsPlot::Graph(_model.histo(), &_pidColors, &_cpuColors); kshark_context *kshark_ctx(nullptr); kshark_entry_collection *col; if (!kshark_instance(&kshark_ctx)) return nullptr; graph->setHMargin(_hMargin); graph->setHeight(KS_GRAPH_HEIGHT); col = kshark_find_data_collection(kshark_ctx->collections, kshark_match_pid, pid); if (!col) { /* * If a data collection for this task does not exist, * register a new one. */ col = kshark_register_data_collection(kshark_ctx, _data->rows(), _data->size(), kshark_match_pid, pid, 25); } /* * Data collections are efficient only when used on graphs, having a * lot of empty bins. * TODO: Determine the optimal criteria to decide whether to use or * not use data collection for this graph. */ if (_data->size() < 1e6 && col && col->size && _data->size() / col->size < 100) { /* * No need to use collection in this case. Free the collection * data, but keep the collection registered. This will prevent * from recalculating the same collection next time when this * task is ploted. */ kshark_reset_data_collection(col); } graph->setDataCollectionPtr(col); graph->fillTaskGraph(pid); return graph; } /** * @brief Find the KernelShark entry under the the cursor. * * @param point: The position of the cursor. * @param variance: The variance of the position (range) in which an entry will * be searched. * @param joined: It True, search also in the associated CPU/Task graph. * @param index: Output location for the index of the entry under the cursor. * If no entry has been found, the outputted value is zero. * * @returns True, if an entry has been found, otherwise False. */ bool KsGLWidget::find(const QPoint &point, int variance, bool joined, size_t *index) { /* * Get the bin, pid and cpu numbers. * Remember that one bin corresponds to one pixel. */ int bin = point.x() - _hMargin; int cpu = getPlotCPU(point); int pid = getPlotPid(point); return _find(bin, cpu, pid, variance, joined, index); } int KsGLWidget::_getNextCPU(int pid, int bin) { kshark_context *kshark_ctx(nullptr); kshark_entry_collection *col; int cpu; if (!kshark_instance(&kshark_ctx)) return KS_EMPTY_BIN; col = kshark_find_data_collection(kshark_ctx->collections, kshark_match_pid, pid); if (!col) return KS_EMPTY_BIN; for (int i = bin; i < _model.histo()->n_bins; ++i) { cpu = ksmodel_get_cpu_front(_model.histo(), i, pid, false, col, nullptr); if (cpu >= 0) return cpu; } return KS_EMPTY_BIN; } bool KsGLWidget::_find(int bin, int cpu, int pid, int variance, bool joined, size_t *row) { int hSize = _model.histo()->n_bins; ssize_t found; if (bin < 0 || bin > hSize || (cpu < 0 && pid < 0)) { /* * The click is outside of the range of the histogram. * Do nothing. */ *row = 0; return false; } auto lamGetEntryByCPU = [&](int b) { /* Get the first data entry in this bin. */ found = ksmodel_first_index_at_cpu(_model.histo(), b, cpu); if (found < 0) { /* * The bin is empty or the entire connect of the bin * has been filtered. */ return false; } *row = found; return true; }; auto lamGetEntryByPid = [&](int b) { /* Get the first data entry in this bin. */ found = ksmodel_first_index_at_pid(_model.histo(), b, pid); if (found < 0) { /* * The bin is empty or the entire connect of the bin * has been filtered. */ return false; } *row = found; return true; }; auto lamFindEntryByCPU = [&](int b) { /* * The click is over the CPU graphs. First try the exact * match. */ if (lamGetEntryByCPU(bin)) return true; /* Now look for a match, nearby the position of the click. */ for (int i = 1; i < variance; ++i) { if (bin + i <= hSize && lamGetEntryByCPU(bin + i)) return true; if (bin - i >= 0 && lamGetEntryByCPU(bin - i)) return true; } *row = 0; return false; }; auto lamFindEntryByPid = [&](int b) { /* * The click is over the Task graphs. First try the exact * match. */ if (lamGetEntryByPid(bin)) return true; /* Now look for a match, nearby the position of the click. */ for (int i = 1; i < variance; ++i) { if ((bin + i <= hSize) && lamGetEntryByPid(bin + i)) return true; if ((bin - i >= 0) && lamGetEntryByPid(bin - i)) return true; } *row = 0; return false; }; if (cpu >= 0) return lamFindEntryByCPU(bin); if (pid >= 0) { bool ret = lamFindEntryByPid(bin); /* * If no entry has been found and we have a joined search, look * for an entry on the next CPU used by this task. */ if (!ret && joined) { cpu = _getNextCPU(pid, bin); ret = lamFindEntryByCPU(bin); } return ret; } *row = 0; return false; } bool KsGLWidget::_findAndSelect(QMouseEvent *event) { size_t row; bool found = find(event->pos(), 10, true, &row); if (found) { emit select(row); emit updateView(row, true); } return found; } void KsGLWidget::_rangeBoundInit(int x) { /* * Set the origin of the rubber band that shows the new range. Only * the X coordinate of the origin matters. The Y coordinate will be * set to zero. */ _rubberBandOrigin.rx() = x; _rubberBandOrigin.ry() = 0; _rubberBand.setGeometry(_rubberBandOrigin.x(), _rubberBandOrigin.y(), 0, 0); /* Make the rubber band visible, although its size is zero. */ _rubberBand.show(); } void KsGLWidget::_rangeBoundStretched(int x) { QPoint pos; pos.rx() = x; pos.ry() = this->height(); /* * Stretch the rubber band between the origin position and the current * position of the mouse. Only the X coordinate matters. The Y * coordinate will be the height of the widget. */ if (_rubberBandOrigin.x() < pos.x()) { _rubberBand.setGeometry(QRect(_rubberBandOrigin.x(), _rubberBandOrigin.y(), pos.x() - _rubberBandOrigin.x(), pos.y() - _rubberBandOrigin.y())); } else { _rubberBand.setGeometry(QRect(pos.x(), _rubberBandOrigin.y(), _rubberBandOrigin.x() - pos.x(), pos.y() - _rubberBandOrigin.y())); } } void KsGLWidget::_rangeChanged(int binMin, int binMax) { size_t nBins = _model.histo()->n_bins; int binMark = _mState->activeMarker()._bin; uint64_t min, max; /* The rubber band is no longer needed. Make it invisible. */ _rubberBand.hide(); if ( (binMax - binMin) < 4) { /* Most likely this is an accidental click. Do nothing. */ return; } /* * Calculate the new range of the histogram. The number of bins will * stay the same. */ min = ksmodel_bin_ts(_model.histo(), binMin); max = ksmodel_bin_ts(_model.histo(), binMax); if (max - min < nBins) { /* * The range cannot be smaller than the number of bins. * Do nothing. */ return; } /* Recalculate the model and update the markers. */ ksmodel_set_bining(_model.histo(), nBins, min, max); _model.fill(_data->rows(), _data->size()); _mState->updateMarkers(*_data, this); /* * If the Marker is inside the new range, make sure that it will * be visible in the table. Note that for this check we use the * bin number of the marker, retrieved before its update. */ if (_mState->activeMarker()._isSet && binMark < binMax && binMark > binMin) { emit updateView(_mState->activeMarker()._pos, true); return; } /* * Find the first bin which contains unfiltered data and send a signal * to the View widget to make this data visible. */ for (int bin = 0; bin < _model.histo()->n_bins; ++bin) { int64_t row = ksmodel_first_index_at_bin(_model.histo(), bin); if (row != KS_EMPTY_BIN && (_data->rows()[row]->visible & KS_TEXT_VIEW_FILTER_MASK)) { emit updateView(row, false); return; } } } int KsGLWidget::_posInRange(int x) { int posX; if (x < _hMargin) posX = _hMargin; else if (x > (width() - _hMargin)) posX = width() - _hMargin; else posX = x; return posX; } /** Get the CPU Id of the Graph plotted at given position. */ int KsGLWidget::getPlotCPU(const QPoint &point) { int cpuId, y = point.y(); if (_cpuList.count() == 0) return -1; cpuId = (y - _vMargin + _vSpacing / 2) / (_vSpacing + KS_GRAPH_HEIGHT); if (cpuId < 0 || cpuId >= _cpuList.count()) return -1; return _cpuList[cpuId]; } /** Get the CPU Id of the Graph plotted at given position. */ int KsGLWidget::getPlotPid(const QPoint &point) { int pidId, y = point.y(); if (_taskList.count() == 0) return -1; pidId = (y - _vMargin - _cpuList.count()*(KS_GRAPH_HEIGHT + _vSpacing) + _vSpacing / 2) / (_vSpacing + KS_GRAPH_HEIGHT); if (pidId < 0 || pidId >= _taskList.count()) return -1; return _taskList[pidId]; } trace-cmd-v2.9.6/kernel-shark/src/KsGLWidget.hpp000066400000000000000000000126321414302661500214150ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsGLWidget.hpp * @brief OpenGL widget for plotting trace graphs. */ #ifndef _KS_GLWIDGET_H #define _KS_GLWIDGET_H // Qt #include // KernelShark #include "KsUtils.hpp" #include "KsPlotTools.hpp" #include "KsModels.hpp" #include "KsDualMarker.hpp" /** * The KsGLWidget class provides a widget for rendering OpenGL graphics used * to plot trace graphs. */ class KsGLWidget : public QOpenGLWidget { Q_OBJECT public: explicit KsGLWidget(QWidget *parent = NULL); ~KsGLWidget(); void initializeGL() override; void resizeGL(int w, int h) override; void paintGL() override; void reset(); bool isEmpty() const; /** Reprocess all graphs. */ void update() {resizeGL(width(), height());} void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void mouseDoubleClickEvent(QMouseEvent *event); void wheelEvent(QWheelEvent * event); void keyPressEvent(QKeyEvent *event); void keyReleaseEvent(QKeyEvent *event); void loadData(KsDataStore *data); void loadColors(); /** * Reimplementing the event handler of the focus event, in order to * avoid the update (redrawing) of the graphs every time when the * widget grabs the focus of the keyboard. This is done because we do * not need to redraw, while on the other hand on large data-sets, * redrawing can take a lot of time. */ void focusInEvent(QFocusEvent* e) override {} /** * Reimplementing the event handler of the focus event, in order to * avoid the update (redrawing) of the graphs every time when the * widget releases the focus of the keyboard. This is done because we * do not need to redraw, while on the other hand on large data-sets, * redrawing can take a lot of time. */ void focusOutEvent(QFocusEvent* e) override {} /** * Provide the widget with a pointer to the Dual Marker state machine * object. */ void setMarkerSM(KsDualMarkerSM *m) {_mState = m;} /** Get the KsGraphModel object. */ KsGraphModel *model() {return &_model;} /** Get the number of CPU graphs. */ int cpuGraphCount() const {return _cpuList.count();} /** Get the number of Task graphs. */ int taskGraphCount() const {return _taskList.count();} /** Get the total number of graphs. */ int graphCount() const {return _cpuList.count() + _taskList.count();} /** Get the height of the widget. */ int height() const { return graphCount() * (KS_GRAPH_HEIGHT + _vSpacing) + _vMargin * 2; } /** Get the device pixel ratio. */ int dpr() const {return _dpr;} /** Get the size of the horizontal margin space. */ int hMargin() const {return _hMargin;} /** Get the size of the vertical margin space. */ int vMargin() const {return _vMargin;} /** Get the size of the vertical spaceing between the graphs. */ int vSpacing() const {return _vSpacing;} void setMark(KsGraphMark *mark); void findGraphIds(const kshark_entry &e, int *graphCPU, int *graphTask); bool find(const QPoint &point, int variance, bool joined, size_t *index); int getPlotCPU(const QPoint &point); int getPlotPid(const QPoint &point); /** CPUs to be plotted. */ QVector _cpuList; /** Tasks to be plotted. */ QVector _taskList; signals: /** * This signal is emitted when the mouse moves over a visible * KernelShark entry. */ void found(size_t pos); /** * This signal is emitted when the mouse moves but there is no visible * KernelShark entry under the cursor. */ void notFound(uint64_t ts, int cpu, int pid); /** This signal is emitted when the Plus key is pressed. */ void zoomIn(); /** This signal is emitted when the Minus key is pressed. */ void zoomOut(); /** This signal is emitted when the Left Arrow key is pressed. */ void scrollLeft(); /** This signal is emitted when the Right Arrow key is pressed. */ void scrollRight(); /** * This signal is emitted when one of the 4 Action keys is release * (after being pressed). */ void stopUpdating(); /** * This signal is emitted in the case of a double click over a visible * KernelShark entry. */ void select(size_t pos); /** * This signal is emitted when the KsTraceViewer widget needs to be * updated. */ void updateView(size_t pos, bool mark); private: QVector _graphs; KsPlot::PlotObjList _shapes; KsPlot::ColorTable _pidColors; KsPlot::ColorTable _cpuColors; int _hMargin, _vMargin; unsigned int _vSpacing; KsGraphModel _model; KsDualMarkerSM *_mState; KsDataStore *_data; QRubberBand _rubberBand; QPoint _rubberBandOrigin; size_t _posMousePress; bool _keyPressed; int _dpr; void _drawAxisX(float size); void _makeGraphs(QVector cpuMask, QVector taskMask); KsPlot::Graph *_newCPUGraph(int cpu); KsPlot::Graph *_newTaskGraph(int pid); void _makePluginShapes(QVector cpuMask, QVector taskMask); int _posInRange(int x); void _rangeBoundInit(int x); void _rangeBoundStretched(int x); void _rangeChanged(int binMin, int binMax); bool _findAndSelect(QMouseEvent *event); bool _find(int bin, int cpu, int pid, int variance, bool joined, size_t *row); int _getNextCPU(int pid, int bin); int _getLastTask(struct kshark_trace_histo *histo, int bin, int cpu); int _getLastCPU(struct kshark_trace_histo *histo, int bin, int pid); void _deselect(); }; #endif trace-cmd-v2.9.6/kernel-shark/src/KsMainWindow.cpp000066400000000000000000001006361414302661500220200ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsMainWindow.cpp * @brief KernelShark GUI main window. */ // C #include #include #include // C++11 #include // Qt #include #include #include #include #include // KernelShark #include "libkshark.h" #include "KsCmakeDef.hpp" #include "KsMainWindow.hpp" #include "KsCaptureDialog.hpp" #include "KsAdvFilteringDialog.hpp" /** Create KernelShark Main window. */ KsMainWindow::KsMainWindow(QWidget *parent) : QMainWindow(parent), _splitter(Qt::Vertical, this), _data(this), _view(this), _graph(this), _mState(this), _plugins(this), _capture(this), _captureLocalServer(this), _openAction("Open", this), _restoreSessionAction("Restore Last Session", this), _importSessionAction("Import Session", this), _exportSessionAction("Export Session", this), _quitAction("Quit", this), _importFilterAction("Import Filter", this), _exportFilterAction("Export Filter", this), _graphFilterSyncCBox(nullptr), _listFilterSyncCBox(nullptr), _showEventsAction("Show events", this), _showTasksAction("Show tasks", this), _showCPUsAction("Show CPUs", this), _advanceFilterAction("Advance Filtering", this), _clearAllFilters("Clear all filters", this), _cpuSelectAction("CPUs", this), _taskSelectAction("Tasks", this), _managePluginsAction("Manage plugins", this), _addPluginsAction("Add plugins", this), _captureAction("Record", this), _colorAction(this), _colSlider(this), _colorPhaseSlider(Qt::Horizontal, this), _fullScreenModeAction("Full Screen Mode", this), _aboutAction("About", this), _contentsAction("Contents", this), _bugReportAction("Report a bug", this), _deselectShortcut(this), _settings(_getCacheDir() + "/setting.ini", QSettings::IniFormat) { setWindowTitle("Kernel Shark"); _createActions(); _createMenus(); _initCapture(); if (geteuid() == 0) _rootWarning(); _splitter.addWidget(&_graph); _splitter.addWidget(&_view); setCentralWidget(&_splitter); connect(&_splitter, &QSplitter::splitterMoved, this, &KsMainWindow::_splitterMoved); _view.setMarkerSM(&_mState); connect(&_mState, &KsDualMarkerSM::markSwitchForView, &_view, &KsTraceViewer::markSwitch); _graph.setMarkerSM(&_mState); connect(&_mState, &KsDualMarkerSM::updateGraph, &_graph, &KsTraceGraph::markEntry); connect(&_mState, &KsDualMarkerSM::updateView, &_view, &KsTraceViewer::showRow); connect(&_view, &KsTraceViewer::select, &_graph, &KsTraceGraph::markEntry); connect(&_view, &KsTraceViewer::addTaskPlot, &_graph, &KsTraceGraph::addTaskPlot); connect(_graph.glPtr(), &KsGLWidget::updateView, &_view, &KsTraceViewer::showRow); connect(&_graph, &KsTraceGraph::deselect, this, &KsMainWindow::_deselectActive); connect(&_view, &KsTraceViewer::deselect, this, &KsMainWindow::_deselectActive); connect(&_data, &KsDataStore::updateWidgets, &_view, &KsTraceViewer::update); connect(&_data, &KsDataStore::updateWidgets, &_graph, &KsTraceGraph::update); connect(&_plugins, &KsPluginManager::dataReload, &_data, &KsDataStore::reload); _deselectShortcut.setKey(Qt::CTRL + Qt::Key_D); connect(&_deselectShortcut, &QShortcut::activated, this, &KsMainWindow::_deselectActive); connect(&_mState, &KsDualMarkerSM::deselectA, this, &KsMainWindow::_deselectA); connect(&_mState, &KsDualMarkerSM::deselectB, this, &KsMainWindow::_deselectB); _lastDataFilePath = _settings.value("dataPath").toString(); _lastConfFilePath = _settings.value("confPath").toString(); _lastPluginFilePath = _settings.value("pluginPath").toString(); _resizeEmpty(); } /** Destroy KernelShark Main window. */ KsMainWindow::~KsMainWindow() { kshark_context *kshark_ctx(nullptr); QString file = lastSessionFile(); if (!file.isEmpty()) { QByteArray fileBA = file.toLocal8Bit(); _updateSession(); kshark_save_config_file(fileBA.data(), _session.getConfDocPtr()); } _settings.setValue("dataPath", _lastDataFilePath); _settings.setValue("confPath", _lastConfFilePath); _settings.setValue("pluginPath", _lastPluginFilePath); _data.clear(); /* * Do not show error messages if the "capture" process is still * running (Capture dialog is not closed). */ if (_capture.state() != QProcess::NotRunning) { disconnect(_captureErrorConnection); _capture.close(); _capture.waitForFinished(); } if (kshark_instance(&kshark_ctx)) kshark_free(kshark_ctx); } /** Set the list ot CPU cores to be plotted. */ void KsMainWindow::setCPUPlots(QVector cpus) { int nCPUs = tep_get_cpus(_data.tep()); auto lamCPUCheck = [=] (int cpu) { if (cpu >= nCPUs) { qWarning() << "Warning: No CPU" << cpu << "found in the data."; return true; } return false; }; cpus.erase(std::remove_if(cpus.begin(), cpus.end(), lamCPUCheck), cpus.end()); _graph.cpuReDraw(cpus); } /** Set the list ot tasks (pids) to be plotted. */ void KsMainWindow::setTaskPlots(QVector pids) { QVector allPids = KsUtils::getPidList(); auto lamPidCheck = [=] (int pid) { int i = allPids.indexOf(pid); if (i < 0) { qWarning() << "Warning: No Pid" << pid << "found in the data."; return true; } return false; }; pids.erase(std::remove_if(pids.begin(), pids.end(), lamPidCheck), pids.end()); _graph.taskReDraw(pids); } /** * Reimplemented event handler used to update the geometry of the window on * resize events. */ void KsMainWindow::resizeEvent(QResizeEvent* event) { QMainWindow::resizeEvent(event); _session.saveMainWindowSize(*this); _session.saveSplitterSize(_splitter); } void KsMainWindow::_createActions() { /* File menu */ _openAction.setIcon(QIcon::fromTheme("document-open")); _openAction.setShortcut(tr("Ctrl+O")); _openAction.setStatusTip("Open an existing data file"); connect(&_openAction, &QAction::triggered, this, &KsMainWindow::_open); _restoreSessionAction.setIcon(QIcon::fromTheme("document-open-recent")); connect(&_restoreSessionAction, &QAction::triggered, this, &KsMainWindow::_restoreSession); _importSessionAction.setIcon(QIcon::fromTheme("document-send")); _importSessionAction.setStatusTip("Load a session"); connect(&_importSessionAction, &QAction::triggered, this, &KsMainWindow::_importSession); _exportSessionAction.setIcon(QIcon::fromTheme("document-revert")); _exportSessionAction.setStatusTip("Export this session"); connect(&_exportSessionAction, &QAction::triggered, this, &KsMainWindow::_exportSession); _quitAction.setIcon(QIcon::fromTheme("window-close")); _quitAction.setShortcut(tr("Ctrl+Q")); _quitAction.setStatusTip("Exit KernelShark"); connect(&_quitAction, &QAction::triggered, this, &KsMainWindow::close); /* Filter menu */ _importFilterAction.setIcon(QIcon::fromTheme("document-send")); _importFilterAction.setStatusTip("Load a filter"); connect(&_importFilterAction, &QAction::triggered, this, &KsMainWindow::_importFilter); _exportFilterAction.setIcon(QIcon::fromTheme("document-revert")); _exportFilterAction.setStatusTip("Export a filter"); connect(&_exportFilterAction, &QAction::triggered, this, &KsMainWindow::_exportFilter); connect(&_showEventsAction, &QAction::triggered, this, &KsMainWindow::_showEvents); connect(&_showTasksAction, &QAction::triggered, this, &KsMainWindow::_showTasks); connect(&_showCPUsAction, &QAction::triggered, this, &KsMainWindow::_showCPUs); connect(&_advanceFilterAction, &QAction::triggered, this, &KsMainWindow::_advancedFiltering); connect(&_clearAllFilters, &QAction::triggered, this, &KsMainWindow::_clearFilters); /* Plot menu */ connect(&_cpuSelectAction, &QAction::triggered, this, &KsMainWindow::_cpuSelect); connect(&_taskSelectAction, &QAction::triggered, this, &KsMainWindow::_taskSelect); /* Tools menu */ _managePluginsAction.setShortcut(tr("Ctrl+P")); _managePluginsAction.setIcon(QIcon::fromTheme("preferences-system")); _managePluginsAction.setStatusTip("Manage plugins"); connect(&_managePluginsAction, &QAction::triggered, this, &KsMainWindow::_pluginSelect); _addPluginsAction.setIcon(QIcon::fromTheme("applications-engineering")); _addPluginsAction.setStatusTip("Add plugins"); connect(&_addPluginsAction, &QAction::triggered, this, &KsMainWindow::_pluginAdd); _captureAction.setIcon(QIcon::fromTheme("media-record")); _captureAction.setShortcut(tr("Ctrl+R")); _captureAction.setStatusTip("Capture trace data"); connect(&_captureAction, &QAction::triggered, this, &KsMainWindow::_record); _colorPhaseSlider.setMinimum(20); _colorPhaseSlider.setMaximum(180); _colorPhaseSlider.setValue(KsPlot::Color::getRainbowFrequency() * 100); _colorPhaseSlider.setFixedWidth(FONT_WIDTH * 15); connect(&_colorPhaseSlider, &QSlider::valueChanged, this, &KsMainWindow::_setColorPhase); _colSlider.setLayout(new QHBoxLayout); _colSlider.layout()->addWidget(new QLabel("Color scheme", this)); _colSlider.layout()->addWidget(&_colorPhaseSlider); _colorAction.setDefaultWidget(&_colSlider); _fullScreenModeAction.setIcon(QIcon::fromTheme("view-fullscreen")); _fullScreenModeAction.setShortcut(tr("Ctrl+Shift+F")); _fullScreenModeAction.setStatusTip("Full Screen Mode"); connect(&_fullScreenModeAction, &QAction::triggered, this, &KsMainWindow::_changeScreenMode); /* Help menu */ _aboutAction.setIcon(QIcon::fromTheme("help-about")); connect(&_aboutAction, &QAction::triggered, this, &KsMainWindow::_aboutInfo); _contentsAction.setIcon(QIcon::fromTheme("help-contents")); connect(&_contentsAction, &QAction::triggered, this, &KsMainWindow::_contents); connect(&_bugReportAction, &QAction::triggered, this, &KsMainWindow::_bugReport); } void KsMainWindow::_createMenus() { QMenu *file, *sessions, *filter, *plots, *tools, *help; kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return; /* File menu */ file = menuBar()->addMenu("File"); file->addAction(&_openAction); sessions = file->addMenu("Sessions"); sessions->setIcon(QIcon::fromTheme("document-properties")); sessions->addAction(&_restoreSessionAction); sessions->addAction(&_importSessionAction); sessions->addAction(&_exportSessionAction); file->addAction(&_quitAction); /* Filter menu */ filter = menuBar()->addMenu("Filter"); connect(filter, &QMenu::aboutToShow, this, &KsMainWindow::_updateFilterMenu); filter->addAction(&_importFilterAction); filter->addAction(&_exportFilterAction); /* * Set the default filter mask. Filter will apply to both View and * Graph. */ kshark_ctx->filter_mask = KS_TEXT_VIEW_FILTER_MASK | KS_GRAPH_VIEW_FILTER_MASK; kshark_ctx->filter_mask |= KS_EVENT_VIEW_FILTER_MASK; _graphFilterSyncCBox = KsUtils::addCheckBoxToMenu(filter, "Apply filters to Graph"); _graphFilterSyncCBox->setChecked(true); connect(_graphFilterSyncCBox, &QCheckBox::stateChanged, this, &KsMainWindow::_graphFilterSync); _listFilterSyncCBox = KsUtils::addCheckBoxToMenu(filter, "Apply filters to List"); _listFilterSyncCBox->setChecked(true); connect(_listFilterSyncCBox, &QCheckBox::stateChanged, this, &KsMainWindow::_listFilterSync); filter->addAction(&_showEventsAction); filter->addAction(&_showTasksAction); filter->addAction(&_showCPUsAction); filter->addAction(&_advanceFilterAction); filter->addAction(&_clearAllFilters); /* Plot menu */ plots = menuBar()->addMenu("Plots"); plots->addAction(&_cpuSelectAction); plots->addAction(&_taskSelectAction); /* Tools menu */ tools = menuBar()->addMenu("Tools"); tools->addAction(&_managePluginsAction); tools->addAction(&_addPluginsAction); tools->addAction(&_captureAction); tools->addSeparator(); tools->addAction(&_colorAction); tools->addAction(&_fullScreenModeAction); /* Help menu */ help = menuBar()->addMenu("Help"); help->addAction(&_aboutAction); help->addAction(&_contentsAction); help->addAction(&_bugReportAction); } void KsMainWindow::_open() { QString fileName; fileName = KsUtils::getFile(this, "Open File", "trace-cmd files (*.dat);;All files (*)", _lastDataFilePath); if (!fileName.isEmpty()) loadDataFile(fileName); } QString KsMainWindow::_getCacheDir() { QString dir; auto lamMakePath = [&] (bool ask) { if (ask) { QMessageBox::StandardButton reply; QString err("KernelShark cache directory not found!\n"); QString question = QString("Do you want to create %1").arg(dir); reply = QMessageBox::question(this, "KernelShark", err + question, QMessageBox::Yes | QMessageBox::No); if (reply == QMessageBox::No) { dir.clear(); return; } } QDir().mkpath(dir); }; auto lamRootHome = [] () { struct passwd *pwd = getpwuid(0); return pwd ? QString(pwd->pw_dir) : QString("/root"); }; dir = getenv("KS_USER_CACHE_DIR"); if (!dir.isEmpty()) { if (!QDir(dir).exists()) lamMakePath(true); } else { auto appCachePath = QStandardPaths::GenericCacheLocation; dir = QStandardPaths::writableLocation(appCachePath); dir += "/kernelshark"; if (geteuid() == 0) dir.replace(QDir::homePath(), lamRootHome()); if (!QDir(dir).exists()) lamMakePath(false); } return dir; } /** Get the description file of the last session. */ QString KsMainWindow::lastSessionFile() { QString file; file = _getCacheDir(); if (!file.isEmpty()) file += "/lastsession.json"; return file; } void KsMainWindow::_restoreSession() { loadSession(lastSessionFile()); } void KsMainWindow::_importSession() { QString fileName; fileName = KsUtils::getFile(this, "Import Session", "Kernel Shark Config files (*.json);;", _lastConfFilePath); if (fileName.isEmpty()) return; loadSession(fileName); } void KsMainWindow::_updateSession() { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return; _session.saveGraphs(*_graph.glPtr()); _session.saveVisModel(_graph.glPtr()->model()->histo()); _session.saveFilters(kshark_ctx); _session.saveDualMarker(&_mState); _session.saveTable(_view); _session.saveColorScheme(); _session.savePlugins(_plugins); } void KsMainWindow::_exportSession() { QString fileName; fileName = KsUtils::getSaveFile(this, "Export Filter", "Kernel Shark Config files (*.json);;", ".json", _lastConfFilePath); if (fileName.isEmpty()) return; _updateSession(); _session.exportToFile(fileName); } void KsMainWindow::_filterSyncCBoxUpdate(kshark_context *kshark_ctx) { if (kshark_ctx->filter_mask & KS_TEXT_VIEW_FILTER_MASK) _listFilterSyncCBox->setChecked(true); else _listFilterSyncCBox->setChecked(false); if (kshark_ctx->filter_mask & (KS_GRAPH_VIEW_FILTER_MASK | KS_EVENT_VIEW_FILTER_MASK)) _graphFilterSyncCBox->setChecked(true); else _graphFilterSyncCBox->setChecked(false); } void KsMainWindow::_updateFilterMenu() { kshark_context *kshark_ctx(nullptr); if (kshark_instance(&kshark_ctx)) _filterSyncCBoxUpdate(kshark_ctx); } void KsMainWindow::_importFilter() { kshark_context *kshark_ctx(nullptr); kshark_config_doc *conf; QString fileName; if (!kshark_instance(&kshark_ctx) || _data.size() < 1) return; fileName = KsUtils::getFile(this, "Import Filter", "Kernel Shark Config files (*.json);;", _lastConfFilePath); if (fileName.isEmpty()) return; conf = kshark_open_config_file(fileName.toStdString().c_str(), "kshark.config.filter"); if (!conf) return; kshark_import_all_event_filters(kshark_ctx, conf); kshark_free_config_doc(conf); kshark_filter_entries(kshark_ctx, _data.rows(), _data.size()); _filterSyncCBoxUpdate(kshark_ctx); emit _data.updateWidgets(&_data); } void KsMainWindow::_exportFilter() { kshark_context *kshark_ctx(nullptr); kshark_config_doc *conf(nullptr); QString fileName; if (!kshark_instance(&kshark_ctx)) return; fileName = KsUtils::getSaveFile(this, "Export Filter", "Kernel Shark Config files (*.json);;", ".json", _lastConfFilePath); if (fileName.isEmpty()) return; kshark_export_all_event_filters(kshark_ctx, &conf); kshark_save_config_file(fileName.toStdString().c_str(), conf); kshark_free_config_doc(conf); } void KsMainWindow::_listFilterSync(int state) { KsUtils::listFilterSync(state); _data.update(); } void KsMainWindow::_graphFilterSync(int state) { KsUtils::graphFilterSync(state); _data.update(); } void KsMainWindow::_presetCBWidget(tracecmd_filter_id *showFilter, tracecmd_filter_id *hideFilter, KsCheckBoxWidget *cbw) { if (!kshark_this_filter_is_set(showFilter) && !kshark_this_filter_is_set(hideFilter)) { /* * No filter is set currently. All CheckBoxes of the Widget * will be checked. */ cbw->setDefault(true); } else { QVector ids = cbw->getIds(); QVector status; int n = ids.count(); bool show, hide; if (kshark_this_filter_is_set(showFilter)) { /* * The "show only" filter is set. The default status * of all CheckBoxes will be "unchecked". */ status = QVector(n, false); for (int i = 0; i < n; ++i) { show = !!tracecmd_filter_id_find(showFilter, ids[i]); hide = !!tracecmd_filter_id_find(hideFilter, ids[i]); if (show && !hide) { /* * Both "show" and "hide" define this * Id as visible. Set the status of * its CheckBoxes to "checked". */ status[i] = true; } } } else { /* * Only the "do not show" filter is set. The default * status of all CheckBoxes will be "checked". */ status = QVector(n, true); for (int i = 0; i < n; ++i) { hide = !!tracecmd_filter_id_find(hideFilter, ids[i]); if (hide) status[i] = false; } } cbw->set(status); } } void KsMainWindow::_applyFilter(QVector all, QVector show, std::function)> posFilter, std::function)> negFilter) { if (show.count() < all.count() / 2) { posFilter(show); } else { /* * It is more efficiant to apply negative (do not show) filter. */ QVector diff; /* * The Ids may not be sorted, because in the widgets the items * are shown sorted by name. Get those Ids sorted first. */ std::sort(all.begin(), all.end()); std::sort(show.begin(), show.end()); /* * The IDs of the "do not show" filter are given by the * difference between "all" Ids and the Ids of the "show only" * filter. */ std::set_difference(all.begin(), all.end(), show.begin(), show.end(), std::inserter(diff, diff.begin())); negFilter(diff); } } /* Quiet warnings over documenting simple structures */ //! @cond Doxygen_Suppress #define LAMDA_FILTER(method) [=] (QVector vec) {method(vec);} //! @endcond void KsMainWindow::_showEvents() { kshark_context *kshark_ctx(nullptr); KsCheckBoxWidget *events_cb; KsCheckBoxDialog *dialog; QVector v; if (!kshark_instance(&kshark_ctx)) return; events_cb = new KsEventsCheckBoxWidget(_data.tep(), this); dialog = new KsCheckBoxDialog(events_cb, this); _presetCBWidget(kshark_ctx->show_event_filter, kshark_ctx->hide_event_filter, events_cb); auto lamFilter = [=] (QVector show) { QVector all = KsUtils::getEventIdList(); _applyFilter(all, show, LAMDA_FILTER(_data.applyPosEventFilter), LAMDA_FILTER(_data.applyNegEventFilter)); }; connect(dialog, &KsCheckBoxDialog::apply, lamFilter); dialog->show(); } void KsMainWindow::_showTasks() { kshark_context *kshark_ctx(nullptr); KsCheckBoxWidget *tasks_cbd; KsCheckBoxDialog *dialog; QVector v; if (!kshark_instance(&kshark_ctx)) return; tasks_cbd = new KsTasksCheckBoxWidget(_data.tep(), true, this); dialog = new KsCheckBoxDialog(tasks_cbd, this); _presetCBWidget(kshark_ctx->show_task_filter, kshark_ctx->hide_task_filter, tasks_cbd); auto lamFilter = [=] (QVector show) { QVector all = KsUtils::getEventIdList(); _applyFilter(all, show, LAMDA_FILTER(_data.applyPosTaskFilter), LAMDA_FILTER(_data.applyNegTaskFilter)); }; connect(dialog, &KsCheckBoxDialog::apply, lamFilter); dialog->show(); } void KsMainWindow::_showCPUs() { kshark_context *kshark_ctx(nullptr); KsCheckBoxWidget *cpu_cbd; KsCheckBoxDialog *dialog; QVector v; if (!kshark_instance(&kshark_ctx)) return; cpu_cbd = new KsCPUCheckBoxWidget(_data.tep(), this); dialog = new KsCheckBoxDialog(cpu_cbd, this); _presetCBWidget(kshark_ctx->show_cpu_filter, kshark_ctx->hide_cpu_filter, cpu_cbd); auto lamFilter = [=] (QVector show) { QVector all = KsUtils::getEventIdList(); _applyFilter(all, show, LAMDA_FILTER(_data.applyPosCPUFilter), LAMDA_FILTER(_data.applyNegCPUFilter)); }; connect(dialog, &KsCheckBoxDialog::apply, lamFilter); dialog->show(); } void KsMainWindow::_advancedFiltering() { KsAdvFilteringDialog *dialog; if (!_data.tep()) { QErrorMessage *em = new QErrorMessage(this); QString text("Unable to open Advanced filtering dialog."); text += " Tracing data has to be loaded first."; em->showMessage(text, "advancedFiltering"); qCritical() << "ERROR: " << text; return; } dialog = new KsAdvFilteringDialog(this); connect(dialog, &KsAdvFilteringDialog::dataReload, &_data, &KsDataStore::reload); dialog->show(); } void KsMainWindow::_clearFilters() { _data.clearAllFilters(); } void KsMainWindow::_cpuSelect() { KsCheckBoxWidget *cpus_cbd = new KsCPUCheckBoxWidget(_data.tep(), this); KsCheckBoxDialog *dialog = new KsCheckBoxDialog(cpus_cbd, this); if(_data.tep()) { int nCPUs = tep_get_cpus(_data.tep()); if (nCPUs == _graph.glPtr()->cpuGraphCount()) { cpus_cbd->setDefault(true); } else { QVector v(nCPUs, false); for (auto const &cpu: _graph.glPtr()->_cpuList) v[cpu] = true; cpus_cbd->set(v); } } connect(dialog, &KsCheckBoxDialog::apply, &_graph, &KsTraceGraph::cpuReDraw); dialog->show(); } void KsMainWindow::_taskSelect() { KsCheckBoxWidget *tasks_cbd = new KsTasksCheckBoxWidget(_data.tep(), true, this); KsCheckBoxDialog *dialog = new KsCheckBoxDialog(tasks_cbd, this); QVector pids = KsUtils::getPidList(); int nPids = pids.count(); if (nPids == _graph.glPtr()->taskGraphCount()) { tasks_cbd->setDefault(true); } else { QVector v(nPids, false); for (int i = 0; i < nPids; ++i) { for (auto const &pid: _graph.glPtr()->_taskList) { if (pids[i] == pid) { v[i] = true; break; } } } tasks_cbd->set(v); } connect(dialog, &KsCheckBoxDialog::apply, &_graph, &KsTraceGraph::taskReDraw); dialog->show(); } void KsMainWindow::_pluginSelect() { KsCheckBoxWidget *plugin_cbd; KsCheckBoxDialog *dialog; QVector registeredPlugins; QStringList plugins; plugins << _plugins._ksPluginList << _plugins._userPluginList; registeredPlugins << _plugins._registeredKsPlugins << _plugins._registeredUserPlugins; plugin_cbd = new KsPluginCheckBoxWidget(plugins, this); plugin_cbd->set(registeredPlugins); dialog = new KsCheckBoxDialog(plugin_cbd, this); connect(dialog, &KsCheckBoxDialog::apply, &_plugins, &KsPluginManager::updatePlugins); dialog->show(); } void KsMainWindow::_pluginAdd() { QStringList fileNames; fileNames = KsUtils::getFiles(this, "Add KernelShark plugins", "KernelShark Plugins (*.so);;", _lastPluginFilePath); if (!fileNames.isEmpty()) _plugins.addPlugins(fileNames); } void KsMainWindow::_record() { bool canDoAsRoot(false); #ifdef DO_AS_ROOT canDoAsRoot = true; #endif if (geteuid() && !canDoAsRoot) { QString message; message = "Record is currently not supported."; message += " Install \"pkexec\" and then do:
    "; message += " cd build
    sudo ./cmake_uninstall.sh
    "; message += " ./cmake_clean.sh
    cmake ..
    make
    "; message += " sudo make install"; _error(message, "recordCantStart", false, false); return; } _capture.start(); } void KsMainWindow::_setColorPhase(int f) { KsPlot::Color::setRainbowFrequency(f / 100.); _graph.glPtr()->loadColors(); _graph.glPtr()->model()->update(); } void KsMainWindow::_changeScreenMode() { if (isFullScreen()) { _fullScreenModeAction.setText("Full Screen Mode"); _fullScreenModeAction.setIcon(QIcon::fromTheme("view-fullscreen")); showNormal(); } else { _fullScreenModeAction.setText("Exit Full Screen Mode"); _fullScreenModeAction.setIcon(QIcon::fromTheme("view-restore")); showFullScreen(); } } void KsMainWindow::_aboutInfo() { KsMessageDialog *message; QString text; text.append(" KernelShark\n\n version: "); text.append(KS_VERSION_STRING); text.append("\n"); message = new KsMessageDialog(text); message->setWindowTitle("About"); message->show(); } void KsMainWindow::_contents() { QDesktopServices::openUrl(QUrl("http://kernelshark.org/", QUrl::TolerantMode)); } void KsMainWindow::_bugReport() { QUrl bugs("https://bugzilla.kernel.org/buglist.cgi?component=Trace-cmd%2FKernelshark&product=Tools&resolution=---", QUrl::TolerantMode); QDesktopServices::openUrl(bugs); } /** Load trace data for file. */ void KsMainWindow::loadDataFile(const QString& fileName) { char buff[FILENAME_MAX]; QString pbLabel("Loading "); bool loadDone = false; struct stat st; int ret; ret = stat(fileName.toStdString().c_str(), &st); if (ret != 0) { QString text("Unable to find file "); text.append(fileName); text.append("."); _error(text, "loadDataErr1", true, true); return; } qInfo() << "Loading " << fileName; _mState.reset(); _view.reset(); _graph.reset(); if (fileName.size() < 40) { pbLabel += fileName; } else { pbLabel += "..."; pbLabel += fileName.mid(fileName.size() - 37, 37); } setWindowTitle("Kernel Shark"); KsProgressBar pb(pbLabel); QApplication::processEvents(); auto lamLoadJob = [&](KsDataStore *d) { d->loadDataFile(fileName); loadDone = true; }; std::thread tload(lamLoadJob, &_data); for (int i = 0; i < 160; ++i) { /* * TODO: The way this progress bar gets updated here is a pure * cheat. See if this can be implemented better. */ if (loadDone) break; pb.setValue(i); usleep(150000); } tload.join(); if (_data.size() < 1) { QString text("No data was loaded from file "); text.append(fileName + "."); _error(text, "loadDataErr2", true, true); return; } pb.setValue(165); _view.loadData(&_data); pb.setValue(180); _graph.loadData(&_data); pb.setValue(195); setWindowTitle("Kernel Shark (" + fileName + ")"); if (realpath(fileName.toStdString().c_str(), buff)) { QString path(buff); _session.saveDataFile(path); } } void KsMainWindow::_error(const QString &mesg, const QString &errCode, bool resize, bool unloadPlugins) { QErrorMessage *em = new QErrorMessage(this); QString text = mesg; QString html = mesg; if (resize) _resizeEmpty(); if (unloadPlugins) _plugins.unloadAll(); text.replace("
    ", "\n", Qt::CaseInsensitive); html.replace("\n", "
    ", Qt::CaseInsensitive); qCritical().noquote() << "ERROR: " << text; em->showMessage(html, errCode); em->exec(); } /** * @brief Load user session. * * @param fileName: Json file containing the description of the session. */ void KsMainWindow::loadSession(const QString &fileName) { kshark_context *kshark_ctx(nullptr); struct stat st; int ret; if (!kshark_instance(&kshark_ctx)) return; ret = stat(fileName.toStdString().c_str(), &st); if (ret != 0) { QString text("Unable to find session file "); text.append(fileName); text.append("\n"); _error(text, "loadSessErr0", true, true); return; } if (!_session.importFromFile(fileName)) { QString text("Unable to open session description file "); text.append(fileName); text.append(".\n"); _error(text, "loadSessErr1", true, true); return; } _session.loadPlugins(kshark_ctx, &_plugins); QString dataFile(_session.getDataFile(kshark_ctx)); if (dataFile.isEmpty()) { QString text("Unable to open trace data file for session "); text.append(fileName); text.append("\n"); _error(text, "loadSessErr1", true, true); return; } loadDataFile(dataFile); if (!_data.tep()) { _plugins.unloadAll(); return; } KsProgressBar pb("Loading session settings ..."); pb.setValue(10); _session.loadGraphs(&_graph); pb.setValue(20); _session.loadFilters(kshark_ctx, &_data); _filterSyncCBoxUpdate(kshark_ctx); pb.setValue(130); _session.loadSplitterSize(&_splitter); _session.loadMainWindowSize(this); this->show(); pb.setValue(140); _session.loadDualMarker(&_mState, &_graph); _session.loadVisModel(_graph.glPtr()->model()); _mState.updateMarkers(_data, _graph.glPtr()); pb.setValue(170); _session.loadTable(&_view); _colorPhaseSlider.setValue(_session.getColorScheme() * 100); _graph.updateGeom(); } void KsMainWindow::_initCapture() { bool canDoAsRoot(false); #ifdef DO_AS_ROOT canDoAsRoot = true; #endif if (geteuid() && !canDoAsRoot) return; if (geteuid()) { _capture.setProgram("kshark-su-record"); } else { QStringList argv; _capture.setProgram("kshark-record"); argv << QString("-o") << QDir::homePath() + "/trace.dat"; _capture.setArguments(argv); } connect(&_capture, &QProcess::started, this, &KsMainWindow::_captureStarted); /* * Using the old Signal-Slot syntax because QProcess::finished has * overloads. */ connect(&_capture, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(_captureFinished(int, QProcess::ExitStatus))); _captureErrorConnection = connect(&_capture, &QProcess::errorOccurred, this, &KsMainWindow::_captureError); connect(&_captureLocalServer, &QLocalServer::newConnection, this, &KsMainWindow::_readSocket); } void KsMainWindow::_captureStarted() { _captureLocalServer.listen("KSCapture"); } /** * If the authorization could not be obtained because the user dismissed * the authentication dialog (clicked Cancel), pkexec exits with a return * value of 126. */ #define PKEXEC_DISMISS_RET 126 void KsMainWindow::_captureFinished(int ret, QProcess::ExitStatus st) { QProcess *capture = (QProcess *)sender(); _captureLocalServer.close(); if (ret == PKEXEC_DISMISS_RET) { /* * Authorization could not be obtained because the user * dismissed the authentication dialog. */ return; } if (ret != 0 && st == QProcess::NormalExit) _captureErrorMessage(capture); } void KsMainWindow::_captureError(QProcess::ProcessError error) { QProcess *capture = (QProcess *)sender(); _captureErrorMessage(capture); } void KsMainWindow::_captureErrorMessage(QProcess *capture) { QString message = "Capture process failed: "; message += capture->errorString(); message += "
    Standard Error: "; message += capture->readAllStandardError(); _error(message, "captureFinishedErr", false, false); } void KsMainWindow::_readSocket() { QLocalSocket *socket; quint32 blockSize; QString fileName; auto lamSocketError = [&](QString message) { message = "ERROR from Local Server: " + message; _error(message, "readSocketErr", false, false); }; socket = _captureLocalServer.nextPendingConnection(); if (!socket) { lamSocketError("Pending connectio not found!"); return; } QDataStream in(socket); socket->waitForReadyRead(); if (socket->bytesAvailable() < (int)sizeof(quint32)) { lamSocketError("Message size is corrupted!"); return; }; in >> blockSize; if (socket->bytesAvailable() < blockSize || in.atEnd()) { lamSocketError("Message is corrupted!"); return; } in >> fileName; loadDataFile(fileName); } void KsMainWindow::_splitterMoved(int pos, int index) { _session.saveSplitterSize(_splitter); } void KsMainWindow::_deselectActive() { _view.clearSelection(); _mState.activeMarker().remove(); _mState.updateLabels(); _graph.glPtr()->model()->update(); } void KsMainWindow::_deselectA() { if (_mState.getState() == DualMarkerState::A) _view.clearSelection(); else _view.passiveMarkerSelectRow(KS_NO_ROW_SELECTED); _mState.markerA().remove(); _mState.updateLabels(); _graph.glPtr()->model()->update(); } void KsMainWindow::_deselectB() { if (_mState.getState() == DualMarkerState::B) _view.clearSelection(); else _view.passiveMarkerSelectRow(KS_NO_ROW_SELECTED); _mState.markerB().remove(); _mState.updateLabels(); _graph.glPtr()->model()->update(); } void KsMainWindow::_rootWarning() { QString cbFlag("noRootWarn"); if (_settings.value(cbFlag).toBool()) return; QMessageBox warn; warn.setText("KernelShark is running with Root privileges."); warn.setInformativeText("Continue at your own risk."); warn.setIcon(QMessageBox::Warning); warn.setStandardButtons(QMessageBox::Close); QCheckBox cb("Don't show this message again."); auto lamCbChec = [&] (int state) { if (state) _settings.setValue(cbFlag, true); }; connect(&cb, &QCheckBox::stateChanged, lamCbChec); warn.setCheckBox(&cb); warn.exec(); } trace-cmd-v2.9.6/kernel-shark/src/KsMainWindow.hpp000066400000000000000000000111611414302661500220170ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsMainWindow.hpp * @brief KernelShark GUI main window. */ #ifndef _KS_MAINWINDOW_H #define _KS_MAINWINDOW_H // Qt #include #include // KernelShark #include "KsTraceViewer.hpp" #include "KsTraceGraph.hpp" #include "KsWidgetsLib.hpp" #include "KsSession.hpp" #include "KsUtils.hpp" /** * The KsMainWindow class provides Main window for the KernelShark GUI. */ class KsMainWindow : public QMainWindow { Q_OBJECT public: explicit KsMainWindow(QWidget *parent = nullptr); ~KsMainWindow(); void loadDataFile(const QString &fileName); void loadSession(const QString &fileName); QString lastSessionFile(); /** * @brief * * @param plugin: can be the name of the plugin or the plugin's library * file (including absolute or relative path). */ void registerPlugin(const QString &plugin) { _plugins.registerPlugin(plugin); } /** * @brief * * @param plugin: can be the name of the plugin or the plugin's library * file (including absolute path). */ void unregisterPlugin(const QString &plugin) { _plugins.unregisterPlugin(plugin); } void setCPUPlots(QVector cpus); void setTaskPlots(QVector pids); void resizeEvent(QResizeEvent* event); /** Set the Full Screen mode. */ void setFullScreenMode(bool f) { if ((!isFullScreen() && f) || (isFullScreen() && !f) ) _changeScreenMode(); } private: QSplitter _splitter; /** GUI session. */ KsSession _session; /** Data Manager. */ KsDataStore _data; /** Widget for reading and searching in the trace data. */ KsTraceViewer _view; /** Widget for graphical visualization of the trace data. */ KsTraceGraph _graph; /** Dual Marker State Machine. */ KsDualMarkerSM _mState; /** Plugin manager. */ KsPluginManager _plugins; /** The process used to record trace data. */ QProcess _capture; /** Local Server used for comunucation with the Capture process. */ QLocalServer _captureLocalServer; // File menu. QAction _openAction; QAction _restoreSessionAction; QAction _importSessionAction; QAction _exportSessionAction; QAction _quitAction; // Filter menu. QAction _importFilterAction; QAction _exportFilterAction; QCheckBox *_graphFilterSyncCBox; QCheckBox *_listFilterSyncCBox; QAction _showEventsAction; QAction _showTasksAction; QAction _showCPUsAction; QAction _advanceFilterAction; QAction _clearAllFilters; // Plots menu. QAction _cpuSelectAction; QAction _taskSelectAction; // Tools menu. QAction _managePluginsAction; QAction _addPluginsAction; QAction _captureAction; QWidgetAction _colorAction; QWidget _colSlider; QSlider _colorPhaseSlider; QAction _fullScreenModeAction; // Help menu. QAction _aboutAction; QAction _contentsAction; QAction _bugReportAction; QShortcut _deselectShortcut; QString _lastDataFilePath, _lastConfFilePath, _lastPluginFilePath; QSettings _settings; QMetaObject::Connection _captureErrorConnection; void _open(); void _restoreSession(); void _importSession(); void _exportSession(); void _importFilter(); void _exportFilter(); void _listFilterSync(int state); void _graphFilterSync(int state); void _presetCBWidget(tracecmd_filter_id *showFilter, tracecmd_filter_id *hideFilter, KsCheckBoxWidget *cbw); void _applyFilter(QVector all, QVector show, std::function)> posFilter, std::function)> negFilter); void _showEvents(); void _showTasks(); void _showCPUs(); void _advancedFiltering(); void _clearFilters(); void _cpuSelect(); void _taskSelect(); void _pluginSelect(); void _pluginAdd(); void _record(); void _setColorPhase(int); void _changeScreenMode(); void _aboutInfo(); void _contents(); void _bugReport(); void _captureStarted(); void _captureError(QProcess::ProcessError error); void _captureErrorMessage(QProcess *capture); void _readSocket(); void _splitterMoved(int pos, int index); void _createActions(); void _createMenus(); void _initCapture(); void _updateSession(); inline void _resizeEmpty() {resize(SCREEN_WIDTH * .5, FONT_HEIGHT * 3);} void _error(const QString &text, const QString &errCode, bool resize, bool unloadPlugins); void _deselectActive(); void _deselectA(); void _deselectB(); void _rootWarning(); void _updateFilterMenu(); void _filterSyncCBoxUpdate(kshark_context *kshark_ctx); QString _getCacheDir(); private slots: void _captureFinished(int, QProcess::ExitStatus); }; #endif // _KS_MAINWINDOW_H trace-cmd-v2.9.6/kernel-shark/src/KsModels.cpp000066400000000000000000000316001414302661500211610ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsModels.cpp * @brief Models for data representation. */ // KernelShark #include "KsModels.hpp" #include "KsWidgetsLib.hpp" #include "KsUtils.hpp" /** Create a default (empty) KsFilterProxyModel object. */ KsFilterProxyModel::KsFilterProxyModel(QObject *parent) : QSortFilterProxyModel(parent), _searchStop(false), _source(nullptr) {} /** * Returns False if the item in the row indicated by the sourceRow and * sourceParentshould be filtered out. Otherwise returns True. */ bool KsFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { if (_data[sourceRow]->visible & KS_TEXT_VIEW_FILTER_MASK) return true; return false; } /** Provide the Proxy model with data. */ void KsFilterProxyModel::fill(KsDataStore *data) { _data = data->rows(); } /** Set the source model for this Proxy model. */ void KsFilterProxyModel::setSource(KsViewModel *s) { QSortFilterProxyModel::setSourceModel(s); _source = s; } size_t KsFilterProxyModel::_search(int column, const QString &searchText, search_condition_func cond, QList *matchList, int step, int first, int last, QProgressBar *pb, QLabel *l, int *lastRowSearched, bool notify) { int index, row, nRows(last - first + 1); int milestone(1), pbCount(1); QString item; if (nRows > KS_PROGRESS_BAR_MAX) milestone = pbCount = nRows / (KS_PROGRESS_BAR_MAX - step - _searchProgress); else _searchProgress = KS_PROGRESS_BAR_MAX - nRows; /* Loop over the items of the proxy model. */ for (index = first; index <= last; index += step) { /* * Use the index of the proxy model to retrieve the value * of the row number in the base model. */ row = mapRowFromSource(index); item = _source->getValueStr(column, row); if (cond(searchText, item)) matchList->append(row); if (_searchStop) { if (lastRowSearched) *lastRowSearched = index; if (notify) _pbCond.notify_one(); break; } /* Deal with the Progress bar of the seatch. */ if ((index - first) >= milestone) { milestone += pbCount; if (notify) { /* * This is a multi-threaded search. Notify * the main thread to update the progress bar. */ std::lock_guard lk(_mutex); ++_searchProgress; _pbCond.notify_one(); } else { if (pb) { pb->setValue(pb->value() + 1); ++_searchProgress; } if (l) l->setText(QString(" %1").arg(matchList->count())); QApplication::processEvents(); } } } return index; } /** @brief Search the content of the table for a data satisfying an abstract * condition. * * @param column: The number of the column to search in. * @param searchText: The text to search for. * @param cond: Matching condition function. * @param matchList: Output location for a list containing the row indexes of * the cells satisfying matching condition. * @param pb: Input location for a Progressbar used to visualize the progress * of the search. * @param l: Input location for a label used to show the number of cells found. * * @returns The number of cells satisfying the matching condition. */ size_t KsFilterProxyModel::search(int column, const QString &searchText, search_condition_func cond, QList *matchList, QProgressBar *pb, QLabel *l) { int nRows = rowCount({}); _search(column, searchText, cond, matchList, 1, // step 0, // first nRows - 1, // last pb, l, nullptr, false); return matchList->count(); } /** @brief Search the content of the table for a data satisfying an abstract * condition. * * @param sm: Input location for the Search State machine object. * @param matchList: Output location for a list containing the row indexes of * * @returns The number of cells satisfying the matching condition. */ size_t KsFilterProxyModel::search(KsSearchFSM *sm, QList *matchList) { int nRows = rowCount({}); _search(sm->column(), sm->searchText(), sm->condition(), matchList, 1, // step sm->_lastRowSearched + 1, // first nRows - 1, // last &sm->_searchProgBar, &sm->_searchCountLabel, &sm->_lastRowSearched, false); return matchList->count(); } /** @brief Search the content of the table for a data satisfying an abstract * condition. * * @param column: The number of the column to search in. * @param searchText: The text to search for. * @param cond: Matching condition function. * @param step: The step used by the thread of the search when looping over * the data. * @param first: Row index specifying the position inside the table from * where the search starts. * @param last: Row index specifying the position inside the table from * where the search ends. * @param lastRowSearched: Output location for parameter showing the index of * the last searched item (data row). * @param notify: Input location for flag specifying if the search has to * notify the main thread when to update the progress bar. * * @returns A list containing the row indexes of the cells satisfying matching * condition. */ QList KsFilterProxyModel::searchThread(int column, const QString &searchText, search_condition_func cond, int step, int first, int last, int *lastRowSearched, bool notify) { QList matchList; _search(column, searchText, cond, &matchList, step, first, last, nullptr, nullptr, lastRowSearched, notify); return matchList; } /** Create default (empty) KsViewModel object. */ KsViewModel::KsViewModel(QObject *parent) : QAbstractTableModel(parent), _data(nullptr), _nRows(0), _header({"#", "CPU", "Time Stamp", "Task", "PID", "Latency", "Event", "Info"}), _markA(KS_NO_ROW_SELECTED), _markB(KS_NO_ROW_SELECTED) {} /** * Get the data stored under the given role for the item referred to by * the index. This is an implementation of the pure virtual method of the * abstract model class. */ QVariant KsViewModel::data(const QModelIndex &index, int role) const { if (role == Qt::ForegroundRole) { if (index.row() == _markA) return QVariant::fromValue(QColor(Qt::white)); if (index.row() == _markB) return QVariant::fromValue(QColor(Qt::white)); } if (role == Qt::BackgroundRole) { if (index.row() == _markA) return QVariant::fromValue(QColor(_colorMarkA)); if (index.row() == _markB) return QVariant::fromValue(QColor(_colorMarkB)); } if (role == Qt::DisplayRole) return this->getValue(index.column(), index.row()); return {}; } /** Get the string data stored in a given cell of the table. */ QString KsViewModel::getValueStr(int column, int row) const { int pid; switch (column) { case TRACE_VIEW_COL_INDEX : return QString("%1").arg(row); case TRACE_VIEW_COL_CPU: return QString("%1").arg(_data[row]->cpu); case TRACE_VIEW_COL_TS: return KsUtils::Ts2String(_data[row]->ts, 6); case TRACE_VIEW_COL_COMM: return kshark_get_task_easy(_data[row]); case TRACE_VIEW_COL_PID: pid = kshark_get_pid_easy(_data[row]); return QString("%1").arg(pid); case TRACE_VIEW_COL_LAT: return kshark_get_latency_easy(_data[row]); case TRACE_VIEW_COL_EVENT: return kshark_get_event_name_easy(_data[row]); case TRACE_VIEW_COL_INFO : return kshark_get_info_easy(_data[row]); default: return {}; } } /** Get the data stored in a given cell of the table. */ QVariant KsViewModel::getValue(int column, int row) const { return getValueStr(column, row); } /** * Get the header of a column. This is an implementation of the pure virtual * method of the abstract model class. */ QVariant KsViewModel::headerData(int column, Qt::Orientation orientation, int role) const { if (orientation != Qt::Horizontal || role != Qt::DisplayRole) return {}; if (column < _header.count()) return _header.at(column); return {}; } /** Provide the model with data. */ void KsViewModel::fill(KsDataStore *data) { beginInsertRows(QModelIndex(), 0, data->size() - 1); _data = data->rows(); _nRows = data->size(); endInsertRows(); } /** @brief Select a row in the table. * * @param state: Identifier of the marker used to select the row. * @param row: Row index. */ void KsViewModel::selectRow(DualMarkerState state, int row) { if (state == DualMarkerState::A) { _markA = row; _markB = KS_NO_ROW_SELECTED; } else { _markB = row; _markA = KS_NO_ROW_SELECTED; } } /** Reset the model. */ void KsViewModel::reset() { beginResetModel(); _data = nullptr; _nRows = 0; endResetModel(); } /** Update the model. Use this function if the data has changed. */ void KsViewModel::update(KsDataStore *data) { /* * Do not try to skip the reset(). The row count has to be set to * zero before you full. */ reset(); fill(data); } /** @brief Search the content of the table for a data satisfying an abstract * condition. * * @param column: The number of the column to search in. * @param searchText: The text to search for. * @param cond: Matching condition function. * @param matchList: Output location for a list containing the row indexes of * the cells satisfying the matching condition. * * @returns The number of cells satisfying the matching condition. */ size_t KsViewModel::search(int column, const QString &searchText, search_condition_func cond, QList *matchList) { int nRows = rowCount({}); QVariant item; for (int r = 0; r < nRows; ++r) { item = getValue(r, column); if (cond(searchText, item.toString())) { matchList->append(r); } } return matchList->count(); } /** Create a default (empty) KsFilterProxyModel object. */ KsGraphModel::KsGraphModel(QObject *parent) : QAbstractTableModel(parent) { ksmodel_init(&_histo); } /** Destroy KsFilterProxyModel object. */ KsGraphModel::~KsGraphModel() { ksmodel_clear(&_histo); } /** * @brief Provide the Visualization model with data. Calculate the current * state of the model. * * @param entries: Input location for the trace data. * @param n: Number of bins. */ void KsGraphModel::fill(kshark_entry **entries, size_t n) { if (n == 0) return; beginResetModel(); if (_histo.n_bins == 0) ksmodel_set_bining(&_histo, KS_DEFAULT_NBUNS, entries[0]->ts, entries[n-1]->ts); ksmodel_fill(&_histo, entries, n); endResetModel(); } /** * @brief Shift the time-window of the model forward. Recalculate the current * state of the model. * * @param n: Number of bins to shift. */ void KsGraphModel::shiftForward(size_t n) { beginResetModel(); ksmodel_shift_forward(&_histo, n); endResetModel(); } /** * @brief Shift the time-window of the model backward. Recalculate the current * state of the model. * * @param n: Number of bins to shift. */ void KsGraphModel::shiftBackward(size_t n) { beginResetModel(); ksmodel_shift_backward(&_histo, n); endResetModel(); } /** * @brief Move the time-window of the model to a given location. Recalculate * the current state of the model. * * @param ts: position in time to be visualized. */ void KsGraphModel::jumpTo(size_t ts) { beginResetModel(); ksmodel_jump_to(&_histo, ts); endResetModel(); } /** * @brief Extend the time-window of the model. Recalculate the current state * of the model. * * @param r: Scale factor of the zoom-out. * @param mark: Focus point of the zoom-out. */ void KsGraphModel::zoomOut(double r, int mark) { beginResetModel(); ksmodel_zoom_out(&_histo, r, mark); endResetModel(); } /** * @brief Shrink the time-window of the model. Recalculate the current state * of the model. * * @param r: Scale factor of the zoom-in. * @param mark: Focus point of the zoom-in. */ void KsGraphModel::zoomIn(double r, int mark) { beginResetModel(); ksmodel_zoom_in(&_histo, r, mark); endResetModel(); } /** Quick zoom out. The entire data-set will be visualized. */ void KsGraphModel::quickZoomOut() { beginResetModel(); ksmodel_set_bining(&_histo, _histo.n_bins, _histo.data[0]->ts, _histo.data[_histo.data_size - 1]->ts); ksmodel_fill(&_histo, _histo.data, _histo.data_size); endResetModel(); } /** * @brief Quick zoom in to a state of the Visualization model which has the * given bin size. The actual value of the bin size may en up being slightly * different because of the fine tuning performed by the model. * * @param binSize: an approximate value for the new size of the bins. */ void KsGraphModel::quickZoomIn(uint64_t binSize) { double range, r; range = _histo.max - _histo.min; r = 1 - (binSize * _histo.n_bins) / range; zoomIn(r); } /** Reset the model. */ void KsGraphModel::reset() { beginResetModel(); ksmodel_clear(&_histo); endResetModel(); } /** Update the model. Use this function if the data has changed. */ void KsGraphModel::update(KsDataStore *data) { beginResetModel(); if (data) ksmodel_fill(&_histo, data->rows(), data->size()); endResetModel(); } trace-cmd-v2.9.6/kernel-shark/src/KsModels.hpp000066400000000000000000000152161414302661500211730ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsModels.hpp * @brief Models for data representation. */ #ifndef _KS_MODELS_H #define _KS_MODELS_H // C++11 #include #include // Qt #include #include #include #include #include // KernelShark #include "libkshark.h" #include "libkshark-model.h" #include "KsSearchFSM.hpp" /** A negative row index, to be used for deselecting the Passive Marker. */ #define KS_NO_ROW_SELECTED -1 enum class DualMarkerState; class KsDataStore; /** * Class KsViewModel provides models for trace data representation in a * table view. */ class KsViewModel : public QAbstractTableModel { public: explicit KsViewModel(QObject *parent = nullptr); /** Set the colors of the two markers. */ void setColors(const QColor &colA, const QColor &colB) { _colorMarkA = colA; _colorMarkB = colB; }; /** * Get the number of rows. This is an implementation of the pure * virtual method of the abstract model class. */ int rowCount(const QModelIndex &) const override {return _nRows;} /** * Get the number of columns. This is an implementation of the pure * virtual method of the abstract model class. */ int columnCount(const QModelIndex &) const override { return _header.count(); } QVariant headerData(int section, Qt::Orientation orientation, int role) const override; QVariant data(const QModelIndex &index, int role) const override; void fill(KsDataStore *data); void selectRow(DualMarkerState state, int row); void reset(); void update(KsDataStore *data); /** Get the list of column's headers. */ QStringList header() const {return _header;} QString getValueStr(int column, int row) const; QVariant getValue(int column, int row) const; size_t search(int column, const QString &searchText, search_condition_func cond, QList *matchList); /** Table columns Identifiers. */ enum { /** Identifier of the Index column. */ TRACE_VIEW_COL_INDEX, /** Identifier of the CPU column. */ TRACE_VIEW_COL_CPU, /** Identifier of the Timestamp column. */ TRACE_VIEW_COL_TS, /** Identifier of the Task name (command) column. */ TRACE_VIEW_COL_COMM, /** Identifier of the Process Id column. */ TRACE_VIEW_COL_PID, /** Identifier of the Latency Id column. */ TRACE_VIEW_COL_LAT, /** Identifier of the Event name Id column. */ TRACE_VIEW_COL_EVENT, /** Identifier of the Event name Id column. */ TRACE_VIEW_COL_INFO, /** Number of column. */ TRACE_VIEW_N_COLUMNS, }; private: /** Trace data array. */ kshark_entry **_data; /** The size of the data array. */ size_t _nRows; /** The headers of the individual columns. */ QStringList _header; /** The index of marker A inside the data array. */ int _markA; /** The index of marker A inside the data array. */ int _markB; /** The color of the row selected by marker A. */ QColor _colorMarkA; /** The color of the row selected by marker B. */ QColor _colorMarkB; }; /** * Class KsFilterProxyModel provides support for filtering trace data in * table view. */ class KsFilterProxyModel : public QSortFilterProxyModel { Q_OBJECT public: explicit KsFilterProxyModel(QObject *parent = nullptr); bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; void fill(KsDataStore *data); void setSource(KsViewModel *s); size_t search(int column, const QString &searchText, search_condition_func cond, QList *matchList, QProgressBar *pb = nullptr, QLabel *l = nullptr); size_t search(KsSearchFSM *sm, QList *matchList); QList searchThread(int column, const QString &searchText, search_condition_func cond, int step, int first, int last, int *lastRowSearched, bool notify); /** Get the progress of the search. */ int searchProgress() const {return _searchProgress;} /** Reset the progress value of the search. */ void searchReset() { _searchProgress = 0; _searchStop = false; } /** * Use the "row" index in the Proxy model to retrieve the "row" index * in the source model. */ int mapRowFromSource(int r) const { /*This works because the row number is shown in column "0". */ return this->data(this->index(r, 0)).toInt(); } /** Get the source model. */ KsViewModel *source() {return _source;} /** * A condition variable used to notify the main thread to update the * search progressbar. */ std::condition_variable _pbCond; /** A mutex used by the condition variable. */ std::mutex _mutex; /** A flag used to stop the serch for all threads. */ bool _searchStop; private: int _searchProgress; /** Trace data array. */ kshark_entry **_data; KsViewModel *_source; size_t _search(int column, const QString &searchText, search_condition_func cond, QList *matchList, int step, int first, int last, QProgressBar *pb, QLabel *l, int *lastRowSearched, bool notify); }; /** * Class KsGraphModel provides a model for visualization of trace data. This * class is a wrapper of kshark_trace_histo and is needed only because we want * to use the signals defined in QAbstractTableModel. */ class KsGraphModel : public QAbstractTableModel { public: explicit KsGraphModel(QObject *parent = nullptr); virtual ~KsGraphModel(); /** * This dummy function is an implementation of the pure * virtual method of the abstract model class. */ int rowCount(const QModelIndex &) const override { return _histo.n_bins; } /** * This dummy function is an implementation of the pure * virtual method of the abstract model class. */ int columnCount(const QModelIndex &) const override {return 0;} /** * This dummy function is an implementation of the pure * virtual method of the abstract model class. */ QVariant data(const QModelIndex &index, int role) const override { return {}; } /** Get the kshark_trace_histo object. */ kshark_trace_histo *histo() {return &_histo;} void fill(kshark_entry **entries, size_t n); void shiftForward(size_t n); void shiftBackward(size_t n); void jumpTo(size_t ts); void zoomOut(double r, int mark = -1); void zoomIn(double r, int mark = -1); void quickZoomOut(); void quickZoomIn(uint64_t binSize); void reset(); void update(KsDataStore *data = nullptr); private: kshark_trace_histo _histo; }; /** Defines a default number of bins to be used by the visualization model. */ #define KS_DEFAULT_NBUNS 1024 #endif // _KS_MODELS_H trace-cmd-v2.9.6/kernel-shark/src/KsPlotTools.cpp000066400000000000000000000626701414302661500217100ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsPlotTools.cpp * @brief KernelShark Plot tools. */ // C #include // C++ #include #include // OpenGL #include #include // KernelShark #include "KsPlotTools.hpp" namespace KsPlot { float Color::_frequency = .75; /** * @brief Create a default color (black). */ Color::Color() { _col_c.red = _col_c.green = _col_c.blue = 0; } /** * @brief Constructs a RGB color object. * * @param r: The red component of the color. * @param g: The green component of the color. * @param b: The blue component of the color */ Color::Color(uint8_t r, uint8_t g, uint8_t b) { set(r, g, b); } /** * @brief Constructs a RGB color object. * * @param rgb: RGB value. */ Color::Color(int rgb) { set(rgb); } /** * @brief Sets the color. * * @param r: The red component of the color. * @param g: The green component of the color. * @param b: The blue component of the color */ void Color::set(uint8_t r, uint8_t g, uint8_t b) { _col_c.red = r; _col_c.green = g; _col_c.blue = b; } /** * @brief Sets the color. * * @param rgb: RGB value. */ void Color::set(int rgb) { int r = rgb & 0xFF; int g = (rgb >> 8) & 0xFF; int b = (rgb >> 16) & 0xFF; set(r, g, b); } /** * @brief The color is selected from the Rainbow palette. * * @param n: index of the color inside the Rainbow palette. */ void Color::setRainbowColor(int n) { int r = sin(_frequency * n + 0) * 127 + 128; int g = sin(_frequency * n + 2) * 127 + 128; int b = sin(_frequency * n + 4) * 127 + 128; set(r, g, b); } /** * @brief Create a Hash table of Rainbow colors. The sorted Pid values are * mapped to the palette of Rainbow colors. * * @returns ColorTable instance. */ ColorTable getTaskColorTable() { struct kshark_context *kshark_ctx(nullptr); ColorTable colors; int nTasks, pid, *pids, i(0); if (!kshark_instance(&kshark_ctx)) return colors; nTasks = kshark_get_task_pids(kshark_ctx, &pids); if (!nTasks) return colors; std::vector temp_pids(pids, pids + nTasks); std::sort(temp_pids.begin(), temp_pids.end()); free(pids); if (temp_pids[i] == 0) { /* The "Idle" process (pid = 0) will be plotted in black. */ colors[i++] = {}; } for (; i < nTasks; ++i) { pid = temp_pids[i]; colors[pid].setRainbowColor(i - 1); } return colors; } /** * @brief Create a Hash table of Rainbow colors. The CPU Ids are * mapped to the palette of Rainbow colors. * * @returns ColorTable instance. */ ColorTable getCPUColorTable() { struct kshark_context *kshark_ctx(nullptr); ColorTable colors; int nCPUs; if (!kshark_instance(&kshark_ctx)) return colors; nCPUs = tep_get_cpus(kshark_ctx->pevent); for (int i = 0; i < nCPUs; ++i) colors[i].setRainbowColor(i); return colors; } /** * @brief Search the Hash table of Rainbow colors for a particular key (pid). * * @param colors: Input location for the ColorTable instance. * @param pid: the Process Id to search for. * * @returns The Rainbow color of the key "pid". If "pid" does not exist, the * returned color is Black. */ Color getColor(ColorTable *colors, int pid) { auto item = colors->find(pid); if (item != colors->end()) return item->second; return {}; } /** * @brief Create a default Shape. */ Shape::Shape() : _nPoints(0), _points(nullptr) {} /** * @brief Create a Shape defined by "n" points. All points are initialized * at (0, 0). */ Shape::Shape(int n) : _nPoints(n), _points(new(std::nothrow) ksplot_point[n]()) { if (!_points) { _size = 0; fprintf(stderr, "Failed to allocate memory for ksplot_points.\n"); } } /** Copy constructor. */ Shape::Shape(const Shape &s) : _nPoints(0), _points(nullptr) { *this = s; } /** Move constructor. */ Shape::Shape(Shape &&s) : _nPoints(s._nPoints), _points(s._points) { s._nPoints = 0; s._points = nullptr; } /** * @brief Destroy the Shape object. */ Shape::~Shape() { delete[] _points; } /** Assignment operator. */ void Shape::operator=(const Shape &s) { PlotObject::operator=(s); if (s._nPoints != _nPoints) { delete[] _points; _points = new(std::nothrow) ksplot_point[s._nPoints]; } if (_points) { _nPoints = s._nPoints; memcpy(_points, s._points, sizeof(_points) * _nPoints); } else { _nPoints = 0; fprintf(stderr, "Failed to allocate memory for ksplot_points.\n"); } } /** * @brief Set the point of the polygon indexed by "i". * * @param i: the index of the point to be set. * @param x: X coordinate of the point in pixels. * @param y: Y coordinate of the point in pixels. */ void Shape::setPoint(size_t i, int x, int y) { if (i < _nPoints) { _points[i].x = x; _points[i].y = y; } } /** * @brief Set the point of the polygon indexed by "i". * * @param i: the index of the point to be set. * @param p: A ksplot_point object used to provide coordinate values. */ void Shape::setPoint(size_t i, const ksplot_point &p) { setPoint(i, p.x, p.y); } /** * @brief Set the point of the polygon indexed by "i". * * @param i: the index of the point to be set. * @param p: A Point object used to provide coordinate values. */ void Shape::setPoint(size_t i, const Point &p) { setPoint(i, p.x(), p.y()); } /** * @brief Get the point "i". If the point does not exist, the function returns * nullptr. */ const ksplot_point *Shape::getPoint(size_t i) const { if (i < _nPoints) return &_points[i]; return nullptr; } /** * @brief Set the horizontal coordinate of the point "i". * * @param i: the index of the point to be set. * @param x: X coordinate of the point in pixels. */ void Shape::setPointX(size_t i, int x) { if (i < _nPoints) _points[i].x = x; } /** * @brief Set the vertical coordinate of the point "i". * * @param i: the index of the point to be set. * @param y: Y coordinate of the point in pixels. */ void Shape::setPointY(size_t i, int y) { if (i < _nPoints) _points[i].y = y; } /** * @brief Get the horizontal coordinate of the point "i". If the point does * not exist, the function returns 0. */ int Shape::getPointX(size_t i) const { if (i < _nPoints) return _points[i].x; return 0; } /** * @brief Get the vertical coordinate of the point "i". If the point does * not exist, the function returns 0. */ int Shape::getPointY(size_t i) const { if (i < _nPoints) return _points[i].y; return 0; } /** @brief Create a default Point. The point is initialized at (0, 0). */ Point::Point() : Shape(1) {} /** * @brief Create a point. * * @param x: X coordinate of the point in pixels. * @param y: Y coordinate of the point in pixels. */ Point::Point(int x, int y) : Shape(1) { setPoint(0, x, y); } void Point::_draw(const Color &col, float size) const { if (_nPoints == 1) ksplot_draw_point(_points, col.color_c_ptr(), size); } /** * @brief Draw a line between point "a" and point "b". * * @param a: The first finishing point of the line. * @param b: The second finishing point of the line. * @param col: The color of the line. * @param size: The size of the line. */ void drawLine(const Point &a, const Point &b, const Color &col, float size) { ksplot_draw_line(a.point_c_ptr(), b.point_c_ptr(), col.color_c_ptr(), size); } /** * @brief Draw a dashed line between point "a" and point "b". * * @param a: The first finishing point of the line. * @param b: The second finishing point of the line. * @param col: The color of the line. * @param size: The size of the line. * @param period: The period of the dashed line. */ void drawDashedLine(const Point &a, const Point &b, const Color &col, float size, float period) { int dx = b.x() - a.x(), dy = b.y() - a.y(); float mod = sqrt(dx * dx + dy * dy); int n = mod / period; Point p1, p2; for (int i = 0; i < n; ++i) { p1.setX(a.x() + (i + .25) * dx / n); p1.setY(a.y() + (i + .25) * dy / n); p2.setX(a.x() + (i + .75) * dx / n); p2.setY(a.y() + (i + .75) * dy / n); drawLine(p1, p2, col, size); } } /** @brief Create a default line. The two points are initialized at (0, 0). */ Line::Line() : Shape(2) {} /** * @brief Create a line between the point "a" and point "b". * * @param a: first finishing point of the line. * @param b: second finishing point of the line. */ Line::Line(const Point &a, const Point &b) : Shape(2) { setPoint(0, a.x(), a.y()); setPoint(1, b.x(), b.y()); } void Line::_draw(const Color &col, float size) const { if (_nPoints == 2) ksplot_draw_line(&_points[0], &_points[1], col.color_c_ptr(), size); } /** * @brief Create a default polygon. All points are initialized at (0, 0). * * @param n: The number of edges of the polygon. */ Polygon::Polygon(size_t n) : Shape(n), _fill(true) {} void Polygon::_draw(const Color &col, float size) const { if (_fill) ksplot_draw_polygon(_points, _nPoints, col.color_c_ptr(), size); else ksplot_draw_polygon_contour(_points, _nPoints, col.color_c_ptr(), size); } /** * @brief Create a default Mark. */ Mark::Mark() : _dashed(false) { _visible = false; _cpu._color = Color(225, 255, 100); _cpu._size = 5.5f; _task._color = Color(0, 255, 0); _task._size = 5.5f; } void Mark::_draw(const Color &col, float size) const { if (_dashed) drawDashedLine(_a, _b, col, size, 3 * _cpu._size / size); else drawLine(_a, _b, col, size); _cpu.draw(); _task.draw(); } /** * @brief Set the device pixel ratio. * * @param dpr: device pixel ratio value. */ void Mark::setDPR(int dpr) { _size = 1.5 * dpr; _task._size = _cpu._size = 1.5 + 4.0 * dpr; } /** * @brief Set the X coordinate (horizontal) of the Mark. * * @param x: X coordinate of the Makr in pixels. */ void Mark::setX(int x) { _a.setX(x); _b.setX(x); _cpu.setX(x); _task.setX(x); } /** * @brief Set the Y coordinates (vertical) of the Mark's finishing points. * * @param yA: Y coordinate of the first finishing point of the Mark's line. * @param yB: Y coordinate of the second finishing point of the Mark's line. */ void Mark::setY(int yA, int yB) { _a.setY(yA); _b.setY(yB); } /** * @brief Set the Y coordinates (vertical) of the Mark's CPU points. * * @param yCPU: Y coordinate of the Mark's CPU point. */ void Mark::setCPUY(int yCPU) { _cpu.setY(yCPU); } /** * @brief Set the visiblity of the Mark's CPU points. * * @param v: If True, the CPU point will be visible. */ void Mark::setCPUVisible(bool v) { _cpu._visible = v; } /** * @brief Set the Y coordinates (vertical) of the Mark's Task points. * * @param yTask: Y coordinate of the Mark's Task point. */ void Mark::setTaskY(int yTask) { _task.setY(yTask); } /** * @brief Set the visiblity of the Mark's Task points. * * @param v: If True, the Task point will be visible. */ void Mark::setTaskVisible(bool v) { _task._visible = v; } /** * @brief Create a default Bin. */ Bin::Bin() : _idFront(KS_EMPTY_BIN), _idBack(KS_EMPTY_BIN) {} void Bin::_draw(const Color &col, float size) const { drawLine(_base, _val, col, size); } /** * @brief Draw only the "val" Point og the Bin. * * @param size: The size of the point. */ void Bin::drawVal(float size) { _val._size = size; _val.draw(); } /** * @brief Create a default (empty) Graph. */ Graph::Graph() : _histoPtr(nullptr), _bins(nullptr), _size(0), _hMargin(30), _collectionPtr(nullptr), _binColors(nullptr), _ensembleColors(nullptr), _zeroSuppress(false) {} /** * @brief Create a Graph to represent the state of the Vis. model. * * @param histo: Input location for the model descriptor. * @param bct: Input location for the Hash table of bin's colors. * @param ect: Input location for the Hash table of ensemble's colors. */ Graph::Graph(kshark_trace_histo *histo, KsPlot::ColorTable *bct, KsPlot::ColorTable *ect) : _histoPtr(histo), _bins(new(std::nothrow) Bin[histo->n_bins]), _size(histo->n_bins), _hMargin(30), _collectionPtr(nullptr), _binColors(bct), _ensembleColors(ect), _zeroSuppress(false) { if (!_bins) { _size = 0; fprintf(stderr, "Failed to allocate memory graph's bins.\n"); } _initBins(); } /** * @brief Destroy the Graph object. */ Graph::~Graph() { delete[] _bins; } void Graph::_initBins() { for (int i = 0; i < _size; ++i) { _bins[i]._base.setX(i + _hMargin); _bins[i]._base.setY(0); _bins[i]._val.setX(_bins[i]._base.x()); _bins[i]._val.setY(_bins[i]._base.y()); } } /** * Get the number of bins. */ int Graph::size() { return _size; } /** * @brief Reinitialize the Graph according to the Vis. model. * * @param histo: Input location for the model descriptor. */ void Graph::setModelPtr(kshark_trace_histo *histo) { if (_size != histo->n_bins) { delete[] _bins; _size = histo->n_bins; _bins = new(std::nothrow) Bin[_size]; if (!_bins) { _size = 0; fprintf(stderr, "Failed to allocate memory graph's bins.\n"); } } _histoPtr = histo; _initBins(); } /** * @brief This function will set the Y (vertical) coordinate of the Graph's * base. It is safe to use this function even if the Graph contains * data. * * @param b: Y coordinate of the Graph's base in pixels. */ void Graph::setBase(int b) { int mod; if (!_size) return; if (b == _bins[0]._base.y()) // Nothing to do. return; for (int i = 0; i < _size; ++i) { mod = _bins[i].mod(); _bins[i]._base.setY(b); _bins[i]._val.setY(b + mod); } } /** * @brief Set the vertical size (height) of the Graph. * * @param h: the height of the Graph in pixels. */ void Graph::setHeight(int h) { _height = h; } /** * @brief Set the size of the white space added on both sides of the Graph. * * @param hMargin: the size of the white space in pixels. */ void Graph::setHMargin(int hMargin) { if (!_size) return; if (hMargin == _bins[0]._base.x()) // Nothing to do. return; for (int i = 0; i < _size; ++i) { _bins[i]._base.setX(i + hMargin); _bins[i]._val.setX(_bins[i]._base.x()); } _hMargin = hMargin; } /** * @brief Set the value of a given bin. * * @param bin: Bin Id. * @param val: Bin height in pixels. */ void Graph::setBinValue(int bin, int val) { _bins[bin].setVal(val); } /** * @brief Set the Process Id (Front and Back) a given bin. * * @param bin: Bin Id. * @param pidF: The Process Id detected at the from (first in time) edge of * the bin. * @param pidB: The Process Id detected at the back (last in time) edge of * the bin. */ void Graph::setBinPid(int bin, int pidF, int pidB) { _bins[bin]._idFront = pidF; _bins[bin]._idBack = pidB; } /** * @brief Set the color of a given bin. * * @param bin: Bin Id. * @param col: the color of the bin. */ void Graph::setBinColor(int bin, const Color &col) { _bins[bin]._color = col; } /** * @brief Set the visiblity mask of a given bin. * * @param bin: Bin Id. * @param m: the visiblity mask. */ void Graph::setBinVisMask(int bin, uint8_t m) { _bins[bin]._visMask = m; } /** * @brief Set all fields of a given bin. * * @param bin: Bin Id. * @param pidF: The Process Id detected at the from (first in time) edge of * the bin. * @param pidB: The Process Id detected at the back (last in time) edge of * the bin. * @param col: the color of the bin. * @param m: the visiblity mask. */ void Graph::setBin(int bin, int pidF, int pidB, const Color &col, uint8_t m) { setBinPid(bin, pidF, pidB); setBinValue(bin, _height * .7); setBinColor(bin, col); setBinVisMask(bin, m); } /** * @brief Process a CPU Graph. * * @param cpu: The CPU core. */ void Graph::fillCPUGraph(int cpu) { struct kshark_entry *eFront; int pidFront(0), pidBack(0); int pidBackNoFilter; uint8_t visMask; ssize_t index; int bin; auto lamGetPid = [&] (int bin) { eFront = nullptr; pidFront = ksmodel_get_pid_front(_histoPtr, bin, cpu, true, _collectionPtr, &index); if (index >= 0) eFront = _histoPtr->data[index]; pidBack = ksmodel_get_pid_back(_histoPtr, bin, cpu, true, _collectionPtr, nullptr); pidBackNoFilter = ksmodel_get_pid_back(_histoPtr, bin, cpu, false, _collectionPtr, nullptr); if (pidBack != pidBackNoFilter) pidBack = KS_FILTERED_BIN; visMask = 0x0; if (eFront) { if (!(eFront->visible & KS_EVENT_VIEW_FILTER_MASK) && ksmodel_cpu_visible_event_exist(_histoPtr, bin, cpu, _collectionPtr, &index)) { visMask = _histoPtr->data[index]->visible; } else { visMask = eFront->visible; } } }; auto lamSetBin = [&] (int bin) { if (pidFront != KS_EMPTY_BIN || pidBack != KS_EMPTY_BIN) { /* This is a regular process. */ setBin(bin, pidFront, pidBack, getColor(_binColors, pidFront), visMask); } else { /* The bin contens no data from this CPU. */ setBinPid(bin, KS_EMPTY_BIN, KS_EMPTY_BIN); } }; /* * Check the content of the very first bin and see if the CPU is * active. */ bin = 0; lamGetPid(bin); if (pidFront >= 0) { /* * The CPU is active and this is a regular process. * Set this bin. */ lamSetBin(bin); } else { /* * No data from this CPU in the very first bin. Use the Lower * Overflow Bin to retrieve the Process Id (if any). First * get the Pid back, ignoring the filters. */ pidBackNoFilter = ksmodel_get_pid_back(_histoPtr, LOWER_OVERFLOW_BIN, cpu, false, _collectionPtr, nullptr); /* Now get the Pid back, applying filters. */ pidBack = ksmodel_get_pid_back(_histoPtr, LOWER_OVERFLOW_BIN, cpu, true, _collectionPtr, nullptr); if (pidBack != pidBackNoFilter) { /* The Lower Overflow Bin ends with filtered data. */ setBinPid(bin, KS_FILTERED_BIN, KS_FILTERED_BIN); } else { /* * The Lower Overflow Bin ends with data which has * to be plotted. */ setBinPid(bin, pidBack, pidBack); } } /* * The first bin is already processed. The loop starts from the second * bin. */ for (bin = 1; bin < _histoPtr->n_bins; ++bin) { /* * Check the content of this bin and see if the CPU is active. * If yes, retrieve the Process Id. */ lamGetPid(bin); lamSetBin(bin); } } /** * @brief Process a Task Graph. * * @param pid: The Process Id of the Task. */ void Graph::fillTaskGraph(int pid) { int cpuFront, cpuBack(0), pidFront(0), pidBack(0), lastCpu(-1), bin(0); struct kshark_entry *eFront; uint8_t visMask; ssize_t index; auto lamSetBin = [&] (int bin) { if (cpuFront >= 0) { KsPlot::Color col = getColor(_binColors, pid); /* Data from the Task has been found in this bin. */ if (pid == pidFront && pid == pidBack) { /* No data from other tasks in this bin. */ setBin(bin, cpuFront, cpuBack, col, visMask); } else if (pid != pidFront && pid != pidBack) { /* * There is some data from other tasks at both * front and back sides of this bin. But we * still want to see this bin drawn. */ setBin(bin, cpuFront, KS_FILTERED_BIN, col, visMask); } else { if (pidFront != pid) { /* * There is some data from another * task at the front side of this bin. */ cpuFront = KS_FILTERED_BIN; } if (pidBack != pid) { /* * There is some data from another * task at the back side of this bin. */ cpuBack = KS_FILTERED_BIN; } setBin(bin, cpuFront, cpuBack, col, visMask); } lastCpu = cpuBack; } else { /* * No data from the Task in this bin. Check the CPU, * previously used by the task. We are looking for * data from another task running on the same CPU, * hence we cannot use the collection of this task. */ int cpuPid = ksmodel_get_pid_back(_histoPtr, bin, lastCpu, false, nullptr, // No collection nullptr); if (cpuPid != KS_EMPTY_BIN) { /* * If the CPU is active and works on another * task break the graph here. */ setBinPid(bin, KS_FILTERED_BIN, KS_EMPTY_BIN); } else { /* * No data from this CPU in the bin. * Continue the graph. */ setBinPid(bin, KS_EMPTY_BIN, KS_EMPTY_BIN); } } }; auto lamGetPidCPU = [&] (int bin) { eFront = nullptr; /* Get the CPU used by this task. */ cpuFront = ksmodel_get_cpu_front(_histoPtr, bin, pid, false, _collectionPtr, &index); if (index >= 0) eFront = _histoPtr->data[index]; cpuBack = ksmodel_get_cpu_back(_histoPtr, bin, pid, false, _collectionPtr, nullptr); if (cpuFront < 0) { pidFront = pidBack = cpuFront; } else { /* * Get the process Id at the begining and at the end * of the bin. */ pidFront = ksmodel_get_pid_front(_histoPtr, bin, cpuFront, false, _collectionPtr, nullptr); pidBack = ksmodel_get_pid_back(_histoPtr, bin, cpuBack, false, _collectionPtr, nullptr); visMask = 0x0; if (eFront) { if (!(eFront->visible & KS_EVENT_VIEW_FILTER_MASK) && ksmodel_task_visible_event_exist(_histoPtr, bin, pid, _collectionPtr, &index)) { visMask = _histoPtr->data[index]->visible; } else { visMask = eFront->visible; } } } }; /* * Check the content of the very first bin and see if the Task is * active. */ lamGetPidCPU(bin); if (cpuFront >= 0) { /* The Task is active. Set this bin. */ lamSetBin(bin); } else { /* * No data from this Task in the very first bin. Use the Lower * Overflow Bin to retrieve the CPU used by the task (if any). */ cpuFront = ksmodel_get_cpu_back(_histoPtr, LOWER_OVERFLOW_BIN, pid, false, _collectionPtr, nullptr); if (cpuFront >= 0) { /* * The Lower Overflow Bin contains data from this Task. * Now look again in the Lower Overflow Bin and Bim 0 * and find the Pid of the last active task on the same * CPU. */ int pidCpu0, pidCpuLOB; pidCpu0 = ksmodel_get_pid_back(_histoPtr, 0, cpuFront, false, _collectionPtr, nullptr); pidCpuLOB = ksmodel_get_pid_back(_histoPtr, LOWER_OVERFLOW_BIN, cpuFront, false, _collectionPtr, nullptr); if (pidCpu0 < 0 && pidCpuLOB == pid) { /* * The Task is the last one running on this * CPU. Set the Pid of the bin. In this case * the very first bin is empty but we derive * the Process Id from the Lower Overflow Bin. */ setBinPid(bin, cpuFront, cpuFront); lastCpu = cpuFront; } else { setBinPid(bin, KS_EMPTY_BIN, KS_EMPTY_BIN); } } } /* * The first bin is already processed. The loop starts from the second * bin. */ for (bin = 1; bin < _histoPtr->n_bins; ++bin) { lamGetPidCPU(bin); /* Set the bin accordingly. */ lamSetBin(bin); } } /** * @brief Draw the Graph * * @param size: The size of the lines of the individual Bins. */ void Graph::draw(float size) { int lastPid(-1), b(0), boxH(_height * .3); Rectangle taskBox; /* * Start by drawing a line between the base points of the first and * the last bin. */ drawLine(_bins[0]._base, _bins[_size - 1]._base, {}, size); /* Draw as vartical lines all bins containing data. */ for (int i = 0; i < _size; ++i) if (_bins[i]._idFront >= 0 || _bins[i]._idBack >= 0) if (_bins[i]._visMask & KS_EVENT_VIEW_FILTER_MASK) { _bins[i]._size = size; _bins[i].draw(); } auto lamCheckEnsblVal = [this] (int v) { return v > 0 || (v == 0 && !this->_zeroSuppress); }; /* * Draw colored boxes for processes. First find the first bin, which * contains data and determine its PID. */ for (; b < _size; ++b) { if (lamCheckEnsblVal(_bins[b]._idBack)) { lastPid = _bins[b]._idFront; /* * Initialize a box starting from this bin. * The color of the taskBox corresponds to the Pid * of the process. */ taskBox._color = getColor(_ensembleColors, lastPid); taskBox.setPoint(0, _bins[b]._base.x(), _bins[b]._base.y() - boxH); taskBox.setPoint(1, _bins[b]._base.x(), _bins[b]._base.y()); break; } } for (; b < _size; ++b) { if (_bins[b]._idFront == KS_EMPTY_BIN && _bins[b]._idBack == KS_EMPTY_BIN) { /* * This bin is empty. If a colored taskBox is already * initialized, it will be extended. */ continue; } if (_bins[b]._idFront != _bins[b]._idBack || _bins[b]._idFront != lastPid || _bins[b]._idBack != lastPid) { /* A new process starts here. */ if (b > 0 && lamCheckEnsblVal(lastPid)) { /* * There is another process running up to this * point. Close its colored box here and draw. */ taskBox.setPoint(3, _bins[b]._base.x() - 1, _bins[b]._base.y() - boxH); taskBox.setPoint(2, _bins[b]._base.x() - 1, _bins[b]._base.y()); taskBox.draw(); } if (lamCheckEnsblVal(_bins[b]._idBack)) { /* * This is a regular process. Initialize * colored box starting from this bin. */ taskBox._color = getColor(_ensembleColors, _bins[b]._idBack); taskBox.setPoint(0, _bins[b]._base.x() - 1, _bins[b]._base.y() - boxH); taskBox.setPoint(1, _bins[b]._base.x() - 1, _bins[b]._base.y()); } lastPid = _bins[b]._idBack; } } if (lamCheckEnsblVal(lastPid) > 0) { /* * This is the end of the Graph and we have a process running. * Close its colored box and draw. */ taskBox.setPoint(3, _bins[_size - 1]._base.x(), _bins[_size - 1]._base.y() - boxH); taskBox.setPoint(2, _bins[_size - 1]._base.x(), _bins[_size - 1]._base.y()); taskBox.draw(); } } }; // KsPlot trace-cmd-v2.9.6/kernel-shark/src/KsPlotTools.hpp000066400000000000000000000262701414302661500217110ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsPlotTools.hpp * @brief KernelShark Plot tools. */ #ifndef _KS_PLOT_TOOLS_H #define _KS_PLOT_TOOLS_H // C++ #include #include // KernelShark #include "libkshark.h" #include "libkshark-plot.h" #include "libkshark-model.h" namespace KsPlot { /** This class represents a RGB color. */ class Color { public: Color(); Color(uint8_t r, uint8_t g, uint8_t b); Color(int rgb); /** @brief Get the Red coordinate of the color. */ uint8_t r() const {return _col_c.red;} /** @brief Get the Green coordinate of the color. */ uint8_t g() const {return _col_c.green;} /** @brief Get the Blue coordinate of the color. */ uint8_t b() const {return _col_c.blue;} void set(uint8_t r, uint8_t g, uint8_t b); void set(int rgb); void setRainbowColor(int n); /** * @brief Get the C struct defining the RGB color. */ const ksplot_color *color_c_ptr() const {return &_col_c;} /** * @brief Set the frequency value used to generate the Rainbow * palette. */ static void setRainbowFrequency(float f) {_frequency = f;} /** * @brief Get the frequency value used to generate the Rainbow * palette. */ static float getRainbowFrequency() {return _frequency;} private: ksplot_color _col_c; /** The frequency value used to generate the Rainbow palette. */ static float _frequency; }; /** Hash table of colors. */ typedef std::unordered_map ColorTable; ColorTable getTaskColorTable(); ColorTable getCPUColorTable(); Color getColor(ColorTable *colors, int pid); /** Represents an abstract graphical element. */ class PlotObject { public: /** * @brief Create a default object. */ PlotObject() : _visible(true), _size(2.) {} /** * @brief Destroy the object. Keep this destructor virtual. */ virtual ~PlotObject() {} /** Generic function used to draw different objects. */ void draw() const { if (_visible) _draw(_color, _size); } /** Is this object visible. */ bool _visible; /** The color of the object. */ Color _color; /** The size of the object. */ float _size; private: virtual void _draw(const Color &col, float s) const = 0; }; /** List of graphical element. */ typedef std::forward_list PlotObjList; class Point; /** Represents an abstract shape. */ class Shape : public PlotObject { public: Shape(); Shape(int n); Shape(const Shape &); Shape(Shape &&); /* Keep this destructor virtual. */ virtual ~Shape(); void operator=(const Shape &s); void setPoint(size_t i, int x, int y); void setPoint(size_t i, const ksplot_point &p); void setPoint(size_t i, const Point &p); const ksplot_point *getPoint(size_t i) const; void setPointX(size_t i, int x); void setPointY(size_t i, int y); int getPointX(size_t i) const; int getPointY(size_t i) const; /** * @brief Get the number of point used to define the polygon. */ size_t pointCount() const {return _nPoints;} protected: /** The number of point used to define the polygon. */ size_t _nPoints; /** The array of point used to define the polygon. */ ksplot_point *_points; }; /** This class represents a 2D poin. */ class Point : public Shape { public: Point(); Point(int x, int y); /** * @brief Destroy the Point object. Keep this destructor virtual. */ virtual ~Point() {} /** @brief Get the horizontal coordinate of the point. */ int x() const {return getPointX(0);} /** @brief Get the vertical coordinate of the point. */ int y() const {return getPointY(0);} /** @brief Set the horizontal coordinate of the point. */ void setX(int x) {setPointX(0, x);} /** @brief Set the vertical coordinate of the point. */ void setY(int y) {setPointY(0, y);} /** * @brief Set the coordinats of the point. * * @param x: horizontal coordinate of the point in pixels. * @param y: vertical coordinate of the point in pixels. */ void set(int x, int y) {setPoint(0, x, y);} /** * @brief Get the C struct defining the point. */ const ksplot_point *point_c_ptr() const {return getPoint(0);} private: void _draw(const Color &col, float size = 1.) const override; }; void drawLine(const Point &a, const Point &b, const Color &col, float size); void drawDashedLine(const Point &a, const Point &b, const Color &col, float size, float period); /** This class represents a straight line. */ class Line : public Shape { public: Line(); Line(const Point &a, const Point &b); /** * @brief Destroy the Line object. Keep this destructor virtual. */ virtual ~Line() {} /** * @brief Set the coordinats of the first finishing point of the * line. * * @param x: horizontal coordinate of the point in pixels. * @param y: vertical coordinate of the point in pixels. */ void setA(int x, int y) { setPoint(0, x, y);} /** @brief Get the first finishing point of the line. */ const ksplot_point *getA() const {return getPoint(0);} /** * @brief Set the coordinats of the second finishing point of the * line. * * @param x: horizontal coordinate of the point in pixels. * @param y: vertical coordinate of the point in pixels. */ void setB(int x, int y) {setPoint(1, x, y);} /** @brief Get the second finishing point of the line. */ const ksplot_point *getB() const {return getPoint(1);} private: void _draw(const Color &col, float size = 1.) const override; }; /** This class represents a polygon. */ class Polygon : public Shape { public: Polygon(size_t n); /** * @brief Destroy the polygon object. Keep this destructor virtual. */ virtual ~Polygon() {} /** * @brief Specify the way the polygon will be drawn. * * @param f: If True, the area of the polygon will be colored. * Otherwise only the contour of the polygon will be plotted. */ void setFill(bool f) {_fill = f;} private: Polygon() = delete; void _draw(const Color &, float size = 1.) const override; /** * If True, the area of the polygon will be colored. Otherwise only * the contour of the polygon will be plotted. */ bool _fill; }; /** This class represents a triangle. */ class Triangle : public Polygon { public: /** * Create a default triangle. All points are initialized at (0, 0). */ Triangle() : Polygon(3) {} /** Destroy the Triangle object. Keep this destructor virtual. */ virtual ~Triangle() {} }; /** This class represents a rectangle. */ class Rectangle : public Polygon { public: /** * Create a default Rectangle. All points are initialized at (0, 0). */ Rectangle() : Polygon(4) {} /** Destroy the Rectangle object. Keep this destructor virtual. */ virtual ~Rectangle() {} }; /** * This class represents the graphical element of the KernelShark GUI marker. */ class Mark : public PlotObject { public: Mark(); /** * @brief Destroy the Mark object. Keep this destructor virtual. */ virtual ~Mark() {} void setDPR(int dpr); void setX(int x); void setY(int yA, int yB); void setCPUY(int yCPU); void setCPUVisible(bool v); void setTaskY(int yTask); void setTaskVisible(bool v); /** If True, the Mark will be plotted as a dashed line. */ void setDashed(bool d) {_dashed = d;} private: void _draw(const Color &col, float size = 1.) const override; /** First finishing point of the Mark's line. */ Point _a; /** Second finishing point of the Mark's line. */ Point _b; /** A point indicating the position of the Mark in a CPU graph. */ Point _cpu; /** A point indicating the position of the Mark in a Task graph. */ Point _task; /* If True, plot the Mark as a dashed line. */ bool _dashed; }; /** This class represents a KernelShark graph's bin. */ class Bin : public PlotObject { public: Bin(); /** * @brief Destroy the Bin object. Keep this destructor virtual. */ virtual ~Bin() {} void drawVal(float size = 2.); /** Get the height (module) of the line, representing the Bin. */ int mod() {return _val.y() - _base.y();} /** @brief Set the vertical coordinate of the "val" Point. */ void setVal(int v) {_val.setY(_base.y() - v); } /** * The Id value (pid or cpu) detected at the front (first in time) edge * of the bin. */ int _idFront; /** * The Id value (pid or cpu) detected at the back (last in time) edge * of the bin. */ int _idBack; /** Lower finishing point of the line, representing the Bin. */ Point _base; /** Upper finishing point of the line, representing the Bin. */ Point _val; /** A bit mask controlling the visibility of the Bin. */ uint8_t _visMask; private: void _draw(const Color &col, float size = 1.) const override; }; /** This class represents a KernelShark graph. */ class Graph { public: Graph(); /* * Disable copying. We can enable the Copy Constructor in the future, * but only if we really need it for some reason. */ Graph(const Graph &) = delete; /* Disable moving. Same as copying.*/ Graph(Graph &&) = delete; Graph(kshark_trace_histo *histo, KsPlot::ColorTable *bct, KsPlot::ColorTable *ect); /* Keep this destructor virtual. */ virtual ~Graph(); int size(); void setModelPtr(kshark_trace_histo *histo); /** * @brief Provide the Graph with a Data Collection. The collection * will be used to optimise the processing of the content of * the bins. * * @param col: Input location for the data collection descriptor. */ void setDataCollectionPtr(kshark_entry_collection *col) { _collectionPtr = col; } /** @brief Set the Hash table of Task's colors. */ void setBinColorTablePtr(KsPlot::ColorTable *ct) {_binColors = ct;} void fillCPUGraph(int cpu); void fillTaskGraph(int pid); void draw(float s = 1); void setBase(int b); /** @brief Get the vertical coordinate of the Graph's base. */ int getBase() const {return _bins[0]._base.y();} void setHeight(int h); /** @brief Get the vertical size (height) of the Graph. */ int getHeight() const {return _height;} void setBinValue(int bin, int val); void setBinPid(int bin, int pidF, int pidB); void setBinColor(int bin, const Color &col); void setBinVisMask(int bin, uint8_t m); void setBin(int bin, int pidF, int pidB, const Color &col, uint8_t m); /** @brief Get a particular bin. */ const Bin &getBin(int bin) const {return _bins[bin];} void setHMargin(int hMargin); /** * Check if this graph is Zero Suppressed. Zero Suppressed means that * bins having Id value = 0 (Idle task records) are not grouped * together. */ bool zeroSuppressed(bool zs) {return _zeroSuppress;} /** * Set Zero Suppression. If True, the bins having Id value = 0 (Idle * task records) are not grouped together. */ void setZeroSuppressed(bool zs) {_zeroSuppress = zs;} private: /** Pointer to the model descriptor object. */ kshark_trace_histo *_histoPtr; /** An array of Bins. */ Bin *_bins; /** The number of Bins. */ int _size; /** * The size (in pixels) of the white space added on both sides of * the Graph. */ int _hMargin; /** The vertical size (height) of the Graph. */ int _height; /** Pointer to the data collection object. */ kshark_entry_collection *_collectionPtr; /** Hash table of bin's colors. */ ColorTable *_binColors; /** Hash table of ensemble's colors. */ ColorTable *_ensembleColors; bool _zeroSuppress; void _initBins(); }; }; // KsPlot #endif /* _KS_PLOT_TOOLS_H */ trace-cmd-v2.9.6/kernel-shark/src/KsPlugins.hpp000066400000000000000000000020471414302661500213670ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ /** * @file KsPlugins.hpp * @brief KernelShark C++ plugin declarations. */ #ifndef _KS_PLUGINS_H #define _KS_PLUGINS_H // KernelShark #include "libkshark-model.h" #include "KsPlotTools.hpp" /** * Structure representing the vector of C++ arguments of the drawing function * of a plugin. */ struct KsCppArgV { /** Pointer to the model descriptor object. */ kshark_trace_histo *_histo; /** Pointer to the graph object. */ KsPlot::Graph *_graph; /** * Pointer to the list of shapes. All shapes created by the plugin * will be added to this list. */ KsPlot::PlotObjList *_shapes; /** * Convert the "this" pointer of the C++ argument vector into a * C pointer. */ kshark_cpp_argv *toC() { return reinterpret_cast(this); } }; /** * Macro used to convert a C pointer into a pointer to KsCppArgV (C++ struct). */ #define KS_ARGV_TO_CPP(a) (reinterpret_cast(a)) #endif trace-cmd-v2.9.6/kernel-shark/src/KsQuickContextMenu.cpp000066400000000000000000000173221414302661500232110ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ /** * @file KsQuickContextMenu.cpp * @brief Quick Context Menus for KernelShark. */ #include "KsQuickContextMenu.hpp" #include "KsTraceGraph.hpp" /** * @brief Create KsQuickMarkerMenu. * * @param dm: The State machine of the Dual marker. * @param parent: The parent of this widget. */ KsQuickMarkerMenu::KsQuickMarkerMenu(KsDualMarkerSM *dm, QWidget *parent) : QMenu("Context Menu", parent), _dm(dm), _deselectAction(this) { if (dm->activeMarker()._isSet) { addSection("Marker menu"); _deselectAction.setText("Deselect"); _deselectAction.setShortcut(tr("Ctrl+D")); _deselectAction.setStatusTip(tr("Deselect marker")); connect(&_deselectAction, &QAction::triggered, this, &KsQuickMarkerMenu::deselect); addAction(&_deselectAction); } } /** * @brief Create KsQuickContextMenu. * * @param data: Input location for the KsDataStore object. * @param row: The index of the entry used to initialize the menu. * @param dm: The State machine of the Dual marker. * @param parent: The parent of this widget. */ KsQuickContextMenu::KsQuickContextMenu(KsDataStore *data, size_t row, KsDualMarkerSM *dm, QWidget *parent) : KsQuickMarkerMenu(dm, parent), _data(data), _row(row), _graphSyncCBox(nullptr), _listSyncCBox(nullptr), _hideTaskAction(this), _showTaskAction(this), _hideEventAction(this), _showEventAction(this), _hideCPUAction(this), _showCPUAction(this), _addCPUPlotAction(this), _addTaskPlotAction(this), _removeCPUPlotAction(this), _removeTaskPlotAction(this), _clearAllFilters(this) { typedef void (KsQuickContextMenu::*mfp)(); QString taskName, parentName, descr; KsTraceGraph *graphs; int pid, cpu; if (!parent || !_data) return; taskName = kshark_get_task_easy(_data->rows()[_row]); pid = kshark_get_pid_easy(_data->rows()[_row]); cpu = _data->rows()[_row]->cpu; auto lamAddAction = [this, &descr] (QAction *action, mfp mf) { action->setText(descr); connect(action, &QAction::triggered, this, mf); addAction(action); }; parentName = parent->metaObject()->className(); addSection("Pointer filter menu"); descr = "Show task ["; descr += taskName; descr += "-"; descr += QString("%1").arg(pid); descr += "] only"; lamAddAction(&_showTaskAction, &KsQuickContextMenu::_showTask); descr = "Hide task ["; descr += taskName; descr += "-"; descr += QString("%1").arg(pid); descr += "]"; lamAddAction(&_hideTaskAction, &KsQuickContextMenu::_hideTask); descr = "Show event ["; descr += kshark_get_event_name_easy(_data->rows()[_row]); descr += "] only"; lamAddAction(&_showEventAction, &KsQuickContextMenu::_showEvent); descr = "Hide event ["; descr += kshark_get_event_name_easy(_data->rows()[_row]); descr += "]"; lamAddAction(&_hideEventAction, &KsQuickContextMenu::_hideEvent); if (parentName == "KsTraceViewer") { descr = QString("Show CPU [%1] only").arg(cpu); lamAddAction(&_showCPUAction, &KsQuickContextMenu::_showCPU); } descr = QString("Hide CPU [%1]").arg(_data->rows()[_row]->cpu); lamAddAction(&_hideCPUAction, &KsQuickContextMenu::_hideCPU); descr = "Clear all filters"; lamAddAction(&_clearAllFilters, &KsQuickContextMenu::_clearFilters); addSection("Pointer plot menu"); if (parentName == "KsTraceViewer") { descr = "Add ["; descr += taskName; descr += "-"; descr += QString("%1").arg(pid); descr += "] plot"; lamAddAction(&_addTaskPlotAction, &KsQuickContextMenu::_addTaskPlot); } if (parentName == "KsTraceGraph" && (graphs = dynamic_cast(parent))) { if (graphs->glPtr()->_taskList.contains(pid)) { descr = "Remove ["; descr += taskName; descr += "-"; descr += QString("%1").arg(pid); descr += "] plot"; lamAddAction(&_removeTaskPlotAction, &KsQuickContextMenu::_removeTaskPlot); } else { descr = "Add ["; descr += taskName; descr += "-"; descr += QString("%1").arg(pid); descr += "] plot"; lamAddAction(&_addTaskPlotAction, &KsQuickContextMenu::_addTaskPlot); } if (graphs->glPtr()->_cpuList.contains(cpu)) { descr = "Remove [CPU "; descr += QString("%1").arg(cpu); descr += "] plot"; lamAddAction(&_removeCPUPlotAction, &KsQuickContextMenu::_removeCPUPlot); } else { descr = "Add [CPU "; descr += QString("%1").arg(cpu); descr += "] plot"; lamAddAction(&_addCPUPlotAction, &KsQuickContextMenu::_addCPUPlot); } } } void KsQuickContextMenu::_hideTask() { int pid = kshark_get_pid_easy(_data->rows()[_row]); kshark_context *kshark_ctx(nullptr); QVector vec; if (!kshark_instance(&kshark_ctx)) return; vec =_getFilterVector(kshark_ctx->hide_task_filter, pid); _data->applyNegTaskFilter(vec); } void KsQuickContextMenu::_showTask() { int pid = kshark_get_pid_easy(_data->rows()[_row]); _data->applyPosTaskFilter(QVector(1, pid)); } void KsQuickContextMenu::_hideEvent() { int eventId = kshark_get_event_id_easy(_data->rows()[_row]); kshark_context *kshark_ctx(nullptr); QVector vec; if (!kshark_instance(&kshark_ctx)) return; vec =_getFilterVector(kshark_ctx->hide_event_filter, eventId); _data->applyNegEventFilter(vec); } void KsQuickContextMenu::_showEvent() { int eventId = kshark_get_event_id_easy(_data->rows()[_row]); _data->applyPosEventFilter(QVector(1, eventId)); } void KsQuickContextMenu::_showCPU() { int cpu = _data->rows()[_row]->cpu; _data->applyPosCPUFilter(QVector(1, cpu)); } void KsQuickContextMenu::_hideCPU() { kshark_context *kshark_ctx(nullptr); QVector vec; if (!kshark_instance(&kshark_ctx)) return; vec =_getFilterVector(kshark_ctx->hide_cpu_filter, _data->rows()[_row]->cpu); _data->applyNegCPUFilter(vec); } QVector KsQuickContextMenu::_getFilterVector(tracecmd_filter_id *filter, int newId) { QVector vec = KsUtils::getFilterIds(filter); if (!vec.contains(newId)) vec.append(newId); return vec; } void KsQuickContextMenu::_addTaskPlot() { int pid = kshark_get_pid_easy(_data->rows()[_row]); emit addTaskPlot(pid); } void KsQuickContextMenu::_addCPUPlot() { emit addCPUPlot(_data->rows()[_row]->cpu); } void KsQuickContextMenu::_removeTaskPlot() { int pid = kshark_get_pid_easy(_data->rows()[_row]); emit removeTaskPlot(pid); } void KsQuickContextMenu::_removeCPUPlot() { emit removeCPUPlot(_data->rows()[_row]->cpu); } /** * @brief Create KsRmPlotContextMenu. * * @param dm: The State machine of the Dual marker. * @param parent: The parent of this widget. */ KsRmPlotContextMenu::KsRmPlotContextMenu(KsDualMarkerSM *dm, QWidget *parent) : KsQuickMarkerMenu(dm, parent), _removePlotAction(this) { addSection("Plots"); connect(&_removePlotAction, &QAction::triggered, this, &KsRmPlotContextMenu::removePlot); addAction(&_removePlotAction); } /** * @brief Create KsRmCPUPlotMenu. * * @param dm: The State machine of the Dual marker. * @param cpu : CPU Id. * @param parent: The parent of this widget. */ KsRmCPUPlotMenu::KsRmCPUPlotMenu(KsDualMarkerSM *dm, int cpu, QWidget *parent) : KsRmPlotContextMenu(dm, parent) { _removePlotAction.setText(QString("Remove [CPU %1]").arg(cpu)); } /** * @brief Create KsRmTaskPlotMenu. * * @param dm: The State machine of the Dual marker. * @param pid: Process Id. * @param parent: The parent of this widget. */ KsRmTaskPlotMenu::KsRmTaskPlotMenu(KsDualMarkerSM *dm, int pid, QWidget *parent) : KsRmPlotContextMenu(dm, parent) { kshark_context *kshark_ctx(nullptr); QString descr("Remove [ "); if (!kshark_instance(&kshark_ctx)) return; descr += tep_data_comm_from_pid(kshark_ctx->pevent, pid); descr += "-"; descr += QString("%1").arg(pid); descr += "] plot"; _removePlotAction.setText(descr); } trace-cmd-v2.9.6/kernel-shark/src/KsQuickContextMenu.hpp000066400000000000000000000055761414302661500232260ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ /** * @file KsQuickContextMenu.hpp * @brief Quick Context Menus for KernelShark. */ #ifndef _KS_QUICK_CTX_MENU_H #define _KS_QUICK_CTX_MENU_H #include "KsDualMarker.hpp" #include "KsUtils.hpp" #include "KsGLWidget.hpp" /** * The KsQuickMarkerMenu class provides menu for quick Dual Marker related * actions. */ class KsQuickMarkerMenu : public QMenu { Q_OBJECT public: KsQuickMarkerMenu(KsDualMarkerSM *dm, QWidget *parent = nullptr); signals: /** Signal to deselect the active marker. */ void deselect(); private: KsDualMarkerSM *_dm; QAction _deselectAction; }; /** * The KsQuickFilterMenu class provides a menu for easy filtering and plotting. * The menu is initialized from a single kshark_entry and uses the content of * this entry to provides quick actions for filtering and plottin. */ class KsQuickContextMenu : public KsQuickMarkerMenu { Q_OBJECT public: KsQuickContextMenu() = delete; KsQuickContextMenu(KsDataStore *data, size_t row, KsDualMarkerSM *dm, QWidget *parent = nullptr); signals: /** Signal to add a task plot. */ void addTaskPlot(int); /** Signal to add a CPU plot. */ void addCPUPlot(int); /** Signal to remove a task plot. */ void removeTaskPlot(int); /** Signal to remove a CPU plot. */ void removeCPUPlot(int); private: void _hideTask(); void _showTask(); void _hideEvent(); void _showEvent(); void _showCPU(); void _hideCPU(); void _addCPUPlot(); void _addTaskPlot(); void _removeCPUPlot(); void _removeTaskPlot(); QVector _getFilterVector(tracecmd_filter_id *filter, int newId); void _clearFilters() {_data->clearAllFilters();} KsDataStore *_data; size_t _row; QCheckBox *_graphSyncCBox, *_listSyncCBox; QAction _hideTaskAction, _showTaskAction; QAction _hideEventAction, _showEventAction; QAction _hideCPUAction, _showCPUAction; QAction _addCPUPlotAction; QAction _addTaskPlotAction; QAction _removeCPUPlotAction; QAction _removeTaskPlotAction; QAction _clearAllFilters; }; /** * The KsQuickMarkerMenu is a baser class for Remove Plot menus. */ class KsRmPlotContextMenu : public KsQuickMarkerMenu { Q_OBJECT public: KsRmPlotContextMenu() = delete; KsRmPlotContextMenu(KsDualMarkerSM *dm, QWidget *parent = nullptr); signals: /** Signal to remove a plot. */ void removePlot(int); protected: /** Menu action. */ QAction _removePlotAction; }; /** * The KsQuickMarkerMenu class provides CPU Plot remove menus. */ struct KsRmCPUPlotMenu : public KsRmPlotContextMenu { KsRmCPUPlotMenu(KsDualMarkerSM *dm, int cpu, QWidget *parent = nullptr); }; /** * The KsQuickMarkerMenu class provides Task Plot remove menus. */ struct KsRmTaskPlotMenu : public KsRmPlotContextMenu { KsRmTaskPlotMenu(KsDualMarkerSM *dm, int pid, QWidget *parent = nullptr); }; #endif trace-cmd-v2.9.6/kernel-shark/src/KsSearchFSM.cpp000066400000000000000000000126031414302661500215130ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ /** * @file KsSearchFSM.cpp * @brief Finite-state machine for searching in trace data. */ // KernelShark #include "KsSearchFSM.hpp" #include "KsUtils.hpp" #include "KsTraceViewer.hpp" #include "KsWidgetsLib.hpp" static bool notHaveCond(const QString &searchText, const QString &itemText) { return !itemText.contains(searchText, Qt::CaseInsensitive); } static bool containsCond(const QString &searchText, const QString &itemText) { return itemText.contains(searchText, Qt::CaseInsensitive); } static bool matchCond(const QString &searchText, const QString &itemText) { return (itemText.compare(searchText, Qt::CaseInsensitive) == 0); } static bool noCond(const QString &searchText, const QString &itemText) { return false; } /** Create a Finite-state machine for searching. */ KsSearchFSM::KsSearchFSM(QWidget *parent) : _currentState(new NotDone), _lastRowSearched(0), _searchProgBar(parent), _searchCountLabel("", parent), _columnComboBox(parent), _selectComboBox(parent), _searchLineEdit(parent), _prevButton("Prev", parent), _nextButton("Next", parent), _searchRestartButton(QIcon::fromTheme("media-playback-start"), "", parent), // _searchStopButton(QIcon::fromTheme("media-playback-pause"), "", parent), _searchStopButton(QIcon::fromTheme("process-stop"), "", parent), _cond(nullptr), _pbAction(nullptr), _searchStopAction(nullptr), _searchRestartAction(nullptr) { int bWidth = FONT_WIDTH * 6; _nextButton.setFixedWidth(bWidth); _prevButton.setFixedWidth(bWidth); _searchProgBar.setMaximumWidth(FONT_WIDTH * 10); _searchProgBar.setRange(0, KS_PROGRESS_BAR_MAX); _selectComboBox.addItem("contains"); _selectComboBox.addItem("full match"); _selectComboBox.addItem("does not have"); updateCondition(); } /** * Position all buttons and labels of the Finite-state machine for searching * in a toolbar. */ void KsSearchFSM::placeInToolBar(QToolBar *tb) { tb->addWidget(&_columnComboBox); tb->addWidget(&_selectComboBox); tb->addWidget(&_searchLineEdit); tb->addSeparator(); tb->addWidget(&_nextButton); tb->addWidget(&_prevButton); tb->addSeparator(); _pbAction = tb->addWidget(&_searchProgBar); _pbAction->setVisible(false); tb->addWidget(&_searchCountLabel); _searchStopAction = tb->addWidget(&_searchStopButton); _searchStopAction->setVisible(false); _searchRestartAction = tb->addWidget(&_searchRestartButton); _searchRestartAction->setVisible(false); tb->addSeparator(); } /** * Update the Matching condition function of the search according to the user * input. */ void KsSearchFSM::updateCondition() { int xSelect = _selectComboBox.currentIndex(); switch (xSelect) { case Condition::Containes: _cond = containsCond; return; case Condition::Match: _cond = matchCond; return; case Condition::NotHave: _cond = notHaveCond; return; default: _cond = noCond; return; } } void KsSearchFSM ::_lockSearchPanel(bool lock) { _columnComboBox.setEnabled(!lock); _selectComboBox.setEnabled(!lock); _searchLineEdit.setReadOnly(lock); _prevButton.setEnabled(!lock); _nextButton.setEnabled(!lock); // _graphFollowsCheckBox.setEnabled(!lock); } /** Act according to the provided input. */ void NotDone::handleInput(KsSearchFSM* sm, sm_input_t input) { switch(input) { case sm_input_t::Start: sm->_lastRowSearched = -1; sm->lockSearchPanel(); sm->updateCondition(); sm->progressBarVisible(true); sm->searchStopVisible(true); sm->changeState(std::shared_ptr(new InProgress)); break; case sm_input_t::Finish: sm->changeState(std::shared_ptr(new Done)); break; default: /* Ignore the input. */ break; } } /** Act according to the provided input. */ void Paused::handleInput(KsSearchFSM* sm, sm_input_t input) { switch(input) { case sm_input_t::Start: sm->lockSearchPanel(); sm->searchStopVisible(true); sm->searchRestartVisible(false); if (sm->column() != KsViewModel::TRACE_VIEW_COL_INFO && sm->column() != KsViewModel::TRACE_VIEW_COL_LAT) sm->_searchCountLabel.setText(""); sm->changeState(std::shared_ptr(new InProgress)); break; case sm_input_t::Change: sm->_searchProgBar.setValue(0); sm->_searchCountLabel.setText(""); sm->progressBarVisible(false); sm->searchRestartVisible(false); sm->changeState(std::shared_ptr(new NotDone)); break; default: /* Ignore the input. */ break; } } /** Act according to the provided input. */ void InProgress::handleInput(KsSearchFSM* sm, sm_input_t input) { auto lamUnlock = [&sm] () { sm->searchStopVisible(false); sm->unlockSearchPanel(); }; switch(input) { case sm_input_t::Stop: lamUnlock(); sm->searchRestartVisible(true); sm->changeState(std::shared_ptr(new Paused)); break; case sm_input_t::Finish: lamUnlock(); sm->progressBarVisible(false); sm->changeState(std::shared_ptr(new Done)); break; default: /* Ignore the input. */ break; } } /** Act according to the provided input. */ void Done::handleInput(KsSearchFSM* sm, sm_input_t i) { switch(i) { case sm_input_t::Change: sm->_searchProgBar.setValue(0); sm->progressBarVisible(false); sm->_searchCountLabel.setText(""); sm->searchStopVisible(false); sm->searchRestartVisible(false); sm->changeState(std::shared_ptr(new NotDone)); break; default: /* Ignore the input. */ break; } } trace-cmd-v2.9.6/kernel-shark/src/KsSearchFSM.hpp000066400000000000000000000113211414302661500215140ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ /** * @file KsSearchFSM.hpp * @brief Finite-state machine for searching in trace data. */ #ifndef _KS_SEARCH_FSM_H #define _KS_SEARCH_FSM_H // C++11 #include // Qt #include /** Matching condition function type. To be user for searching. */ typedef bool (*search_condition_func)(const QString &, const QString &); /** State Identifiers of the Finite-state machine for searching. */ enum class search_state_t { /** Identifier of the "NotDone" state. */ NotDone_s = 0, /** Identifier of the "InProgress" state. */ InProgress_s = 1, /** Identifier of the "Paused" state. */ Paused_s = 2, /** Identifier of the "Done" state. */ Done_s = 3 }; /** Inputs of the Finite-state machine for searching. */ enum class sm_input_t { Start = 0, Stop = 1, Finish = 2, Change = 3 }; class KsSearchFSM; /** * State provides a base class for the states of the Finite-state machine for * searching. */ struct State { /** Virtual destructor. */ virtual ~State() {} /** * Act according to the provided input. This is a pure virtual * function. */ virtual void handleInput(KsSearchFSM* sm, sm_input_t i) = 0; /** * Get the identifier of this state. This is a pure virtual function. */ virtual search_state_t id() = 0; }; /** "NotDone" state. */ struct NotDone : public State { void handleInput(KsSearchFSM* sm, sm_input_t i) override; search_state_t id() override {return search_state_t::NotDone_s;} }; /** "InProgress" state. */ struct InProgress : public State { void handleInput(KsSearchFSM* sm, sm_input_t i) override; /** Get the identifier of this state. */ search_state_t id() override {return search_state_t::InProgress_s;} }; /** "Paused" state. */ struct Paused : public State { void handleInput(KsSearchFSM* sm, sm_input_t i) override; /** Get the identifier of this state. */ search_state_t id() override {return search_state_t::Paused_s;} }; /** "Done" state. */ struct Done : public State { void handleInput(KsSearchFSM* sm, sm_input_t i) override; /** Get the identifier of this state. */ search_state_t id() override {return search_state_t::Done_s;} }; /** Finite-state machine for searching. */ class KsSearchFSM : public QWidget { Q_OBJECT public: explicit KsSearchFSM(QWidget *parent = nullptr); void placeInToolBar(QToolBar *tb); /** Act according to the provided input. */ void handleInput(sm_input_t input) { _currentState->handleInput(this, input); } /** Switch the state. */ void changeState(std::shared_ptr newState) { _currentState = newState; } /** Get the identifier of the Current state. */ search_state_t getState() const {return _currentState->id();} /** Get the data column to search in. */ int column() const {return _columnComboBox.currentIndex();} /** Get the Matching condition function. */ search_condition_func condition() const {return _cond;} /** Get the text to search for. */ QString searchText() const {return _searchLineEdit.text();} /** Set the value of the Search Progress Bar. */ void setProgress(int v) {_searchProgBar.setValue(v);} /** Increment the value of the Search Progress Bar. */ void incrementProgress() { _searchProgBar.setValue(_searchProgBar.value() + 1); } void updateCondition(); /** Disable the user searching input (lock the panel). */ void lockSearchPanel() {_lockSearchPanel(true);} /** Enable the user searching input (unlock the panel). */ void unlockSearchPanel() {_lockSearchPanel(false);} /** Set the visibility of the Search Progress Bar. */ void progressBarVisible(bool v) {_pbAction->setVisible(v);} /** Set the visibility of the Search Stop button. */ void searchStopVisible(bool v) {_searchStopAction->setVisible(v);} /** Set the visibility of the Search Restart button. */ void searchRestartVisible(bool v) {_searchRestartAction->setVisible(v);} /** Current State of the Finite-state machine for searching. */ std::shared_ptr _currentState; /** * Last row, tested for matching. To be used when restarting the * search. Note that the field uses "int" as a type because this * is the type supported by the Qt widget (QTableView). */ int _lastRowSearched; //! @cond Doxygen_Suppress QProgressBar _searchProgBar; QLabel _searchCountLabel; QComboBox _columnComboBox; QComboBox _selectComboBox; QLineEdit _searchLineEdit; QPushButton _prevButton, _nextButton; QPushButton _searchRestartButton, _searchStopButton; //! @endcond private: search_condition_func _cond; QAction *_pbAction, *_searchStopAction, *_searchRestartAction; void _lockSearchPanel(bool lock); enum Condition { Containes = 0, Match = 1, NotHave = 2 }; }; #endif trace-cmd-v2.9.6/kernel-shark/src/KsSession.cpp000066400000000000000000000362651414302661500213750ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsSession.cpp * @brief KernelShark Session. */ // KernelShark #include "libkshark.h" #include "KsSession.hpp" #include "KsMainWindow.hpp" /** Create a KsSession object. */ KsSession::KsSession() { _config = kshark_config_new("kshark.config.session", KS_CONFIG_JSON); } /** Destroy a KsSession object. */ KsSession::~KsSession() { kshark_free_config_doc(_config); } /** Import a user session from a Json file. */ bool KsSession::importFromFile(QString jfileName) { kshark_config_doc *configTmp = kshark_open_config_file(jfileName.toStdString().c_str(), "kshark.config.session"); if (configTmp) { kshark_free_config_doc(_config); _config = configTmp; return true; } return false; } /** Export the current user session from a Json file. */ void KsSession::exportToFile(QString jfileName) { kshark_save_config_file(jfileName.toStdString().c_str(), _config); } /** * @brief Save the state of the visualization model. * * @param histo: Input location for the model descriptor. */ void KsSession::saveVisModel(kshark_trace_histo *histo) { kshark_config_doc *model = kshark_export_model(histo, KS_CONFIG_JSON); kshark_config_doc_add(_config, "Model", model); } /** * @brief Load the state of the visualization model. * * @param model: Input location for the KsGraphModel object. */ void KsSession::loadVisModel(KsGraphModel *model) { kshark_config_doc *modelConf = kshark_config_alloc(KS_CONFIG_JSON); if (!kshark_config_doc_get(_config, "Model", modelConf)) return; kshark_import_model(model->histo(), modelConf); model->update(); } /** Save the trace data file. */ void KsSession::saveDataFile(QString fileName) { kshark_config_doc *file = kshark_export_trace_file(fileName.toStdString().c_str(), KS_CONFIG_JSON); kshark_config_doc_add(_config, "Data", file); } /** Get the trace data file. */ QString KsSession::getDataFile(kshark_context *kshark_ctx) { kshark_config_doc *file = kshark_config_alloc(KS_CONFIG_JSON); const char *file_str; if (!kshark_config_doc_get(_config, "Data", file)) return QString(); file_str = kshark_import_trace_file(kshark_ctx, file); if (file_str) return QString(file_str); return QString(); } /** * @brief Save the configuration of the filters. * * @param kshark_ctx: Input location for context pointer. */ void KsSession::saveFilters(kshark_context *kshark_ctx) { kshark_config_doc *filters = kshark_export_all_filters(kshark_ctx, KS_CONFIG_JSON); kshark_config_doc_add(_config, "Filters", filters); } /** * @brief Load the configuration of the filters and filter the data. * * @param kshark_ctx: Input location for context pointer. * @param data: Input location for KsDataStore object; */ void KsSession::loadFilters(kshark_context *kshark_ctx, KsDataStore *data) { kshark_config_doc *filters = kshark_config_alloc(KS_CONFIG_JSON); if (!kshark_config_doc_get(_config, "Filters", filters)) return; kshark_import_all_filters(kshark_ctx, filters); if (kshark_ctx->advanced_event_filter->filters) data->reload(); else kshark_filter_entries(kshark_ctx, data->rows(), data->size()); data->registerCPUCollections(); emit data->updateWidgets(data); } /** * @brief Save the state of the table. * * @param view: Input location for the KsTraceViewer widget. */ void KsSession::saveTable(const KsTraceViewer &view) { kshark_config_doc *topRow = kshark_config_alloc(KS_CONFIG_JSON); int64_t r = view.getTopRow(); topRow->conf_doc = json_object_new_int64(r); kshark_config_doc_add(_config, "ViewTop",topRow); } /** * @brief Load the state of the table. * * @param view: Input location for the KsTraceViewer widget. */ void KsSession::loadTable(KsTraceViewer *view) { kshark_config_doc *topRow = kshark_config_alloc(KS_CONFIG_JSON); size_t r = 0; if (!kshark_config_doc_get(_config, "ViewTop", topRow)) return; if (_config->format == KS_CONFIG_JSON) r = json_object_get_int64(KS_JSON_CAST(topRow->conf_doc)); view->setTopRow(r); } /** * @brief Save the KernelShark Main window size. * * @param window: Input location for the KsMainWindow widget. */ void KsSession::saveMainWindowSize(const QMainWindow &window) { kshark_config_doc *windowConf = kshark_config_alloc(KS_CONFIG_JSON); int width = window.width(), height = window.height(); json_object *jwindow; if (window.isFullScreen()) { jwindow = json_object_new_string("FullScreen"); } else { jwindow = json_object_new_array(); json_object_array_put_idx(jwindow, 0, json_object_new_int(width)); json_object_array_put_idx(jwindow, 1, json_object_new_int(height)); } windowConf->conf_doc = jwindow; kshark_config_doc_add(_config, "MainWindow", windowConf); } /** * @brief Load the KernelShark Main window size. * * @param window: Input location for the KsMainWindow widget. */ void KsSession::loadMainWindowSize(KsMainWindow *window) { kshark_config_doc *windowConf = kshark_config_alloc(KS_CONFIG_JSON); json_object *jwindow, *jwidth, *jheight; int width, height; if (!kshark_config_doc_get(_config, "MainWindow", windowConf)) return; if (_config->format == KS_CONFIG_JSON) { jwindow = KS_JSON_CAST(windowConf->conf_doc); if (json_object_get_type(jwindow) == json_type_string && QString(json_object_get_string(jwindow)) == "FullScreen") { window->setFullScreenMode(true); return; } jwidth = json_object_array_get_idx(jwindow, 0); jheight = json_object_array_get_idx(jwindow, 1); width = json_object_get_int(jwidth); height = json_object_get_int(jheight); window->setFullScreenMode(false); window->resize(width, height); } } /** * @brief Save the state of the Main window spliter. * * @param splitter: Input location for the splitter widget. */ void KsSession::saveSplitterSize(const QSplitter &splitter) { kshark_config_doc *spl = kshark_config_alloc(KS_CONFIG_JSON); json_object *jspl = json_object_new_array(); QList sizes = splitter.sizes(); json_object_array_put_idx(jspl, 0, json_object_new_int(sizes[0])); json_object_array_put_idx(jspl, 1, json_object_new_int(sizes[1])); spl->conf_doc = jspl; kshark_config_doc_add(_config, "Splitter", spl); } /** * @brief Load the state of the Main window spliter. * * @param splitter: Input location for the splitter widget. */ void KsSession::loadSplitterSize(QSplitter *splitter) { kshark_config_doc *spl = kshark_config_alloc(KS_CONFIG_JSON); json_object *jspl, *jgraphsize, *jviewsize; int graphSize(1), viewSize(1); QList sizes; if (!kshark_config_doc_get(_config, "Splitter", spl)) return; if (_config->format == KS_CONFIG_JSON) { jspl = KS_JSON_CAST(spl->conf_doc); jgraphsize = json_object_array_get_idx(jspl, 0); jviewsize = json_object_array_get_idx(jspl, 1); graphSize = json_object_get_int(jgraphsize); viewSize = json_object_get_int(jviewsize); if (graphSize == 0 && viewSize == 0) { /* 0/0 spliter ratio is undefined. Make it 1/1. */ viewSize = graphSize = 1; } } sizes << graphSize << viewSize; splitter->setSizes(sizes); } /** @brief Save the Color scheme used. */ void KsSession::saveColorScheme() { kshark_config_doc *colSch = kshark_config_alloc(KS_CONFIG_JSON); double s = KsPlot::Color::getRainbowFrequency(); colSch->conf_doc = json_object_new_double(s); kshark_config_doc_add(_config, "ColorScheme", colSch); } /** @brief Get the Color scheme used. */ float KsSession::getColorScheme() { kshark_config_doc *colSch = kshark_config_alloc(KS_CONFIG_JSON); /* Default color scheme. */ float s = 0.75; if (!kshark_config_doc_get(_config, "ColorScheme", colSch)) return s; if (_config->format == KS_CONFIG_JSON) s = json_object_get_double(KS_JSON_CAST(colSch->conf_doc)); return s; } /** * @brief Save the list of the graphs plotted. * * @param glw: Input location for the KsGLWidget widget. */ void KsSession::saveGraphs(const KsGLWidget &glw) { _saveCPUPlots(glw._cpuList); _saveTaskPlots(glw._taskList); } /** * @brief Load the list of the graphs and plot. * * @param graphs: Input location for the KsTraceGraph widget. */ void KsSession::loadGraphs(KsTraceGraph *graphs) { graphs->cpuReDraw(_getCPUPlots()); graphs->taskReDraw(_getTaskPlots()); } void KsSession::_saveCPUPlots(const QVector &cpus) { kshark_config_doc *cpuPlts = kshark_config_alloc(KS_CONFIG_JSON); json_object *jcpus = json_object_new_array(); for (int i = 0; i < cpus.count(); ++i) { json_object *jcpu = json_object_new_int(cpus[i]); json_object_array_put_idx(jcpus, i, jcpu); } cpuPlts->conf_doc = jcpus; kshark_config_doc_add(_config, "CPUPlots", cpuPlts); } QVector KsSession::_getCPUPlots() { kshark_config_doc *cpuPlts = kshark_config_alloc(KS_CONFIG_JSON); json_object *jcpus; QVector cpus; size_t length; if (!kshark_config_doc_get(_config, "CPUPlots", cpuPlts)) return cpus; if (_config->format == KS_CONFIG_JSON) { jcpus = KS_JSON_CAST(cpuPlts->conf_doc); length = json_object_array_length(jcpus); for (size_t i = 0; i < length; ++i) { int cpu = json_object_get_int(json_object_array_get_idx(jcpus, i)); cpus.append(cpu); } } return cpus; } void KsSession::_saveTaskPlots(const QVector &tasks) { kshark_config_doc *taskPlts = kshark_config_alloc(KS_CONFIG_JSON); json_object *jtasks = json_object_new_array(); for (int i = 0; i < tasks.count(); ++i) { json_object *jtask = json_object_new_int(tasks[i]); json_object_array_put_idx(jtasks, i, jtask); } taskPlts->conf_doc = jtasks; kshark_config_doc_add(_config, "TaskPlots", taskPlts); } QVector KsSession::_getTaskPlots() { kshark_config_doc *taskPlts = kshark_config_alloc(KS_CONFIG_JSON); json_object *jtasks; QVector tasks; size_t length; if (!kshark_config_doc_get(_config, "TaskPlots", taskPlts)) return tasks; if (_config->format == KS_CONFIG_JSON) { jtasks = KS_JSON_CAST(taskPlts->conf_doc); length = json_object_array_length(jtasks); for (size_t i = 0; i < length; ++i) { int pid = json_object_get_int(json_object_array_get_idx(jtasks, i)); tasks.append(pid); } } return tasks; } /** * @brief Save the state of the Dual marker. * * @param dm: Input location for the KsDualMarkerSM object. */ void KsSession::saveDualMarker(KsDualMarkerSM *dm) { struct kshark_config_doc *markers = kshark_config_new("kshark.config.markers", KS_CONFIG_JSON); json_object *jd_mark = KS_JSON_CAST(markers->conf_doc); auto save_mark = [&jd_mark] (KsGraphMark *m, const char *name) { json_object *jmark = json_object_new_object(); if (m->_isSet) { json_object_object_add(jmark, "isSet", json_object_new_boolean(true)); json_object_object_add(jmark, "row", json_object_new_int(m->_pos)); } else { json_object_object_add(jmark, "isSet", json_object_new_boolean(false)); } json_object_object_add(jd_mark, name, jmark); }; save_mark(&dm->markerA(), "markA"); save_mark(&dm->markerB(), "markB"); if (dm->getState() == DualMarkerState::A) json_object_object_add(jd_mark, "Active", json_object_new_string("A")); else json_object_object_add(jd_mark, "Active", json_object_new_string("B")); kshark_config_doc_add(_config, "Markers", markers); } /** * @brief Load the state of the Dual marker. * * @param dm: Input location for the KsDualMarkerSM object. * @param graphs: Input location for the KsTraceGraph widget. */ void KsSession::loadDualMarker(KsDualMarkerSM *dm, KsTraceGraph *graphs) { size_t pos; dm->reset(); dm->setState(DualMarkerState::A); if (_getMarker("markA", &pos)) { graphs->markEntry(pos); } else { dm->markerA().remove(); } dm->setState(DualMarkerState::B); if (_getMarker("markB", &pos)) { graphs->markEntry(pos); } else { dm->markerB().remove(); } dm->setState(_getMarkerState()); if (dm->activeMarker()._isSet) { pos = dm->activeMarker()._pos; emit graphs->glPtr()->updateView(pos, true); } } json_object *KsSession::_getMarkerJson() { struct kshark_config_doc *markers = kshark_config_alloc(KS_CONFIG_JSON); if (!kshark_config_doc_get(_config, "Markers", markers) || !kshark_type_check(markers, "kshark.config.markers")) return nullptr; return KS_JSON_CAST(markers->conf_doc); } bool KsSession::_getMarker(const char* name, size_t *pos) { json_object *jd_mark, *jmark; *pos = 0; jd_mark = _getMarkerJson(); if (!jd_mark) return false; if (json_object_object_get_ex(jd_mark, name, &jmark)) { json_object *jis_set; json_object_object_get_ex(jmark, "isSet", &jis_set); if (!json_object_get_boolean(jis_set)) return false; json_object *jpos; json_object_object_get_ex(jmark, "row", &jpos); *pos = json_object_get_int64(jpos); } return true; } DualMarkerState KsSession::_getMarkerState() { json_object *jd_mark, *jstate; const char* state; jd_mark = _getMarkerJson(); json_object_object_get_ex(jd_mark, "Active", &jstate); state = json_object_get_string(jstate); if (strcmp(state, "A") == 0) return DualMarkerState::A; return DualMarkerState::B; } /** * @brief Save the configuration of the plugins. * * @param pm: Input location for the KsPluginManager object. */ void KsSession::savePlugins(const KsPluginManager &pm) { struct kshark_config_doc *plugins = kshark_config_new("kshark.config.plugins", KS_CONFIG_JSON); json_object *jplugins = KS_JSON_CAST(plugins->conf_doc); const QVector ®isteredPlugins = pm._registeredKsPlugins; const QStringList &pluginList = pm._ksPluginList; int nPlugins = pluginList.length(); json_object *jlist, *jpl; QByteArray array; char* buffer; bool active; jlist = json_object_new_array(); for (int i = 0; i < nPlugins; ++i) { array = pluginList[i].toLocal8Bit(); buffer = array.data(); jpl = json_object_new_array(); json_object_array_put_idx(jpl, 0, json_object_new_string(buffer)); active = registeredPlugins[i]; json_object_array_put_idx(jpl, 1, json_object_new_boolean(active)); json_object_array_put_idx(jlist, i, jpl); } json_object_object_add(jplugins, "Plugin List", jlist); kshark_config_doc_add(_config, "Plugins", plugins); } /** * @brief Load the configuration of the plugins. * * @param kshark_ctx: Input location for context pointer. * @param pm: Input location for the KsPluginManager object. */ void KsSession::loadPlugins(kshark_context *kshark_ctx, KsPluginManager *pm) { kshark_config_doc *plugins = kshark_config_alloc(KS_CONFIG_JSON); json_object *jplugins, *jlist, *jpl; const char *pluginName; QVector pluginIds; int length, index; bool loaded; if (!kshark_config_doc_get(_config, "Plugins", plugins) || !kshark_type_check(plugins, "kshark.config.plugins")) return; if (plugins->format == KS_CONFIG_JSON) { jplugins = KS_JSON_CAST(plugins->conf_doc); json_object_object_get_ex(jplugins, "Plugin List", &jlist); if (!jlist || json_object_get_type(jlist) != json_type_array || !json_object_array_length(jlist)) return; length = json_object_array_length(jlist); for (int i = 0; i < length; ++i) { jpl = json_object_array_get_idx(jlist, i); pluginName = json_object_get_string(json_object_array_get_idx(jpl, 0)); index = pm->_ksPluginList.indexOf(pluginName); loaded = json_object_get_boolean(json_object_array_get_idx(jpl, 1)); if (index >= 0 && loaded) pluginIds.append(index); } } pm->updatePlugins(pluginIds); } trace-cmd-v2.9.6/kernel-shark/src/KsSession.hpp000066400000000000000000000041261414302661500213710ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsSession.hpp * @brief KernelShark Session. */ #ifndef _KS_SESSION_H #define _KS_SESSION_H // Qt #include // KernelShark #include "KsDualMarker.hpp" #include "KsTraceGraph.hpp" #include "KsTraceViewer.hpp" class KsMainWindow; /** * The KsSession class provides instruments for importing/exporting the state * of the different components of the GUI from/to Json documents. These * instruments are used to save/load user session in the GUI. */ class KsSession { public: KsSession(); virtual ~KsSession(); /** Get the configuration document object. */ kshark_config_doc *getConfDocPtr() const {return _config;} bool importFromFile(QString jfileName); void exportToFile(QString jfileName); void saveDataFile(QString fileName); QString getDataFile(kshark_context *kshark_ctx); void saveVisModel(kshark_trace_histo *histo); void loadVisModel(KsGraphModel *model); void saveGraphs(const KsGLWidget &glw); void loadGraphs(KsTraceGraph *graphs); void saveFilters(kshark_context *kshark_ctx); void loadFilters(kshark_context *kshark_ctx, KsDataStore *data); void saveMainWindowSize(const QMainWindow &window); void loadMainWindowSize(KsMainWindow *window); void saveSplitterSize(const QSplitter &splitter); void loadSplitterSize(QSplitter *splitter); void saveDualMarker(KsDualMarkerSM *dm); void loadDualMarker(KsDualMarkerSM *dmm, KsTraceGraph *graphs); void savePlugins(const KsPluginManager &pm); void loadPlugins(kshark_context *kshark_ctx, KsPluginManager *pm); void saveTable(const KsTraceViewer &view); void loadTable(KsTraceViewer *view); void saveColorScheme(); float getColorScheme(); private: kshark_config_doc *_config; json_object *_getMarkerJson(); void _saveCPUPlots(const QVector &cpus); QVector _getCPUPlots(); void _saveTaskPlots(const QVector &tasks); QVector _getTaskPlots(); bool _getMarker(const char* name, size_t *pos); DualMarkerState _getMarkerState(); }; #endif trace-cmd-v2.9.6/kernel-shark/src/KsTraceGraph.cpp000066400000000000000000000510271414302661500217630ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsTraceGraph.cpp * @brief KernelShark Trace Graph widget. */ // KernelShark #include "KsUtils.hpp" #include "KsDualMarker.hpp" #include "KsTraceGraph.hpp" #include "KsQuickContextMenu.hpp" /** Create a default (empty) Trace graph widget. */ KsTraceGraph::KsTraceGraph(QWidget *parent) : QWidget(parent), _pointerBar(this), _navigationBar(this), _zoomInButton("+", this), _quickZoomInButton("++", this), _zoomOutButton("-", this), _quickZoomOutButton("- -", this), _scrollLeftButton("<", this), _scrollRightButton(">", this), _labelP1("Pointer: ", this), _labelP2("", this), _labelI1("", this), _labelI2("", this), _labelI3("", this), _labelI4("", this), _labelI5("", this), _scrollArea(this), _drawWindow(&_scrollArea), _legendWindow(&_drawWindow), _legendAxisX(&_drawWindow), _labelXMin("", &_legendAxisX), _labelXMid("", &_legendAxisX), _labelXMax("", &_legendAxisX), _glWindow(&_drawWindow), _mState(nullptr), _data(nullptr), _keyPressed(false) { auto lamMakeNavButton = [&](QPushButton *b) { b->setMaximumWidth(FONT_WIDTH * 5); connect(b, &QPushButton::released, this, &KsTraceGraph::_stopUpdating); _navigationBar.addWidget(b); }; _pointerBar.setMaximumHeight(FONT_HEIGHT * 1.75); _pointerBar.setOrientation(Qt::Horizontal); _navigationBar.setMaximumHeight(FONT_HEIGHT * 1.75); _navigationBar.setMinimumWidth(FONT_WIDTH * 90); _navigationBar.setOrientation(Qt::Horizontal); _pointerBar.addWidget(&_labelP1); _labelP2.setFrameStyle(QFrame::Panel | QFrame::Sunken); _labelP2.setStyleSheet("QLabel { background-color : white; color: black}"); _labelP2.setTextInteractionFlags(Qt::TextSelectableByMouse); _labelP2.setFixedWidth(FONT_WIDTH * 16); _pointerBar.addWidget(&_labelP2); _pointerBar.addSeparator(); _labelI1.setStyleSheet("QLabel {color : blue;}"); _labelI2.setStyleSheet("QLabel {color : green;}"); _labelI3.setStyleSheet("QLabel {color : red;}"); _labelI4.setStyleSheet("QLabel {color : blue;}"); _labelI5.setStyleSheet("QLabel {color : green;}"); _pointerBar.addWidget(&_labelI1); _pointerBar.addSeparator(); _pointerBar.addWidget(&_labelI2); _pointerBar.addSeparator(); _pointerBar.addWidget(&_labelI3); _pointerBar.addSeparator(); _pointerBar.addWidget(&_labelI4); _pointerBar.addSeparator(); _pointerBar.addWidget(&_labelI5); _legendAxisX.setFixedHeight(FONT_HEIGHT * 1.5); _legendAxisX.setLayout(new QHBoxLayout); _legendAxisX.layout()->setSpacing(0); _legendAxisX.layout()->setContentsMargins(0, 0, FONT_WIDTH, 0); _labelXMin.setAlignment(Qt::AlignLeft); _labelXMid.setAlignment(Qt::AlignHCenter); _labelXMax.setAlignment(Qt::AlignRight); _legendAxisX.layout()->addWidget(&_labelXMin); _legendAxisX.layout()->addWidget(&_labelXMid); _legendAxisX.layout()->addWidget(&_labelXMax); _legendAxisX.setStyleSheet("QLabel { background-color : white; color: black}"); _drawWindow.setMinimumSize(100, 100); _drawWindow.setStyleSheet("QWidget {background-color : white;}"); _drawLayout.setContentsMargins(0, 0, 0, 0); _drawLayout.setSpacing(0); _drawLayout.addWidget(&_legendAxisX, 0, 1); _drawLayout.addWidget(&_legendWindow, 1, 0); _drawLayout.addWidget(&_glWindow, 1, 1); _drawWindow.setLayout(&_drawLayout); _drawWindow.installEventFilter(this); connect(&_glWindow, &KsGLWidget::select, this, &KsTraceGraph::markEntry); connect(&_glWindow, &KsGLWidget::found, this, &KsTraceGraph::_setPointerInfo); connect(&_glWindow, &KsGLWidget::notFound, this, &KsTraceGraph::_resetPointer); connect(&_glWindow, &KsGLWidget::zoomIn, this, &KsTraceGraph::_zoomIn); connect(&_glWindow, &KsGLWidget::zoomOut, this, &KsTraceGraph::_zoomOut); connect(&_glWindow, &KsGLWidget::scrollLeft, this, &KsTraceGraph::_scrollLeft); connect(&_glWindow, &KsGLWidget::scrollRight, this, &KsTraceGraph::_scrollRight); connect(&_glWindow, &KsGLWidget::stopUpdating, this, &KsTraceGraph::_stopUpdating); connect(_glWindow.model(), &KsGraphModel::modelReset, this, &KsTraceGraph::_updateTimeLegends); _glWindow.setContextMenuPolicy(Qt::CustomContextMenu); connect(&_glWindow, &QWidget::customContextMenuRequested, this, &KsTraceGraph::_onCustomContextMenu); _scrollArea.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); _scrollArea.setWidget(&_drawWindow); lamMakeNavButton(&_scrollLeftButton); connect(&_scrollLeftButton, &QPushButton::pressed, this, &KsTraceGraph::_scrollLeft); lamMakeNavButton(&_zoomInButton); connect(&_zoomInButton, &QPushButton::pressed, this, &KsTraceGraph::_zoomIn); lamMakeNavButton(&_zoomOutButton); connect(&_zoomOutButton, &QPushButton::pressed, this, &KsTraceGraph::_zoomOut); lamMakeNavButton(&_scrollRightButton); connect(&_scrollRightButton, &QPushButton::pressed, this, &KsTraceGraph::_scrollRight); _navigationBar.addSeparator(); lamMakeNavButton(&_quickZoomInButton); connect(&_quickZoomInButton, &QPushButton::pressed, this, &KsTraceGraph::_quickZoomIn); lamMakeNavButton(&_quickZoomOutButton); connect(&_quickZoomOutButton, &QPushButton::pressed, this, &KsTraceGraph::_quickZoomOut); _layout.addWidget(&_pointerBar); _layout.addWidget(&_navigationBar); _layout.addWidget(&_scrollArea); this->setLayout(&_layout); updateGeom(); } /** * @brief Load and show trace data. * * @param data: Input location for the KsDataStore object. * KsDataStore::loadDataFile() must be called first. */ void KsTraceGraph::loadData(KsDataStore *data) { _data = data; _glWindow.loadData(data); _updateGraphLegends(); updateGeom(); } /** Connect the KsGLWidget widget and the State machine of the Dual marker. */ void KsTraceGraph::setMarkerSM(KsDualMarkerSM *m) { _mState = m; _navigationBar.addSeparator(); _mState->placeInToolBar(&_navigationBar); _glWindow.setMarkerSM(m); } /** Reset (empty) the widget. */ void KsTraceGraph::reset() { /* Reset (empty) the OpenGL widget. */ _glWindow.reset(); _labelP2.setText(""); for (auto l1: {&_labelI1, &_labelI2, &_labelI3, &_labelI4, &_labelI5}) l1->setText(""); _selfUpdate(); for (auto l2: {&_labelXMin, &_labelXMid, &_labelXMax}) l2->setText(""); } void KsTraceGraph::_selfUpdate() { _updateGraphLegends(); _updateTimeLegends(); _markerReDraw(); _glWindow.model()->update(); updateGeom(); } void KsTraceGraph::_zoomIn() { _updateGraphs(GraphActions::ZoomIn); } void KsTraceGraph::_zoomOut() { _updateGraphs(GraphActions::ZoomOut); } void KsTraceGraph::_quickZoomIn() { if (_glWindow.isEmpty()) return; /* Bin size will be 100 ns. */ _glWindow.model()->quickZoomIn(100); if (_mState->activeMarker()._isSet && _mState->activeMarker().isVisible()) { /* * Use the position of the active marker as * a focus point of the zoom. */ uint64_t ts = _mState->activeMarker()._ts; _glWindow.model()->jumpTo(ts); } } void KsTraceGraph::_quickZoomOut() { if (_glWindow.isEmpty()) return; _glWindow.model()->quickZoomOut(); } void KsTraceGraph::_scrollLeft() { _updateGraphs(GraphActions::ScrollLeft); } void KsTraceGraph::_scrollRight() { _updateGraphs(GraphActions::ScrollRight); } void KsTraceGraph::_stopUpdating() { /* * The user is no longer pressing the action button. Reset the * "Key Pressed" flag. This will stop the ongoing user action. */ _keyPressed = false; } QString KsTraceGraph::_t2str(uint64_t sec, uint64_t usec) { QString usecStr; QTextStream ts(&usecStr); ts.setFieldAlignment(QTextStream::AlignRight); ts.setFieldWidth(6); ts.setPadChar('0'); ts << usec; return QString::number(sec) + "." + usecStr; } void KsTraceGraph::_resetPointer(uint64_t ts, int cpu, int pid) { uint64_t sec, usec; kshark_convert_nano(ts, &sec, &usec); _labelP2.setText(_t2str(sec, usec)); if (pid > 0 && cpu >= 0) { struct kshark_context *kshark_ctx(NULL); if (!kshark_instance(&kshark_ctx)) return; QString comm(tep_data_comm_from_pid(kshark_ctx->pevent, pid)); comm.append("-"); comm.append(QString("%1").arg(pid)); _labelI1.setText(comm); _labelI2.setText(QString("CPU %1").arg(cpu)); } else { _labelI1.setText(""); _labelI2.setText(""); } for (auto const &l: {&_labelI3, &_labelI4, &_labelI5}) { l->setText(""); } } void KsTraceGraph::_setPointerInfo(size_t i) { kshark_entry *e = _data->rows()[i]; QString event(kshark_get_event_name_easy(e)); QString lat(kshark_get_latency_easy(e)); QString info(kshark_get_info_easy(e)); QString comm(kshark_get_task_easy(e)); int labelWidth, width; QString elidedText; uint64_t sec, usec; kshark_convert_nano(e->ts, &sec, &usec); _labelP2.setText(_t2str(sec, usec)); comm.append("-"); comm.append(QString("%1").arg(kshark_get_pid_easy(e))); _labelI1.setText(comm); _labelI2.setText(QString("CPU %1").arg(e->cpu)); _labelI3.setText(lat); _labelI4.setText(event); _labelI5.setText(info); QCoreApplication::processEvents(); labelWidth = _pointerBar.geometry().right() - _labelI4.geometry().right(); if (labelWidth > STRING_WIDTH(info) + FONT_WIDTH * 5) return; /* * The Info string is too long and cannot be displayed on the toolbar. * Try to fit the text in the available space. */ QFontMetrics metrix(_labelI5.font()); width = labelWidth - FONT_WIDTH * 3; elidedText = metrix.elidedText(info, Qt::ElideRight, width); while(labelWidth < STRING_WIDTH(elidedText) + FONT_WIDTH * 5) { width -= FONT_WIDTH * 3; elidedText = metrix.elidedText(info, Qt::ElideRight, width); } _labelI5.setText(elidedText); _labelI5.setVisible(true); QCoreApplication::processEvents(); } /** * @brief Use the active marker to select particular entry. * * @param row: The index of the entry to be selected by the marker. */ void KsTraceGraph::markEntry(size_t row) { int graph, cpuGrId, taskGrId; _glWindow.findGraphIds(*_data->rows()[row], &cpuGrId, &taskGrId); /* * If a Task graph has been found, this Task graph will be * visible. If no Task graph has been found, make visible * the corresponding CPU graph. */ if (taskGrId >= 0) graph = taskGrId; else graph = cpuGrId; _scrollArea.ensureVisible(0, _legendAxisX.height() + _glWindow.vMargin() + KS_GRAPH_HEIGHT / 2 + graph*(KS_GRAPH_HEIGHT + _glWindow.vSpacing()), 50, KS_GRAPH_HEIGHT / 2 + _glWindow.vSpacing() / 2); _glWindow.model()->jumpTo(_data->rows()[row]->ts); _mState->activeMarker().set(*_data, _glWindow.model()->histo(), row, cpuGrId, taskGrId); _mState->updateMarkers(*_data, &_glWindow); } void KsTraceGraph::_markerReDraw() { int cpuGrId, taskGrId; size_t row; if (_mState->markerA()._isSet) { row = _mState->markerA()._pos; _glWindow.findGraphIds(*_data->rows()[row], &cpuGrId, &taskGrId); _mState->markerA().set(*_data, _glWindow.model()->histo(), row, cpuGrId, taskGrId); } if (_mState->markerB()._isSet) { row = _mState->markerB()._pos; _glWindow.findGraphIds(*_data->rows()[row], &cpuGrId, &taskGrId); _mState->markerB().set(*_data, _glWindow.model()->histo(), row, cpuGrId, taskGrId); } } /** * @brief Redreaw all CPU graphs. * * @param v: CPU ids to be plotted. */ void KsTraceGraph::cpuReDraw(QVector v) { _glWindow._cpuList = v; _selfUpdate(); } /** * @brief Redreaw all Task graphs. * * @param v: Process ids of the tasks to be plotted. */ void KsTraceGraph::taskReDraw(QVector v) { _glWindow._taskList = v; _selfUpdate(); } /** Add (and plot) a CPU graph to the existing list of CPU graphs. */ void KsTraceGraph::addCPUPlot(int cpu) { if (_glWindow._cpuList.contains(cpu)) return; _glWindow._cpuList.append(cpu); std::sort(_glWindow._cpuList.begin(), _glWindow._cpuList.end()); _selfUpdate(); } /** Add (and plot) a Task graph to the existing list of Task graphs. */ void KsTraceGraph::addTaskPlot(int pid) { if (_glWindow._taskList.contains(pid)) return; _glWindow._taskList.append(pid); std::sort(_glWindow._taskList.begin(), _glWindow._taskList.end()); _selfUpdate(); } /** Remove a CPU graph from the existing list of CPU graphs. */ void KsTraceGraph::removeCPUPlot(int cpu) { if (!_glWindow._cpuList.contains(cpu)) return; _glWindow._cpuList.removeAll(cpu); _selfUpdate(); } /** Remove a Task graph from the existing list of Task graphs. */ void KsTraceGraph::removeTaskPlot(int pid) { if (!_glWindow._taskList.contains(pid)) return; _glWindow._taskList.removeAll(pid); _selfUpdate(); } /** Update the content of all graphs. */ void KsTraceGraph::update(KsDataStore *data) { _glWindow.model()->update(data); _selfUpdate(); } /** Update the geometry of the widget. */ void KsTraceGraph::updateGeom() { int saWidth, saHeight, dwWidth, hMin; /* Set the size of the Scroll Area. */ saWidth = width() - _layout.contentsMargins().left() - _layout.contentsMargins().right(); saHeight = height() - _pointerBar.height() - _navigationBar.height() - _layout.spacing() * 2 - _layout.contentsMargins().top() - _layout.contentsMargins().bottom(); _scrollArea.resize(saWidth, saHeight); /* * Calculate the width of the Draw Window, taking into account the size * of the scroll bar. */ dwWidth = _scrollArea.width(); if (_glWindow.height() + _legendAxisX.height() > _scrollArea.height()) dwWidth -= qApp->style()->pixelMetric(QStyle::PM_ScrollBarExtent); /* * Set the height of the Draw window according to the number of * plotted graphs. */ _drawWindow.resize(dwWidth, _glWindow.height() + _legendAxisX.height()); /* Set the minimum height of the Graph widget. */ hMin = _drawWindow.height() + _pointerBar.height() + _navigationBar.height() + _layout.contentsMargins().top() + _layout.contentsMargins().bottom(); if (hMin > KS_GRAPH_HEIGHT * 8) hMin = KS_GRAPH_HEIGHT * 8; setMinimumHeight(hMin); /* * Now use the height of the Draw Window to fix the maximum height * of the Graph widget. */ setMaximumHeight(_drawWindow.height() + _pointerBar.height() + _navigationBar.height() + _layout.spacing() * 2 + _layout.contentsMargins().top() + _layout.contentsMargins().bottom() + 2); /* Just a little bit of extra space. This will * allow the scroll bar to disappear when the * widget is extended to maximum. */ _glWindow.update(); } void KsTraceGraph::_updateGraphLegends() { QString graphLegends, graphName; QVBoxLayout *layout; int width = 0; if (_legendWindow.layout()) { /* * Remove and delete the existing layout of the legend window. */ QLayoutItem *child; while ((child = _legendWindow.layout()->takeAt(0)) != 0) { delete child->widget(); delete child; } delete _legendWindow.layout(); } layout = new QVBoxLayout; layout->setContentsMargins(FONT_WIDTH, 0, 0, 0); layout->setSpacing(_glWindow.vSpacing()); layout->setAlignment(Qt::AlignTop); layout->addSpacing(_glWindow.vMargin()); auto lamMakeName = [&]() { QLabel *name = new QLabel(graphName); if (width < STRING_WIDTH(graphName)) width = STRING_WIDTH(graphName); name->setAlignment(Qt::AlignBottom); name->setStyleSheet("QLabel {background-color : white; color : black}"); name->setFixedHeight(KS_GRAPH_HEIGHT); layout->addWidget(name); }; for (auto const &cpu: _glWindow._cpuList) { graphName = QString("CPU %1").arg(cpu); lamMakeName(); } for (auto const &pid: _glWindow._taskList) { graphName = QString(tep_data_comm_from_pid(_data->tep(), pid)); graphName.append(QString("-%1").arg(pid)); lamMakeName(); } _legendWindow.setLayout(layout); _legendWindow.setMaximumWidth(width + FONT_WIDTH); } void KsTraceGraph::_updateTimeLegends() { uint64_t sec, usec, tsMid; kshark_convert_nano(_glWindow.model()->histo()->min, &sec, &usec); _labelXMin.setText(_t2str(sec, usec)); tsMid = (_glWindow.model()->histo()->min + _glWindow.model()->histo()->max) / 2; kshark_convert_nano(tsMid, &sec, &usec); _labelXMid.setText(_t2str(sec, usec)); kshark_convert_nano(_glWindow.model()->histo()->max, &sec, &usec); _labelXMax.setText(_t2str(sec, usec)); } /** * Reimplemented event handler used to update the geometry of the widget on * resize events. */ void KsTraceGraph::resizeEvent(QResizeEvent* event) { updateGeom(); } /** * Reimplemented event handler (overriding a virtual function from QObject) * used to detect the position of the mouse with respect to the Draw window and * according to this position to grab / release the focus of the keyboard. The * function has nothing to do with the filtering of the trace events. */ bool KsTraceGraph::eventFilter(QObject* obj, QEvent* evt) { if (obj == &_drawWindow && evt->type() == QEvent::Enter) _glWindow.setFocus(); if (obj == &_drawWindow && evt->type() == QEvent::Leave) _glWindow.clearFocus(); return QWidget::eventFilter(obj, evt); } void KsTraceGraph::_updateGraphs(GraphActions action) { double k; int bin; if (_glWindow.isEmpty()) return; /* * Set the "Key Pressed" flag. The flag will stay set as long as the user * keeps the corresponding action button pressed. */ _keyPressed = true; /* Initialize the zooming factor with a small value. */ k = .01; while (_keyPressed) { switch (action) { case GraphActions::ZoomIn: if (_mState->activeMarker()._isSet && _mState->activeMarker().isVisible()) { /* * Use the position of the active marker as * a focus point of the zoom. */ bin = _mState->activeMarker()._bin; _glWindow.model()->zoomIn(k, bin); } else { /* * The default focus point is the center of the * range interval of the model. */ _glWindow.model()->zoomIn(k); } break; case GraphActions::ZoomOut: if (_mState->activeMarker()._isSet && _mState->activeMarker().isVisible()) { /* * Use the position of the active marker as * a focus point of the zoom. */ bin = _mState->activeMarker()._bin; _glWindow.model()->zoomOut(k, bin); } else { /* * The default focus point is the center of the * range interval of the model. */ _glWindow.model()->zoomOut(k); } break; case GraphActions::ScrollLeft: _glWindow.model()->shiftBackward(10); break; case GraphActions::ScrollRight: _glWindow.model()->shiftForward(10); break; } /* * As long as the action button is pressed, the zooming factor * will grow smoothly until it reaches a maximum value. This * will have a visible effect of an accelerating zoom. */ if (k < .25) k *= 1.02; _mState->updateMarkers(*_data, &_glWindow); _updateTimeLegends(); QCoreApplication::processEvents(); } } void KsTraceGraph::_onCustomContextMenu(const QPoint &point) { KsQuickMarkerMenu *menu(nullptr); int cpu, pid; size_t row; bool found; found = _glWindow.find(point, 20, true, &row); if (found) { /* KernelShark entry has been found under the cursor. */ KsQuickContextMenu *entryMenu; menu = entryMenu = new KsQuickContextMenu(_data, row, _mState, this); connect(entryMenu, &KsQuickContextMenu::addTaskPlot, this, &KsTraceGraph::addTaskPlot); connect(entryMenu, &KsQuickContextMenu::addCPUPlot, this, &KsTraceGraph::addCPUPlot); connect(entryMenu, &KsQuickContextMenu::removeTaskPlot, this, &KsTraceGraph::removeTaskPlot); connect(entryMenu, &KsQuickContextMenu::removeCPUPlot, this, &KsTraceGraph::removeCPUPlot); } else { cpu = _glWindow.getPlotCPU(point); if (cpu >= 0) { /* * This is a CPU plot, but we do not have an entry * under the cursor. */ KsRmCPUPlotMenu *rmMenu; menu = rmMenu = new KsRmCPUPlotMenu(_mState, cpu, this); auto lamRmPlot = [&cpu, this] () { removeCPUPlot(cpu); }; connect(rmMenu, &KsRmPlotContextMenu::removePlot, lamRmPlot); } pid = _glWindow.getPlotPid(point); if (pid >= 0) { /* * This is a Task plot, but we do not have an entry * under the cursor. */ KsRmTaskPlotMenu *rmMenu; menu = rmMenu = new KsRmTaskPlotMenu(_mState, pid, this); auto lamRmPlot = [&pid, this] () { removeTaskPlot(pid); }; connect(rmMenu, &KsRmPlotContextMenu::removePlot, lamRmPlot); } } if (menu) { connect(menu, &KsQuickMarkerMenu::deselect, this, &KsTraceGraph::deselect); /* * Note that this slot was connected to the * customContextMenuRequested signal of the OpenGL widget. * Because of this the coordinates of the point are given with * respect to the frame of this widget. */ QPoint global = _glWindow.mapToGlobal(point); global.ry() -= menu->sizeHint().height() / 2; /* * Shift the menu so that it is not positioned under the mouse. * This will prevent from an accidental selection of the menu * item under the mouse. */ global.rx() += FONT_WIDTH; menu->exec(global); } } trace-cmd-v2.9.6/kernel-shark/src/KsTraceGraph.hpp000066400000000000000000000056231414302661500217710ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsTraceGraph.hpp * @brief KernelShark Trace Graph widget. */ #ifndef _KS_TRACEGRAPH_H #define _KS_TRACEGRAPH_H // KernelShark #include "KsGLWidget.hpp" /** * Scroll Area class, needed in order to reimplemented the handler for mouse * wheel events. */ class KsGraphScrollArea : public QScrollArea { public: /** Create a default Scroll Area. */ explicit KsGraphScrollArea(QWidget *parent = nullptr) : QScrollArea(parent) {} /** * Reimplemented handler for mouse wheel events. All mouse wheel * events will be ignored. */ void wheelEvent(QWheelEvent *evt) { if (QApplication::keyboardModifiers() != Qt::ControlModifier) QScrollArea::wheelEvent(evt); } }; /** * The KsTraceViewer class provides a widget for interactive visualization of * trace data shown as time-series. */ class KsTraceGraph : public QWidget { Q_OBJECT public: explicit KsTraceGraph(QWidget *parent = nullptr); void loadData(KsDataStore *data); void setMarkerSM(KsDualMarkerSM *m); void reset(); /** Get the KsGLWidget object. */ KsGLWidget *glPtr() {return &_glWindow;} void markEntry(size_t); void cpuReDraw(QVector); void taskReDraw(QVector); void addCPUPlot(int); void addTaskPlot(int); void removeCPUPlot(int); void removeTaskPlot(int); void update(KsDataStore *data); void updateGeom(); void resizeEvent(QResizeEvent* event) override; bool eventFilter(QObject* obj, QEvent* evt) override; signals: /** * This signal is emitted in the case of a right mouse button click or * in the case of a double click over an empty area (no visible * KernelShark entries). */ void deselect(); private: void _zoomIn(); void _zoomOut(); void _quickZoomIn(); void _quickZoomOut(); void _scrollLeft(); void _scrollRight(); void _stopUpdating(); void _resetPointer(uint64_t ts, int cpu, int pid); void _setPointerInfo(size_t); void _updateTimeLegends(); void _updateGraphLegends(); void _selfUpdate(); void _markerReDraw(); QString _t2str(uint64_t sec, uint64_t usec); enum class GraphActions { ZoomIn, ZoomOut, ScrollLeft, ScrollRight }; void _updateGraphs(GraphActions action); void _onCustomContextMenu(const QPoint &point); QToolBar _pointerBar, _navigationBar; QPushButton _zoomInButton, _quickZoomInButton; QPushButton _zoomOutButton, _quickZoomOutButton; QPushButton _scrollLeftButton, _scrollRightButton; QLabel _labelP1, _labelP2, // Pointer _labelI1, _labelI2, _labelI3, _labelI4, _labelI5; // Proc. info KsGraphScrollArea _scrollArea; QWidget _drawWindow, _legendWindow, _legendAxisX; QLabel _labelXMin, _labelXMid, _labelXMax; KsGLWidget _glWindow; QGridLayout _drawLayout; QVBoxLayout _layout; KsDualMarkerSM *_mState; KsDataStore *_data; bool _keyPressed; }; #endif // _KS_TRACEGRAPH_H trace-cmd-v2.9.6/kernel-shark/src/KsTraceViewer.cpp000066400000000000000000000517031414302661500221640ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsTraceViewer.cpp * @brief KernelShark Trace Viewer widget. */ // C++11 #include #include #include // KernelShark #include "KsQuickContextMenu.hpp" #include "KsTraceViewer.hpp" #include "KsWidgetsLib.hpp" /** * Reimplemented handler for mouse press events. Right mouse click events will * be ignored. This is done because we want the Right click is being used to * open a Context menu. */ void KsTableView::mousePressEvent(QMouseEvent *e) { if(e->button() == Qt::RightButton) return; QTableView::mousePressEvent(e); } /** * Reimplemented the handler for Auto-scrolling. With this we disable * the Horizontal Auto-scrolling. */ void KsTableView::scrollTo(const QModelIndex &index, ScrollHint hint) { int bottomMargin(2); if (hint == QAbstractItemView::EnsureVisible && index.row() > indexAt(rect().topLeft()).row() && index.row() < indexAt(rect().bottomLeft()).row() - bottomMargin) return; QTableView::scrollTo(index, hint); } /** Create a default (empty) Trace viewer widget. */ KsTraceViewer::KsTraceViewer(QWidget *parent) : QWidget(parent), _view(this), _model(this), _proxyModel(this), _tableHeader(_model.header()), _toolbar(this), _labelSearch("Search: Column", this), _labelGrFollows("Graph follows ", this), _searchFSM(this), _graphFollowsCheckBox(this), _graphFollows(true), _mState(nullptr), _data(nullptr) { this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); /* Make a search toolbar. */ _toolbar.setOrientation(Qt::Horizontal); _toolbar.setMaximumHeight(FONT_HEIGHT * 1.75); /* On the toolbar make two Combo boxes for the search settings. */ _toolbar.addWidget(&_labelSearch); _searchFSM._columnComboBox.addItems(_tableHeader); /* * Using the old Signal-Slot syntax because * QComboBox::currentIndexChanged has overloads. */ connect(&_searchFSM._columnComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(_searchEdit(int))); /* * Using the old Signal-Slot syntax because * QComboBox::currentIndexChanged has overloads. */ connect(&_searchFSM._selectComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(_searchEdit(int))); /* On the toolbar, make a Line edit field for search. */ _searchFSM._searchLineEdit.setMaximumWidth(FONT_WIDTH * 20); connect(&_searchFSM._searchLineEdit, &QLineEdit::returnPressed, this, &KsTraceViewer::_search); connect(&_searchFSM._searchLineEdit, &QLineEdit::textEdited, this, &KsTraceViewer::_searchEditText); /* On the toolbar, add Prev & Next buttons. */ connect(&_searchFSM._nextButton, &QPushButton::pressed, this, &KsTraceViewer::_next); connect(&_searchFSM._prevButton, &QPushButton::pressed, this, &KsTraceViewer::_prev); connect(&_searchFSM._searchStopButton, &QPushButton::pressed, this, &KsTraceViewer::_searchStop); connect(&_searchFSM._searchRestartButton, &QPushButton::pressed, this, &KsTraceViewer::_searchContinue); _searchFSM.placeInToolBar(&_toolbar); /* * On the toolbar, make a Check box for connecting the search pannel * to the Graph widget. */ _toolbar.addWidget(&_graphFollowsCheckBox); _toolbar.addWidget(&_labelGrFollows); _graphFollowsCheckBox.setCheckState(Qt::Checked); connect(&_graphFollowsCheckBox, &QCheckBox::stateChanged, this, &KsTraceViewer::_graphFollowsChanged); /* Initialize the trace viewer. */ _view.horizontalHeader()->setDefaultAlignment(Qt::AlignLeft); _view.verticalHeader()->setVisible(false); _view.setEditTriggers(QAbstractItemView::NoEditTriggers); _view.setSelectionBehavior(QAbstractItemView::SelectRows); _view.setSelectionMode(QAbstractItemView::SingleSelection); _view.verticalHeader()->setDefaultSectionSize(FONT_HEIGHT * 1.25); _proxyModel.setSource(&_model); _view.setModel(&_proxyModel); connect(&_proxyModel, &QAbstractItemModel::modelReset, this, &KsTraceViewer::_searchReset); _view.setContextMenuPolicy(Qt::CustomContextMenu); connect(&_view, &QWidget::customContextMenuRequested, this, &KsTraceViewer::_onCustomContextMenu); connect(&_view, &QTableView::clicked, this, &KsTraceViewer::_clicked); /* Set the layout. */ _layout.addWidget(&_toolbar); _layout.addWidget(&_view); this->setLayout(&_layout); } /** * @brief Load and show trace data. * * @param data: Input location for the KsDataStore object. * KsDataStore::loadDataFile() must be called first. */ void KsTraceViewer::loadData(KsDataStore *data) { _data = data; _model.reset(); _proxyModel.fill(data); _model.fill(data); this->_resizeToContents(); this->setMinimumHeight(SCREEN_HEIGHT / 5); } /** Connect the QTableView widget and the State machine of the Dual marker. */ void KsTraceViewer::setMarkerSM(KsDualMarkerSM *m) { QString styleSheetA, styleSheetB; _mState = m; _model.setColors(_mState->markerA()._color, _mState->markerB()._color); /* * Assign a property to State A of the Dual marker state machine. When * the marker is in State A the background color of the selected row * will be the same as the color of Marker A. */ styleSheetA = "selection-background-color : " + _mState->markerA()._color.name() + ";"; _mState->stateAPtr()->assignProperty(&_view, "styleSheet", styleSheetA); /* * Assign a property to State B. When the marker is in State B the * background color of the selected row will be the same as the color * of Marker B. */ styleSheetB = "selection-background-color : " + _mState->markerB()._color.name() + ";"; _mState->stateBPtr()->assignProperty(&_view, "styleSheet", styleSheetB); } /** Reset (empty) the table. */ void KsTraceViewer::reset() { this->setMinimumHeight(FONT_HEIGHT * 10); _model.reset(); _resizeToContents(); } void KsTraceViewer::_searchReset() { _searchFSM.handleInput(sm_input_t::Change); _proxyModel.searchReset(); } /** Get the index of the first (top) visible row. */ size_t KsTraceViewer::getTopRow() const { return _view.indexAt(_view.rect().topLeft()).row(); } /** Position given row at the top of the table. */ void KsTraceViewer::setTopRow(size_t r) { _view.scrollTo(_proxyModel.index(r, 0), QAbstractItemView::PositionAtTop); } /** Update the content of the table. */ void KsTraceViewer::update(KsDataStore *data) { /* The Proxy model has to be updated first! */ _proxyModel.fill(data); _model.update(data); _data = data; if (_mState->activeMarker()._isSet) showRow(_mState->activeMarker()._pos, true); } void KsTraceViewer::_onCustomContextMenu(const QPoint &point) { QModelIndex i = _view.indexAt(point); if (i.isValid()) { /* * Use the index of the proxy model to retrieve the value * of the row number in the source model. */ size_t row = _proxyModel.mapRowFromSource(i.row()); KsQuickContextMenu menu(_data, row, _mState, this); /* * Note that this slot was connected to the * customContextMenuRequested signal of the Table widget. * Because of this the coordinates of the point are given with * respect to the frame of this widget. */ QPoint global = _view.mapToGlobal(point); global.ry() -= menu.sizeHint().height() / 2; /* * Shift the menu so that it is not positioned under the mouse. * This will prevent from an accidental selection of the menu * item under the mouse. */ global.rx() += FONT_WIDTH; connect(&menu, &KsQuickContextMenu::addTaskPlot, this, &KsTraceViewer::addTaskPlot); connect(&menu, &KsQuickMarkerMenu::deselect, this, &KsTraceViewer::deselect); menu.exec(global); } } void KsTraceViewer::_searchEdit(int index) { _searchReset(); // The search has been modified. } void KsTraceViewer::_searchEditText(const QString &text) { _searchReset(); // The search has been modified. } void KsTraceViewer::_graphFollowsChanged(int state) { int row = selectedRow(); _graphFollows = (bool) state; if (_graphFollows && row != KS_NO_ROW_SELECTED) emit select(row); // Send a signal to the Graph widget. } void KsTraceViewer::_search() { if (!_searchDone()) { /* * The search is not done. This means that the search settings * have been modified since the last time we searched. */ _matchList.clear(); _searchItems(); if (!_matchList.empty()) { showRow(*_it, true); if (_graphFollows) emit select(*_it); // Send a signal to the Graph widget. } } else { /* * If the search is done, pressing "Enter" is equivalent * to pressing "Next" button. */ this->_next(); } } void KsTraceViewer::_next() { if (!_searchDone()) { _search(); return; } if (!_matchList.empty()) { // Items have been found. int row = selectedRow(); /* * The iterator can only be at the selected row or if the * selected row is not a match at the first matching row after * the selected one. */ if (*_it == row) { ++_it; // Move the iterator. if (_it == _matchList.end()) { /* * This is the last item of the list. * Go back to the beginning. */ _it = _matchList.begin(); } } // Select the row of the item. showRow(*_it, true); if (_graphFollows) emit select(*_it); // Send a signal to the Graph widget. } _updateSearchCount(); } void KsTraceViewer::_prev() { if (!_searchDone()) { _search(); return; } if (!_matchList.empty()) { // Items have been found. if (_it == _matchList.begin()) { // This is the first item of the list. Go to the last item. _it = _matchList.end() - 1; } else { --_it; // Move the iterator. } // Select the row of the item. showRow(*_it, true); if (_graphFollows) emit select(*_it); // Send a signal to the Graph widget. } _updateSearchCount(); } void KsTraceViewer::_updateSearchCount() { int index, total; QString countText; if (_matchList.isEmpty()) return; index = _it - _matchList.begin(); total =_matchList.count(); countText = QString(" %1 / %2").arg(index + 1).arg(total); _searchFSM._searchCountLabel.setText(countText); } void KsTraceViewer::_searchStop() { _proxyModel._searchStop = true; _searchFSM.handleInput(sm_input_t::Stop); } void KsTraceViewer::_searchContinue() { _proxyModel._searchStop = false; _searchItems(); } void KsTraceViewer::_clicked(const QModelIndex& i) { /* * Use the index of the proxy model to retrieve the value * of the row number in the base model. */ size_t row = _proxyModel.mapRowFromSource(i.row()); if (_searchDone() && _matchList.count()) { _setSearchIterator(row); _updateSearchCount(); } if (_graphFollows) emit select(row); // Send a signal to the Graph widget. } /** Make a given row of the table visible. */ void KsTraceViewer::showRow(size_t r, bool mark) { /* * Use the index in the source model to retrieve the value of the row number * in the proxy model. */ QModelIndex index = _proxyModel.mapFromSource(_model.index(r, 0)); if (mark) { // The row will be selected (colored). /* Get the first and the last visible rows of the table. */ int visiTot = _view.indexAt(_view.rect().topLeft()).row(); int visiBottom = _view.indexAt(_view.rect().bottomLeft()).row() - 2; /* Scroll only if the row to be shown in not vizible. */ if (index.row() < visiTot || index.row() > visiBottom) _view.scrollTo(index, QAbstractItemView::PositionAtCenter); _view.selectRow(index.row()); } else { /* * Just make sure that the row is visible. It will show up at * the top of the visible part of the table. */ _view.scrollTo(index, QAbstractItemView::PositionAtTop); } } /** Deselects the selected items (row) if any. */ void KsTraceViewer::clearSelection() { _view.clearSelection(); } /** Switch the Dual marker. */ void KsTraceViewer::markSwitch() { int row; /* The state of the Dual marker has changed. Get the new active marker. */ DualMarkerState state = _mState->getState(); /* First deal with the passive marker. */ if (_mState->getMarker(!state)._isSet) { /* * The passive marker is set. Use the model to color the row of * the passive marker. */ _model.selectRow(!state, _mState->getMarker(!state)._pos); } else { /* * The passive marker is not set. * Make sure that the model colors nothing. */ _model.selectRow(!state, KS_NO_ROW_SELECTED); } /* * Now deal with the active marker. This has to be done after dealing * with the model, because changing the model clears the selection. */ if (_mState->getMarker(state)._isSet) { /* * The active marker is set. Use QTableView to select its row. * The index in the source model is used to retrieve the value * of the row number in the proxy model. */ size_t row =_mState->getMarker(state)._pos; QModelIndex index = _proxyModel.mapFromSource(_model.index(row, 0)); if (index.isValid()) { /* * The row of the active marker will be colored according to * the assigned property of the current state of the Dual * marker. Auto-scrolling is temporarily disabled because we * do not want to scroll to the position of the marker yet. */ _view.setAutoScroll(false); _view.selectRow(index.row()); _view.setAutoScroll(true); } else { _view.clearSelection(); } } else { _view.clearSelection(); } row = selectedRow(); if (row >= 0) { _setSearchIterator(row); _updateSearchCount(); } } /** * Reimplemented event handler used to update the geometry of the widget on * resize events. */ void KsTraceViewer::resizeEvent(QResizeEvent* event) { int nColumns = _tableHeader.count(); int tableSize(0), viewSize, freeSpace; _resizeToContents(); for (int c = 0; c < nColumns; ++c) { tableSize += _view.columnWidth(c); } viewSize = _view.width() - qApp->style()->pixelMetric(QStyle::PM_ScrollBarExtent); if ((freeSpace = viewSize - tableSize) > 0) { _view.setColumnWidth(nColumns - 1, _view.columnWidth(nColumns - 1) + freeSpace - 2); /* Just a little bit less space. * This will allow the scroll bar * to disappear when the widget * is extended to maximum. */ } } /** * Reimplemented event handler used to move the active marker. */ void KsTraceViewer::keyReleaseEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Up || event->key() == Qt::Key_Down) { int row = selectedRow(); if (row >= 0) emit select(row); // Send a signal to the Graph widget. return; } QWidget::keyReleaseEvent(event); } void KsTraceViewer::_resizeToContents() { int rows, columnSize, markRow = selectedRow(); _view.setVisible(false); _view.resizeColumnsToContents(); _view.setVisible(true); /* * It looks like a Qt bug, but sometimes when no row is selected in * the table, the automatic resize of the widget (the lines above) has * the parasitic effect to select the first row of the table. */ if (markRow == KS_NO_ROW_SELECTED) _view.clearSelection(); /* * Because of some unknown reason the first column doesn't get * resized properly by the code above. We will resize this * column by hand. */ rows = _model.rowCount({}); columnSize = STRING_WIDTH(QString("%1").arg(rows)) + FONT_WIDTH; _view.setColumnWidth(0, columnSize); } //! @cond Doxygen_Suppress #define KS_SEARCH_SHOW_PROGRESS_MIN 100000 //! @endcond size_t KsTraceViewer::_searchItems() { int column = _searchFSM._columnComboBox.currentIndex(); QString searchText = _searchFSM._searchLineEdit.text(); int count, dataRow; if (searchText.isEmpty()) { /* * No text is provided by the user. Most probably this * is an accidental key press. */ return 0; } if (_proxyModel.rowCount({}) < KS_SEARCH_SHOW_PROGRESS_MIN) { /* * This is a small data-set. Do a single-threaded search * without showing the progress. We will bypass the state * switching, hence the search condition has to be updated * by hand. */ _searchFSM.updateCondition(); _proxyModel.search(column, searchText, _searchFSM.condition(), &_matchList, nullptr, nullptr); } else { _searchFSM.handleInput(sm_input_t::Start); if (column == KsViewModel::TRACE_VIEW_COL_INFO || column == KsViewModel::TRACE_VIEW_COL_LAT) _searchItemsST(); else _searchItemsMT(); } count = _matchList.count(); _searchFSM.handleInput(sm_input_t::Finish); if (count == 0) // No items have been found. Do nothing. return 0; dataRow = selectedRow(); if (dataRow >= 0) { _view.clearSelection(); _setSearchIterator(dataRow); showRow(*_it, true); if (_graphFollows) emit select(*_it); // Send a signal to the Graph widget. } else { /* Move the iterator to the beginning of the match list. */ _it = _matchList.begin(); } _updateSearchCount(); return count; } void KsTraceViewer::_setSearchIterator(int row) { _it = _matchList.begin(); if (_matchList.isEmpty()) return; /* * Move the iterator to the first element of the match list * after the selected one. */ while (*_it < row) { ++_it; // Move the iterator. if (_it == _matchList.end()) { /* * This is the last item of the list. Go back * to the beginning. */ _it = _matchList.begin(); break; } } } void KsTraceViewer::_searchItemsMT() { int nThreads = std::thread::hardware_concurrency(); int startFrom, nRows(_proxyModel.rowCount({})); std::vector> ranges(nThreads); std::vector>> maps; std::mutex lrs_mtx; auto lamLRSUpdate = [&] (int lastRowSearched) { std::lock_guard lock(lrs_mtx); if (_searchFSM._lastRowSearched > lastRowSearched || _searchFSM._lastRowSearched < 0) { /* * This thread has been slower and processed * less data. Take the place where it stopped * as a starting point of the next search. */ _searchFSM._lastRowSearched = lastRowSearched; } }; auto lamSearchMap = [&] (const int first, bool notify) { int lastRowSearched; QList list; list = _proxyModel.searchThread(_searchFSM._columnComboBox.currentIndex(), _searchFSM._searchLineEdit.text(), _searchFSM.condition(), nThreads, first, nRows - 1, &lastRowSearched, notify); lamLRSUpdate(lastRowSearched); return list; }; using merge_pair_t = std::pair; using merge_container_t = std::vector; auto lamComp = [] (const merge_pair_t& itemA, const merge_pair_t& itemB) { return itemA.second > itemB.second; }; using merge_queue_t = std::priority_queue; auto lamSearchMerge = [&] (QList &resultList, QVector< QList >&mapList) { merge_queue_t queue(lamComp); int id, stop(-1); auto pop = [&] () { if (queue.size() == 0) return stop; auto item = queue.top(); queue.pop(); if (!mapList[item.first].empty()) { /* * Replace the popped item with the next * matching item fron the same search thread. */ queue.push(std::make_pair(item.first, mapList[item.first].front())); mapList[item.first].pop_front(); } if (_searchFSM.getState() == search_state_t::Paused_s && item.second > _searchFSM._lastRowSearched) { /* * The search has been paused and we already * passed the last row searched by the slowest * search thread. Stop here and ignore all * following matches found by faster threads. */ return stop; } return item.second; }; for (int i = 0; i < mapList.size(); ++i) if ( mapList[i].count()) { queue.push(std::make_pair(i, mapList[i].front())); mapList[i].pop_front(); } id = pop(); while (id >= 0) { resultList.append(id); id = pop(); } }; startFrom = _searchFSM._lastRowSearched + 1; _searchFSM._lastRowSearched = -1; /* Start the thread that will update the progress bar. */ maps.push_back(std::async(lamSearchMap, startFrom, true)); // notify = true /* Start all other threads. */ for (int r = 1; r < nThreads; ++r) maps.push_back(std::async(lamSearchMap, startFrom + r, false)); // notify = false while (_searchFSM.getState() == search_state_t::InProgress_s && _proxyModel.searchProgress() < KS_PROGRESS_BAR_MAX - nThreads - 1) { std::unique_lock lk(_proxyModel._mutex); _proxyModel._pbCond.wait(lk); _searchFSM.setProgress(_proxyModel.searchProgress()); QApplication::processEvents(); } QVector> res; for (auto &m: maps) res.append(std::move(m.get())); lamSearchMerge(_matchList, res); } /** * @brief Color (select) the given row in the table, by using the color of the * Passive marker. * * @param row: The row index. If the Passive marker is selected and the input * value is negative, the Passive marker will be deselected. */ void KsTraceViewer::passiveMarkerSelectRow(int row) { DualMarkerState state = _mState->getState(); _view.setVisible(false); _model.selectRow(!state, row); _view.setVisible(true); } /** * Get the currently selected row. If no row is selected the function * returns KS_NO_ROW_SELECTED (-1). */ int KsTraceViewer::selectedRow() { QItemSelectionModel *sm = _view.selectionModel(); int dataRow = KS_NO_ROW_SELECTED; if (sm->hasSelection()) { /* Only one row at the time can be selected. */ QModelIndex i = sm->selectedRows()[0]; dataRow = _proxyModel.mapRowFromSource(i.row()); } return dataRow; } trace-cmd-v2.9.6/kernel-shark/src/KsTraceViewer.hpp000066400000000000000000000056231414302661500221710ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsTraceViewer.hpp * @brief KernelShark Trace Viewer widget. */ #ifndef _KS_TRACEVIEW_H #define _KS_TRACEVIEW_H // Qt #include // KernelShark #include "KsUtils.hpp" #include "KsModels.hpp" #include "KsSearchFSM.hpp" #include "KsDualMarker.hpp" /** * Table View class, needed in order to reimplemented the handler for mouse * press events. */ class KsTableView : public QTableView { Q_OBJECT public: /** Create KsTableView. */ explicit KsTableView(QWidget *parent = nullptr) : QTableView(parent) {}; void mousePressEvent(QMouseEvent *event) override; void scrollTo(const QModelIndex &index, ScrollHint hint) override; }; /** * The KsTraceViewer class provides a widget for browsing in the trace data * shown in a text form. */ class KsTraceViewer : public QWidget { Q_OBJECT public: explicit KsTraceViewer(QWidget *parent = nullptr); void loadData(KsDataStore *data); void setMarkerSM(KsDualMarkerSM *m); void reset(); size_t getTopRow() const; void setTopRow(size_t r); void resizeEvent(QResizeEvent* event) override; void keyReleaseEvent(QKeyEvent *event); void markSwitch(); void showRow(size_t r, bool mark); void clearSelection(); void passiveMarkerSelectRow(int row); int selectedRow(); void update(KsDataStore *data); signals: /** Signal emitted when new row is selected. */ void select(size_t); /** * This signal is used to re-emitted the addTaskPlot signal of the * KsQuickContextMenu. */ void addTaskPlot(int pid); /** * This signal is used to re-emitted the deselect signal of the * KsQuickMarkerMenu. */ void deselect(); private: QVBoxLayout _layout; KsTableView _view; KsViewModel _model; KsFilterProxyModel _proxyModel; QStringList _tableHeader; QToolBar _toolbar; QLabel _labelSearch, _labelGrFollows; KsSearchFSM _searchFSM; QCheckBox _graphFollowsCheckBox; bool _graphFollows; QList _matchList; QList::iterator _it; KsDualMarkerSM *_mState; KsDataStore *_data; enum Condition { Containes = 0, Match = 1, NotHave = 2 }; void _searchReset(); void _resizeToContents(); size_t _searchItems(); void _searchItemsST() {_proxyModel.search(&_searchFSM, &_matchList);} void _searchItemsMT(); void _searchEditText(const QString &); void _graphFollowsChanged(int); void _lockSearchPanel(bool lock); void _search(); void _next(); void _prev(); void _updateSearchCount(); void _searchStop(); void _searchContinue(); void _clicked(const QModelIndex& i); void _onCustomContextMenu(const QPoint &); void _setSearchIterator(int row); bool _searchDone() { return _searchFSM.getState() == search_state_t::Done_s || _searchFSM.getState() == search_state_t::Paused_s; } private slots: void _searchEdit(int); }; #endif // _KS_TRACEVIEW_H trace-cmd-v2.9.6/kernel-shark/src/KsUtils.cpp000066400000000000000000000517371414302661500210530ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsUtils.cpp * @brief KernelShark Utils. */ // KernelShark #include "KsUtils.hpp" #include "KsWidgetsLib.hpp" namespace KsUtils { /** @brief Get a sorted vector of CPU Ids. */ QVector getCPUList() { kshark_context *kshark_ctx(nullptr); int nCPUs; if (!kshark_instance(&kshark_ctx)) return {}; nCPUs = tep_get_cpus(kshark_ctx->pevent); QVector allCPUs = QVector(nCPUs); std::iota(allCPUs.begin(), allCPUs.end(), 0); return allCPUs; } /** @brief Get a sorted vector of Task's Pids. */ QVector getPidList() { kshark_context *kshark_ctx(nullptr); int nTasks, *tempPids; QVector pids; if (!kshark_instance(&kshark_ctx)) return pids; nTasks = kshark_get_task_pids(kshark_ctx, &tempPids); for (int r = 0; r < nTasks; ++r) { pids.append(tempPids[r]); } free(tempPids); std::sort(pids.begin(), pids.end()); return pids; } /** * @brief Get a sorted vector of Event Ids. */ QVector getEventIdList(tep_event_sort_type sortType) { kshark_context *kshark_ctx(nullptr); tep_event **events; int nEvts; if (!kshark_instance(&kshark_ctx)) return {}; nEvts = tep_get_events_count(kshark_ctx->pevent); events = tep_list_events(kshark_ctx->pevent, sortType); QVector allEvts(nEvts); for (int i = 0; i < nEvts; ++i) allEvts[i] = events[i]->id; return allEvts; } /** @brief Get a sorted vector of Id values of a filter. */ QVector getFilterIds(tracecmd_filter_id *filter) { kshark_context *kshark_ctx(nullptr); int *cpuFilter, n; QVector v; if (!kshark_instance(&kshark_ctx)) return v; cpuFilter = tracecmd_filter_ids(filter); n = filter->count; for (int i = 0; i < n; ++i) v.append(cpuFilter[i]); std::sort(v.begin(), v.end()); free(cpuFilter); return v; } /** * Set the bit of the filter mask of the kshark session context responsible * for the visibility of the events in the Table View. */ void listFilterSync(bool state) { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return; if (state) { kshark_ctx->filter_mask |= KS_TEXT_VIEW_FILTER_MASK; } else { kshark_ctx->filter_mask &= ~KS_TEXT_VIEW_FILTER_MASK; } } /** * Set the bit of the filter mask of the kshark session context responsible * for the visibility of the events in the Graph View. */ void graphFilterSync(bool state) { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return; if (state) { kshark_ctx->filter_mask |= KS_GRAPH_VIEW_FILTER_MASK; kshark_ctx->filter_mask |= KS_EVENT_VIEW_FILTER_MASK; } else { kshark_ctx->filter_mask &= ~KS_GRAPH_VIEW_FILTER_MASK; kshark_ctx->filter_mask &= ~KS_EVENT_VIEW_FILTER_MASK; } } /** * @brief Add a checkbox to a menu. * * @param menu: Input location for the menu object, to which the checkbox will be added. * @param name: The name of the checkbox. * * @returns The checkbox object; */ QCheckBox *addCheckBoxToMenu(QMenu *menu, QString name) { QWidget *containerWidget = new QWidget(menu); containerWidget->setLayout(new QHBoxLayout()); containerWidget->layout()->setContentsMargins(FONT_WIDTH, FONT_HEIGHT/5, FONT_WIDTH, FONT_HEIGHT/5); QCheckBox *checkBox = new QCheckBox(name, menu); containerWidget->layout()->addWidget(checkBox); QWidgetAction *action = new QWidgetAction(menu); action->setDefaultWidget(containerWidget); menu->addAction(action); return checkBox; } /** * @brief Simple CPU matching function to be user for data collections. * * @param kshark_ctx: Input location for the session context pointer. * @param e: kshark_entry to be checked. * @param cpu: Matching condition value. * * @returns True if the CPU of the entry matches the value of "cpu" and * the entry is visibility in Graph. Otherwise false. */ bool matchCPUVisible(struct kshark_context *kshark_ctx, struct kshark_entry *e, int cpu) { return (e->cpu == cpu && (e->visible & KS_GRAPH_VIEW_FILTER_MASK)); } /** * @brief Check if the application runs from its installation location. */ bool isInstalled() { QString appPath = QCoreApplication::applicationDirPath(); QString installPath(_INSTALL_PREFIX); installPath += "/bin"; installPath = QDir::cleanPath(installPath); return appPath == installPath; } static QString getFileDialog(QWidget *parent, const QString &windowName, const QString &filter, QString &lastFilePath, bool forSave) { QString fileName; if (lastFilePath.isEmpty()) { lastFilePath = isInstalled() ? QDir::homePath() : QDir::currentPath(); } if (forSave) { fileName = QFileDialog::getSaveFileName(parent, windowName, lastFilePath, filter); } else { fileName = QFileDialog::getOpenFileName(parent, windowName, lastFilePath, filter); } if (!fileName.isEmpty()) lastFilePath = QFileInfo(fileName).path(); return fileName; } static QStringList getFilesDialog(QWidget *parent, const QString &windowName, const QString &filter, QString &lastFilePath) { QStringList fileNames; if (lastFilePath.isEmpty()) { lastFilePath = isInstalled() ? QDir::homePath() : QDir::currentPath(); } fileNames = QFileDialog::getOpenFileNames(parent, windowName, lastFilePath, filter); if (!fileNames.isEmpty()) lastFilePath = QFileInfo(fileNames[0]).path(); return fileNames; } /** * @brief Open a standard Qt getFileName dialog and return the name of the * selected file. Only one file can be selected. */ QString getFile(QWidget *parent, const QString &windowName, const QString &filter, QString &lastFilePath) { return getFileDialog(parent, windowName, filter, lastFilePath, false); } /** * @brief Open a standard Qt getFileName dialog and return the names of the * selected files. Multiple files can be selected. */ QStringList getFiles(QWidget *parent, const QString &windowName, const QString &filter, QString &lastFilePath) { return getFilesDialog(parent, windowName, filter, lastFilePath); } /** * @brief Open a standard Qt getFileName dialog and return the name of the * selected file. Only one file can be selected. */ QString getSaveFile(QWidget *parent, const QString &windowName, const QString &filter, const QString &extension, QString &lastFilePath) { QString fileName = getFileDialog(parent, windowName, filter, lastFilePath, true); if (!fileName.isEmpty() && !fileName.endsWith(extension)) { fileName += extension; if (QFileInfo(fileName).exists()) { if (!KsWidgetsLib::fileExistsDialog(fileName)) fileName.clear(); } } return fileName; } /** * Separate the command line arguments inside the string taking into account * possible shell quoting and new lines. */ QStringList splitArguments(QString cmd) { QString::SplitBehavior opt = QString::SkipEmptyParts; int i, progress = 0, size; QStringList argv; QChar quote = 0; /* Remove all new lines. */ cmd.replace("\\\n", " "); size = cmd.count(); auto lamMid = [&] () {return cmd.mid(progress, i - progress);}; for (i = 0; i < size; ++i) { if (cmd[i] == '\\') { cmd.remove(i, 1); size --; continue; } if (cmd[i] == '\'' || cmd[i] == '"') { if (quote.isNull()) { argv << lamMid().split(" ", opt); quote = cmd[i++]; progress = i; } else if (quote == cmd[i]) { argv << lamMid(); quote = 0; progress = ++i; } } } argv << cmd.right(size - progress).split(" ", opt); return argv; } /** Parse a string containing Ids. The string can be of the form "1 4-7 9". */ QVector parseIdList(QString v_str) { QStringList list = v_str.split(",", QString::SkipEmptyParts); QVector v; for (auto item: list) { int i = item.indexOf('-'); if (i > 0) { /* This item is an interval. */ int to = item.right(item.size() - i - 1).toInt(); int from = item.left(i).toInt(); int s = v.size(); v.resize(s + to - from + 1); std::iota(v.begin() + s, v.end(), from); } else { v.append(item.toInt()); } } return v; } }; // KsUtils /** A stream operator for converting QColor into KsPlot::Color. */ KsPlot::Color& operator <<(KsPlot::Color &thisColor, const QColor &c) { thisColor.set(c.red(), c.green(), c.blue()); return thisColor; } /** Create a default (empty) KsDataStore. */ KsDataStore::KsDataStore(QWidget *parent) : QObject(parent), _tep(nullptr), _rows(nullptr), _dataSize(0) {} /** Destroy the KsDataStore object. */ KsDataStore::~KsDataStore() {} /** Load trace data for file. */ void KsDataStore::loadDataFile(const QString &file) { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return; clear(); if (!kshark_open(kshark_ctx, file.toStdString().c_str())) { qCritical() << "ERROR Loading file " << file; return; } _tep = kshark_ctx->pevent; if (kshark_ctx->event_handlers == nullptr) kshark_handle_plugins(kshark_ctx, KSHARK_PLUGIN_INIT); else kshark_handle_plugins(kshark_ctx, KSHARK_PLUGIN_UPDATE); _dataSize = kshark_load_data_entries(kshark_ctx, &_rows); } void KsDataStore::_freeData() { if (_dataSize > 0) { for (ssize_t r = 0; r < _dataSize; ++r) free(_rows[r]); free(_rows); } _rows = nullptr; _dataSize = 0; } /** Reload the trace data. */ void KsDataStore::reload() { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return; _freeData(); _dataSize = kshark_load_data_entries(kshark_ctx, &_rows); _tep = kshark_ctx->pevent; emit updateWidgets(this); } /** Free the loaded trace data and close the file. */ void KsDataStore::clear() { kshark_context *kshark_ctx(nullptr); _freeData(); _tep = nullptr; if (kshark_instance(&kshark_ctx) && kshark_ctx->handle) kshark_close(kshark_ctx); } /** Update the visibility of the entries (filter). */ void KsDataStore::update() { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return; _unregisterCPUCollections(); if (kshark_filter_is_set(kshark_ctx)) { kshark_filter_entries(kshark_ctx, _rows, _dataSize); emit updateWidgets(this); } registerCPUCollections(); } /** Register a collection of visible entries for each CPU. */ void KsDataStore::registerCPUCollections() { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx) || !kshark_filter_is_set(kshark_ctx)) return; int nCPUs = tep_get_cpus(_tep); for (int cpu = 0; cpu < nCPUs; ++cpu) { kshark_register_data_collection(kshark_ctx, _rows, _dataSize, KsUtils::matchCPUVisible, cpu, 0); } } void KsDataStore::_unregisterCPUCollections() { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return; int nCPUs = tep_get_cpus(_tep); for (int cpu = 0; cpu < nCPUs; ++cpu) { kshark_unregister_data_collection(&kshark_ctx->collections, KsUtils::matchCPUVisible, cpu); } } void KsDataStore::_applyIdFilter(int filterId, QVector vec) { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return; switch (filterId) { case KS_SHOW_EVENT_FILTER: case KS_HIDE_EVENT_FILTER: kshark_filter_clear(kshark_ctx, KS_SHOW_EVENT_FILTER); kshark_filter_clear(kshark_ctx, KS_HIDE_EVENT_FILTER); break; case KS_SHOW_TASK_FILTER: case KS_HIDE_TASK_FILTER: kshark_filter_clear(kshark_ctx, KS_SHOW_TASK_FILTER); kshark_filter_clear(kshark_ctx, KS_HIDE_TASK_FILTER); break; case KS_SHOW_CPU_FILTER: case KS_HIDE_CPU_FILTER: kshark_filter_clear(kshark_ctx, KS_SHOW_CPU_FILTER); kshark_filter_clear(kshark_ctx, KS_HIDE_CPU_FILTER); break; default: return; } for (auto &&val: vec) kshark_filter_add_id(kshark_ctx, filterId, val); if (!_tep) return; _unregisterCPUCollections(); /* * If the advanced event filter is set, the data has to be reloaded, * because the advanced filter uses tep_records. */ if (kshark_ctx->advanced_event_filter->filters) reload(); else kshark_filter_entries(kshark_ctx, _rows, _dataSize); registerCPUCollections(); emit updateWidgets(this); } /** Apply Show Task filter. */ void KsDataStore::applyPosTaskFilter(QVector vec) { _applyIdFilter(KS_SHOW_TASK_FILTER, vec); } /** Apply Hide Task filter. */ void KsDataStore::applyNegTaskFilter(QVector vec) { _applyIdFilter(KS_HIDE_TASK_FILTER, vec); } /** Apply Show Event filter. */ void KsDataStore::applyPosEventFilter(QVector vec) { _applyIdFilter(KS_SHOW_EVENT_FILTER, vec); } /** Apply Hide Event filter. */ void KsDataStore::applyNegEventFilter(QVector vec) { _applyIdFilter(KS_HIDE_EVENT_FILTER, vec); } /** Apply Show CPU filter. */ void KsDataStore::applyPosCPUFilter(QVector vec) { _applyIdFilter(KS_SHOW_CPU_FILTER, vec); } /** Apply Hide CPU filter. */ void KsDataStore::applyNegCPUFilter(QVector vec) { _applyIdFilter(KS_HIDE_CPU_FILTER, vec); } /** Disable all filters. */ void KsDataStore::clearAllFilters() { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx) || !_tep) return; _unregisterCPUCollections(); kshark_filter_clear(kshark_ctx, KS_SHOW_TASK_FILTER); kshark_filter_clear(kshark_ctx, KS_HIDE_TASK_FILTER); kshark_filter_clear(kshark_ctx, KS_SHOW_EVENT_FILTER); kshark_filter_clear(kshark_ctx, KS_HIDE_EVENT_FILTER); kshark_filter_clear(kshark_ctx, KS_SHOW_CPU_FILTER); kshark_filter_clear(kshark_ctx, KS_HIDE_CPU_FILTER); tep_filter_reset(kshark_ctx->advanced_event_filter); kshark_clear_all_filters(kshark_ctx, _rows, _dataSize); emit updateWidgets(this); } /** * @brief Create Plugin Manager. Use list of plugins declared in the * CMake-generated header file. */ KsPluginManager::KsPluginManager(QWidget *parent) : QObject(parent) { kshark_context *kshark_ctx(nullptr); _parsePluginList(); if (!kshark_instance(&kshark_ctx)) return; registerFromList(kshark_ctx); } /** Parse the plugin list declared in the CMake-generated header file. */ void KsPluginManager::_parsePluginList() { _ksPluginList = KsUtils::getPluginList(); int nPlugins = _ksPluginList.count(); _registeredKsPlugins.resize(nPlugins); for (int i = 0; i < nPlugins; ++i) { if (_ksPluginList[i].contains(" default", Qt::CaseInsensitive)) { _ksPluginList[i].remove(" default", Qt::CaseInsensitive); _registeredKsPlugins[i] = true; } else { _registeredKsPlugins[i] = false; } } } /** * Register the plugins by using the information in "_ksPluginList" and * "_registeredKsPlugins". */ void KsPluginManager::registerFromList(kshark_context *kshark_ctx) { auto lamRegBuiltIn = [&kshark_ctx, this](const QString &plugin) { char *lib; int n; lib = _pluginLibFromName(plugin, n); if (n <= 0) return; kshark_register_plugin(kshark_ctx, lib); free(lib); }; auto lamRegUser = [&kshark_ctx](const QString &plugin) { std::string lib = plugin.toStdString(); kshark_register_plugin(kshark_ctx, lib.c_str()); }; _forEachInList(_ksPluginList, _registeredKsPlugins, lamRegBuiltIn); _forEachInList(_userPluginList, _registeredUserPlugins, lamRegUser); } /** * Unegister the plugins by using the information in "_ksPluginList" and * "_registeredKsPlugins". */ void KsPluginManager::unregisterFromList(kshark_context *kshark_ctx) { auto lamUregBuiltIn = [&kshark_ctx, this](const QString &plugin) { char *lib; int n; lib = _pluginLibFromName(plugin, n); if (n <= 0) return; kshark_unregister_plugin(kshark_ctx, lib); free(lib); }; auto lamUregUser = [&kshark_ctx](const QString &plugin) { std::string lib = plugin.toStdString(); kshark_unregister_plugin(kshark_ctx, lib.c_str()); }; _forEachInList(_ksPluginList, _registeredKsPlugins, lamUregBuiltIn); _forEachInList(_userPluginList, _registeredUserPlugins, lamUregUser); } char *KsPluginManager::_pluginLibFromName(const QString &plugin, int &n) { QString appPath = QCoreApplication::applicationDirPath(); QString libPath = appPath + "/../../kernel-shark/lib"; std::string pluginStr = plugin.toStdString(); char *lib; libPath = QDir::cleanPath(libPath); if (!KsUtils::isInstalled() && QDir(libPath).exists()) { std::string pathStr = libPath.toStdString(); n = asprintf(&lib, "%s/plugin-%s.so", pathStr.c_str(), pluginStr.c_str()); } else { n = asprintf(&lib, "%s/plugin-%s.so", KS_PLUGIN_INSTALL_PREFIX, pluginStr.c_str()); } return lib; } /** * @brief Register a Plugin. * * @param plugin: provide here the name of the plugin (as in the CMake-generated * header file) of a name of the plugin's library file (.so). */ void KsPluginManager::registerPlugin(const QString &plugin) { kshark_context *kshark_ctx(nullptr); char *lib; int n; if (!kshark_instance(&kshark_ctx)) return; for (int i = 0; i < _ksPluginList.count(); ++i) { if (_ksPluginList[i] == plugin) { /* * The argument is the name of the plugin. From the * name get the library .so file. */ lib = _pluginLibFromName(plugin, n); if (n > 0) { kshark_register_plugin(kshark_ctx, lib); _registeredKsPlugins[i] = true; free(lib); } return; } else if (plugin.contains("/lib/plugin-" + _ksPluginList[i], Qt::CaseInsensitive)) { /* * The argument is the name of the library .so file. */ n = asprintf(&lib, "%s", plugin.toStdString().c_str()); if (n > 0) { kshark_register_plugin(kshark_ctx, lib); _registeredKsPlugins[i] = true; free(lib); } return; } } /* No plugin with this name in the list. Try to add it anyway. */ if (plugin.endsWith(".so") && QFileInfo::exists(plugin)) { kshark_register_plugin(kshark_ctx, plugin.toStdString().c_str()); _userPluginList.append(plugin); _registeredUserPlugins.append(true); } else { qCritical() << "ERROR: " << plugin << "cannot be registered!"; } } /** @brief Unregister a Built in KernelShark plugin. *
    * WARNING: Do not use this function to unregister User plugins. * Instead use directly kshark_unregister_plugin(). * * @param plugin: provide here the name of the plugin (as in the CMake-generated * header file) or a name of the plugin's library file (.so). * */ void KsPluginManager::unregisterPlugin(const QString &plugin) { kshark_context *kshark_ctx(nullptr); char *lib; int n; if (!kshark_instance(&kshark_ctx)) return; for (int i = 0; i < _ksPluginList.count(); ++i) { if (_ksPluginList[i] == plugin) { /* * The argument is the name of the plugin. From the * name get the library .so file. */ lib = _pluginLibFromName(plugin, n); if (n > 0) { kshark_unregister_plugin(kshark_ctx, lib); _registeredKsPlugins[i] = false; free(lib); } return; } else if (plugin.contains("/lib/plugin-" + _ksPluginList[i], Qt::CaseInsensitive)) { /* * The argument is the name of the library .so file. */ n = asprintf(&lib, "%s", plugin.toStdString().c_str()); if (n > 0) { kshark_unregister_plugin(kshark_ctx, lib); _registeredKsPlugins[i] = false; free(lib); } return; } } } /** @brief Add to the list and initialize user-provided plugins. All other * previously loaded plugins will be reinitialized and the data will be * reloaded. * * @param fileNames: the library files (.so) of the plugins. */ void KsPluginManager::addPlugins(const QStringList &fileNames) { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return; kshark_handle_plugins(kshark_ctx, KSHARK_PLUGIN_CLOSE); for (auto const &p: fileNames) registerPlugin(p); kshark_handle_plugins(kshark_ctx, KSHARK_PLUGIN_INIT); emit dataReload(); } /** Unload all plugins. */ void KsPluginManager::unloadAll() { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return; kshark_handle_plugins(kshark_ctx, KSHARK_PLUGIN_CLOSE); kshark_free_plugin_list(kshark_ctx->plugins); kshark_ctx->plugins = nullptr; kshark_free_event_handler_list(kshark_ctx->event_handlers); unregisterFromList(kshark_ctx); } /** @brief Update (change) the Plugins. * * @param pluginIds: The indexes of the plugins to be loaded. */ void KsPluginManager::updatePlugins(QVector pluginIds) { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return; auto register_plugins = [&] (QVector ids) { int nKsPlugins = _registeredKsPlugins.count(); /* First clear all registered plugins. */ for (auto &p: _registeredKsPlugins) p = false; for (auto &p: _registeredUserPlugins) p = false; /* The vector contains the indexes of those to register. */ for (auto const &p: ids) { if (p < nKsPlugins) _registeredKsPlugins[p] = true; else _registeredUserPlugins[p - nKsPlugins] = true; } registerFromList(kshark_ctx); }; if (!kshark_ctx->pevent) { kshark_free_plugin_list(kshark_ctx->plugins); kshark_ctx->plugins = nullptr; /* * No data is loaded. For the moment, just register the * plugins. Handling of the plugins will be done after * we load a data file. */ register_plugins(pluginIds); return; } /* Clean up all old plugins first. */ unloadAll(); /* Now load. */ register_plugins(pluginIds); kshark_handle_plugins(kshark_ctx, KSHARK_PLUGIN_INIT); emit dataReload(); } trace-cmd-v2.9.6/kernel-shark/src/KsUtils.hpp000066400000000000000000000134661414302661500210550ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsUtils.hpp * @brief KernelShark Utils. */ #ifndef _KS_UTILS_H #define _KS_UTILS_H // C++ 11 #include // Qt #include // KernelShark #include "libkshark.h" #include "libkshark-model.h" #include "KsCmakeDef.hpp" #include "KsPlotTools.hpp" /** Macro providing the height of the screen in pixels. */ #define SCREEN_HEIGHT QGuiApplication::screens()[0]->geometry().height() /** Macro providing the width of the screen in pixels. */ #define SCREEN_WIDTH QGuiApplication::screens()[0]->geometry().width() //! @cond Doxygen_Suppress static auto fontHeight = []() { QFont font; QFontMetrics fm(font); return fm.height(); }; static auto stringWidth = [](QString s) { QFont font; QFontMetrics fm(font); return fm.horizontalAdvance(s); }; //! @endcond /** Macro providing the height of the font in pixels. */ #define FONT_HEIGHT fontHeight() /** Macro providing the width of the font in pixels. */ #define FONT_WIDTH stringWidth("4") /** Macro providing the width of a string in pixels. */ #define STRING_WIDTH(s) stringWidth(s) /** Macro providing the height of the KernelShark graphs in pixels. */ #define KS_GRAPH_HEIGHT (FONT_HEIGHT*2) //! @cond Doxygen_Suppress #define KS_JSON_CAST(doc) \ reinterpret_cast(doc) #define KS_C_STR_CAST(doc) \ reinterpret_cast(doc) typedef std::chrono::high_resolution_clock::time_point hd_time; #define GET_TIME std::chrono::high_resolution_clock::now() #define GET_DURATION(t0) \ std::chrono::duration_cast>( \ std::chrono::high_resolution_clock::now() - t0).count() //! @endcond namespace KsUtils { QVector getCPUList(); QVector getPidList(); QVector getEventIdList(tep_event_sort_type sortType=TEP_EVENT_SORT_ID); QVector getFilterIds(tracecmd_filter_id *filter); /** @brief Geat the list of plugins. */ inline QStringList getPluginList() {return plugins.split(";");} void listFilterSync(bool state); void graphFilterSync(bool state); QCheckBox *addCheckBoxToMenu(QMenu *menu, QString name); /** @brief Convert the timestamp of the trace record into a string showing * the time in seconds. * * @param ts: Input location for the timestamp. * @param prec: the number of digits after the decimal point in the return * string. * * @returns String showing the time in seconds. */ inline QString Ts2String(int64_t ts, int prec) { return QString::number(ts * 1e-9, 'f', prec); } bool matchCPUVisible(struct kshark_context *kshark_ctx, struct kshark_entry *e, int cpu); bool isInstalled(); QString getFile(QWidget *parent, const QString &windowName, const QString &filter, QString &lastFilePath); QStringList getFiles(QWidget *parent, const QString &windowName, const QString &filter, QString &lastFilePath); QString getSaveFile(QWidget *parent, const QString &windowName, const QString &filter, const QString &extension, QString &lastFilePath); QStringList splitArguments(QString cmd); QVector parseIdList(QString v_str); }; // KsUtils /** Identifier of the Dual Marker active state. */ enum class DualMarkerState { A, B }; /** * The KsDataStore class provides the access to trace data for all KernelShark * widgets. */ class KsDataStore : public QObject { Q_OBJECT public: explicit KsDataStore(QWidget *parent = nullptr); ~KsDataStore(); void loadDataFile(const QString &file); void clear(); /** Get the trace event parser. */ tep_handle *tep() const {return _tep;} /** Get the trace data array.. */ struct kshark_entry **rows() const {return _rows;} /** Get the size of the data array. */ ssize_t size() const {return _dataSize;} void reload(); void update(); void registerCPUCollections(); void applyPosTaskFilter(QVector); void applyNegTaskFilter(QVector); void applyPosEventFilter(QVector); void applyNegEventFilter(QVector); void applyPosCPUFilter(QVector); void applyNegCPUFilter(QVector); void clearAllFilters(); signals: /** * This signal is emitted when the data has changed and the View * widgets have to update. */ void updateWidgets(KsDataStore *); private: /** Page event used to parse the page. */ tep_handle *_tep; /** Trace data array. */ struct kshark_entry **_rows; /** The size of the data array. */ ssize_t _dataSize; void _freeData(); void _unregisterCPUCollections(); void _applyIdFilter(int filterId, QVector vec); }; /** A Plugin Manage class. */ class KsPluginManager : public QObject { Q_OBJECT public: explicit KsPluginManager(QWidget *parent = nullptr); /** A list of available built-in plugins. */ QStringList _ksPluginList; /** A list of registered built-in plugins. */ QVector _registeredKsPlugins; /** A list of available user plugins. */ QStringList _userPluginList; /** A list of registered user plugins. */ QVector _registeredUserPlugins; void registerFromList(kshark_context *kshark_ctx); void unregisterFromList(kshark_context *kshark_ctx); void registerPlugin(const QString &plugin); void unregisterPlugin(const QString &plugin); void addPlugins(const QStringList &fileNames); void unloadAll(); void updatePlugins(QVector pluginId); signals: /** This signal is emitted when a plugin is loaded or unloaded. */ void dataReload(); private: void _parsePluginList(); char *_pluginLibFromName(const QString &plugin, int &n); template void _forEachInList(const QStringList &pl, const QVector ®, T action) { int nPlugins; nPlugins = pl.count(); for (int i = 0; i < nPlugins; ++i) { if (reg[i]) { action(pl[i]); } } } }; KsPlot::Color& operator <<(KsPlot::Color &thisColor, const QColor &c); #endif trace-cmd-v2.9.6/kernel-shark/src/KsWidgetsLib.cpp000066400000000000000000000463121414302661500220010ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsWidgetsLib.cpp * @brief Defines small widgets and dialogues used by the KernelShark GUI. */ // KernelShark #include "libkshark.h" #include "KsUtils.hpp" #include "KsCmakeDef.hpp" #include "KsPlotTools.hpp" #include "KsWidgetsLib.hpp" /** * @brief Create KsProgressBar. * * @param message: Text to be shown. * @param parent: The parent of this widget. */ KsProgressBar::KsProgressBar(QString message, QWidget *parent) : QWidget(parent), _sb(this), _pb(&_sb) { resize(KS_BROGBAR_WIDTH, KS_BROGBAR_HEIGHT); setWindowTitle("KernelShark"); setLayout(new QVBoxLayout); _pb.setOrientation(Qt::Horizontal); _pb.setTextVisible(false); _pb.setRange(0, KS_PROGRESS_BAR_MAX); _pb.setValue(1); _sb.addPermanentWidget(&_pb, 1); layout()->addWidget(new QLabel(message)); layout()->addWidget(&_sb); setWindowFlags(Qt::WindowStaysOnTopHint); show(); } /** @brief Set the state of the progressbar. * * @param i: A value ranging from 0 to KS_PROGRESS_BAR_MAX. */ void KsProgressBar::setValue(int i) { _pb.setValue(i); QApplication::processEvents(); } /** * @brief Create KsMessageDialog. * * @param message: Text to be shown. * @param parent: The parent of this widget. */ KsMessageDialog::KsMessageDialog(QString message, QWidget *parent) : QDialog(parent), _text(message, this), _closeButton("Close", this) { resize(KS_MSG_DIALOG_WIDTH, KS_MSG_DIALOG_HEIGHT); _layout.addWidget(&_text); _layout.addWidget(&_closeButton); connect(&_closeButton, &QPushButton::pressed, this, &QWidget::close); this->setLayout(&_layout); } namespace KsWidgetsLib { /** * @brief Launch a File exists dialog. Use this function to ask the user * before overwriting an existing file. * * @param fileName: the name of the file. * * @returns True if the user wants to overwrite the file. Otherwise */ bool fileExistsDialog(QString fileName) { QString msg("A file "); QMessageBox msgBox; msg += fileName; msg += " already exists."; msgBox.setText(msg); msgBox.setInformativeText("Do you want to replace it?"); msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Cancel); return (msgBox.exec() == QMessageBox::Save); } }; // KsWidgetsLib /** * @brief Create KsCheckBoxWidget. * * @param name: The name of this widget. * @param parent: The parent of this widget. */ KsCheckBoxWidget::KsCheckBoxWidget(const QString &name, QWidget *parent) : QWidget(parent), _tb(this), _allCb("all", &_tb), _cbWidget(this), _cbLayout(&_cbWidget), _topLayout(this), _name(name), _nameLabel(name + ": ",&_tb) { setWindowTitle(_name); setMinimumHeight(SCREEN_HEIGHT / 2); connect(&_allCb, &QCheckBox::clicked, this, &KsCheckBoxWidget::_checkAll); _cbWidget.setLayout(&_cbLayout); _tb.addWidget(&_nameLabel); _tb.addWidget(&_allCb); _topLayout.addWidget(&_tb); _topLayout.addWidget(&_cbWidget); _topLayout.setContentsMargins(0, 0, 0, 0); setLayout(&_topLayout); _allCb.setCheckState(Qt::Checked); } /** * Set the default state for all checkboxes (including the "all" checkbox). */ void KsCheckBoxWidget::setDefault(bool st) { Qt::CheckState state = Qt::Unchecked; if (st) state = Qt::Checked; _allCb.setCheckState(state); _checkAll(state); } /** Get a vector containing the indexes of all checked boxes. */ QVector KsCheckBoxWidget::getCheckedIds() { QVector vec; int n = _id.size(); for (int i = 0; i < n; ++i) if (_checkState(i) == Qt::Checked) vec.append(_id[i]); return vec; } /** * @brief Set the state of the checkboxes. * * @param v: Vector containing the bool values for all checkboxes. */ void KsCheckBoxWidget::set(QVector v) { Qt::CheckState state; int nChecks; nChecks = (v.size() < _id.size()) ? v.size() : _id.size(); /* Start with the "all" checkbox being checked. */ _allCb.setCheckState(Qt::Checked); for (int i = 0; i < nChecks; ++i) { if (v[i]) { state = Qt::Checked; } else { /* * At least one checkbox is unchecked. Uncheck * "all" as well. */ state = Qt::Unchecked; _allCb.setCheckState(state); } _setCheckState(i, state); } _verify(); } void KsCheckBoxWidget::_checkAll(bool st) { Qt::CheckState state = Qt::Unchecked; int n = _id.size(); if (st) state = Qt::Checked; for (int i = 0; i < n; ++i) { _setCheckState(i, state); } _verify(); } /** * @brief Create KsCheckBoxDialog. * * @param cbw: A KsCheckBoxWidget to be nested in this dialog. * @param parent: The parent of this widget. */ KsCheckBoxDialog::KsCheckBoxDialog(KsCheckBoxWidget *cbw, QWidget *parent) : QDialog(parent), _checkBoxWidget(cbw), _applyButton("Apply", this), _cancelButton("Cancel", this) { int buttonWidth; setWindowTitle(cbw->name()); _topLayout.addWidget(_checkBoxWidget); buttonWidth = STRING_WIDTH("--Cancel--"); _applyButton.setFixedWidth(buttonWidth); _cancelButton.setFixedWidth(buttonWidth); _buttonLayout.addWidget(&_applyButton); _applyButton.setAutoDefault(false); _buttonLayout.addWidget(&_cancelButton); _cancelButton.setAutoDefault(false); _buttonLayout.setAlignment(Qt::AlignLeft); _topLayout.addLayout(&_buttonLayout); _applyButtonConnection = connect(&_applyButton, &QPushButton::pressed, this, &KsCheckBoxDialog::_applyPress); connect(&_applyButton, &QPushButton::pressed, this, &QWidget::close); connect(&_cancelButton, &QPushButton::pressed, this, &QWidget::close); this->setLayout(&_topLayout); } void KsCheckBoxDialog::_applyPress() { QVector vec = _checkBoxWidget->getCheckedIds(); emit apply(vec); /* * Disconnect _applyButton. This is done in order to protect * against multiple clicks. */ disconnect(_applyButtonConnection); } /** * @brief Create KsCheckBoxTable. * * @param parent: The parent of this widget. */ KsCheckBoxTable::KsCheckBoxTable(QWidget *parent) : QTableWidget(parent) { setShowGrid(false); horizontalHeader()->setDefaultAlignment(Qt::AlignLeft); horizontalHeader()->setStretchLastSection(true); setSelectionBehavior(QAbstractItemView::SelectRows); setEditTriggers(QAbstractItemView::NoEditTriggers); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); verticalHeader()->setVisible(false); connect(this, &QTableWidget::cellDoubleClicked, this, &KsCheckBoxTable::_doubleClicked); } /** * @brief Initialize the table. * * @param headers: The headers of the individual columns. * @param size: The number of rows. */ void KsCheckBoxTable::init(QStringList headers, int size) { QHBoxLayout *cbLayout; QWidget *cbWidget; setColumnCount(headers.count()); setRowCount(size); setHorizontalHeaderLabels(headers); _cb.resize(size); for (int i = 0; i < size; ++i) { cbWidget = new QWidget(); _cb[i] = new QCheckBox(cbWidget); cbLayout = new QHBoxLayout(cbWidget); cbLayout->addWidget(_cb[i]); cbLayout->setAlignment(Qt::AlignCenter); cbLayout->setContentsMargins(0, 0, 0, 0); cbWidget->setLayout(cbLayout); setCellWidget(i, 0, cbWidget); } } /** Reimplemented event handler used to receive key press events. */ void KsCheckBoxTable::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Return) { for (auto &s: selectedItems()) { if (s->column() == 1) emit changeState(s->row()); } } QApplication::processEvents(); QTableWidget::keyPressEvent(event); } /** Reimplemented event handler used to receive mouse press events. */ void KsCheckBoxTable::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::RightButton) { for (auto &i: selectedItems()) i->setSelected(false); return; } QApplication::processEvents(); QTableWidget::mousePressEvent(event); } void KsCheckBoxTable::_doubleClicked(int row, int col) { emit changeState(row); for (auto &i: selectedItems()) i->setSelected(false); } /** * @brief Create KsCheckBoxTableWidget. * * @param name: The name of this widget. * @param parent: The parent of this widget. */ KsCheckBoxTableWidget::KsCheckBoxTableWidget(const QString &name, QWidget *parent) : KsCheckBoxWidget(name, parent), _table(this) { connect(&_table, &KsCheckBoxTable::changeState, this, &KsCheckBoxTableWidget::_changeState); } /** Initialize the KsCheckBoxTable and its layout. */ void KsCheckBoxTableWidget::_initTable(QStringList headers, int size) { _table.init(headers, size); for (auto const & cb: _table._cb) { connect(cb, &QCheckBox::clicked, this, &KsCheckBoxTableWidget::_update); } _cbLayout.setContentsMargins(1, 1, 1, 1); _cbLayout.addWidget(&_table); } /** Adjust the size of this widget according to its content. */ void KsCheckBoxTableWidget::_adjustSize() { int width; _table.setVisible(false); _table.resizeColumnsToContents(); _table.setVisible(true); width = _table.horizontalHeader()->length() + FONT_WIDTH * 3 + style()->pixelMetric(QStyle::PM_ScrollBarExtent); _cbWidget.resize(width, _cbWidget.height()); setMinimumWidth(_cbWidget.width() + _cbLayout.contentsMargins().left() + _cbLayout.contentsMargins().right() + _topLayout.contentsMargins().left() + _topLayout.contentsMargins().right()); } void KsCheckBoxTableWidget::_update(bool state) { /* If a Checkbox is being unchecked. Unchecked "all" as well. */ if (!state) _allCb.setCheckState(Qt::Unchecked); } void KsCheckBoxTableWidget::_changeState(int row) { if (_table._cb[row]->checkState() == Qt::Checked) _table._cb[row]->setCheckState(Qt::Unchecked); else _table._cb[row]->setCheckState(Qt::Checked); _allCb.setCheckState(Qt::Checked); for (auto &c: _table._cb) { if (c->checkState() == Qt::Unchecked) { _allCb.setCheckState(Qt::Unchecked); break; } } } static void update_r(QTreeWidgetItem *item, Qt::CheckState state) { int n; item->setCheckState(0, state); n = item->childCount(); for (int i = 0; i < n; ++i) update_r(item->child(i), state); } /** * @brief Create KsCheckBoxTree. * * @param parent: The parent of this widget. */ KsCheckBoxTree::KsCheckBoxTree(QWidget *parent) : QTreeWidget(parent) { setColumnCount(2); setHeaderHidden(true); setSelectionBehavior(QAbstractItemView::SelectRows); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); connect(this, &KsCheckBoxTree::itemDoubleClicked, this, &KsCheckBoxTree::_doubleClicked); } /** Reimplemented event handler used to receive key press events. */ void KsCheckBoxTree::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Return) { /* Loop over all selected child items and change * there states. */ for (auto &s: selectedItems()) { if(s->childCount()) { if (s->isExpanded()) continue; } if (s->checkState(0) == Qt::Unchecked) s->setCheckState(0, Qt::Checked); else s->setCheckState(0, Qt::Unchecked); if(s->childCount()) { update_r(s, s->checkState(0)); } } } emit verify(); QTreeWidget::keyPressEvent(event); } void KsCheckBoxTree::_doubleClicked(QTreeWidgetItem *item, int col) { if (item->checkState(0) == Qt::Unchecked) item->setCheckState(0, Qt::Checked); else item->setCheckState(0, Qt::Unchecked); for (auto &i: selectedItems()) i->setSelected(false); emit itemClicked(item, col); } /** Reimplemented event handler used to receive mouse press events. */ void KsCheckBoxTree::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::RightButton) { for (auto &i: selectedItems()) i->setSelected(false); return; } QApplication::processEvents(); QTreeWidget::mousePressEvent(event); } /** * @brief Create KsCheckBoxTreeWidget. * * @param name: The name of this widget. * @param parent: The parent of this widget. */ KsCheckBoxTreeWidget::KsCheckBoxTreeWidget(const QString &name, QWidget *parent) : KsCheckBoxWidget(name, parent), _tree(this) { connect(&_tree, &KsCheckBoxTree::verify, this, &KsCheckBoxTreeWidget::_verify); } /** Initialize the KsCheckBoxTree and its layout. */ void KsCheckBoxTreeWidget::_initTree() { _tree.setSelectionMode(QAbstractItemView::MultiSelection); connect(&_tree, &QTreeWidget::itemClicked, this, &KsCheckBoxTreeWidget::_update); _cbLayout.setContentsMargins(1, 1, 1, 1); _cbLayout.addWidget(&_tree); } /** Adjust the size of this widget according to its content. */ void KsCheckBoxTreeWidget::_adjustSize() { int width, n = _tree.topLevelItemCount(); if (n == 0) return; for (int i = 0; i < n; ++i) _tree.topLevelItem(i)->setExpanded(true); _tree.resizeColumnToContents(0); if (_tree.topLevelItem(0)->child(0)) { width = _tree.visualItemRect(_tree.topLevelItem(0)->child(0)).width(); } else { width = _tree.visualItemRect(_tree.topLevelItem(0)).width(); } width += FONT_WIDTH*3 + style()->pixelMetric(QStyle::PM_ScrollBarExtent); _cbWidget.resize(width, _cbWidget.height()); for (int i = 0; i < n; ++i) _tree.topLevelItem(i)->setExpanded(false); setMinimumWidth(_cbWidget.width() + _cbLayout.contentsMargins().left() + _cbLayout.contentsMargins().right() + _topLayout.contentsMargins().left() + _topLayout.contentsMargins().right()); } void KsCheckBoxTreeWidget::_update(QTreeWidgetItem *item, int column) { /* Get the new state of the item. */ Qt::CheckState state = item->checkState(0); /* Recursively update all items below this one. */ update_r(item, state); /* * Update all items above this one including the "all" * check box. */ _verify(); } void KsCheckBoxTreeWidget::_verify() { /* * Set the state of the top level items according to the * state of the childs. */ QTreeWidgetItem *topItem, *childItem; for(int t = 0; t < _tree.topLevelItemCount(); ++t) { topItem = _tree.topLevelItem(t); if (topItem->childCount() == 0) continue; topItem->setCheckState(0, Qt::Checked); for (int c = 0; c < topItem->childCount(); ++c) { childItem = topItem->child(c); if (childItem->checkState(0) == Qt::Unchecked) topItem->setCheckState(0, Qt::Unchecked); } } _allCb.setCheckState(Qt::Checked); for (auto &c: _cb) { if (c->checkState(0) == Qt::Unchecked) { _allCb.setCheckState(Qt::Unchecked); break; } } } /** * @brief Create KsCPUCheckBoxWidget. * * @param tep: Trace event parseer. * @param parent: The parent of this widget. */ KsCPUCheckBoxWidget::KsCPUCheckBoxWidget(struct tep_handle *tep, QWidget *parent) : KsCheckBoxTreeWidget("CPUs", parent) { int nCPUs(0), height(FONT_HEIGHT * 1.5); KsPlot::ColorTable colors; QString style; style = QString("QTreeView::item { height: %1 ;}").arg(height); _tree.setStyleSheet(style); _initTree(); if (tep) nCPUs = tep_get_cpus(tep); _id.resize(nCPUs); _cb.resize(nCPUs); colors = KsPlot::getCPUColorTable(); for (int i = 0; i < nCPUs; ++i) { QTreeWidgetItem *cpuItem = new QTreeWidgetItem; cpuItem->setText(0, " "); cpuItem->setText(1, QString("CPU %1").arg(i)); cpuItem->setCheckState(0, Qt::Checked); cpuItem->setBackground(0, QColor(colors[i].r(), colors[i].g(), colors[i].b())); _tree.addTopLevelItem(cpuItem); _id[i] = i; _cb[i] = cpuItem; } _adjustSize(); } /** * @brief Create KsEventsCheckBoxWidget. * * @param tep: Trace event parseer. * @param parent: The parent of this widget. */ KsEventsCheckBoxWidget::KsEventsCheckBoxWidget(struct tep_handle *tep, QWidget *parent) : KsCheckBoxTreeWidget("Events", parent) { QTreeWidgetItem *sysItem, *evtItem; tep_event **events(nullptr); QString sysName, evtName; int nEvts(0), i(0); if (tep) { nEvts = tep_get_events_count(tep); events = tep_list_events(tep, TEP_EVENT_SORT_SYSTEM); } _initTree(); _id.resize(nEvts); _cb.resize(nEvts); while (i < nEvts) { sysName = events[i]->system; sysItem = new QTreeWidgetItem; sysItem->setText(0, sysName); sysItem->setCheckState(0, Qt::Checked); _tree.addTopLevelItem(sysItem); while (sysName == events[i]->system) { evtName = events[i]->name; evtItem = new QTreeWidgetItem; evtItem->setText(0, evtName); evtItem->setCheckState(0, Qt::Checked); evtItem->setFlags(evtItem->flags() | Qt::ItemIsUserCheckable); sysItem->addChild(evtItem); _id[i] = events[i]->id; _cb[i] = evtItem; if (++i == nEvts) break; } } _tree.sortItems(0, Qt::AscendingOrder); _adjustSize(); } /** * @brief Get a list of all checked events. If the whole system is selected * (the top level checkbox is checked), only the name of the system is * added to the list. * * @param option: If True, "-e" is added as prefix to each element of the list. * * @returns A list of checked events or systems. */ QStringList KsEventsCheckBoxWidget::getCheckedEvents(bool option) { QTreeWidgetItem *sysItem, *evtItem; QStringList list; QString optStr; int nSys, nEvts; if (option) optStr = "-e"; nSys = _tree.topLevelItemCount(); for (int t = 0; t < nSys; ++t) { sysItem = _tree.topLevelItem(t); if (sysItem->checkState(0) == Qt::Checked) { list << optStr + sysItem->text(0); } else { nEvts = sysItem->childCount(); for (int c = 0; c < nEvts; ++c) { evtItem = sysItem->child(c); if (evtItem->checkState(0) == Qt::Checked) { list << optStr + sysItem->text(0) + ":" + evtItem->text(0); } } } } return list; } /** Remove a System from the Checkbox tree. */ void KsEventsCheckBoxWidget::removeSystem(QString name) { auto itemList = _tree.findItems(name, Qt::MatchFixedString, 0); int index; if (itemList.isEmpty()) return; index = _tree.indexOfTopLevelItem(itemList[0]); if (index >= 0) _tree.takeTopLevelItem(index); } /** * @brief Create KsTasksCheckBoxWidget. * * @param pevent: Page event used to parse the page. * @param cond: If True make a "Show Task" widget. Otherwise make "Hide Task". * @param parent: The parent of this widget. */ KsTasksCheckBoxWidget::KsTasksCheckBoxWidget(struct tep_handle *pevent, bool cond, QWidget *parent) : KsCheckBoxTableWidget("Tasks", parent) { kshark_context *kshark_ctx(nullptr); QTableWidgetItem *pidItem, *comItem; KsPlot::ColorTable colors; QStringList headers; const char *comm; int nTasks, pid; if (!kshark_instance(&kshark_ctx)) return; if (_cond) headers << "Show" << "Pid" << "Task"; else headers << "Hide" << "Pid" << "Task"; _id = KsUtils::getPidList(); nTasks = _id.count(); _initTable(headers, nTasks); colors = KsPlot::getTaskColorTable(); for (int i = 0; i < nTasks; ++i) { pid = _id[i]; pidItem = new QTableWidgetItem(tr("%1").arg(pid)); _table.setItem(i, 1, pidItem); comm = tep_data_comm_from_pid(kshark_ctx->pevent, pid); comItem = new QTableWidgetItem(tr(comm)); pidItem->setBackground(QColor(colors[pid].r(), colors[pid].g(), colors[pid].b())); if (_id[i] == 0) pidItem->setForeground(Qt::white); _table.setItem(i, 2, comItem); } _adjustSize(); } /** * @brief Create KsPluginCheckBoxWidget. * * @param pluginList: A list of plugin names. * @param parent: The parent of this widget. */ KsPluginCheckBoxWidget::KsPluginCheckBoxWidget(QStringList pluginList, QWidget *parent) : KsCheckBoxTableWidget("Plugins", parent) { QTableWidgetItem *nameItem, *infoItem; QStringList headers; int nPlgins; headers << "Load" << "Name" << "Info"; nPlgins = pluginList.count(); _initTable(headers, nPlgins); _id.resize(nPlgins); for (int i = 0; i < nPlgins; ++i) { nameItem = new QTableWidgetItem(pluginList[i]); _table.setItem(i, 1, nameItem); infoItem = new QTableWidgetItem(" -- "); _table.setItem(i, 2, infoItem); _id[i] = i; } _adjustSize(); } trace-cmd-v2.9.6/kernel-shark/src/KsWidgetsLib.hpp000066400000000000000000000163161414302661500220070ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsWidgetsLib.hpp * @brief Defines small widgets and dialogues used by the KernelShark GUI. */ #ifndef _KS_WIDGETS_LIB_H #define _KS_WIDGETS_LIB_H // Qt #include /** * The KsProgressBar class provides a visualization of the progress of a * running job. */ class KsProgressBar : public QWidget { Q_OBJECT QStatusBar _sb; QProgressBar _pb; public: KsProgressBar(QString message, QWidget *parent = nullptr); void setValue(int i); }; /** Defines the progress bar's maximum value. */ #define KS_PROGRESS_BAR_MAX 200 /** The height of the KsProgressBar widget. */ #define KS_BROGBAR_HEIGHT (FONT_HEIGHT * 5) /** The width of the KsProgressBar widget. */ #define KS_BROGBAR_WIDTH (FONT_WIDTH * 50) /** * The KsMessageDialog class provides a widget showing a message and having * a "Close" button. */ class KsMessageDialog : public QDialog { QVBoxLayout _layout; QLabel _text; QPushButton _closeButton; public: explicit KsMessageDialog(QWidget *parent) = delete; KsMessageDialog(QString message, QWidget *parent = nullptr); }; /** The height of the KsMessageDialog widget. */ #define KS_MSG_DIALOG_HEIGHT (FONT_HEIGHT * 8) /** The width of the KsMessageDialog widget. */ #define KS_MSG_DIALOG_WIDTH (SCREEN_WIDTH / 10) namespace KsWidgetsLib { bool fileExistsDialog(QString fileName); }; // KsWidgetsLib /** * The KsCheckBoxWidget class is the base class of all CheckBox widget used * by KernelShark. */ class KsCheckBoxWidget : public QWidget { Q_OBJECT public: KsCheckBoxWidget(const QString &name = "", QWidget *parent = nullptr); /** Get the name of the widget. */ QString name() const {return _name;} /** Get the state of the "all" checkboxe. */ bool all() const { if(_allCb.checkState() == Qt::Checked) return true; return false; } void setDefault(bool); void set(QVector v); /** * Get a vector containing all Ids (can be PID CPU Ids etc.) managed * by this widget. */ QVector getIds() const {return _id;} QVector getCheckedIds(); private: QToolBar _tb; protected: /** The "all" checkboxe. */ QCheckBox _allCb; /** A vector of Id numbers coupled to each checkboxe. */ QVector _id; /** A nested widget used to position the checkboxes. */ QWidget _cbWidget; /** The layout of the nested widget. */ QVBoxLayout _cbLayout; /** The top level layout of this widget. */ QVBoxLayout _topLayout; /** The name of this widget. */ QString _name; /** A label to show the name of the widget. */ QLabel _nameLabel; private: virtual void _setCheckState(int i, Qt::CheckState st) = 0; virtual Qt::CheckState _checkState(int i) const = 0; virtual void _verify() {}; void _checkAll(bool); }; /** * The KsCheckBoxDialog class is the base class of all CheckBox dialogs * used by KernelShark. */ class KsCheckBoxDialog : public QDialog { Q_OBJECT public: KsCheckBoxDialog() = delete; KsCheckBoxDialog(KsCheckBoxWidget *cbw, QWidget *parent = nullptr); signals: /** Signal emitted when the "Apply" button is pressed. */ void apply(QVector); private: void _applyPress(); QVBoxLayout _topLayout; QHBoxLayout _buttonLayout; KsCheckBoxWidget *_checkBoxWidget; QPushButton _applyButton, _cancelButton; QMetaObject::Connection _applyButtonConnection; }; /** The KsCheckBoxTable class provides a table of checkboxes. */ class KsCheckBoxTable : public QTableWidget { Q_OBJECT public: explicit KsCheckBoxTable(QWidget *parent = nullptr); void init(QStringList headers, int size); /** A vector of checkboxes. */ QVector _cb; signals: /** Signal emitted when a checkboxes changes state. */ void changeState(int row); protected: void keyPressEvent(QKeyEvent *event) override; void mousePressEvent(QMouseEvent *event) override; private: void _doubleClicked(int row, int col); }; /** * The KsCheckBoxTableWidget class provides a widget to hold a table of * checkboxes. */ class KsCheckBoxTableWidget : public KsCheckBoxWidget { Q_OBJECT public: KsCheckBoxTableWidget(const QString &name = "", QWidget *parent = nullptr); protected: void _adjustSize(); void _initTable(QStringList headers, int size); /** The KsCheckBoxTable, shown by this widget. */ KsCheckBoxTable _table; private: void _setCheckState(int i, Qt::CheckState st) override { _table._cb[i]->setCheckState(st); } Qt::CheckState _checkState(int i) const override { return _table._cb[i]->checkState(); } void _update(bool); void _changeState(int row); }; /** The KsCheckBoxTree class provides a tree of checkboxes. */ class KsCheckBoxTree : public QTreeWidget { Q_OBJECT public: explicit KsCheckBoxTree(QWidget *parent = nullptr); signals: /** * Signal emitted when a checkboxes of the tree changes its state * and the state of all toplevel and child checkboxes has to be * reprocesed. */ void verify(); protected: void keyPressEvent(QKeyEvent *event) override; void mousePressEvent(QMouseEvent *event) override; private: void _doubleClicked(QTreeWidgetItem *item, int col); }; /** * The KsCheckBoxTreeWidget class provides a widget to hold a tree of * checkboxes. */ class KsCheckBoxTreeWidget : public KsCheckBoxWidget { Q_OBJECT public: KsCheckBoxTreeWidget() = delete; KsCheckBoxTreeWidget(const QString &name = "", QWidget *parent = nullptr); protected: void _adjustSize(); void _initTree(); /** The KsCheckBoxTree, shown by this widget. */ KsCheckBoxTree _tree; /** A vector of Tree items (checkboxes). */ QVector _cb; private: void _setCheckState(int i, Qt::CheckState st) override { _cb[i]->setCheckState(0, st); } Qt::CheckState _checkState(int i) const override { return _cb[i]->checkState(0); } void _update(QTreeWidgetItem *item, int column); void _verify(); }; /** * The KsCPUCheckBoxWidget class provides a widget for selecting CPU plots to * show. */ struct KsCPUCheckBoxWidget : public KsCheckBoxTreeWidget { KsCPUCheckBoxWidget() = delete; KsCPUCheckBoxWidget(struct tep_handle *pe, QWidget *parent = nullptr); }; /** * The KsTasksCheckBoxWidget class provides a widget for selecting Tasks * to show or hide. */ struct KsTasksCheckBoxWidget : public KsCheckBoxTableWidget { KsTasksCheckBoxWidget() = delete; KsTasksCheckBoxWidget(struct tep_handle *pe, bool cond = true, QWidget *parent = nullptr); private: /** * A positive condition means that you want to show Tasks and * a negative condition means that you want to hide Tasks. */ bool _cond; }; /** * The KsEventsCheckBoxWidget class provides a widget for selecting Trace * events to show or hide. */ struct KsEventsCheckBoxWidget : public KsCheckBoxTreeWidget { KsEventsCheckBoxWidget() = delete; KsEventsCheckBoxWidget(struct tep_handle *pe, QWidget *parent = nullptr); QStringList getCheckedEvents(bool option); void removeSystem(QString name); }; /** * The KsPluginCheckBoxWidget class provides a widget for selecting plugins. */ struct KsPluginCheckBoxWidget : public KsCheckBoxTableWidget { KsPluginCheckBoxWidget() = delete; KsPluginCheckBoxWidget(QStringList pluginList, QWidget *parent = nullptr); }; #endif trace-cmd-v2.9.6/kernel-shark/src/kernelshark.cpp000066400000000000000000000060001414302661500217450ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ // C #include #include // Qt #include // KernelShark #include "KsCmakeDef.hpp" #include "KsMainWindow.hpp" #define default_input_file (char*)"trace.dat" static char *input_file; void usage(const char *prog) { printf("Usage: %s\n", prog); printf(" -h Display this help message\n"); printf(" -v Display version and exit\n"); printf(" -i input_file, default is %s\n", default_input_file); printf(" -p register plugin, use plugin name, absolute or relative path\n"); printf(" -u unregister plugin, use plugin name or absolute path\n"); printf(" -s import a session\n"); printf(" -l import the last session\n"); puts(" --cpu show plots for CPU cores, default is \"show all\""); puts(" --pid show plots for tasks, default is \"do not show\""); puts("\n example:"); puts(" kernelshark -i mytrace.dat --cpu 1,4-7 --pid 11 -p path/to/my/plugin/myplugin.so\n"); } #define KS_LONG_OPTS 0 static option longOptions[] = { {"help", no_argument, nullptr, 'h'}, {"pid", required_argument, nullptr, KS_LONG_OPTS}, {"cpu", required_argument, nullptr, KS_LONG_OPTS}, {nullptr, 0, nullptr, 0} }; int main(int argc, char **argv) { QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QApplication a(argc, argv); QVector cpuPlots, taskPlots; bool fromSession = false; int optionIndex = 0; KsMainWindow ks; int c; while ((c = getopt_long(argc, argv, "hvi:p:u:s:l", longOptions, &optionIndex)) != -1) { switch(c) { case KS_LONG_OPTS: if (strcmp(longOptions[optionIndex].name, "cpu") == 0) cpuPlots.append(KsUtils::parseIdList(QString(optarg))); else if (strcmp(longOptions[optionIndex].name, "pid") == 0) taskPlots.append(KsUtils::parseIdList(QString(optarg))); break; case 'h': usage(argv[0]); return 0; case 'v': printf("%s - %s\n", basename(argv[0]), KS_VERSION_STRING); return 0; case 'i': input_file = optarg; break; case 'p': ks.registerPlugin(QString(optarg)); break; case 'u': ks.unregisterPlugin(QString(optarg)); break; case 's': ks.loadSession(QString(optarg)); fromSession = true; break; case 'l': ks.loadSession(ks.lastSessionFile()); fromSession = true; break; default: break; } } if (!fromSession) { if ((argc - optind) >= 1) { if (input_file) usage(argv[0]); input_file = argv[optind]; } if (!input_file) { struct stat st; if (stat(default_input_file, &st) == 0) input_file = default_input_file; } if (input_file) ks.loadDataFile(QString(input_file)); } auto lamOrderIds = [] (QVector &ids) { /* Sort and erase duplicates. */ std::sort(ids.begin(), ids.end()); ids.erase(std::unique(ids.begin(), ids.end()), ids.end()); return ids; }; if (cpuPlots.count() || taskPlots.count()) { ks.setCPUPlots(lamOrderIds(cpuPlots)); ks.setTaskPlots(lamOrderIds(taskPlots)); } ks.show(); return a.exec(); } trace-cmd-v2.9.6/kernel-shark/src/kshark-record.cpp000066400000000000000000000007011414302661500221750ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ // C #include // KernelShark #include "KsCaptureDialog.hpp" int main(int argc, char **argv) { QApplication a(argc, argv); KsCaptureDialog cd; int c; while ((c = getopt(argc, argv, "o:")) != -1) { switch(c) { case 'o': cd.setOutputFileName(QString(optarg)); break; } } cd.show(); return a.exec(); } trace-cmd-v2.9.6/kernel-shark/src/libkshark-collection.c000066400000000000000000000553501414302661500232130ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ /** * @file libkshark-collection.c * @brief Data Collections. */ // C #include #include #include #include // KernelShark #include "libkshark.h" /* Quiet warnings over documenting simple structures */ //! @cond Doxygen_Suppress enum collection_point_type { COLLECTION_IGNORE = 0, COLLECTION_RESUME, COLLECTION_BREAK, }; #define LAST_BIN -3 struct entry_list { struct entry_list *next; size_t index; uint8_t type; }; enum map_flags { COLLECTION_BEFORE = -1, COLLECTION_INSIDE = 0, COLLECTION_AFTER = 1, }; //! @endcond /* * If the type of the last added entry is COLLECTION_IGNORE, overwrite this * entry (ignore the old entry values). Else add a new entry to the list. */ static bool collection_add_entry(struct entry_list **list, size_t i, uint8_t type) { struct entry_list *entry = *list; if (entry->type != COLLECTION_IGNORE) { entry->next = malloc(sizeof(*entry)); if (!entry->next) return false; entry = entry->next; *list = entry; } entry->index = i; entry->type = type; return true; } static struct kshark_entry_collection * kshark_data_collection_alloc(struct kshark_context *kshark_ctx, struct kshark_entry **data, ssize_t first, size_t n_rows, matching_condition_func cond, int val, size_t margin) { struct kshark_entry_collection *col_ptr = NULL; struct kshark_entry *last_vis_entry = NULL; struct entry_list *col_list, *temp; size_t resume_count = 0, break_count = 0; size_t i, j, last_added = 0; ssize_t end; bool good_data = false; /* Create the collection. */ col_ptr = calloc(1, sizeof(*col_ptr)); if (!col_ptr) goto fail; end = first + n_rows - margin; if (first >= end) return col_ptr; col_list = malloc(sizeof(*col_list)); if (!col_list) goto fail; temp = col_list; if (margin != 0) { /* * If this collection includes margin data, add a margin data * interval at the very beginning of the data-set. */ temp->index = first; temp->type = COLLECTION_RESUME; ++resume_count; collection_add_entry(&temp, first + margin - 1, COLLECTION_BREAK); ++break_count; } else { temp->type = COLLECTION_IGNORE; } for (i = first + margin; i < end; ++i) { if (!cond(kshark_ctx, data[i], val)) { /* * The entry is irrelevant for this collection. * Do nothing. */ continue; } /* The Matching condition is satisfed. */ if (!good_data) { /* * Resume the collection here. Add some margin data * in front of the data of interest. */ good_data = true; if (last_added == 0 || last_added < i - margin) { collection_add_entry(&temp, i - margin, COLLECTION_RESUME); ++resume_count; } else { /* * Ignore the last collection Break point. * Continue extending the previous data * interval. */ temp->type = COLLECTION_IGNORE; --break_count; } } else if (good_data && data[i]->next && !cond(kshark_ctx, data[i]->next, val)) { /* * Break the collection here. Add some margin data * after the data of interest. */ good_data = false; last_vis_entry = data[i]; /* Keep adding entries until the "next" record. */ for (j = i + 1; j != end && last_vis_entry->next != data[j]; j++) ; /* * If the number of added entries is smaller than the * number of margin entries requested, keep adding * until you fill the margin. */ if (i + margin >= j) { for (;j < i + margin; ++j) { if (cond(kshark_ctx, data[j], val)) { /* * Good data has been found. * Continue extending the * previous data interval. */ good_data = true; break; } } } last_added = i = j; if (!good_data) { collection_add_entry(&temp, i, COLLECTION_BREAK); ++break_count; } } } if (good_data) { collection_add_entry(&temp, end - 1, COLLECTION_BREAK); ++break_count; } if (margin != 0) { /* * If this collection includes margin data, add a margin data * interval at the very end of the data-set. */ collection_add_entry(&temp, first + n_rows - margin, COLLECTION_RESUME); ++resume_count; collection_add_entry(&temp, first + n_rows - 1, COLLECTION_BREAK); ++break_count; } /* * If everything is OK, we must have pairs of COLLECTION_RESUME * and COLLECTION_BREAK points. */ assert(break_count == resume_count); col_ptr->next = NULL; col_ptr->resume_points = calloc(resume_count, sizeof(*col_ptr->resume_points)); if (!col_ptr->resume_points) goto fail; col_ptr->break_points = calloc(break_count, sizeof(*col_ptr->break_points)); if (!col_ptr->break_points) { free(col_ptr->resume_points); goto fail; } col_ptr->cond = cond; col_ptr->val = val; col_ptr->size = resume_count; for (i = 0; i < col_ptr->size; ++i) { assert(col_list->type == COLLECTION_RESUME); col_ptr->resume_points[i] = col_list->index; temp = col_list; col_list = col_list->next; free(temp); assert(col_list->type == COLLECTION_BREAK); col_ptr->break_points[i] = col_list->index; temp = col_list; col_list = col_list->next; free(temp); } return col_ptr; fail: fprintf(stderr, "Failed to allocate memory for Data collection.\n"); free(col_ptr); for (i = 0; i < resume_count + break_count; ++i) { temp = col_list; col_list = col_list->next; free(temp); } return NULL; } /* * This function provides mapping between the index inside the data-set and * the index of the collection interval. Additional output flag is used to * resolve the ambiguity of the mapping. If the value of the flag is * COLLECTION_INSIDE, the "source_index" is inside the returned interval. If * the value of the flag is COLLECTION_BEFORE, the "source_index" is inside * the gap before the returned interval. If the value of the flag is * COLLECTION_AFTER, the "source_index" is inside the gap after the returned * interval. */ static ssize_t map_collection_index_from_source(const struct kshark_entry_collection *col, size_t source_index, int *flag) { size_t l, h, mid; if (!col->size) return KS_EMPTY_BIN; l = 0; h = col->size - 1; if (source_index < col->resume_points[l]) { *flag = COLLECTION_BEFORE; return l; } if (source_index >= col->resume_points[h]) { if (source_index < col->break_points[h]) *flag = COLLECTION_INSIDE; else *flag = COLLECTION_AFTER; return h; } BSEARCH(h, l, source_index > col->resume_points[mid]); if (source_index <= col->break_points[l]) *flag = COLLECTION_INSIDE; else *flag = COLLECTION_AFTER; return l; } static ssize_t map_collection_request_init(const struct kshark_entry_collection *col, struct kshark_entry_request *req, bool front, size_t *end) { int col_index_flag; ssize_t col_index; size_t req_end; if (req->next || col->size == 0) { fprintf(stderr, "Unexpected input in "); fprintf(stderr, "map_collection_request_init()\n"); goto do_nothing; } req_end = front ? req->first + req->n - 1 : req->first - req->n + 1; /* * Find the first Resume Point of the collection which is equal or * greater than the first index of this request. */ col_index = map_collection_index_from_source(col, req->first, &col_index_flag); /* * The value of "col_index" is ambiguous. Use the "col_index_flag" to * deal with all possible cases. */ if (col_index == KS_EMPTY_BIN) { /* Empty collection. */ goto do_nothing; } if (col_index_flag == COLLECTION_AFTER) { /* * This request starts after the end of interval "col_index". */ if (front && (col_index == col->size - 1 || req_end < col->resume_points[col_index + 1])) { /* * No overlap between the collection and this front * request. Do nothing. */ goto do_nothing; } else if (!front && req_end > col->break_points[col_index]) { /* * No overlap between the collection and this back * request. Do nothing. */ goto do_nothing; } /* Remember that the initial request starts in the gap between * the end of "col_index" interval and the beginning of * "col_index + 1" interval. If we process a Front request, we * have to go forwards, so the proper place for starting our * search will be the Resume point of the "col_index + 1" * interval. However, if we process a Back request, we will be * going backwards, so the proper place to start will be the * Break point of "col_index". */ req->first = front ? col->resume_points[++col_index] : col->break_points[col_index]; } if (col_index_flag == COLLECTION_BEFORE) { /* * This request starts before the beginning of interval * "col_index". */ if (!front && (col_index == 0 || req_end > col->break_points[col_index - 1])) { /* * No overlap between the collection and this back * request. Do nothing. */ goto do_nothing; } else if (front && req_end < col->resume_points[col_index]) { /* * No overlap between the collection and this front * request. Do nothing. */ goto do_nothing; } /* Remember that the initial request starts in the gap between * the end of "col_index - 1" interval and the beginning of * "col_index" interval. If we process a Front request, we have * to go forwards, so the proper place for starting our search * will be the Resume point of the "col_index" interval. * However, if we process a Back request, we will be going * backwards, so the proper place to start will be the Break * point of "col_index - 1". */ req->first = front ? col->resume_points[col_index] : col->break_points[--col_index]; } *end = req_end; return col_index; do_nothing: *end = KS_EMPTY_BIN; return KS_EMPTY_BIN; } /* * This function uses the intervals of the Data collection to transform the * inputted single data request into a list of data requests. The new list of * request will ignore the data outside of the intervals of the collection. */ static int map_collection_back_request(const struct kshark_entry_collection *col, struct kshark_entry_request *req) { size_t req_first, req_end; ssize_t col_index; int req_count; col_index = map_collection_request_init(col, req, false, &req_end); if (col_index == KS_EMPTY_BIN) return 0; /* * Now loop over the intervals of the collection going backwards till * the end of the inputted request and create a separate request for * each of those interest. */ req_count = 1; while (col_index >= 0 && req_end <= col->break_points[col_index]) { if (req_end >= col->resume_points[col_index]) { /* * The last entry of the original request is inside * the "col_index" collection interval. Close the * collection request here and return. */ req->n = req->first - req_end + 1; break; } /* * The last entry of the original request is outside of the * "col_index" interval. Close the collection request at the * end of this interval and move to the next one. Try to make * another request there. */ req->n = req->first - col->resume_points[col_index] + 1; --col_index; if (req_end > col->break_points[col_index]) { /* * The last entry of the original request comes before * the end of the next collection interval. Stop here. */ break; } if (col_index > 0) { /* Make a new request. */ req_first = col->break_points[col_index]; req->next = kshark_entry_request_alloc(req_first, 0, req->cond, req->val, req->vis_only, req->vis_mask); if (!req->next) goto fail; req = req->next; ++req_count; } } return req_count; fail: fprintf(stderr, "Failed to allocate memory for Collection data request.\n"); return -ENOMEM; } /* * This function uses the intervals of the Data collection to transform the * inputted single data request into a list of data requests. The new list of * requests will ignore the data outside of the intervals of the collection. */ static int map_collection_front_request(const struct kshark_entry_collection *col, struct kshark_entry_request *req) { size_t req_first, req_end; ssize_t col_index; int req_count; col_index = map_collection_request_init(col, req, true, &req_end); if (col_index == KS_EMPTY_BIN) return 0; /* * Now loop over the intervals of the collection going forwards till * the end of the inputted request and create a separate request for * each of those interest. */ req_count = 1; while (col_index < col->size && req_end >= col->resume_points[col_index]) { if (req_end <= col->break_points[col_index]) { /* * The last entry of the original request is inside * the "col_index" collection interval. * Close the collection request here and return. */ req->n = req_end - req->first + 1; break; } /* * The last entry of the original request is outside this * collection interval (col_index). Close the collection * request at the end of the interval and move to the next * interval. Try to make another request there. */ req->n = col->break_points[col_index] - req->first + 1; ++col_index; if (req_end < col->resume_points[col_index]) { /* * The last entry of the original request comes before * the beginning of next collection interval. * Stop here. */ break; } if (col_index < col->size) { /* Make a new request. */ req_first = col->resume_points[col_index]; req->next = kshark_entry_request_alloc(req_first, 0, req->cond, req->val, req->vis_only, req->vis_mask); if (!req->next) goto fail; req = req->next; ++req_count; } } return req_count; fail: fprintf(stderr, "Failed to allocate memory for Collection data request.\n"); return -ENOMEM; } /** * @brief Search for an entry satisfying the requirements of a given Data * request. Start from the position provided by the request and go * searching in the direction of the increasing timestamps (front). * The search is performed only inside the intervals, defined by * the data collection. * * @param req: Input location for a single Data request. The imputted request * will be transformed into a list of requests. This new list of * requests will ignore the data outside of the intervals of the * collection. * @param data: Input location for the trace data. * @param col: Input location for the Data collection. * @param index: Optional output location for the index of the returned * entry inside the array. * * @returns Pointer to the first entry satisfying the matching condition on * success, or NULL on failure. * In the special case when some entries, satisfying the Matching * condition function have been found, but all these entries have * been discarded because of the visibility criteria (filtered * entries), the function returns a pointer to a special * "Dummy entry". */ const struct kshark_entry * kshark_get_collection_entry_front(struct kshark_entry_request *req, struct kshark_entry **data, const struct kshark_entry_collection *col, ssize_t *index) { const struct kshark_entry *entry = NULL; int req_count; if (index) *index = KS_EMPTY_BIN; /* * Use the intervals of the Data collection to redefine the data * request in a way which will ignore the data outside of the * intervals of the collection. */ req_count = map_collection_front_request(col, req); if (req_count <= 0) return NULL; /* * Loop over the list of redefined requests and search until you find * the first matching entry. */ while (req) { entry = kshark_get_entry_front(req, data, index); if (entry) break; req = req->next; } return entry; } /** * @brief Search for an entry satisfying the requirements of a given Data * request. Start from the position provided by the request and go * searching in the direction of the decreasing timestamps (back). * The search is performed only inside the intervals, defined by * the data collection. * * @param req: Input location for Data request. The imputed request * will be transformed into a list of requests. This new list of * requests will ignore the data outside of the intervals of the * collection. * @param data: Input location for the trace data. * @param col: Input location for the Data collection. * @param index: Optional output location for the index of the returned * entry inside the array. * * @returns Pointer to the first entry satisfying the matching condition on * success, or NULL on failure. * In the special case when some entries, satisfying the Matching * condition function have been found, but all these entries have * been discarded because of the visibility criteria (filtered * entries), the function returns a pointer to a special * "Dummy entry". */ const struct kshark_entry * kshark_get_collection_entry_back(struct kshark_entry_request *req, struct kshark_entry **data, const struct kshark_entry_collection *col, ssize_t *index) { const struct kshark_entry *entry = NULL; int req_count; if (index) *index = KS_EMPTY_BIN; /* * Use the intervals of the Data collection to redefine the data * request in a way which will ignore the data outside of the * intervals of the collection. */ req_count = map_collection_back_request(col, req); if (req_count <= 0) return NULL; /* * Loop over the list of redefined requests and search until you find * the first matching entry. */ while (req) { entry = kshark_get_entry_back(req, data, index); if (entry) break; req = req->next; } return entry; } /** * @brief Search the list of Data collections and find the collection defined * with a given Matching condition function and value. * * @param col: Input location for the Data collection list. * @param cond: Matching condition function. * @param val: Matching condition value, used by the Matching condition * function. * * @returns Pointer to a Data collections on success, or NULL on failure. */ struct kshark_entry_collection * kshark_find_data_collection(struct kshark_entry_collection *col, matching_condition_func cond, int val) { while (col) { if (col->cond == cond && col->val == val) return col; col = col->next; } return NULL; } /** * @brief Clear all data intervals of the given Data collection. * * @param col: Input location for the Data collection. */ void kshark_reset_data_collection(struct kshark_entry_collection *col) { free(col->resume_points); col->resume_points = NULL; free(col->break_points); col->break_points = NULL; col->size = 0; } static void kshark_free_data_collection(struct kshark_entry_collection *col) { free(col->resume_points); free(col->break_points); free(col); } /** * @brief Allocate and process data collection, defined with a given Matching * condition function and value. Add this collection to the list of * collections used by the session. * * @param kshark_ctx: Input location for the session context pointer. * @param data: Input location for the trace data. * @param n_rows: The size of the inputted data. * @param cond: Matching condition function for the collection to be * registered. * @param val: Matching condition value of for collection to be registered. * @param margin: The size of the additional (margin) data which do not * satisfy the matching condition, but is added at the * beginning and at the end of each interval of the collection * as well as at the beginning and at the end of data-set. If * "0", no margin data is added. * * @returns Pointer to the registered Data collections on success, or NULL * on failure. */ struct kshark_entry_collection * kshark_register_data_collection(struct kshark_context *kshark_ctx, struct kshark_entry **data, size_t n_rows, matching_condition_func cond, int val, size_t margin) { struct kshark_entry_collection *col; col = kshark_add_collection_to_list(kshark_ctx, &kshark_ctx->collections, data, n_rows, cond, val, margin); return col; } /** * @brief Allocate and process data collection, defined with a given Matching * condition function and value. Add this collection to a given list of * collections. * * @param kshark_ctx: Input location for the session context pointer. * @param col_list: Input location for the list of collections. * @param data: Input location for the trace data. * @param n_rows: The size of the inputted data. * @param cond: Matching condition function for the collection to be * registered. * @param val: Matching condition value of for collection to be registered. * @param margin: The size of the additional (margin) data which do not * satisfy the matching condition, but is added at the * beginning and at the end of each interval of the collection * as well as at the beginning and at the end of data-set. If * "0", no margin data is added. * * @returns Pointer to the registered Data collections on success, or NULL * on failure. */ struct kshark_entry_collection * kshark_add_collection_to_list(struct kshark_context *kshark_ctx, struct kshark_entry_collection **col_list, struct kshark_entry **data, size_t n_rows, matching_condition_func cond, int val, size_t margin) { struct kshark_entry_collection *col; col = kshark_data_collection_alloc(kshark_ctx, data, 0, n_rows, cond, val, margin); if (col) { col->next = *col_list; *col_list = col; } return col; } /** * @brief Search the list of Data collections for a collection defined * with a given Matching condition function and value. If such a * collection exists, unregister (remove and free) this collection * from the list. * * @param col: Input location for the Data collection list. * @param cond: Matching condition function of the collection to be * unregistered. * * @param val: Matching condition value of the collection to be unregistered. */ void kshark_unregister_data_collection(struct kshark_entry_collection **col, matching_condition_func cond, int val) { struct kshark_entry_collection **last = col; struct kshark_entry_collection *list; for (list = *col; list; list = list->next) { if (list->cond == cond && list->val == val) { *last = list->next; kshark_free_data_collection(list); return; } last = &list->next; } } /** * @brief Free all Data collections in a given list. * * @param col: Input location for the Data collection list. */ void kshark_free_collection_list(struct kshark_entry_collection *col) { struct kshark_entry_collection *last; while (col) { last = col; col = col->next; kshark_free_data_collection(last); } } trace-cmd-v2.9.6/kernel-shark/src/libkshark-configio.c000066400000000000000000001255701414302661500226570ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ /** * @file libkshark-configio.c * @brief Json Configuration I/O. */ // C #ifndef _GNU_SOURCE /** Use GNU C Library. */ #define _GNU_SOURCE #endif #include #include // KernelShark #include "libkshark.h" #include "libkshark-model.h" static struct json_object *kshark_json_config_alloc(const char *type) { json_object *jobj, *jtype; jobj = json_object_new_object(); jtype = json_object_new_string(type); if (!jobj || !jtype) goto fail; /* Set the type of this Json document. */ json_object_object_add(jobj, "type", jtype); return jobj; fail: fprintf(stderr, "Failed to allocate memory for json_object.\n"); json_object_put(jobj); json_object_put(jtype); return NULL; } /** * @brief Allocate kshark_config_doc and set its format. * * @param format: Input location for the Configuration format identifier. * Currently only Json and String formats are supported. * * @returns kshark_config_doc instance on success, otherwise NULL. Use * free() to free the object. */ struct kshark_config_doc * kshark_config_alloc(enum kshark_config_formats format) { struct kshark_config_doc *doc; switch (format) { case KS_CONFIG_AUTO: case KS_CONFIG_JSON: case KS_CONFIG_STRING: doc = malloc(sizeof(*doc)); if (!doc) goto fail; doc->format = format; doc->conf_doc = NULL; return doc; default: fprintf(stderr, "Document format %d not supported\n", format); } return NULL; fail: fprintf(stderr, "Failed to allocate memory for kshark_config_doc.\n"); return NULL; } /** * @brief Create an empty Configuration document and set its format and type. * * @param type: String describing the type of the document, * e.g. "kshark.config.record" or "kshark.config.filter". * @param format: Input location for the Configuration format identifier. * Currently only Json format is supported. * * @returns kshark_config_doc instance on success, otherwise NULL. Use * kshark_free_config_doc() to free the object. */ struct kshark_config_doc * kshark_config_new(const char *type, enum kshark_config_formats format) { struct kshark_config_doc *doc = NULL; if (format == KS_CONFIG_AUTO) format = KS_CONFIG_JSON; switch (format) { case KS_CONFIG_JSON: doc = kshark_config_alloc(format); if (doc) { doc->conf_doc = kshark_json_config_alloc(type); if (!doc->conf_doc) { free(doc); doc = NULL; } } break; case KS_CONFIG_STRING: doc = kshark_config_alloc(format); break; default: fprintf(stderr, "Document format %d not supported\n", format); return NULL; } return doc; } /** * @brief Free the Configuration document. * * @param conf: Input location for the kshark_config_doc instance. It is safe * to pass a NULL value. */ void kshark_free_config_doc(struct kshark_config_doc *conf) { if (!conf) return; switch (conf->format) { case KS_CONFIG_JSON: json_object_put(conf->conf_doc); break; case KS_CONFIG_STRING: free(conf->conf_doc); break; } free(conf); } /** * @brief Use an existing Json document to create a new KernelShark * Configuration document. * * @param jobj: Input location for the json_object instance. * * @returns shark_config_doc instance on success, otherwise NULL. Use * kshark_free_config_doc() to free the object. */ struct kshark_config_doc *kshark_json_to_conf(struct json_object *jobj) { struct kshark_config_doc *conf = kshark_config_alloc(KS_CONFIG_JSON); if (conf) conf->conf_doc = jobj; return conf; } /** * @brief Use an existing string to create a new KernelShark Configuration * document. * * @param val: Input location for the string. * * @returns shark_config_doc instance on success, otherwise NULL. Use * kshark_free_config_doc() to free the object. */ struct kshark_config_doc *kshark_string_to_conf(const char* val) { struct kshark_config_doc *conf; char *str; conf = kshark_config_alloc(KS_CONFIG_STRING); if (conf) { if (asprintf(&str, "%s", val) > 0) { conf->conf_doc = str; } else { fprintf(stderr, "Failed to allocate string conf. doc.\n"); free(conf); conf = NULL; } } return conf; } /** * @brief Add a field to a KernelShark Configuration document. * * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * @param key: The name of the field. * @param val: Input location for the kshark_config_doc to be added. Currently * only Json and String formats are supported. Pass KS_CONFIG_AUTO * if you want "val" to have the same fornat as "conf". Upon * calling this function, the ownership of "val" transfers to * "conf". * * @returns True on success, otherwise False. */ bool kshark_config_doc_add(struct kshark_config_doc *conf, const char *key, struct kshark_config_doc *val) { struct json_object *jobj = NULL; if (!conf || !val) return false; if (val->format == KS_CONFIG_AUTO) val->format = conf->format; switch (conf->format) { case KS_CONFIG_JSON: switch (val->format) { case KS_CONFIG_JSON: json_object_object_add(conf->conf_doc, key, val->conf_doc); break; case KS_CONFIG_STRING: jobj = json_object_new_string(val->conf_doc); if (!jobj) goto fail; json_object_object_add(conf->conf_doc, key, jobj); break; default: fprintf(stderr, "Value format %d not supported\n", val->format); return false; } free(val); break; default: fprintf(stderr, "Document format %d not supported\n", conf->format); return false; } return true; fail: fprintf(stderr, "Failed to allocate memory for json_object.\n"); json_object_put(jobj); return false; } static bool get_jval(struct kshark_config_doc *conf, const char *key, void **val) { return json_object_object_get_ex(conf->conf_doc, key, (json_object **) val); } /** * @brief Get the KernelShark Configuration document associate with a given * field name. * * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * @param key: The name of the field. * @param val: Output location for the kshark_config_doc instance containing * the field. Currently only Json and String formats are supported. * * @returns True, if the key exists, otherwise False. */ bool kshark_config_doc_get(struct kshark_config_doc *conf, const char *key, struct kshark_config_doc *val) { struct kshark_config_doc *tmp; if (!conf || !val) return false; if (val->format == KS_CONFIG_AUTO) val->format = conf->format; switch (conf->format) { case KS_CONFIG_JSON: switch (val->format) { case KS_CONFIG_JSON: json_object_put(val->conf_doc); if (!get_jval(conf, key, &val->conf_doc)) goto fail; return true; case KS_CONFIG_STRING: tmp = kshark_config_alloc(KS_CONFIG_AUTO); if (!tmp) goto fail; if (!get_jval(conf, key, &tmp->conf_doc)) goto fail; val->conf_doc = (char *) json_object_get_string(tmp->conf_doc); free(tmp); return true; default: fprintf(stderr, "Value format %d not supported\n", val->format); return false; } break; default: fprintf(stderr, "Document format %d not supported\n", conf->format); return false; } return true; fail: fprintf(stderr, "Failed to get config. document.\n"); return false; } /** * @brief Create an empty Record Configuration document. The type description * is set to "kshark.config.record". * * @returns kshark_config_doc instance on success, otherwise NULL. Use * kshark_free_config_doc() to free the object. */ struct kshark_config_doc * kshark_record_config_new(enum kshark_config_formats format) { return kshark_config_new("kshark.config.record", format); } /** * @brief Create an empty Filter Configuration document. The type description * is set to "kshark.config.filter". * * @returns kshark_config_doc instance on success, otherwise NULL. Use * kshark_free_config_doc() to free the object. */ struct kshark_config_doc * kshark_filter_config_new(enum kshark_config_formats format) { return kshark_config_new("kshark.config.filter", format); } /** * @brief Create an empty Text Configuration document. The Text Configuration * documents do not use type descriptions. * * @returns kshark_config_doc instance on success, otherwise NULL. Use free() * to free the object. */ struct kshark_config_doc *kshark_string_config_alloc(void) { return kshark_config_alloc(KS_CONFIG_STRING); } static void json_del_if_exist(struct json_object *jobj, const char *key) { struct json_object *temp; if (json_object_object_get_ex(jobj, key, &temp)) json_object_object_del(jobj, key); } static bool kshark_json_type_check(struct json_object *jobj, const char *type) { struct json_object *jtype; const char *type_str; if (!json_object_object_get_ex(jobj, "type", &jtype)) return false; type_str = json_object_get_string(jtype); if (strcmp(type_str, type) != 0) return false; return true; } /** * @brief Check the type of a Configuration document and compare with an * expected value. * * @param conf: Input location for the kshark_config_doc instance. * @param type: Input location for the expected value of the Configuration * document type, e.g. "kshark.config.record" or * "kshark.config.filter". * * @returns True, if the document has the expected type, otherwise False. */ bool kshark_type_check(struct kshark_config_doc *conf, const char *type) { switch (conf->format) { case KS_CONFIG_JSON: return kshark_json_type_check(conf->conf_doc, type); default: fprintf(stderr, "Document format %d not supported\n", conf->format); return false; } } static bool kshark_trace_file_to_json(const char *file, struct json_object *jobj) { struct json_object *jfile_name, *jtime; struct stat st; if (!file || !jobj) return false; if (stat(file, &st) != 0) { fprintf(stderr, "Unable to find file %s\n", file); return false; } jfile_name = json_object_new_string(file); jtime = json_object_new_int64(st.st_mtime); if (!jfile_name || !jtime) goto fail; json_object_object_add(jobj, "file", jfile_name); json_object_object_add(jobj, "time", jtime); return true; fail: fprintf(stderr, "Failed to allocate memory for json_object.\n"); json_object_put(jobj); json_object_put(jfile_name); json_object_put(jtime); return false; } /** * @brief Record the name of a trace data file and its timestamp into a * Configuration document. * * @param file: The name of the file. * @param format: Input location for the Configuration format identifier. * Currently only Json format is supported. * * @returns True on success, otherwise False. */ struct kshark_config_doc * kshark_export_trace_file(const char *file, enum kshark_config_formats format) { /* Create a new Configuration document. */ struct kshark_config_doc *conf = kshark_config_new("kshark.config.data", format); if (!conf) return NULL; switch (format) { case KS_CONFIG_JSON: kshark_trace_file_to_json(file, conf->conf_doc); return conf; default: fprintf(stderr, "Document format %d not supported\n", conf->format); return NULL; } } static bool kshark_trace_file_from_json(const char **file, struct json_object *jobj) { struct json_object *jfile_name, *jtime; const char *file_str; struct stat st; int64_t time; if (!jobj) return false; if (!kshark_json_type_check(jobj, "kshark.config.data") || !json_object_object_get_ex(jobj, "file", &jfile_name) || !json_object_object_get_ex(jobj, "time", &jtime)) { fprintf(stderr, "Failed to retrieve data file from json_object.\n"); return false; } file_str = json_object_get_string(jfile_name); time = json_object_get_int64(jtime); if (stat(file_str, &st) != 0) { fprintf(stderr, "Unable to find file %s\n", file_str); return false; } if (st.st_mtime != time) { fprintf(stderr,"Timestamp mismatch!\nFile %s", file_str); return false; } *file = file_str; return true; } /** * @brief Read the name of a trace data file and its timestamp from a * Configuration document and check if such a file exists. * If the file exists, open it. * * @param kshark_ctx: Input location for session context pointer. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns The name of the file on success, otherwise NULL. "conf" has * the ownership over the returned string. */ const char* kshark_import_trace_file(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf) { const char *file = NULL; switch (conf->format) { case KS_CONFIG_JSON: if (kshark_trace_file_from_json(&file, conf->conf_doc)) kshark_open(kshark_ctx, file); break; default: fprintf(stderr, "Document format %d not supported\n", conf->format); return NULL; } return file; } static bool kshark_model_to_json(struct kshark_trace_histo *histo, struct json_object *jobj) { struct json_object *jrange, *jmin, *jmax, *jn_bins; if (!histo || !jobj) return false; jrange = json_object_new_array(); jmin = json_object_new_int64(histo->min); jmax = json_object_new_int64(histo->max); jn_bins = json_object_new_int(histo->n_bins); if (!jrange || !jmin || !jmax || !jn_bins) goto fail; json_object_array_put_idx(jrange, 0, jmin); json_object_array_put_idx(jrange, 1, jmax); json_object_object_add(jobj, "range", jrange); json_object_object_add(jobj, "bins", jn_bins); return true; fail: fprintf(stderr, "Failed to allocate memory for json_object.\n"); json_object_put(jobj); json_object_put(jrange); json_object_put(jmin); json_object_put(jmax); json_object_put(jn_bins); return false; } /** * @brief Record the current configuration of the Vis. model into a * Configuration document. * Load the configuration of the Vis. model from a Configuration * document. * * @param histo: Input location for the Vis. model descriptor. * @param format: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True on success, otherwise False. */ struct kshark_config_doc * kshark_export_model(struct kshark_trace_histo *histo, enum kshark_config_formats format) { /* Create a new Configuration document. */ struct kshark_config_doc *conf = kshark_config_new("kshark.config.model", format); if (!conf) return NULL; switch (format) { case KS_CONFIG_JSON: kshark_model_to_json(histo, conf->conf_doc); return conf; default: fprintf(stderr, "Document format %d not supported\n", format); return NULL; } } static bool kshark_model_from_json(struct kshark_trace_histo *histo, struct json_object *jobj) { struct json_object *jrange, *jmin, *jmax, *jn_bins; uint64_t min, max; int n_bins; if (!histo || !jobj) return false; if (!kshark_json_type_check(jobj, "kshark.config.model") || !json_object_object_get_ex(jobj, "range", &jrange) || !json_object_object_get_ex(jobj, "bins", &jn_bins) || json_object_get_type(jrange) != json_type_array || json_object_array_length(jrange) != 2) goto fail; jmin = json_object_array_get_idx(jrange, 0); jmax = json_object_array_get_idx(jrange, 1); if (!jmin || !jmax) goto fail; min = json_object_get_int64(jmin); max = json_object_get_int64(jmax); n_bins = json_object_get_int(jn_bins); ksmodel_set_bining(histo, n_bins, min, max); if (histo->data && histo->data_size) ksmodel_fill(histo, histo->data, histo->data_size); return true; fail: fprintf(stderr, "Failed to load event filter from json_object.\n"); return false; } /** * @brief Load the configuration of the Vis. model from a Configuration * document. * * @param histo: Input location for the Vis. model descriptor. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True, if the model has been loaded. If the model configuration * document contains no data or in a case of an error, the function * returns False. */ bool kshark_import_model(struct kshark_trace_histo *histo, struct kshark_config_doc *conf) { switch (conf->format) { case KS_CONFIG_JSON: return kshark_model_from_json(histo, conf->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", conf->format); return false; } } static bool kshark_event_filter_to_json(struct tep_handle *pevent, struct tracecmd_filter_id *filter, const char *filter_name, struct json_object *jobj) { json_object *jfilter_data, *jevent, *jsystem, *jname; struct tep_event *event; int i, evt, *ids, nr_events; char *temp; jevent = jsystem = jname = NULL; /* * If this Json document already contains a description of the filter, * delete this description. */ json_del_if_exist(jobj, filter_name); /* Get the array of Ids to be fitered. */ ids = tracecmd_filter_ids(filter); if (!ids) return true; /* Create a Json array and fill the Id values into it. */ jfilter_data = json_object_new_array(); if (!jfilter_data) goto fail; nr_events = tep_get_events_count(pevent); for (i = 0; i < filter->count; ++i) { for (evt = 0; evt < nr_events; ++evt) { event = tep_get_event(pevent, evt); if (event->id == ids[i]) { jevent = json_object_new_object(); temp = event->system; jsystem = json_object_new_string(temp); temp = event->name; jname = json_object_new_string(temp); if (!jevent || !jsystem || !jname) goto fail; json_object_object_add(jevent, "system", jsystem); json_object_object_add(jevent, "name", jname); json_object_array_add(jfilter_data, jevent); break; } } } free(ids); /* Add the array of Ids to the filter config document. */ json_object_object_add(jobj, filter_name, jfilter_data); return true; fail: fprintf(stderr, "Failed to allocate memory for json_object.\n"); json_object_put(jfilter_data); json_object_put(jevent); json_object_put(jsystem); json_object_put(jname); free(ids); return false; } /** * @brief Record the current configuration of an Event Id filter into a * Configuration document. * * @param pevent: Input location for the Page event. * @param filter: Input location for an Id filter. * @param filter_name: The name of the filter to show up in the Json document. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True on success, otherwise False. */ bool kshark_export_event_filter(struct tep_handle *pevent, struct tracecmd_filter_id *filter, const char *filter_name, struct kshark_config_doc *conf) { switch (conf->format) { case KS_CONFIG_JSON: return kshark_event_filter_to_json(pevent, filter, filter_name, conf->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", conf->format); return false; } } static int kshark_event_filter_from_json(struct tep_handle *pevent, struct tracecmd_filter_id *filter, const char *filter_name, struct json_object *jobj) { json_object *jfilter, *jevent, *jsystem, *jname; const char *system_str, *name_str; struct tep_event *event; int i, length, count = 0; /* * Use the name of the filter to find the array of events associated * with this filter. Notice that the filter config document may * contain no data for this particular filter. */ if (!json_object_object_get_ex(jobj, filter_name, &jfilter)) return 0; if (!kshark_json_type_check(jobj, "kshark.config.filter") || json_object_get_type(jfilter) != json_type_array) goto fail; /* Set the filter. */ length = json_object_array_length(jfilter); for (i = 0; i < length; ++i) { jevent = json_object_array_get_idx(jfilter, i); if (!json_object_object_get_ex(jevent, "system", &jsystem) || !json_object_object_get_ex(jevent, "name", &jname)) goto fail; system_str = json_object_get_string(jsystem); name_str = json_object_get_string(jname); event = tep_find_event_by_name(pevent, system_str, name_str); if (!event) continue; tracecmd_filter_id_add(filter, event->id); ++count; } if (count != length) count = -count; return count; fail: fprintf(stderr, "Failed to load event filter from json_object.\n"); tracecmd_filter_id_clear(filter); return 0; } /** * @brief Load from Configuration document the configuration of an Event Id filter. * * @param pevent: Input location for the Page event. * @param filter: Input location for an Id filter. * @param filter_name: The name of the filter as showing up in the Config. * document. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns The total number of events added to the filter. If not all events * listed in the input configuration have been added successfully, * the returned number is negative. */ int kshark_import_event_filter(struct tep_handle *pevent, struct tracecmd_filter_id *filter, const char *filter_name, struct kshark_config_doc *conf) { switch (conf->format) { case KS_CONFIG_JSON: return kshark_event_filter_from_json(pevent, filter, filter_name, conf->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", conf->format); return 0; } } static bool kshark_filter_array_to_json(struct tracecmd_filter_id *filter, const char *filter_name, struct json_object *jobj) { json_object *jfilter_data, *jpid = NULL; int i, *ids; /* * If this Json document already contains a description of the filter, * delete this description. */ json_del_if_exist(jobj, filter_name); /* Get the array of Ids to be filtered. */ ids = tracecmd_filter_ids(filter); if (!ids) return true; /* Create a Json array and fill the Id values into it. */ jfilter_data = json_object_new_array(); if (!jfilter_data) goto fail; for (i = 0; i < filter->count; ++i) { jpid = json_object_new_int(ids[i]); if (!jpid) goto fail; json_object_array_add(jfilter_data, jpid); } free(ids); /* Add the array of Ids to the filter config document. */ json_object_object_add(jobj, filter_name, jfilter_data); return true; fail: fprintf(stderr, "Failed to allocate memory for json_object.\n"); json_object_put(jfilter_data); json_object_put(jpid); free(ids); return false; } /** * @brief Record the current configuration of a simple Id filter into a * Configuration document. * * @param filter: Input location for an Id filter. * @param filter_name: The name of the filter to show up in the Json document. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True on success, otherwise False. */ bool kshark_export_filter_array(struct tracecmd_filter_id *filter, const char *filter_name, struct kshark_config_doc *conf) { switch (conf->format) { case KS_CONFIG_JSON: return kshark_filter_array_to_json(filter, filter_name, conf->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", conf->format); return false; } } static bool kshark_filter_array_from_json(struct tracecmd_filter_id *filter, const char *filter_name, struct json_object *jobj) { json_object *jfilter, *jpid; int i, length; /* * Use the name of the filter to find the array of events associated * with this filter. Notice that the filter config document may * contain no data for this particular filter. */ if (!json_object_object_get_ex(jobj, filter_name, &jfilter)) return false; if (!kshark_json_type_check(jobj, "kshark.config.filter") || json_object_get_type(jfilter) != json_type_array) goto fail; /* Set the filter. */ length = json_object_array_length(jfilter); for (i = 0; i < length; ++i) { jpid = json_object_array_get_idx(jfilter, i); if (!jpid) goto fail; tracecmd_filter_id_add(filter, json_object_get_int(jpid)); } return true; fail: fprintf(stderr, "Failed to load task filter from json_object.\n"); return false; } /** * @brief Load from Configuration document the configuration of a simple * Id filter. * * @param filter: Input location for an Id filter. * @param filter_name: The name of the filter as showing up in the Config. * document. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True, if a filter has been loaded. If the filter configuration * document contains no data for this particular filter or in a case * of an error, the function returns False. */ bool kshark_import_filter_array(struct tracecmd_filter_id *filter, const char *filter_name, struct kshark_config_doc *conf) { switch (conf->format) { case KS_CONFIG_JSON: return kshark_filter_array_from_json(filter, filter_name, conf->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", conf->format); return false; } } static bool kshark_adv_filters_to_json(struct kshark_context *kshark_ctx, struct json_object *jobj) { struct tep_event_filter *adv_filter = kshark_ctx->advanced_event_filter; json_object *jfilter_data, *jevent, *jsystem, *jname, *jfilter; struct tep_event **events; char *str; int i; jevent = jsystem = jname = jfilter = NULL; /* * If this Json document already contains a description of the model, * delete this description. */ json_del_if_exist(jobj, KS_ADV_EVENT_FILTER_NAME); if (!kshark_ctx->advanced_event_filter || !kshark_ctx->advanced_event_filter->filters) return true; /* Create a Json array and fill the Id values into it. */ jfilter_data = json_object_new_array(); if (!jfilter_data) goto fail; events = tep_list_events(kshark_ctx->pevent, TEP_EVENT_SORT_SYSTEM); if (!events) return false; for (i = 0; events[i]; i++) { str = tep_filter_make_string(adv_filter, events[i]->id); if (!str) continue; jevent = json_object_new_object(); jsystem = json_object_new_string(events[i]->system); jname = json_object_new_string(events[i]->name); jfilter = json_object_new_string(str); if (!jevent || !jsystem || !jname || !jfilter) goto fail; json_object_object_add(jevent, "system", jsystem); json_object_object_add(jevent, "name", jname); json_object_object_add(jevent, "condition", jfilter); json_object_array_add(jfilter_data, jevent); } /* Add the array of advanced filters to the filter config document. */ json_object_object_add(jobj, KS_ADV_EVENT_FILTER_NAME, jfilter_data); return true; fail: fprintf(stderr, "Failed to allocate memory for json_object.\n"); json_object_put(jfilter_data); json_object_put(jevent); json_object_put(jsystem); json_object_put(jname); json_object_put(jfilter); return false; } /** * @brief Record the current configuration of the advanced filter into a * Configuration document. * * @param kshark_ctx: Input location for session context pointer. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. If NULL, a new Adv. Filter * Configuration document will be created. * * @returns True on success, otherwise False. */ bool kshark_export_adv_filters(struct kshark_context *kshark_ctx, struct kshark_config_doc **conf) { if (!*conf) *conf = kshark_filter_config_new(KS_CONFIG_JSON); if (!*conf) return false; switch ((*conf)->format) { case KS_CONFIG_JSON: return kshark_adv_filters_to_json(kshark_ctx, (*conf)->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", (*conf)->format); return false; } } static bool kshark_adv_filters_from_json(struct kshark_context *kshark_ctx, struct json_object *jobj) { struct tep_event_filter *adv_filter = kshark_ctx->advanced_event_filter; json_object *jfilter, *jsystem, *jname, *jcond; int i, length, n, ret = 0; char *filter_str = NULL; /* * Use the name of the filter to find the array of events associated * with this filter. Notice that the filter config document may * contain no data for this particular filter. */ if (!json_object_object_get_ex(jobj, KS_ADV_EVENT_FILTER_NAME, &jfilter)) return false; if (!kshark_json_type_check(jobj, "kshark.config.filter") || json_object_get_type(jfilter) != json_type_array) goto fail; /* Set the filter. */ length = json_object_array_length(jfilter); for (i = 0; i < length; ++i) { jfilter = json_object_array_get_idx(jfilter, i); if (!json_object_object_get_ex(jfilter, "system", &jsystem) || !json_object_object_get_ex(jfilter, "name", &jname) || !json_object_object_get_ex(jfilter, "condition", &jcond)) goto fail; n = asprintf(&filter_str, "%s/%s:%s", json_object_get_string(jsystem), json_object_get_string(jname), json_object_get_string(jcond)); if (n <= 0) { filter_str = NULL; goto fail; } ret = tep_filter_add_filter_str(adv_filter, filter_str); if (ret < 0) goto fail; } return true; fail: fprintf(stderr, "Failed to laod Advanced filters.\n"); if (ret < 0) { char error_str[200]; int error_status = tep_strerror(kshark_ctx->pevent, ret, error_str, sizeof(error_str)); if (error_status == 0) fprintf(stderr, "filter failed due to: %s\n", error_str); } free(filter_str); return false; } /** * @brief Load from Configuration document the configuration of the advanced * filter. * * @param kshark_ctx: Input location for session context pointer. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True, if a filter has been loaded. If the filter configuration * document contains no data for the Adv. filter or in a case of * an error, the function returns False. */ bool kshark_import_adv_filters(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf) { switch (conf->format) { case KS_CONFIG_JSON: return kshark_adv_filters_from_json(kshark_ctx, conf->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", conf->format); return false; } } static bool kshark_user_mask_to_json(struct kshark_context *kshark_ctx, struct json_object *jobj) { uint8_t mask = kshark_ctx->filter_mask; json_object *jmask; jmask = json_object_new_int((int) mask); if (!jmask) return false; /* Add the mask to the filter config document. */ json_object_object_add(jobj, KS_USER_FILTER_MASK_NAME, jmask); return true; } /** * @brief Record the current value of the the user-specified filter mask into * a Configuration document. * * @param kshark_ctx: Input location for session context pointer. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. If NULL, a new Adv. Filter * Configuration document will be created. * * @returns True on success, otherwise False. */ bool kshark_export_user_mask(struct kshark_context *kshark_ctx, struct kshark_config_doc **conf) { if (!*conf) *conf = kshark_filter_config_new(KS_CONFIG_JSON); if (!*conf) return false; switch ((*conf)->format) { case KS_CONFIG_JSON: return kshark_user_mask_to_json(kshark_ctx, (*conf)->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", (*conf)->format); return false; } } static bool kshark_user_mask_from_json(struct kshark_context *kshark_ctx, struct json_object *jobj) { json_object *jmask; uint8_t mask; if (!kshark_json_type_check(jobj, "kshark.config.filter")) return false; /* * Use the name of the filter to find the value of the filter maks. * Notice that the filter config document may contain no data for * the mask. */ if (!json_object_object_get_ex(jobj, KS_USER_FILTER_MASK_NAME, &jmask)) return false; mask = json_object_get_int(jmask); kshark_ctx->filter_mask = mask; return true; } /** * @brief Load from Configuration document the value of the user-specified * filter mask. * * @param kshark_ctx: Input location for session context pointer. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True, if a mask has been loaded. If the filter configuration * document contains no data for the mask or in a case of an error, * the function returns False. */ bool kshark_import_user_mask(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf) { switch (conf->format) { case KS_CONFIG_JSON: return kshark_user_mask_from_json(kshark_ctx, conf->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", conf->format); return false; } } /** * @brief Record the current configuration of "show task" and "hide task" * filters into a Json document. * * @param kshark_ctx: Input location for session context pointer. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. If NULL, a new Filter * Configuration document will be created. * * @returns True, if a filter has been recorded. If both filters contain * no Id values or in a case of an error, the function returns False. */ bool kshark_export_all_event_filters(struct kshark_context *kshark_ctx, struct kshark_config_doc **conf) { bool ret = true; if (!*conf) *conf = kshark_filter_config_new(KS_CONFIG_JSON); if (!*conf) return false; /* Save a filter only if it contains Id values. */ if (kshark_this_filter_is_set(kshark_ctx->show_event_filter)) ret &= kshark_export_event_filter(kshark_ctx->pevent, kshark_ctx->show_event_filter, KS_SHOW_EVENT_FILTER_NAME, *conf); if (kshark_this_filter_is_set(kshark_ctx->hide_event_filter)) ret &= kshark_export_event_filter(kshark_ctx->pevent, kshark_ctx->hide_event_filter, KS_HIDE_EVENT_FILTER_NAME, *conf); return ret; } /** * @brief Record the current configuration of "show task" and "hide task" * filters into a Configuration document. * * @param kshark_ctx: Input location for session context pointer. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. If NULL, a new Filter * Configuration document will be created. * * @returns True, if a filter has been recorded. If both filters contain * no Id values or in a case of an error, the function returns False. */ bool kshark_export_all_task_filters(struct kshark_context *kshark_ctx, struct kshark_config_doc **conf) { bool ret = true; if (!*conf) *conf = kshark_filter_config_new(KS_CONFIG_JSON); if (!*conf) return false; /* Save a filter only if it contains Id values. */ if (kshark_this_filter_is_set(kshark_ctx->show_task_filter)) ret &= kshark_export_filter_array(kshark_ctx->show_task_filter, KS_SHOW_TASK_FILTER_NAME, *conf); if (kshark_this_filter_is_set(kshark_ctx->hide_task_filter)) ret &= kshark_export_filter_array(kshark_ctx->hide_task_filter, KS_HIDE_TASK_FILTER_NAME, *conf); return ret; } /** * @brief Record the current configuration of "show cpu" and "hide cpu" * filters into a Configuration document. * * @param kshark_ctx: Input location for session context pointer. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. If NULL, a new Filter * Configuration document will be created. * * @returns True, if a filter has been recorded. If both filters contain * no Id values or in a case of an error, the function returns False. */ bool kshark_export_all_cpu_filters(struct kshark_context *kshark_ctx, struct kshark_config_doc **conf) { bool ret = true; if (!*conf) *conf = kshark_filter_config_new(KS_CONFIG_JSON); if (!*conf) return false; /* Save a filter only if it contains Id values. */ if (kshark_this_filter_is_set(kshark_ctx->show_cpu_filter)) ret &= kshark_export_filter_array(kshark_ctx->show_cpu_filter, KS_SHOW_CPU_FILTER_NAME, *conf); if (kshark_this_filter_is_set(kshark_ctx->hide_cpu_filter)) ret &= kshark_export_filter_array(kshark_ctx->hide_cpu_filter, KS_HIDE_CPU_FILTER_NAME, *conf); return ret; } /** * @brief Load from a Configuration document the configuration of "show event" * and "hide event" filters. * * @param kshark_ctx: Input location for session context pointer. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True, if a filter has been loaded. If the filter configuration * document contains no data for any event filter or in a case * of an error, the function returns False. */ bool kshark_import_all_event_filters(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf) { bool ret = false; ret |= kshark_import_event_filter(kshark_ctx->pevent, kshark_ctx->hide_event_filter, KS_HIDE_EVENT_FILTER_NAME, conf); ret |= kshark_import_event_filter(kshark_ctx->pevent, kshark_ctx->show_event_filter, KS_SHOW_EVENT_FILTER_NAME, conf); return ret; } /** * @brief Load from Configuration document the configuration of "show task" * and "hide task" filters. * * @param kshark_ctx: Input location for session context pointer. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True, if a filter has been loaded. If the filter configuration * document contains no data for any task filter or in a case of an * error, the function returns False. */ bool kshark_import_all_task_filters(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf) { bool ret = false; ret |= kshark_import_filter_array(kshark_ctx->hide_task_filter, KS_HIDE_TASK_FILTER_NAME, conf); ret |= kshark_import_filter_array(kshark_ctx->show_task_filter, KS_SHOW_TASK_FILTER_NAME, conf); return ret; } /** * @brief Load from Configuration document the configuration of "show cpu" * and "hide cpu" filters. * * @param kshark_ctx: Input location for session context pointer. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True, if a filter has been loaded. If the filter configuration * document contains no data for any cpu filter or in a case of an * error, the function returns False. */ bool kshark_import_all_cpu_filters(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf) { bool ret = false; ret |= kshark_import_filter_array(kshark_ctx->hide_cpu_filter, KS_HIDE_CPU_FILTER_NAME, conf); ret |= kshark_import_filter_array(kshark_ctx->show_cpu_filter, KS_SHOW_CPU_FILTER_NAME, conf); return ret; } /** * @brief Create a Filter Configuration document containing the current * configuration of all filters. * * @param kshark_ctx: Input location for session context pointer. * @param format: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns kshark_config_doc instance on success, otherwise NULL. Use * kshark_free_config_doc() to free the object. */ struct kshark_config_doc * kshark_export_all_filters(struct kshark_context *kshark_ctx, enum kshark_config_formats format) { /* Create a new Configuration document. */ struct kshark_config_doc *conf = kshark_filter_config_new(format); /* Save a filter only if it contains Id values. */ if (!conf || !kshark_export_all_event_filters(kshark_ctx, &conf) || !kshark_export_all_task_filters(kshark_ctx, &conf) || !kshark_export_all_cpu_filters(kshark_ctx, &conf) || !kshark_export_user_mask(kshark_ctx, &conf) || !kshark_export_adv_filters(kshark_ctx, &conf)) { kshark_free_config_doc(conf); return NULL; } return conf; } /** * @brief Load from a Configuration document the configuration of all filters. * * @param kshark_ctx: Input location for session context pointer. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True, if a filter has been loaded. If the filter configuration * document contains no data for any filter or in a case of an error, * the function returns False. */ bool kshark_import_all_filters(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf) { bool ret; ret = kshark_import_all_task_filters(kshark_ctx, conf); ret |= kshark_import_all_cpu_filters(kshark_ctx, conf); ret |= kshark_import_all_event_filters(kshark_ctx, conf); ret |= kshark_import_user_mask(kshark_ctx, conf); ret |= kshark_import_adv_filters(kshark_ctx, conf); return ret; } static bool kshark_save_json_file(const char *file_name, struct json_object *jobj) { int flags; /* Save the file in a human-readable form. */ flags = JSON_C_TO_STRING_SPACED | JSON_C_TO_STRING_PRETTY; if (json_object_to_file_ext(file_name, jobj, flags) == 0) return true; return false; } /** * @brief Save a Configuration document into a file. * * @param file_name: The name of the file. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True on success, otherwise False. */ bool kshark_save_config_file(const char *file_name, struct kshark_config_doc *conf) { switch (conf->format) { case KS_CONFIG_JSON: return kshark_save_json_file(file_name, conf->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", conf->format); return false; } } static struct json_object *kshark_open_json_file(const char *file_name, const char *type) { struct json_object *jobj, *var; const char *type_var; jobj = json_object_from_file(file_name); if (!jobj) return NULL; /* Get the type of the document. */ if (!json_object_object_get_ex(jobj, "type", &var)) goto fail; type_var = json_object_get_string(var); if (strcmp(type, type_var) != 0) goto fail; return jobj; fail: /* The document has a wrong type. */ fprintf(stderr, "Failed to open Json file %s.\n", file_name); fprintf(stderr, "The document has a wrong type.\n"); json_object_put(jobj); return NULL; } static const char *get_ext(const char *filename) { const char *dot = strrchr(filename, '.'); if(!dot) return "unknown"; return dot + 1; } /** * @brief Open for read a Configuration file and check if it has the * expected type. * * @param file_name: The name of the file. Currently only Json files are * supported. * @param type: String describing the expected type of the document, * e.g. "kshark.config.record" or "kshark.config.filter". * * @returns kshark_config_doc instance on success, or NULL on failure. Use * kshark_free_config_doc() to free the object. */ struct kshark_config_doc *kshark_open_config_file(const char *file_name, const char *type) { struct kshark_config_doc *conf = NULL; if (strcmp(get_ext(file_name), "json") == 0) { struct json_object *jobj = kshark_open_json_file(file_name, type); if (jobj) { conf = malloc(sizeof(*conf)); conf->conf_doc = jobj; conf->format = KS_CONFIG_JSON; } } return conf; } trace-cmd-v2.9.6/kernel-shark/src/libkshark-model.c000066400000000000000000001057041414302661500221570ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file libkshark-model.c * @brief Visualization model for FTRACE (trace-cmd) data. */ // C #include #include // KernelShark #include "libkshark-model.h" /** The index of the Upper Overflow bin. */ #define UOB(histo) (histo->n_bins) /** The index of the Lower Overflow bin. */ #define LOB(histo) (histo->n_bins + 1) /** For all bins. */ # define ALLB(histo) LOB(histo) /** * @brief Initialize the Visualization model. * * @param histo: Input location for the model descriptor. */ void ksmodel_init(struct kshark_trace_histo *histo) { /* * Initialize an empty histo. The histo will have no bins and will * contain no data. */ memset(histo, 0, sizeof(*histo)); } /** * @brief Clear (reset) the Visualization model. * * @param histo: Input location for the model descriptor. */ void ksmodel_clear(struct kshark_trace_histo *histo) { /* Reset the histo. It will have no bins and will contain no data. */ free(histo->map); free(histo->bin_count); ksmodel_init(histo); } static void ksmodel_reset_bins(struct kshark_trace_histo *histo, size_t first, size_t last) { /* * Reset the content of the bins. * Be careful here! Resetting the entire array of signed integers with * memset() will work only for values of "0" and "-1". Hence * KS_EMPTY_BIN is expected to be "-1". */ memset(&histo->map[first], KS_EMPTY_BIN, (last - first + 1) * sizeof(histo->map[0])); memset(&histo->bin_count[first], 0, (last - first + 1) * sizeof(histo->bin_count[0])); } static bool ksmodel_histo_alloc(struct kshark_trace_histo *histo, size_t n) { free(histo->bin_count); free(histo->map); /* Create bins. Two overflow bins are added. */ histo->map = calloc(n + 2, sizeof(*histo->map)); histo->bin_count = calloc(n + 2, sizeof(*histo->bin_count)); if (!histo->map || !histo->bin_count) { ksmodel_clear(histo); fprintf(stderr, "Failed to allocate memory for a histo.\n"); return false; } histo->n_bins = n; return true; } static void ksmodel_set_in_range_bining(struct kshark_trace_histo *histo, size_t n, uint64_t min, uint64_t max, bool force_in_range) { uint64_t corrected_range, delta_range, range = max - min; struct kshark_entry *last; /* The size of the bin must be >= 1, hence the range must be >= n. */ if (n == 0 || range < n) { range = n; max = min + n; } /* * If the number of bins changes, allocate memory for the descriptor of * the model. */ if (n != histo->n_bins) { if (!ksmodel_histo_alloc(histo, n)) { ksmodel_clear(histo); return; } } /* Reset the content of all bins (including overflow bins) to zero. */ ksmodel_reset_bins(histo, 0, ALLB(histo)); if (range % n == 0) { /* * The range is multiple of the number of bin and needs no * adjustment. This is very unlikely to happen but still ... */ histo->min = min; histo->max = max; histo->bin_size = range / n; } else { /* * The range needs adjustment. The new range will be slightly * bigger, compared to the requested one. */ histo->bin_size = range / n + 1; corrected_range = histo->bin_size * n; delta_range = corrected_range - range; histo->min = min - delta_range / 2; histo->max = histo->min + corrected_range; if (!force_in_range) return; /* * Make sure that the new range doesn't go outside of the time * interval of the dataset. */ last = histo->data[histo->data_size - 1]; if (histo->min < histo->data[0]->ts) { histo->min = histo->data[0]->ts; histo->max = histo->min + corrected_range; } else if (histo->max > last->ts) { histo->max = last->ts; histo->min = histo->max - corrected_range; } } } /** * @brief Prepare the bining of the Visualization model. * * @param histo: Input location for the model descriptor. * @param n: Number of bins. * @param min: Lower edge of the time-window to be visualized. * @param max: Upper edge of the time-window to be visualized. */ void ksmodel_set_bining(struct kshark_trace_histo *histo, size_t n, uint64_t min, uint64_t max) { ksmodel_set_in_range_bining(histo, n, min, max, false); } static size_t ksmodel_set_lower_edge(struct kshark_trace_histo *histo) { /* * Find the index of the first entry inside the range * (timestamp >= min). Note that the value of "min" is considered * inside the range. */ ssize_t row = kshark_find_entry_by_time(histo->min, histo->data, 0, histo->data_size - 1); assert(row != BSEARCH_ALL_SMALLER); if (row == BSEARCH_ALL_GREATER || row == 0) { /* Lower Overflow bin is empty. */ histo->map[LOB(histo)] = KS_EMPTY_BIN; histo->bin_count[LOB(histo)] = 0; row = 0; } else { /* * The first entry inside the range is not the first entry of * the dataset. This means that the Lower Overflow bin contains * data. */ /* Lower Overflow bin starts at "0". */ histo->map[LOB(histo)] = 0; /* * The number of entries inside the Lower Overflow bin is equal * to the index of the first entry inside the range. */ histo->bin_count[LOB(histo)] = row; } /* * Now check if the first entry inside the range falls into the first * bin. */ if (histo->data[row]->ts < histo->min + histo->bin_size) { /* * It is inside the first bin. Set the beginning * of the first bin. */ histo->map[0] = row; } else { /* The first bin is empty. */ histo->map[0] = KS_EMPTY_BIN; } return row; } static size_t ksmodel_set_upper_edge(struct kshark_trace_histo *histo) { /* * Find the index of the first entry outside the range * (timestamp > max). Note that the value of "max" is considered inside * the range. Remember that kshark_find_entry_by_time returns the first * entry which is equal or greater than the reference time. */ ssize_t row = kshark_find_entry_by_time(histo->max + 1, histo->data, 0, histo->data_size - 1); assert(row != BSEARCH_ALL_GREATER); if (row == BSEARCH_ALL_SMALLER) { /* Upper Overflow bin is empty. */ histo->map[UOB(histo)] = KS_EMPTY_BIN; histo->bin_count[UOB(histo)] = 0; } else { /* * The Upper Overflow bin contains data. Set its beginning and * the number of entries. */ histo->map[UOB(histo)] = row; histo->bin_count[UOB(histo)] = histo->data_size - row; } return row; } static void ksmodel_set_next_bin_edge(struct kshark_trace_histo *histo, size_t bin, size_t last_row) { uint64_t time_min, time_max; size_t next_bin = bin + 1; ssize_t row; /* Calculate the beginning and the end of the next bin. */ time_min = histo->min + next_bin * histo->bin_size; time_max = time_min + histo->bin_size; /* * The timestamp of the very last entry of the dataset can be exactly * equal to the value of the upper edge of the range. This is very * likely to happen when we use ksmodel_set_in_range_bining(). In this * case we have to increase the size of the very last bin in order to * make sure that the last entry of the dataset will fall into it. */ if (next_bin == histo->n_bins - 1) ++time_max; /* * Find the index of the first entry inside * the next bin (timestamp > time_min). */ row = kshark_find_entry_by_time(time_min, histo->data, last_row, histo->data_size - 1); if (row < 0 || histo->data[row]->ts >= time_max) { /* The bin is empty. */ histo->map[next_bin] = KS_EMPTY_BIN; return; } /* Set the index of the first entry. */ histo->map[next_bin] = row; } /* * Fill in the bin_count array, which maps the number of entries within each * bin. */ static void ksmodel_set_bin_counts(struct kshark_trace_histo *histo) { int i = 0, prev_not_empty; ssize_t count_tmp = 0; histo->tot_count = 0; memset(&histo->bin_count[0], 0, (histo->n_bins) * sizeof(histo->bin_count[0])); /* * Find the first bin which contains data. Start by checking the Lower * Overflow bin. */ if (histo->map[LOB(histo)] != KS_EMPTY_BIN) { prev_not_empty = LOB(histo); } else { /* Loop till the first non-empty bin. */ while (histo->map[i] < 0 && i < histo->n_bins) { ++i; } prev_not_empty = i++; } /* * Starting from the first not empty bin, loop over all bins and fill * in the bin_count array to hold the number of entries in each bin. */ for (; i < histo->n_bins; ++i) { if (histo->map[i] != KS_EMPTY_BIN) { /* * The current bin is not empty, take its data row and * subtract it from the data row of the previous not * empty bin, which will give us the number of data * rows in the "prev_not_empty" bin. */ count_tmp = histo->map[i] - histo->map[prev_not_empty]; /* * We will do a sanity check. The number of data rows * in the previous not empty bin must be greater than * zero. */ assert(count_tmp > 0); histo->bin_count[prev_not_empty] = count_tmp; if (prev_not_empty != LOB(histo)) histo->tot_count += count_tmp; prev_not_empty = i; } } /* Check if the Upper Overflow bin contains data. */ if (histo->map[UOB(histo)] == KS_EMPTY_BIN) { /* * The Upper Overflow bin is empty. Use the size of the dataset * to calculate the content of the previouse not empty bin. */ count_tmp = histo->data_size - histo->map[prev_not_empty]; } else { /* * Use the index of the first entry inside the Upper Overflow * bin to calculate the content of the previouse not empty * bin. */ count_tmp = histo->map[UOB(histo)] - histo->map[prev_not_empty]; } /* * We will do a sanity check. The number of data rows in the last not * empty bin must be greater than zero. */ assert(count_tmp >= 0); histo->tot_count += histo->bin_count[prev_not_empty] = count_tmp; } /** * @brief Provide the Visualization model with data. Calculate the current * state of the model. * * @param histo: Input location for the model descriptor. * @param data: Input location for the trace data. * @param n: Number of bins. */ void ksmodel_fill(struct kshark_trace_histo *histo, struct kshark_entry **data, size_t n) { size_t last_row = 0; int bin; histo->data_size = n; histo->data = data; if (histo->n_bins == 0 || histo->bin_size == 0 || histo->data_size == 0) { /* * Something is wrong with this histo. * Most likely the binning is not set. */ ksmodel_clear(histo); fprintf(stderr, "Unable to fill the model with data.\n"); fprintf(stderr, "Try to set the bining of the model first.\n"); return; } /* Set the Lower Overflow bin */ ksmodel_set_lower_edge(histo); /* * Loop over the dataset and set the beginning of all individual bins. */ for (bin = 0; bin < histo->n_bins; ++bin) { ksmodel_set_next_bin_edge(histo, bin, last_row); if (histo->map[bin + 1] > 0) last_row = histo->map[bin + 1]; } /* Set the Upper Overflow bin. */ ksmodel_set_upper_edge(histo); /* Calculate the number of entries in each bin. */ ksmodel_set_bin_counts(histo); } /** * @brief Get the total number of entries in a given bin. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * * @returns The number of entries in this bin. */ size_t ksmodel_bin_count(struct kshark_trace_histo *histo, int bin) { if (bin >= 0 && bin < histo->n_bins) return histo->bin_count[bin]; if (bin == UPPER_OVERFLOW_BIN) return histo->bin_count[UOB(histo)]; if (bin == LOWER_OVERFLOW_BIN) return histo->bin_count[LOB(histo)]; return 0; } /** * @brief Shift the time-window of the model forward. Recalculate the current * state of the model. * * @param histo: Input location for the model descriptor. * @param n: Number of bins to shift. */ void ksmodel_shift_forward(struct kshark_trace_histo *histo, size_t n) { size_t last_row = 0; int bin; if (!histo->data_size) return; if (histo->map[UOB(histo)] == KS_EMPTY_BIN) { /* * The Upper Overflow bin is empty. This means that we are at * the upper edge of the dataset already. Do nothing in this * case. */ return; } histo->min += n * histo->bin_size; histo->max += n * histo->bin_size; if (n >= histo->n_bins) { /* * No overlap between the new and the old ranges. Recalculate * all bins from scratch. First calculate the new range. */ ksmodel_set_bining(histo, histo->n_bins, histo->min, histo->max); ksmodel_fill(histo, histo->data, histo->data_size); return; } /* Set the new Lower Overflow bin. */ ksmodel_set_lower_edge(histo); /* * Copy the the mapping indexes of all overlaping bins starting from * bin "0" of the new histo. Note that the number of overlaping bins * is histo->n_bins - n. * We will do a sanity check. ksmodel_set_lower_edge() sets map[0] * index of the new histo. This index should then be equal to map[n] * index of the old histo. */ assert (histo->map[0] == histo->map[n]); memmove(&histo->map[0], &histo->map[n], sizeof(histo->map[0]) * (histo->n_bins - n)); /* * Calculate only the content of the new (non-overlapping) bins. * Start from the last copied bin and set the edge of each consecutive * bin. */ bin = histo->n_bins - n - 1; for (; bin < histo->n_bins - 1; ++bin) { /* * Note that this function will set the bin having index * "bin + 1". */ ksmodel_set_next_bin_edge(histo, bin, last_row); if (histo->map[bin + 1] > 0) last_row = histo->map[bin + 1]; } /* * Set the new Upper Overflow bin and calculate the number of entries * in each bin. */ ksmodel_set_upper_edge(histo); ksmodel_set_bin_counts(histo); } /** * @brief Shift the time-window of the model backward. Recalculate the current * state of the model. * * @param histo: Input location for the model descriptor. * @param n: Number of bins to shift. */ void ksmodel_shift_backward(struct kshark_trace_histo *histo, size_t n) { size_t last_row = 0; int bin; if (!histo->data_size) return; if (histo->map[LOB(histo)] == KS_EMPTY_BIN) { /* * The Lower Overflow bin is empty. This means that we are at * the Lower edge of the dataset already. Do nothing in this * case. */ return; } histo->min -= n * histo->bin_size; histo->max -= n * histo->bin_size; if (n >= histo->n_bins) { /* * No overlap between the new and the old range. Recalculate * all bins from scratch. First calculate the new range. */ ksmodel_set_bining(histo, histo->n_bins, histo->min, histo->max); ksmodel_fill(histo, histo->data, histo->data_size); return; } /* * Copy the mapping indexes of all overlaping bins starting from * bin "0" of the old histo. Note that the number of overlaping bins * is histo->n_bins - n. */ memmove(&histo->map[n], &histo->map[0], sizeof(histo->map[0]) * (histo->n_bins - n)); /* Set the new Lower Overflow bin. */ ksmodel_set_lower_edge(histo); /* Calculate only the content of the new (non-overlapping) bins. */ for (bin = 0; bin < n - 1; ++bin) { /* * Note that this function will set the bin having index * "bin + 1". */ ksmodel_set_next_bin_edge(histo, bin, last_row); if (histo->map[bin + 1] > 0) last_row = histo->map[bin + 1]; } /* * Set the new Upper Overflow bin and calculate the number of entries * in each bin. */ ksmodel_set_upper_edge(histo); ksmodel_set_bin_counts(histo); } /** * @brief Move the time-window of the model to a given location. Recalculate * the current state of the model. * * @param histo: Input location for the model descriptor. * @param ts: position in time to be visualized. */ void ksmodel_jump_to(struct kshark_trace_histo *histo, uint64_t ts) { uint64_t min, max, range_min; if (ts > histo->min && ts < histo->max) { /* * The new position is already inside the range. * Do nothing in this case. */ return; } /* * Calculate the new range without changing the size and the number * of bins. */ min = ts - histo->n_bins * histo->bin_size / 2; /* Make sure that the range does not go outside of the dataset. */ if (min < histo->data[0]->ts) { min = histo->data[0]->ts; } else { range_min = histo->data[histo->data_size - 1]->ts - histo->n_bins * histo->bin_size; if (min > range_min) min = range_min; } max = min + histo->n_bins * histo->bin_size; /* Use the new range to recalculate all bins from scratch. */ ksmodel_set_bining(histo, histo->n_bins, min, max); ksmodel_fill(histo, histo->data, histo->data_size); } static void ksmodel_zoom(struct kshark_trace_histo *histo, double r, int mark, bool zoom_in) { size_t range, min, max, delta_min; double delta_tot; if (!histo->data_size) return; /* * If the marker is not set, assume that the focal point of the zoom * is the center of the range. */ if (mark < 0) mark = histo->n_bins / 2; range = histo->max - histo->min; /* * Avoid overzooming. If needed, adjust the Scale factor to a the value * which provides bin_size >= 5. */ if (zoom_in && (size_t) (range * (1. - r)) < histo->n_bins * 5) r = 1. - (histo->n_bins * 5.) / range; /* * Now calculate the new range of the histo. Use the bin of the marker * as a focal point for the zoomout. With this the maker will stay * inside the same bin in the new histo. * * First we set delta_tot to increase by the percentage requested (r). * Then we make delta_min equal to a percentage of delta_tot based on * where the position of the mark is. After this we add / subtract the * original min by the delta_min and subtract / add the max by * delta_tot - delta_min. */ delta_tot = range * r; if (mark == (int)histo->n_bins - 1) delta_min = delta_tot; else delta_min = delta_tot * mark / histo->n_bins; min = zoom_in ? histo->min + delta_min : histo->min - delta_min; max = zoom_in ? histo->max - (size_t) delta_tot + delta_min : histo->max + (size_t) delta_tot - delta_min; /* Make sure the new range doesn't go outside of the dataset. */ if (min < histo->data[0]->ts) min = histo->data[0]->ts; if (max > histo->data[histo->data_size - 1]->ts) max = histo->data[histo->data_size - 1]->ts; /* * Use the new range to recalculate all bins from scratch. Enforce * "In Range" adjustment of the range of the model, in order to avoid * slowly drifting outside of the data-set in the case when the very * first or the very last entry is used as a focal point. */ ksmodel_set_in_range_bining(histo, histo->n_bins, min, max, true); ksmodel_fill(histo, histo->data, histo->data_size); } /** * @brief Extend the time-window of the model. Recalculate the current state * of the model. * * @param histo: Input location for the model descriptor. * @param r: Scale factor of the zoom-out. * @param mark: Focus point of the zoom-out. */ void ksmodel_zoom_out(struct kshark_trace_histo *histo, double r, int mark) { ksmodel_zoom(histo, r, mark, false); } /** * @brief Shrink the time-window of the model. Recalculate the current state * of the model. * * @param histo: Input location for the model descriptor. * @param r: Scale factor of the zoom-in. * @param mark: Focus point of the zoom-in. */ void ksmodel_zoom_in(struct kshark_trace_histo *histo, double r, int mark) { ksmodel_zoom(histo, r, mark, true); } /** * @brief Get the index of the first entry in a given bin. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * * @returns Index of the first entry in this bin. If the bin is empty the * function returns negative error identifier (KS_EMPTY_BIN). */ ssize_t ksmodel_first_index_at_bin(struct kshark_trace_histo *histo, int bin) { if (bin >= 0 && bin < (int) histo->n_bins) return histo->map[bin]; if (bin == UPPER_OVERFLOW_BIN) return histo->map[UOB(histo)]; if (bin == LOWER_OVERFLOW_BIN) return histo->map[LOB(histo)]; return KS_EMPTY_BIN; } /** * @brief Get the index of the last entry in a given bin. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * * @returns Index of the last entry in this bin. If the bin is empty the * function returns negative error identifier (KS_EMPTY_BIN). */ ssize_t ksmodel_last_index_at_bin(struct kshark_trace_histo *histo, int bin) { ssize_t index = ksmodel_first_index_at_bin(histo, bin); size_t count = ksmodel_bin_count(histo, bin); if (index >= 0 && count) index += count - 1; return index; } static bool ksmodel_is_visible(struct kshark_entry *e) { if ((e->visible & KS_GRAPH_VIEW_FILTER_MASK) && (e->visible & KS_EVENT_VIEW_FILTER_MASK)) return true; return false; } static struct kshark_entry_request * ksmodel_entry_front_request_alloc(struct kshark_trace_histo *histo, int bin, bool vis_only, matching_condition_func func, int val) { size_t first, n; /* Get the number of entries in this bin. */ n = ksmodel_bin_count(histo, bin); if (!n) return NULL; first = ksmodel_first_index_at_bin(histo, bin); return kshark_entry_request_alloc(first, n, func, val, vis_only, KS_GRAPH_VIEW_FILTER_MASK); } static struct kshark_entry_request * ksmodel_entry_back_request_alloc(struct kshark_trace_histo *histo, int bin, bool vis_only, matching_condition_func func, int val) { size_t first, n; /* Get the number of entries in this bin. */ n = ksmodel_bin_count(histo, bin); if (!n) return NULL; first = ksmodel_last_index_at_bin(histo, bin); return kshark_entry_request_alloc(first, n, func, val, vis_only, KS_GRAPH_VIEW_FILTER_MASK); } /** * @brief Get the index of the first entry from a given Cpu in a given bin. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param cpu: Cpu Id. * * @returns Index of the first entry from a given Cpu in this bin. */ ssize_t ksmodel_first_index_at_cpu(struct kshark_trace_histo *histo, int bin, int cpu) { size_t i, n, first, not_found = KS_EMPTY_BIN; n = ksmodel_bin_count(histo, bin); if (!n) return not_found; first = ksmodel_first_index_at_bin(histo, bin); for (i = first; i < first + n; ++i) { if (histo->data[i]->cpu == cpu) { if (ksmodel_is_visible(histo->data[i])) return i; else not_found = KS_FILTERED_BIN; } } return not_found; } /** * @brief Get the index of the first entry from a given Task in a given bin. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param pid: Process Id of a task. * * @returns Index of the first entry from a given Task in this bin. */ ssize_t ksmodel_first_index_at_pid(struct kshark_trace_histo *histo, int bin, int pid) { size_t i, n, first, not_found = KS_EMPTY_BIN; n = ksmodel_bin_count(histo, bin); if (!n) return not_found; first = ksmodel_first_index_at_bin(histo, bin); for (i = first; i < first + n; ++i) { if (histo->data[i]->pid == pid) { if (ksmodel_is_visible(histo->data[i])) return i; else not_found = KS_FILTERED_BIN; } } return not_found; } /** * @brief In a given bin, start from the front end of the bin and go towards * the back end, searching for an entry satisfying the Matching * condition defined by a Matching condition function. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param vis_only: If true, a visible entry is requested. * @param func: Matching condition function. * @param val: Matching condition value, used by the Matching condition * function. * @param col: Optional input location for Data collection. * @param index: Optional output location for the index of the requested * entry inside the array. * * @returns Pointer ot a kshark_entry, if an entry has been found. Else NULL. */ const struct kshark_entry * ksmodel_get_entry_front(struct kshark_trace_histo *histo, int bin, bool vis_only, matching_condition_func func, int val, struct kshark_entry_collection *col, ssize_t *index) { struct kshark_entry_request *req; const struct kshark_entry *entry; if (index) *index = KS_EMPTY_BIN; /* Set the position at the beginning of the bin and go forward. */ req = ksmodel_entry_front_request_alloc(histo, bin, vis_only, func, val); if (!req) return NULL; if (col && col->size) entry = kshark_get_collection_entry_front(req, histo->data, col, index); else entry = kshark_get_entry_front(req, histo->data, index); kshark_free_entry_request(req); return entry; } /** * @brief In a given bin, start from the back end of the bin and go towards * the front end, searching for an entry satisfying the Matching * condition defined by a Matching condition function. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param vis_only: If true, a visible entry is requested. * @param func: Matching condition function. * @param val: Matching condition value, used by the Matching condition * function. * @param col: Optional input location for Data collection. * @param index: Optional output location for the index of the requested * entry inside the array. * * @returns Pointer ot a kshark_entry, if an entry has been found. Else NULL. */ const struct kshark_entry * ksmodel_get_entry_back(struct kshark_trace_histo *histo, int bin, bool vis_only, matching_condition_func func, int val, struct kshark_entry_collection *col, ssize_t *index) { struct kshark_entry_request *req; const struct kshark_entry *entry; if (index) *index = KS_EMPTY_BIN; /* Set the position at the end of the bin and go backwards. */ req = ksmodel_entry_back_request_alloc(histo, bin, vis_only, func, val); if (!req) return NULL; if (col && col->size) entry = kshark_get_collection_entry_back(req, histo->data, col, index); else entry = kshark_get_entry_back(req, histo->data, index); kshark_free_entry_request(req); return entry; } static int ksmodel_get_entry_pid(const struct kshark_entry *entry) { if (!entry) { /* No data has been found. */ return KS_EMPTY_BIN; } /* * Note that if some data has been found, but this data is * filtered-outa, the Dummy entry is returned. The PID of the Dummy * entry is KS_FILTERED_BIN. */ return entry->pid; } /** * @brief In a given bin, start from the front end of the bin and go towards * the back end, searching for an entry from a given CPU. Return * the Process Id of the task of the entry found. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param cpu: CPU Id. * @param vis_only: If true, a visible entry is requested. * @param col: Optional input location for Data collection. * @param index: Optional output location for the index of the requested * entry inside the array. * * @returns Process Id of the task if an entry has been found. Else a negative * Identifier (KS_EMPTY_BIN or KS_FILTERED_BIN). */ int ksmodel_get_pid_front(struct kshark_trace_histo *histo, int bin, int cpu, bool vis_only, struct kshark_entry_collection *col, ssize_t *index) { const struct kshark_entry *entry; if (cpu < 0) return KS_EMPTY_BIN; entry = ksmodel_get_entry_front(histo, bin, vis_only, kshark_match_cpu, cpu, col, index); return ksmodel_get_entry_pid(entry); } /** * @brief In a given bin, start from the back end of the bin and go towards * the front end, searching for an entry from a given CPU. Return * the Process Id of the task of the entry found. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param cpu: CPU Id. * @param vis_only: If true, a visible entry is requested. * @param col: Optional input location for Data collection. * @param index: Optional output location for the index of the requested * entry inside the array. * * @returns Process Id of the task if an entry has been found. Else a negative * Identifier (KS_EMPTY_BIN or KS_FILTERED_BIN). */ int ksmodel_get_pid_back(struct kshark_trace_histo *histo, int bin, int cpu, bool vis_only, struct kshark_entry_collection *col, ssize_t *index) { const struct kshark_entry *entry; if (cpu < 0) return KS_EMPTY_BIN; entry = ksmodel_get_entry_back(histo, bin, vis_only, kshark_match_cpu, cpu, col, index); return ksmodel_get_entry_pid(entry); } static int ksmodel_get_entry_cpu(const struct kshark_entry *entry) { if (!entry) { /* No data has been found. */ return KS_EMPTY_BIN; } /* * Note that if some data has been found, but this data is * filtered-outa, the Dummy entry is returned. The CPU Id of the Dummy * entry is KS_FILTERED_BIN. */ return entry->cpu; } /** * @brief In a given bin, start from the front end of the bin and go towards * the back end, searching for an entry from a given PID. Return * the CPU Id of the entry found. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param pid: Process Id. * @param vis_only: If true, a visible entry is requested. * @param col: Optional input location for Data collection. * @param index: Optional output location for the index of the requested * entry inside the array. * * @returns The CPU Id of the task if an entry has been found. Else a negative * Identifier (KS_EMPTY_BIN or KS_FILTERED_BIN). */ int ksmodel_get_cpu_front(struct kshark_trace_histo *histo, int bin, int pid, bool vis_only, struct kshark_entry_collection *col, ssize_t *index) { const struct kshark_entry *entry; if (pid < 0) return KS_EMPTY_BIN; entry = ksmodel_get_entry_front(histo, bin, vis_only, kshark_match_pid, pid, col, index); return ksmodel_get_entry_cpu(entry); } /** * @brief In a given bin, start from the back end of the bin and go towards * the front end, searching for an entry from a given PID. Return * the CPU Id of the entry found. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param pid: Process Id. * @param vis_only: If true, a visible entry is requested. * @param col: Optional input location for Data collection. * @param index: Optional output location for the index of the requested * entry inside the array. * * @returns The CPU Id of the task if an entry has been found. Else a negative * Identifier (KS_EMPTY_BIN or KS_FILTERED_BIN). */ int ksmodel_get_cpu_back(struct kshark_trace_histo *histo, int bin, int pid, bool vis_only, struct kshark_entry_collection *col, ssize_t *index) { const struct kshark_entry *entry; if (pid < 0) return KS_EMPTY_BIN; entry = ksmodel_get_entry_back(histo, bin, vis_only, kshark_match_pid, pid, col, index); return ksmodel_get_entry_cpu(entry); } /** * @brief Check if a visible trace event from a given Cpu exists in this bin. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param cpu: Cpu Id. * @param col: Optional input location for Data collection. * @param index: Optional output location for the index of the requested * entry inside the array. * * @returns True, if a visible entry exists in this bin. Else false. */ bool ksmodel_cpu_visible_event_exist(struct kshark_trace_histo *histo, int bin, int cpu, struct kshark_entry_collection *col, ssize_t *index) { struct kshark_entry_request *req; const struct kshark_entry *entry; if (index) *index = KS_EMPTY_BIN; /* Set the position at the beginning of the bin and go forward. */ req = ksmodel_entry_front_request_alloc(histo, bin, true, kshark_match_cpu, cpu); if (!req) return false; /* * The default visibility mask of the Model Data request is * KS_GRAPH_VIEW_FILTER_MASK. Change the mask to * KS_EVENT_VIEW_FILTER_MASK because we want to find a visible event. */ req->vis_mask = KS_EVENT_VIEW_FILTER_MASK; if (col && col->size) entry = kshark_get_collection_entry_front(req, histo->data, col, index); else entry = kshark_get_entry_front(req, histo->data, index); kshark_free_entry_request(req); if (!entry || !entry->visible) { /* No visible entry has been found. */ return false; } return true; } /** * @brief Check if a visible trace event from a given Task exists in this bin. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param pid: Process Id of the task. * @param col: Optional input location for Data collection. * @param index: Optional output location for the index of the requested * entry inside the array. * * @returns True, if a visible entry exists in this bin. Else false. */ bool ksmodel_task_visible_event_exist(struct kshark_trace_histo *histo, int bin, int pid, struct kshark_entry_collection *col, ssize_t *index) { struct kshark_entry_request *req; const struct kshark_entry *entry; if (index) *index = KS_EMPTY_BIN; /* Set the position at the beginning of the bin and go forward. */ req = ksmodel_entry_front_request_alloc(histo, bin, true, kshark_match_pid, pid); if (!req) return false; /* * The default visibility mask of the Model Data request is * KS_GRAPH_VIEW_FILTER_MASK. Change the mask to * KS_EVENT_VIEW_FILTER_MASK because we want to find a visible event. */ req->vis_mask = KS_EVENT_VIEW_FILTER_MASK; if (col && col->size) entry = kshark_get_collection_entry_front(req, histo->data, col, index); else entry = kshark_get_entry_front(req, histo->data, index); kshark_free_entry_request(req); if (!entry || !entry->visible) { /* No visible entry has been found. */ return false; } return true; } static bool match_cpu_missed_events(struct kshark_context *kshark_ctx, struct kshark_entry *e, int cpu) { return e->event_id == -EOVERFLOW && e->cpu == cpu; } static bool match_pid_missed_events(struct kshark_context *kshark_ctx, struct kshark_entry *e, int pid) { return e->event_id == -EOVERFLOW && e->pid == pid; } /** * @brief In a given CPU and bin, start from the front end of the bin and go towards * the back end, searching for a Missed Events entry. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param cpu: CPU Id. * @param col: Optional input location for Data collection. * @param index: Optional output location for the index of the requested * entry inside the array. * * @returns Pointer ot a kshark_entry, if an entry has been found. Else NULL. */ const struct kshark_entry * ksmodel_get_cpu_missed_events(struct kshark_trace_histo *histo, int bin, int cpu, struct kshark_entry_collection *col, ssize_t *index) { return ksmodel_get_entry_front(histo, bin, true, match_cpu_missed_events, cpu, col, index); } /** * @brief In a given task and bin, start from the front end of the bin and go towards * the back end, searching for a Missed Events entry. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param pid: Process Id of the task. * @param col: Optional input location for Data collection. * @param index: Optional output location for the index of the requested * entry inside the array. * * @returns Pointer ot a kshark_entry, if an entry has been found. Else NULL. */ const struct kshark_entry * ksmodel_get_task_missed_events(struct kshark_trace_histo *histo, int bin, int pid, struct kshark_entry_collection *col, ssize_t *index) { return ksmodel_get_entry_front(histo, bin, true, match_pid_missed_events, pid, col, index); } trace-cmd-v2.9.6/kernel-shark/src/libkshark-model.h000066400000000000000000000115511414302661500221600ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file libkshark-model.h * @brief Visualization model for FTRACE (trace-cmd) data. */ #ifndef _LIB_KSHARK_MODEL_H #define _LIB_KSHARK_MODEL_H // KernelShark #include "libkshark.h" #ifdef __cplusplus extern "C" { #endif // __cplusplus /** * Overflow Bin identifiers. The two overflow bins are used to hold the data * outside the visualized range. */ enum OverflowBin { /** * Identifier of the Upper Overflow Bin. This bin is used to hold the * data after (in time) the end of the visualized range. */ UPPER_OVERFLOW_BIN = -1, /** * Identifier of the Lower Overflow Bin. This bin is used to hold the * data before (in time) the beginning of the visualized range. */ LOWER_OVERFLOW_BIN = -2, }; /** Structure describing the current state of the visualization model. */ struct kshark_trace_histo { /** Trace data array. */ struct kshark_entry **data; /** The size of the data array. */ size_t data_size; /** The first entry (index of data array) in each bin. */ ssize_t *map; /** Number of entries in each bin. */ size_t *bin_count; /** Total number of entries in all bin except the overflow bins. */ int tot_count; /** * Lower edge of the time-window to be visualized. Only entries having * timestamp >= min will be visualized. */ uint64_t min; /** * Upper edge of the time-window to be visualized. Only entries having * timestamp <= max will be visualized. */ uint64_t max; /** The size in time for each bin. */ uint64_t bin_size; /** Number of bins. */ int n_bins; }; void ksmodel_init(struct kshark_trace_histo *histo); void ksmodel_clear(struct kshark_trace_histo *histo); void ksmodel_set_bining(struct kshark_trace_histo *histo, size_t n, uint64_t min, uint64_t max); void ksmodel_fill(struct kshark_trace_histo *histo, struct kshark_entry **data, size_t n); size_t ksmodel_bin_count(struct kshark_trace_histo *histo, int bin); void ksmodel_shift_forward(struct kshark_trace_histo *histo, size_t n); void ksmodel_shift_backward(struct kshark_trace_histo *histo, size_t n); void ksmodel_jump_to(struct kshark_trace_histo *histo, uint64_t ts); void ksmodel_zoom_out(struct kshark_trace_histo *histo, double r, int mark); void ksmodel_zoom_in(struct kshark_trace_histo *histo, double r, int mark); ssize_t ksmodel_first_index_at_bin(struct kshark_trace_histo *histo, int bin); ssize_t ksmodel_last_index_at_bin(struct kshark_trace_histo *histo, int bin); ssize_t ksmodel_first_index_at_cpu(struct kshark_trace_histo *histo, int bin, int cpu); ssize_t ksmodel_first_index_at_pid(struct kshark_trace_histo *histo, int bin, int pid); const struct kshark_entry * ksmodel_get_entry_front(struct kshark_trace_histo *histo, int bin, bool vis_only, matching_condition_func func, int val, struct kshark_entry_collection *col, ssize_t *index); const struct kshark_entry * ksmodel_get_entry_back(struct kshark_trace_histo *histo, int bin, bool vis_only, matching_condition_func func, int val, struct kshark_entry_collection *col, ssize_t *index); int ksmodel_get_pid_front(struct kshark_trace_histo *histo, int bin, int cpu, bool vis_only, struct kshark_entry_collection *col, ssize_t *index); int ksmodel_get_pid_back(struct kshark_trace_histo *histo, int bin, int cpu, bool vis_only, struct kshark_entry_collection *col, ssize_t *index); int ksmodel_get_cpu_front(struct kshark_trace_histo *histo, int bin, int pid, bool vis_only, struct kshark_entry_collection *col, ssize_t *index); int ksmodel_get_cpu_back(struct kshark_trace_histo *histo, int bin, int pid, bool vis_only, struct kshark_entry_collection *col, ssize_t *index); bool ksmodel_cpu_visible_event_exist(struct kshark_trace_histo *histo, int bin, int cpu, struct kshark_entry_collection *col, ssize_t *index); bool ksmodel_task_visible_event_exist(struct kshark_trace_histo *histo, int bin, int pid, struct kshark_entry_collection *col, ssize_t *index); const struct kshark_entry * ksmodel_get_cpu_missed_events(struct kshark_trace_histo *histo, int bin, int cpu, struct kshark_entry_collection *col, ssize_t *index); const struct kshark_entry * ksmodel_get_task_missed_events(struct kshark_trace_histo *histo, int bin, int pid, struct kshark_entry_collection *col, ssize_t *index); static inline double ksmodel_bin_time(struct kshark_trace_histo *histo, int bin) { return (histo->min + bin*histo->bin_size) * 1e-9; } static inline uint64_t ksmodel_bin_ts(struct kshark_trace_histo *histo, int bin) { return (histo->min + bin*histo->bin_size); } #ifdef __cplusplus } #endif // __cplusplus #endif trace-cmd-v2.9.6/kernel-shark/src/libkshark-plot.c000066400000000000000000000116371414302661500220360ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ /** * @file libkshark-plot.c * @brief Basic tools for OpenGL plotting. */ // OpenGL #include #include // KernelShark #include "libkshark-plot.h" /** * @brief Create an empty scene for drawing. * * @param width: Width of the screen window in pixels. * @param height: Height of the screen window in pixels. */ void ksplot_make_scene(int width, int height) { /* Set Display mode. */ glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); /* Prevent the program from exiting when a window is closed. */ glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS); /* Set window size. */ glutInitWindowSize(width, height); /* Set window position on screen. */ glutInitWindowPosition(50, 50); /* Open the screen window. */ glutCreateWindow("KernelShark Plot"); /* * Set the origin of the coordinate system to be the top left corner. * The "Y" coordinate is inverted. */ gluOrtho2D(0, width, height, 0); glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); } /** * @brief Initialize OpenGL. * * @param dpr: Device Pixel Ratio. */ void ksplot_init_opengl(int dpr) { glDisable(GL_TEXTURE_2D); glDisable(GL_DEPTH_TEST); glDisable(GL_COLOR_MATERIAL); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_POLYGON_SMOOTH); glLineWidth(1.5 * dpr); glPointSize(2.5 * dpr); glClearColor(1, 1, 1, 1); } /** * @brief To be called whenever the OpenGL window has been resized. * * @param width: Width of the screen window in pixels. * @param height: Height of the screen window in pixels. */ void ksplot_resize_opengl(int width, int height) { glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); /* * Set the origin of the coordinate system to be the top left corner. * The "Y" coordinate is inverted. */ gluOrtho2D(0, width, height, 0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } /** * @brief Draw a point. * * @param p: Input location for the point object. * @param col: The color of the point. * @param size: The size of the point. */ void ksplot_draw_point(const struct ksplot_point *p, const struct ksplot_color *col, float size) { if (!p || !col || size < .5f) return; glPointSize(size); glBegin(GL_POINTS); glColor3ub(col->red, col->green, col->blue); glVertex2i(p->x, p->y); glEnd(); } /** * @brief Draw a line. * * @param a: Input location for the first finishing point of the line. * @param b: Input location for the second finishing point of the line. * @param col: The color of the line. * @param size: The size of the line. */ void ksplot_draw_line(const struct ksplot_point *a, const struct ksplot_point *b, const struct ksplot_color *col, float size) { if (!a || !b || !col || size < .5f) return; glLineWidth(size); glBegin(GL_LINES); glColor3ub(col->red, col->green, col->blue); glVertex2i(a->x, a->y); glVertex2i(b->x, b->y); glEnd(); } /** * @brief Draw a polygon. * * @param points: Input location for the array of points defining the polygon. * @param n_points: The size of the array of points. * @param col: The color of the polygon. * @param size: The size of the polygon. */ void ksplot_draw_polygon(const struct ksplot_point *points, size_t n_points, const struct ksplot_color *col, float size) { if (!points || !n_points || !col || size < .5f) return; if (n_points == 1) { ksplot_draw_point(points, col, size); return; } if (n_points == 2) { ksplot_draw_line(points, points + 1, col, size); return; } /* Obtain a point inside the surface of the polygon. */ struct ksplot_point in_point; in_point.x = (points[0].x + points[2].x) / 2; in_point.y = (points[0].y + points[2].y) / 2; /* * Draw a Triangle Fan using the internal point as a central * vertex. */ glBegin(GL_TRIANGLE_FAN); glColor3ub(col->red, col->green, col->blue); glVertex2i(in_point.x, in_point.y); for (size_t i = 0; i < n_points; ++i) glVertex2i(points[i].x, points[i].y); glVertex2i(points[0].x, points[0].y); glEnd(); } /** * @brief Draw the contour of a polygon. * * @param points: Input location for the array of points defining the polygon. * @param n_points: The size of the array of points. * @param col: The color of the polygon. * @param size: The size of the polygon. */ void ksplot_draw_polygon_contour(const struct ksplot_point *points, size_t n_points, const struct ksplot_color *col, float size) { if (!points || !n_points || !col || size < .5f) return; /* Loop over the points of the polygon and draw connecting lines. */ for(size_t i = 1; i < n_points; ++i) ksplot_draw_line(&points[i - 1], &points[i], col, size); /* Close the contour. */ ksplot_draw_line(&points[0], &points[n_points - 1], col, size); } trace-cmd-v2.9.6/kernel-shark/src/libkshark-plot.h000066400000000000000000000026611414302661500220400ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ /** * @file libkshark-plot.h * @brief Basic tools for OpenGL plotting. */ #ifndef _LIB_KSHARK_PLOT_H #define _LIB_KSHARK_PLOT_H #ifdef __cplusplus extern "C" { #endif /** Structure defining a RGB color. */ struct ksplot_color { /** The Red component of the color. */ uint8_t red; /** The Green component of the color. */ uint8_t green; /** The Blue component of the color. */ uint8_t blue; }; /** Structure defining a 2D point. */ struct ksplot_point { /** The horizontal coordinate of the point in pixels. */ int x; /** The vertical coordinate of the pointin in pixels. */ int y; }; void ksplot_make_scene(int width, int height); void ksplot_init_opengl(int dpr); void ksplot_resize_opengl(int width, int height); void ksplot_draw_point(const struct ksplot_point *p, const struct ksplot_color *col, float size); void ksplot_draw_line(const struct ksplot_point *a, const struct ksplot_point *b, const struct ksplot_color *col, float size); void ksplot_draw_polygon(const struct ksplot_point *points, size_t n_points, const struct ksplot_color *col, float size); void ksplot_draw_polygon_contour(const struct ksplot_point *points, size_t n_points, const struct ksplot_color *col, float size); #ifdef __cplusplus } #endif #endif trace-cmd-v2.9.6/kernel-shark/src/libkshark-plugin.c000066400000000000000000000154621414302661500223560ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file libkshark-plugin.c * @brief KernelShark plugins. */ // C #ifndef _GNU_SOURCE /** Use GNU C Library. */ #define _GNU_SOURCE #endif #include #include #include #include #include #include // KernelShark #include "libkshark-plugin.h" #include "libkshark.h" static struct kshark_event_handler * gui_event_handler_alloc(int event_id, kshark_plugin_event_handler_func evt_func, kshark_plugin_draw_handler_func dw_func) { struct kshark_event_handler *handler = malloc(sizeof(*handler)); if (!handler) { fprintf(stderr, "failed to allocate memory for gui eventhandler"); return NULL; } handler->next = NULL; handler->id = event_id; handler->event_func = evt_func; handler->draw_func = dw_func; return handler; } /** * @brief Search the list of event handlers for a handle associated with a * given event type. * * @param handlers: Input location for the Event handler list. * @param event_id: Event Id to search for. */ struct kshark_event_handler * kshark_find_event_handler(struct kshark_event_handler *handlers, int event_id) { for (; handlers; handlers = handlers->next) if (handlers->id == event_id) return handlers; return NULL; } /** * @brief Add new event handler to an existing list of handlers. * * @param handlers: Input location for the Event handler list. * @param event_id: Event Id. * @param evt_func: Input location for an Event action provided by the plugin. * @param dw_func: Input location for a Draw action provided by the plugin. * * @returns Zero on success, or a negative error code on failure. */ int kshark_register_event_handler(struct kshark_event_handler **handlers, int event_id, kshark_plugin_event_handler_func evt_func, kshark_plugin_draw_handler_func dw_func) { struct kshark_event_handler *handler = gui_event_handler_alloc(event_id, evt_func, dw_func); if(!handler) return -ENOMEM; handler->next = *handlers; *handlers = handler; return 0; } /** * @brief Search the list for a specific plugin handle. If such a plugin handle * exists, unregister (remove and free) this handle from the list. * * @param handlers: Input location for the Event handler list. * @param event_id: Event Id of the plugin handler to be unregistered. * @param evt_func: Event action function of the handler to be unregistered. * @param dw_func: Draw action function of the handler to be unregistered. */ void kshark_unregister_event_handler(struct kshark_event_handler **handlers, int event_id, kshark_plugin_event_handler_func evt_func, kshark_plugin_draw_handler_func dw_func) { struct kshark_event_handler **last; for (last = handlers; *last; last = &(*last)->next) { if ((*last)->id == event_id && (*last)->event_func == evt_func && (*last)->draw_func == dw_func) { struct kshark_event_handler *this_handler; this_handler = *last; *last = this_handler->next; free(this_handler); return; } } } /** * @brief Free all Event handlers in a given list. * * @param handlers: Input location for the Event handler list. */ void kshark_free_event_handler_list(struct kshark_event_handler *handlers) { struct kshark_event_handler *last; while (handlers) { last = handlers; handlers = handlers->next; free(last); } } /** * @brief Allocate memory for a new plugin. Add this plugin to the list of * plugins used by the session. * * @param kshark_ctx: Input location for the session context pointer. * @param file: The plugin object file to load. * * @returns Zero on success, or a negative error code on failure. */ int kshark_register_plugin(struct kshark_context *kshark_ctx, const char *file) { struct kshark_plugin_list *plugin = kshark_ctx->plugins; struct stat st; int ret; while (plugin) { if (strcmp(plugin->file, file) == 0) return -EEXIST; plugin = plugin->next; } ret = stat(file, &st); if (ret < 0) { fprintf(stderr, "plugin %s not found\n", file); return -ENODEV; } plugin = calloc(sizeof(struct kshark_plugin_list), 1); if (!plugin) { fprintf(stderr, "failed to allocate memory for plugin\n"); return -ENOMEM; } if (asprintf(&plugin->file, "%s", file) <= 0) { fprintf(stderr, "failed to allocate memory for plugin file name"); return -ENOMEM; } plugin->handle = dlopen(plugin->file, RTLD_NOW | RTLD_GLOBAL); if (!plugin->handle) goto fail; plugin->init = dlsym(plugin->handle, KSHARK_PLUGIN_INITIALIZER_NAME); plugin->close = dlsym(plugin->handle, KSHARK_PLUGIN_DEINITIALIZER_NAME); if (!plugin->init || !plugin->close) goto fail; plugin->next = kshark_ctx->plugins; kshark_ctx->plugins = plugin; return 0; fail: fprintf(stderr, "cannot load plugin '%s'\n%s\n", plugin->file, dlerror()); if (plugin->handle) { dlclose(plugin->handle); plugin->handle = NULL; } free(plugin); return EFAULT; } /** * @brief Unrgister a plugin. * * @param kshark_ctx: Input location for context pointer. * @param file: The plugin object file to unregister. */ void kshark_unregister_plugin(struct kshark_context *kshark_ctx, const char *file) { struct kshark_plugin_list **last; for (last = &kshark_ctx->plugins; *last; last = &(*last)->next) { if (strcmp((*last)->file, file) == 0) { struct kshark_plugin_list *this_plugin; this_plugin = *last; *last = this_plugin->next; dlclose(this_plugin->handle); free(this_plugin); return; } } } /** * @brief Free all plugins in a given list. * * @param plugins: Input location for the plugins list. */ void kshark_free_plugin_list(struct kshark_plugin_list *plugins) { struct kshark_plugin_list *last; while (plugins) { last = plugins; plugins = plugins->next; free(last->file); dlclose(last->handle); free(last); } } /** * @brief Use this function to initialize/update/deinitialize all registered * plugins. * * @param kshark_ctx: Input location for context pointer. * @param task_id: Action identifier specifying the action to be executed. * * @returns The number of successful added/removed plugin handlers on success, * or a negative error code on failure. */ int kshark_handle_plugins(struct kshark_context *kshark_ctx, enum kshark_plugin_actions task_id) { struct kshark_plugin_list *plugin; int handler_count = 0; for (plugin = kshark_ctx->plugins; plugin; plugin = plugin->next) { switch (task_id) { case KSHARK_PLUGIN_INIT: handler_count += plugin->init(kshark_ctx); break; case KSHARK_PLUGIN_UPDATE: plugin->close(kshark_ctx); handler_count += plugin->init(kshark_ctx); break; case KSHARK_PLUGIN_CLOSE: handler_count += plugin->close(kshark_ctx); break; default: return -EINVAL; } } return handler_count; } trace-cmd-v2.9.6/kernel-shark/src/libkshark-plugin.h000066400000000000000000000105341414302661500223560ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2016 Red Hat Inc, Steven Rostedt */ /** * @file libkshark-plugin.h * @brief KernelShark plugins. */ #ifndef _KSHARK_PLUGIN_H #define _KSHARK_PLUGIN_H #ifdef __cplusplus extern "C" { #endif // __cplusplus // trace-cmd #include "traceevent/event-parse.h" /* Quiet warnings over documenting simple structures */ //! @cond Doxygen_Suppress #define KSHARK_PLUGIN_INITIALIZER kshark_plugin_initializer #define KSHARK_PLUGIN_DEINITIALIZER kshark_plugin_deinitializer #define _MAKE_STR(x) #x #define MAKE_STR(x) _MAKE_STR(x) #define KSHARK_PLUGIN_INITIALIZER_NAME MAKE_STR(KSHARK_PLUGIN_INITIALIZER) #define KSHARK_PLUGIN_DEINITIALIZER_NAME MAKE_STR(KSHARK_PLUGIN_DEINITIALIZER) struct kshark_context; struct kshark_entry; //! @endcond /** * A function type to be used when defining load/reload/unload plugin * functions. */ typedef int (*kshark_plugin_load_func)(struct kshark_context *); struct kshark_trace_histo; /** * Structure representing the C arguments of the drawing function of * a plugin. */ struct kshark_cpp_argv { /** Pointer to the model descriptor object. */ struct kshark_trace_histo *histo; }; /** A function type to be used when defining plugin functions for drawing. */ typedef void (*kshark_plugin_draw_handler_func)(struct kshark_cpp_argv *argv, int val, int draw_action); /** * A function type to be used when defining plugin functions for data * manipulation. */ typedef void (*kshark_plugin_event_handler_func)(struct kshark_context *kshark_ctx, struct tep_record *rec, struct kshark_entry *e); /** Plugin action identifier. */ enum kshark_plugin_actions { /** * Load plugins action. This action identifier is used when handling * plugins. */ KSHARK_PLUGIN_INIT, /** * Reload plugins action. This action identifier is used when handling * plugins. */ KSHARK_PLUGIN_UPDATE, /** * Unload plugins action. This action identifier is used when handling * plugins. */ KSHARK_PLUGIN_CLOSE, /** * Task draw action. This action identifier is used by the plugin draw * function. */ KSHARK_PLUGIN_TASK_DRAW, /** * CPU draw action. This action identifier is used by the plugin draw * function. */ KSHARK_PLUGIN_CPU_DRAW, }; /** * Plugin Event handler structure, defining the properties of the required * kshark_entry. */ struct kshark_event_handler { /** Pointer to the next Plugin Event handler. */ struct kshark_event_handler *next; /** Unique Id ot the trace event type. */ int id; /** * Event action function. This action can be used to modify the content * of all kshark_entries having Event Ids equal to "id". */ kshark_plugin_event_handler_func event_func; /** * Draw action function. This action can be used to draw additional * graphical elements (shapes) for all kshark_entries having Event Ids * equal to "id". */ kshark_plugin_draw_handler_func draw_func; }; struct kshark_event_handler * kshark_find_event_handler(struct kshark_event_handler *handlers, int event_id); int kshark_register_event_handler(struct kshark_event_handler **handlers, int event_id, kshark_plugin_event_handler_func evt_func, kshark_plugin_draw_handler_func dw_func); void kshark_unregister_event_handler(struct kshark_event_handler **handlers, int event_id, kshark_plugin_event_handler_func evt_func, kshark_plugin_draw_handler_func dw_func); void kshark_free_event_handler_list(struct kshark_event_handler *handlers); /** Linked list of plugins. */ struct kshark_plugin_list { /** Pointer to the next Plugin. */ struct kshark_plugin_list *next; /** The plugin object file to load. */ char *file; /** Plugin Event handler. */ void *handle; /** Callback function for initialization of the plugin. */ kshark_plugin_load_func init; /** Callback function for deinitialization of the plugin. */ kshark_plugin_load_func close; }; int kshark_register_plugin(struct kshark_context *kshark_ctx, const char *file); void kshark_unregister_plugin(struct kshark_context *kshark_ctx, const char *file); void kshark_free_plugin_list(struct kshark_plugin_list *plugins); int kshark_handle_plugins(struct kshark_context *kshark_ctx, enum kshark_plugin_actions task_id); #ifdef __cplusplus } #endif // __cplusplus #endif // _KSHARK_PLUGIN_H trace-cmd-v2.9.6/kernel-shark/src/libkshark.c000066400000000000000000001365031414302661500210620ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file libkshark.c * @brief API for processing of FTRACE (trace-cmd) data. */ /** Use GNU C Library. */ #define _GNU_SOURCE 1 // C #include #include #include // KernelShark #include "libkshark.h" static __thread struct trace_seq seq; static struct kshark_context *kshark_context_handler = NULL; static bool kshark_default_context(struct kshark_context **context) { struct kshark_context *kshark_ctx; kshark_ctx = calloc(1, sizeof(*kshark_ctx)); if (!kshark_ctx) return false; kshark_ctx->event_handlers = NULL; kshark_ctx->collections = NULL; kshark_ctx->plugins = NULL; kshark_ctx->show_task_filter = tracecmd_filter_id_hash_alloc(); kshark_ctx->hide_task_filter = tracecmd_filter_id_hash_alloc(); kshark_ctx->show_event_filter = tracecmd_filter_id_hash_alloc(); kshark_ctx->hide_event_filter = tracecmd_filter_id_hash_alloc(); kshark_ctx->show_cpu_filter = tracecmd_filter_id_hash_alloc(); kshark_ctx->hide_cpu_filter = tracecmd_filter_id_hash_alloc(); kshark_ctx->filter_mask = 0x0; /* Will free kshark_context_handler. */ kshark_free(NULL); /* Will do nothing if *context is NULL. */ kshark_free(*context); *context = kshark_context_handler = kshark_ctx; return true; } static bool init_thread_seq(void) { if (!seq.buffer) trace_seq_init(&seq); return seq.buffer != NULL; } /** * @brief Initialize a kshark session. This function must be called before * calling any other kshark function. If the session has been * initialized, this function can be used to obtain the session's * context. * * @param kshark_ctx: Optional input/output location for context pointer. * If it points to a context, that context will become * the new session. If it points to NULL, it will obtain * the current (or new) session. The result is only * valid on return of true. * * @returns True on success, or false on failure. */ bool kshark_instance(struct kshark_context **kshark_ctx) { if (*kshark_ctx != NULL) { /* Will free kshark_context_handler */ kshark_free(NULL); /* Use the context provided by the user. */ kshark_context_handler = *kshark_ctx; } else { if (kshark_context_handler) { /* * No context is provided by the user, but the context * handler is already set. Use the context handler. */ *kshark_ctx = kshark_context_handler; } else { /* No kshark_context exists. Create a default one. */ if (!kshark_default_context(kshark_ctx)) return false; } } if (!init_thread_seq()) return false; return true; } static void kshark_free_task_list(struct kshark_context *kshark_ctx) { struct kshark_task_list *task; int i; if (!kshark_ctx) return; for (i = 0; i < KS_TASK_HASH_SIZE; ++i) { while (kshark_ctx->tasks[i]) { task = kshark_ctx->tasks[i]; kshark_ctx->tasks[i] = task->next; free(task); } } } /** * @brief Open and prepare for reading a trace data file specified by "file". * If the specified file does not exist, or contains no trace data, * the function returns false. * * @param kshark_ctx: Input location for context pointer. * @param file: The file to load. * * @returns True on success, or false on failure. */ bool kshark_open(struct kshark_context *kshark_ctx, const char *file) { struct tracecmd_input *handle; kshark_free_task_list(kshark_ctx); handle = tracecmd_open_head(file, 0); if (!handle) return false; /* Read the tracing data from the file. */ if (tracecmd_init_data(handle) < 0) return false; if (pthread_mutex_init(&kshark_ctx->input_mutex, NULL) != 0) { tracecmd_close(handle); return false; } kshark_ctx->handle = handle; kshark_ctx->pevent = tracecmd_get_tep(handle); kshark_ctx->advanced_event_filter = tep_filter_alloc(kshark_ctx->pevent); /* * Turn off function trace indent and turn on show parent * if possible. */ tep_plugin_add_option("ftrace:parent", "1"); tep_plugin_add_option("ftrace:indent", "0"); return true; } /** * @brief Close the trace data file and free the trace data handle. * * @param kshark_ctx: Input location for the session context pointer. */ void kshark_close(struct kshark_context *kshark_ctx) { if (!kshark_ctx || !kshark_ctx->handle) return; /* * All filters are file specific. Make sure that the Pids and Event Ids * from this file are not going to be used with another file. */ tracecmd_filter_id_clear(kshark_ctx->show_task_filter); tracecmd_filter_id_clear(kshark_ctx->hide_task_filter); tracecmd_filter_id_clear(kshark_ctx->show_event_filter); tracecmd_filter_id_clear(kshark_ctx->hide_event_filter); tracecmd_filter_id_clear(kshark_ctx->show_cpu_filter); tracecmd_filter_id_clear(kshark_ctx->hide_cpu_filter); if (kshark_ctx->advanced_event_filter) { tep_filter_reset(kshark_ctx->advanced_event_filter); tep_filter_free(kshark_ctx->advanced_event_filter); kshark_ctx->advanced_event_filter = NULL; } /* * All data collections are file specific. Make sure that collections * from this file are not going to be used with another file. */ kshark_free_collection_list(kshark_ctx->collections); kshark_ctx->collections = NULL; tracecmd_close(kshark_ctx->handle); kshark_ctx->handle = NULL; kshark_ctx->pevent = NULL; pthread_mutex_destroy(&kshark_ctx->input_mutex); } /** * @brief Deinitialize kshark session. Should be called after closing all * open trace data files and before your application terminates. * * @param kshark_ctx: Optional input location for session context pointer. * If it points to a context of a sessuin, that sessuin * will be deinitialize. If it points to NULL, it will * deinitialize the current session. */ void kshark_free(struct kshark_context *kshark_ctx) { if (kshark_ctx == NULL) { if (kshark_context_handler == NULL) return; kshark_ctx = kshark_context_handler; /* kshark_ctx_handler will be set to NULL below. */ } tracecmd_filter_id_hash_free(kshark_ctx->show_task_filter); tracecmd_filter_id_hash_free(kshark_ctx->hide_task_filter); tracecmd_filter_id_hash_free(kshark_ctx->show_event_filter); tracecmd_filter_id_hash_free(kshark_ctx->hide_event_filter); tracecmd_filter_id_hash_free(kshark_ctx->show_cpu_filter); tracecmd_filter_id_hash_free(kshark_ctx->hide_cpu_filter); if (kshark_ctx->plugins) { kshark_handle_plugins(kshark_ctx, KSHARK_PLUGIN_CLOSE); kshark_free_plugin_list(kshark_ctx->plugins); kshark_free_event_handler_list(kshark_ctx->event_handlers); } kshark_free_task_list(kshark_ctx); if (seq.buffer) trace_seq_destroy(&seq); if (kshark_ctx == kshark_context_handler) kshark_context_handler = NULL; free(kshark_ctx); } static struct kshark_task_list * kshark_find_task(struct kshark_context *kshark_ctx, uint32_t key, int pid) { struct kshark_task_list *list; for (list = kshark_ctx->tasks[key]; list; list = list->next) { if (list->pid == pid) return list; } return NULL; } static struct kshark_task_list * kshark_add_task(struct kshark_context *kshark_ctx, int pid) { struct kshark_task_list *list; uint32_t key; key = tracecmd_quick_hash(pid, KS_TASK_HASH_SHIFT); list = kshark_find_task(kshark_ctx, key, pid); if (list) return list; list = malloc(sizeof(*list)); if (!list) return NULL; list->pid = pid; list->next = kshark_ctx->tasks[key]; kshark_ctx->tasks[key] = list; return list; } /** * @brief Get an array containing the Process Ids of all tasks presented in * the loaded trace data file. * * @param kshark_ctx: Input location for context pointer. * @param pids: Output location for the Pids of the tasks. The user is * responsible for freeing the elements of the outputted array. * * @returns The size of the outputted array of Pids in the case of success, * or a negative error code on failure. */ ssize_t kshark_get_task_pids(struct kshark_context *kshark_ctx, int **pids) { size_t i, pid_count = 0, pid_size = KS_TASK_HASH_SIZE; struct kshark_task_list *list; int *temp_pids; *pids = calloc(pid_size, sizeof(int)); if (!*pids) goto fail; for (i = 0; i < KS_TASK_HASH_SIZE; ++i) { list = kshark_ctx->tasks[i]; while (list) { (*pids)[pid_count] = list->pid; list = list->next; if (++pid_count >= pid_size) { pid_size *= 2; temp_pids = realloc(*pids, pid_size * sizeof(int)); if (!temp_pids) { goto fail; } *pids = temp_pids; } } } if (pid_count) { temp_pids = realloc(*pids, pid_count * sizeof(int)); if (!temp_pids) goto fail; /* Paranoid: In the unlikely case of shrinking *pids, realloc moves it */ *pids = temp_pids; } else { free(*pids); *pids = NULL; } return pid_count; fail: fprintf(stderr, "Failed to allocate memory for Task Pids.\n"); free(*pids); *pids = NULL; return -ENOMEM; } static bool filter_find(struct tracecmd_filter_id *filter, int pid, bool test) { return !filter || !filter->count || !!(unsigned long)tracecmd_filter_id_find(filter, pid) == test; } static bool kshark_show_task(struct kshark_context *kshark_ctx, int pid) { return filter_find(kshark_ctx->show_task_filter, pid, true) && filter_find(kshark_ctx->hide_task_filter, pid, false); } static bool kshark_show_event(struct kshark_context *kshark_ctx, int pid) { return filter_find(kshark_ctx->show_event_filter, pid, true) && filter_find(kshark_ctx->hide_event_filter, pid, false); } static bool kshark_show_cpu(struct kshark_context *kshark_ctx, int cpu) { return filter_find(kshark_ctx->show_cpu_filter, cpu, true) && filter_find(kshark_ctx->hide_cpu_filter, cpu, false); } /** * @brief Add an Id value to the filster specified by "filter_id". * * @param kshark_ctx: Input location for the session context pointer. * @param filter_id: Identifier of the filter. * @param id: Id value to be added to the filter. */ void kshark_filter_add_id(struct kshark_context *kshark_ctx, int filter_id, int id) { struct tracecmd_filter_id *filter; switch (filter_id) { case KS_SHOW_CPU_FILTER: filter = kshark_ctx->show_cpu_filter; break; case KS_HIDE_CPU_FILTER: filter = kshark_ctx->hide_cpu_filter; break; case KS_SHOW_EVENT_FILTER: filter = kshark_ctx->show_event_filter; break; case KS_HIDE_EVENT_FILTER: filter = kshark_ctx->hide_event_filter; break; case KS_SHOW_TASK_FILTER: filter = kshark_ctx->show_task_filter; break; case KS_HIDE_TASK_FILTER: filter = kshark_ctx->hide_task_filter; break; default: return; } tracecmd_filter_id_add(filter, id); } /** * @brief Clear (reset) the filster specified by "filter_id". * * @param kshark_ctx: Input location for the session context pointer. * @param filter_id: Identifier of the filter. */ void kshark_filter_clear(struct kshark_context *kshark_ctx, int filter_id) { struct tracecmd_filter_id *filter; switch (filter_id) { case KS_SHOW_CPU_FILTER: filter = kshark_ctx->show_cpu_filter; break; case KS_HIDE_CPU_FILTER: filter = kshark_ctx->hide_cpu_filter; break; case KS_SHOW_EVENT_FILTER: filter = kshark_ctx->show_event_filter; break; case KS_HIDE_EVENT_FILTER: filter = kshark_ctx->hide_event_filter; break; case KS_SHOW_TASK_FILTER: filter = kshark_ctx->show_task_filter; break; case KS_HIDE_TASK_FILTER: filter = kshark_ctx->hide_task_filter; break; default: return; } tracecmd_filter_id_clear(filter); } /** * @brief Check if a given Id filter is set. * * @param filter: Input location for the Id filster. * * @returns True if the Id filter is set, otherwise False. */ bool kshark_this_filter_is_set(struct tracecmd_filter_id *filter) { return filter && filter->count; } /** * @brief Check if an Id filter is set. * * @param kshark_ctx: Input location for the session context pointer. * * @returns True if at least one Id filter is set, otherwise False. */ bool kshark_filter_is_set(struct kshark_context *kshark_ctx) { return kshark_this_filter_is_set(kshark_ctx->show_task_filter) || - kshark_this_filter_is_set(kshark_ctx->hide_task_filter) || - kshark_this_filter_is_set(kshark_ctx->show_cpu_filter) || - kshark_this_filter_is_set(kshark_ctx->hide_cpu_filter) || - kshark_this_filter_is_set(kshark_ctx->show_event_filter) || - kshark_this_filter_is_set(kshark_ctx->hide_event_filter); } static inline void unset_event_filter_flag(struct kshark_context *kshark_ctx, struct kshark_entry *e) { /* * All entries, filtered-out by the event filters, will be treated * differently, when visualized. Because of this, ignore the value * of the GRAPH_VIEW flag provided by the user via * kshark_ctx->filter_mask. The value of the EVENT_VIEW flag in * kshark_ctx->filter_mask will be used instead. */ int event_mask = kshark_ctx->filter_mask & ~KS_GRAPH_VIEW_FILTER_MASK; e->visible &= ~event_mask; } static void set_all_visible(uint16_t *v) { /* Keep the original value of the PLUGIN_UNTOUCHED bit flag. */ *v |= 0xFF & ~KS_PLUGIN_UNTOUCHED_MASK; } /** * @brief This function loops over the array of entries specified by "data" * and "n_entries" and sets the "visible" fields of each entry * according to the criteria provided by the filters of the session's * context. The field "filter_mask" of the session's context is used to * control the level of visibility/invisibility of the entries which * are filtered-out. * WARNING: Do not use this function if the advanced filter is set. * Applying the advanced filter requires access to prevent_record, * hence the data has to be reloaded using kshark_load_data_entries(). * * @param kshark_ctx: Input location for the session context pointer. * @param data: Input location for the trace data to be filtered. * @param n_entries: The size of the inputted data. */ void kshark_filter_entries(struct kshark_context *kshark_ctx, struct kshark_entry **data, size_t n_entries) { int i; if (kshark_ctx->advanced_event_filter->filters) { /* The advanced filter is set. */ fprintf(stderr, "Failed to filter!\n"); fprintf(stderr, "Reset the Advanced filter or reload the data.\n"); return; } if (!kshark_filter_is_set(kshark_ctx)) return; /* Apply only the Id filters. */ for (i = 0; i < n_entries; ++i) { /* Start with and entry which is visible everywhere. */ set_all_visible(&data[i]->visible); /* Apply event filtering. */ if (!kshark_show_event(kshark_ctx, data[i]->event_id)) unset_event_filter_flag(kshark_ctx, data[i]); /* Apply CPU filtering. */ if (!kshark_show_cpu(kshark_ctx, data[i]->cpu)) data[i]->visible &= ~kshark_ctx->filter_mask; /* Apply task filtering. */ if (!kshark_show_task(kshark_ctx, data[i]->pid)) data[i]->visible &= ~kshark_ctx->filter_mask; } } /** * @brief This function loops over the array of entries specified by "data" * and "n_entries" and resets the "visible" fields of each entry to * the default value of "0xFF" (visible everywhere). * * @param kshark_ctx: Input location for the session context pointer. * @param data: Input location for the trace data to be unfiltered. * @param n_entries: The size of the inputted data. */ void kshark_clear_all_filters(struct kshark_context *kshark_ctx, struct kshark_entry **data, size_t n_entries) { int i; for (i = 0; i < n_entries; ++i) set_all_visible(&data[i]->visible); } static void kshark_set_entry_values(struct kshark_context *kshark_ctx, struct tep_record *record, struct kshark_entry *entry) { /* Offset of the record */ entry->offset = record->offset; /* CPU Id of the record */ entry->cpu = record->cpu; /* Time stamp of the record */ entry->ts = record->ts; /* Event Id of the record */ entry->event_id = tep_data_type(kshark_ctx->pevent, record); /* * Is visible mask. This default value means that the entry * is visible everywhere. */ entry->visible = 0xFF; /* Process Id of the record */ entry->pid = tep_data_pid(kshark_ctx->pevent, record); } /** Prior time offset of the "missed_events" entry. */ #define ME_ENTRY_TIME_SHIFT 10 static void missed_events_action(struct kshark_context *kshark_ctx, struct tep_record *record, struct kshark_entry *entry) { /* * Use the offset field of the entry to store the number of missed * events. */ entry->offset = record->missed_events; entry->cpu = record->cpu; /* * Position the "missed_events" entry a bit before (in time) * the original record. */ entry->ts = record->ts - ME_ENTRY_TIME_SHIFT; /* All custom entries must have negative event Identifiers. */ entry->event_id = KS_EVENT_OVERFLOW; entry->visible = 0xFF; entry->pid = tep_data_pid(kshark_ctx->pevent, record); } static const char* missed_events_dump(struct kshark_context *kshark_ctx, const struct kshark_entry *entry, bool get_info) { int size = 0; static char *buffer; if (get_info) size = asprintf(&buffer, "missed_events=%i", (int) entry->offset); else size = asprintf(&buffer, "missed_events"); if (size > 0) return buffer; return NULL; } /** * rec_list is used to pass the data to the load functions. * The rec_list will contain the list of entries from the source, * and will be a link list of per CPU entries. */ struct rec_list { union { /* Used by kshark_load_data_records */ struct { /** next pointer, matches entry->next */ struct rec_list *next; /** pointer to the raw record data */ struct tep_record *rec; }; /** entry - Used for kshark_load_data_entries() */ struct kshark_entry entry; }; }; /** * rec_type defines what type of rec_list is being used. */ enum rec_type { REC_RECORD, REC_ENTRY, }; static void free_rec_list(struct rec_list **rec_list, int n_cpus, enum rec_type type) { struct rec_list *temp_rec; int cpu; for (cpu = 0; cpu < n_cpus; ++cpu) { while (rec_list[cpu]) { temp_rec = rec_list[cpu]; rec_list[cpu] = temp_rec->next; if (type == REC_RECORD) tracecmd_free_record(temp_rec->rec); free(temp_rec); } } free(rec_list); } static ssize_t get_records(struct kshark_context *kshark_ctx, struct rec_list ***rec_list, enum rec_type type) { struct kshark_event_handler *evt_handler; struct tep_event_filter *adv_filter; struct kshark_task_list *task; struct tep_record *rec; struct rec_list **temp_next; struct rec_list **cpu_list; struct rec_list *temp_rec; size_t count, total = 0; int n_cpus; int pid; int cpu; n_cpus = tep_get_cpus(kshark_ctx->pevent);; cpu_list = calloc(n_cpus, sizeof(*cpu_list)); if (!cpu_list) return -ENOMEM; /* Just to shorten the name */ if (type == REC_ENTRY) adv_filter = kshark_ctx->advanced_event_filter; for (cpu = 0; cpu < n_cpus; ++cpu) { count = 0; cpu_list[cpu] = NULL; temp_next = &cpu_list[cpu]; rec = tracecmd_read_cpu_first(kshark_ctx->handle, cpu); while (rec) { *temp_next = temp_rec = calloc(1, sizeof(*temp_rec)); if (!temp_rec) goto fail; temp_rec->next = NULL; switch (type) { case REC_RECORD: temp_rec->rec = rec; pid = tep_data_pid(kshark_ctx->pevent, rec); break; case REC_ENTRY: { struct kshark_entry *entry; int ret; if (rec->missed_events) { /* * Insert a custom "missed_events" entry just * befor this record. */ entry = &temp_rec->entry; missed_events_action(kshark_ctx, rec, entry); temp_next = &temp_rec->next; ++count; /* Now allocate a new rec_list node and comtinue. */ *temp_next = temp_rec = calloc(1, sizeof(*temp_rec)); } entry = &temp_rec->entry; kshark_set_entry_values(kshark_ctx, rec, entry); /* Execute all plugin-provided actions (if any). */ evt_handler = kshark_ctx->event_handlers; while ((evt_handler = kshark_find_event_handler(evt_handler, entry->event_id))) { evt_handler->event_func(kshark_ctx, rec, entry); evt_handler = evt_handler->next; entry->visible &= ~KS_PLUGIN_UNTOUCHED_MASK; } pid = entry->pid; /* Apply event filtering. */ ret = FILTER_MATCH; if (adv_filter->filters) ret = tep_filter_match(adv_filter, rec); if (!kshark_show_event(kshark_ctx, entry->event_id) || ret != FILTER_MATCH) { unset_event_filter_flag(kshark_ctx, entry); } /* Apply CPU filtering. */ if (!kshark_show_cpu(kshark_ctx, entry->pid)) { entry->visible &= ~kshark_ctx->filter_mask; } /* Apply task filtering. */ if (!kshark_show_task(kshark_ctx, entry->pid)) { entry->visible &= ~kshark_ctx->filter_mask; } tracecmd_free_record(rec); break; } /* REC_ENTRY */ } task = kshark_add_task(kshark_ctx, pid); if (!task) { tracecmd_free_record(rec); goto fail; } temp_next = &temp_rec->next; ++count; rec = tracecmd_read_data(kshark_ctx->handle, cpu); } total += count; } *rec_list = cpu_list; return total; fail: free_rec_list(cpu_list, n_cpus, type); return -ENOMEM; } static int pick_next_cpu(struct rec_list **rec_list, int n_cpus, enum rec_type type) { uint64_t ts = 0; uint64_t rec_ts; int next_cpu = -1; int cpu; for (cpu = 0; cpu < n_cpus; ++cpu) { if (!rec_list[cpu]) continue; switch (type) { case REC_RECORD: rec_ts = rec_list[cpu]->rec->ts; break; case REC_ENTRY: rec_ts = rec_list[cpu]->entry.ts; break; } if (!ts || rec_ts < ts) { ts = rec_ts; next_cpu = cpu; } } return next_cpu; } /** * @brief Load the content of the trace data file into an array of * kshark_entries. This function provides an abstraction of the * entries from the raw data that is read, however the "latency" * and the "info" fields can be accessed only via the offset * into the file. This makes the access to these two fields much * slower. * If one or more filters are set, the "visible" fields of each entry * is updated according to the criteria provided by the filters. The * field "filter_mask" of the session's context is used to control the * level of visibility/invisibility of the filtered entries. * * @param kshark_ctx: Input location for context pointer. * @param data_rows: Output location for the trace data. The user is * responsible for freeing the elements of the outputted * array. * * @returns The size of the outputted data in the case of success, or a * negative error code on failure. */ ssize_t kshark_load_data_entries(struct kshark_context *kshark_ctx, struct kshark_entry ***data_rows) { struct kshark_entry **rows; struct rec_list **rec_list; enum rec_type type = REC_ENTRY; ssize_t count, total = 0; int n_cpus; if (*data_rows) free(*data_rows); total = get_records(kshark_ctx, &rec_list, type); if (total < 0) goto fail; n_cpus = tep_get_cpus(kshark_ctx->pevent);; rows = calloc(total, sizeof(struct kshark_entry *)); if (!rows) goto fail_free; for (count = 0; count < total; count++) { int next_cpu; next_cpu = pick_next_cpu(rec_list, n_cpus, type); if (next_cpu >= 0) { rows[count] = &rec_list[next_cpu]->entry; rec_list[next_cpu] = rec_list[next_cpu]->next; } } free_rec_list(rec_list, n_cpus, type); *data_rows = rows; return total; fail_free: free_rec_list(rec_list, n_cpus, type); fail: fprintf(stderr, "Failed to allocate memory during data loading.\n"); return -ENOMEM; } /** * @brief Load the content of the trace data file into an array of * tep_records. Use this function only if you need fast access * to all fields of the record. * * @param kshark_ctx: Input location for the session context pointer. * @param data_rows: Output location for the trace data. Use tracecmd_free_record() * to free the elements of the outputted array. * * @returns The size of the outputted data in the case of success, or a * negative error code on failure. */ ssize_t kshark_load_data_records(struct kshark_context *kshark_ctx, struct tep_record ***data_rows) { struct tep_record **rows; struct tep_record *rec; struct rec_list **rec_list; struct rec_list *temp_rec; enum rec_type type = REC_RECORD; ssize_t count, total = 0; int n_cpus; total = get_records(kshark_ctx, &rec_list, type); if (total < 0) goto fail; n_cpus = tep_get_cpus(kshark_ctx->pevent);; rows = calloc(total, sizeof(struct tep_record *)); if (!rows) goto fail_free; for (count = 0; count < total; count++) { int next_cpu; next_cpu = pick_next_cpu(rec_list, n_cpus, type); if (next_cpu >= 0) { rec = rec_list[next_cpu]->rec; rows[count] = rec; temp_rec = rec_list[next_cpu]; rec_list[next_cpu] = rec_list[next_cpu]->next; free(temp_rec); /* The record is still referenced in rows */ } } /* There should be no records left in rec_list */ free_rec_list(rec_list, n_cpus, type); *data_rows = rows; return total; fail_free: free_rec_list(rec_list, n_cpus, type); fail: fprintf(stderr, "Failed to allocate memory during data loading.\n"); return -ENOMEM; } static inline void free_ptr(void *ptr) { if (ptr) free(*(void **)ptr); } static bool data_matrix_alloc(size_t n_rows, uint64_t **offset_array, uint16_t **cpu_array, uint64_t **ts_array, uint16_t **pid_array, int **event_array) { if (offset_array) { *offset_array = calloc(n_rows, sizeof(**offset_array)); if (!*offset_array) return false; } if (cpu_array) { *cpu_array = calloc(n_rows, sizeof(**cpu_array)); if (!*cpu_array) goto free_offset; } if (ts_array) { *ts_array = calloc(n_rows, sizeof(**ts_array)); if (!*ts_array) goto free_cpu; } if (pid_array) { *pid_array = calloc(n_rows, sizeof(**pid_array)); if (!*pid_array) goto free_ts; } if (event_array) { *event_array = calloc(n_rows, sizeof(**event_array)); if (!*event_array) goto free_pid; } return true; free_pid: free_ptr(pid_array); free_ts: free_ptr(ts_array); free_cpu: free_ptr(cpu_array); free_offset: free_ptr(offset_array); fprintf(stderr, "Failed to allocate memory during data loading.\n"); return false; } /** * @brief Load the content of the trace data file into a table / matrix made * of columns / arrays of data. The user is responsible for freeing the * elements of the outputted array * * @param kshark_ctx: Input location for the session context pointer. * @param offset_array: Output location for the array of record offsets. * @param cpu_array: Output location for the array of CPU Ids. * @param ts_array: Output location for the array of timestamps. * @param pid_array: Output location for the array of Process Ids. * @param event_array: Output location for the array of Event Ids. * * @returns The size of the outputted arrays in the case of success, or a * negative error code on failure. */ size_t kshark_load_data_matrix(struct kshark_context *kshark_ctx, uint64_t **offset_array, uint16_t **cpu_array, uint64_t **ts_array, uint16_t **pid_array, int **event_array) { enum rec_type type = REC_ENTRY; struct rec_list **rec_list; ssize_t count, total = 0; bool status; int n_cpus; total = get_records(kshark_ctx, &rec_list, type); if (total < 0) goto fail; n_cpus = tep_get_cpus(kshark_ctx->pevent);; status = data_matrix_alloc(total, offset_array, cpu_array, ts_array, pid_array, event_array); if (!status) goto fail_free; for (count = 0; count < total; count++) { int next_cpu; next_cpu = pick_next_cpu(rec_list, n_cpus, type); if (next_cpu >= 0) { struct rec_list *rec = rec_list[next_cpu]; struct kshark_entry *e = &rec->entry; if (offset_array) (*offset_array)[count] = e->offset; if (cpu_array) (*cpu_array)[count] = e->cpu; if (ts_array) (*ts_array)[count] = e->ts; if (pid_array) (*pid_array)[count] = e->pid; if (event_array) (*event_array)[count] = e->event_id; rec_list[next_cpu] = rec_list[next_cpu]->next; free(rec); } } /* There should be no entries left in rec_list. */ free_rec_list(rec_list, n_cpus, type); return total; fail_free: free_rec_list(rec_list, n_cpus, type); fail: fprintf(stderr, "Failed to allocate memory during data loading.\n"); return -ENOMEM; } static const char *kshark_get_latency(struct tep_handle *pe, struct tep_record *record) { if (!record) return NULL; trace_seq_reset(&seq); tep_print_event(pe, &seq, record, "%s", TEP_PRINT_LATENCY); return seq.buffer; } static const char *kshark_get_info(struct tep_handle *pe, struct tep_record *record, struct tep_event *event) { char *pos; if (!record || !event) return NULL; trace_seq_reset(&seq); tep_print_event(pe, &seq, record, "%s", TEP_PRINT_INFO); /* * The event info string contains a trailing newline. * Remove this newline. */ if ((pos = strchr(seq.buffer, '\n')) != NULL) *pos = '\0'; return seq.buffer; } /** * @brief This function allows for an easy access to the original value of the * Process Id as recorded in the tep_record object. The record is read * from the file only in the case of an entry being touched by a plugin. * Be aware that using the kshark_get_X_easy functions can be * inefficient if you need an access to more than one of the data fields * of the record. * * @param entry: Input location for the KernelShark entry. * * @returns The original value of the Process Id as recorded in the * tep_record object on success, otherwise negative error code. */ int kshark_get_pid_easy(struct kshark_entry *entry) { struct kshark_context *kshark_ctx = NULL; struct tep_record *data; int pid; if (!kshark_instance(&kshark_ctx)) return -ENODEV; if (entry->visible & KS_PLUGIN_UNTOUCHED_MASK) { pid = entry->pid; } else { /* * The entry has been touched by a plugin callback function. * Because of this we do not trust the value of "entry->pid". * * Currently the data reading operations are not thread-safe. * Use a mutex to protect the access. */ pthread_mutex_lock(&kshark_ctx->input_mutex); data = tracecmd_read_at(kshark_ctx->handle, entry->offset, NULL); pid = tep_data_pid(kshark_ctx->pevent, data); tracecmd_free_record(data); pthread_mutex_unlock(&kshark_ctx->input_mutex); } return pid; } /** * @brief This function allows for an easy access to the original value of the * Task name as recorded in the tep_record object. The record is read * from the file only in the case of an entry being touched by a plugin. * Be aware that using the kshark_get_X_easy functions can be * inefficient if you need an access to more than one of the data fields * of the record. * * @param entry: Input location for the KernelShark entry. * * @returns The original name of the task, retrieved from the Process Id * recorded in the tep_record object on success, otherwise NULL. */ const char *kshark_get_task_easy(struct kshark_entry *entry) { struct kshark_context *kshark_ctx = NULL; int pid = kshark_get_pid_easy(entry); if (pid < 0) return NULL; kshark_instance(&kshark_ctx); return tep_data_comm_from_pid(kshark_ctx->pevent, pid); } /** * @brief This function allows for an easy access to the latency information * recorded in the tep_record object. The record is read from the file * using the offset field of kshark_entry. Be aware that using the * kshark_get_X_easy functions can be inefficient if you need an access * to more than one of the data fields of the record. * * @param entry: Input location for the KernelShark entry. * * @returns On success the function returns a string showing the latency * information, coded into 5 fields: * interrupts disabled, need rescheduling, hard/soft interrupt, * preempt count and lock depth. On failure it returns NULL. */ const char *kshark_get_latency_easy(struct kshark_entry *entry) { struct kshark_context *kshark_ctx = NULL; struct tep_record *data; const char *lat; if (!kshark_instance(&kshark_ctx)) return NULL; if (entry->event_id < 0) return NULL; /* * Currently the data reading operations are not thread-safe. * Use a mutex to protect the access. */ pthread_mutex_lock(&kshark_ctx->input_mutex); data = tracecmd_read_at(kshark_ctx->handle, entry->offset, NULL); lat = kshark_get_latency(kshark_ctx->pevent, data); tracecmd_free_record(data); pthread_mutex_unlock(&kshark_ctx->input_mutex); return lat; } /** * @brief This function allows for an easy access to the original value of the * Event Id as recorded in the tep_record object. The record is read * from the file only in the case of an entry being touched by a plugin. * Be aware that using the kshark_get_X_easy functions can be * inefficient if you need an access to more than one of the data fields * of the record. * * @param entry: Input location for the KernelShark entry. * * @returns The original value of the Event Id as recorded in the * tep_record object on success, otherwise negative error code. */ int kshark_get_event_id_easy(struct kshark_entry *entry) { struct kshark_context *kshark_ctx = NULL; struct tep_record *data; int event_id; if (!kshark_instance(&kshark_ctx)) return -ENODEV; if (entry->visible & KS_PLUGIN_UNTOUCHED_MASK) { event_id = entry->event_id; } else { /* * The entry has been touched by a plugin callback function. * Because of this we do not trust the value of * "entry->event_id". * * Currently the data reading operations are not thread-safe. * Use a mutex to protect the access. */ pthread_mutex_lock(&kshark_ctx->input_mutex); data = tracecmd_read_at(kshark_ctx->handle, entry->offset, NULL); event_id = tep_data_type(kshark_ctx->pevent, data); tracecmd_free_record(data); pthread_mutex_unlock(&kshark_ctx->input_mutex); } return (event_id == -1)? -EFAULT : event_id; } /** * @brief This function allows for an easy access to the original name of the * trace event as recorded in the tep_record object. The record is read * from the file only in the case of an entry being touched by a plugin. * Be aware that using the kshark_get_X_easy functions can be * inefficient if you need an access to more than one of the data fields * of the record. * * @param entry: Input location for the KernelShark entry. * * @returns The mane of the trace event recorded in the tep_record object on * success, otherwise "[UNKNOWN EVENT]" or NULL. */ const char *kshark_get_event_name_easy(struct kshark_entry *entry) { struct kshark_context *kshark_ctx = NULL; struct tep_event *event; int event_id = kshark_get_event_id_easy(entry); if (event_id == -EFAULT) return NULL; kshark_instance(&kshark_ctx); if (event_id < 0) { switch (event_id) { case KS_EVENT_OVERFLOW: return missed_events_dump(kshark_ctx, entry, false); default: return NULL; } } /* * Currently the data reading operations are not thread-safe. * Use a mutex to protect the access. */ pthread_mutex_lock(&kshark_ctx->input_mutex); event = tep_find_event(kshark_ctx->pevent, event_id); pthread_mutex_unlock(&kshark_ctx->input_mutex); if (event) return event->name; return "[UNKNOWN EVENT]"; } /** * @brief This function allows for an easy access to the tep_record's info * streang. The record is read from the file using the offset field of * kshark_entry. Be aware that using the kshark_get_X_easy functions can * be inefficient if you need an access to more than one of the data * fields of the record. * * @param entry: Input location for the KernelShark entry. * * @returns A string showing the data output of the trace event on success, * otherwise NULL. */ const char *kshark_get_info_easy(struct kshark_entry *entry) { struct kshark_context *kshark_ctx = NULL; struct tep_event *event; struct tep_record *data; const char *info = NULL; int event_id; if (!kshark_instance(&kshark_ctx)) return NULL; if (entry->event_id < 0) { switch (entry->event_id) { case KS_EVENT_OVERFLOW: return missed_events_dump(kshark_ctx, entry, true); default: return NULL; } } /* * Currently the data reading operations are not thread-safe. * Use a mutex to protect the access. */ pthread_mutex_lock(&kshark_ctx->input_mutex); data = tracecmd_read_at(kshark_ctx->handle, entry->offset, NULL); event_id = tep_data_type(kshark_ctx->pevent, data); event = tep_find_event(kshark_ctx->pevent, event_id); if (event) info = kshark_get_info(kshark_ctx->pevent, data, event); tracecmd_free_record(data); pthread_mutex_unlock(&kshark_ctx->input_mutex); return info; } /** * @brief Convert the timestamp of the trace record (nanosecond precision) into * seconds and microseconds. * * @param time: Input location for the timestamp. * @param sec: Output location for the value of the seconds. * @param usec: Output location for the value of the microseconds. */ void kshark_convert_nano(uint64_t time, uint64_t *sec, uint64_t *usec) { uint64_t s; *sec = s = time / 1000000000ULL; *usec = (time - s * 1000000000ULL) / 1000; } /** * @brief Dump into a string the content a custom entry. The function allocates * a null terminated string and returns a pointer to this string. * * @param kshark_ctx: Input location for the session context pointer. * @param entry: A Kernel Shark entry to be printed. * @param info_func: * * @returns The returned string contains a semicolon-separated list of data * fields. The user has to free the returned string. */ char* kshark_dump_custom_entry(struct kshark_context *kshark_ctx, const struct kshark_entry *entry, kshark_custom_info_func info_func) { const char *event_name, *task, *info; char *entry_str; int size = 0; task = tep_data_comm_from_pid(kshark_ctx->pevent, entry->pid); event_name = info_func(kshark_ctx, entry, false); info = info_func(kshark_ctx, entry, true); size = asprintf(&entry_str, "%" PRIu64 "; %s-%i; CPU %i; ; %s; %s", entry->ts, task, entry->pid, entry->cpu, event_name, info); if (size > 0) return entry_str; return NULL; } /** * @brief Dump into a string the content of one entry. The function allocates * a null terminated string and returns a pointer to this string. The * user has to free the returned string. * * @param entry: A Kernel Shark entry to be printed. * * @returns The returned string contains a semicolon-separated list of data * fields. */ char* kshark_dump_entry(const struct kshark_entry *entry) { const char *event_name, *task, *lat, *info; struct kshark_context *kshark_ctx; char *temp_str, *entry_str; int size = 0; kshark_ctx = NULL; if (!kshark_instance(&kshark_ctx) || !init_thread_seq()) return NULL; task = tep_data_comm_from_pid(kshark_ctx->pevent, entry->pid); if (entry->event_id >= 0) { struct tep_event *event; struct tep_record *data; data = tracecmd_read_at(kshark_ctx->handle, entry->offset, NULL); event = tep_find_event(kshark_ctx->pevent, entry->event_id); event_name = event? event->name : "[UNKNOWN EVENT]"; lat = kshark_get_latency(kshark_ctx->pevent, data); size = asprintf(&temp_str, "%" PRIu64 "; %s-%i; CPU %i; %s;", entry->ts, task, entry->pid, entry->cpu, lat); info = kshark_get_info(kshark_ctx->pevent, data, event); if (size > 0) { size = asprintf(&entry_str, "%s %s; %s; 0x%x", temp_str, event_name, info, entry->visible); free(temp_str); } tracecmd_free_record(data); if (size < 1) entry_str = NULL; } else { switch (entry->event_id) { case KS_EVENT_OVERFLOW: entry_str = kshark_dump_custom_entry(kshark_ctx, entry, missed_events_dump); default: entry_str = NULL; } } return entry_str; } /** * @brief Binary search inside a time-sorted array of kshark_entries. * * @param time: The value of time to search for. * @param data: Input location for the trace data. * @param l: Array index specifying the lower edge of the range to search in. * @param h: Array index specifying the upper edge of the range to search in. * * @returns On success, the first kshark_entry inside the range, having a timestamp equal or bigger than "time". If all entries inside the range have timestamps greater than "time" the function returns BSEARCH_ALL_GREATER (negative value). If all entries inside the range have timestamps smaller than "time" the function returns BSEARCH_ALL_SMALLER (negative value). */ ssize_t kshark_find_entry_by_time(uint64_t time, struct kshark_entry **data, size_t l, size_t h) { size_t mid; if (data[l]->ts > time) return BSEARCH_ALL_GREATER; if (data[h]->ts < time) return BSEARCH_ALL_SMALLER; /* * After executing the BSEARCH macro, "l" will be the index of the last * entry having timestamp < time and "h" will be the index of the first * entry having timestamp >= time. */ BSEARCH(h, l, data[mid]->ts < time); return h; } /** * @brief Binary search inside a time-sorted array of tep_records. * * @param time: The value of time to search for. * @param data: Input location for the trace data. * @param l: Array index specifying the lower edge of the range to search in. * @param h: Array index specifying the upper edge of the range to search in. * * @returns On success, the first tep_record inside the range, having a timestamp equal or bigger than "time". If all entries inside the range have timestamps greater than "time" the function returns BSEARCH_ALL_GREATER (negative value). If all entries inside the range have timestamps smaller than "time" the function returns BSEARCH_ALL_SMALLER (negative value). */ ssize_t kshark_find_record_by_time(uint64_t time, struct tep_record **data, size_t l, size_t h) { size_t mid; if (data[l]->ts > time) return BSEARCH_ALL_GREATER; if (data[h]->ts < time) return BSEARCH_ALL_SMALLER; /* * After executing the BSEARCH macro, "l" will be the index of the last * record having timestamp < time and "h" will be the index of the * first record having timestamp >= time. */ BSEARCH(h, l, data[mid]->ts < time); return h; } /** * @brief Simple Pid matching function to be user for data requests. * * @param kshark_ctx: Input location for the session context pointer. * @param e: kshark_entry to be checked. * @param pid: Matching condition value. * * @returns True if the Pid of the entry matches the value of "pid". * Else false. */ bool kshark_match_pid(struct kshark_context *kshark_ctx, struct kshark_entry *e, int pid) { if (e->pid == pid) return true; return false; } /** * @brief Simple Cpu matching function to be user for data requests. * * @param kshark_ctx: Input location for the session context pointer. * @param e: kshark_entry to be checked. * @param cpu: Matching condition value. * * @returns True if the Cpu of the entry matches the value of "cpu". * Else false. */ bool kshark_match_cpu(struct kshark_context *kshark_ctx, struct kshark_entry *e, int cpu) { if (e->cpu == cpu) return true; return false; } /** * @brief Create Data request. The request defines the properties of the * requested kshark_entry. * * @param first: Array index specifying the position inside the array from * where the search starts. * @param n: Number of array elements to search in. * @param cond: Matching condition function. * @param val: Matching condition value, used by the Matching condition * function. * @param vis_only: If true, a visible entry is requested. * @param vis_mask: If "vis_only" is true, use this mask to specify the level * of visibility of the requested entry. * * @returns Pointer to kshark_entry_request on success, or NULL on failure. * The user is responsible for freeing the returned * kshark_entry_request. */ struct kshark_entry_request * kshark_entry_request_alloc(size_t first, size_t n, matching_condition_func cond, int val, bool vis_only, int vis_mask) { struct kshark_entry_request *req = malloc(sizeof(*req)); if (!req) { fprintf(stderr, "Failed to allocate memory for entry request.\n"); return NULL; } req->next = NULL; req->first = first; req->n = n; req->cond = cond; req->val = val; req->vis_only = vis_only; req->vis_mask = vis_mask; return req; } /** * @brief Free all Data requests in a given list. * @param req: Intput location for the Data request list. */ void kshark_free_entry_request(struct kshark_entry_request *req) { struct kshark_entry_request *last; while (req) { last = req; req = req->next; free(last); } } /** Dummy entry, used to indicate the existence of filtered entries. */ const struct kshark_entry dummy_entry = { .next = NULL, .visible = 0x00, .cpu = KS_FILTERED_BIN, .pid = KS_FILTERED_BIN, .event_id = -1, .offset = 0, .ts = 0 }; static const struct kshark_entry * get_entry(const struct kshark_entry_request *req, struct kshark_entry **data, ssize_t *index, ssize_t start, ssize_t end, int inc) { struct kshark_context *kshark_ctx = NULL; const struct kshark_entry *e = NULL; ssize_t i; if (index) *index = KS_EMPTY_BIN; if (!kshark_instance(&kshark_ctx)) return e; /* * We will do a sanity check in order to protect against infinite * loops. */ assert((inc > 0 && start < end) || (inc < 0 && start > end)); for (i = start; i != end; i += inc) { if (req->cond(kshark_ctx, data[i], req->val)) { /* * Data satisfying the condition has been found. */ if (req->vis_only && !(data[i]->visible & req->vis_mask)) { /* This data entry has been filtered. */ e = &dummy_entry; } else { e = data[i]; break; } } } if (index) { if (e) *index = (e->cpu != KS_FILTERED_BIN)? i : KS_FILTERED_BIN; else *index = KS_EMPTY_BIN; } return e; } /** * @brief Search for an entry satisfying the requirements of a given Data * request. Start from the position provided by the request and go * searching in the direction of the increasing timestamps (front). * * @param req: Input location for Data request. * @param data: Input location for the trace data. * @param index: Optional output location for the index of the returned * entry inside the array. * * @returns Pointer to the first entry satisfying the matching conditionon * success, or NULL on failure. * In the special case when some entries, satisfying the Matching * condition function have been found, but all these entries have * been discarded because of the visibility criteria (filtered * entries), the function returns a pointer to a special * "Dummy entry". */ const struct kshark_entry * kshark_get_entry_front(const struct kshark_entry_request *req, struct kshark_entry **data, ssize_t *index) { ssize_t end = req->first + req->n; return get_entry(req, data, index, req->first, end, +1); } /** * @brief Search for an entry satisfying the requirements of a given Data * request. Start from the position provided by the request and go * searching in the direction of the decreasing timestamps (back). * * @param req: Input location for Data request. * @param data: Input location for the trace data. * @param index: Optional output location for the index of the returned * entry inside the array. * * @returns Pointer to the first entry satisfying the matching conditionon * success, or NULL on failure. * In the special case when some entries, satisfying the Matching * condition function have been found, but all these entries have * been discarded because of the visibility criteria (filtered * entries), the function returns a pointer to a special * "Dummy entry". */ const struct kshark_entry * kshark_get_entry_back(const struct kshark_entry_request *req, struct kshark_entry **data, ssize_t *index) { ssize_t end = req->first - req->n; if (end < 0) end = -1; return get_entry(req, data, index, req->first, end, -1); } trace-cmd-v2.9.6/kernel-shark/src/libkshark.h000066400000000000000000000436431414302661500210710ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file libkshark.h * @brief API for processing of FTRACE (trace-cmd) data. */ #ifndef _LIB_KSHARK_H #define _LIB_KSHARK_H // C #include #include #include // Json-C #include #ifdef __cplusplus extern "C" { #endif // trace-cmd #include "trace-cmd/trace-cmd.h" #include "private/trace-filter-hash.h" #include "traceevent/event-parse.h" #include "tracefs/tracefs.h" // KernelShark #include "libkshark-plugin.h" /** * Kernel Shark entry contains all information from one trace record needed * in order to visualize the time-series of trace records. The part of the * data which is not directly required for the visualization (latency, record * info etc.) is available on-demand via the offset into the trace file. */ struct kshark_entry { /** Pointer to the next (in time) kshark_entry on the same CPU core. */ struct kshark_entry *next; /* MUST BE FIRST ENTRY */ /** * A bit mask controlling the visibility of the entry. A value of OxFF * would mean that the entry is visible everywhere. Use * kshark_filter_masks to check the level of visibility/invisibility * of the entry. */ uint16_t visible; /** The CPU core of the record. */ int16_t cpu; /** The PID of the task the record was generated. */ int32_t pid; /** Unique Id ot the trace event type. */ int32_t event_id; /** The offset into the trace file, used to find the record. */ uint64_t offset; /** * The time of the record in nano seconds. The value is taken from * the timestamps within the trace data file, which are architecture * dependent. The time usually is the timestamp from when the system * started. */ uint64_t ts; }; /** Size of the task's hash table. */ #define KS_TASK_HASH_SHIFT 16 #define KS_TASK_HASH_SIZE (1 << KS_TASK_HASH_SHIFT) /** Linked list of tasks. */ struct kshark_task_list { /** Pointer to the next task's PID. */ struct kshark_task_list *next; /** PID of a task. */ int pid; }; /** Structure representing a kshark session. */ struct kshark_context { /** Input handle for the trace data file. */ struct tracecmd_input *handle; /** Page event used to parse the page. */ struct tep_handle *pevent; /** Hash table of task PIDs. */ struct kshark_task_list *tasks[KS_TASK_HASH_SIZE]; /** A mutex, used to protect the access to the input file. */ pthread_mutex_t input_mutex; /** Hash of tasks to filter on. */ struct tracecmd_filter_id *show_task_filter; /** Hash of tasks to not display. */ struct tracecmd_filter_id *hide_task_filter; /** Hash of events to filter on. */ struct tracecmd_filter_id *show_event_filter; /** Hash of events to not display. */ struct tracecmd_filter_id *hide_event_filter; /** Hash of CPUs to filter on. */ struct tracecmd_filter_id *show_cpu_filter; /** Hash of CPUs to not display. */ struct tracecmd_filter_id *hide_cpu_filter; /** * Bit mask, controlling the visibility of the entries after filtering. * If given bit is set here, all entries which are filtered-out will * have this bit unset in their "visible" fields. */ uint8_t filter_mask; /** * Filter allowing sophisticated filtering based on the content of * the event. */ struct tep_event_filter *advanced_event_filter; /** List of Data collections. */ struct kshark_entry_collection *collections; /** List of Plugins. */ struct kshark_plugin_list *plugins; /** List of Plugin Event handlers. */ struct kshark_event_handler *event_handlers; }; bool kshark_instance(struct kshark_context **kshark_ctx); bool kshark_open(struct kshark_context *kshark_ctx, const char *file); ssize_t kshark_load_data_entries(struct kshark_context *kshark_ctx, struct kshark_entry ***data_rows); ssize_t kshark_load_data_records(struct kshark_context *kshark_ctx, struct tep_record ***data_rows); size_t kshark_load_data_matrix(struct kshark_context *kshark_ctx, uint64_t **offset_array, uint16_t **cpu_array, uint64_t **ts_array, uint16_t **pid_array, int **event_array); ssize_t kshark_get_task_pids(struct kshark_context *kshark_ctx, int **pids); void kshark_close(struct kshark_context *kshark_ctx); void kshark_free(struct kshark_context *kshark_ctx); int kshark_get_pid_easy(struct kshark_entry *entry); const char *kshark_get_task_easy(struct kshark_entry *entry); const char *kshark_get_latency_easy(struct kshark_entry *entry); int kshark_get_event_id_easy(struct kshark_entry *entry); const char *kshark_get_event_name_easy(struct kshark_entry *entry); const char *kshark_get_info_easy(struct kshark_entry *entry); void kshark_convert_nano(uint64_t time, uint64_t *sec, uint64_t *usec); char* kshark_dump_entry(const struct kshark_entry *entry); /** * Custom entry info function type. To be user for dumping info for custom * KernelShark entryes. */ typedef const char *(kshark_custom_info_func)(struct kshark_context *, const struct kshark_entry *, bool); char* kshark_dump_custom_entry(struct kshark_context *kshark_ctx, const struct kshark_entry *entry, kshark_custom_info_func info_func); /** Bit masks used to control the visibility of the entry after filtering. */ enum kshark_filter_masks { /** * Use this mask to check the visibility of the entry in the text * view. */ KS_TEXT_VIEW_FILTER_MASK = 1 << 0, /** * Use this mask to check the visibility of the entry in the graph * view. */ KS_GRAPH_VIEW_FILTER_MASK = 1 << 1, /** Special mask used whene filtering events. */ KS_EVENT_VIEW_FILTER_MASK = 1 << 2, /* The next 4 bits are reserved for more KS_X_VIEW_FILTER_MASKs. */ /** * Use this mask to check if the content of the entry has been accessed * by a plugin-defined function. */ KS_PLUGIN_UNTOUCHED_MASK = 1 << 7 }; /** Filter type identifier. */ enum kshark_filter_type { /** Dummy filter identifier reserved for future use. */ KS_NO_FILTER, /** * Identifier of the filter, used to specified the events to be shown. */ KS_SHOW_EVENT_FILTER, /** * Identifier of the filter, used to specified the events to be * filtered-out. */ KS_HIDE_EVENT_FILTER, /** * Identifier of the filter, used to specified the tasks to be shown. */ KS_SHOW_TASK_FILTER, /** * Identifier of the filter, used to specified the tasks to be * filtered-out. */ KS_HIDE_TASK_FILTER, /** * Identifier of the filter, used to specified the CPUs to be shown. */ KS_SHOW_CPU_FILTER, /** * Identifier of the filter, used to specified the CPUs to be * filtered-out. */ KS_HIDE_CPU_FILTER, }; void kshark_filter_add_id(struct kshark_context *kshark_ctx, int filter_id, int id); void kshark_filter_clear(struct kshark_context *kshark_ctx, int filter_id); bool kshark_this_filter_is_set(struct tracecmd_filter_id *filter); bool kshark_filter_is_set(struct kshark_context *kshark_ctx); void kshark_filter_entries(struct kshark_context *kshark_ctx, struct kshark_entry **data, size_t n_entries); void kshark_clear_all_filters(struct kshark_context *kshark_ctx, struct kshark_entry **data, size_t n_entries); /** Search failed identifiers. */ enum kshark_search_failed { /** All entries have timestamps greater timestamps. */ BSEARCH_ALL_GREATER = -1, /** All entries have timestamps smaller timestamps. */ BSEARCH_ALL_SMALLER = -2, }; /** General purpose Binary search macro. */ #define BSEARCH(h, l, cond) \ ({ \ while (h - l > 1) { \ mid = (l + h) / 2; \ if (cond) \ l = mid; \ else \ h = mid; \ } \ }) ssize_t kshark_find_entry_by_time(uint64_t time, struct kshark_entry **data_rows, size_t l, size_t h); ssize_t kshark_find_record_by_time(uint64_t time, struct tep_record **data_rows, size_t l, size_t h); bool kshark_match_pid(struct kshark_context *kshark_ctx, struct kshark_entry *e, int pid); bool kshark_match_cpu(struct kshark_context *kshark_ctx, struct kshark_entry *e, int cpu); /** * Empty bin identifier. * KS_EMPTY_BIN is used to reset entire arrays to empty with memset(), thus it * must be -1 for that to work. */ #define KS_EMPTY_BIN -1 /** Filtered bin identifier. */ #define KS_FILTERED_BIN -2 /** Overflow Event identifier. */ #define KS_EVENT_OVERFLOW (-EOVERFLOW) /** Matching condition function type. To be user for data requests */ typedef bool (matching_condition_func)(struct kshark_context*, struct kshark_entry*, int); /** * Data request structure, defining the properties of the required * kshark_entry. */ struct kshark_entry_request { /** Pointer to the next Data request. */ struct kshark_entry_request *next; /** * Array index specifying the position inside the array from where * the search starts. */ size_t first; /** Number of array elements to search in. */ size_t n; /** Matching condition function. */ matching_condition_func *cond; /** * Matching condition value, used by the Matching condition function. */ int val; /** If true, a visible entry is requested. */ bool vis_only; /** * If "vis_only" is true, use this mask to specify the level of * visibility of the requested entry. */ uint8_t vis_mask; }; struct kshark_entry_request * kshark_entry_request_alloc(size_t first, size_t n, matching_condition_func cond, int val, bool vis_only, int vis_mask); void kshark_free_entry_request(struct kshark_entry_request *req); const struct kshark_entry * kshark_get_entry_front(const struct kshark_entry_request *req, struct kshark_entry **data, ssize_t *index); const struct kshark_entry * kshark_get_entry_back(const struct kshark_entry_request *req, struct kshark_entry **data, ssize_t *index); /** * Data collections are used to optimize the search for an entry having an * abstract property, defined by a Matching condition function and a value. * When a collection is processed, the data which is relevant for the * collection is enclosed in "Data intervals", defined by pairs of "Resume" and * "Break" points. It is guaranteed that the data outside of the intervals * contains no entries satisfying the abstract matching condition. However, the * intervals may (will) contain data that do not satisfy the matching condition. * Once defined, the Data collection can be used when searching for an entry * having the same (ore related) abstract property. The collection allows to * ignore the irrelevant data, thus it eliminates the linear worst-case time * complexity of the search. */ struct kshark_entry_collection { /** Pointer to the next Data collection. */ struct kshark_entry_collection *next; /** Matching condition function, used to define the collections. */ matching_condition_func *cond; /** * Matching condition value, used by the Matching condition finction * to define the collections. */ int val; /** * Array of indexes defining the beginning of each individual data * interval. */ size_t *resume_points; /** * Array of indexes defining the end of each individual data interval. */ size_t *break_points; /** Number of data intervals in this collection. */ size_t size; }; struct kshark_entry_collection * kshark_add_collection_to_list(struct kshark_context *kshark_ctx, struct kshark_entry_collection **col_list, struct kshark_entry **data, size_t n_rows, matching_condition_func cond, int val, size_t margin); struct kshark_entry_collection * kshark_register_data_collection(struct kshark_context *kshark_ctx, struct kshark_entry **data, size_t n_rows, matching_condition_func cond, int val, size_t margin); void kshark_unregister_data_collection(struct kshark_entry_collection **col, matching_condition_func cond, int val); struct kshark_entry_collection * kshark_find_data_collection(struct kshark_entry_collection *col, matching_condition_func cond, int val); void kshark_reset_data_collection(struct kshark_entry_collection *col); void kshark_free_collection_list(struct kshark_entry_collection *col); const struct kshark_entry * kshark_get_collection_entry_front(struct kshark_entry_request *req, struct kshark_entry **data, const struct kshark_entry_collection *col, ssize_t *index); const struct kshark_entry * kshark_get_collection_entry_back(struct kshark_entry_request *req, struct kshark_entry **data, const struct kshark_entry_collection *col, ssize_t *index); /** Structure representing a KernelShark Configuration document. */ struct kshark_config_doc { /** Document format identifier. */ int format; /** Configuration document instance. */ void *conf_doc; }; /** Configuration format identifiers. */ enum kshark_config_formats { /** Unformatted Configuration document identifier. */ KS_CONFIG_AUTO = 0, /** * String Configuration document identifier. The String format is * meant to be used only by kshark_config_doc_add() and * kshark_config_doc_get(), when adding/getting simple string fields. */ KS_CONFIG_STRING, /** Json Configuration document identifier. */ KS_CONFIG_JSON, }; /** * Field name for the Configuration document describing the Hide Event filter. */ #define KS_HIDE_EVENT_FILTER_NAME "hide event filter" /** * Field name for the Configuration document describing the Show Event filter. */ #define KS_SHOW_EVENT_FILTER_NAME "show event filter" /** * Field name for the Configuration document describing the Hide Task filter. */ #define KS_HIDE_TASK_FILTER_NAME "hide task filter" /** * Field name for the Configuration document describing the Show Task filter. */ #define KS_SHOW_TASK_FILTER_NAME "show task filter" /** * Field name for the Configuration document describing the Hide Task filter. */ #define KS_HIDE_CPU_FILTER_NAME "hide cpu filter" /** * Field name for the Configuration document describing the Show Task filter. */ #define KS_SHOW_CPU_FILTER_NAME "show cpu filter" /** * Field name for the Configuration document describing the Advanced event * filter. */ #define KS_ADV_EVENT_FILTER_NAME "adv event filter" /** * Field name for the Configuration document describing user-specified filter * mask. */ #define KS_USER_FILTER_MASK_NAME "filter mask" /** * Field name for the Configuration document describing the state of the Vis. * model. */ #define KS_HISTO_NAME "vis. model" /** * Field name for the Configuration document describing the currently loaded * trace data file. */ #define KS_DATA_SOURCE_NAME "trace data" struct kshark_config_doc * kshark_config_alloc(enum kshark_config_formats); struct kshark_config_doc * kshark_config_new(const char *type, enum kshark_config_formats); void kshark_free_config_doc(struct kshark_config_doc *conf); struct kshark_config_doc * kshark_record_config_new(enum kshark_config_formats); struct kshark_config_doc * kshark_filter_config_new(enum kshark_config_formats); struct kshark_config_doc *kshark_string_config_alloc(void); bool kshark_type_check(struct kshark_config_doc *conf, const char *type); bool kshark_config_doc_add(struct kshark_config_doc *conf, const char *key, struct kshark_config_doc *val); bool kshark_config_doc_get(struct kshark_config_doc *conf, const char *key, struct kshark_config_doc *val); struct kshark_trace_histo; struct kshark_config_doc * kshark_export_trace_file(const char *file, enum kshark_config_formats format); const char *kshark_import_trace_file(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf); struct kshark_config_doc * kshark_export_model(struct kshark_trace_histo *histo, enum kshark_config_formats format); bool kshark_import_model(struct kshark_trace_histo *histo, struct kshark_config_doc *conf); bool kshark_export_adv_filters(struct kshark_context *kshark_ctx, struct kshark_config_doc **conf); bool kshark_import_adv_filters(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf); bool kshark_export_event_filter(struct tep_handle *pevent, struct tracecmd_filter_id *filter, const char *filter_name, struct kshark_config_doc *conf); int kshark_import_event_filter(struct tep_handle *pevent, struct tracecmd_filter_id *filter, const char *filter_name, struct kshark_config_doc *conf); bool kshark_export_user_mask(struct kshark_context *kshark_ctx, struct kshark_config_doc **conf); bool kshark_import_user_mask(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf); bool kshark_export_filter_array(struct tracecmd_filter_id *filter, const char *filter_name, struct kshark_config_doc *conf); bool kshark_import_filter_array(struct tracecmd_filter_id *filter, const char *filter_name, struct kshark_config_doc *conf); bool kshark_export_all_event_filters(struct kshark_context *kshark_ctx, struct kshark_config_doc **conf); bool kshark_export_all_task_filters(struct kshark_context *kshark_ctx, struct kshark_config_doc **conf); bool kshark_export_all_cpu_filters(struct kshark_context *kshark_ctx, struct kshark_config_doc **conf); struct kshark_config_doc * kshark_export_all_filters(struct kshark_context *kshark_ctx, enum kshark_config_formats format); bool kshark_import_all_event_filters(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf); bool kshark_import_all_task_filters(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf); bool kshark_import_all_cpu_filters(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf); bool kshark_import_all_filters(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf); bool kshark_save_config_file(const char *file_name, struct kshark_config_doc *conf); struct kshark_config_doc *kshark_open_config_file(const char *file_name, const char *type); struct kshark_config_doc *kshark_json_to_conf(struct json_object *jobj); #ifdef __cplusplus } #endif #endif // _LIB_KSHARK_H trace-cmd-v2.9.6/kernel-shark/src/plugins/000077500000000000000000000000001414302661500204155ustar00rootroot00000000000000trace-cmd-v2.9.6/kernel-shark/src/plugins/CMakeLists.txt000066400000000000000000000022241414302661500231550ustar00rootroot00000000000000message("\n src/plugins ...") function(BUILD_PLUGIN) set(options ) set(oneValueArgs NAME) set(multiValueArgs SOURCE) cmake_parse_arguments(ADD_PLUGIN "${options}" ${oneValueArgs} ${multiValueArgs} ${ARGN}) message(STATUS ${ADD_PLUGIN_NAME}) add_library(${ADD_PLUGIN_NAME} SHARED ${ADD_PLUGIN_SOURCE}) set_target_properties(${ADD_PLUGIN_NAME} PROPERTIES PREFIX "plugin-") target_link_libraries(${ADD_PLUGIN_NAME} kshark) endfunction() set(PLUGIN_LIST "") BUILD_PLUGIN(NAME sched_events SOURCE sched_events.c SchedEvents.cpp) list(APPEND PLUGIN_LIST "sched_events default") # This plugin will be loaded by default # list(APPEND PLUGIN_LIST "sched_events") # This plugin isn't loaded by default BUILD_PLUGIN(NAME missed_events SOURCE missed_events.c MissedEvents.cpp) list(APPEND PLUGIN_LIST "missed_events default") # This plugin will be loaded by default install(TARGETS sched_events missed_events LIBRARY DESTINATION ${KS_PLUGIN_INSTALL_PREFIX}) set(PLUGINS ${PLUGIN_LIST} PARENT_SCOPE) trace-cmd-v2.9.6/kernel-shark/src/plugins/MissedEvents.cpp000066400000000000000000000070251414302661500235360ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ /** * @file MissedEvents.cpp * @brief Plugin for visualization of events, missed due to overflow of the ring buffer. */ // C++ #include // KernelShark #include "libkshark.h" #include "plugins/missed_events.h" #include "KsPlotTools.hpp" #include "KsPlugins.hpp" using namespace KsPlot; /** * This class represents the graphical element of the KernelShark marker for * Missed events. */ class MissedEventsMark : public PlotObject { public: /** Create a default Missed events marker. */ MissedEventsMark() : _base(0, 0), _height(0) { _color = {0, 0, 255}; _size = 2; } /** * @brief Create and position a Missed events marker. * * @param p: Base point of the marker. * @param h: vertical size (height) of the marker. */ MissedEventsMark(const Point &p, int h) : _base(p.x(), p.y()), _height(h) { _color = {0, 0, 255}; _size = 2; } /** Set the Base point of the marker. */ void setBase(const Point &p) {_base.set(p.x(), p.y());} /** Set the vertical size (height) point of the marker. */ void setHeight(int h) {_height = h;} private: /** Base point of the Mark's line. */ Point _base; /** The vertical size (height) of the Mark. */ int _height; void _draw(const Color &col, float size = 1.) const override; }; void MissedEventsMark::_draw(const Color &col, float size) const { Point p(_base.x(), _base.y() - _height); drawLine(_base, p, col, size); Rectangle rec; rec.setPoint(0, p.x(), p.y()); rec.setPoint(1, p.x() - _height / 4, p.y()); rec.setPoint(2, p.x() - _height / 4, p.y() + _height / 4); rec.setPoint(3, p.x(), p.y() + _height / 4); rec._color = col; rec.draw(); } //! @cond Doxygen_Suppress #define PLUGIN_MAX_ENTRIES 10000 #define KS_TASK_COLLECTION_MARGIN 25 //! @endcond static void pluginDraw(kshark_context *kshark_ctx, KsCppArgV *argvCpp, int val, int draw_action) { int height = argvCpp->_graph->getHeight(); const kshark_entry *entry(nullptr); MissedEventsMark *mark; ssize_t index; int nBins = argvCpp->_graph->size(); for (int bin = 0; bin < nBins; ++bin) { if (draw_action == KSHARK_PLUGIN_TASK_DRAW) entry = ksmodel_get_task_missed_events(argvCpp->_histo, bin, val, nullptr, &index); if (draw_action == KSHARK_PLUGIN_CPU_DRAW) entry = ksmodel_get_cpu_missed_events(argvCpp->_histo, bin, val, nullptr, &index); if (entry) { mark = new MissedEventsMark(argvCpp->_graph->getBin(bin)._base, height); argvCpp->_shapes->push_front(mark); } } } /** * @brief Plugin's draw function. * * @param argv_c: A C pointer to be converted to KsCppArgV (C++ struct). * @param val: Process or CPU Id value. * @param draw_action: Draw action identifier. */ void draw_missed_events(kshark_cpp_argv *argv_c, int val, int draw_action) { kshark_context *kshark_ctx(NULL); if (!kshark_instance(&kshark_ctx)) return; KsCppArgV *argvCpp = KS_ARGV_TO_CPP(argv_c); /* * Plotting the "Missed events" makes sense only in the case of a deep * zoom. Here we set a threshold based on the total number of entries * being visualized by the model. * Don't be afraid to play with different values for this threshold. */ if (argvCpp->_histo->tot_count > PLUGIN_MAX_ENTRIES) return; try { pluginDraw(kshark_ctx, argvCpp, val, draw_action); } catch (const std::exception &exc) { std::cerr << "Exception in MissedEvents\n" << exc.what(); } } trace-cmd-v2.9.6/kernel-shark/src/plugins/SchedEvents.cpp000066400000000000000000000175561414302661500233520ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ /** * @file SchedEvents.cpp * @brief Defines a callback function for Sched events used to plot in green * the wake up latency of the task and in red the time the task was * preempted by another task. */ // C++ #include // C++ 11 #include #include // KernelShark #include "libkshark.h" #include "plugins/sched_events.h" #include "KsPlotTools.hpp" #include "KsPlugins.hpp" //! @cond Doxygen_Suppress #define PLUGIN_MIN_BOX_SIZE 4 #define KS_TASK_COLLECTION_MARGIN 25 //! @endcond extern struct plugin_sched_context *plugin_sched_context_handler; /** Sched Event identifier. */ enum class SchedEvent { /** Sched Switch Event. */ Switch, /** Sched Wakeup Event. */ Wakeup, }; static void pluginDraw(plugin_sched_context *plugin_ctx, kshark_context *kshark_ctx, kshark_trace_histo *histo, kshark_entry_collection *col, SchedEvent e, int pid, KsPlot::Graph *graph, KsPlot::PlotObjList *shapes) { const kshark_entry *entryClose, *entryOpen, *entryME; ssize_t indexClose(0), indexOpen(0), indexME(0); std::function ifSchedBack; KsPlot::Rectangle *rec = nullptr; int height = graph->getHeight() * .3; auto openBox = [&] (const KsPlot::Point &p) { /* * First check if we already have an open box. If we don't * have, open a new one. */ if (!rec) rec = new KsPlot::Rectangle; if (e == SchedEvent::Switch) { /* Red box. */ rec->_color = KsPlot::Color(255, 0, 0); } else { /* Green box. */ rec->_color = KsPlot::Color(0, 255, 0); } rec->setFill(false); rec->setPoint(0, p.x() - 1, p.y() - height); rec->setPoint(1, p.x() - 1, p.y() - 1); }; auto closeBox = [&] (const KsPlot::Point &p) { if (rec == nullptr) return; int boxSize = p.x() - rec->getPoint(0)->x; if (boxSize < PLUGIN_MIN_BOX_SIZE) { /* This box is too small. Don't try to plot it. */ delete rec; rec = nullptr; return; } rec->setPoint(3, p.x() - 1, p.y() - height); rec->setPoint(2, p.x() - 1, p.y() - 1); shapes->push_front(rec); rec = nullptr; }; for (int bin = 0; bin < graph->size(); ++bin) { /* * Starting from the first element in this bin, go forward * in time until you find a trace entry that satisfies the * condition defined by kshark_match_pid. */ entryClose = ksmodel_get_entry_back(histo, bin, false, plugin_switch_match_entry_pid, pid, col, &indexClose); entryME = ksmodel_get_task_missed_events(histo, bin, pid, col, &indexME); if (e == SchedEvent::Switch) { /* * Starting from the last element in this bin, go backward * in time until you find a trace entry that satisfies the * condition defined by plugin_switch_match_rec_pid. */ entryOpen = ksmodel_get_entry_back(histo, bin, false, plugin_switch_match_rec_pid, pid, col, &indexOpen); } else { /* * Starting from the last element in this bin, go backward * in time until you find a trace entry that satisfies the * condition defined by plugin_wakeup_match_rec_pid. */ entryOpen = ksmodel_get_entry_back(histo, bin, false, plugin_wakeup_match_rec_pid, pid, col, &indexOpen); if (entryOpen) { int cpu = ksmodel_get_cpu_back(histo, bin, pid, false, col, nullptr); if (cpu >= 0) { /* * The task is already running. Ignore * this wakeup event. */ entryOpen = nullptr; } } } if (rec) { if (entryME || entryClose) { /* Close the box in this bin. */ closeBox(graph->getBin(bin)._base); if (entryOpen && indexME < indexOpen && indexClose < indexOpen) { /* * We have a Sched switch entry that * comes after (in time) the closure of * the previous box. We have to open a * new box in this bin. */ openBox(graph->getBin(bin)._base); } } } else { if (entryOpen && (!entryClose || indexClose < indexOpen)) { /* Open a new box in this bin. */ openBox(graph->getBin(bin)._base); } } } if (rec) delete rec; return; } /* * Ideally, the sched_switch has to be the last trace event recorded before the * task is preempted. Because of this, when the data is loaded (the first pass), * the "pid" field of the sched_switch entries gets edited by this plugin to be * equal to the "next pid" of the sched_switch event. However, in reality the * sched_switch event may be followed by some trailing events from the same task * (printk events for example). This has the effect of extending the graph of * the task outside of the actual duration of the task. The "second pass" over * the data is used to fix this problem. It takes advantage of the "next" field * of the entry (this field is set during the first pass) to search for trailing * events after the "sched_switch". */ static void secondPass(kshark_entry **data, kshark_entry_collection *col, int pid) { if (!col) return; const kshark_entry *e; kshark_entry *last; int first, n; ssize_t index; /* Loop over the intervals of the data collection. */ for (size_t i = 0; i < col->size; ++i) { first = col->break_points[i]; n = first - col->resume_points[i]; kshark_entry_request *req = kshark_entry_request_alloc(first, n, plugin_switch_match_rec_pid, pid, false, KS_GRAPH_VIEW_FILTER_MASK); e = kshark_get_entry_back(req, data, &index); free(req); if (!e || index < 0) { /* No sched_switch event in this interval. */ continue; } /* Find the very last trailing event. */ for (last = data[index]; last->next; last = last->next) { if (last->next->pid != pid) { /* * This is the last trailing event. Change the * "pid" to be equal to the "next pid" of the * sched_switch event and leave a sign that you * edited this entry. */ last->pid = data[index]->pid; last->visible &= ~KS_PLUGIN_UNTOUCHED_MASK; break; } } } } /** * @brief Plugin's draw function. * * @param argv_c: A C pointer to be converted to KsCppArgV (C++ struct). * @param pid: Process Id. * @param draw_action: Draw action identifier. */ void plugin_draw(kshark_cpp_argv *argv_c, int pid, int draw_action) { plugin_sched_context *plugin_ctx; kshark_context *kshark_ctx(NULL); kshark_entry_collection *col; if (draw_action != KSHARK_PLUGIN_TASK_DRAW || pid == 0) return; plugin_ctx = plugin_sched_context_handler; if (!plugin_ctx || !kshark_instance(&kshark_ctx)) return; KsCppArgV *argvCpp = KS_ARGV_TO_CPP(argv_c); /* * Try to find a collections for this task. It is OK if * coll = NULL. */ col = kshark_find_data_collection(plugin_ctx->collections, plugin_match_pid, pid); if (!col) { /* * If a data collection for this task does not exist, * register a new one. */ kshark_entry **data = argvCpp->_histo->data; int size = argvCpp->_histo->data_size; col = kshark_add_collection_to_list(kshark_ctx, &plugin_ctx->collections, data, size, plugin_match_pid, pid, KS_TASK_COLLECTION_MARGIN); } if (!tracecmd_filter_id_find(plugin_ctx->second_pass_hash, pid)) { /* The second pass for this task is not done yet. */ secondPass(argvCpp->_histo->data, col, pid); tracecmd_filter_id_add(plugin_ctx->second_pass_hash, pid); } try { pluginDraw(plugin_ctx, kshark_ctx, argvCpp->_histo, col, SchedEvent::Wakeup, pid, argvCpp->_graph, argvCpp->_shapes); pluginDraw(plugin_ctx, kshark_ctx, argvCpp->_histo, col, SchedEvent::Switch, pid, argvCpp->_graph, argvCpp->_shapes); } catch (const std::exception &exc) { std::cerr << "Exception in SchedEvents\n" << exc.what(); } } trace-cmd-v2.9.6/kernel-shark/src/plugins/missed_events.c000066400000000000000000000016321414302661500234330ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ /** * @file missed_events.c * @brief Plugin for visualization of missed events due to overflow of the * ring buffer. */ // KernelShark #include "plugins/missed_events.h" static void nop_action(struct kshark_context *kshark_ctx, struct tep_record *record, struct kshark_entry *entry) {} /** Load this plugin. */ int KSHARK_PLUGIN_INITIALIZER(struct kshark_context *kshark_ctx) { kshark_register_event_handler(&kshark_ctx->event_handlers, KS_EVENT_OVERFLOW, nop_action, draw_missed_events); return 1; } /** Unload this plugin. */ int KSHARK_PLUGIN_DEINITIALIZER(struct kshark_context *kshark_ctx) { kshark_unregister_event_handler(&kshark_ctx->event_handlers, KS_EVENT_OVERFLOW, nop_action, draw_missed_events); return 1; } trace-cmd-v2.9.6/kernel-shark/src/plugins/missed_events.h000066400000000000000000000010051414302661500234320ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ /** * @file missed_events.h * @brief Plugin for visualization of missed events due to overflow of the * ring buffer. */ #ifndef _KS_PLUGIN_M_EVTS_H #define _KS_PLUGIN_M_EVTS_H // KernelShark #include "libkshark.h" #ifdef __cplusplus extern "C" { #endif void draw_missed_events(struct kshark_cpp_argv *argv, int pid, int draw_action); #ifdef __cplusplus } #endif #endif trace-cmd-v2.9.6/kernel-shark/src/plugins/sched_events.c000066400000000000000000000227171414302661500232440ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ /** * @file sched_events.c * @brief Defines a callback function for Sched events used to registers the * "next" task (if not registered already) and to changes the value * of the "pid" field of the "sched_switch" entries such that, it * will be ploted as part of the "next" task. */ // C #include #include #include // KernelShark #include "plugins/sched_events.h" /** Plugin context instance. */ struct plugin_sched_context *plugin_sched_context_handler = NULL; static bool define_wakeup_event(struct tep_handle *tep, const char *wakeup_name, struct tep_event **wakeup_event, struct tep_format_field **pid_field) { struct tep_event *event; event = tep_find_event_by_name(tep, "sched", wakeup_name); if (!event) return false; *wakeup_event = event; *pid_field = tep_find_any_field(event, "pid"); return true; } static void plugin_free_context(struct plugin_sched_context *plugin_ctx) { if (!plugin_ctx) return; tracecmd_filter_id_hash_free(plugin_ctx->second_pass_hash); kshark_free_collection_list(plugin_ctx->collections); free(plugin_ctx); } static bool plugin_sched_init_context(struct kshark_context *kshark_ctx) { struct plugin_sched_context *plugin_ctx; struct tep_event *event; bool wakeup_found; /* No context should exist when we initialize the plugin. */ assert(plugin_sched_context_handler == NULL); plugin_sched_context_handler = calloc(1, sizeof(*plugin_sched_context_handler)); if (!plugin_sched_context_handler) { fprintf(stderr, "Failed to allocate memory for plugin_sched_context.\n"); return false; } plugin_ctx = plugin_sched_context_handler; plugin_ctx->handle = kshark_ctx->handle; plugin_ctx->pevent = kshark_ctx->pevent; plugin_ctx->collections = NULL; event = tep_find_event_by_name(plugin_ctx->pevent, "sched", "sched_switch"); if (!event) { plugin_free_context(plugin_ctx); plugin_sched_context_handler = NULL; return false; } plugin_ctx->sched_switch_event = event; plugin_ctx->sched_switch_next_field = tep_find_any_field(event, "next_pid"); plugin_ctx->sched_switch_comm_field = tep_find_field(event, "next_comm"); plugin_ctx->sched_switch_prev_state_field = tep_find_field(event, "prev_state"); wakeup_found = define_wakeup_event(kshark_ctx->pevent, "sched_wakeup", &plugin_ctx->sched_wakeup_event, &plugin_ctx->sched_wakeup_pid_field); wakeup_found |= define_wakeup_event(kshark_ctx->pevent, "sched_wakeup_new", &plugin_ctx->sched_wakeup_new_event, &plugin_ctx->sched_wakeup_new_pid_field); wakeup_found |= define_wakeup_event(kshark_ctx->pevent, "sched_waking", &plugin_ctx->sched_waking_event, &plugin_ctx->sched_waking_pid_field); plugin_ctx->second_pass_hash = tracecmd_filter_id_hash_alloc(); return true; } /** * @brief Get the Process Id of the next scheduled task. * * @param record: Input location for a sched_switch record. */ int plugin_get_next_pid(struct tep_record *record) { struct plugin_sched_context *plugin_ctx = plugin_sched_context_handler; unsigned long long val; int ret; ret = tep_read_number_field(plugin_ctx->sched_switch_next_field, record->data, &val); return ret ? : val; } static void plugin_register_command(struct kshark_context *kshark_ctx, struct tep_record *record, int pid) { struct plugin_sched_context *plugin_ctx = plugin_sched_context_handler; const char *comm; if (!plugin_ctx->sched_switch_comm_field) return; comm = record->data + plugin_ctx->sched_switch_comm_field->offset; /* * TODO: The retrieve of the name of the command above needs to be * implemented as a wrapper function in libtracevent. */ if (!tep_is_pid_registered(kshark_ctx->pevent, pid)) tep_register_comm(kshark_ctx->pevent, comm, pid); } static int find_wakeup_pid(struct kshark_context *kshark_ctx, struct kshark_entry *e, struct tep_event *wakeup_event, struct tep_format_field *pid_field) { struct tep_record *record; unsigned long long val; int ret; if (!wakeup_event || e->event_id != wakeup_event->id) return -1; record = tracecmd_read_at(kshark_ctx->handle, e->offset, NULL); ret = tep_read_number_field(pid_field, record->data, &val); tracecmd_free_record(record); if (ret) return -1; return val; } static bool wakeup_match_rec_pid(struct plugin_sched_context *plugin_ctx, struct kshark_context *kshark_ctx, struct kshark_entry *e, int pid) { struct tep_event *wakeup_events[] = { plugin_ctx->sched_waking_event, plugin_ctx->sched_wakeup_event, plugin_ctx->sched_wakeup_new_event, }; struct tep_format_field *wakeup_fields[] = { plugin_ctx->sched_waking_pid_field, plugin_ctx->sched_wakeup_pid_field, plugin_ctx->sched_wakeup_new_pid_field, }; int i, wakeup_pid = -1; for (i = 0; i < sizeof(wakeup_events) / sizeof(wakeup_events[0]); i++) { wakeup_pid = find_wakeup_pid(kshark_ctx, e, wakeup_events[i], wakeup_fields[i]); if (wakeup_pid >= 0) break; } if (wakeup_pid >= 0 && wakeup_pid == pid) return true; return false; } /** * @brief Process Id matching function adapted for sched_wakeup and * sched_wakeup_new events. * * @param kshark_ctx: Input location for the session context pointer. * @param e: kshark_entry to be checked. * @param pid: Matching condition value. * * @returns True if the Pid of the record matches the value of "pid". * Otherwise false. */ bool plugin_wakeup_match_rec_pid(struct kshark_context *kshark_ctx, struct kshark_entry *e, int pid) { struct plugin_sched_context *plugin_ctx; plugin_ctx = plugin_sched_context_handler; if (!plugin_ctx) return false; return wakeup_match_rec_pid(plugin_ctx, kshark_ctx, e, pid); } /** * @brief Process Id matching function adapted for sched_switch events. * * @param kshark_ctx: Input location for the session context pointer. * @param e: kshark_entry to be checked. * @param pid: Matching condition value. * * @returns True if the Pid of the record matches the value of "pid". * Otherwise false. */ bool plugin_switch_match_rec_pid(struct kshark_context *kshark_ctx, struct kshark_entry *e, int pid) { struct plugin_sched_context *plugin_ctx; unsigned long long val; int ret, switch_pid = -1; plugin_ctx = plugin_sched_context_handler; if (plugin_ctx->sched_switch_event && e->event_id == plugin_ctx->sched_switch_event->id) { struct tep_record *record; record = tracecmd_read_at(kshark_ctx->handle, e->offset, NULL); ret = tep_read_number_field(plugin_ctx->sched_switch_prev_state_field, record->data, &val); if (ret == 0 && !(val & 0x7f)) switch_pid = tep_data_pid(plugin_ctx->pevent, record); tracecmd_free_record(record); } if (switch_pid >= 0 && switch_pid == pid) return true; return false; } /** * @brief Process Id matching function adapted for sched_switch events. * * @param kshark_ctx: Input location for the session context pointer. * @param e: kshark_entry to be checked. * @param pid: Matching condition value. * * @returns True if the Pid of the entry matches the value of "pid". * Otherwise false. */ bool plugin_switch_match_entry_pid(struct kshark_context *kshark_ctx, struct kshark_entry *e, int pid) { struct plugin_sched_context *plugin_ctx; plugin_ctx = plugin_sched_context_handler; if (plugin_ctx->sched_switch_event && e->event_id == plugin_ctx->sched_switch_event->id && e->pid == pid) return true; return false; } /** * @brief A match function to be used to process a data collections for * the Sched events plugin. * * @param kshark_ctx: Input location for the session context pointer. * @param e: kshark_entry to be checked. * @param pid: Matching condition value. * * @returns True if the entry is relevant for the Sched events plugin. * Otherwise false. */ bool plugin_match_pid(struct kshark_context *kshark_ctx, struct kshark_entry *e, int pid) { return plugin_switch_match_entry_pid(kshark_ctx, e, pid) || plugin_switch_match_rec_pid(kshark_ctx, e, pid) || plugin_wakeup_match_rec_pid(kshark_ctx, e, pid); } static void plugin_sched_action(struct kshark_context *kshark_ctx, struct tep_record *rec, struct kshark_entry *entry) { int pid = plugin_get_next_pid(rec); if (pid >= 0) { entry->pid = pid; plugin_register_command(kshark_ctx, rec, entry->pid); } } static int plugin_sched_init(struct kshark_context *kshark_ctx) { struct plugin_sched_context *plugin_ctx; if (!plugin_sched_init_context(kshark_ctx)) return 0; plugin_ctx = plugin_sched_context_handler; kshark_register_event_handler(&kshark_ctx->event_handlers, plugin_ctx->sched_switch_event->id, plugin_sched_action, plugin_draw); return 1; } static int plugin_sched_close(struct kshark_context *kshark_ctx) { struct plugin_sched_context *plugin_ctx; if (!plugin_sched_context_handler) return 0; plugin_ctx = plugin_sched_context_handler; kshark_unregister_event_handler(&kshark_ctx->event_handlers, plugin_ctx->sched_switch_event->id, plugin_sched_action, plugin_draw); plugin_free_context(plugin_ctx); plugin_sched_context_handler = NULL; return 1; } /** Load this plugin. */ int KSHARK_PLUGIN_INITIALIZER(struct kshark_context *kshark_ctx) { return plugin_sched_init(kshark_ctx); } /** Unload this plugin. */ int KSHARK_PLUGIN_DEINITIALIZER(struct kshark_context *kshark_ctx) { return plugin_sched_close(kshark_ctx); } trace-cmd-v2.9.6/kernel-shark/src/plugins/sched_events.h000066400000000000000000000046621414302661500232500ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file sched_events.h * @brief Plugin for Sched events. */ #ifndef _KS_PLUGIN_SHED_H #define _KS_PLUGIN_SHED_H // KernelShark #include "libkshark.h" #ifdef __cplusplus extern "C" { #endif /** Structure representing a plugin-specific context. */ struct plugin_sched_context { /** Input handle for the trace data file. */ struct tracecmd_input *handle; /** Page event used to parse the page. */ struct tep_handle *pevent; /** Pointer to the sched_switch_event object. */ struct tep_event *sched_switch_event; /** Pointer to the sched_switch_next_field format descriptor. */ struct tep_format_field *sched_switch_next_field; /** Pointer to the sched_switch_comm_field format descriptor. */ struct tep_format_field *sched_switch_comm_field; /** Pointer to the sched_switch_prev_state_field format descriptor. */ struct tep_format_field *sched_switch_prev_state_field; /** Pointer to the sched_wakeup_event object. */ struct tep_event *sched_wakeup_event; /** Pointer to the sched_wakeup_pid_field format descriptor. */ struct tep_format_field *sched_wakeup_pid_field; /** Pointer to the sched_wakeup_new_event object. */ struct tep_event *sched_wakeup_new_event; /** Pointer to the sched_wakeup_new_pid_field format descriptor. */ struct tep_format_field *sched_wakeup_new_pid_field; /** Pointer to the sched_waking_event object. */ struct tep_event *sched_waking_event; /** Pointer to the sched_waking_pid_field format descriptor. */ struct tep_format_field *sched_waking_pid_field; /** List of Data collections used by this plugin. */ struct kshark_entry_collection *collections; /** Hash of the tasks for which the second pass is already done. */ struct tracecmd_filter_id *second_pass_hash; }; int plugin_get_next_pid(struct tep_record *record); bool plugin_wakeup_match_rec_pid(struct kshark_context *kshark_ctx, struct kshark_entry *e, int pid); bool plugin_switch_match_rec_pid(struct kshark_context *kshark_ctx, struct kshark_entry *e, int pid); bool plugin_switch_match_entry_pid(struct kshark_context *kshark_ctx, struct kshark_entry *e, int pid); bool plugin_match_pid(struct kshark_context *kshark_ctx, struct kshark_entry *e, int pid); void plugin_draw(struct kshark_cpp_argv *argv, int pid, int draw_action); #ifdef __cplusplus } #endif #endif trace-cmd-v2.9.6/lib/000077500000000000000000000000001414302661500143255ustar00rootroot00000000000000trace-cmd-v2.9.6/lib/trace-cmd/000077500000000000000000000000001414302661500161645ustar00rootroot00000000000000trace-cmd-v2.9.6/lib/trace-cmd/Makefile000066400000000000000000000054051414302661500176300ustar00rootroot00000000000000# SPDX-License-Identifier: GPL-2.0 include $(src)/scripts/utils.mk bdir:=$(obj)/lib/trace-cmd ldir:=$(src)/lib/trace-cmd DEFAULT_TARGET = $(LIBTRACECMD_STATIC) OBJS = OBJS += trace-hash.o OBJS += trace-hooks.o OBJS += trace-input.o OBJS += trace-output.o OBJS += trace-recorder.o OBJS += trace-util.o OBJS += trace-filter-hash.o OBJS += trace-msg.o OBJS += trace-plugin.o OBJS += trace-timesync.o # Additional util objects OBJS += trace-blk-hack.o OBJS += trace-ftrace.o OBJS := $(OBJS:%.o=$(bdir)/%.o) DEPS := $(OBJS:$(bdir)/%.o=$(bdir)/.%.d) all: $(DEFAULT_TARGET) $(bdir): @mkdir -p $(bdir) $(OBJS): | $(bdir) $(DEPS): | $(bdir) $(LIBTRACECMD_STATIC): $(OBJS) $(Q)$(call do_build_static_lib) LIBS = $(LIBTRACEEVENT_LDLAGS) $(LIBTRACEFS_LDLAGS) $(LIBTRACECMD_SHARED_VERSION): $(LIBTRACECMD_SHARED) @ln -sf $( $@ $(OBJS): $(bdir)/%.o : $(bdir)/.%.d ifeq ("$(DESTDIR)", "") # If DESTDIR is not defined, then test if after installing the library # and running ldconfig, if the library is visible by ld.so. # If not, add the path to /etc/ld.so.conf.d/trace.conf and run ldconfig again. define install_ld_config $(LDCONFIG); \ if ! grep "^$(libdir)$$" $(LD_SO_CONF_PATH)/* &> /dev/null ; then \ $(CC) -o $(bdir)/test $(ldir)/test.c -I $(includedir_SQ) \ -L $(libdir_SQ) -ltracecmd > /dev/null; \ if ! $(bdir)/test &> /dev/null; then \ $(call print_install,trace.conf,$(LD_SO_CONF_PATH)) \ echo $(libdir_SQ) >> $(LD_SO_CONF_PATH)/trace.conf; \ $(LDCONFIG); \ fi; \ $(RM) $(bdir)/test; \ fi endef else # If installing to a location for another machine or package, do not bother # with running ldconfig. define install_ld_config endef endif # DESTDIR = "" install_pkgconfig: $(PKG_CONFIG_FILE) $(Q)$(call do_install_pkgconfig_file,$(prefix)) install_libs: install_pkgconfig $(Q)$(call do_install,$(LIBTRACECMD_SHARED),$(libdir_SQ)) $(Q)$(call print_install,$(LIBTRACECMD_SHARED_VERSION),$(DESTDIR)$(libdir_SQ)) $(Q)cp -fpR $(LIBTRACECMD_SHARED_VERSION) $(DESTDIR)$(libdir_SQ) $(Q)$(call print_install,$(LIBTRACECMD_SHARED_SO),$(DESTDIR)$(libdir_SQ)) $(Q)cp -fpR $(LIBTRACECMD_SHARED_SO) $(DESTDIR)$(libdir_SQ) $(Q)$(call do_install,$(src)/include/trace-cmd/trace-cmd.h,$(includedir_SQ)/trace-cmd,644) $(Q)$(call install_ld_config) dep_includes := $(wildcard $(DEPS)) ifneq ($(dep_includes),) include $(dep_includes) endif clean: $(RM) $(bdir)/*.a $(bdir)/*.so $(bdir)/*.so.* $(bdir)/*.o $(bdir)/.*.d .PHONY: clean PHONY += force force: trace-cmd-v2.9.6/lib/trace-cmd/include/000077500000000000000000000000001414302661500176075ustar00rootroot00000000000000trace-cmd-v2.9.6/lib/trace-cmd/include/private/000077500000000000000000000000001414302661500212615ustar00rootroot00000000000000trace-cmd-v2.9.6/lib/trace-cmd/include/private/trace-cmd-private.h000066400000000000000000000443201414302661500247440ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2008, 2009, 2010 Red Hat Inc, Steven Rostedt * */ #ifndef _TRACE_CMD_PRIVATE_H #define _TRACE_CMD_PRIVATE_H #include /* for iovec */ #include #include "event-parse.h" #include "trace-cmd/trace-cmd.h" #define TRACECMD_MAGIC { 23, 8, 68 } #define ARRAY_SIZE(_a) (sizeof(_a) / sizeof((_a)[0])) #define __weak __attribute__((weak)) #define __noreturn __attribute__((noreturn)) #define TRACECMD_ERR_MSK ((unsigned long)(-1) & ~((1UL << 14) - 1)) #define TRACECMD_ISERR(ptr) ((unsigned long)(ptr) > TRACECMD_ERR_MSK) #define TRACECMD_ERROR(ret) ((void *)((unsigned long)(ret) | TRACECMD_ERR_MSK)) #define TRACECMD_PTR2ERR(ptr) ((unisgned long)(ptr) & ~TRACECMD_ERR_MSK) void tracecmd_parse_cmdlines(struct tep_handle *pevent, char *file, int size); void tracecmd_parse_proc_kallsyms(struct tep_handle *pevent, char *file, unsigned int size); void tracecmd_parse_ftrace_printk(struct tep_handle *pevent, char *file, unsigned int size); struct tep_plugin_list *trace_load_plugins(struct tep_handle *tep, int flags); int *tracecmd_add_id(int *list, int id, int len); enum { RINGBUF_TYPE_PADDING = 29, RINGBUF_TYPE_TIME_EXTEND = 30, RINGBUF_TYPE_TIME_STAMP = 31, }; void tracecmd_record_ref(struct tep_record *record); void tracecmd_set_debug(bool set_debug); bool tracecmd_get_debug(void); bool tracecmd_is_version_supported(unsigned int version); struct tracecmd_output; struct tracecmd_recorder; struct hook_list; /* --- tracecmd plugins --- */ enum tracecmd_context { TRACECMD_INPUT, TRACECMD_OUTPUT, }; enum tracecmd_plugin_flag { TRACECMD_DISABLE_SYS_PLUGINS = 1, TRACECMD_DISABLE_PLUGINS = 1 << 1, }; struct trace_plugin_context; struct trace_plugin_context * tracecmd_plugin_context_create(enum tracecmd_context context, void *data); void tracecmd_plugin_set_flag(struct trace_plugin_context *context, enum tracecmd_plugin_flag flag); #define TRACECMD_PLUGIN_LOADER tracecmd_plugin_loader #define TRACECMD_PLUGIN_UNLOADER tracecmd_plugin_unloader #define TRACECMD_PLUGIN_ALIAS tracecmd_plugin_alias #define _MAKE_STR(x) #x #define MAKE_STR(x) _MAKE_STR(x) #define TRACECMD_PLUGIN_LOADER_NAME MAKE_STR(TRACECMD_PLUGIN_LOADER) #define TRACECMD_PLUGIN_UNLOADER_NAME MAKE_STR(TRACECMD_PLUGIN_UNLOADER) #define TRACECMD_PLUGIN_ALIAS_NAME MAKE_STR(TRACECMD_PLUGIN_ALIAS) typedef int (*tracecmd_plugin_load_func)(struct trace_plugin_context *trace); typedef int (*tracecmd_plugin_unload_func)(struct trace_plugin_context *trace); struct tracecmd_input * tracecmd_plugin_context_input(struct trace_plugin_context *trace_context); struct tracecmd_output * tracecmd_plugin_context_output(struct trace_plugin_context *trace_context); void tracecmd_set_quiet(struct tracecmd_output *handle, bool set_quiet); bool tracecmd_get_quiet(struct tracecmd_output *handle); static inline int tracecmd_host_bigendian(void) { unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 }; unsigned int *ptr; ptr = (unsigned int *)str; return *ptr == 0x01020304; } /* --- Opening and Reading the trace.dat file --- */ enum tracecmd_file_states { TRACECMD_FILE_INIT = 1, TRACECMD_FILE_HEADERS, TRACECMD_FILE_FTRACE_EVENTS, TRACECMD_FILE_ALL_EVENTS, TRACECMD_FILE_KALLSYMS, TRACECMD_FILE_PRINTK, TRACECMD_FILE_CMD_LINES, TRACECMD_FILE_CPU_COUNT, TRACECMD_FILE_OPTIONS, TRACECMD_FILE_CPU_LATENCY, TRACECMD_FILE_CPU_FLYRECORD, }; enum { TRACECMD_OPTION_DONE, TRACECMD_OPTION_DATE, TRACECMD_OPTION_CPUSTAT, TRACECMD_OPTION_BUFFER, TRACECMD_OPTION_TRACECLOCK, TRACECMD_OPTION_UNAME, TRACECMD_OPTION_HOOK, TRACECMD_OPTION_OFFSET, TRACECMD_OPTION_CPUCOUNT, TRACECMD_OPTION_VERSION, TRACECMD_OPTION_PROCMAPS, TRACECMD_OPTION_TRACEID, TRACECMD_OPTION_TIME_SHIFT, TRACECMD_OPTION_GUEST, }; enum { TRACECMD_FL_IGNORE_DATE = (1 << 0), TRACECMD_FL_BUFFER_INSTANCE = (1 << 1), TRACECMD_FL_IN_USECS = (1 << 2), }; struct tracecmd_ftrace { struct tracecmd_input *handle; struct tep_event *fgraph_ret_event; int fgraph_ret_id; int long_size; }; struct tracecmd_proc_addr_map { unsigned long long start; unsigned long long end; char *lib_name; }; typedef void (*tracecmd_show_data_func)(struct tracecmd_input *handle, struct tep_record *record); typedef void (*tracecmd_handle_init_func)(struct tracecmd_input *handle, struct hook_list *hook, int global); struct tracecmd_input *tracecmd_alloc(const char *file, int flags); struct tracecmd_input *tracecmd_alloc_fd(int fd, int flags); void tracecmd_ref(struct tracecmd_input *handle); int tracecmd_read_headers(struct tracecmd_input *handle, enum tracecmd_file_states state); int tracecmd_get_parsing_failures(struct tracecmd_input *handle); int tracecmd_long_size(struct tracecmd_input *handle); int tracecmd_page_size(struct tracecmd_input *handle); int tracecmd_cpus(struct tracecmd_input *handle); int tracecmd_copy_headers(struct tracecmd_input *handle, int fd, enum tracecmd_file_states start_state, enum tracecmd_file_states end_state); void tracecmd_set_flag(struct tracecmd_input *handle, int flag); void tracecmd_clear_flag(struct tracecmd_input *handle, int flag); unsigned long tracecmd_get_flags(struct tracecmd_input *handle); enum tracecmd_file_states tracecmd_get_file_state(struct tracecmd_input *handle); int tracecmd_enable_tsync(struct tracecmd_input *handle, bool enable); void tracecmd_parse_trace_clock(struct tracecmd_input *handle, char *file, int size); int tracecmd_make_pipe(struct tracecmd_input *handle, int cpu, int fd, int cpus); int tracecmd_is_buffer_instance(struct tracecmd_input *handle); void tracecmd_set_ts_offset(struct tracecmd_input *handle, long long offset); void tracecmd_set_ts2secs(struct tracecmd_input *handle, unsigned long long hz); void tracecmd_print_events(struct tracecmd_input *handle, const char *regex); struct hook_list *tracecmd_hooks(struct tracecmd_input *handle); void tracecmd_print_stats(struct tracecmd_input *handle); void tracecmd_print_uname(struct tracecmd_input *handle); void tracecmd_print_version(struct tracecmd_input *handle); struct tep_record * tracecmd_peek_data(struct tracecmd_input *handle, int cpu); static inline struct tep_record * tracecmd_peek_data_ref(struct tracecmd_input *handle, int cpu) { struct tep_record *rec = tracecmd_peek_data(handle, cpu); if (rec) rec->ref_count++; return rec; } struct tep_record * tracecmd_read_prev(struct tracecmd_input *handle, struct tep_record *record); struct tep_record * tracecmd_read_next_data(struct tracecmd_input *handle, int *rec_cpu); struct tep_record * tracecmd_peek_next_data(struct tracecmd_input *handle, int *rec_cpu); struct tep_record * tracecmd_translate_data(struct tracecmd_input *handle, void *ptr, int size); struct tep_record * tracecmd_read_cpu_last(struct tracecmd_input *handle, int cpu); int tracecmd_refresh_record(struct tracecmd_input *handle, struct tep_record *record); int tracecmd_set_cpu_to_timestamp(struct tracecmd_input *handle, int cpu, unsigned long long ts); void tracecmd_set_all_cpus_to_timestamp(struct tracecmd_input *handle, unsigned long long time); int tracecmd_set_cursor(struct tracecmd_input *handle, int cpu, unsigned long long offset); unsigned long long tracecmd_get_cursor(struct tracecmd_input *handle, int cpu); int tracecmd_ftrace_overrides(struct tracecmd_input *handle, struct tracecmd_ftrace *finfo); bool tracecmd_get_use_trace_clock(struct tracecmd_input *handle); tracecmd_show_data_func tracecmd_get_show_data_func(struct tracecmd_input *handle); void tracecmd_set_show_data_func(struct tracecmd_input *handle, tracecmd_show_data_func func); int tracecmd_record_at_buffer_start(struct tracecmd_input *handle, struct tep_record *record); unsigned long long tracecmd_page_ts(struct tracecmd_input *handle, struct tep_record *record); unsigned int tracecmd_record_ts_delta(struct tracecmd_input *handle, struct tep_record *record); struct tracecmd_proc_addr_map * tracecmd_search_task_map(struct tracecmd_input *handle, int pid, unsigned long long addr); #ifndef SWIG /* hack for function graph work around */ extern __thread struct tracecmd_input *tracecmd_curr_thread_handle; #endif /* --- Creating and Writing the trace.dat file --- */ struct tracecmd_event_list { struct tracecmd_event_list *next; const char *glob; }; struct tracecmd_option; struct tracecmd_msg_handle; struct tracecmd_output *tracecmd_create_file_latency(const char *output_file, int cpus); struct tracecmd_output *tracecmd_create_file(const char *output_file, int cpus, char * const *cpu_data_files); struct tracecmd_output * tracecmd_create_file_glob(const char *output_file, int cpus, char * const *cpu_data_files, struct tracecmd_event_list *event_globs); struct tracecmd_output * tracecmd_create_init_file_glob(const char *output_file, struct tracecmd_event_list *list); struct tracecmd_output *tracecmd_create_init_fd(int fd); struct tracecmd_output * tracecmd_create_init_fd_glob(int fd, struct tracecmd_event_list *list); struct tracecmd_output * tracecmd_create_init_fd_msg(struct tracecmd_msg_handle *msg_handle, struct tracecmd_event_list *list); struct tracecmd_output *tracecmd_create_init_file(const char *output_file); struct tracecmd_output *tracecmd_create_init_file_override(const char *output_file, const char *tracing_dir, const char *kallsyms); struct tracecmd_option *tracecmd_add_option(struct tracecmd_output *handle, unsigned short id, int size, const void *data); struct tracecmd_option * tracecmd_add_option_v(struct tracecmd_output *handle, unsigned short id, const struct iovec *vector, int count); struct tracecmd_option *tracecmd_add_buffer_option(struct tracecmd_output *handle, const char *name, int cpus); int tracecmd_write_cpus(struct tracecmd_output *handle, int cpus); int tracecmd_write_cmdlines(struct tracecmd_output *handle); int tracecmd_write_options(struct tracecmd_output *handle); int tracecmd_append_options(struct tracecmd_output *handle); int tracecmd_update_option(struct tracecmd_output *handle, struct tracecmd_option *option, int size, const void *data); void tracecmd_output_close(struct tracecmd_output *handle); void tracecmd_output_free(struct tracecmd_output *handle); struct tracecmd_output *tracecmd_copy(struct tracecmd_input *ihandle, const char *file); int tracecmd_write_cpu_data(struct tracecmd_output *handle, int cpus, char * const *cpu_data_files); int tracecmd_append_cpu_data(struct tracecmd_output *handle, int cpus, char * const *cpu_data_files); int tracecmd_append_buffer_cpu_data(struct tracecmd_output *handle, struct tracecmd_option *option, int cpus, char * const *cpu_data_files); struct tracecmd_output *tracecmd_get_output_handle_fd(int fd); /* --- Reading the Fly Recorder Trace --- */ enum { TRACECMD_RECORD_NOSPLICE = (1 << 0), /* Use read instead of splice */ TRACECMD_RECORD_SNAPSHOT = (1 << 1), /* Extract from snapshot */ TRACECMD_RECORD_BLOCK = (1 << 2), /* Block on splice write */ TRACECMD_RECORD_NOBRASS = (1 << 3), /* Splice directly without a brass pipe */ }; void tracecmd_free_recorder(struct tracecmd_recorder *recorder); struct tracecmd_recorder *tracecmd_create_recorder(const char *file, int cpu, unsigned flags); struct tracecmd_recorder *tracecmd_create_recorder_fd(int fd, int cpu, unsigned flags); struct tracecmd_recorder *tracecmd_create_recorder_virt(const char *file, int cpu, unsigned flags, int trace_fd); struct tracecmd_recorder *tracecmd_create_recorder_maxkb(const char *file, int cpu, unsigned flags, int maxkb); struct tracecmd_recorder *tracecmd_create_buffer_recorder_fd(int fd, int cpu, unsigned flags, const char *buffer); struct tracecmd_recorder *tracecmd_create_buffer_recorder(const char *file, int cpu, unsigned flags, const char *buffer); struct tracecmd_recorder *tracecmd_create_buffer_recorder_maxkb(const char *file, int cpu, unsigned flags, const char *buffer, int maxkb); int tracecmd_start_recording(struct tracecmd_recorder *recorder, unsigned long sleep); void tracecmd_stop_recording(struct tracecmd_recorder *recorder); long tracecmd_flush_recording(struct tracecmd_recorder *recorder); enum tracecmd_msg_flags { TRACECMD_MSG_FL_USE_TCP = 1 << 0, }; /* for both client and server */ struct tracecmd_msg_handle { int fd; short cpu_count; short version; /* Current protocol version */ unsigned long flags; bool done; }; struct tracecmd_tsync_protos { char **names; }; struct tracecmd_msg_handle * tracecmd_msg_handle_alloc(int fd, unsigned long flags); /* Closes the socket and frees the handle */ void tracecmd_msg_handle_close(struct tracecmd_msg_handle *msg_handle); /* for clients */ int tracecmd_msg_send_init_data(struct tracecmd_msg_handle *msg_handle, unsigned int **client_ports); int tracecmd_msg_data_send(struct tracecmd_msg_handle *msg_handle, const char *buf, int size); int tracecmd_msg_finish_sending_data(struct tracecmd_msg_handle *msg_handle); int tracecmd_msg_send_close_msg(struct tracecmd_msg_handle *msg_handle); int tracecmd_msg_send_close_resp_msg(struct tracecmd_msg_handle *msg_handle); int tracecmd_msg_wait_close(struct tracecmd_msg_handle *msg_handle); int tracecmd_msg_wait_close_resp(struct tracecmd_msg_handle *msg_handle); /* for server */ int tracecmd_msg_initial_setting(struct tracecmd_msg_handle *msg_handle); int tracecmd_msg_send_port_array(struct tracecmd_msg_handle *msg_handle, unsigned *ports); int tracecmd_msg_read_data(struct tracecmd_msg_handle *msg_handle, int ofd); int tracecmd_msg_collect_data(struct tracecmd_msg_handle *msg_handle, int ofd); bool tracecmd_msg_done(struct tracecmd_msg_handle *msg_handle); void tracecmd_msg_set_done(struct tracecmd_msg_handle *msg_handle); int tracecmd_msg_send_trace_req(struct tracecmd_msg_handle *msg_handle, int argc, char **argv, bool use_fifos, unsigned long long trace_id, struct tracecmd_tsync_protos *protos); int tracecmd_msg_recv_trace_req(struct tracecmd_msg_handle *msg_handle, int *argc, char ***argv, bool *use_fifos, unsigned long long *trace_id, struct tracecmd_tsync_protos **protos); int tracecmd_msg_send_trace_resp(struct tracecmd_msg_handle *msg_handle, int nr_cpus, int page_size, unsigned int *ports, bool use_fifos, unsigned long long trace_id, const char *tsync_proto, unsigned int tsync_port); int tracecmd_msg_recv_trace_resp(struct tracecmd_msg_handle *msg_handle, int *nr_cpus, int *page_size, unsigned int **ports, bool *use_fifos, unsigned long long *trace_id, char **tsync_proto, unsigned int *tsync_port); int tracecmd_msg_send_time_sync(struct tracecmd_msg_handle *msg_handle, char *sync_protocol, unsigned int sync_msg_id, unsigned int payload_size, char *payload); int tracecmd_msg_recv_time_sync(struct tracecmd_msg_handle *msg_handle, char *sync_protocol, unsigned int *sync_msg_id, unsigned int *payload_size, char **payload); enum tracecmd_clocks { TRACECMD_CLOCK_UNKNOWN = 0, TRACECMD_CLOCK_LOCAL = 1, TRACECMD_CLOCK_GLOBAL = 1 << 1, TRACECMD_CLOCK_COUNTER = 1 << 2, TRACECMD_CLOCK_UPTIME = 1 << 3, TRACECMD_CLOCK_PERF = 1 << 4, TRACECMD_CLOCK_MONO = 1 << 5, TRACECMD_CLOCK_MONO_RAW = 1 << 6, TRACECMD_CLOCK_BOOT = 1 << 7, TRACECMD_CLOCK_X86_TSC = 1 << 8 }; enum tracecmd_clocks tracecmd_clock_str2id(const char *clock); const char *tracecmd_clock_id2str(enum tracecmd_clocks clock); /* --- Timestamp synchronization --- */ struct tracecmd_time_sync; #define TRACECMD_TSYNC_PNAME_LENGTH 16 #define TRACECMD_TSYNC_PROTO_NONE "none" enum{ TRACECMD_TIME_SYNC_CMD_PROBE = 1, TRACECMD_TIME_SYNC_CMD_STOP = 2, }; enum tracecmd_time_sync_role { TRACECMD_TIME_SYNC_ROLE_HOST = (1 << 0), TRACECMD_TIME_SYNC_ROLE_GUEST = (1 << 1), }; /* Timestamp synchronization flags */ #define TRACECMD_TSYNC_FLAG_INTERPOLATE 0x1 void tracecmd_tsync_init(void); int tracecmd_tsync_proto_getall(struct tracecmd_tsync_protos **protos, const char *clock, int role); bool tsync_proto_is_supported(const char *proto_name); struct tracecmd_time_sync * tracecmd_tsync_with_host(const struct tracecmd_tsync_protos *tsync_protos, const char *clock); int tracecmd_tsync_with_host_stop(struct tracecmd_time_sync *tsync); struct tracecmd_time_sync * tracecmd_tsync_with_guest(unsigned long long trace_id, int loop_interval, unsigned int cid, unsigned int port, int guest_pid, int guest_cpus, const char *proto_name, const char *clock); int tracecmd_tsync_with_guest_stop(struct tracecmd_time_sync *tsync); int tracecmd_tsync_get_offsets(struct tracecmd_time_sync *tsync, int *count, long long **ts, long long **offsets, long long **scalings); int tracecmd_tsync_get_session_params(struct tracecmd_time_sync *tsync, char **selected_proto, unsigned int *tsync_port); void tracecmd_tsync_free(struct tracecmd_time_sync *tsync); int tracecmd_write_guest_time_shift(struct tracecmd_output *handle, struct tracecmd_time_sync *tsync); /* --- Plugin handling --- */ extern struct tep_plugin_option trace_ftrace_options[]; char **trace_util_find_plugin_files(const char *suffix); void trace_util_free_plugin_files(char **files); /* Used for trace-cmd list */ void tracecmd_ftrace_load_options(void); /* event hooks */ struct hook_list { struct hook_list *next; struct buffer_instance *instance; const char *hook; char *str; char *start_system; char *start_event; char *start_match; char *end_system; char *end_event; char *end_match; char *pid; int migrate; int global; int stack; }; struct hook_list *tracecmd_create_event_hook(const char *arg); void tracecmd_free_hooks(struct hook_list *hooks); void tracecmd_plog(const char *fmt, ...); void tracecmd_plog_error(const char *fmt, ...); int tracecmd_set_logfile(char *logfile); /* --- System --- */ unsigned long long tracecmd_generate_traceid(void); int tracecmd_count_cpus(void); /* --- Hack! --- */ int tracecmd_blk_hack(struct tracecmd_input *handle); /* --- Stack tracer functions --- */ int tracecmd_stack_tracer_status(int *status); /* --- Debugging --- */ struct kbuffer *tracecmd_record_kbuf(struct tracecmd_input *handle, struct tep_record *record); void *tracecmd_record_page(struct tracecmd_input *handle, struct tep_record *record); void *tracecmd_record_offset(struct tracecmd_input *handle, struct tep_record *record); #endif /* _TRACE_CMD_PRIVATE_H */ trace-cmd-v2.9.6/lib/trace-cmd/include/private/trace-filter-hash.h000066400000000000000000000040341414302661500247350ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt * Copyright (C) 2018 VMware Inc, Steven Rostedt * */ #ifndef _TRACE_FILTER_HASH_H #define _TRACE_FILTER_HASH_H #include struct tracecmd_filter_id_item { struct tracecmd_filter_id_item *next; int id; }; struct tracecmd_filter_id { struct tracecmd_filter_id_item **hash; int count; }; /** * tracecmd_quick_hash - A quick (non secured) hash alogirthm * @val: The value to perform the hash on * @bits: The size in bits you need to return * * This is a quick hashing function adapted from Donald E. Knuth's 32 * bit multiplicative hash. See The Art of Computer Programming (TAOCP). * Multiplication by the Prime number, closest to the golden ratio of * 2^32. * * @bits is used to max the result for use cases that require * a power of 2 return value that is less than 32 bits. Any value * of @bits greater than 31 (or zero), will simply return the full hash on @val. */ static inline uint32_t tracecmd_quick_hash(uint32_t val, unsigned int bits) { val *= UINT32_C(2654435761); if (!bits || bits > 31) return val; return val & ((1 << bits) - 1); } struct tracecmd_filter_id_item * tracecmd_filter_id_find(struct tracecmd_filter_id *hash, int id); void tracecmd_filter_id_add(struct tracecmd_filter_id *hash, int id); void tracecmd_filter_id_remove(struct tracecmd_filter_id *hash, int id); void tracecmd_filter_id_clear(struct tracecmd_filter_id *hash); struct tracecmd_filter_id *tracecmd_filter_id_hash_alloc(void); void tracecmd_filter_id_hash_free(struct tracecmd_filter_id *hash); struct tracecmd_filter_id * tracecmd_filter_id_hash_copy(struct tracecmd_filter_id *hash); int *tracecmd_filter_ids(struct tracecmd_filter_id *hash); int tracecmd_filter_id_compare(struct tracecmd_filter_id *hash1, struct tracecmd_filter_id *hash2); static inline int tracecmd_filter_task_count(struct tracecmd_filter_id *hash) { return hash->count; } #endif /* _TRACE_FILTER_HASH_H */ trace-cmd-v2.9.6/lib/trace-cmd/include/private/trace-hash.h000066400000000000000000000027711414302661500234600ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (C) 2014 Red Hat Inc, Steven Rostedt * */ #ifndef _TRACE_HASH_H #define _TRACE_HASH_H struct trace_hash_item { struct trace_hash_item *next; struct trace_hash_item *prev; unsigned long long key; }; struct trace_hash { struct trace_hash_item **buckets; int nr_buckets; int power; }; int trace_hash_init(struct trace_hash *hash, int buckets); void trace_hash_free(struct trace_hash *hash); int trace_hash_add(struct trace_hash *hash, struct trace_hash_item *item); int trace_hash_empty(struct trace_hash *hash); static inline void trace_hash_del(struct trace_hash_item *item) { struct trace_hash_item *prev = item->prev; prev->next = item->next; if (item->next) item->next->prev = prev; } #define trace_hash_for_each_bucket(bucket, hash) \ for (bucket = (hash)->buckets; \ (bucket) < (hash)->buckets + (hash)->nr_buckets; (bucket)++) #define trace_hash_for_each_item(item, bucket) \ for ((item = *(bucket)); item; item = (item)->next) #define trace_hash_for_each_item_safe(item, n, bucket) \ for ((item = *(bucket)), n = item ? item->next : NULL; item; \ item = n, n = item ? (item)->next : NULL) #define trace_hash_while_item(item, bucket) \ while ((item = *(bucket))) typedef int (*trace_hash_func)(struct trace_hash_item *item, void *data); struct trace_hash_item * trace_hash_find(struct trace_hash *hash, unsigned long long key, trace_hash_func match, void *data); #endif /* _TRACE_HASH_H */ trace-cmd-v2.9.6/lib/trace-cmd/include/private/trace-msg.h000066400000000000000000000004531414302661500233160ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ #ifndef _TRACE_MSG_H_ #define _TRACE_MSG_H_ #include #define UDP_MAX_PACKET (65536 - 20) #define V3_MAGIC "766679\0" #define V3_CPU "-1V3" #define V1_PROTOCOL 1 #define V3_PROTOCOL 3 extern unsigned int page_size; #endif /* _TRACE_MSG_H_ */ trace-cmd-v2.9.6/lib/trace-cmd/include/trace-cmd-local.h000066400000000000000000000012711414302661500227100ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2010 Red Hat Inc, Steven Rostedt * */ #ifndef _TRACE_CMD_LOCAL_H #define _TRACE_CMD_LOCAL_H #include #include "trace-cmd-private.h" /* Can be overridden */ void warning(const char *fmt, ...); #define __packed __attribute__((packed)) /* trace.dat file format version */ #define FILE_VERSION 6 #define _STR(x) #x #define STR(x) _STR(x) #define FILE_VERSION_STRING STR(FILE_VERSION) #ifndef htonll # if __BYTE_ORDER == __LITTLE_ENDIAN #define htonll(x) __bswap_64(x) #define ntohll(x) __bswap_64(x) #else #define htonll(x) (x) #define ntohll(x) (x) #endif #endif #endif /* _TRACE_CMD_LOCAL_H */ trace-cmd-v2.9.6/lib/trace-cmd/include/trace-hash-local.h000066400000000000000000000017371414302661500230770ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (C) 2009, Steven Rostedt * */ #ifndef _TRACE_HASH_LOCAL_H #define _TRACE_HASH_LOCAL_H static inline unsigned int trace_hash(unsigned int val) { unsigned int hash, tmp; hash = 12546869; /* random prime */ /* * The following hash is based off of Paul Hsieh's super fast hash: * http://www.azillionmonkeys.com/qed/hash.html * Note, he released this code unde the GPL 2.0 license, which * is the same as the license for the programs that use it here. */ hash += (val & 0xffff); tmp = (val >> 16) ^ hash; hash = (hash << 16) ^ tmp; hash += hash >> 11; hash ^= hash << 3; hash += hash >> 5; hash ^= hash << 4; hash += hash >> 17; hash ^= hash << 25; hash += hash >> 6; return hash; } static inline unsigned int trace_hash_str(char *str) { int val = 0; int i; for (i = 0; str[i]; i++) val += ((int)str[i]) << (i & 0xf); return trace_hash(val); } #endif /* _TRACE_HASH_LOCAL_H */ trace-cmd-v2.9.6/lib/trace-cmd/include/trace-tsync-local.h000066400000000000000000000034371414302661500233130ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2019, VMware, Tzvetomir Stoyanov * */ #ifndef _TRACE_TSYNC_LOCAL_H #define _TRACE_TSYNC_LOCAL_H #include struct tracecmd_time_sync { pthread_t thread; bool thread_running; unsigned long long trace_id; char *proto_name; int loop_interval; pthread_mutex_t lock; pthread_cond_t cond; pthread_barrier_t first_sync; char *clock_str; struct tracecmd_msg_handle *msg_handle; void *context; int guest_pid; int vcpu_count; }; struct clock_sync_context { void *proto_data; /* time sync protocol specific data */ bool is_server; /* server side time sync role */ bool is_guest; /* guest or host time sync role */ struct tracefs_instance *instance; /* ftrace buffer, used for time sync events */ /* Arrays with calculated time offsets at given time */ int sync_size; /* Allocated size of sync_ts, * sync_offsets and sync_scalings */ int sync_count; /* Number of elements in sync_ts, * sync_offsets and sync_scalings */ long long *sync_ts; long long *sync_offsets; long long *sync_scalings; /* Identifiers of local and remote time sync peers: cid and port */ unsigned int local_cid; unsigned int local_port; unsigned int remote_cid; unsigned int remote_port; }; int tracecmd_tsync_proto_register(const char *proto_name, int accuracy, int roles, int supported_clocks, unsigned int flags, int (*init)(struct tracecmd_time_sync *), int (*free)(struct tracecmd_time_sync *), int (*calc)(struct tracecmd_time_sync *, long long *, long long *, long long *)); int tracecmd_tsync_proto_unregister(char *proto_name); int ptp_clock_sync_register(void); #endif /* _TRACE_TSYNC_LOCAL_H */ trace-cmd-v2.9.6/lib/trace-cmd/include/trace-write-local.h000066400000000000000000000013361414302661500233010ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2010 Red Hat Inc, Steven Rostedt * */ #ifndef _TRACE_WRITE_LOCAL_H #define _TRACE_WRITE_LOCAL_H /* Local for trace-input.c, trace-output.c and trace-msg.c */ static inline ssize_t __do_write(int fd, const void *data, size_t size) { ssize_t tot = 0; ssize_t w; do { w = write(fd, data + tot, size - tot); tot += w; if (!w) break; if (w < 0) return w; } while (tot != size); return tot; } static inline ssize_t __do_write_check(int fd, const void *data, size_t size) { ssize_t ret; ret = __do_write(fd, data, size); if (ret < 0) return ret; if (ret != size) return -1; return 0; } #endif /* _TRACE_WRITE_LOCAL_H */ trace-cmd-v2.9.6/lib/trace-cmd/plugins/000077500000000000000000000000001414302661500176455ustar00rootroot00000000000000trace-cmd-v2.9.6/lib/trace-cmd/plugins/Makefile000066400000000000000000000025131414302661500213060ustar00rootroot00000000000000include $(src)/scripts/utils.mk bdir:=$(obj)/lib/trace-cmd/plugins PLUGIN_OBJS = PLUGIN_OBJS := $(PLUGIN_OBJS:%.o=$(bdir)/%.o) PLUGIN_BUILD := $(PLUGIN_OBJS:$(bdir)/%.o=$(bdir)/%.so) PLUGINS := $(PLUGIN_BUILD) DEPS := $(PLUGIN_OBJS:$(bdir)/%.o=$(bdir)/.%.d) all: $(PLUGINS) $(bdir): @mkdir -p $(bdir) $(PLUGIN_OBJS): | $(bdir) $(DEPS): | $(bdir) $(PLUGIN_OBJS): $(bdir)/%.o : %.c $(Q)$(do_compile_plugin_obj) $(PLUGIN_BUILD): $(bdir)/%.so: $(bdir)/%.o $(Q)$(do_plugin_build) $(DEPS): $(bdir)/.%.d: %.c $(Q)$(CC) -M -MT $(bdir)/$*.o $(CPPFLAGS) $(CFLAGS) $< > $@ $(PLUGIN_OBJS): $(bdir)/%.o : $(bdir)/.%.d PLUGINS_INSTALL = $(subst .so,.install,$(PLUGINS)) $(PLUGINS_INSTALL): $(bdir)/%.install : $(bdir)/%.so force $(Q)$(call do_install_data,$<,$(plugin_tracecmd_dir_SQ)) install_plugins: $(PLUGINS_INSTALL) # The following targets are necessary to trigger a rebuild when # $(PLUGIN_DIR_TRACECMD) change. Without them, a full clean build would # necessary in order to get the binaries updated. $(bdir)/tracecmd_plugin_dir: $(bdir) force $(Q)$(N)$(call update_dir, 'PLUGIN_DIR_TRACECMD=$(PLUGIN_DIR_TRACECMD)') dep_includes := $(wildcard $(DEPS)) ifneq ($(dep_includes),) include $(dep_includes) endif clean: $(RM) -f $(bdir)/*.a $(bdir)/*.so $(bdir)/*.o $(bdir)/.*.d\ $(bdir)/tracecmd_plugin_dir force: .PHONY: clean force trace-cmd-v2.9.6/lib/trace-cmd/test.c000066400000000000000000000001411414302661500173030ustar00rootroot00000000000000#include int main() { tracecmd_open_head("trace.dat", 0); return 0; } trace-cmd-v2.9.6/lib/trace-cmd/trace-blk-hack.c000066400000000000000000000077571414302661500211200ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2009 Red Hat Inc, Steven Rostedt * */ #include #include "trace-cmd.h" #include "trace-local.h" static const char blk_event_start[] = "name: blktrace\n" "ID: %d\n" "format:\n" "\tfield:unsigned short common_type;\toffset:0;\tsize:2;\n" "\tfield:unsigned char common_flags;\toffset:2;\tsize:1;\n" "\tfield:unsigned char common_preempt_count;\toffset:3;\tsize:1;\n" "\tfield:int common_pid;\toffset:4;\tsize:4;\n"; static const char blk_body[] = "\n" "\tfield:u64 sector;\toffset:16;\tsize:8;\n" "\tfield:int bytes;\toffset:24;\tsize:4;\n" "\tfield:int action;\toffset:28;\tsize:4;\n" "\tfield:int pid;\toffset:32;\tsize:4;\n" "\tfield:int device;\toffset:36;\tsize:4;\n" "\tfield:int cpu;\toffset:40;\tsize:4;\n" "\tfield:short error;\toffset:44;\tsize:2;\n" "\tfield:short pdu_len;\toffset:46;\tsize:2;\n" "\tfield:void data;\toffset:48;\tsize:0;\n" "\n" "print fmt: \"%%d\", REC->pid\n"; int tracecmd_blk_hack(struct tracecmd_input *handle) { struct tep_handle *pevent; struct tep_event *event; struct tep_format_field *field; char buf[4096]; /* way more than enough! */ int id; int l; int r; pevent = tracecmd_get_tep(handle); /* * Unfortunately, the TRACE_BLK has changed a bit. * We need to test if various events exist to try * to guess what event id TRACE_BLK would be. */ /* It was originally behind the "power" event */ event = tep_find_event_by_name(pevent, "ftrace", "power"); if (event) { id = event->id + 1; goto found; } /* * But the power tracer is now in perf. * Then it was after kmem_free */ event = tep_find_event_by_name(pevent, "ftrace", "kmem_free"); if (event) { id = event->id + 1; goto found; } /* * But that then went away. * Currently it should be behind the user stack. */ event = tep_find_event_by_name(pevent, "ftrace", "user_stack"); if (event) { id = event->id + 1; goto found; } /* Give up :( */ return -1; found: /* * Blk events are not exported in the events directory. * This is a hack to attempt to create a block event * that we can read. * * We'll make a format file to look like this: * * name: blktrace * ID: 13 * format: * field:unsigned short common_type; offset:0; size:2; * field:unsigned char common_flags; offset:2; size:1; * field:unsigned char common_preempt_count; offset:3; size:1; * field:int common_pid; offset:4; size:4; * field:int common_lock_depth; offset:8; size:4; * * field:u64 sector; offset:16; size:8; * field:int bytes; offset:32; size:4; * field:int action; offset:36; size:4; * field:int pid; offset:40; size:4; * field:int device; offset:44; size:4; * field:int cpu; offset:48; size:4; * field:short error; offset:52; size:2; * field:short pdu_len; offset:54; size:2; * field:void data; offset:60; size:0; * * print fmt: "%d", REC->pid * * Note: the struct blk_io_trace is used directly and * just the first parts of the struct are not used in order * to not write over the ftrace data. */ /* Make sure the common fields exist */ field = tep_find_common_field(event, "common_type"); if (!field || field->offset != 0 || field->size != 2) goto fail; field = tep_find_common_field(event, "common_flags"); if (!field || field->offset != 2 || field->size != 1) goto fail; field = tep_find_common_field(event, "common_preempt_count"); if (!field || field->offset != 3 || field->size != 1) goto fail; field = tep_find_common_field(event, "common_pid"); if (!field || field->offset != 4 || field->size != 4) goto fail; r = sprintf(buf, blk_event_start, id); l = r; /* lock depth is optional */ field = tep_find_common_field(event, "common_lock_depth"); if (field) { if (field->offset != 8 || field->size != 4) return -1; r = sprintf(buf+l, "\tfield:int common_lock_depth;\toffset:8;\tsize:4;\n"); l += r; } r = sprintf(buf+l, blk_body); /* Parse this event */ l += r; tep_parse_event(pevent, buf, l, "ftrace"); return 0; fail: return -1; } trace-cmd-v2.9.6/lib/trace-cmd/trace-filter-hash.c000066400000000000000000000076551414302661500216470ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2009, Steven Rostedt * Copyright (C) 2018 VMware Inc, Steven Rostedt * */ #include #include #include #include #include #include "trace-filter-hash.h" #define FILTER_HASH_BITS 8 #define FILTER_HASH_SIZE (1 << FILTER_HASH_BITS) struct tracecmd_filter_id_item * tracecmd_filter_id_find(struct tracecmd_filter_id *hash, int id) { int key = tracecmd_quick_hash(id, FILTER_HASH_BITS); struct tracecmd_filter_id_item *item = hash->hash[key]; while (item) { if (item->id == id) break; item = item->next; } return item; } void tracecmd_filter_id_add(struct tracecmd_filter_id *hash, int id) { int key = tracecmd_quick_hash(id, FILTER_HASH_BITS); struct tracecmd_filter_id_item *item; item = calloc(1, sizeof(*item)); assert(item); item->id = id; item->next = hash->hash[key]; hash->hash[key] = item; hash->count++; } void tracecmd_filter_id_remove(struct tracecmd_filter_id *hash, int id) { int key = tracecmd_quick_hash(id, FILTER_HASH_BITS); struct tracecmd_filter_id_item **next = &hash->hash[key]; struct tracecmd_filter_id_item *item; while (*next) { if ((*next)->id == id) break; next = &(*next)->next; } if (!*next) return; assert(hash->count); hash->count--; item = *next; *next = item->next; free(item); } void tracecmd_filter_id_clear(struct tracecmd_filter_id *hash) { struct tracecmd_filter_id_item *item, *next; int i; for (i = 0; i < FILTER_HASH_SIZE; i++) { next = hash->hash[i]; if (!next) continue; hash->hash[i] = NULL; while (next) { item = next; next = item->next; free(item); } } hash->count = 0; } struct tracecmd_filter_id *tracecmd_filter_id_hash_alloc(void) { struct tracecmd_filter_id *hash; hash = calloc(1, sizeof(*hash)); assert(hash); hash->hash = calloc(FILTER_HASH_SIZE, sizeof(*hash->hash)); hash->count = 0; return hash; } void tracecmd_filter_id_hash_free(struct tracecmd_filter_id *hash) { if (!hash) return; tracecmd_filter_id_clear(hash); free(hash->hash); free(hash); } struct tracecmd_filter_id * tracecmd_filter_id_hash_copy(struct tracecmd_filter_id *hash) { struct tracecmd_filter_id *new_hash; struct tracecmd_filter_id_item *item, **pitem; int i; if (!hash) return NULL; new_hash = tracecmd_filter_id_hash_alloc(); assert(new_hash); for (i = 0; i < FILTER_HASH_SIZE; i++) { item = hash->hash[i]; if (!item) continue; pitem = &new_hash->hash[i]; while (item) { *pitem = calloc(1, sizeof(*item)); assert(*pitem); **pitem = *item; pitem = &(*pitem)->next; item = item->next; } } new_hash->count = hash->count; return new_hash; } int *tracecmd_filter_ids(struct tracecmd_filter_id *hash) { struct tracecmd_filter_id_item *item; int *ids; int count = 0; int i; if (!hash->count) return NULL; ids = malloc(sizeof(*ids) * (hash->count + 1)); if (!ids) return NULL; for (i = 0; i < FILTER_HASH_SIZE; i++) { item = hash->hash[i]; while (item) { ids[count++] = item->id; item = item->next; } } ids[count] = -1; return ids; } /** * filter_id_compare - compare two id hashes to see if they are equal * @hash1: one hash to compare * @hash2: another hash to compare to @hash1 * * Returns 1 if the two hashes are the same, 0 otherwise. */ int tracecmd_filter_id_compare(struct tracecmd_filter_id *hash1, struct tracecmd_filter_id *hash2) { int *ids; int ret = 0; int i; /* If counts don't match, then they obviously are not the same */ if (hash1->count != hash2->count) return 0; /* If both hashes are empty, they are the same */ if (!hash1->count && !hash2->count) return 1; /* Now compare the pids of one hash with the other */ ids = tracecmd_filter_ids(hash1); for (i = 0; ids[i] >= 0; i++) { if (!tracecmd_filter_id_find(hash2, ids[i])) break; } if (ids[i] == -1) ret = 1; free(ids); return ret; } trace-cmd-v2.9.6/lib/trace-cmd/trace-ftrace.c000066400000000000000000000231251414302661500206730ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt * */ #include #include #include #include #include "trace-cmd-private.h" struct tep_plugin_option trace_ftrace_options[] = { { .name = "tailprint", .plugin_alias = "fgraph", .description = "Print function name at function exit in function graph", }, { .name = "depth", .plugin_alias = "fgraph", .description = "Show the depth of each entry", }, { .name = NULL, } }; static struct tep_plugin_option *fgraph_tail = &trace_ftrace_options[0]; static struct tep_plugin_option *fgraph_depth = &trace_ftrace_options[1]; static int find_ret_event(struct tracecmd_ftrace *finfo, struct tep_handle *pevent) { struct tep_event *event; /* Store the func ret id and event for later use */ event = tep_find_event_by_name(pevent, "ftrace", "funcgraph_exit"); if (!event) return -1; finfo->fgraph_ret_id = event->id; finfo->fgraph_ret_event = event; return 0; } #define ret_event_check(finfo, pevent) \ do { \ if (!finfo->fgraph_ret_event && find_ret_event(finfo, pevent) < 0) \ return -1; \ } while (0) static int function_handler(struct trace_seq *s, struct tep_record *record, struct tep_event *event, void *context) { struct tep_handle *pevent = event->tep; unsigned long long function; const char *func; if (tep_get_field_val(s, event, "ip", record, &function, 1)) return trace_seq_putc(s, '!'); func = tep_find_function(pevent, function); if (func) trace_seq_printf(s, "%s <-- ", func); else trace_seq_printf(s, "0x%llx", function); if (tep_get_field_val(s, event, "parent_ip", record, &function, 1)) return trace_seq_putc(s, '!'); func = tep_find_function(pevent, function); if (func) trace_seq_printf(s, "%s", func); else trace_seq_printf(s, "0x%llx", function); return 0; } #define TRACE_GRAPH_INDENT 2 static struct tep_record * get_return_for_leaf(struct trace_seq *s, int cpu, int cur_pid, unsigned long long cur_func, struct tep_record *next, struct tracecmd_ftrace *finfo) { unsigned long long val; unsigned long long type; unsigned long long pid; /* Searching a common field, can use any event */ if (tep_get_common_field_val(s, finfo->fgraph_ret_event, "common_type", next, &type, 1)) return NULL; if (type != finfo->fgraph_ret_id) return NULL; if (tep_get_common_field_val(s, finfo->fgraph_ret_event, "common_pid", next, &pid, 1)) return NULL; if (cur_pid != pid) return NULL; /* We aleady know this is a funcgraph_ret_event */ if (tep_get_field_val(s, finfo->fgraph_ret_event, "func", next, &val, 1)) return NULL; if (cur_func != val) return NULL; /* this is a leaf, now advance the iterator */ return tracecmd_read_data(tracecmd_curr_thread_handle, cpu); } /* Signal a overhead of time execution to the output */ static void print_graph_overhead(struct trace_seq *s, unsigned long long duration) { /* Non nested entry or return */ if (duration == ~0ULL) return (void)trace_seq_printf(s, " "); /* Duration exceeded 1 sec */ if (duration > 1000000000ULL) return (void)trace_seq_printf(s, "$ "); /* Duration exceeded 1000 usecs */ if (duration > 1000000ULL) return (void)trace_seq_printf(s, "# "); /* Duration exceeded 100 usecs */ if (duration > 100000ULL) return (void)trace_seq_printf(s, "! "); /* Duration exceeded 10 usecs */ if (duration > 10000ULL) return (void)trace_seq_printf(s, "+ "); trace_seq_printf(s, " "); } static void print_graph_duration(struct trace_seq *s, unsigned long long duration) { unsigned long usecs = duration / 1000; unsigned long nsecs_rem = duration % 1000; /* log10(ULONG_MAX) + '\0' */ char msecs_str[21]; char nsecs_str[5]; int len; int i; sprintf(msecs_str, "%lu", usecs); /* Print msecs */ len = s->len; trace_seq_printf(s, "%lu", usecs); /* Print nsecs (we don't want to exceed 7 numbers) */ if ((s->len - len) < 7) { snprintf(nsecs_str, MIN(sizeof(nsecs_str), 8 - len), "%03lu", nsecs_rem); trace_seq_printf(s, ".%s", nsecs_str); } len = s->len - len; trace_seq_puts(s, " us "); /* Print remaining spaces to fit the row's width */ for (i = len; i < 7; i++) trace_seq_putc(s, ' '); trace_seq_puts(s, "| "); } static int print_graph_entry_leaf(struct trace_seq *s, struct tep_event *event, struct tep_record *record, struct tep_record *ret_rec, struct tracecmd_ftrace *finfo) { struct tep_handle *pevent = event->tep; unsigned long long rettime, calltime; unsigned long long duration, depth; unsigned long long val; const char *func; int ret; int i; if (tep_get_field_val(s, finfo->fgraph_ret_event, "rettime", ret_rec, &rettime, 1)) return trace_seq_putc(s, '!'); if (tep_get_field_val(s, finfo->fgraph_ret_event, "calltime", ret_rec, &calltime, 1)) return trace_seq_putc(s, '!'); duration = rettime - calltime; /* Overhead */ print_graph_overhead(s, duration); /* Duration */ print_graph_duration(s, duration); if (tep_get_field_val(s, event, "depth", record, &depth, 1)) return trace_seq_putc(s, '!'); /* Function */ for (i = 0; i < (int)(depth * TRACE_GRAPH_INDENT); i++) trace_seq_putc(s, ' '); if (tep_get_field_val(s, event, "func", record, &val, 1)) return trace_seq_putc(s, '!'); func = tep_find_function(pevent, val); if (func) ret = trace_seq_printf(s, "%s();", func); else ret = trace_seq_printf(s, "%llx();", val); if (ret && fgraph_depth->set) ret = trace_seq_printf(s, " (%lld)", depth); return ret; } static int print_graph_nested(struct trace_seq *s, struct tep_event *event, struct tep_record *record) { struct tep_handle *pevent = event->tep; unsigned long long depth; unsigned long long val; const char *func; int ret; int i; /* No overhead */ print_graph_overhead(s, -1); /* No time */ trace_seq_puts(s, " | "); if (tep_get_field_val(s, event, "depth", record, &depth, 1)) return trace_seq_putc(s, '!'); /* Function */ for (i = 0; i < (int)(depth * TRACE_GRAPH_INDENT); i++) trace_seq_putc(s, ' '); if (tep_get_field_val(s, event, "func", record, &val, 1)) return trace_seq_putc(s, '!'); func = tep_find_function(pevent, val); if (func) ret = trace_seq_printf(s, "%s() {", func); else ret = trace_seq_printf(s, "%llx() {", val); if (ret && fgraph_depth->set) ret = trace_seq_printf(s, " (%lld)", depth); return ret; } static int fgraph_ent_handler(struct trace_seq *s, struct tep_record *record, struct tep_event *event, void *context) { struct tracecmd_ftrace *finfo = context; struct tep_record *rec; unsigned long long val, pid; int cpu; ret_event_check(finfo, event->tep); if (tep_get_common_field_val(s, event, "common_pid", record, &pid, 1)) return trace_seq_putc(s, '!'); if (tep_get_field_val(s, event, "func", record, &val, 1)) return trace_seq_putc(s, '!'); rec = tracecmd_peek_next_data(tracecmd_curr_thread_handle, &cpu); if (rec) rec = get_return_for_leaf(s, cpu, pid, val, rec, finfo); if (rec) { /* * If this is a leaf function, then get_return_for_leaf * returns the return of the function */ print_graph_entry_leaf(s, event, record, rec, finfo); tracecmd_free_record(rec); } else print_graph_nested(s, event, record); return 0; } static int fgraph_ret_handler(struct trace_seq *s, struct tep_record *record, struct tep_event *event, void *context) { struct tracecmd_ftrace *finfo = context; unsigned long long rettime, calltime; unsigned long long duration, depth; unsigned long long val; const char *func; int i; ret_event_check(finfo, event->tep); if (tep_get_field_val(s, event, "rettime", record, &rettime, 1)) return trace_seq_putc(s, '!'); if (tep_get_field_val(s, event, "calltime", record, &calltime, 1)) return trace_seq_putc(s, '!'); duration = rettime - calltime; /* Overhead */ print_graph_overhead(s, duration); /* Duration */ print_graph_duration(s, duration); if (tep_get_field_val(s, event, "depth", record, &depth, 1)) return trace_seq_putc(s, '!'); /* Function */ for (i = 0; i < (int)(depth * TRACE_GRAPH_INDENT); i++) trace_seq_putc(s, ' '); trace_seq_putc(s, '}'); if (fgraph_tail->set) { if (tep_get_field_val(s, event, "func", record, &val, 0)) return 0; func = tep_find_function(event->tep, val); if (!func) return 0; trace_seq_printf(s, " /* %s */", func); } if (fgraph_depth->set) trace_seq_printf(s, " (%lld)", depth); return 0; } /** * tracecmd_ftrace_load_options - load the ftrace options * * This routine is used for trace-cmd list, to load the builtin * ftrace options in order to list them. As the list command does * not load a trace.dat file where this would normally be loaded. */ void tracecmd_ftrace_load_options(void) { tep_plugin_add_options("ftrace", trace_ftrace_options); } int tracecmd_ftrace_overrides(struct tracecmd_input *handle, struct tracecmd_ftrace *finfo) { struct tep_handle *pevent; struct tep_event *event; finfo->handle = handle; pevent = tracecmd_get_tep(handle); tep_register_event_handler(pevent, -1, "ftrace", "function", function_handler, NULL); tep_register_event_handler(pevent, -1, "ftrace", "funcgraph_entry", fgraph_ent_handler, finfo); tep_register_event_handler(pevent, -1, "ftrace", "funcgraph_exit", fgraph_ret_handler, finfo); tep_plugin_add_options("ftrace", trace_ftrace_options); /* Store the func ret id and event for later use */ event = tep_find_event_by_name(pevent, "ftrace", "funcgraph_exit"); if (!event) return 0; finfo->long_size = tracecmd_long_size(handle); finfo->fgraph_ret_id = event->id; finfo->fgraph_ret_event = event; return 0; } trace-cmd-v2.9.6/lib/trace-cmd/trace-hash.c000066400000000000000000000032051414302661500203470ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2014, Steven Rostedt * */ #include #include #include #include #include #include "trace-hash.h" int trace_hash_init(struct trace_hash *hash, int buckets) { memset(hash, 0, sizeof(*hash)); hash->buckets = calloc(sizeof(*hash->buckets), buckets); if (!hash->buckets) return -ENOMEM; hash->nr_buckets = buckets; /* If a power of two then we can shortcut */ if (!(buckets & (buckets - 1))) hash->power = buckets - 1; return 0; } void trace_hash_free(struct trace_hash *hash) { free(hash->buckets); } int trace_hash_empty(struct trace_hash *hash) { struct trace_hash_item **bucket; trace_hash_for_each_bucket(bucket, hash) if (*bucket) return 0; return 1; } int trace_hash_add(struct trace_hash *hash, struct trace_hash_item *item) { struct trace_hash_item *next; int bucket = hash->power ? item->key & hash->power : item->key % hash->nr_buckets; if (hash->buckets[bucket]) { next = hash->buckets[bucket]; next->prev = item; } else next = NULL; item->next = next; item->prev = (struct trace_hash_item *)&hash->buckets[bucket]; hash->buckets[bucket] = item; return 1; } struct trace_hash_item * trace_hash_find(struct trace_hash *hash, unsigned long long key, trace_hash_func match, void *data) { struct trace_hash_item *item; int bucket = hash->power ? key & hash->power : key % hash->nr_buckets; for (item = hash->buckets[bucket]; item; item = item->next) { if (item->key == key) { if (!match) return item; if (match(item, data)) return item; } } return NULL; } trace-cmd-v2.9.6/lib/trace-cmd/trace-hooks.c000066400000000000000000000061451414302661500205550ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2015 Red Hat Inc, Steven Rostedt * */ #include #include #include #include "trace-cmd-private.h" #include "event-utils.h" struct hook_list *tracecmd_create_event_hook(const char *arg) { struct hook_list *hook; char *system = NULL; char *event; char *match; char *flags = NULL; char *pid = NULL; char *str; char *tok; int index; int ch; int i; hook = malloc(sizeof(*hook)); if (!hook) return NULL; memset(hook, 0, sizeof(*hook)); str = strdup(arg); if (!str) { free(hook); return NULL; } hook->str = str; hook->hook = arg; /* * Hooks are in the form of: * [:],[,]/ * [:],[,] * * Where start_system, start_pid, end_system, and flags are all * optional. * * Flags are (case insensitive): * P - pinned to cpu (wont migrate) * G - global, not hooked to task - currently ignored. * S - save stacks for this event. */ tok = strtok(str, ":,"); if (!tok) goto invalid_tok; /* See what the token was from the original arg */ index = strlen(tok); if (arg[index] == ':') { /* this is a system, the next token must be ',' */ system = tok; tok = strtok(NULL, ","); if (!tok) goto invalid_tok; } event = tok; tok = strtok(NULL, ",/"); if (!tok) goto invalid_tok; match = tok; index = strlen(tok) + tok - str; if (arg[index] == ',') { tok = strtok(NULL, "/"); if (!tok) goto invalid_tok; pid = tok; } hook->start_system = system; hook->start_event = event; hook->start_match = match; hook->pid = pid; /* Now process the end event */ system = NULL; tok = strtok(NULL, ":,"); if (!tok) goto invalid_tok; /* See what the token was from the original arg */ index = tok - str + strlen(tok); if (arg[index] == ':') { /* this is a system, the next token must be ',' */ system = tok; tok = strtok(NULL, ","); if (!tok) goto invalid_tok; } event = tok; tok = strtok(NULL, ","); if (!tok) goto invalid_tok; match = tok; index = strlen(tok) + tok - str; if (arg[index] == ',') { tok = strtok(NULL, ""); if (!tok) goto invalid_tok; flags = tok; } hook->end_system = system; hook->end_event = event; hook->end_match = match; hook->migrate = 1; if (flags) { for (i = 0; flags[i]; i++) { ch = tolower(flags[i]); switch (ch) { case 'p': hook->migrate = 0; break; case 'g': hook->global = 1; break; case 's': hook->stack = 1; break; default: warning("unknown flag %c\n", flags[i]); } } } printf("start %s:%s:%s (%s) end %s:%s:%s (%s)\n", hook->start_system, hook->start_event, hook->start_match, hook->pid, hook->end_system, hook->end_event, hook->end_match, flags); return hook; invalid_tok: warning("Invalid hook format '%s'", arg); return NULL; } void tracecmd_free_hooks(struct hook_list *hooks) { struct hook_list *hook; while (hooks) { hook = hooks; hooks = hooks->next; free(hook->str); free(hook); } } trace-cmd-v2.9.6/lib/trace-cmd/trace-input.c000066400000000000000000002662111414302661500205730ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt * */ #define _LARGEFILE64_SOURCE #include #include #include #include #include #include #include #include #include #include "trace-write-local.h" #include "trace-local.h" #include "kbuffer.h" #include "list.h" #define _STRINGIFY(x) #x #define STRINGIFY(x) _STRINGIFY(x) #define MISSING_EVENTS (1 << 31) #define MISSING_STORED (1 << 30) #define COMMIT_MASK ((1 << 27) - 1) /* for debugging read instead of mmap */ static int force_read = 0; struct page_map { struct list_head list; off64_t offset; off64_t size; void *map; int ref_count; }; struct page { struct list_head list; off64_t offset; struct tracecmd_input *handle; struct page_map *page_map; void *map; int ref_count; int cpu; long long lost_events; #if DEBUG_RECORD struct tep_record *records; #endif }; struct cpu_data { /* the first two never change */ unsigned long long file_offset; unsigned long long file_size; unsigned long long offset; unsigned long long size; unsigned long long timestamp; struct list_head page_maps; struct page_map *page_map; struct page **pages; struct tep_record *next; struct page *page; struct kbuffer *kbuf; int nr_pages; int page_cnt; int cpu; int pipe_fd; }; struct input_buffer_instance { char *name; size_t offset; }; struct ts_offset_sample { long long time; long long offset; long long scaling; }; struct guest_trace_info { struct guest_trace_info *next; char *name; unsigned long long trace_id; int vcpu_count; int *cpu_pid; }; struct host_trace_info { unsigned long long peer_trace_id; unsigned int flags; bool sync_enable; int ts_samples_count; struct ts_offset_sample *ts_samples; }; struct tracecmd_input { struct tep_handle *pevent; unsigned long file_state; struct tep_plugin_list *plugin_list; struct tracecmd_input *parent; unsigned long flags; unsigned long long trace_id; int fd; int long_size; int page_size; int page_map_size; int cpus; int ref; int nr_buffers; /* buffer instances */ bool use_trace_clock; bool read_page; bool use_pipe; int file_version; struct cpu_data *cpu_data; long long ts_offset; struct host_trace_info host; double ts2secs; char * cpustats; char * uname; char * version; char * trace_clock; struct input_buffer_instance *buffers; int parsing_failures; struct guest_trace_info *guest; struct tracecmd_ftrace finfo; struct hook_list *hooks; struct pid_addr_maps *pid_maps; /* file information */ size_t header_files_start; size_t ftrace_files_start; size_t event_files_start; size_t total_file_size; /* For custom profilers. */ tracecmd_show_data_func show_data_func; }; __thread struct tracecmd_input *tracecmd_curr_thread_handle; static int read_options_type(struct tracecmd_input *handle); void tracecmd_set_flag(struct tracecmd_input *handle, int flag) { handle->flags |= flag; } void tracecmd_clear_flag(struct tracecmd_input *handle, int flag) { handle->flags &= ~flag; } unsigned long tracecmd_get_flags(struct tracecmd_input *handle) { return handle->flags; } enum tracecmd_file_states tracecmd_get_file_state(struct tracecmd_input *handle) { return handle->file_state; } #if DEBUG_RECORD static void remove_record(struct page *page, struct tep_record *record) { if (record->prev) record->prev->next = record->next; else page->records = record->next; if (record->next) record->next->prev = record->prev; } static void add_record(struct page *page, struct tep_record *record) { if (page->records) page->records->prev = record; record->next = page->records; record->prev = NULL; page->records = record; } static const char *show_records(struct page **pages, int nr_pages) { static char buf[BUFSIZ + 1]; struct tep_record *record; struct page *page; int len; int i; memset(buf, 0, sizeof(buf)); len = 0; for (i = 0; i < nr_pages; i++) { page = pages[i]; if (!page) continue; for (record = page->records; record; record = record->next) { int n; n = snprintf(buf+len, BUFSIZ - len, " 0x%lx", record->alloc_addr); len += n; if (len >= BUFSIZ) break; } } return buf; } #else static inline void remove_record(struct page *page, struct tep_record *record) {} static inline void add_record(struct page *page, struct tep_record *record) {} static const char *show_records(struct page **pages, int nr_pages) { return ""; } #endif static int init_cpu(struct tracecmd_input *handle, int cpu); static ssize_t do_read(struct tracecmd_input *handle, void *data, size_t size) { ssize_t tot = 0; ssize_t r; do { r = read(handle->fd, data + tot, size - tot); tot += r; if (!r) break; if (r < 0) return r; } while (tot != size); return tot; } static ssize_t do_read_check(struct tracecmd_input *handle, void *data, size_t size) { ssize_t ret; ret = do_read(handle, data, size); if (ret < 0) return ret; if (ret != size) return -1; return 0; } static char *read_string(struct tracecmd_input *handle) { char buf[BUFSIZ]; char *str = NULL; size_t size = 0; ssize_t i; ssize_t r; for (;;) { r = do_read(handle, buf, BUFSIZ); if (r < 0) goto fail; if (!r) goto fail; for (i = 0; i < r; i++) { if (!buf[i]) break; } if (i < r) break; if (str) { size += BUFSIZ; str = realloc(str, size); if (!str) return NULL; memcpy(str + (size - BUFSIZ), buf, BUFSIZ); } else { size = BUFSIZ; str = malloc(size); if (!str) return NULL; memcpy(str, buf, size); } } /* move the file descriptor to the end of the string */ r = lseek(handle->fd, -(r - (i+1)), SEEK_CUR); if (r < 0) goto fail; if (str) { size += i + 1; str = realloc(str, size); if (!str) return NULL; memcpy(str + (size - i), buf, i); str[size] = 0; } else { size = i + 1; str = malloc(size); if (!str) return NULL; memcpy(str, buf, i); str[i] = 0; } return str; fail: if (str) free(str); return NULL; } static int read4(struct tracecmd_input *handle, unsigned int *size) { struct tep_handle *pevent = handle->pevent; unsigned int data; if (do_read_check(handle, &data, 4)) return -1; *size = tep_read_number(pevent, &data, 4); return 0; } static int read8(struct tracecmd_input *handle, unsigned long long *size) { struct tep_handle *pevent = handle->pevent; unsigned long long data; if (do_read_check(handle, &data, 8)) return -1; *size = tep_read_number(pevent, &data, 8); return 0; } static int read_header_files(struct tracecmd_input *handle) { struct tep_handle *pevent = handle->pevent; unsigned long long size; char *header; char buf[BUFSIZ]; if (handle->file_state >= TRACECMD_FILE_HEADERS) return 0; if (do_read_check(handle, buf, 12)) return -1; if (memcmp(buf, "header_page", 12) != 0) return -1; if (read8(handle, &size) < 0) return -1; header = malloc(size); if (!header) return -1; if (do_read_check(handle, header, size)) goto failed_read; tep_parse_header_page(pevent, header, size, handle->long_size); free(header); /* * The size field in the page is of type long, * use that instead, since it represents the kernel. */ handle->long_size = tep_get_header_page_size(pevent); if (do_read_check(handle, buf, 13)) return -1; if (memcmp(buf, "header_event", 13) != 0) return -1; if (read8(handle, &size) < 0) return -1; header = malloc(size); if (!header) return -1; if (do_read_check(handle, header, size)) goto failed_read; free(header); handle->ftrace_files_start = lseek64(handle->fd, 0, SEEK_CUR); handle->file_state = TRACECMD_FILE_HEADERS; return 0; failed_read: free(header); return -1; } static int regex_event_buf(const char *file, int size, regex_t *epreg) { char *buf; char *line; int ret; buf = malloc(size + 1); if (!buf) { warning("Insufficient memory"); return 0; } strncpy(buf, file, size); buf[size] = 0; /* get the name from the first line */ line = strtok(buf, "\n"); if (!line) { warning("No newline found in '%s'", buf); return 0; } /* skip name if it is there */ if (strncmp(line, "name: ", 6) == 0) line += 6; ret = regexec(epreg, line, 0, NULL, 0) == 0; free(buf); return ret; } static int read_ftrace_file(struct tracecmd_input *handle, unsigned long long size, int print, regex_t *epreg) { struct tep_handle *pevent = handle->pevent; char *buf; buf = malloc(size); if (!buf) return -1; if (do_read_check(handle, buf, size)) { free(buf); return -1; } if (epreg) { if (print || regex_event_buf(buf, size, epreg)) printf("%.*s\n", (int)size, buf); } else { if (tep_parse_event(pevent, buf, size, "ftrace")) handle->parsing_failures++; } free(buf); return 0; } static int read_event_file(struct tracecmd_input *handle, char *system, unsigned long long size, int print, int *sys_printed, regex_t *epreg) { struct tep_handle *pevent = handle->pevent; char *buf; buf = malloc(size); if (!buf) return -1; if (do_read_check(handle, buf, size)) { free(buf); return -1; } if (epreg) { if (print || regex_event_buf(buf, size, epreg)) { if (!*sys_printed) { printf("\nsystem: %s\n", system); *sys_printed = 1; } printf("%.*s\n", (int)size, buf); } } else { if (tep_parse_event(pevent, buf, size, system)) handle->parsing_failures++; } free(buf); return 0; } static int make_preg_files(const char *regex, regex_t *system, regex_t *event, int *unique) { char *buf; char *sstr; char *estr; int ret; /* unique is set if a colon is found */ *unique = 0; /* split "system:event" into "system" and "event" */ buf = strdup(regex); if (!buf) return -ENOMEM; sstr = strtok(buf, ":"); estr = strtok(NULL, ":"); /* If no colon is found, set event == system */ if (!estr) estr = sstr; else *unique = 1; ret = regcomp(system, sstr, REG_ICASE|REG_NOSUB); if (ret) { warning("Bad regular expression '%s'", sstr); goto out; } ret = regcomp(event, estr, REG_ICASE|REG_NOSUB); if (ret) { warning("Bad regular expression '%s'", estr); goto out; } out: free(buf); return ret; } static int read_ftrace_files(struct tracecmd_input *handle, const char *regex) { unsigned long long size; regex_t spreg; regex_t epreg; regex_t *sreg = NULL; regex_t *ereg = NULL; unsigned int count, i; int print_all = 0; int unique; int ret; if (handle->file_state >= TRACECMD_FILE_FTRACE_EVENTS) return 0; if (regex) { sreg = &spreg; ereg = &epreg; ret = make_preg_files(regex, sreg, ereg, &unique); if (ret) return -1; if (regexec(sreg, "ftrace", 0, NULL, 0) == 0) { /* * If the system matches a regex that did * not contain a colon, then print all events. */ if (!unique) print_all = 1; } else if (unique) { /* * The user specified a unique event that did * not match the ftrace system. Don't print any * events here. */ regfree(sreg); regfree(ereg); sreg = NULL; ereg = NULL; } } if (read4(handle, &count) < 0) return -1; for (i = 0; i < count; i++) { if (read8(handle, &size) < 0) return -1; ret = read_ftrace_file(handle, size, print_all, ereg); if (ret < 0) return -1; } handle->event_files_start = lseek64(handle->fd, 0, SEEK_CUR); if (sreg) { regfree(sreg); regfree(ereg); } handle->file_state = TRACECMD_FILE_FTRACE_EVENTS; return 0; } static int read_event_files(struct tracecmd_input *handle, const char *regex) { unsigned long long size; char *system; regex_t spreg; regex_t epreg; regex_t *sreg = NULL; regex_t *ereg = NULL; regex_t *reg; unsigned int systems; unsigned int count; unsigned int i, x; int print_all; int sys_printed; int unique; int ret; if (handle->file_state >= TRACECMD_FILE_ALL_EVENTS) return 0; if (regex) { sreg = &spreg; ereg = &epreg; ret = make_preg_files(regex, sreg, ereg, &unique); if (ret) return -1; } if (read4(handle, &systems) < 0) return -1; for (i = 0; i < systems; i++) { system = read_string(handle); if (!system) return -1; sys_printed = 0; print_all = 0; reg = ereg; if (sreg) { if (regexec(sreg, system, 0, NULL, 0) == 0) { /* * If the user passed in a regex that * did not contain a colon, then we can * print all the events of this system. */ if (!unique) print_all = 1; } else if (unique) { /* * The user passed in a unique event that * specified a specific system and event. * Since this system doesn't match this * event, then we don't print any events * for this system. */ reg = NULL; } } if (read4(handle, &count) < 0) goto failed; for (x=0; x < count; x++) { if (read8(handle, &size) < 0) goto failed; ret = read_event_file(handle, system, size, print_all, &sys_printed, reg); if (ret < 0) goto failed; } free(system); } if (sreg) { regfree(sreg); regfree(ereg); } handle->file_state = TRACECMD_FILE_ALL_EVENTS; return 0; failed: if (sreg) { regfree(sreg); regfree(ereg); } free(system); return -1; } static int read_proc_kallsyms(struct tracecmd_input *handle) { struct tep_handle *pevent = handle->pevent; unsigned int size; char *buf; if (handle->file_state >= TRACECMD_FILE_KALLSYMS) return 0; if (read4(handle, &size) < 0) return -1; if (!size) return 0; /* OK? */ buf = malloc(size+1); if (!buf) return -1; if (do_read_check(handle, buf, size)){ free(buf); return -1; } buf[size] = 0; tracecmd_parse_proc_kallsyms(pevent, buf, size); free(buf); handle->file_state = TRACECMD_FILE_KALLSYMS; return 0; } static int read_ftrace_printk(struct tracecmd_input *handle) { unsigned int size; char *buf; if (handle->file_state >= TRACECMD_FILE_PRINTK) return 0; if (read4(handle, &size) < 0) return -1; if (!size) return 0; /* OK? */ buf = malloc(size + 1); if (!buf) return -1; if (do_read_check(handle, buf, size)) { free(buf); return -1; } buf[size] = 0; tracecmd_parse_ftrace_printk(handle->pevent, buf, size); free(buf); handle->file_state = TRACECMD_FILE_PRINTK; return 0; } static int read_and_parse_cmdlines(struct tracecmd_input *handle); /** * tracecmd_get_parsing_failures - get the count of parsing failures * @handle: input handle for the trace.dat file * * This returns the count of failures while parsing the event files */ int tracecmd_get_parsing_failures(struct tracecmd_input *handle) { if (handle) return handle->parsing_failures; return 0; } static int read_cpus(struct tracecmd_input *handle) { unsigned int cpus; if (handle->file_state >= TRACECMD_FILE_CPU_COUNT) return 0; if (read4(handle, &cpus) < 0) return -1; handle->cpus = cpus; tep_set_cpus(handle->pevent, handle->cpus); handle->file_state = TRACECMD_FILE_CPU_COUNT; return 0; } /** * tracecmd_read_headers - read the header information from trace.dat * @handle: input handle for the trace.dat file * @state: The state to read up to or zero to read up to options. * * This reads the trace.dat file for various information. Like the * format of the ring buffer, event formats, ftrace formats, kallsyms * and printk. This may be called multiple times with different @state * values, to read partial data at a time. It will always continue * where it left off. */ int tracecmd_read_headers(struct tracecmd_input *handle, enum tracecmd_file_states state) { int ret; /* Set to read all if state is zero */ if (!state) state = TRACECMD_FILE_OPTIONS; if (state <= handle->file_state) return 0; handle->parsing_failures = 0; ret = read_header_files(handle); if (ret < 0) return -1; tep_set_long_size(handle->pevent, handle->long_size); if (state <= handle->file_state) return 0; ret = read_ftrace_files(handle, NULL); if (ret < 0) return -1; if (state <= handle->file_state) return 0; ret = read_event_files(handle, NULL); if (ret < 0) return -1; if (state <= handle->file_state) return 0; ret = read_proc_kallsyms(handle); if (ret < 0) return -1; if (state <= handle->file_state) return 0; ret = read_ftrace_printk(handle); if (ret < 0) return -1; if (state <= handle->file_state) return 0; if (read_and_parse_cmdlines(handle) < 0) return -1; if (state <= handle->file_state) return 0; if (read_cpus(handle) < 0) return -1; if (state <= handle->file_state) return 0; if (read_options_type(handle) < 0) return -1; return 0; } static unsigned long long calc_page_offset(struct tracecmd_input *handle, unsigned long long offset) { return offset & ~(handle->page_size - 1); } static int read_page(struct tracecmd_input *handle, off64_t offset, int cpu, void *map) { off64_t save_seek; off64_t ret; if (handle->use_pipe) { ret = read(handle->cpu_data[cpu].pipe_fd, map, handle->page_size); /* Set EAGAIN if the pipe is empty */ if (ret < 0) { errno = EAGAIN; return -1; } else if (ret == 0) { /* Set EINVAL when the pipe has closed */ errno = EINVAL; return -1; } return 0; } /* other parts of the code may expect the pointer to not move */ save_seek = lseek64(handle->fd, 0, SEEK_CUR); ret = lseek64(handle->fd, offset, SEEK_SET); if (ret < 0) return -1; ret = read(handle->fd, map, handle->page_size); if (ret < 0) return -1; /* reset the file pointer back */ lseek64(handle->fd, save_seek, SEEK_SET); return 0; } /* page_map_size must be a power of two */ static unsigned long long normalize_size(unsigned long long size) { /* From Hacker's Delight: or bits after first set bit to all 1s */ size |= (size >> 1); size |= (size >> 2); size |= (size >> 4); size |= (size >> 8); size |= (size >> 16); size |= (size >> 32); /* Clear all bits except first one for previous power of two */ return size - (size >> 1); } static void free_page_map(struct page_map *page_map) { page_map->ref_count--; if (page_map->ref_count) return; munmap(page_map->map, page_map->size); list_del(&page_map->list); free(page_map); } static void *allocate_page_map(struct tracecmd_input *handle, struct page *page, int cpu, off64_t offset) { struct cpu_data *cpu_data = &handle->cpu_data[cpu]; struct page_map *page_map; off64_t map_size; off64_t map_offset; void *map; int ret; if (handle->read_page) { map = malloc(handle->page_size); if (!map) return NULL; ret = read_page(handle, offset, cpu, map); if (ret < 0) { free(map); return NULL; } return map; } map_size = handle->page_map_size; map_offset = offset & ~(map_size - 1); if (map_offset < cpu_data->file_offset) { map_size -= cpu_data->file_offset - map_offset; map_offset = cpu_data->file_offset; } page_map = cpu_data->page_map; if (page_map && page_map->offset == map_offset) goto out; list_for_each_entry(page_map, &cpu_data->page_maps, list) { if (page_map->offset == map_offset) goto out; } page_map = calloc(1, sizeof(*page_map)); if (!page_map) return NULL; if (map_offset + map_size > cpu_data->file_offset + cpu_data->file_size) map_size -= map_offset + map_size - (cpu_data->file_offset + cpu_data->file_size); again: page_map->size = map_size; page_map->offset = map_offset; page_map->map = mmap(NULL, map_size, PROT_READ, MAP_PRIVATE, handle->fd, map_offset); if (page_map->map == MAP_FAILED) { /* Try a smaller map */ map_size >>= 1; if (map_size < handle->page_size) { free(page_map); return NULL; } handle->page_map_size = map_size; map_offset = offset & ~(map_size - 1); /* * Note, it is now possible to get duplicate memory * maps. But that's fine, the previous maps with * larger sizes will eventually be unmapped. */ goto again; } list_add(&page_map->list, &cpu_data->page_maps); out: if (cpu_data->page_map != page_map) { struct page_map *old_map = cpu_data->page_map; cpu_data->page_map = page_map; page_map->ref_count++; if (old_map) free_page_map(old_map); } page->page_map = page_map; page_map->ref_count++; return page_map->map + offset - page_map->offset; } static struct page *allocate_page(struct tracecmd_input *handle, int cpu, off64_t offset) { struct cpu_data *cpu_data = &handle->cpu_data[cpu]; struct page **pages; struct page *page; int index; index = (offset - cpu_data->file_offset) / handle->page_size; if (index >= cpu_data->nr_pages) { pages = realloc(cpu_data->pages, (index + 1) * sizeof(*cpu_data->pages)); if (!pages) return NULL; memset(pages + cpu_data->nr_pages, 0, (index + 1 - cpu_data->nr_pages) * sizeof(*cpu_data->pages)); cpu_data->pages = pages; cpu_data->nr_pages = index + 1; } if (cpu_data->pages[index]) { cpu_data->pages[index]->ref_count++; return cpu_data->pages[index]; } page = malloc(sizeof(*page)); if (!page) return NULL; memset(page, 0, sizeof(*page)); page->offset = offset; page->handle = handle; page->cpu = cpu; page->map = allocate_page_map(handle, page, cpu, offset); if (!page->map) { free(page); return NULL; } cpu_data->pages[index] = page; cpu_data->page_cnt++; page->ref_count = 1; return page; } static void __free_page(struct tracecmd_input *handle, struct page *page) { struct cpu_data *cpu_data = &handle->cpu_data[page->cpu]; struct page **pages; int index; if (!page->ref_count) die("Page ref count is zero!\n"); page->ref_count--; if (page->ref_count) return; if (handle->read_page) free(page->map); else free_page_map(page->page_map); index = (page->offset - cpu_data->file_offset) / handle->page_size; cpu_data->pages[index] = NULL; cpu_data->page_cnt--; free(page); if (handle->use_pipe) { for (index = cpu_data->nr_pages - 1; index > 0; index--) if (cpu_data->pages[index]) break; if (index < (cpu_data->nr_pages - 1)) { pages = realloc(cpu_data->pages, (index + 1) * sizeof(*cpu_data->pages)); if (!pages) return; cpu_data->pages = pages; cpu_data->nr_pages = index + 1; } } } static void free_page(struct tracecmd_input *handle, int cpu) { if (!handle->cpu_data || cpu >= handle->cpus || !handle->cpu_data[cpu].page) return; __free_page(handle, handle->cpu_data[cpu].page); handle->cpu_data[cpu].page = NULL; } static void __free_record(struct tep_record *record) { if (record->priv) { struct page *page = record->priv; remove_record(page, record); __free_page(page->handle, page); } free(record); } void tracecmd_free_record(struct tep_record *record) { if (!record) return; if (!record->ref_count) die("record ref count is zero!"); record->ref_count--; if (record->ref_count) return; if (record->locked) die("freeing record when it is locked!"); record->data = NULL; __free_record(record); } void tracecmd_record_ref(struct tep_record *record) { record->ref_count++; #if DEBUG_RECORD /* Update locating of last reference */ record->alloc_addr = (unsigned long)__builtin_return_address(0); #endif } static void free_next(struct tracecmd_input *handle, int cpu) { struct tep_record *record; if (!handle->cpu_data || cpu >= handle->cpus) return; record = handle->cpu_data[cpu].next; if (!record) return; handle->cpu_data[cpu].next = NULL; record->locked = 0; tracecmd_free_record(record); } static inline unsigned long long timestamp_correction_calc(unsigned long long ts, unsigned int flags, struct ts_offset_sample *min, struct ts_offset_sample *max) { long long scaling; long long tscor; if (flags & TRACECMD_TSYNC_FLAG_INTERPOLATE) { long long delta = max->time - min->time; long long offset = ((long long)ts - min->time) * (max->offset - min->offset); scaling = (min->scaling + max->scaling) / 2; tscor = min->offset + (offset + delta / 2) / delta; } else { scaling = min->scaling; tscor = min->offset; } ts *= scaling; if (tscor < 0) return ts - llabs(tscor); return ts + tscor; } static unsigned long long timestamp_correct(unsigned long long ts, struct tracecmd_input *handle) { struct host_trace_info *host = &handle->host; int min, mid, max; if (handle->flags & TRACECMD_FL_IGNORE_DATE) return ts; if (handle->ts_offset) return ts + handle->ts_offset; if (!host->sync_enable) return ts; /* We have one sample, nothing to calc here */ if (host->ts_samples_count == 1) return ts + host->ts_samples[0].offset; /* We have two samples, nothing to search here */ if (host->ts_samples_count == 2) return timestamp_correction_calc(ts, host->flags, &host->ts_samples[0], &host->ts_samples[1]); /* We have more than two samples */ if (ts <= host->ts_samples[0].time) return timestamp_correction_calc(ts, host->flags, &host->ts_samples[0], &host->ts_samples[1]); else if (ts >= host->ts_samples[host->ts_samples_count-1].time) return timestamp_correction_calc(ts, host->flags, &host->ts_samples[host->ts_samples_count-2], &host->ts_samples[host->ts_samples_count-1]); min = 0; max = host->ts_samples_count-1; mid = (min + max)/2; while (min <= max) { if (ts < host->ts_samples[mid].time) max = mid - 1; else if (ts > host->ts_samples[mid].time) min = mid + 1; else break; mid = (min + max)/2; } return timestamp_correction_calc(ts, host->flags, &host->ts_samples[mid], &host->ts_samples[mid+1]); } /* * Page is mapped, now read in the page header info. */ static int update_page_info(struct tracecmd_input *handle, int cpu) { struct tep_handle *pevent = handle->pevent; void *ptr = handle->cpu_data[cpu].page->map; struct kbuffer *kbuf = handle->cpu_data[cpu].kbuf; /* FIXME: handle header page */ if (tep_get_header_timestamp_size(pevent) != 8) { warning("expected a long long type for timestamp"); return -1; } kbuffer_load_subbuffer(kbuf, ptr); if (kbuffer_subbuffer_size(kbuf) > handle->page_size) { warning("bad page read, with size of %d", kbuffer_subbuffer_size(kbuf)); return -1; } handle->cpu_data[cpu].timestamp = timestamp_correct(kbuffer_timestamp(kbuf), handle); if (handle->ts2secs) handle->cpu_data[cpu].timestamp *= handle->ts2secs; return 0; } /* * get_page maps a page for a given cpu. * * Returns 1 if the page was already mapped, * 0 if it mapped successfully * -1 on error */ static int get_page(struct tracecmd_input *handle, int cpu, off64_t offset) { /* Don't map if the page is already where we want */ if (handle->cpu_data[cpu].offset == offset && handle->cpu_data[cpu].page) return 1; /* Do not map no data for CPU */ if (!handle->cpu_data[cpu].size) return -1; if (offset & (handle->page_size - 1)) { errno = -EINVAL; die("bad page offset %llx", offset); return -1; } if (offset < handle->cpu_data[cpu].file_offset || offset > handle->cpu_data[cpu].file_offset + handle->cpu_data[cpu].file_size) { errno = -EINVAL; die("bad page offset %llx", offset); return -1; } handle->cpu_data[cpu].offset = offset; handle->cpu_data[cpu].size = (handle->cpu_data[cpu].file_offset + handle->cpu_data[cpu].file_size) - offset; free_page(handle, cpu); handle->cpu_data[cpu].page = allocate_page(handle, cpu, offset); if (!handle->cpu_data[cpu].page) return -1; if (update_page_info(handle, cpu)) return -1; return 0; } static int get_next_page(struct tracecmd_input *handle, int cpu) { off64_t offset; if (!handle->cpu_data[cpu].page && !handle->use_pipe) return 0; free_page(handle, cpu); if (handle->cpu_data[cpu].size <= handle->page_size) { handle->cpu_data[cpu].offset = 0; return 0; } offset = handle->cpu_data[cpu].offset + handle->page_size; return get_page(handle, cpu, offset); } static struct tep_record * peek_event(struct tracecmd_input *handle, unsigned long long offset, int cpu) { struct tep_record *record = NULL; /* * Since the timestamp is calculated from the beginning * of the page and through each event, we reset the * page to the beginning. This is just used by * tracecmd_read_at. */ update_page_info(handle, cpu); do { free_next(handle, cpu); record = tracecmd_peek_data(handle, cpu); if (record && (record->offset + record->record_size) > offset) break; } while (record); return record; } static struct tep_record * read_event(struct tracecmd_input *handle, unsigned long long offset, int cpu) { struct tep_record *record; record = peek_event(handle, offset, cpu); if (record) record = tracecmd_read_data(handle, cpu); return record; } static struct tep_record * find_and_peek_event(struct tracecmd_input *handle, unsigned long long offset, int *pcpu) { unsigned long long page_offset; int cpu; /* find the cpu that this offset exists in */ for (cpu = 0; cpu < handle->cpus; cpu++) { if (offset >= handle->cpu_data[cpu].file_offset && offset < handle->cpu_data[cpu].file_offset + handle->cpu_data[cpu].file_size) break; } /* Not found? */ if (cpu == handle->cpus) return NULL; /* Move this cpu index to point to this offest */ page_offset = calc_page_offset(handle, offset); if (get_page(handle, cpu, page_offset) < 0) return NULL; if (pcpu) *pcpu = cpu; return peek_event(handle, offset, cpu); } static struct tep_record * find_and_read_event(struct tracecmd_input *handle, unsigned long long offset, int *pcpu) { struct tep_record *record; int cpu; record = find_and_peek_event(handle, offset, &cpu); if (record) { record = tracecmd_read_data(handle, cpu); if (pcpu) *pcpu = cpu; } return record; } /** * tracecmd_read_at - read a record from a specific offset * @handle: input handle for the trace.dat file * @offset: the offset into the file to find the record * @pcpu: pointer to a variable to store the CPU id the record was found in * * This function is useful when looking for a previous record. * You can store the offset of the record "record->offset" and use that * offset to retreive the record again without needing to store any * other information about the record. * * The record returned must be freed. */ struct tep_record * tracecmd_read_at(struct tracecmd_input *handle, unsigned long long offset, int *pcpu) { unsigned long long page_offset; int cpu; page_offset = calc_page_offset(handle, offset); /* check to see if we have this page already */ for (cpu = 0; cpu < handle->cpus; cpu++) { if (handle->cpu_data[cpu].offset == page_offset && handle->cpu_data[cpu].file_size) break; } if (cpu < handle->cpus && handle->cpu_data[cpu].page) { if (pcpu) *pcpu = cpu; return read_event(handle, offset, cpu); } else return find_and_read_event(handle, offset, pcpu); } /** * tracecmd_refresh_record - remaps the records data * @handle: input handle for the trace.dat file * @record: the record to be refreshed * * A record data points to a mmap section of memory. * by reading new records the mmap section may be unmapped. * This will refresh the record's data mapping. * * ===== OBSOLETED BY PAGE REFERENCES ===== * * Returns 1 if page is still mapped (does not modify CPU iterator) * 0 on successful mapping (was not mapped before, * This will update CPU iterator to point to * the next record) * -1 on error. */ int tracecmd_refresh_record(struct tracecmd_input *handle, struct tep_record *record) { unsigned long long page_offset; int cpu = record->cpu; struct cpu_data *cpu_data = &handle->cpu_data[cpu]; int index; int ret; page_offset = calc_page_offset(handle, record->offset); index = record->offset & (handle->page_size - 1); ret = get_page(handle, record->cpu, page_offset); if (ret < 0) return -1; /* If the page is still mapped, there's nothing to do */ if (ret) return 1; record->data = kbuffer_read_at_offset(cpu_data->kbuf, index, &record->ts); cpu_data->timestamp = record->ts; return 0; } /** * tracecmd_read_cpu_first - get the first record in a CPU * @handle: input handle for the trace.dat file * @cpu: the CPU to search * * This returns the first (by time) record entry in a given CPU. * * The record returned must be freed. */ struct tep_record * tracecmd_read_cpu_first(struct tracecmd_input *handle, int cpu) { int ret; ret = get_page(handle, cpu, handle->cpu_data[cpu].file_offset); if (ret < 0) return NULL; /* If the page was already mapped, we need to reset it */ if (ret) update_page_info(handle, cpu); free_next(handle, cpu); return tracecmd_read_data(handle, cpu); } /** * tracecmd_read_cpu_last - get the last record in a CPU * @handle: input handle for the trace.dat file * @cpu: the CPU to search * * This returns the last (by time) record entry in a given CPU. * * The record returned must be freed. */ struct tep_record * tracecmd_read_cpu_last(struct tracecmd_input *handle, int cpu) { struct tep_record *record = NULL; off64_t offset, page_offset; offset = handle->cpu_data[cpu].file_offset + handle->cpu_data[cpu].file_size; if (offset & (handle->page_size - 1)) offset &= ~(handle->page_size - 1); else offset -= handle->page_size; page_offset = offset; again: if (get_page(handle, cpu, page_offset) < 0) return NULL; offset = page_offset; do { tracecmd_free_record(record); record = tracecmd_read_data(handle, cpu); if (record) offset = record->offset; } while (record); record = tracecmd_read_at(handle, offset, NULL); /* * It is possible that a page has just a timestamp * or just padding on it. */ if (!record) { if (page_offset == handle->cpu_data[cpu].file_offset) return NULL; page_offset -= handle->page_size; goto again; } return record; } /** * tracecmd_set_cpu_to_timestamp - set the CPU iterator to a given time * @handle: input handle for the trace.dat file * @cpu: the CPU pointer to set * @ts: the timestamp to set the CPU at. * * This sets the CPU iterator used by tracecmd_read_data and * tracecmd_peek_data to a location in the CPU storage near * a given timestamp. It will try to set the iterator to a time before * the time stamp and not actually at a given time. * * To use this to find a record in a time field, call this function * first, than iterate with tracecmd_read_data to find the records * you need. */ int tracecmd_set_cpu_to_timestamp(struct tracecmd_input *handle, int cpu, unsigned long long ts) { struct cpu_data *cpu_data = &handle->cpu_data[cpu]; off64_t start, end, next; if (cpu < 0 || cpu >= handle->cpus) { errno = -EINVAL; return -1; } if (!cpu_data->size) return -1; if (!cpu_data->page) { if (init_cpu(handle, cpu)) return -1; } if (cpu_data->timestamp == ts) { /* * If a record is cached, then that record is most * likely the matching timestamp. Otherwise we need * to start from the beginning of the index; */ if (!cpu_data->next || cpu_data->next->ts != ts) update_page_info(handle, cpu); return 0; } /* Set to the first record on current page */ update_page_info(handle, cpu); if (cpu_data->timestamp < ts) { start = cpu_data->offset; end = cpu_data->file_offset + cpu_data->file_size; if (end & (handle->page_size - 1)) end &= ~(handle->page_size - 1); else end -= handle->page_size; next = end; } else { end = cpu_data->offset; start = cpu_data->file_offset; next = start; } while (start < end) { if (get_page(handle, cpu, next) < 0) return -1; if (cpu_data->timestamp == ts) break; if (cpu_data->timestamp < ts) start = next; else end = next; next = start + (end - start) / 2; next = calc_page_offset(handle, next); /* Prevent an infinite loop if start and end are a page off */ if (next == start) start = next += handle->page_size; } /* * We need to end up on a page before the time stamp. * We go back even if the timestamp is the same. This is because * we want the event with the timestamp, not the page. The page * can start with the timestamp we are looking for, but the event * may be on the previous page. */ if (cpu_data->timestamp >= ts && cpu_data->offset > cpu_data->file_offset) get_page(handle, cpu, cpu_data->offset - handle->page_size); return 0; } /** * tracecmd_set_all_cpus_to_timestamp - set all CPUs iterator to a given time * @handle: input handle for the trace.dat file * @cpu: the CPU pointer to set * @ts: the timestamp to set the CPU at. * * This sets the CPU iterator used by tracecmd_read_data and * tracecmd_peek_data to a location in the CPU storage near * a given timestamp. It will try to set the iterator to a time before * the time stamp and not actually at a given time. * * To use this to find a record in a time field, call this function * first, than iterate with tracecmd_read_next_data to find the records * you need. */ void tracecmd_set_all_cpus_to_timestamp(struct tracecmd_input *handle, unsigned long long time) { int cpu; for (cpu = 0; cpu < handle->cpus; cpu++) tracecmd_set_cpu_to_timestamp(handle, cpu, time); } /** * tracecmd_set_cursor - set the offset for the next tracecmd_read_data * @handle: input handle for the trace.dat file * @cpu: the CPU pointer to set * @offset: the offset to place the cursor * * Set the pointer to the next read or peek. This is useful when * needing to read sequentially and then look at another record * out of sequence without breaking the iteration. This is done with: * * record = tracecmd_peek_data() * offset = record->offset; * record = tracecmd_read_at(); * - do what ever with record - * tracecmd_set_cursor(handle, cpu, offset); * * Now the next tracecmd_peek_data or tracecmd_read_data will return * the original record. */ int tracecmd_set_cursor(struct tracecmd_input *handle, int cpu, unsigned long long offset) { struct cpu_data *cpu_data = &handle->cpu_data[cpu]; unsigned long long page_offset; if (cpu < 0 || cpu >= handle->cpus) return -1; if (offset < cpu_data->file_offset || offset > cpu_data->file_offset + cpu_data->file_size) return -1; /* cpu does not have this offset. */ /* Move this cpu index to point to this offest */ page_offset = calc_page_offset(handle, offset); if (get_page(handle, cpu, page_offset) < 0) return -1; peek_event(handle, offset, cpu); return 0; } /** * tracecmd_get_cursor - get the offset for the next tracecmd_read_data * @handle: input handle for the trace.dat file * @cpu: the CPU pointer to get the cursor from * * Returns the offset of the next record that would be read. */ unsigned long long tracecmd_get_cursor(struct tracecmd_input *handle, int cpu) { struct cpu_data *cpu_data = &handle->cpu_data[cpu]; struct kbuffer *kbuf = cpu_data->kbuf; if (cpu < 0 || cpu >= handle->cpus) return 0; /* * Use the next pointer if it exists and matches the * current timestamp. */ if (cpu_data->next && cpu_data->next->ts == cpu_data->timestamp) return cpu_data->next->offset; /* * Either the next point does not exist, or it does * not match the timestamp. The next read will use the * current page. * * If the offset is at the end, then return that. */ if (cpu_data->offset >= cpu_data->file_offset + cpu_data->file_size) return cpu_data->offset; return cpu_data->offset + kbuffer_curr_offset(kbuf); } /** * tracecmd_translate_data - create a record from raw data * @handle: input handle for the trace.dat file * @ptr: raw data to read * @size: the size of the data * * This function tries to create a record from some given * raw data. The data does not need to be from the trace.dat file. * It can be stored from another location. * * Note, since the timestamp is calculated from within the trace * buffer, the timestamp for the record will be zero, since it * can't calculate it. * * The record returned must be freed. */ struct tep_record * tracecmd_translate_data(struct tracecmd_input *handle, void *ptr, int size) { struct tep_handle *pevent = handle->pevent; struct tep_record *record; unsigned int length; int swap = 1; /* minimum record read is 8, (warn?) (TODO: make 8 into macro) */ if (size < 8) return NULL; record = malloc(sizeof(*record)); if (!record) return NULL; memset(record, 0, sizeof(*record)); record->ref_count = 1; if (tep_is_local_bigendian(pevent) == tep_is_file_bigendian(pevent)) swap = 0; record->data = kbuffer_translate_data(swap, ptr, &length); record->size = length; if (record->data) record->record_size = record->size + (record->data - ptr); return record; } /** * tracecmd_peek_data - return the record at the current location. * @handle: input handle for the trace.dat file * @cpu: the CPU to pull from * * This returns the record at the current location of the CPU * iterator. It does not increment the CPU iterator. */ struct tep_record * tracecmd_peek_data(struct tracecmd_input *handle, int cpu) { struct tep_record *record; unsigned long long ts; struct kbuffer *kbuf; struct page *page; int index; void *data; if (cpu >= handle->cpus) return NULL; page = handle->cpu_data[cpu].page; kbuf = handle->cpu_data[cpu].kbuf; /* Hack to work around function graph read ahead */ tracecmd_curr_thread_handle = handle; if (handle->cpu_data[cpu].next) { record = handle->cpu_data[cpu].next; if (!record->data) die("Something freed the record"); if (handle->cpu_data[cpu].timestamp == record->ts) return record; /* * The timestamp changed, which means the cached * record is no longer valid. Reread a new record. */ free_next(handle, cpu); } read_again: if (!page) { if (handle->use_pipe) { get_next_page(handle, cpu); page = handle->cpu_data[cpu].page; } if (!page) return NULL; } data = kbuffer_read_event(kbuf, &ts); if (!data) { if (get_next_page(handle, cpu)) return NULL; page = handle->cpu_data[cpu].page; goto read_again; } handle->cpu_data[cpu].timestamp = timestamp_correct(ts, handle); if (handle->ts2secs) { handle->cpu_data[cpu].timestamp *= handle->ts2secs; ts *= handle->ts2secs; } index = kbuffer_curr_offset(kbuf); record = malloc(sizeof(*record)); if (!record) return NULL; memset(record, 0, sizeof(*record)); record->ts = handle->cpu_data[cpu].timestamp; record->size = kbuffer_event_size(kbuf); record->cpu = cpu; record->data = data; record->offset = handle->cpu_data[cpu].offset + index; record->missed_events = kbuffer_missed_events(kbuf); record->ref_count = 1; record->locked = 1; handle->cpu_data[cpu].next = record; record->record_size = kbuffer_curr_size(kbuf); record->priv = page; add_record(page, record); page->ref_count++; kbuffer_next_event(kbuf, NULL); return record; } /** * tracecmd_read_data - read the next record and increment * @handle: input handle for the trace.dat file * @cpu: the CPU to pull from * * This returns the record at the current location of the CPU * iterator and increments the CPU iterator. * * The record returned must be freed. */ struct tep_record * tracecmd_read_data(struct tracecmd_input *handle, int cpu) { struct tep_record *record; record = tracecmd_peek_data(handle, cpu); handle->cpu_data[cpu].next = NULL; if (record) { record->locked = 0; #if DEBUG_RECORD record->alloc_addr = (unsigned long)__builtin_return_address(0); #endif } return record; } /** * tracecmd_read_next_data - read the next record * @handle: input handle to the trace.dat file * @rec_cpu: return pointer to the CPU that the record belongs to * * This returns the next record by time. This is different than * tracecmd_read_data in that it looks at all CPUs. It does a peek * at each CPU and the record with the earliest time stame is * returned. If @rec_cpu is not NULL it gets the CPU id the record was * on. The CPU cursor of the returned record is moved to the * next record. * * Multiple reads of this function will return a serialized list * of all records for all CPUs in order of time stamp. * * The record returned must be freed. */ struct tep_record * tracecmd_read_next_data(struct tracecmd_input *handle, int *rec_cpu) { struct tep_record *record; int next_cpu; record = tracecmd_peek_next_data(handle, &next_cpu); if (!record) return NULL; if (rec_cpu) *rec_cpu = next_cpu; return tracecmd_read_data(handle, next_cpu); } /** * tracecmd_peek_next_data - return the next record * @handle: input handle to the trace.dat file * @rec_cpu: return pointer to the CPU that the record belongs to * * This returns the next record by time. This is different than * tracecmd_peek_data in that it looks at all CPUs. It does a peek * at each CPU and the record with the earliest time stame is * returned. If @rec_cpu is not NULL it gets the CPU id the record was * on. It does not increment the CPU iterator. */ struct tep_record * tracecmd_peek_next_data(struct tracecmd_input *handle, int *rec_cpu) { unsigned long long ts; struct tep_record *record, *next_record = NULL; int next_cpu; int cpu; if (rec_cpu) *rec_cpu = -1; next_cpu = -1; ts = 0; for (cpu = 0; cpu < handle->cpus; cpu++) { record = tracecmd_peek_data(handle, cpu); if (record && (!next_record || record->ts < ts)) { ts = record->ts; next_cpu = cpu; next_record = record; } } if (next_record) { if (rec_cpu) *rec_cpu = next_cpu; return next_record; } return NULL; } /** * tracecmd_read_prev - read the record before the given record * @handle: input handle to the trace.dat file * @record: the record to use to find the previous record. * * This returns the record before the @record on its CPU. If * @record is the first record, NULL is returned. The cursor is set * as if the previous record was read by tracecmd_read_data(). * * @record can not be NULL, otherwise NULL is returned; the * record ownership goes to this function. * * Note, this is not that fast of an algorithm, since it needs * to build the timestamp for the record. * * The record returned must be freed with tracecmd_free_record(). */ struct tep_record * tracecmd_read_prev(struct tracecmd_input *handle, struct tep_record *record) { unsigned long long offset, page_offset;; struct cpu_data *cpu_data; int index; int cpu; if (!record) return NULL; cpu = record->cpu; offset = record->offset; cpu_data = &handle->cpu_data[cpu]; page_offset = calc_page_offset(handle, offset); index = offset - page_offset; /* Note, the record passed in could have been a peek */ free_next(handle, cpu); /* Reset the cursor */ /* Should not happen */ if (get_page(handle, cpu, page_offset) < 0) return NULL; update_page_info(handle, cpu); /* Find the record before this record */ index = 0; for (;;) { record = tracecmd_read_data(handle, cpu); /* Should not happen! */ if (!record) return NULL; if (record->offset == offset) break; index = record->offset - page_offset; tracecmd_free_record(record); } tracecmd_free_record(record); if (index) /* we found our record */ return tracecmd_read_at(handle, page_offset + index, NULL); /* reset the index to start at the beginning of the page */ update_page_info(handle, cpu); /* The previous record is on the previous page */ for (;;) { /* check if this is the first page */ if (page_offset == cpu_data->file_offset) return NULL; page_offset -= handle->page_size; /* Updating page to a new page will reset index to 0 */ get_page(handle, cpu, page_offset); record = NULL; index = 0; do { if (record) { index = record->offset - page_offset; tracecmd_free_record(record); } record = tracecmd_read_data(handle, cpu); /* Should not happen */ if (!record) return NULL; } while (record->offset != offset); tracecmd_free_record(record); if (index) /* we found our record */ return tracecmd_read_at(handle, page_offset + index, NULL); } /* Not reached */ } static int init_cpu(struct tracecmd_input *handle, int cpu) { struct cpu_data *cpu_data = &handle->cpu_data[cpu]; int i; cpu_data->offset = cpu_data->file_offset; cpu_data->size = cpu_data->file_size; cpu_data->timestamp = 0; list_head_init(&cpu_data->page_maps); if (!cpu_data->size) { printf("CPU %d is empty\n", cpu); return 0; } cpu_data->nr_pages = (cpu_data->size + handle->page_size - 1) / handle->page_size; if (!cpu_data->nr_pages) cpu_data->nr_pages = 1; cpu_data->pages = calloc(cpu_data->nr_pages, sizeof(*cpu_data->pages)); if (!cpu_data->pages) return -1; if (handle->use_pipe) { /* Just make a page, it will be nuked later */ cpu_data->page = malloc(sizeof(*cpu_data->page)); if (!cpu_data->page) goto fail; memset(cpu_data->page, 0, sizeof(*cpu_data->page)); cpu_data->pages[0] = cpu_data->page; cpu_data->page_cnt = 1; cpu_data->page->ref_count = 1; return 0; } cpu_data->page = allocate_page(handle, cpu, cpu_data->offset); if (!cpu_data->page && !handle->read_page) { perror("mmap"); fprintf(stderr, "Can not mmap file, will read instead\n"); if (cpu) { /* * If the other CPUs had size and was able to mmap * then bail. */ for (i = 0; i < cpu; i++) { if (handle->cpu_data[i].size) goto fail; } } /* try again without mmapping, just read it directly */ handle->read_page = true; cpu_data->page = allocate_page(handle, cpu, cpu_data->offset); if (!cpu_data->page) /* Still no luck, bail! */ goto fail; } if (update_page_info(handle, cpu)) goto fail; return 0; fail: free(cpu_data->pages); cpu_data->pages = NULL; free(cpu_data->page); cpu_data->page = NULL; return -1; } void tracecmd_set_ts_offset(struct tracecmd_input *handle, long long offset) { handle->ts_offset = offset; } void tracecmd_set_ts2secs(struct tracecmd_input *handle, unsigned long long hz) { double ts2secs; ts2secs = (double)NSEC_PER_SEC / (double)hz; handle->ts2secs = ts2secs; handle->use_trace_clock = false; } static int tsync_offset_cmp(const void *a, const void *b) { struct ts_offset_sample *ts_a = (struct ts_offset_sample *)a; struct ts_offset_sample *ts_b = (struct ts_offset_sample *)b; if (ts_a->time > ts_b->time) return 1; if (ts_a->time < ts_b->time) return -1; return 0; } static void tsync_offset_load(struct tracecmd_input *handle, char *buf) { struct host_trace_info *host = &handle->host; long long *buf8 = (long long *)buf; int i, j; for (i = 0; i < host->ts_samples_count; i++) { host->ts_samples[i].time = tep_read_number(handle->pevent, buf8 + i, 8); host->ts_samples[i].offset = tep_read_number(handle->pevent, buf8 + host->ts_samples_count + i, 8); host->ts_samples[i].scaling = tep_read_number(handle->pevent, buf8 + (2 * host->ts_samples_count) + i, 8); } qsort(host->ts_samples, host->ts_samples_count, sizeof(struct ts_offset_sample), tsync_offset_cmp); /* Filter possible samples with equal time */ for (i = 0, j = 0; i < host->ts_samples_count; i++) { if (i == 0 || host->ts_samples[i].time != host->ts_samples[i-1].time) host->ts_samples[j++] = host->ts_samples[i]; } host->ts_samples_count = j; } static void trace_tsync_offset_free(struct host_trace_info *host) { free(host->ts_samples); host->ts_samples = NULL; } static int trace_pid_map_cmp(const void *a, const void *b) { struct tracecmd_proc_addr_map *m_a = (struct tracecmd_proc_addr_map *)a; struct tracecmd_proc_addr_map *m_b = (struct tracecmd_proc_addr_map *)b; if (m_a->start > m_b->start) if (m_a->start < m_b->start) return -1; return 0; } static void procmap_free(struct pid_addr_maps *maps) { int i; if (!maps) return; if (maps->lib_maps) { for (i = 0; i < maps->nr_lib_maps; i++) free(maps->lib_maps[i].lib_name); free(maps->lib_maps); } free(maps->proc_name); free(maps); } static void trace_guests_free(struct tracecmd_input *handle) { struct guest_trace_info *guest; while (handle->guest) { guest = handle->guest; handle->guest = handle->guest->next; free(guest->name); free(guest->cpu_pid); free(guest); } } static int trace_guest_load(struct tracecmd_input *handle, char *buf, int size) { struct guest_trace_info *guest = NULL; int cpu; int i; guest = calloc(1, sizeof(struct guest_trace_info)); if (!guest) goto error; /* * Guest name, null terminated string * long long (8 bytes) trace-id * int (4 bytes) number of guest CPUs * array of size number of guest CPUs: * int (4 bytes) Guest CPU id * int (4 bytes) Host PID, running the guest CPU */ guest->name = strndup(buf, size); if (!guest->name) goto error; buf += strlen(guest->name) + 1; size -= strlen(guest->name) + 1; if (size < sizeof(long long)) goto error; guest->trace_id = tep_read_number(handle->pevent, buf, sizeof(long long)); buf += sizeof(long long); size -= sizeof(long long); if (size < sizeof(int)) goto error; guest->vcpu_count = tep_read_number(handle->pevent, buf, sizeof(int)); buf += sizeof(int); size -= sizeof(int); guest->cpu_pid = calloc(guest->vcpu_count, sizeof(int)); if (!guest->cpu_pid) goto error; for (i = 0; i < guest->vcpu_count; i++) { if (size < 2 * sizeof(int)) goto error; cpu = tep_read_number(handle->pevent, buf, sizeof(int)); buf += sizeof(int); if (cpu >= guest->vcpu_count) goto error; guest->cpu_pid[cpu] = tep_read_number(handle->pevent, buf, sizeof(int)); buf += sizeof(int); size -= 2 * sizeof(int); } guest->next = handle->guest; handle->guest = guest; return 0; error: if (guest) { free(guest->cpu_pid); free(guest->name); free(guest); } return -1; } /* Needs to be a constant, and 4K should be good enough */ #define STR_PROCMAP_LINE_MAX 4096 static int trace_pid_map_load(struct tracecmd_input *handle, char *buf) { struct pid_addr_maps *maps = NULL; char mapname[STR_PROCMAP_LINE_MAX+1]; char *line; int res; int ret; int i; maps = calloc(1, sizeof(*maps)); if (!maps) return -ENOMEM; ret = -EINVAL; line = strchr(buf, '\n'); if (!line) goto out_fail; *line = '\0'; if (strlen(buf) > STR_PROCMAP_LINE_MAX) goto out_fail; res = sscanf(buf, "%x %x %"STRINGIFY(STR_PROCMAP_LINE_MAX)"s", &maps->pid, &maps->nr_lib_maps, mapname); if (res != 3) goto out_fail; ret = -ENOMEM; maps->proc_name = strdup(mapname); if (!maps->proc_name) goto out_fail; maps->lib_maps = calloc(maps->nr_lib_maps, sizeof(struct tracecmd_proc_addr_map)); if (!maps->lib_maps) goto out_fail; buf = line + 1; line = strchr(buf, '\n'); for (i = 0; i < maps->nr_lib_maps; i++) { if (!line) break; *line = '\0'; if (strlen(buf) > STR_PROCMAP_LINE_MAX) break; res = sscanf(buf, "%llx %llx %s", &maps->lib_maps[i].start, &maps->lib_maps[i].end, mapname); if (res != 3) break; maps->lib_maps[i].lib_name = strdup(mapname); if (!maps->lib_maps[i].lib_name) goto out_fail; buf = line + 1; line = strchr(buf, '\n'); } ret = -EINVAL; if (i != maps->nr_lib_maps) goto out_fail; qsort(maps->lib_maps, maps->nr_lib_maps, sizeof(*maps->lib_maps), trace_pid_map_cmp); maps->next = handle->pid_maps; handle->pid_maps = maps; return 0; out_fail: procmap_free(maps); return ret; } static void trace_pid_map_free(struct pid_addr_maps *maps) { struct pid_addr_maps *del; while (maps) { del = maps; maps = maps->next; procmap_free(del); } } static int trace_pid_map_search(const void *a, const void *b) { struct tracecmd_proc_addr_map *key = (struct tracecmd_proc_addr_map *)a; struct tracecmd_proc_addr_map *map = (struct tracecmd_proc_addr_map *)b; if (key->start >= map->end) return 1; if (key->start < map->start) return -1; return 0; } /** * tracecmd_search_task_map - Search task memory address map * @handle: input handle to the trace.dat file * @pid: pid of the task * @addr: address from the task memory space. * * Map of the task memory can be saved in the trace.dat file, using the option * "--proc-map". If there is such information, this API can be used to look up * into this memory map to find what library is loaded at the given @addr. * * A pointer to struct tracecmd_proc_addr_map is returned, containing the name * of the library at given task @addr and the library start and end addresses. */ struct tracecmd_proc_addr_map * tracecmd_search_task_map(struct tracecmd_input *handle, int pid, unsigned long long addr) { struct tracecmd_proc_addr_map *lib; struct tracecmd_proc_addr_map key; struct pid_addr_maps *maps; if (!handle || !handle->pid_maps) return NULL; maps = handle->pid_maps; while (maps) { if (maps->pid == pid) break; maps = maps->next; } if (!maps || !maps->nr_lib_maps || !maps->lib_maps) return NULL; key.start = addr; lib = bsearch(&key, maps->lib_maps, maps->nr_lib_maps, sizeof(*maps->lib_maps), trace_pid_map_search); return lib; } static int handle_options(struct tracecmd_input *handle) { long long offset; unsigned short option; unsigned int size; char *cpustats = NULL; unsigned int cpustats_size = 0; struct input_buffer_instance *buffer; struct hook_list *hook; char *buf; int samples_size; int cpus; /* By default, use usecs, unless told otherwise */ handle->flags |= TRACECMD_FL_IN_USECS; for (;;) { if (do_read_check(handle, &option, 2)) return -1; if (option == TRACECMD_OPTION_DONE) break; /* next 4 bytes is the size of the option */ if (do_read_check(handle, &size, 4)) return -1; size = tep_read_number(handle->pevent, &size, 4); buf = malloc(size); if (!buf) return -ENOMEM; if (do_read_check(handle, buf, size)) return -1; switch (option) { case TRACECMD_OPTION_DATE: /* * A time has been mapped that is the * difference between the timestamps and * gtod. It is stored as ASCII with '0x' * appended. */ if (handle->flags & TRACECMD_FL_IGNORE_DATE) break; offset = strtoll(buf, NULL, 0); /* Convert from micro to nano */ offset *= 1000; handle->ts_offset += offset; break; case TRACECMD_OPTION_OFFSET: /* * Similar to date option, but just adds an * offset to the timestamp. */ if (handle->flags & TRACECMD_FL_IGNORE_DATE) break; offset = strtoll(buf, NULL, 0); handle->ts_offset += offset; break; case TRACECMD_OPTION_TIME_SHIFT: /* * long long int (8 bytes) trace session ID * int (4 bytes) protocol flags. * int (4 bytes) count of timestamp offsets. * long long array of size [count] of times, * when the offsets were calculated. * long long array of size [count] of timestamp offsets. * long long array of size [count] of timestamp scaling ratios.* */ if (size < 16 || handle->flags & TRACECMD_FL_IGNORE_DATE) break; handle->host.peer_trace_id = tep_read_number(handle->pevent, buf, 8); handle->host.flags = tep_read_number(handle->pevent, buf + 8, 4); handle->host.ts_samples_count = tep_read_number(handle->pevent, buf + 12, 4); samples_size = (8 * handle->host.ts_samples_count); if (size != (16 + (2 * samples_size))) { warning("Failed to extract Time Shift information from the file: found size %d, expected is %d", size, 16 + (2 * samples_size)); break; } handle->host.ts_samples = malloc(2 * samples_size); if (!handle->host.ts_samples) return -ENOMEM; tsync_offset_load(handle, buf + 16); tracecmd_enable_tsync(handle, true); break; case TRACECMD_OPTION_CPUSTAT: buf[size-1] = '\n'; cpustats = realloc(cpustats, cpustats_size + size + 1); if (!cpustats) return -ENOMEM; memcpy(cpustats + cpustats_size, buf, size); cpustats_size += size; cpustats[cpustats_size] = 0; break; case TRACECMD_OPTION_BUFFER: /* A buffer instance is saved at the end of the file */ handle->nr_buffers++; handle->buffers = realloc(handle->buffers, sizeof(*handle->buffers) * handle->nr_buffers); if (!handle->buffers) return -ENOMEM; buffer = &handle->buffers[handle->nr_buffers - 1]; buffer->name = strdup(buf + 8); if (!buffer->name) { free(handle->buffers); handle->buffers = NULL; return -ENOMEM; } offset = *(unsigned long long *)buf; buffer->offset = tep_read_number(handle->pevent, &offset, 8); break; case TRACECMD_OPTION_TRACECLOCK: if (!handle->ts2secs) handle->use_trace_clock = true; break; case TRACECMD_OPTION_UNAME: handle->uname = strdup(buf); break; case TRACECMD_OPTION_VERSION: handle->version = strdup(buf); break; case TRACECMD_OPTION_HOOK: hook = tracecmd_create_event_hook(buf); hook->next = handle->hooks; handle->hooks = hook; break; case TRACECMD_OPTION_CPUCOUNT: cpus = *(int *)buf; handle->cpus = tep_read_number(handle->pevent, &cpus, 4); break; case TRACECMD_OPTION_PROCMAPS: if (buf[size-1] == '\0') trace_pid_map_load(handle, buf); break; case TRACECMD_OPTION_TRACEID: if (size < 8) break; handle->trace_id = tep_read_number(handle->pevent, buf, 8); break; case TRACECMD_OPTION_GUEST: trace_guest_load(handle, buf, size); break; default: warning("unknown option %d", option); break; } free(buf); } handle->cpustats = cpustats; return 0; } static int read_options_type(struct tracecmd_input *handle) { char buf[10]; if (handle->file_state >= TRACECMD_FILE_CPU_LATENCY) return 0; if (do_read_check(handle, buf, 10)) return -1; /* check if this handles options */ if (strncmp(buf, "options", 7) == 0) { if (handle_options(handle) < 0) return -1; handle->file_state = TRACECMD_FILE_OPTIONS; if (do_read_check(handle, buf, 10)) return -1; } /* * Check if this is a latency report or flyrecord. */ if (strncmp(buf, "latency", 7) == 0) handle->file_state = TRACECMD_FILE_CPU_LATENCY; else if (strncmp(buf, "flyrecord", 9) == 0) handle->file_state = TRACECMD_FILE_CPU_FLYRECORD; else return -1; return 0; } static int read_cpu_data(struct tracecmd_input *handle) { struct tep_handle *pevent = handle->pevent; enum kbuffer_long_size long_size; enum kbuffer_endian endian; unsigned long long size; unsigned long long max_size = 0; unsigned long long pages; int cpus; int cpu; /* * Check if this is a latency report or not. */ if (handle->file_state == TRACECMD_FILE_CPU_LATENCY) return 1; /* We expect this to be flyrecord */ if (handle->file_state != TRACECMD_FILE_CPU_FLYRECORD) return -1; cpus = handle->cpus; handle->cpu_data = malloc(sizeof(*handle->cpu_data) * handle->cpus); if (!handle->cpu_data) return -1; memset(handle->cpu_data, 0, sizeof(*handle->cpu_data) * handle->cpus); if (force_read) handle->read_page = true; if (handle->long_size == 8) long_size = KBUFFER_LSIZE_8; else long_size = KBUFFER_LSIZE_4; if (tep_is_file_bigendian(handle->pevent)) endian = KBUFFER_ENDIAN_BIG; else endian = KBUFFER_ENDIAN_LITTLE; for (cpu = 0; cpu < handle->cpus; cpu++) { unsigned long long offset; handle->cpu_data[cpu].cpu = cpu; handle->cpu_data[cpu].kbuf = kbuffer_alloc(long_size, endian); if (!handle->cpu_data[cpu].kbuf) goto out_free; if (tep_is_old_format(pevent)) kbuffer_set_old_format(handle->cpu_data[cpu].kbuf); read8(handle, &offset); read8(handle, &size); handle->cpu_data[cpu].file_offset = offset; handle->cpu_data[cpu].file_size = size; if (size > max_size) max_size = size; if (size && (offset + size > handle->total_file_size)) { /* this happens if the file got truncated */ printf("File possibly truncated. " "Need at least %llu, but file size is %zu.\n", offset + size, handle->total_file_size); errno = EINVAL; goto out_free; } } /* Calculate about a meg of pages for buffering */ pages = handle->page_size ? max_size / handle->page_size : 0; if (!pages) pages = 1; pages = normalize_size(pages); handle->page_map_size = handle->page_size * pages; if (handle->page_map_size < handle->page_size) handle->page_map_size = handle->page_size; for (cpu = 0; cpu < handle->cpus; cpu++) { if (init_cpu(handle, cpu)) goto out_free; } /* * It is possible that an option changed the number of CPUs. * If that happened, then there's "empty" cpu data saved for * backward compatibility. */ if (cpus < handle->cpus) { unsigned long long ignore; int once = 0; read8(handle, &ignore); /* offset */ read8(handle, &ignore); /* size */ if (ignore != 0) { if (!once) { warning("ignored CPU data not zero size"); once++; } } } return 0; out_free: for ( ; cpu >= 0; cpu--) { free_page(handle, cpu); kbuffer_free(handle->cpu_data[cpu].kbuf); handle->cpu_data[cpu].kbuf = NULL; } return -1; } static int read_data_and_size(struct tracecmd_input *handle, char **data, unsigned long long *size) { if (read8(handle, size) < 0) return -1; *data = malloc(*size + 1); if (!*data) return -1; if (do_read_check(handle, *data, *size)) { free(*data); return -1; } return 0; } static int read_and_parse_cmdlines(struct tracecmd_input *handle) { struct tep_handle *pevent = handle->pevent; unsigned long long size; char *cmdlines; if (handle->file_state >= TRACECMD_FILE_CMD_LINES) return 0; if (read_data_and_size(handle, &cmdlines, &size) < 0) return -1; cmdlines[size] = 0; tracecmd_parse_cmdlines(pevent, cmdlines, size); free(cmdlines); handle->file_state = TRACECMD_FILE_CMD_LINES; return 0; } static void extract_trace_clock(struct tracecmd_input *handle, char *line) { char *clock = NULL; char *next = NULL; char *data; data = strtok_r(line, "[]", &next); sscanf(data, "%ms", &clock); /* TODO: report if it fails to allocate */ handle->trace_clock = clock; if (!clock) return; /* Clear usecs if not one of the specified clocks */ if (strcmp(clock, "local") && strcmp(clock, "global") && strcmp(clock, "uptime") && strcmp(clock, "perf") && strncmp(clock, "mono", 4)) handle->flags &= ~TRACECMD_FL_IN_USECS; } void tracecmd_parse_trace_clock(struct tracecmd_input *handle, char *file, int size __maybe_unused) { char *line; char *next = NULL; line = strtok_r(file, " ", &next); while (line) { /* current trace_clock is shown as "[local]". */ if (*line == '[') return extract_trace_clock(handle, line); line = strtok_r(NULL, " ", &next); } } static int read_and_parse_trace_clock(struct tracecmd_input *handle, struct tep_handle *pevent) { unsigned long long size; char *trace_clock; if (read_data_and_size(handle, &trace_clock, &size) < 0) return -1; trace_clock[size] = 0; tracecmd_parse_trace_clock(handle, trace_clock, size); free(trace_clock); return 0; } /** * tracecmd_init_data - prepare reading the data from trace.dat * @handle: input handle for the trace.dat file * * This prepares reading the data from trace.dat. This is called * after tracecmd_read_headers() and before tracecmd_read_data(). */ int tracecmd_init_data(struct tracecmd_input *handle) { struct tep_handle *pevent = handle->pevent; int ret; ret = read_cpu_data(handle); if (ret < 0) return ret; if (handle->use_trace_clock) { /* * There was a bug in the original setting of * the trace_clock file which let it get * corrupted. If it fails to read, force local * clock. */ if (read_and_parse_trace_clock(handle, pevent) < 0) { char clock[] = "[local]"; warning("File has trace_clock bug, using local clock"); tracecmd_parse_trace_clock(handle, clock, 8); } } tracecmd_blk_hack(handle); return ret; } /** * tracecmd_make_pipe - Have the handle read a pipe instead of a file * @handle: input handle to read from a pipe * @cpu: the cpu that the pipe represents * @fd: the read end of the pipe * @cpus: the total number of cpus for this handle * * In order to stream data from the binary trace files and produce * output or analyze the data, a tracecmd_input descriptor needs to * be created, and then converted into a form that can act on a * pipe. * * Note, there are limitations to what this descriptor can do. * Most notibly, it can not read backwards. Once a page is read * it can not be read at a later time (except if a record is attached * to it and is holding the page ref). * * It is expected that the handle has already been created and * tracecmd_read_headers() has run on it. */ int tracecmd_make_pipe(struct tracecmd_input *handle, int cpu, int fd, int cpus) { enum kbuffer_long_size long_size; enum kbuffer_endian endian; handle->read_page = true; handle->use_pipe = true; if (!handle->cpus) { handle->cpus = cpus; handle->cpu_data = malloc(sizeof(*handle->cpu_data) * handle->cpus); if (!handle->cpu_data) return -1; } if (cpu >= handle->cpus) return -1; if (handle->long_size == 8) long_size = KBUFFER_LSIZE_8; else long_size = KBUFFER_LSIZE_4; if (tep_is_file_bigendian(handle->pevent)) endian = KBUFFER_ENDIAN_BIG; else endian = KBUFFER_ENDIAN_LITTLE; memset(&handle->cpu_data[cpu], 0, sizeof(handle->cpu_data[cpu])); handle->cpu_data[cpu].pipe_fd = fd; handle->cpu_data[cpu].cpu = cpu; handle->cpu_data[cpu].kbuf = kbuffer_alloc(long_size, endian); if (!handle->cpu_data[cpu].kbuf) return -1; if (tep_is_old_format(handle->pevent)) kbuffer_set_old_format(handle->cpu_data[cpu].kbuf); handle->cpu_data[cpu].file_offset = 0; handle->cpu_data[cpu].file_size = -1; init_cpu(handle, cpu); return 0; } /** * tracecmd_print_events - print the events that are stored in trace.dat * @handle: input handle for the trace.dat file * @regex: regex of events to print (NULL is all events) * * This is a debugging routine to print out the events that * are stored in a given trace.dat file. */ void tracecmd_print_events(struct tracecmd_input *handle, const char *regex) { int ret; if (!regex) regex = ".*"; if (!handle->ftrace_files_start) { lseek64(handle->fd, handle->header_files_start, SEEK_SET); read_header_files(handle); } ret = read_ftrace_files(handle, regex); if (ret < 0) return; read_event_files(handle, regex); return; } /* Show the cpu data stats */ static void show_cpu_stats(struct tracecmd_input *handle) { struct cpu_data *cpu_data; int i; for (i = 0; i < handle->cpus; i++) { cpu_data = &handle->cpu_data[i]; printf("CPU%d data recorded at offset=0x%llx\n", i, cpu_data->file_offset); printf(" %lld bytes in size\n", cpu_data->file_size); } } /** * tracecmd_print_stats - prints the stats recorded in the options. * @handle: input handle for the trace.dat file * * Looks for the option TRACECMD_OPTION_CPUSTAT and prints out what's * stored there, if it is found. Otherwise it prints that none were found. */ void tracecmd_print_stats(struct tracecmd_input *handle) { if (handle->cpustats) printf("%s\n", handle->cpustats); else printf(" No stats in this file\n"); show_cpu_stats(handle); } /** * tracecmd_print_uname - prints the recorded uname if it was recorded * @handle: input handle for the trace.dat file * * Looks for the option TRACECMD_OPTION_UNAME and prints out what's * stored there, if it is found. Otherwise it prints that none were found. */ void tracecmd_print_uname(struct tracecmd_input *handle) { if (handle->uname) printf("%s\n", handle->uname); else printf(" uname was not recorded in this file\n"); } /** * tracecmd_print_uname - prints the recorded uname if it was recorded * @handle: input handle for the trace.dat file * * Looks for the option TRACECMD_OPTION_VERSION and prints out what's * stored there, if it is found. Otherwise it prints that none were found. */ void tracecmd_print_version(struct tracecmd_input *handle) { if (handle->version) printf("%s\n", handle->version); else printf(" version was not recorded in this file\n"); } /** * tracecmd_hooks - return the event hooks that were used in record * @handle: input handle for the trace.dat file * * If trace-cmd record used -H to save hooks, they are parsed and * presented as hooks here. * * Returns the hook list (do not free it, they are freed on close) */ struct hook_list *tracecmd_hooks(struct tracecmd_input *handle) { return handle->hooks; } /** * tracecmd_alloc_fd - create a tracecmd_input handle from a file descriptor * @fd: the file descriptor for the trace.dat file * @flags: bitmask of enum tracecmd_open_flags * * Allocate a tracecmd_input handle from a file descriptor and open the * file. This tests if the file is of trace-cmd format and allocates * a parse event descriptor. * * The returned pointer is not ready to be read yet. A tracecmd_read_headers() * and tracecmd_init_data() still need to be called on the descriptor. * * Unless you know what you are doing with this, you want to use * tracecmd_open_fd() instead. */ struct tracecmd_input *tracecmd_alloc_fd(int fd, int flags) { struct tracecmd_input *handle; char test[] = TRACECMD_MAGIC; unsigned int page_size; char *version; char buf[BUFSIZ]; unsigned long ver; handle = malloc(sizeof(*handle)); if (!handle) return NULL; memset(handle, 0, sizeof(*handle)); handle->fd = fd; handle->ref = 1; if (do_read_check(handle, buf, 3)) goto failed_read; if (memcmp(buf, test, 3) != 0) goto failed_read; if (do_read_check(handle, buf, 7)) goto failed_read; if (memcmp(buf, "tracing", 7) != 0) goto failed_read; version = read_string(handle); if (!version) goto failed_read; pr_info("version = %s\n", version); ver = strtol(version, NULL, 10); if (!ver) goto failed_read; if (!tracecmd_is_version_supported(ver)) { warning("Unsupported file version %lu", ver); goto failed_read; } handle->file_version = ver; free(version); if (do_read_check(handle, buf, 1)) goto failed_read; handle->pevent = tep_alloc(); if (!handle->pevent) goto failed_read; /* register default ftrace functions first */ if (!(flags & TRACECMD_FL_LOAD_NO_PLUGINS) && !(flags & TRACECMD_FL_LOAD_NO_SYSTEM_PLUGINS)) tracecmd_ftrace_overrides(handle, &handle->finfo); handle->plugin_list = trace_load_plugins(handle->pevent, flags); tep_set_file_bigendian(handle->pevent, buf[0]); tep_set_local_bigendian(handle->pevent, tracecmd_host_bigendian()); do_read_check(handle, buf, 1); handle->long_size = buf[0]; read4(handle, &page_size); handle->page_size = page_size; handle->header_files_start = lseek64(handle->fd, 0, SEEK_CUR); handle->total_file_size = lseek64(handle->fd, 0, SEEK_END); handle->header_files_start = lseek64(handle->fd, handle->header_files_start, SEEK_SET); handle->file_state = TRACECMD_FILE_INIT; return handle; failed_read: free(handle); return NULL; } /** * tracecmd_alloc_fd - create a tracecmd_input handle from a file name * @file: the file name of the file that is of tracecmd data type. * @flags: bitmask of enum tracecmd_open_flags * * Allocate a tracecmd_input handle from a given file name and open the * file. This tests if the file is of trace-cmd format and allocates * a parse event descriptor. * * The returned pointer is not ready to be read yet. A tracecmd_read_headers() * and tracecmd_init_data() still need to be called on the descriptor. * * Unless you know what you are doing with this, you want to use * tracecmd_open() instead. */ struct tracecmd_input *tracecmd_alloc(const char *file, int flags) { int fd; fd = open(file, O_RDONLY); if (fd < 0) return NULL; return tracecmd_alloc_fd(fd, flags); } /** * tracecmd_open_fd - create a tracecmd_handle from the trace.dat file descriptor * @fd: the file descriptor for the trace.dat file * @flags: bitmask of enum tracecmd_open_flags */ struct tracecmd_input *tracecmd_open_fd(int fd, int flags) { struct tracecmd_input *handle; int ret; handle = tracecmd_alloc_fd(fd, flags); if (!handle) return NULL; if (tracecmd_read_headers(handle, 0) < 0) goto fail; if ((ret = tracecmd_init_data(handle)) < 0) goto fail; return handle; fail: tracecmd_close(handle); return NULL; } /** * tracecmd_open - create a tracecmd_handle from a given file * @file: the file name of the file that is of tracecmd data type. * @flags: bitmask of enum tracecmd_open_flags */ struct tracecmd_input *tracecmd_open(const char *file, int flags) { int fd; fd = open(file, O_RDONLY); if (fd < 0) return NULL; return tracecmd_open_fd(fd, flags); } /** * tracecmd_open_head - create a tracecmd_handle from a given file, read * and parse only the trace headers from the file * @file: the file name of the file that is of tracecmd data type. * @flags: bitmask of enum tracecmd_open_flags */ struct tracecmd_input *tracecmd_open_head(const char *file, int flags) { struct tracecmd_input *handle; int fd; fd = open(file, O_RDONLY); if (fd < 0) return NULL; handle = tracecmd_alloc_fd(fd, flags); if (!handle) return NULL; if (tracecmd_read_headers(handle, 0) < 0) goto fail; return handle; fail: tracecmd_close(handle); return NULL; } /** * tracecmd_ref - add a reference to the handle * @handle: input handle for the trace.dat file * * Some applications may share a handle between parts of * the application. Let those parts add reference counters * to the handle, and the last one to close it will free it. */ void tracecmd_ref(struct tracecmd_input *handle) { if (!handle) return; handle->ref++; } /** * tracecmd_close - close and free the trace.dat handle * @handle: input handle for the trace.dat file * * Close the file descriptor of the handle and frees * the resources allocated by the handle. */ void tracecmd_close(struct tracecmd_input *handle) { int cpu; if (!handle) return; if (handle->ref <= 0) { warning("tracecmd: bad ref count on handle\n"); return; } if (--handle->ref) return; for (cpu = 0; cpu < handle->cpus; cpu++) { /* The tracecmd_peek_data may have cached a record */ free_next(handle, cpu); free_page(handle, cpu); if (handle->cpu_data && handle->cpu_data[cpu].kbuf) { kbuffer_free(handle->cpu_data[cpu].kbuf); if (handle->cpu_data[cpu].page_map) free_page_map(handle->cpu_data[cpu].page_map); if (handle->cpu_data[cpu].page_cnt) warning("%d pages still allocated on cpu %d%s", handle->cpu_data[cpu].page_cnt, cpu, show_records(handle->cpu_data[cpu].pages, handle->cpu_data[cpu].nr_pages)); free(handle->cpu_data[cpu].pages); } } free(handle->cpustats); free(handle->cpu_data); free(handle->uname); free(handle->trace_clock); close(handle->fd); tracecmd_free_hooks(handle->hooks); handle->hooks = NULL; trace_pid_map_free(handle->pid_maps); handle->pid_maps = NULL; trace_tsync_offset_free(&handle->host); trace_guests_free(handle); if (handle->flags & TRACECMD_FL_BUFFER_INSTANCE) tracecmd_close(handle->parent); else { /* Only main handle frees plugins and pevent */ tep_unload_plugins(handle->plugin_list, handle->pevent); tep_free(handle->pevent); } free(handle); } static int read_copy_size8(struct tracecmd_input *handle, int fd, unsigned long long *size) { /* read size */ if (do_read_check(handle, size, 8)) return -1; if (__do_write_check(fd, size, 8)) return -1; *size = tep_read_number(handle->pevent, size, 8); return 0; } static int read_copy_size4(struct tracecmd_input *handle, int fd, unsigned int *size) { /* read size */ if (do_read_check(handle, size, 4)) return -1; if (__do_write_check(fd, size, 4)) return -1; *size = tep_read_number(handle->pevent, size, 4); return 0; } static int read_copy_data(struct tracecmd_input *handle, unsigned long long size, int fd) { char *buf; buf = malloc(size); if (!buf) return -1; if (do_read_check(handle, buf, size)) goto failed_read; if (__do_write_check(fd, buf, size)) goto failed_read; free(buf); return 0; failed_read: free(buf); return -1; } static int copy_header_files(struct tracecmd_input *handle, int fd) { unsigned long long size; if (handle->file_state != TRACECMD_FILE_HEADERS - 1) return -1; /* "header_page" */ if (read_copy_data(handle, 12, fd) < 0) return -1; if (read_copy_size8(handle, fd, &size) < 0) return -1; if (read_copy_data(handle, size, fd) < 0) return -1; /* "header_event" */ if (read_copy_data(handle, 13, fd) < 0) return -1; if (read_copy_size8(handle, fd, &size) < 0) return -1; if (read_copy_data(handle, size, fd) < 0) return -1; handle->file_state = TRACECMD_FILE_HEADERS; return 0; } static int copy_ftrace_files(struct tracecmd_input *handle, int fd) { unsigned long long size; unsigned int count; unsigned int i; if (handle->file_state != TRACECMD_FILE_FTRACE_EVENTS - 1) return -1; if (read_copy_size4(handle, fd, &count) < 0) return -1; for (i = 0; i < count; i++) { if (read_copy_size8(handle, fd, &size) < 0) return -1; if (read_copy_data(handle, size, fd) < 0) return -1; } handle->file_state = TRACECMD_FILE_FTRACE_EVENTS; return 0; } static int copy_event_files(struct tracecmd_input *handle, int fd) { unsigned long long size; char *system; unsigned int systems; unsigned int count; unsigned int i,x; if (handle->file_state != TRACECMD_FILE_ALL_EVENTS - 1) return -1; if (read_copy_size4(handle, fd, &systems) < 0) return -1; for (i = 0; i < systems; i++) { system = read_string(handle); if (!system) return -1; if (__do_write_check(fd, system, strlen(system) + 1)) { free(system); return -1; } free(system); if (read_copy_size4(handle, fd, &count) < 0) return -1; for (x=0; x < count; x++) { if (read_copy_size8(handle, fd, &size) < 0) return -1; if (read_copy_data(handle, size, fd) < 0) return -1; } } handle->file_state = TRACECMD_FILE_ALL_EVENTS; return 0; } static int copy_proc_kallsyms(struct tracecmd_input *handle, int fd) { unsigned int size; if (handle->file_state != TRACECMD_FILE_KALLSYMS - 1) return -1; if (read_copy_size4(handle, fd, &size) < 0) return -1; if (!size) return 0; /* OK? */ if (read_copy_data(handle, size, fd) < 0) return -1; handle->file_state = TRACECMD_FILE_KALLSYMS; return 0; } static int copy_ftrace_printk(struct tracecmd_input *handle, int fd) { unsigned int size; if (handle->file_state != TRACECMD_FILE_PRINTK - 1) return -1; if (read_copy_size4(handle, fd, &size) < 0) return -1; if (!size) return 0; /* OK? */ if (read_copy_data(handle, size, fd) < 0) return -1; handle->file_state = TRACECMD_FILE_PRINTK; return 0; } static int copy_command_lines(struct tracecmd_input *handle, int fd) { unsigned long long size; if (handle->file_state != TRACECMD_FILE_CMD_LINES - 1) return -1; if (read_copy_size8(handle, fd, &size) < 0) return -1; if (!size) return 0; /* OK? */ if (read_copy_data(handle, size, fd) < 0) return -1; handle->file_state = TRACECMD_FILE_CMD_LINES; return 0; } /** * tracecmd_copy_headers - Copy headers from a tracecmd_input handle to a file descriptor * @handle: input handle for the trace.dat file to copy from. * @fd: The file descriptor to copy to. * @start_state: The file state to start copying from (zero for the beginnig) * @end_state: The file state to stop at (zero for up to cmdlines) * * This is used to copy trace header data of a trace.dat file to a * file descriptor. Using @start_state and @end_state it may be used * multiple times against the input handle. * * NOTE: The input handle is also modified, and ends at the end * state as well. */ int tracecmd_copy_headers(struct tracecmd_input *handle, int fd, enum tracecmd_file_states start_state, enum tracecmd_file_states end_state) { int ret; if (!start_state) start_state = TRACECMD_FILE_HEADERS; if (!end_state) end_state = TRACECMD_FILE_CMD_LINES; if (start_state > end_state) return -1; if (end_state < TRACECMD_FILE_HEADERS) return 0; if (handle->file_state >= start_state) { /* Set the handle to just before the start state */ lseek64(handle->fd, handle->header_files_start, SEEK_SET); /* Now that the file handle has moved, change its state */ handle->file_state = TRACECMD_FILE_INIT; } /* Try to bring the input up to the start state - 1 */ ret = tracecmd_read_headers(handle, start_state - 1); if (ret < 0) goto out; switch (start_state) { case TRACECMD_FILE_HEADERS: ret = copy_header_files(handle, fd); if (ret < 0) goto out; /* fallthrough */ case TRACECMD_FILE_FTRACE_EVENTS: /* handle's state is now updating with the copies */ if (end_state <= handle->file_state) return 0; ret = copy_ftrace_files(handle, fd); if (ret < 0) goto out; /* fallthrough */ case TRACECMD_FILE_ALL_EVENTS: if (end_state <= handle->file_state) return 0; ret = copy_event_files(handle, fd); if (ret < 0) goto out; /* fallthrough */ case TRACECMD_FILE_KALLSYMS: if (end_state <= handle->file_state) return 0; ret = copy_proc_kallsyms(handle, fd); if (ret < 0) goto out; /* fallthrough */ case TRACECMD_FILE_PRINTK: if (end_state <= handle->file_state) return 0; ret = copy_ftrace_printk(handle, fd); if (ret < 0) goto out; /* fallthrough */ case TRACECMD_FILE_CMD_LINES: if (end_state <= handle->file_state) return 0; ret = copy_command_lines(handle, fd); default: break; } out: return ret < 0 ? -1 : 0; } /** * tracecmd_record_at_buffer_start - return true if record is first on subbuffer * @handle: input handle for the trace.dat file * @record: The record to test if it is the first record on page * * Returns true if the record is the first record on the page. */ int tracecmd_record_at_buffer_start(struct tracecmd_input *handle, struct tep_record *record) { struct page *page = record->priv; struct kbuffer *kbuf = handle->cpu_data[record->cpu].kbuf; int offset; if (!page || !kbuf) return 0; offset = record->offset - page->offset; return offset == kbuffer_start_of_data(kbuf); } unsigned long long tracecmd_page_ts(struct tracecmd_input *handle, struct tep_record *record) { struct page *page = record->priv; struct kbuffer *kbuf = handle->cpu_data[record->cpu].kbuf; if (!page || !kbuf) return 0; return kbuffer_subbuf_timestamp(kbuf, page->map); } unsigned int tracecmd_record_ts_delta(struct tracecmd_input *handle, struct tep_record *record) { struct kbuffer *kbuf = handle->cpu_data[record->cpu].kbuf; struct page *page = record->priv; int offset; if (!page || !kbuf) return 0; offset = record->offset - page->offset; return kbuffer_ptr_delta(kbuf, page->map + offset); } struct kbuffer *tracecmd_record_kbuf(struct tracecmd_input *handle, struct tep_record *record) { return handle->cpu_data[record->cpu].kbuf; } void *tracecmd_record_page(struct tracecmd_input *handle, struct tep_record *record) { struct page *page = record->priv; return page ? page->map : NULL; } void *tracecmd_record_offset(struct tracecmd_input *handle, struct tep_record *record) { struct page *page = record->priv; int offset; if (!page) return NULL; offset = record->offset - page->offset; return page->map + offset; } int tracecmd_buffer_instances(struct tracecmd_input *handle) { return handle->nr_buffers; } const char *tracecmd_buffer_instance_name(struct tracecmd_input *handle, int indx) { if (indx >= handle->nr_buffers) return NULL; return handle->buffers[indx].name; } struct tracecmd_input * tracecmd_buffer_instance_handle(struct tracecmd_input *handle, int indx) { struct tracecmd_input *new_handle; struct input_buffer_instance *buffer = &handle->buffers[indx]; size_t offset; ssize_t ret; if (indx >= handle->nr_buffers) return NULL; /* * We make a copy of the current handle, but we substitute * the cpu data with the cpu data for this buffer. */ new_handle = malloc(sizeof(*handle)); if (!new_handle) return NULL; *new_handle = *handle; new_handle->cpu_data = NULL; new_handle->nr_buffers = 0; new_handle->buffers = NULL; new_handle->ref = 1; if (handle->trace_clock) { new_handle->trace_clock = strdup(handle->trace_clock); if (!new_handle->trace_clock) { free(new_handle); return NULL; } } memset(&new_handle->host, 0, sizeof(new_handle->host)); new_handle->parent = handle; new_handle->cpustats = NULL; new_handle->hooks = NULL; if (handle->uname) /* Ignore if fails to malloc, no biggy */ new_handle->uname = strdup(handle->uname); tracecmd_ref(handle); new_handle->fd = dup(handle->fd); new_handle->flags |= TRACECMD_FL_BUFFER_INSTANCE; new_handle->pid_maps = NULL; /* Save where we currently are */ offset = lseek64(handle->fd, 0, SEEK_CUR); ret = lseek64(handle->fd, buffer->offset, SEEK_SET); if (ret < 0) { warning("could not seek to buffer %s offset %ld\n", buffer->name, buffer->offset); goto error; } /* * read_options_type() is called right after the CPU count so update * file state accordingly. */ new_handle->file_state = TRACECMD_FILE_CPU_COUNT; ret = read_options_type(new_handle); if (!ret) ret = read_cpu_data(new_handle); if (ret < 0) { warning("failed to read sub buffer %s\n", buffer->name); goto error; } ret = lseek64(handle->fd, offset, SEEK_SET); if (ret < 0) { warning("could not seek to back to offset %ld\n", offset); goto error; } return new_handle; error: tracecmd_close(new_handle); return NULL; } int tracecmd_is_buffer_instance(struct tracecmd_input *handle) { return handle->flags & TRACECMD_FL_BUFFER_INSTANCE; } /** * tracecmd_long_size - return the size of "long" for the arch * @handle: input handle for the trace.dat file */ int tracecmd_long_size(struct tracecmd_input *handle) { return handle->long_size; } /** * tracecmd_page_size - return the PAGE_SIZE for the arch * @handle: input handle for the trace.dat file */ int tracecmd_page_size(struct tracecmd_input *handle) { return handle->page_size; } /** * tracecmd_page_size - return the number of CPUs recorded * @handle: input handle for the trace.dat file */ int tracecmd_cpus(struct tracecmd_input *handle) { return handle->cpus; } /** * tracecmd_get_tep - return the tep handle * @handle: input handle for the trace.dat file */ struct tep_handle *tracecmd_get_tep(struct tracecmd_input *handle) { return handle->pevent; } /** * tracecmd_get_use_trace_clock - return use_trace_clock * @handle: input handle for the trace.dat file */ bool tracecmd_get_use_trace_clock(struct tracecmd_input *handle) { return handle->use_trace_clock; } /** * tracecmd_get_show_data_func - return the show data func * @handle: input handle for the trace.dat file */ tracecmd_show_data_func tracecmd_get_show_data_func(struct tracecmd_input *handle) { return handle->show_data_func; } /** * tracecmd_set_show_data_func - set the show data func * @handle: input handle for the trace.dat file */ void tracecmd_set_show_data_func(struct tracecmd_input *handle, tracecmd_show_data_func func) { handle->show_data_func = func; } /** * tracecmd_get_traceid - get the trace id of the session * @handle: input handle for the trace.dat file * * Returns the trace id, written in the trace file */ unsigned long long tracecmd_get_traceid(struct tracecmd_input *handle) { return handle->trace_id; } /** * tracecmd_get_guest_cpumap - get the mapping of guest VCPU to host process * @handle: input handle for the trace.dat file * @trace_id: ID of the guest tracing session * @name: return, name of the guest * @vcpu_count: return, number of VPUs * @cpu_pid: return, array with guest VCPU to host process mapping * * Returns @name of the guest, number of VPUs (@vcpu_count) * and array @cpu_pid with size @vcpu_count. Array index is VCPU id, array * content is PID of the host process, running this VCPU. * * This information is stored in host trace.dat file */ int tracecmd_get_guest_cpumap(struct tracecmd_input *handle, unsigned long long trace_id, const char **name, int *vcpu_count, const int **cpu_pid) { struct guest_trace_info *guest = handle->guest; while (guest) { if (guest->trace_id == trace_id) break; guest = guest->next; } if (!guest) return -1; if (name) *name = guest->name; if (vcpu_count) *vcpu_count = guest->vcpu_count; if (cpu_pid) *cpu_pid = guest->cpu_pid; return 0; } /** * tracecmd_enable_tsync - enable / disable the timestamps correction * @handle: input handle for the trace.dat file * @enable: enable / disable the timestamps correction * * Enables or disables timestamps correction on file load, using the array of * recorded time offsets. If "enable" is true, but there are no time offsets, * function fails and -1 is returned. * * Returns -1 in case of an error, or 0 otherwise */ int tracecmd_enable_tsync(struct tracecmd_input *handle, bool enable) { if (enable && (!handle->host.ts_samples || !handle->host.ts_samples_count)) return -1; handle->host.sync_enable = enable; return 0; } trace-cmd-v2.9.6/lib/trace-cmd/trace-msg.c000066400000000000000000000671011414302661500202170ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * trace-msg.c : define message protocol for communication between clients and * a server * * Copyright (C) 2013 Hitachi, Ltd. * Created by Yoshihiro YUNOMAE * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "trace-write-local.h" #include "trace-cmd-local.h" #include "trace-local.h" #include "trace-msg.h" #include "trace-cmd.h" typedef __u32 u32; typedef __be32 be32; static inline void dprint(const char *fmt, ...) { va_list ap; if (!tracecmd_get_debug()) return; va_start(ap, fmt); vprintf(fmt, ap); va_end(ap); } /* Two (4k) pages is the max transfer for now */ #define MSG_MAX_LEN 8192 #define MSG_HDR_LEN sizeof(struct tracecmd_msg_header) #define MSG_MAX_DATA_LEN (MSG_MAX_LEN - MSG_HDR_LEN) unsigned int page_size; struct tracecmd_msg_tinit { be32 cpus; be32 page_size; be32 opt_num; } __packed; struct tracecmd_msg_rinit { be32 cpus; } __packed; #define TRACE_REQ_PARAM_SIZE (2 * sizeof(int)) enum trace_req_params { TRACE_REQUEST_ARGS, TRACE_REQUEST_TSYNC_PROTOS, }; struct tracecmd_msg_trace_req_param { int id; int length; char *value; }; struct tracecmd_msg_trace_req { be32 flags; be32 argc; u64 trace_id; } __packed; struct tracecmd_msg_trace_resp { be32 flags; be32 cpus; be32 page_size; u64 trace_id; char tsync_proto_name[TRACECMD_TSYNC_PNAME_LENGTH]; be32 tsync_port; } __packed; struct tracecmd_msg_tsync { char sync_protocol_name[TRACECMD_TSYNC_PNAME_LENGTH]; be32 sync_msg_id; } __packed; struct tracecmd_msg_header { be32 size; be32 cmd; be32 cmd_size; } __packed; #define MSG_MAP \ C(CLOSE, 0, 0), \ C(TINIT, 1, sizeof(struct tracecmd_msg_tinit)), \ C(RINIT, 2, sizeof(struct tracecmd_msg_rinit)), \ C(SEND_DATA, 3, 0), \ C(FIN_DATA, 4, 0), \ C(NOT_SUPP, 5, 0), \ C(TRACE_REQ, 6, sizeof(struct tracecmd_msg_trace_req)), \ C(TRACE_RESP, 7, sizeof(struct tracecmd_msg_trace_resp)),\ C(CLOSE_RESP, 8, 0), \ C(TIME_SYNC, 9, sizeof(struct tracecmd_msg_tsync)), #undef C #define C(a,b,c) MSG_##a = b enum tracecmd_msg_cmd { MSG_MAP MSG_NR_COMMANDS }; #undef C #define C(a,b,c) c static be32 msg_cmd_sizes[] = { MSG_MAP }; #undef C #define C(a,b,c) #a static const char *msg_names[] = { MSG_MAP }; static const char *cmd_to_name(int cmd) { if (cmd < 0 || cmd >= MSG_NR_COMMANDS) return "Unknown"; return msg_names[cmd]; } struct tracecmd_msg { struct tracecmd_msg_header hdr; union { struct tracecmd_msg_tinit tinit; struct tracecmd_msg_rinit rinit; struct tracecmd_msg_trace_req trace_req; struct tracecmd_msg_trace_resp trace_resp; struct tracecmd_msg_tsync tsync; }; char *buf; } __packed; static inline int msg_buf_len(struct tracecmd_msg *msg) { return ntohl(msg->hdr.size) - MSG_HDR_LEN - ntohl(msg->hdr.cmd_size); } static int msg_write(int fd, struct tracecmd_msg *msg) { int cmd = ntohl(msg->hdr.cmd); int msg_size, data_size; int ret; if (cmd < 0 || cmd >= MSG_NR_COMMANDS) return -EINVAL; dprint("msg send: %d (%s) [%d]\n", cmd, cmd_to_name(cmd), ntohl(msg->hdr.size)); msg_size = MSG_HDR_LEN + ntohl(msg->hdr.cmd_size); data_size = ntohl(msg->hdr.size) - msg_size; if (data_size < 0) return -EINVAL; ret = __do_write_check(fd, msg, msg_size); if (ret < 0) return ret; if (!data_size) return 0; return __do_write_check(fd, msg->buf, data_size); } enum msg_trace_flags { MSG_TRACE_USE_FIFOS = 1 << 0, }; static int make_tinit(struct tracecmd_msg_handle *msg_handle, struct tracecmd_msg *msg) { int cpu_count = msg_handle->cpu_count; int opt_num = 0; int data_size = 0; if (msg_handle->flags & TRACECMD_MSG_FL_USE_TCP) { opt_num++; msg->buf = strdup("tcp"); data_size += 4; } msg->tinit.cpus = htonl(cpu_count); msg->tinit.page_size = htonl(page_size); msg->tinit.opt_num = htonl(opt_num); msg->hdr.size = htonl(ntohl(msg->hdr.size) + data_size); return 0; } /* test a to u */ static int tatou(const char *s, unsigned int *res) { long r; r = atol(s); if (r >= 0 && r <= UINT_MAX) { *res = (unsigned int)r; return 0; } return -1; } static int write_uints(char *buf, size_t buf_len, unsigned int *arr, int arr_len) { int i, ret, tot = 0; for (i = 0; i < arr_len; i++) { ret = snprintf(buf, buf_len, "%u", arr[i]); if (ret < 0) return ret; /* Count the '\0' byte */ ret++; tot += ret; if (buf) buf += ret; if (buf_len >= ret) buf_len -= ret; else buf_len = 0; } return tot; } static int make_rinit(struct tracecmd_msg *msg, int cpus, unsigned int *ports) { int data_size; data_size = write_uints(NULL, 0, ports, cpus); msg->buf = malloc(data_size); if (!msg->buf) return -ENOMEM; write_uints(msg->buf, data_size, ports, cpus); msg->rinit.cpus = htonl(cpus); msg->hdr.size = htonl(ntohl(msg->hdr.size) + data_size); return 0; } static void tracecmd_msg_init(u32 cmd, struct tracecmd_msg *msg) { memset(msg, 0, sizeof(*msg)); msg->hdr.size = htonl(MSG_HDR_LEN + msg_cmd_sizes[cmd]); msg->hdr.cmd = htonl(cmd); msg->hdr.cmd_size = htonl(msg_cmd_sizes[cmd]); } static void msg_free(struct tracecmd_msg *msg) { free(msg->buf); memset(msg, 0, sizeof(*msg)); } static int tracecmd_msg_send(int fd, struct tracecmd_msg *msg) { int ret = 0; ret = msg_write(fd, msg); if (ret < 0) ret = -ECOMM; msg_free(msg); return ret; } static int msg_send_nofree(int fd, struct tracecmd_msg *msg) { int ret = 0; ret = msg_write(fd, msg); if (ret < 0) ret = -ECOMM; return ret; } static int msg_read(int fd, void *buf, u32 size, int *n) { ssize_t r; while (size) { r = read(fd, buf + *n, size); if (r < 0) { if (errno == EINTR) continue; return -errno; } else if (!r) return -ENOTCONN; size -= r; *n += r; } return 0; } static char scratch_buf[MSG_MAX_LEN]; static int msg_read_extra(int fd, struct tracecmd_msg *msg, int *n, int size) { int cmd, cmd_size, rsize; int ret; cmd = ntohl(msg->hdr.cmd); if (cmd < 0 || cmd >= MSG_NR_COMMANDS) return -EINVAL; cmd_size = ntohl(msg->hdr.cmd_size); if (cmd_size < 0) return -EINVAL; if (cmd_size > 0) { rsize = cmd_size; if (rsize > msg_cmd_sizes[cmd]) rsize = msg_cmd_sizes[cmd]; ret = msg_read(fd, msg, rsize, n); if (ret < 0) return ret; ret = msg_read(fd, scratch_buf, cmd_size - rsize, n); if (ret < 0) return ret; } if (size > *n) { size -= *n; msg->buf = malloc(size); if (!msg->buf) return -ENOMEM; *n = 0; return msg_read(fd, msg->buf, size, n); } return 0; } /* * Read header information of msg first, then read all data */ static int tracecmd_msg_recv(int fd, struct tracecmd_msg *msg) { u32 size = 0; int n = 0; int ret; ret = msg_read(fd, msg, MSG_HDR_LEN, &n); if (ret < 0) return ret; dprint("msg received: %d (%s) [%d]\n", ntohl(msg->hdr.cmd), cmd_to_name(ntohl(msg->hdr.cmd)), ntohl(msg->hdr.size)); size = ntohl(msg->hdr.size); if (size > MSG_MAX_LEN) /* too big */ goto error; else if (size < MSG_HDR_LEN) /* too small */ goto error; else if (size > MSG_HDR_LEN) return msg_read_extra(fd, msg, &n, size); return 0; error: tracecmd_plog("Receive an invalid message(size=%d)\n", size); return -ENOMSG; } #define MSG_WAIT_MSEC 5000 static int msg_wait_to = MSG_WAIT_MSEC; bool tracecmd_msg_done(struct tracecmd_msg_handle *msg_handle) { return (volatile int)msg_handle->done; } void tracecmd_msg_set_done(struct tracecmd_msg_handle *msg_handle) { msg_handle->done = true; } static void error_operation(struct tracecmd_msg *msg) { warning("Message: cmd=%d size=%d\n", ntohl(msg->hdr.cmd), ntohl(msg->hdr.size)); } /* * A return value of 0 indicates time-out */ static int tracecmd_msg_recv_wait(int fd, struct tracecmd_msg *msg) { struct pollfd pfd; int ret; pfd.fd = fd; pfd.events = POLLIN; ret = poll(&pfd, 1, tracecmd_get_debug() ? -1 : msg_wait_to); if (ret < 0) return -errno; else if (ret == 0) return -ETIMEDOUT; return tracecmd_msg_recv(fd, msg); } static int tracecmd_msg_wait_for_msg(int fd, struct tracecmd_msg *msg) { u32 cmd; int ret; ret = tracecmd_msg_recv_wait(fd, msg); if (ret < 0) { if (ret == -ETIMEDOUT) warning("Connection timed out\n"); return ret; } cmd = ntohl(msg->hdr.cmd); if (cmd == MSG_CLOSE) return -ECONNABORTED; return 0; } static int tracecmd_msg_send_notsupp(struct tracecmd_msg_handle *msg_handle) { struct tracecmd_msg msg; tracecmd_msg_init(MSG_NOT_SUPP, &msg); return tracecmd_msg_send(msg_handle->fd, &msg); } static int handle_unexpected_msg(struct tracecmd_msg_handle *msg_handle, struct tracecmd_msg *msg) { /* Don't send MSG_NOT_SUPP back if we just received one */ if (ntohl(msg->hdr.cmd) == MSG_NOT_SUPP) return 0; return tracecmd_msg_send_notsupp(msg_handle); } int tracecmd_msg_send_init_data(struct tracecmd_msg_handle *msg_handle, unsigned int **client_ports) { struct tracecmd_msg msg; int fd = msg_handle->fd; unsigned int *ports; int i, cpus, ret; char *p, *buf_end; ssize_t buf_len; *client_ports = NULL; tracecmd_msg_init(MSG_TINIT, &msg); ret = make_tinit(msg_handle, &msg); if (ret < 0) goto out; ret = tracecmd_msg_send(fd, &msg); if (ret < 0) goto out; msg_free(&msg); ret = tracecmd_msg_wait_for_msg(fd, &msg); if (ret < 0) goto out; if (ntohl(msg.hdr.cmd) != MSG_RINIT) { ret = -EOPNOTSUPP; goto error; } buf_len = msg_buf_len(&msg); if (buf_len <= 0) { ret = -EINVAL; goto error; } if (msg.buf[buf_len-1] != '\0') { ret = -EINVAL; goto error; } cpus = ntohl(msg.rinit.cpus); ports = malloc(sizeof(*ports) * cpus); if (!ports) { ret = -ENOMEM; goto out; } buf_end = msg.buf + buf_len; for (i = 0, p = msg.buf; i < cpus; i++, p++) { if (p >= buf_end || tatou(p, &ports[i])) { free(ports); ret = -EINVAL; goto error; } p = strchr(p, '\0'); } *client_ports = ports; msg_free(&msg); return 0; error: error_operation(&msg); if (ret == -EOPNOTSUPP) handle_unexpected_msg(msg_handle, &msg); out: msg_free(&msg); return ret; } static bool process_option(struct tracecmd_msg_handle *msg_handle, const char *opt) { /* currently the only option we have is to use TCP */ if (strcmp(opt, "tcp") == 0) { msg_handle->flags |= TRACECMD_MSG_FL_USE_TCP; return true; } return false; } struct tracecmd_msg_handle * tracecmd_msg_handle_alloc(int fd, unsigned long flags) { struct tracecmd_msg_handle *handle; handle = calloc(1, sizeof(struct tracecmd_msg_handle)); if (!handle) return NULL; handle->fd = fd; handle->flags = flags; return handle; } void tracecmd_msg_handle_close(struct tracecmd_msg_handle *msg_handle) { close(msg_handle->fd); free(msg_handle); } #define MAX_OPTION_SIZE 4096 int tracecmd_msg_initial_setting(struct tracecmd_msg_handle *msg_handle) { struct tracecmd_msg msg; char *p, *buf_end; ssize_t buf_len; int pagesize; int options, i; int cpus; int ret; memset(&msg, 0, sizeof(msg)); ret = tracecmd_msg_recv_wait(msg_handle->fd, &msg); if (ret < 0) { if (ret == -ETIMEDOUT) warning("Connection timed out\n"); return ret; } if (ntohl(msg.hdr.cmd) != MSG_TINIT) { ret = -EOPNOTSUPP; goto error; } cpus = ntohl(msg.tinit.cpus); tracecmd_plog("cpus=%d\n", cpus); if (cpus < 0) { ret = -EINVAL; goto error; } msg_handle->cpu_count = cpus; pagesize = ntohl(msg.tinit.page_size); tracecmd_plog("pagesize=%d\n", pagesize); if (pagesize <= 0) { ret = -EINVAL; goto error; } buf_len = msg_buf_len(&msg); if (buf_len < 0) { ret = -EINVAL; goto error; } if (buf_len == 0) goto no_options; if (msg.buf[buf_len-1] != '\0') { ret = -EINVAL; goto error; } buf_end = msg.buf + buf_len; options = ntohl(msg.tinit.opt_num); for (i = 0, p = msg.buf; i < options; i++, p++) { if (p >= buf_end) { ret = -EINVAL; goto error; } /* do we understand this option? */ if (!process_option(msg_handle, p)) tracecmd_plog("Cannot understand option '%s'\n", p); p = strchr(p, '\0'); } no_options: msg_free(&msg); return pagesize; error: error_operation(&msg); if (ret == -EOPNOTSUPP) handle_unexpected_msg(msg_handle, &msg); msg_free(&msg); return ret; } int tracecmd_msg_send_port_array(struct tracecmd_msg_handle *msg_handle, unsigned int *ports) { struct tracecmd_msg msg; int ret; tracecmd_msg_init(MSG_RINIT, &msg); ret = make_rinit(&msg, msg_handle->cpu_count, ports); if (ret < 0) return ret; ret = tracecmd_msg_send(msg_handle->fd, &msg); if (ret < 0) return ret; return 0; } int tracecmd_msg_send_close_msg(struct tracecmd_msg_handle *msg_handle) { struct tracecmd_msg msg; tracecmd_msg_init(MSG_CLOSE, &msg); return tracecmd_msg_send(msg_handle->fd, &msg); } int tracecmd_msg_send_close_resp_msg(struct tracecmd_msg_handle *msg_handle) { struct tracecmd_msg msg; tracecmd_msg_init(MSG_CLOSE_RESP, &msg); return tracecmd_msg_send(msg_handle->fd, &msg); } int tracecmd_msg_data_send(struct tracecmd_msg_handle *msg_handle, const char *buf, int size) { struct tracecmd_msg msg; int fd = msg_handle->fd; int n; int ret; int count = 0; /* Don't bother doing anything if there's nothing to do */ if (!size) return 0; tracecmd_msg_init(MSG_SEND_DATA, &msg); msg.buf = malloc(MSG_MAX_DATA_LEN); if (!msg.buf) return -ENOMEM; msg.hdr.size = htonl(MSG_MAX_LEN); n = size; while (n) { if (n > MSG_MAX_DATA_LEN) { memcpy(msg.buf, buf + count, MSG_MAX_DATA_LEN); n -= MSG_MAX_DATA_LEN; count += MSG_MAX_DATA_LEN; } else { msg.hdr.size = htonl(MSG_HDR_LEN + n); memcpy(msg.buf, buf + count, n); n = 0; } ret = msg_write(fd, &msg); if (ret < 0) break; } msg_free(&msg); return ret; } int tracecmd_msg_finish_sending_data(struct tracecmd_msg_handle *msg_handle) { struct tracecmd_msg msg; int ret; tracecmd_msg_init(MSG_FIN_DATA, &msg); ret = tracecmd_msg_send(msg_handle->fd, &msg); if (ret < 0) return ret; return 0; } int tracecmd_msg_read_data(struct tracecmd_msg_handle *msg_handle, int ofd) { struct tracecmd_msg msg; int t, n, cmd; ssize_t s; int ret; while (!tracecmd_msg_done(msg_handle)) { ret = tracecmd_msg_recv_wait(msg_handle->fd, &msg); if (ret < 0) { if (ret == -ETIMEDOUT) warning("Connection timed out\n"); else warning("reading client"); return ret; } cmd = ntohl(msg.hdr.cmd); if (cmd == MSG_FIN_DATA) { /* Finish receiving data */ break; } else if (cmd != MSG_SEND_DATA) { ret = handle_unexpected_msg(msg_handle, &msg); if (ret < 0) goto error; goto next; } n = msg_buf_len(&msg); t = n; s = 0; while (t > 0) { s = write(ofd, msg.buf+s, t); if (s < 0) { if (errno == EINTR) continue; warning("writing to file"); ret = -errno; goto error; } t -= s; s = n - t; } next: msg_free(&msg); } return 0; error: error_operation(&msg); msg_free(&msg); return ret; } int tracecmd_msg_collect_data(struct tracecmd_msg_handle *msg_handle, int ofd) { int ret; ret = tracecmd_msg_read_data(msg_handle, ofd); if (ret) return ret; return tracecmd_msg_wait_close(msg_handle); } static int tracecmd_msg_wait_for_cmd(struct tracecmd_msg_handle *msg_handle, enum tracecmd_msg_cmd cmd) { struct tracecmd_msg msg; int ret = -1; memset(&msg, 0, sizeof(msg)); while (!tracecmd_msg_done(msg_handle)) { ret = tracecmd_msg_recv(msg_handle->fd, &msg); if (ret < 0) goto error; if (ntohl(msg.hdr.cmd) == cmd) return 0; error_operation(&msg); ret = handle_unexpected_msg(msg_handle, &msg); if (ret < 0) goto error; msg_free(&msg); } error: msg_free(&msg); return ret; } int tracecmd_msg_wait_close(struct tracecmd_msg_handle *msg_handle) { return tracecmd_msg_wait_for_cmd(msg_handle, MSG_CLOSE); } int tracecmd_msg_wait_close_resp(struct tracecmd_msg_handle *msg_handle) { return tracecmd_msg_wait_for_cmd(msg_handle, MSG_CLOSE_RESP); } static int make_trace_req_protos(char **buf, int *size, struct tracecmd_tsync_protos *protos) { int protos_size = 1; size_t buf_size; char **names; char *nbuf; char *p; names = protos->names; while (*names) { protos_size += strlen(*names) + 1; names++; } buf_size = TRACE_REQ_PARAM_SIZE + protos_size; nbuf = realloc(*buf, *size + buf_size); if (!nbuf) return -1; p = nbuf + *size; memset(p, 0, buf_size); *(unsigned int *)p = htonl(TRACE_REQUEST_TSYNC_PROTOS); p += sizeof(int); *(unsigned int *)p = htonl(protos_size); p += sizeof(int); names = protos->names; while (*names) { strcpy(p, *names); p += strlen(*names) + 1; names++; } p = NULL; *size += buf_size; *buf = nbuf; return 0; } static int make_trace_req_args(char **buf, int *size, int argc, char **argv) { size_t args_size; size_t buf_size; char *nbuf; char *p; int i; args_size = sizeof(int); for (i = 0; i < argc; i++) args_size += strlen(argv[i]) + 1; buf_size = TRACE_REQ_PARAM_SIZE + args_size; nbuf = realloc(*buf, *size + buf_size); if (!nbuf) return -1; p = nbuf + *size; memset(p, 0, buf_size); *(unsigned int *)p = htonl(TRACE_REQUEST_ARGS); p += sizeof(int); *(unsigned int *)p = htonl(args_size); p += sizeof(int); *(unsigned int *)p = htonl(argc); p += sizeof(int); for (i = 0; i < argc; i++) p = stpcpy(p, argv[i]) + 1; *size += buf_size; *buf = nbuf; return 0; } static int make_trace_req(struct tracecmd_msg *msg, int argc, char **argv, bool use_fifos, unsigned long long trace_id, struct tracecmd_tsync_protos *protos) { int size = 0; char *buf = NULL; msg->trace_req.flags = 0; if (use_fifos) msg->trace_req.flags |= MSG_TRACE_USE_FIFOS; msg->trace_req.flags = htonl(msg->trace_req.flags); msg->trace_req.trace_id = htonll(trace_id); if (argc && argv) make_trace_req_args(&buf, &size, argc, argv); if (protos && protos->names) make_trace_req_protos(&buf, &size, protos); msg->buf = buf; msg->hdr.size = htonl(ntohl(msg->hdr.size) + size); return 0; } int tracecmd_msg_send_trace_req(struct tracecmd_msg_handle *msg_handle, int argc, char **argv, bool use_fifos, unsigned long long trace_id, struct tracecmd_tsync_protos *protos) { struct tracecmd_msg msg; int ret; tracecmd_msg_init(MSG_TRACE_REQ, &msg); ret = make_trace_req(&msg, argc, argv, use_fifos, trace_id, protos); if (ret < 0) return ret; return tracecmd_msg_send(msg_handle->fd, &msg); } static int get_trace_req_protos(char *buf, int length, struct tracecmd_tsync_protos **protos) { struct tracecmd_tsync_protos *plist = NULL; int count = 0; char *p; int i, j; i = length; p = buf; while (i > 0) { i -= strlen(p) + 1; count++; p += strlen(p) + 1; } plist = calloc(1, sizeof(struct tracecmd_tsync_protos)); if (!plist) goto error; plist->names = calloc(count + 1, sizeof(char *)); if (!plist->names) goto error; i = length; p = buf; j = 0; while (i > 0 && j < (count - 1)) { i -= strlen(p) + 1; plist->names[j++] = strdup(p); p += strlen(p) + 1; } *protos = plist; return 0; error: if (plist) { free(plist->names); free(plist); } return -1; } static int get_trace_req_args(char *buf, int length, int *argc, char ***argv) { unsigned int nr_args; char *p, *buf_end; char **args = NULL; char *vagrs = NULL; int ret; int i; if (length <= sizeof(int) || buf[length - 1] != '\0') { ret = -EINVAL; goto out; } nr_args = ntohl(*(unsigned int *)buf); buf += sizeof(int); length -= sizeof(int); args = calloc(nr_args, sizeof(*args)); if (!args) { ret = -ENOMEM; goto out; } vagrs = calloc(length, sizeof(char)); if (!vagrs) { ret = -ENOMEM; goto out; } memcpy(vagrs, buf, length); buf_end = vagrs + length; for (i = 0, p = vagrs; i < nr_args; i++, p++) { if (p >= buf_end) { ret = -EINVAL; goto out; } args[i] = p; p = strchr(p, '\0'); } *argc = nr_args; *argv = args; return 0; out: free(args); free(vagrs); return ret; } /* * NOTE: On success, the returned `argv` should be freed with: * free(argv[0]); * free(argv); * and `tsync_protos` with free(tsync_protos); */ int tracecmd_msg_recv_trace_req(struct tracecmd_msg_handle *msg_handle, int *argc, char ***argv, bool *use_fifos, unsigned long long *trace_id, struct tracecmd_tsync_protos **protos) { struct tracecmd_msg msg; unsigned int param_id; int param_length; ssize_t buf_len; char *p; int ret; ret = tracecmd_msg_recv(msg_handle->fd, &msg); if (ret < 0) return ret; if (ntohl(msg.hdr.cmd) != MSG_TRACE_REQ) { ret = -ENOTSUP; goto out; } buf_len = ntohl(msg.hdr.size) - MSG_HDR_LEN - ntohl(msg.hdr.cmd_size); if (buf_len < 0) { ret = -EINVAL; goto out; } *use_fifos = ntohl(msg.trace_req.flags) & MSG_TRACE_USE_FIFOS; *trace_id = ntohll(msg.trace_req.trace_id); p = msg.buf; while (buf_len > 2 * sizeof(int)) { param_id = ntohl(*((unsigned int *)p)); p += sizeof(int); buf_len -= sizeof(int); param_length = ntohl(*((unsigned int *)p)); p += sizeof(int); buf_len -= sizeof(int); if (buf_len < param_length) break; ret = 0; switch (param_id) { case TRACE_REQUEST_ARGS: ret = get_trace_req_args(p, param_length, argc, argv); break; case TRACE_REQUEST_TSYNC_PROTOS: ret = get_trace_req_protos(p, param_length, protos); break; default: break; } if (ret) break; buf_len -= param_length; p += param_length; } msg_free(&msg); return 0; out: error_operation(&msg); if (ret == -EOPNOTSUPP) handle_unexpected_msg(msg_handle, &msg); msg_free(&msg); return ret; } /** * tracecmd_msg_send_time_sync - Send a time sync packet * @msg_handle: message handle, holding the communication context * @sync_protocol: name of the time synch protocol, string up to * TRACECMD_TSYNC_PNAME_LENGTH characters length. * @sync_msg_id: id if the time synch message, protocol dependent * @payload_size: size of the packet payload, 0 in case of no payload * @payload: pointer to the packet payload, or NULL in case of no payload * * Returns 0 if packet is sent successfully, or negative error otherwise. */ int tracecmd_msg_send_time_sync(struct tracecmd_msg_handle *msg_handle, char *sync_protocol, unsigned int sync_msg_id, unsigned int payload_size, char *payload) { struct tracecmd_msg msg; tracecmd_msg_init(MSG_TIME_SYNC, &msg); strncpy(msg.tsync.sync_protocol_name, sync_protocol, TRACECMD_TSYNC_PNAME_LENGTH); msg.tsync.sync_msg_id = htonl(sync_msg_id); msg.hdr.size = htonl(ntohl(msg.hdr.size) + payload_size); msg.buf = payload; return msg_send_nofree(msg_handle->fd, &msg); } /** * tracecmd_msg_recv_time_sync - Receive a time sync packet * @msg_handle: message handle, holding the communication context * @sync_protocol: return the name of the packet's time synch protocol. * It must point to a prealocated buffer with size * TRACECMD_TSYNC_PNAME_LENGTH * @sync_msg_id: return the id of the packet's time synch message * @payload_size: size of the packet's payload, can be: * NULL - the payload is not interested and should be ignored * pointer to int, with value 0 - update with the size of the payload * allocate memory and cpy the payload * into it * pointer to int, with value greater than 0 - expected size of the * payload, preallocated * memory is passed to the API * with that size *@payload: pointer to the packet payload, can be: * NULL - the payload is not interested and should be ignored * pointer to char *, with value NULL - a new memory is allocated and returned * here, containing the packet's payload * the @payload_size is updated with the * size of the allocated memory. It must be * freed by free() * pointer to char *, with no-NULL value - A prealocated array is passed, with size * @payload_size. If payload's size is equal * or less, it will be copied here. * * Returns 0 if packet is received successfully, or negative error otherwise. */ int tracecmd_msg_recv_time_sync(struct tracecmd_msg_handle *msg_handle, char *sync_protocol, unsigned int *sync_msg_id, unsigned int *payload_size, char **payload) { struct tracecmd_msg msg; int ret = -1; int buf_size; memset(&msg, 0, sizeof(msg)); ret = tracecmd_msg_recv(msg_handle->fd, &msg); if (ret < 0) goto out; if (ntohl(msg.hdr.cmd) != MSG_TIME_SYNC) { ret = -EOPNOTSUPP; goto out; } if (sync_protocol) strncpy(sync_protocol, msg.tsync.sync_protocol_name, TRACECMD_TSYNC_PNAME_LENGTH); if (sync_msg_id) *sync_msg_id = ntohl(msg.tsync.sync_msg_id); buf_size = msg_buf_len(&msg); if (buf_size < 0) { ret = -EINVAL; goto out; } if (buf_size && payload && payload_size) { if (*payload_size) { if (*payload_size < buf_size || *payload == NULL) { ret = -ENOMEM; goto out; } memcpy(*payload, msg.buf, buf_size); goto out; } *payload = malloc(buf_size); if (*payload == NULL) { ret = -ENOMEM; goto out; } *payload_size = buf_size; memcpy(*payload, msg.buf, buf_size); } out: msg_free(&msg); return ret; } static int make_trace_resp(struct tracecmd_msg *msg, int page_size, int nr_cpus, unsigned int *ports, bool use_fifos, unsigned long long trace_id, const char *tsync_proto, unsigned int tsync_port) { int data_size; if (!tsync_proto) tsync_proto = ""; data_size = write_uints(NULL, 0, ports, nr_cpus); msg->buf = malloc(data_size); if (!msg->buf) return -ENOMEM; write_uints(msg->buf, data_size, ports, nr_cpus); msg->hdr.size = htonl(ntohl(msg->hdr.size) + data_size); msg->trace_resp.flags = use_fifos ? MSG_TRACE_USE_FIFOS : 0; msg->trace_resp.flags = htonl(msg->trace_resp.flags); strncpy(msg->trace_resp.tsync_proto_name, tsync_proto, TRACECMD_TSYNC_PNAME_LENGTH); msg->trace_resp.tsync_port = htonl(tsync_port); msg->trace_resp.cpus = htonl(nr_cpus); msg->trace_resp.page_size = htonl(page_size); msg->trace_resp.trace_id = htonll(trace_id); return 0; } int tracecmd_msg_send_trace_resp(struct tracecmd_msg_handle *msg_handle, int nr_cpus, int page_size, unsigned int *ports, bool use_fifos, unsigned long long trace_id, const char *tsync_proto, unsigned int tsync_port) { struct tracecmd_msg msg; int ret; tracecmd_msg_init(MSG_TRACE_RESP, &msg); ret = make_trace_resp(&msg, page_size, nr_cpus, ports, use_fifos, trace_id, tsync_proto, tsync_port); if (ret < 0) return ret; return tracecmd_msg_send(msg_handle->fd, &msg); } int tracecmd_msg_recv_trace_resp(struct tracecmd_msg_handle *msg_handle, int *nr_cpus, int *page_size, unsigned int **ports, bool *use_fifos, unsigned long long *trace_id, char **tsync_proto, unsigned int *tsync_port) { struct tracecmd_msg msg; char *p, *buf_end; ssize_t buf_len; int i, ret; ret = tracecmd_msg_recv(msg_handle->fd, &msg); if (ret < 0) return ret; if (ntohl(msg.hdr.cmd) != MSG_TRACE_RESP) { ret = -ENOTSUP; goto out; } buf_len = msg_buf_len(&msg); if (buf_len <= 0) { ret = -EINVAL; goto out; } *use_fifos = ntohl(msg.trace_resp.flags) & MSG_TRACE_USE_FIFOS; *nr_cpus = ntohl(msg.trace_resp.cpus); *page_size = ntohl(msg.trace_resp.page_size); *trace_id = ntohll(msg.trace_resp.trace_id); *tsync_proto = strdup(msg.trace_resp.tsync_proto_name); *tsync_port = ntohl(msg.trace_resp.tsync_port); *ports = calloc(*nr_cpus, sizeof(**ports)); if (!*ports) { ret = -ENOMEM; goto out; } buf_end = msg.buf + buf_len; for (i = 0, p = msg.buf; i < *nr_cpus; i++, p++) { if (p >= buf_end || tatou(p, &(*ports)[i])) { free(*ports); ret = -EINVAL; goto out; } p = strchr(p, '\0'); } msg_free(&msg); return 0; out: error_operation(&msg); if (ret == -EOPNOTSUPP) handle_unexpected_msg(msg_handle, &msg); msg_free(&msg); return ret; } trace-cmd-v2.9.6/lib/trace-cmd/trace-output.c000066400000000000000000001067461414302661500210020ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt * */ #define _LARGEFILE64_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "tracefs.h" #include "trace-cmd.h" #include "trace-cmd-local.h" #include "trace-write-local.h" #include "list.h" #include "trace-msg.h" /* We can't depend on the host size for size_t, all must be 64 bit */ typedef unsigned long long tsize_t; typedef long long stsize_t; static struct tracecmd_event_list all_event_list = { .next = NULL, .glob = "all" }; struct tracecmd_option { unsigned short id; int size; void *data; tsize_t offset; struct list_head list; }; enum { OUTPUT_FL_SEND_META = (1 << 0), }; struct tracecmd_output { int fd; int page_size; int cpus; struct tep_handle *pevent; char *tracing_dir; int nr_options; bool quiet; unsigned long file_state; struct list_head options; struct tracecmd_msg_handle *msg_handle; }; struct list_event { struct list_event *next; char *name; char *file; }; struct list_event_system { struct list_event_system *next; struct list_event *events; char *name; }; static stsize_t do_write_check(struct tracecmd_output *handle, const void *data, tsize_t size) { if (handle->msg_handle) return tracecmd_msg_data_send(handle->msg_handle, data, size); return __do_write_check(handle->fd, data, size); } static short convert_endian_2(struct tracecmd_output *handle, short val) { if (!handle->pevent) return val; return tep_read_number(handle->pevent, &val, 2); } static int convert_endian_4(struct tracecmd_output *handle, int val) { if (!handle->pevent) return val; return tep_read_number(handle->pevent, &val, 4); } static unsigned long long convert_endian_8(struct tracecmd_output *handle, unsigned long long val) { if (!handle->pevent) return val; return tep_read_number(handle->pevent, &val, 8); } /** * tracecmd_set_quiet - Set if to print output to the screen * @quiet: If non zero, print no output to the screen * */ void tracecmd_set_quiet(struct tracecmd_output *handle, bool set_quiet) { if (handle) handle->quiet = set_quiet; } /** * tracecmd_get_quiet - Get if to print output to the screen * Returns non zero, if no output to the screen should be printed * */ bool tracecmd_get_quiet(struct tracecmd_output *handle) { if (handle) return handle->quiet; return false; } void tracecmd_output_free(struct tracecmd_output *handle) { struct tracecmd_option *option; if (!handle) return; if (handle->tracing_dir) free(handle->tracing_dir); if (handle->pevent) tep_unref(handle->pevent); while (!list_empty(&handle->options)) { option = container_of(handle->options.next, struct tracecmd_option, list); list_del(&option->list); free(option->data); free(option); } free(handle); } void tracecmd_output_close(struct tracecmd_output *handle) { if (!handle) return; if (handle->fd >= 0) { close(handle->fd); handle->fd = -1; } tracecmd_output_free(handle); } static unsigned long get_size_fd(int fd) { unsigned long long size = 0; char buf[BUFSIZ]; int r; do { r = read(fd, buf, BUFSIZ); if (r > 0) size += r; } while (r > 0); lseek(fd, 0, SEEK_SET); return size; } static unsigned long get_size(const char *file) { unsigned long long size = 0; int fd; fd = open(file, O_RDONLY); if (fd < 0) { warning("Can't read '%s'", file); return 0; /* Caller will fail with zero */ } size = get_size_fd(fd); close(fd); return size; } static tsize_t copy_file_fd(struct tracecmd_output *handle, int fd) { tsize_t size = 0; char buf[BUFSIZ]; stsize_t r; do { r = read(fd, buf, BUFSIZ); if (r > 0) { size += r; if (do_write_check(handle, buf, r)) return 0; } } while (r > 0); return size; } static tsize_t copy_file(struct tracecmd_output *handle, const char *file) { tsize_t size = 0; int fd; fd = open(file, O_RDONLY); if (fd < 0) { warning("Can't read '%s'", file); return 0; } size = copy_file_fd(handle, fd); close(fd); return size; } /* * Finds the path to the debugfs/tracing * Allocates the string and stores it. */ static const char *find_tracing_dir(struct tracecmd_output *handle) { if (!handle->tracing_dir) { const char *dir = tracefs_tracing_dir(); if (dir) handle->tracing_dir = strdup(dir); } return handle->tracing_dir; } static char *get_tracing_file(struct tracecmd_output *handle, const char *name) { const char *tracing; char *file; int ret; tracing = find_tracing_dir(handle); if (!tracing) return NULL; ret = asprintf(&file, "%s/%s", tracing, name); if (ret < 0) return NULL; return file; } static void put_tracing_file(char *file) { free(file); } int tracecmd_ftrace_enable(int set) { struct stat buf; char *path = "/proc/sys/kernel/ftrace_enabled"; int fd; char *val = set ? "1" : "0"; int ret = 0; /* if ftace_enable does not exist, simply ignore it */ fd = stat(path, &buf); if (fd < 0) return ENODEV; fd = open(path, O_WRONLY); if (fd < 0) { warning("Can't %s ftrace", set ? "enable" : "disable"); return EIO; } if (write(fd, val, 1) < 0) ret = -1; close(fd); return ret; } static int check_out_state(struct tracecmd_output *handle, int new_state) { if (!handle) return -1; switch (new_state) { case TRACECMD_FILE_HEADERS: case TRACECMD_FILE_FTRACE_EVENTS: case TRACECMD_FILE_ALL_EVENTS: case TRACECMD_FILE_KALLSYMS: case TRACECMD_FILE_PRINTK: case TRACECMD_FILE_CMD_LINES: case TRACECMD_FILE_CPU_COUNT: case TRACECMD_FILE_OPTIONS: if (handle->file_state == (new_state - 1)) return 0; break; case TRACECMD_FILE_CPU_LATENCY: case TRACECMD_FILE_CPU_FLYRECORD: if (handle->file_state == TRACECMD_FILE_OPTIONS) return 0; break; } return -1; } static int read_header_files(struct tracecmd_output *handle) { tsize_t size, check_size, endian8; struct stat st; char *path; int fd; int ret; if (check_out_state(handle, TRACECMD_FILE_HEADERS) < 0) { warning("Cannot read header files, unexpected state 0x%X", handle->file_state); return -1; } path = get_tracing_file(handle, "events/header_page"); if (!path) return -1; ret = stat(path, &st); if (ret < 0) { /* old style did not show this info, just add zero */ put_tracing_file(path); if (do_write_check(handle, "header_page", 12)) return -1; size = 0; if (do_write_check(handle, &size, 8)) return -1; if (do_write_check(handle, "header_event", 13)) return -1; if (do_write_check(handle, &size, 8)) return -1; return 0; } fd = open(path, O_RDONLY); if (fd < 0) { warning("can't read '%s'", path); return -1; } /* unfortunately, you can not stat debugfs files for size */ size = get_size_fd(fd); if (do_write_check(handle, "header_page", 12)) goto out_close; endian8 = convert_endian_8(handle, size); if (do_write_check(handle, &endian8, 8)) goto out_close; check_size = copy_file_fd(handle, fd); close(fd); if (size != check_size) { warning("wrong size for '%s' size=%lld read=%lld", path, size, check_size); errno = EINVAL; return -1; } put_tracing_file(path); path = get_tracing_file(handle, "events/header_event"); if (!path) return -1; fd = open(path, O_RDONLY); if (fd < 0) { warning("can't read '%s'", path); return -1; } size = get_size_fd(fd); if (do_write_check(handle, "header_event", 13)) goto out_close; endian8 = convert_endian_8(handle, size); if (do_write_check(handle, &endian8, 8)) goto out_close; check_size = copy_file_fd(handle, fd); close(fd); if (size != check_size) { warning("wrong size for '%s'", path); return -1; } put_tracing_file(path); handle->file_state = TRACECMD_FILE_HEADERS; return 0; out_close: close(fd); return -1; } static int copy_event_system(struct tracecmd_output *handle, struct list_event_system *slist) { struct list_event *elist; unsigned long long size, check_size, endian8; struct stat st; char *format; int endian4; int count = 0; int ret; for (elist = slist->events; elist; elist = elist->next) count++; endian4 = convert_endian_4(handle, count); if (do_write_check(handle, &endian4, 4)) return -1; for (elist = slist->events; elist; elist = elist->next) { format = elist->file; ret = stat(format, &st); if (ret >= 0) { /* unfortunately, you can not stat debugfs files for size */ size = get_size(format); endian8 = convert_endian_8(handle, size); if (do_write_check(handle, &endian8, 8)) return -1; check_size = copy_file(handle, format); if (size != check_size) { warning("error in size of file '%s'", format); return -1; } } } return 0; } static void add_list_event_system(struct list_event_system **systems, const char *system, const char *event, const char *path) { struct list_event_system *slist; struct list_event *elist; for (slist = *systems; slist; slist = slist->next) if (strcmp(slist->name, system) == 0) break; if (!slist) { slist = malloc(sizeof(*slist)); if (!slist) goto err_mem; slist->name = strdup(system); if (!slist->name) { free(slist); goto err_mem; } slist->next = *systems; slist->events = NULL; *systems = slist; } for (elist = slist->events; elist; elist = elist->next) if (strcmp(elist->name, event) == 0) break; if (!elist) { elist = malloc(sizeof(*elist)); if (!elist) goto err_mem; elist->name = strdup(event); elist->file = strdup(path); if (!elist->name || !elist->file) { free(elist->name); free(elist->file); free(elist); goto err_mem; } elist->next = slist->events; slist->events = elist; } return; err_mem: warning("Insufficient memory"); } static void free_list_events(struct list_event_system *list) { struct list_event_system *slist; struct list_event *elist; while (list) { slist = list; list = list->next; while (slist->events) { elist = slist->events; slist->events = elist->next; free(elist->name); free(elist->file); free(elist); } free(slist->name); free(slist); } } static void glob_events(struct tracecmd_output *handle, struct list_event_system **systems, const char *str) { glob_t globbuf; char *events_path; char *system; char *event; char *path; char *file; char *ptr; int do_ftrace = 0; int events_len; int ret; int i; if (strncmp(str, "ftrace/", 7) == 0) do_ftrace = 1; events_path = get_tracing_file(handle, "events"); events_len = strlen(events_path); path = malloc(events_len + strlen(str) + strlen("/format") + 2); if (!path) return; path[0] = '\0'; strcat(path, events_path); strcat(path, "/"); strcat(path, str); strcat(path, "/format"); put_tracing_file(events_path); globbuf.gl_offs = 0; ret = glob(path, 0, NULL, &globbuf); free(path); if (ret < 0) return; for (i = 0; i < globbuf.gl_pathc; i++) { file = globbuf.gl_pathv[i]; system = strdup(file + events_len + 1); system = strtok_r(system, "/", &ptr); if (!ptr) { /* ?? should we warn? */ free(system); continue; } if (!do_ftrace && strcmp(system, "ftrace") == 0) { free(system); continue; } event = strtok_r(NULL, "/", &ptr); if (!ptr) { /* ?? should we warn? */ free(system); continue; } add_list_event_system(systems, system, event, file); free(system); } globfree(&globbuf); } static void create_event_list_item(struct tracecmd_output *handle, struct list_event_system **systems, struct tracecmd_event_list *list) { char *ptr; char *str; str = strdup(list->glob); if (!str) goto err_mem; /* system and event names are separated by a ':' */ ptr = strchr(str, ':'); if (ptr) *ptr = '/'; else /* system and event may also be separated by a '/' */ ptr = strchr(str, '/'); if (ptr) { glob_events(handle, systems, str); free(str); return; } ptr = str; str = malloc(strlen(ptr) + 3); if (!str) goto err_mem; str[0] = '\0'; strcat(str, ptr); strcat(str, "/*"); glob_events(handle, systems, str); str[0] = '\0'; strcat(str, "*/"); strcat(str, ptr); glob_events(handle, systems, str); free(ptr); free(str); return; err_mem: warning("Insufficient memory"); } static int read_ftrace_files(struct tracecmd_output *handle) { struct list_event_system *systems = NULL; struct tracecmd_event_list list = { .glob = "ftrace/*" }; int ret; if (check_out_state(handle, TRACECMD_FILE_FTRACE_EVENTS) < 0) { warning("Cannot read ftrace files, unexpected state 0x%X", handle->file_state); return -1; } create_event_list_item(handle, &systems, &list); ret = copy_event_system(handle, systems); free_list_events(systems); handle->file_state = TRACECMD_FILE_FTRACE_EVENTS; return ret; } static struct list_event_system * create_event_list(struct tracecmd_output *handle, struct tracecmd_event_list *event_list) { struct list_event_system *systems = NULL; struct tracecmd_event_list *list; for (list = event_list; list; list = list->next) create_event_list_item(handle, &systems, list); return systems; } static int read_event_files(struct tracecmd_output *handle, struct tracecmd_event_list *event_list) { struct list_event_system *systems; struct list_event_system *slist; struct tracecmd_event_list *list; struct tracecmd_event_list all_events = { .glob = "*/*" }; int count = 0; int endian4; int ret; if (check_out_state(handle, TRACECMD_FILE_ALL_EVENTS) < 0) { warning("Cannot read event files, unexpected state 0x%X", handle->file_state); return -1; } /* * If any of the list is the special keyword "all" then * just do all files. */ for (list = event_list; list; list = list->next) { if (strcmp(list->glob, "all") == 0) break; } /* all events are listed, use a global glob */ if (list) event_list = &all_events; systems = create_event_list(handle, event_list); for (slist = systems; slist; slist = slist->next) count++; ret = -1; endian4 = convert_endian_4(handle, count); if (do_write_check(handle, &endian4, 4)) goto out_free; ret = 0; for (slist = systems; !ret && slist; slist = slist->next) { if (do_write_check(handle, slist->name, strlen(slist->name) + 1)) { ret = -1; continue; } ret = copy_event_system(handle, slist); } handle->file_state = TRACECMD_FILE_ALL_EVENTS; out_free: free_list_events(systems); return ret; } #define KPTR_UNINITIALIZED 'X' static void set_proc_kptr_restrict(int reset) { char *path = "/proc/sys/kernel/kptr_restrict"; static char saved = KPTR_UNINITIALIZED; int fd, ret = -1; struct stat st; char buf; if ((reset && saved == KPTR_UNINITIALIZED) || (stat(path, &st) < 0)) return; fd = open(path, O_RDONLY); if (fd < 0) goto err; if (reset) { buf = saved; } else { if (read(fd, &buf, 1) < 0) goto err; saved = buf; buf = '0'; } close(fd); fd = open(path, O_WRONLY); if (fd < 0) goto err; if (write(fd, &buf, 1) > 0) ret = 0; err: if (fd > 0) close(fd); if (ret) warning("can't set kptr_restrict"); } static int read_proc_kallsyms(struct tracecmd_output *handle, const char *kallsyms) { unsigned int size, check_size, endian4; const char *path = "/proc/kallsyms"; struct stat st; int ret; if (check_out_state(handle, TRACECMD_FILE_KALLSYMS) < 0) { warning("Cannot read kallsyms, unexpected state 0x%X", handle->file_state); return -1; } if (kallsyms) path = kallsyms; ret = stat(path, &st); if (ret < 0) { /* not found */ size = 0; endian4 = convert_endian_4(handle, size); if (do_write_check(handle, &endian4, 4)) return -1; return 0; } size = get_size(path); endian4 = convert_endian_4(handle, size); if (do_write_check(handle, &endian4, 4)) return -1; set_proc_kptr_restrict(0); check_size = copy_file(handle, path); if (size != check_size) { errno = EINVAL; warning("error in size of file '%s'", path); set_proc_kptr_restrict(1); return -1; } set_proc_kptr_restrict(1); handle->file_state = TRACECMD_FILE_KALLSYMS; return 0; } static int read_ftrace_printk(struct tracecmd_output *handle) { unsigned int size, check_size, endian4; struct stat st; char *path; int ret; if (check_out_state(handle, TRACECMD_FILE_PRINTK) < 0) { warning("Cannot read printk, unexpected state 0x%X", handle->file_state); return -1; } path = get_tracing_file(handle, "printk_formats"); if (!path) return -1; ret = stat(path, &st); if (ret < 0) { /* not found */ size = 0; endian4 = convert_endian_4(handle, size); if (do_write_check(handle, &endian4, 4)) goto fail; goto out; } size = get_size(path); endian4 = convert_endian_4(handle, size); if (do_write_check(handle, &endian4, 4)) goto fail; check_size = copy_file(handle, path); if (size != check_size) { errno = EINVAL; warning("error in size of file '%s'", path); goto fail; } out: handle->file_state = TRACECMD_FILE_PRINTK; put_tracing_file(path); return 0; fail: put_tracing_file(path); return -1; } static int save_tracing_file_data(struct tracecmd_output *handle, const char *filename) { unsigned long long endian8; char *file = NULL; struct stat st; off64_t check_size; off64_t size; int ret = -1; file = get_tracing_file(handle, filename); if (!file) return -1; ret = stat(file, &st); if (ret >= 0) { size = get_size(file); endian8 = convert_endian_8(handle, size); if (do_write_check(handle, &endian8, 8)) goto out_free; check_size = copy_file(handle, file); if (size != check_size) { errno = EINVAL; warning("error in size of file '%s'", file); goto out_free; } } else { size = 0; endian8 = convert_endian_8(handle, size); if (do_write_check(handle, &endian8, 8)) goto out_free; } ret = 0; out_free: put_tracing_file(file); return ret; } static struct tracecmd_output * create_file_fd(int fd, struct tracecmd_input *ihandle, const char *tracing_dir, const char *kallsyms, struct tracecmd_event_list *list, struct tracecmd_msg_handle *msg_handle) { struct tracecmd_output *handle; struct tep_handle *pevent; char buf[BUFSIZ]; int endian4; handle = malloc(sizeof(*handle)); if (!handle) return NULL; memset(handle, 0, sizeof(*handle)); handle->fd = fd; if (tracing_dir) { handle->tracing_dir = strdup(tracing_dir); if (!handle->tracing_dir) goto out_free; } handle->msg_handle = msg_handle; list_head_init(&handle->options); buf[0] = 23; buf[1] = 8; buf[2] = 68; memcpy(buf + 3, "tracing", 7); if (do_write_check(handle, buf, 10)) goto out_free; if (do_write_check(handle, FILE_VERSION_STRING, strlen(FILE_VERSION_STRING) + 1)) goto out_free; /* get endian and page size */ if (ihandle) { pevent = tracecmd_get_tep(ihandle); /* Use the pevent of the ihandle for later writes */ handle->pevent = tracecmd_get_tep(ihandle); tep_ref(pevent); if (tep_is_file_bigendian(pevent)) buf[0] = 1; else buf[0] = 0; handle->page_size = tracecmd_page_size(ihandle); } else { if (tracecmd_host_bigendian()) buf[0] = 1; else buf[0] = 0; handle->page_size = getpagesize(); } if (do_write_check(handle, buf, 1)) goto out_free; /* save size of long (this may not be what the kernel is) */ buf[0] = sizeof(long); if (do_write_check(handle, buf, 1)) goto out_free; endian4 = convert_endian_4(handle, handle->page_size); if (do_write_check(handle, &endian4, 4)) goto out_free; handle->file_state = TRACECMD_FILE_INIT; if (ihandle) return handle; if (read_header_files(handle)) goto out_free; if (read_ftrace_files(handle)) goto out_free; if (read_event_files(handle, list)) goto out_free; if (read_proc_kallsyms(handle, kallsyms)) goto out_free; if (read_ftrace_printk(handle)) goto out_free; return handle; out_free: tracecmd_output_close(handle); return NULL; } static struct tracecmd_output *create_file(const char *output_file, struct tracecmd_input *ihandle, const char *tracing_dir, const char *kallsyms, struct tracecmd_event_list *list) { struct tracecmd_output *handle; int fd; fd = open(output_file, O_RDWR | O_CREAT | O_TRUNC | O_LARGEFILE, 0644); if (fd < 0) return NULL; handle = create_file_fd(fd, ihandle, tracing_dir, kallsyms, list, NULL); if (!handle) { close(fd); unlink(output_file); } return handle; } /** * tracecmd_add_option_v - add options to the file * @handle: the output file handle name * @id: the id of the option * @size: the size of the option data * @data: the data to write to the file * @vector: array of vectors, pointing to the data to write in the file * @count: number of items in the vector array * * * Returns handle to update option if needed. * Just the content can be updated, with smaller or equal to * content than the specified size. */ struct tracecmd_option * tracecmd_add_option_v(struct tracecmd_output *handle, unsigned short id, const struct iovec *vector, int count) { struct tracecmd_option *option; char *data = NULL; int i, size = 0; /* * We can only add options before tracing data were written. * This may change in the future. */ if (handle->file_state > TRACECMD_FILE_OPTIONS) return NULL; for (i = 0; i < count; i++) size += vector[i].iov_len; /* Some IDs (like TRACECMD_OPTION_TRACECLOCK) pass vector with 0 / NULL data */ if (size) { data = malloc(size); if (!data) { warning("Insufficient memory"); return NULL; } } option = malloc(sizeof(*option)); if (!option) { warning("Could not allocate space for option"); free(data); return NULL; } handle->nr_options++; option->data = data; for (i = 0; i < count; i++) { if (vector[i].iov_base && vector[i].iov_len) { memcpy(data, vector[i].iov_base, vector[i].iov_len); data += vector[i].iov_len; } } option->size = size; option->id = id; list_add_tail(&option->list, &handle->options); return option; } /** * tracecmd_add_option - add options to the file * @handle: the output file handle name * @id: the id of the option * @size: the size of the option data * @data: the data to write to the file * * Returns handle to update option if needed * Just the content can be updated, with smaller or equal to * content than the specified size */ struct tracecmd_option * tracecmd_add_option(struct tracecmd_output *handle, unsigned short id, int size, const void *data) { struct iovec vect; vect.iov_base = (void *) data; vect.iov_len = size; return tracecmd_add_option_v(handle, id, &vect, 1); } int tracecmd_write_cpus(struct tracecmd_output *handle, int cpus) { int ret; ret = check_out_state(handle, TRACECMD_FILE_CPU_COUNT); if (ret < 0) { warning("Cannot write CPU count into the file, unexpected state 0x%X", handle->file_state); return ret; } cpus = convert_endian_4(handle, cpus); ret = do_write_check(handle, &cpus, 4); if (ret < 0) return ret; handle->file_state = TRACECMD_FILE_CPU_COUNT; return 0; } int tracecmd_write_options(struct tracecmd_output *handle) { struct tracecmd_option *options; unsigned short option; unsigned short endian2; unsigned int endian4; int ret; /* If already written, ignore */ if (handle->file_state == TRACECMD_FILE_OPTIONS) return 0; ret = check_out_state(handle, TRACECMD_FILE_OPTIONS); if (ret < 0) { warning("Cannot write options into the file, unexpected state 0x%X", handle->file_state); return ret; } if (do_write_check(handle, "options ", 10)) return -1; list_for_each_entry(options, &handle->options, list) { endian2 = convert_endian_2(handle, options->id); if (do_write_check(handle, &endian2, 2)) return -1; endian4 = convert_endian_4(handle, options->size); if (do_write_check(handle, &endian4, 4)) return -1; /* Save the data location in case it needs to be updated */ options->offset = lseek64(handle->fd, 0, SEEK_CUR); if (do_write_check(handle, options->data, options->size)) return -1; } option = TRACECMD_OPTION_DONE; if (do_write_check(handle, &option, 2)) return -1; handle->file_state = TRACECMD_FILE_OPTIONS; return 0; } int tracecmd_append_options(struct tracecmd_output *handle) { struct tracecmd_option *options; unsigned short option; unsigned short endian2; unsigned int endian4; off_t offset; int r; /* * We can append only if options are already written and tracing data * is not yet written */ if (handle->file_state != TRACECMD_FILE_OPTIONS) return -1; if (lseek64(handle->fd, 0, SEEK_END) == (off_t)-1) return -1; offset = lseek64(handle->fd, -2, SEEK_CUR); if (offset == (off_t)-1) return -1; r = pread(handle->fd, &option, 2, offset); if (r != 2 || option != TRACECMD_OPTION_DONE) return -1; list_for_each_entry(options, &handle->options, list) { endian2 = convert_endian_2(handle, options->id); if (do_write_check(handle, &endian2, 2)) return -1; endian4 = convert_endian_4(handle, options->size); if (do_write_check(handle, &endian4, 4)) return -1; /* Save the data location in case it needs to be updated */ options->offset = lseek64(handle->fd, 0, SEEK_CUR); if (do_write_check(handle, options->data, options->size)) return -1; } option = TRACECMD_OPTION_DONE; if (do_write_check(handle, &option, 2)) return -1; return 0; } int tracecmd_update_option(struct tracecmd_output *handle, struct tracecmd_option *option, int size, const void *data) { tsize_t offset; stsize_t ret; if (size > option->size) { warning("Can't update option with more data than allocated"); return -1; } if (handle->file_state < TRACECMD_FILE_OPTIONS) { /* Hasn't been written yet. Just update current pointer */ option->size = size; memcpy(option->data, data, size); return 0; } /* Save current offset */ offset = lseek64(handle->fd, 0, SEEK_CUR); ret = lseek64(handle->fd, option->offset, SEEK_SET); if (ret == (off64_t)-1) { warning("could not seek to %lld\n", option->offset); return -1; } if (do_write_check(handle, data, size)) return -1; ret = lseek64(handle->fd, offset, SEEK_SET); if (ret == (off64_t)-1) { warning("could not seek to %lld\n", offset); return -1; } return 0; } struct tracecmd_option * tracecmd_add_buffer_option(struct tracecmd_output *handle, const char *name, int cpus) { struct tracecmd_option *option; char *buf; int size = 8 + strlen(name) + 1; buf = malloc(size); if (!buf) { warning("Failed to malloc buffer"); return NULL; } *(tsize_t *)buf = 0; strcpy(buf + 8, name); option = tracecmd_add_option(handle, TRACECMD_OPTION_BUFFER, size, buf); free(buf); /* * In case a buffer instance has different number of CPUs as the * local machine. */ if (cpus) tracecmd_add_option(handle, TRACECMD_OPTION_CPUCOUNT, sizeof(int), &cpus); return option; } int tracecmd_write_cmdlines(struct tracecmd_output *handle) { int ret; ret = check_out_state(handle, TRACECMD_FILE_CMD_LINES); if (ret < 0) { warning("Cannot write command lines into the file, unexpected state 0x%X", handle->file_state); return ret; } ret = save_tracing_file_data(handle, "saved_cmdlines"); if (ret < 0) return ret; handle->file_state = TRACECMD_FILE_CMD_LINES; return 0; } struct tracecmd_output *tracecmd_create_file_latency(const char *output_file, int cpus) { struct tracecmd_output *handle; char *path; int ret; handle = create_file(output_file, NULL, NULL, NULL, &all_event_list); if (!handle) return NULL; /* * Save the command lines; */ if (tracecmd_write_cmdlines(handle) < 0) goto out_free; if (tracecmd_write_cpus(handle, cpus) < 0) goto out_free; if (tracecmd_write_options(handle) < 0) goto out_free; ret = check_out_state(handle, TRACECMD_FILE_CPU_LATENCY); if (ret < 0) { warning("Cannot write latency data into the file, unexpected state 0x%X", handle->file_state); goto out_free; } if (do_write_check(handle, "latency ", 10)) goto out_free; path = get_tracing_file(handle, "trace"); if (!path) goto out_free; copy_file(handle, path); put_tracing_file(path); handle->file_state = TRACECMD_FILE_CPU_LATENCY; return handle; out_free: tracecmd_output_close(handle); return NULL; } int tracecmd_write_cpu_data(struct tracecmd_output *handle, int cpus, char * const *cpu_data_files) { off64_t *offsets = NULL; unsigned long long *sizes = NULL; off64_t offset; unsigned long long endian8; off64_t check_size; char *file; struct stat st; int ret; int i; /* This can be called multiple times (when recording instances) */ ret = handle->file_state == TRACECMD_FILE_CPU_FLYRECORD ? 0 : check_out_state(handle, TRACECMD_FILE_CPU_FLYRECORD); if (ret < 0) { warning("Cannot write trace data into the file, unexpected state 0x%X", handle->file_state); goto out_free; } if (do_write_check(handle, "flyrecord", 10)) goto out_free; offsets = malloc(sizeof(*offsets) * cpus); if (!offsets) goto out_free; sizes = malloc(sizeof(*sizes) * cpus); if (!sizes) goto out_free; offset = lseek64(handle->fd, 0, SEEK_CUR); /* hold any extra data for data */ offset += cpus * (16); /* * Unfortunately, the trace_clock data was placed after the * cpu data, and wasn't accounted for with the offsets. * We need to save room for the trace_clock file. This means * we need to find the size of it before we define the final * offsets. */ file = get_tracing_file(handle, "trace_clock"); if (!file) goto out_free; /* Save room for storing the size */ offset += 8; ret = stat(file, &st); if (ret >= 0) offset += get_size(file); put_tracing_file(file); /* Page align offset */ offset = (offset + (handle->page_size - 1)) & ~(handle->page_size - 1); for (i = 0; i < cpus; i++) { file = cpu_data_files[i]; ret = stat(file, &st); if (ret < 0) { warning("can not stat '%s'", file); goto out_free; } offsets[i] = offset; sizes[i] = st.st_size; offset += st.st_size; offset = (offset + (handle->page_size - 1)) & ~(handle->page_size - 1); endian8 = convert_endian_8(handle, offsets[i]); if (do_write_check(handle, &endian8, 8)) goto out_free; endian8 = convert_endian_8(handle, sizes[i]); if (do_write_check(handle, &endian8, 8)) goto out_free; } if (save_tracing_file_data(handle, "trace_clock") < 0) goto out_free; for (i = 0; i < cpus; i++) { if (!tracecmd_get_quiet(handle)) fprintf(stderr, "CPU%d data recorded at offset=0x%llx\n", i, (unsigned long long) offsets[i]); offset = lseek64(handle->fd, offsets[i], SEEK_SET); if (offset == (off64_t)-1) { warning("could not seek to %lld\n", offsets[i]); goto out_free; } check_size = copy_file(handle, cpu_data_files[i]); if (check_size != sizes[i]) { errno = EINVAL; warning("did not match size of %lld to %lld", check_size, sizes[i]); goto out_free; } if (!tracecmd_get_quiet(handle)) fprintf(stderr, " %llu bytes in size\n", (unsigned long long)check_size); } free(offsets); free(sizes); handle->file_state = TRACECMD_FILE_CPU_FLYRECORD; return 0; out_free: free(offsets); free(sizes); return -1; } int tracecmd_append_cpu_data(struct tracecmd_output *handle, int cpus, char * const *cpu_data_files) { int ret; ret = tracecmd_write_cpus(handle, cpus); if (ret) return ret; ret = tracecmd_write_options(handle); if (ret) return ret; return tracecmd_write_cpu_data(handle, cpus, cpu_data_files); } int tracecmd_append_buffer_cpu_data(struct tracecmd_output *handle, struct tracecmd_option *option, int cpus, char * const *cpu_data_files) { tsize_t offset; stsize_t ret; offset = lseek64(handle->fd, 0, SEEK_CUR); /* Go to the option data, where will write the offest */ ret = lseek64(handle->fd, option->offset, SEEK_SET); if (ret == (off64_t)-1) { warning("could not seek to %lld\n", option->offset); return -1; } if (do_write_check(handle, &offset, 8)) return -1; /* Go back to end of file */ ret = lseek64(handle->fd, offset, SEEK_SET); if (ret == (off64_t)-1) { warning("could not seek to %lld\n", offset); return -1; } return tracecmd_write_cpu_data(handle, cpus, cpu_data_files); } struct tracecmd_output *tracecmd_get_output_handle_fd(int fd) { struct tracecmd_output *handle = NULL; struct tracecmd_input *ihandle; int fd2; /* Move the file descriptor to the beginning */ if (lseek(fd, 0, SEEK_SET) == (off_t)-1) return NULL; /* dup fd to be used by the ihandle bellow */ fd2 = dup(fd); if (fd2 < 0) return NULL; /* get a input handle from this */ ihandle = tracecmd_alloc_fd(fd2, TRACECMD_FL_LOAD_NO_PLUGINS); if (!ihandle) return NULL; tracecmd_read_headers(ihandle, 0); /* move the file descriptor to the end */ if (lseek(fd, 0, SEEK_END) == (off_t)-1) goto out_free; /* create a partial output handle */ handle = calloc(1, sizeof(*handle)); if (!handle) goto out_free; handle->fd = fd; /* get tep, state, endian and page size */ handle->file_state = tracecmd_get_file_state(ihandle); /* Use the tep of the ihandle for later writes */ handle->pevent = tracecmd_get_tep(ihandle); tep_ref(handle->pevent); handle->page_size = tracecmd_page_size(ihandle); list_head_init(&handle->options); tracecmd_close(ihandle); return handle; out_free: tracecmd_close(ihandle); free(handle); return NULL; } struct tracecmd_output * tracecmd_create_file_glob(const char *output_file, int cpus, char * const *cpu_data_files, struct tracecmd_event_list *list) { struct tracecmd_output *handle; handle = create_file(output_file, NULL, NULL, NULL, list); if (!handle) return NULL; if (tracecmd_write_cmdlines(handle)) return NULL; if (tracecmd_append_cpu_data(handle, cpus, cpu_data_files) < 0) { tracecmd_output_close(handle); return NULL; } return handle; } struct tracecmd_output *tracecmd_create_file(const char *output_file, int cpus, char * const *cpu_data_files) { return tracecmd_create_file_glob(output_file, cpus, cpu_data_files, &all_event_list); } struct tracecmd_output *tracecmd_create_init_fd(int fd) { return create_file_fd(fd, NULL, NULL, NULL, &all_event_list, NULL); } struct tracecmd_output * tracecmd_create_init_fd_msg(struct tracecmd_msg_handle *msg_handle, struct tracecmd_event_list *list) { return create_file_fd(msg_handle->fd, NULL, NULL, NULL, list, msg_handle); } struct tracecmd_output * tracecmd_create_init_fd_glob(int fd, struct tracecmd_event_list *list) { return create_file_fd(fd, NULL, NULL, NULL, list, NULL); } struct tracecmd_output * tracecmd_create_init_file_glob(const char *output_file, struct tracecmd_event_list *list) { return create_file(output_file, NULL, NULL, NULL, list); } struct tracecmd_output *tracecmd_create_init_file(const char *output_file) { return create_file(output_file, NULL, NULL, NULL, &all_event_list); } struct tracecmd_output *tracecmd_create_init_file_override(const char *output_file, const char *tracing_dir, const char *kallsyms) { return create_file(output_file, NULL, tracing_dir, kallsyms, &all_event_list); } /** * tracecmd_copy - copy the headers of one trace.dat file for another * @ihandle: input handle of the trace.dat file to copy * @file: the trace.dat file to create * * Reads the header information and creates a new trace data file * with the same characteristics (events and all) and returns * tracecmd_output handle to this new file. */ struct tracecmd_output *tracecmd_copy(struct tracecmd_input *ihandle, const char *file) { struct tracecmd_output *handle; handle = create_file(file, ihandle, NULL, NULL, &all_event_list); if (!handle) return NULL; if (tracecmd_copy_headers(ihandle, handle->fd, 0, 0) < 0) goto out_free; handle->file_state = tracecmd_get_file_state(ihandle); /* The file is all ready to have cpu data attached */ return handle; out_free: tracecmd_output_close(handle); return NULL; } trace-cmd-v2.9.6/lib/trace-cmd/trace-plugin.c000066400000000000000000000160301414302661500207220ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt * */ #include #include #include #include #include #include "trace-cmd.h" #include "trace-local.h" #define LOCAL_PLUGIN_DIR ".local/lib/trace-cmd/plugins/" struct trace_plugin_list { struct trace_plugin_list *next; char *name; void *handle; }; struct trace_plugin_context { enum tracecmd_context context; enum tracecmd_plugin_flag flags; union { void *data; struct tracecmd_input *trace_input; struct tracecmd_output *trace_output; }; }; /** * tracecmd_plugin_context_create - Create and initialize tracecmd plugins context. * @context: Context of the trace-cmd command. * @data: Pointer to the context specific data, which will be passed to plugins. * * Returns a pointer to created tracecmd plugins context, or NULL in case memory * allocation fails. The returned pointer should be freed by free (). */ struct trace_plugin_context * tracecmd_plugin_context_create(enum tracecmd_context context, void *data) { struct trace_plugin_context *trace; trace = calloc(1, sizeof(struct trace_plugin_context)); if (!trace) return NULL; trace->context = context; trace->data = data; return trace; } /** * tracecmd_plugin_set_flag - Set a flag to tracecmd plugins context. * @context: Context of the trace-cmd command. * @flag: Flag, whil will be set. * */ void tracecmd_plugin_set_flag(struct trace_plugin_context *context, enum tracecmd_plugin_flag flag) { if (context) context->flags |= flag; } /** * tracecmd_plugin_context_input - Get a tracecmd_input plugin context. * @context: Context of the trace-cmd command. * * Returns pointer to tracecmd_input, if such context is available or * NULL otherwise. */ struct tracecmd_input * tracecmd_plugin_context_input(struct trace_plugin_context *context) { if (!context || context->context != TRACECMD_INPUT) return NULL; return context->trace_input; } /** * tracecmd_plugin_context_output - Get a tracecmd_output plugin context * @context: Context of the trace-cmd command. * * Returns pointer to tracecmd_output, if such context is available or * NULL otherwise. */ struct tracecmd_output * tracecmd_plugin_context_output(struct trace_plugin_context *context) { if (!context || context->context != TRACECMD_OUTPUT) return NULL; return context->trace_output; } static void load_plugin(struct trace_plugin_context *trace, const char *path, const char *file, void *data) { struct trace_plugin_list **plugin_list = data; tracecmd_plugin_load_func func; struct trace_plugin_list *list; const char *alias; char *plugin; void *handle; int ret; ret = asprintf(&plugin, "%s/%s", path, file); if (ret < 0) { warning("could not allocate plugin memory\n"); return; } handle = dlopen(plugin, RTLD_NOW | RTLD_GLOBAL); if (!handle) { warning("could not load plugin '%s'\n%s\n", plugin, dlerror()); goto out_free; } alias = dlsym(handle, TRACECMD_PLUGIN_ALIAS_NAME); if (!alias) alias = file; func = dlsym(handle, TRACECMD_PLUGIN_LOADER_NAME); if (!func) { warning("could not find func '%s' in plugin '%s'\n%s\n", TRACECMD_PLUGIN_LOADER_NAME, plugin, dlerror()); goto out_free; } list = malloc(sizeof(*list)); if (!list) { warning("could not allocate plugin memory\n"); goto out_free; } list->next = *plugin_list; list->handle = handle; list->name = plugin; *plugin_list = list; pr_info("registering plugin: %s", plugin); func(trace); return; out_free: free(plugin); } static void load_plugins_dir(struct trace_plugin_context *trace, const char *suffix, const char *path, void (*load_plugin)(struct trace_plugin_context *trace, const char *path, const char *name, void *data), void *data) { struct dirent *dent; struct stat st; DIR *dir; int ret; ret = stat(path, &st); if (ret < 0) return; if (!S_ISDIR(st.st_mode)) return; dir = opendir(path); if (!dir) return; while ((dent = readdir(dir))) { const char *name = dent->d_name; if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) continue; /* Only load plugins that end in suffix */ if (strcmp(name + (strlen(name) - strlen(suffix)), suffix) != 0) continue; load_plugin(trace, path, name, data); } closedir(dir); } static char *get_source_plugins_dir(void) { char *p, path[PATH_MAX+1]; int ret; ret = readlink("/proc/self/exe", path, PATH_MAX); if (ret > PATH_MAX || ret < 0) return NULL; path[ret] = 0; dirname(path); p = strrchr(path, '/'); if (!p) return NULL; /* Check if we are in the the source tree */ if (strcmp(p, "/tracecmd") != 0) return NULL; strcpy(p, "/lib/trace-cmd/plugins"); return strdup(path); } static void load_plugins_hook(struct trace_plugin_context *trace, const char *suffix, void (*load_plugin)(struct trace_plugin_context *trace, const char *path, const char *name, void *data), void *data) { char *home; char *path; char *envdir; int ret; if (trace && trace->flags & TRACECMD_DISABLE_PLUGINS) return; /* * If a system plugin directory was defined, * check that first. */ #ifdef PLUGIN_TRACECMD_DIR if (!trace || !(trace->flags & TRACECMD_DISABLE_SYS_PLUGINS)) load_plugins_dir(trace, suffix, PLUGIN_TRACECMD_DIR, load_plugin, data); #endif /* * Next let the environment-set plugin directory * override the system defaults. */ envdir = getenv("TRACECMD_PLUGIN_DIR"); if (envdir) load_plugins_dir(trace, suffix, envdir, load_plugin, data); /* * Now let the home directory override the environment * or system defaults. */ home = getenv("HOME"); if (!home) return; ret = asprintf(&path, "%s/%s", home, LOCAL_PLUGIN_DIR); if (ret < 0) { warning("could not allocate plugin memory\n"); return; } load_plugins_dir(trace, suffix, path, load_plugin, data); free(path); path = get_source_plugins_dir(); if (path) { load_plugins_dir(trace, suffix, path, load_plugin, data); free(path); } } /** * tracecmd_load_plugins - Load trace-cmd specific plugins. * @context: Context of the trace-cmd command, will be passed to the plugins * at load time. * * Returns a list of loaded plugins */ struct trace_plugin_list* tracecmd_load_plugins(struct trace_plugin_context *trace) { struct trace_plugin_list *list = NULL; load_plugins_hook(trace, ".so", load_plugin, &list); return list; } /** * tracecmd_unload_plugins - Unload trace-cmd specific plugins. * @plugin_list - List of plugins, previously loaded with tracecmd_load_plugins. * @context: Context of the trace-cmd command, will be passed to the plugins * at unload time. * */ void tracecmd_unload_plugins(struct trace_plugin_list *plugin_list, struct trace_plugin_context *trace) { tracecmd_plugin_unload_func func; struct trace_plugin_list *list; while (plugin_list) { list = plugin_list; plugin_list = list->next; func = dlsym(list->handle, TRACECMD_PLUGIN_UNLOADER_NAME); if (func) func(trace); dlclose(list->handle); free(list->name); free(list); } } trace-cmd-v2.9.6/lib/trace-cmd/trace-recorder.c000066400000000000000000000306161414302661500212370ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt * */ #define _LARGEFILE64_SOURCE #include #include #include #include #include #include #include #include "tracefs.h" #include "trace-cmd-private.h" #include "event-utils.h" /* F_GETPIPE_SZ was introduced in 2.6.35, older systems don't have it */ #ifndef F_GETPIPE_SZ # define F_GETPIPE_SZ 1032 /* The Linux number for the option */ #endif #ifndef SPLICE_F_MOVE # define SPLICE_F_MOVE 1 # define SPLICE_F_NONBLOCK 2 # define SPLICE_F_MORE 4 # define SPLICE_F_GIFT 8 #endif #define POLL_TIMEOUT_MS 1000 struct tracecmd_recorder { int fd; int fd1; int fd2; int trace_fd; int brass[2]; int pipe_size; int page_size; int cpu; int stop; int max; int pages; int count; unsigned fd_flags; unsigned trace_fd_flags; unsigned flags; }; static int append_file(int size, int dst, int src) { char buf[size]; int r; lseek64(src, 0, SEEK_SET); /* If there's an error, then we are pretty much screwed :-p */ do { r = read(src, buf, size); if (r < 0) return r; r = write(dst, buf, r); if (r < 0) return r; } while (r); return 0; } void tracecmd_free_recorder(struct tracecmd_recorder *recorder) { if (!recorder) return; if (recorder->max) { /* Need to put everything into fd1 */ if (recorder->fd == recorder->fd1) { int ret; /* * Crap, the older data is in fd2, and we need * to append fd1 onto it, and then copy over to fd1 */ ret = append_file(recorder->page_size, recorder->fd2, recorder->fd1); /* Error on copying, then just keep fd1 */ if (ret) { lseek64(recorder->fd1, 0, SEEK_END); goto close; } lseek64(recorder->fd1, 0, SEEK_SET); ftruncate(recorder->fd1, 0); } append_file(recorder->page_size, recorder->fd1, recorder->fd2); } close: if (recorder->brass[0] >= 0) close(recorder->brass[0]); if (recorder->brass[1] >= 0) close(recorder->brass[1]); if (recorder->trace_fd >= 0) close(recorder->trace_fd); if (recorder->fd1 >= 0) close(recorder->fd1); if (recorder->fd2 >= 0) close(recorder->fd2); free(recorder); } struct tracecmd_recorder * tracecmd_create_buffer_recorder_fd2(int fd, int fd2, int cpu, unsigned flags, const char *buffer, int maxkb) { struct tracecmd_recorder *recorder; char *path = NULL; int pipe_size = 0; int ret; recorder = malloc(sizeof(*recorder)); if (!recorder) return NULL; recorder->cpu = cpu; recorder->flags = flags; recorder->fd_flags = SPLICE_F_MOVE; if (!(recorder->flags & TRACECMD_RECORD_BLOCK)) recorder->fd_flags |= SPLICE_F_NONBLOCK; recorder->trace_fd_flags = SPLICE_F_MOVE; /* Init to know what to free and release */ recorder->trace_fd = -1; recorder->brass[0] = -1; recorder->brass[1] = -1; recorder->page_size = getpagesize(); if (maxkb) { int kb_per_page = recorder->page_size >> 10; if (!kb_per_page) kb_per_page = 1; recorder->max = maxkb / kb_per_page; /* keep max half */ recorder->max >>= 1; if (!recorder->max) recorder->max = 1; } else recorder->max = 0; recorder->count = 0; recorder->pages = 0; /* fd always points to what to write to */ recorder->fd = fd; recorder->fd1 = fd; recorder->fd2 = fd2; if (buffer) { if (flags & TRACECMD_RECORD_SNAPSHOT) ret = asprintf(&path, "%s/per_cpu/cpu%d/snapshot_raw", buffer, cpu); else ret = asprintf(&path, "%s/per_cpu/cpu%d/trace_pipe_raw", buffer, cpu); if (ret < 0) goto out_free; recorder->trace_fd = open(path, O_RDONLY); free(path); if (recorder->trace_fd < 0) goto out_free; } if (!(recorder->flags & (TRACECMD_RECORD_NOSPLICE | TRACECMD_RECORD_NOBRASS))) { ret = pipe(recorder->brass); if (ret < 0) goto out_free; ret = fcntl(recorder->brass[0], F_GETPIPE_SZ, &pipe_size); /* * F_GETPIPE_SZ was introduced in 2.6.35, ftrace was introduced * in 2.6.31. If we are running on an older kernel, just fall * back to using page_size for splice(). It could also return * success, but not modify pipe_size. */ if (ret < 0 || !pipe_size) pipe_size = recorder->page_size; recorder->pipe_size = pipe_size; } return recorder; out_free: tracecmd_free_recorder(recorder); return NULL; } struct tracecmd_recorder * tracecmd_create_buffer_recorder_fd(int fd, int cpu, unsigned flags, const char *buffer) { return tracecmd_create_buffer_recorder_fd2(fd, -1, cpu, flags, buffer, 0); } static struct tracecmd_recorder * __tracecmd_create_buffer_recorder(const char *file, int cpu, unsigned flags, const char *buffer) { struct tracecmd_recorder *recorder; int fd; fd = open(file, O_WRONLY | O_CREAT | O_TRUNC | O_LARGEFILE, 0644); if (fd < 0) return NULL; recorder = tracecmd_create_buffer_recorder_fd(fd, cpu, flags, buffer); if (!recorder) { close(fd); unlink(file); } return recorder; } struct tracecmd_recorder * tracecmd_create_buffer_recorder_maxkb(const char *file, int cpu, unsigned flags, const char *buffer, int maxkb) { struct tracecmd_recorder *recorder = NULL; char *file2; int len; int fd; int fd2; if (!maxkb) return tracecmd_create_buffer_recorder(file, cpu, flags, buffer); len = strlen(file); file2 = malloc(len + 3); if (!file2) return NULL; sprintf(file2, "%s.1", file); fd = open(file, O_RDWR | O_CREAT | O_TRUNC | O_LARGEFILE, 0644); if (fd < 0) goto out; fd2 = open(file2, O_RDWR | O_CREAT | O_TRUNC | O_LARGEFILE, 0644); if (fd2 < 0) goto err; recorder = tracecmd_create_buffer_recorder_fd2(fd, fd2, cpu, flags, buffer, maxkb); if (!recorder) goto err2; out: /* Unlink file2, we need to add everything to file at the end */ unlink(file2); free(file2); return recorder; err2: close(fd2); err: close(fd); unlink(file); goto out; } struct tracecmd_recorder * tracecmd_create_buffer_recorder(const char *file, int cpu, unsigned flags, const char *buffer) { return __tracecmd_create_buffer_recorder(file, cpu, flags, buffer); } /** * tracecmd_create_recorder_virt - Create a recorder reading tracing data * from the trace_fd file descriptor instead of from the local tracefs * @file: output filename where tracing data will be written * @cpu: which CPU is being traced * @flags: flags configuring the recorder (see TRACECMD_RECORDER_* enums) * @trace_fd: file descriptor from where tracing data will be read */ struct tracecmd_recorder * tracecmd_create_recorder_virt(const char *file, int cpu, unsigned flags, int trace_fd) { struct tracecmd_recorder *recorder; recorder = __tracecmd_create_buffer_recorder(file, cpu, flags, NULL); if (recorder) recorder->trace_fd = trace_fd; return recorder; } struct tracecmd_recorder *tracecmd_create_recorder_fd(int fd, int cpu, unsigned flags) { const char *tracing; tracing = tracefs_tracing_dir(); if (!tracing) { errno = ENODEV; return NULL; } return tracecmd_create_buffer_recorder_fd(fd, cpu, flags, tracing); } struct tracecmd_recorder *tracecmd_create_recorder(const char *file, int cpu, unsigned flags) { const char *tracing; tracing = tracefs_tracing_dir(); if (!tracing) { errno = ENODEV; return NULL; } return tracecmd_create_buffer_recorder(file, cpu, flags, tracing); } struct tracecmd_recorder * tracecmd_create_recorder_maxkb(const char *file, int cpu, unsigned flags, int maxkb) { const char *tracing; tracing = tracefs_tracing_dir(); if (!tracing) { errno = ENODEV; return NULL; } return tracecmd_create_buffer_recorder_maxkb(file, cpu, flags, tracing, maxkb); } static inline void update_fd(struct tracecmd_recorder *recorder, int size) { int fd; if (!recorder->max) return; recorder->count += size; if (recorder->count >= recorder->page_size) { recorder->count = 0; recorder->pages++; } if (recorder->pages < recorder->max) return; recorder->pages = 0; fd = recorder->fd; /* Swap fd to next file. */ if (fd == recorder->fd1) fd = recorder->fd2; else fd = recorder->fd1; /* Zero out the new file we are writing to */ lseek64(fd, 0, SEEK_SET); ftruncate(fd, 0); recorder->fd = fd; } /* * Returns -1 on error. * or bytes of data read. */ static long splice_data(struct tracecmd_recorder *recorder) { long total_read = 0; long read; long ret; read = splice(recorder->trace_fd, NULL, recorder->brass[1], NULL, recorder->pipe_size, recorder->trace_fd_flags); if (read < 0) { if (errno == EAGAIN || errno == EINTR || errno == ENOTCONN) return 0; warning("recorder error in splice input"); return -1; } else if (read == 0) return 0; again: ret = splice(recorder->brass[0], NULL, recorder->fd, NULL, read, recorder->fd_flags); if (ret < 0) { if (errno != EAGAIN && errno != EINTR) { warning("recorder error in splice output"); return -1; } return total_read; } else update_fd(recorder, ret); total_read = ret; read -= ret; if (read) goto again; return total_read; } /* * Returns -1 on error. * or bytes of data read. */ static long direct_splice_data(struct tracecmd_recorder *recorder) { struct pollfd pfd = { .fd = recorder->trace_fd, .events = POLLIN, }; long read; int ret; /* * splice(2) in Linux used to not check O_NONBLOCK flag of pipe file * descriptors before [1]. To avoid getting blocked in the splice(2) * call below after the user had requested to stop tracing, we poll(2) * here. This poll() is not necessary on newer kernels. * * [1] https://github.com/torvalds/linux/commit/ee5e001196d1345b8fee25925ff5f1d67936081e */ ret = poll(&pfd, 1, POLL_TIMEOUT_MS); if (ret < 0) return -1; if (!(pfd.revents | POLLIN)) return 0; read = splice(recorder->trace_fd, NULL, recorder->fd, NULL, recorder->pipe_size, recorder->fd_flags); if (read < 0) { if (errno == EAGAIN || errno == EINTR || errno == ENOTCONN) return 0; warning("recorder error in splice input"); return -1; } return read; } /* * Returns -1 on error. * or bytes of data read. */ static long read_data(struct tracecmd_recorder *recorder) { char buf[recorder->page_size]; long left; long r, w; r = read(recorder->trace_fd, buf, recorder->page_size); if (r < 0) { if (errno == EAGAIN || errno == EINTR || errno == ENOTCONN) return 0; warning("recorder error in read input"); return -1; } left = r; do { w = write(recorder->fd, buf + (r - left), left); if (w > 0) { left -= w; update_fd(recorder, w); } } while (w >= 0 && left); if (w < 0) r = w; return r; } static long move_data(struct tracecmd_recorder *recorder) { if (recorder->flags & TRACECMD_RECORD_NOSPLICE) return read_data(recorder); if (recorder->flags & TRACECMD_RECORD_NOBRASS) return direct_splice_data(recorder); return splice_data(recorder); } static void set_nonblock(struct tracecmd_recorder *recorder) { long flags; /* Do not block on reads for flushing */ flags = fcntl(recorder->trace_fd, F_GETFL); fcntl(recorder->trace_fd, F_SETFL, flags | O_NONBLOCK); /* Do not block on streams for write */ recorder->fd_flags |= SPLICE_F_NONBLOCK; } long tracecmd_flush_recording(struct tracecmd_recorder *recorder) { char buf[recorder->page_size]; long total = 0; long wrote = 0; long ret; set_nonblock(recorder); do { ret = move_data(recorder); if (ret < 0) return ret; total += ret; } while (ret); /* splice only reads full pages */ do { ret = read(recorder->trace_fd, buf, recorder->page_size); if (ret > 0) { write(recorder->fd, buf, ret); wrote += ret; } } while (ret > 0); /* Make sure we finish off with a page size boundary */ wrote &= recorder->page_size - 1; if (wrote) { memset(buf, 0, recorder->page_size); write(recorder->fd, buf, recorder->page_size - wrote); total += recorder->page_size; } return total; } int tracecmd_start_recording(struct tracecmd_recorder *recorder, unsigned long sleep) { struct timespec req = { .tv_sec = sleep / 1000000, .tv_nsec = (sleep % 1000000) * 1000, }; long read = 1; long ret; recorder->stop = 0; do { /* Only sleep if we did not read anything last time */ if (!read && sleep) nanosleep(&req, NULL); read = 0; do { ret = move_data(recorder); if (ret < 0) return ret; read += ret; } while (ret); } while (!recorder->stop); /* Flush out the rest */ ret = tracecmd_flush_recording(recorder); if (ret < 0) return ret; return 0; } void tracecmd_stop_recording(struct tracecmd_recorder *recorder) { if (!recorder) return; set_nonblock(recorder); recorder->stop = 1; } trace-cmd-v2.9.6/lib/trace-cmd/trace-timesync.c000066400000000000000000000610461414302661500212660ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2019, VMware, Tzvetomir Stoyanov * */ #include #include #include #include #ifdef VSOCK #include #endif #include #include #include #include #include #include #include #include "trace-cmd-private.h" #include "tracefs.h" #include "event-utils.h" #include "trace-tsync-local.h" struct tsync_proto { struct tsync_proto *next; char proto_name[TRACECMD_TSYNC_PNAME_LENGTH]; enum tracecmd_time_sync_role roles; int accuracy; int supported_clocks; unsigned int flags; int (*clock_sync_init)(struct tracecmd_time_sync *clock_context); int (*clock_sync_free)(struct tracecmd_time_sync *clock_context); int (*clock_sync_calc)(struct tracecmd_time_sync *clock_context, long long *offset, long long *scaling, long long *timestamp); }; static struct tsync_proto *tsync_proto_list; static struct tsync_proto *tsync_proto_find(const char *proto_name) { struct tsync_proto *proto; if (!proto_name) return NULL; for (proto = tsync_proto_list; proto; proto = proto->next) { if (strlen(proto->proto_name) == strlen(proto_name) && !strncmp(proto->proto_name, proto_name, TRACECMD_TSYNC_PNAME_LENGTH)) return proto; } return NULL; } int tracecmd_tsync_proto_register(const char *proto_name, int accuracy, int roles, int supported_clocks, unsigned int flags, int (*init)(struct tracecmd_time_sync *), int (*free)(struct tracecmd_time_sync *), int (*calc)(struct tracecmd_time_sync *, long long *, long long *, long long *)) { struct tsync_proto *proto = NULL; if (tsync_proto_find(proto_name)) return -1; proto = calloc(1, sizeof(struct tsync_proto)); if (!proto) return -1; strncpy(proto->proto_name, proto_name, TRACECMD_TSYNC_PNAME_LENGTH); proto->accuracy = accuracy; proto->roles = roles; proto->supported_clocks = supported_clocks; proto->clock_sync_init = init; proto->clock_sync_free = free; proto->clock_sync_calc = calc; proto->next = tsync_proto_list; tsync_proto_list = proto; return 0; } int tracecmd_tsync_proto_unregister(char *proto_name) { struct tsync_proto **last = &tsync_proto_list; if (!proto_name) return -1; for (; *last; last = &(*last)->next) { if (strlen((*last)->proto_name) == strlen(proto_name) && !strncmp((*last)->proto_name, proto_name, TRACECMD_TSYNC_PNAME_LENGTH)) { struct tsync_proto *proto = *last; *last = proto->next; free(proto); return 0; } } return -1; } bool tsync_proto_is_supported(const char *proto_name) { if (tsync_proto_find(proto_name)) return true; return false; } /** * tracecmd_tsync_get_offsets - Return the calculated time offsets * * @tsync: Pointer to time sync context * @count: Returns the number of calculated time offsets * @ts: Array of size @count containing timestamps of callculated offsets * @offsets: array of size @count, containing offsets for each timestamp * @scalings: array of size @count, containing scaling ratios for each timestamp * * Retuns -1 in case of an error, or 0 otherwise */ int tracecmd_tsync_get_offsets(struct tracecmd_time_sync *tsync, int *count, long long **ts, long long **offsets, long long **scalings) { struct clock_sync_context *tsync_context; if (!tsync || !tsync->context) return -1; tsync_context = (struct clock_sync_context *)tsync->context; if (count) *count = tsync_context->sync_count; if (ts) *ts = tsync_context->sync_ts; if (offsets) *offsets = tsync_context->sync_offsets; if (scalings) *scalings = tsync_context->sync_scalings; return 0; } /** * tsync_get_proto_flags - Get protocol flags * * @tsync: Pointer to time sync context * @flags: Returns the protocol flags, a combination of TRACECMD_TSYNC_FLAG_... * * Retuns -1 in case of an error, or 0 otherwise */ static int tsync_get_proto_flags(struct tracecmd_time_sync *tsync, unsigned int *flags) { struct tsync_proto *protocol; if (!tsync) return -1; protocol = tsync_proto_find(tsync->proto_name); if (!protocol) return -1; if (flags) *flags = protocol->flags; return 0; } #define PROTO_MASK_SIZE (sizeof(char)) #define PROTO_MASK_BITS (PROTO_MASK_SIZE * 8) /** * tsync_proto_select - Select time sync protocol, to be used for * timestamp synchronization with a peer * * @protos: list of tsync protocol names * @clock : trace clock * @role : local time sync role * * Retuns pointer to a protocol name, that can be used with the peer, or NULL * in case there is no match with supported protocols. * The returned string MUST NOT be freed by the caller */ static const char * tsync_proto_select(const struct tracecmd_tsync_protos *protos, const char *clock, enum tracecmd_time_sync_role role) { struct tsync_proto *selected = NULL; struct tsync_proto *proto; char **pname; int clock_id = 0; if (!protos) return NULL; clock_id = tracecmd_clock_str2id(clock); pname = protos->names; while (*pname) { for (proto = tsync_proto_list; proto; proto = proto->next) { if (!(proto->roles & role)) continue; if (proto->supported_clocks && clock_id && !(proto->supported_clocks & clock_id)) continue; if (strncmp(proto->proto_name, *pname, TRACECMD_TSYNC_PNAME_LENGTH)) continue; if (selected) { if (selected->accuracy > proto->accuracy) selected = proto; } else selected = proto; } pname++; } if (selected) return selected->proto_name; return NULL; } /** * tracecmd_tsync_proto_getall - Returns list of all supported * time sync protocols * @protos: return, allocated list of time sync protocol names, * supported by the peer. Must be freed by free() * @clock: selected trace clock * @role: supported protocol role * * If completed successfully 0 is returned and allocated list of strings in @protos. * The last list entry is NULL. In case of an error, -1 is returned. * @protos must be freed with free() */ int tracecmd_tsync_proto_getall(struct tracecmd_tsync_protos **protos, const char *clock, int role) { struct tracecmd_tsync_protos *plist = NULL; struct tsync_proto *proto; int clock_id = 0; int count = 1; int i; if (clock) clock_id = tracecmd_clock_str2id(clock); for (proto = tsync_proto_list; proto; proto = proto->next) { if (!(proto->roles & role)) continue; if (proto->supported_clocks && clock_id && !(proto->supported_clocks & clock_id)) continue; count++; } plist = calloc(1, sizeof(struct tracecmd_tsync_protos)); if (!plist) goto error; plist->names = calloc(count, sizeof(char *)); if (!plist->names) return -1; for (i = 0, proto = tsync_proto_list; proto && i < (count - 1); proto = proto->next) { if (!(proto->roles & role)) continue; if (proto->supported_clocks && clock_id && !(proto->supported_clocks & clock_id)) continue; plist->names[i++] = proto->proto_name; } *protos = plist; return 0; error: if (plist) { free(plist->names); free(plist); } return -1; } static int get_first_cpu(cpu_set_t **pin_mask, size_t *m_size) { int cpus = tracecmd_count_cpus(); cpu_set_t *cpu_mask; int mask_size; int i; cpu_mask = CPU_ALLOC(cpus); *pin_mask = CPU_ALLOC(cpus); if (!cpu_mask || !*pin_mask || 1) goto error; mask_size = CPU_ALLOC_SIZE(cpus); CPU_ZERO_S(mask_size, cpu_mask); CPU_ZERO_S(mask_size, *pin_mask); if (sched_getaffinity(0, mask_size, cpu_mask) == -1) goto error; for (i = 0; i < cpus; i++) { if (CPU_ISSET_S(i, mask_size, cpu_mask)) { CPU_SET_S(i, mask_size, *pin_mask); break; } } if (CPU_COUNT_S(mask_size, *pin_mask) < 1) goto error; CPU_FREE(cpu_mask); *m_size = mask_size; return 0; error: if (cpu_mask) CPU_FREE(cpu_mask); if (*pin_mask) CPU_FREE(*pin_mask); *pin_mask = NULL; *m_size = 0; return -1; } #ifdef VSOCK static int vsock_open(unsigned int cid, unsigned int port) { struct sockaddr_vm addr = { .svm_family = AF_VSOCK, .svm_cid = cid, .svm_port = port, }; int sd; sd = socket(AF_VSOCK, SOCK_STREAM, 0); if (sd < 0) return -errno; if (connect(sd, (struct sockaddr *)&addr, sizeof(addr))) return -errno; return sd; } static int vsock_make(void) { struct sockaddr_vm addr = { .svm_family = AF_VSOCK, .svm_cid = VMADDR_CID_ANY, .svm_port = VMADDR_PORT_ANY, }; int sd; sd = socket(AF_VSOCK, SOCK_STREAM, 0); if (sd < 0) return -errno; setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int)); if (bind(sd, (struct sockaddr *)&addr, sizeof(addr))) return -errno; if (listen(sd, SOMAXCONN)) return -errno; return sd; } int vsock_get_port(int sd, unsigned int *port) { struct sockaddr_vm addr; socklen_t addr_len = sizeof(addr); if (getsockname(sd, (struct sockaddr *)&addr, &addr_len)) return -errno; if (addr.svm_family != AF_VSOCK) return -EINVAL; if (port) *port = addr.svm_port; return 0; } static int get_vsocket_params(int fd, unsigned int *lcid, unsigned int *lport, unsigned int *rcid, unsigned int *rport) { struct sockaddr_vm addr; socklen_t addr_len = sizeof(addr); memset(&addr, 0, sizeof(addr)); if (getsockname(fd, (struct sockaddr *)&addr, &addr_len)) return -1; if (addr.svm_family != AF_VSOCK) return -1; *lport = addr.svm_port; *lcid = addr.svm_cid; memset(&addr, 0, sizeof(addr)); addr_len = sizeof(addr); if (getpeername(fd, (struct sockaddr *)&addr, &addr_len)) return -1; if (addr.svm_family != AF_VSOCK) return -1; *rport = addr.svm_port; *rcid = addr.svm_cid; return 0; } #else static int vsock_open(unsigned int cid, unsigned int port) { return -ENOTSUP; } static int vsock_make(void) { return -ENOTSUP; } static int vsock_get_port(int sd, unsigned int *port) { return -ENOTSUP; } static int get_vsocket_params(int fd, unsigned int *lcid, unsigned int *lport, unsigned int *rcid, unsigned int *rport) { return -ENOTSUP; } #endif /* VSOCK */ static struct tracefs_instance * clock_synch_create_instance(const char *clock, unsigned int cid) { struct tracefs_instance *instance; char inst_name[256]; snprintf(inst_name, 256, "clock_synch-%d", cid); instance = tracefs_instance_create(inst_name); if (!instance) return NULL; tracefs_instance_file_write(instance, "trace", "\0"); if (clock) tracefs_instance_file_write(instance, "trace_clock", clock); return instance; } static void clock_synch_delete_instance(struct tracefs_instance *inst) { if (!inst) return; tracefs_instance_destroy(inst); tracefs_instance_free(inst); } static int clock_context_init(struct tracecmd_time_sync *tsync, struct tsync_proto **proto, bool guest) { struct clock_sync_context *clock = NULL; struct tsync_proto *protocol; if (tsync->context) return 0; protocol = tsync_proto_find(tsync->proto_name); if (!protocol || !protocol->clock_sync_calc) return -1; clock = calloc(1, sizeof(struct clock_sync_context)); if (!clock) return -1; clock->is_guest = guest; clock->is_server = clock->is_guest; if (get_vsocket_params(tsync->msg_handle->fd, &clock->local_cid, &clock->local_port, &clock->remote_cid, &clock->remote_port)) goto error; clock->instance = clock_synch_create_instance(tsync->clock_str, clock->remote_cid); if (!clock->instance) goto error; tsync->context = clock; if (protocol->clock_sync_init && protocol->clock_sync_init(tsync) < 0) goto error; *proto = protocol; return 0; error: tsync->context = NULL; free(clock); return -1; } /** * tracecmd_tsync_free - Free time sync context, allocated by * tracecmd_tsync_with_host() or tracecmd_tsync_with_guest() APIs * * @tsync: Pointer to time sync context * */ void tracecmd_tsync_free(struct tracecmd_time_sync *tsync) { struct clock_sync_context *tsync_context; struct tsync_proto *proto; if (!tsync || !tsync->context) return; tsync_context = (struct clock_sync_context *)tsync->context; proto = tsync_proto_find(tsync->proto_name); if (proto && proto->clock_sync_free) proto->clock_sync_free(tsync); clock_synch_delete_instance(tsync_context->instance); tsync_context->instance = NULL; free(tsync_context->sync_ts); free(tsync_context->sync_offsets); free(tsync_context->sync_scalings); tsync_context->sync_ts = NULL; tsync_context->sync_offsets = NULL; tsync_context->sync_scalings = NULL; tsync_context->sync_count = 0; tsync_context->sync_size = 0; pthread_mutex_destroy(&tsync->lock); pthread_cond_destroy(&tsync->cond); pthread_barrier_destroy(&tsync->first_sync); free(tsync->clock_str); free(tsync->proto_name); free(tsync); } static int tsync_send(struct tracecmd_time_sync *tsync, struct tsync_proto *proto) { long long timestamp = 0; long long scaling = 0; long long offset = 0; int ret; ret = proto->clock_sync_calc(tsync, &offset, &scaling, ×tamp); return ret; } static void tsync_with_host(struct tracecmd_time_sync *tsync) { char protocol[TRACECMD_TSYNC_PNAME_LENGTH]; struct tsync_proto *proto; unsigned int command; int ret; clock_context_init(tsync, &proto, true); if (!tsync->context) return; while (true) { ret = tracecmd_msg_recv_time_sync(tsync->msg_handle, protocol, &command, NULL, NULL); if (ret || strncmp(protocol, TRACECMD_TSYNC_PROTO_NONE, TRACECMD_TSYNC_PNAME_LENGTH) || command != TRACECMD_TIME_SYNC_CMD_PROBE) break; ret = tsync_send(tsync, proto); if (ret) break; } } static int tsync_get_sample(struct tracecmd_time_sync *tsync, struct tsync_proto *proto, int array_step) { struct clock_sync_context *clock; long long *sync_scalings = NULL; long long *sync_offsets = NULL; long long *sync_ts = NULL; long long timestamp = 0; long long scaling = 0; long long offset = 0; int ret; ret = proto->clock_sync_calc(tsync, &offset, &scaling, ×tamp); if (ret) { warning("Failed to synchronize timestamps with guest"); return -1; } if (!offset || !timestamp || !scaling) return 0; clock = tsync->context; if (clock->sync_count >= clock->sync_size) { sync_ts = realloc(clock->sync_ts, (clock->sync_size + array_step) * sizeof(long long)); sync_offsets = realloc(clock->sync_offsets, (clock->sync_size + array_step) * sizeof(long long)); sync_scalings = realloc(clock->sync_scalings, (clock->sync_size + array_step) * sizeof(long long)); if (!sync_ts || !sync_offsets || !sync_scalings) { free(sync_ts); free(sync_offsets); free(sync_scalings); return -1; } clock->sync_size += array_step; clock->sync_ts = sync_ts; clock->sync_offsets = sync_offsets; clock->sync_scalings = sync_scalings; } clock->sync_ts[clock->sync_count] = timestamp; clock->sync_offsets[clock->sync_count] = offset; clock->sync_scalings[clock->sync_count] = scaling; clock->sync_count++; return 0; } #define TIMER_SEC_NANO 1000000000LL static inline void get_ts_loop_delay(struct timespec *timeout, int delay_ms) { memset(timeout, 0, sizeof(struct timespec)); clock_gettime(CLOCK_REALTIME, timeout); timeout->tv_nsec += ((unsigned long long)delay_ms * 1000000LL); if (timeout->tv_nsec >= TIMER_SEC_NANO) { timeout->tv_sec += timeout->tv_nsec / TIMER_SEC_NANO; timeout->tv_nsec %= TIMER_SEC_NANO; } } #define CLOCK_TS_ARRAY 5 static int tsync_with_guest(struct tracecmd_time_sync *tsync) { int ts_array_size = CLOCK_TS_ARRAY; struct tsync_proto *proto; struct timespec timeout; bool first = true; bool end = false; int ret; clock_context_init(tsync, &proto, false); if (!tsync->context) { pthread_barrier_wait(&tsync->first_sync); return -1; } if (tsync->loop_interval > 0 && tsync->loop_interval < (CLOCK_TS_ARRAY * 1000)) ts_array_size = (CLOCK_TS_ARRAY * 1000) / tsync->loop_interval; while (true) { pthread_mutex_lock(&tsync->lock); ret = tracecmd_msg_send_time_sync(tsync->msg_handle, TRACECMD_TSYNC_PROTO_NONE, TRACECMD_TIME_SYNC_CMD_PROBE, 0, NULL); ret = tsync_get_sample(tsync, proto, ts_array_size); if (first) { first = false; pthread_barrier_wait(&tsync->first_sync); } if (ret || end) break; if (tsync->loop_interval > 0) { get_ts_loop_delay(&timeout, tsync->loop_interval); ret = pthread_cond_timedwait(&tsync->cond, &tsync->lock, &timeout); pthread_mutex_unlock(&tsync->lock); if (ret && ret != ETIMEDOUT) break; else if (!ret) end = true; } else { pthread_cond_wait(&tsync->cond, &tsync->lock); end = true; pthread_mutex_unlock(&tsync->lock); } }; tracecmd_msg_send_time_sync(tsync->msg_handle, TRACECMD_TSYNC_PROTO_NONE, TRACECMD_TIME_SYNC_CMD_STOP, 0, NULL); return 0; } static void *tsync_host_thread(void *data) { struct tracecmd_time_sync *tsync = NULL; tsync = (struct tracecmd_time_sync *)data; tsync_with_guest(tsync); tracecmd_msg_handle_close(tsync->msg_handle); tsync->msg_handle = NULL; pthread_exit(0); } /** * tracecmd_tsync_with_guest - Synchronize timestamps with guest * * @trace_id: Local ID for the current trace session * @cid: CID of the guest * @port: VSOCKET port, on which the guest listens for tsync requests * @guest_pid: PID of the host OS process, running the guest * @guest_cpus: Number of the guest VCPUs * @proto_name: Name of the negotiated time synchronization protocol * @clock: Trace clock, used for that session * * On success, a pointer to time sync context is returned, or NULL in * case of an error. The context must be freed with tracecmd_tsync_free() * * This API spawns a pthread, which performs time stamps synchronization * until tracecmd_tsync_with_guest_stop() is called. */ struct tracecmd_time_sync * tracecmd_tsync_with_guest(unsigned long long trace_id, int loop_interval, unsigned int cid, unsigned int port, int guest_pid, int guest_cpus, const char *proto_name, const char *clock) { struct tracecmd_time_sync *tsync; cpu_set_t *pin_mask = NULL; pthread_attr_t attrib; size_t mask_size = 0; int fd = -1; int ret; if (!proto_name) return NULL; tsync = calloc(1, sizeof(*tsync)); if (!tsync) return NULL; tsync->trace_id = trace_id; tsync->loop_interval = loop_interval; tsync->proto_name = strdup(proto_name); fd = vsock_open(cid, port); if (fd < 0) goto error; tsync->msg_handle = tracecmd_msg_handle_alloc(fd, 0); if (!tsync->msg_handle) { ret = -1; goto error; } tsync->guest_pid = guest_pid; tsync->vcpu_count = guest_cpus; if (clock) tsync->clock_str = strdup(clock); pthread_mutex_init(&tsync->lock, NULL); pthread_cond_init(&tsync->cond, NULL); pthread_barrier_init(&tsync->first_sync, NULL, 2); pthread_attr_init(&attrib); pthread_attr_setdetachstate(&attrib, PTHREAD_CREATE_JOINABLE); ret = pthread_create(&tsync->thread, &attrib, tsync_host_thread, tsync); if (ret) goto error; tsync->thread_running = true; if (!get_first_cpu(&pin_mask, &mask_size)) pthread_setaffinity_np(tsync->thread, mask_size, pin_mask); pthread_barrier_wait(&tsync->first_sync); if (pin_mask) CPU_FREE(pin_mask); pthread_attr_destroy(&attrib); return tsync; error: if (tsync->msg_handle) tracecmd_msg_handle_close(tsync->msg_handle); else if (fd >= 0) close(fd); free(tsync); return NULL; } /** * tracecmd_write_guest_time_shift - Write collected timestamp corrections in a file * * @handle: Handle to a trace file, where timestamp corrections will be saved * @tsync: Time sync context with collected timestamp corrections * * Returns 0 on success, or -1 in case of an error. * * This API writes collected timestamp corrections in the metadata of the * trace file, as TRACECMD_OPTION_TIME_SHIFT option. */ int tracecmd_write_guest_time_shift(struct tracecmd_output *handle, struct tracecmd_time_sync *tsync) { struct iovec vector[6]; unsigned int flags; long long *scalings = NULL; long long *offsets = NULL; long long *ts = NULL; int count; int ret; ret = tracecmd_tsync_get_offsets(tsync, &count, &ts, &offsets, &scalings); if (ret < 0 || !count || !ts || !offsets || !scalings) return -1; ret = tsync_get_proto_flags(tsync, &flags); if (ret < 0) return -1; vector[0].iov_len = 8; vector[0].iov_base = &(tsync->trace_id); vector[1].iov_len = 4; vector[1].iov_base = &flags; vector[2].iov_len = 4; vector[2].iov_base = &count; vector[3].iov_len = 8 * count; vector[3].iov_base = ts; vector[4].iov_len = 8 * count; vector[4].iov_base = offsets; vector[5].iov_len = 8 * count; vector[5].iov_base = scalings; tracecmd_add_option_v(handle, TRACECMD_OPTION_TIME_SHIFT, vector, 6); tracecmd_append_options(handle); #ifdef TSYNC_DEBUG if (count > 1) printf("Got %d timestamp synch samples in %lld ns trace\n\r", count, ts[count - 1] - ts[0]); #endif return 0; } /** * tracecmd_tsync_with_guest_stop - Stop the time sync session with a guest * * @tsync: Time sync context, representing a running time sync session * * Returns 0 on success, or -1 in case of an error. * */ int tracecmd_tsync_with_guest_stop(struct tracecmd_time_sync *tsync) { if (!tsync || !tsync->thread_running) return -1; /* Signal the time synchronization thread to complete and wait for it */ pthread_mutex_lock(&tsync->lock); pthread_cond_signal(&tsync->cond); pthread_mutex_unlock(&tsync->lock); pthread_join(tsync->thread, NULL); return 0; } static void *tsync_agent_thread(void *data) { struct tracecmd_time_sync *tsync = NULL; int sd; tsync = (struct tracecmd_time_sync *)data; while (true) { sd = accept(tsync->msg_handle->fd, NULL, NULL); if (sd < 0) { if (errno == EINTR) continue; goto out; } break; } close(tsync->msg_handle->fd); tsync->msg_handle->fd = sd; tsync_with_host(tsync); out: tracecmd_msg_handle_close(tsync->msg_handle); tracecmd_tsync_free(tsync); free(tsync); close(sd); pthread_exit(0); } /** * tracecmd_tsync_with_host - Synchronize timestamps with host * * @tsync_protos: List of tsync protocols, supported by the host * @clock: Trace clock, used for that session * @port: returned, VSOCKET port, on which the guest listens for tsync requests * * On success, a pointer to time sync context is returned, or NULL in * case of an error. The context must be freed with tracecmd_tsync_free() * * This API spawns a pthread, which performs time stamps synchronization * until tracecmd_tsync_with_host_stop() is called. */ struct tracecmd_time_sync * tracecmd_tsync_with_host(const struct tracecmd_tsync_protos *tsync_protos, const char *clock) { struct tracecmd_time_sync *tsync; cpu_set_t *pin_mask = NULL; pthread_attr_t attrib; size_t mask_size = 0; unsigned int port; const char *proto; int ret; int fd; tsync = calloc(1, sizeof(struct tracecmd_time_sync)); if (!tsync) return NULL; proto = tsync_proto_select(tsync_protos, clock, TRACECMD_TIME_SYNC_ROLE_GUEST); if (!proto) goto error; tsync->proto_name = strdup(proto); fd = vsock_make(); if (fd < 0) goto error; if (vsock_get_port(fd, &port) < 0) goto error; tsync->msg_handle = tracecmd_msg_handle_alloc(fd, 0); if (clock) tsync->clock_str = strdup(clock); pthread_attr_init(&attrib); tsync->vcpu_count = tracecmd_count_cpus(); pthread_attr_setdetachstate(&attrib, PTHREAD_CREATE_JOINABLE); ret = pthread_create(&tsync->thread, &attrib, tsync_agent_thread, tsync); if (ret) { pthread_attr_destroy(&attrib); goto error; } tsync->thread_running = true; if (!get_first_cpu(&pin_mask, &mask_size)) pthread_setaffinity_np(tsync->thread, mask_size, pin_mask); if (pin_mask) CPU_FREE(pin_mask); pthread_attr_destroy(&attrib); return tsync; error: if (tsync) { if (tsync->msg_handle) tracecmd_msg_handle_close(tsync->msg_handle); else if (fd >= 0) close(fd); free(tsync->clock_str); free(tsync); } return NULL; } /** * tracecmd_tsync_with_host_stop - Stop the time sync session with a host * * @tsync: Time sync context, representing a running time sync session * * Returns 0 on success, or error number in case of an error. * */ int tracecmd_tsync_with_host_stop(struct tracecmd_time_sync *tsync) { return pthread_join(tsync->thread, NULL); } /** * tracecmd_tsync_get_session_params - Get parameters of established time sync session * * @tsync: Time sync context, representing a running time sync session * @selected_proto: return, name of the selected time sync protocol for this session * @tsync_port: return, a VSOCK port on which new time sync requests are accepted. * * Returns 0 on success, or -1 in case of an error. * */ int tracecmd_tsync_get_session_params(struct tracecmd_time_sync *tsync, char **selected_proto, unsigned int *tsync_port) { int ret; if (!tsync) return -1; if (tsync_port) { if (!tsync->msg_handle) return -1; ret = vsock_get_port(tsync->msg_handle->fd, tsync_port); if (ret < 0) return ret; } if (selected_proto) { if (!tsync->proto_name) return -1; (*selected_proto) = strdup(tsync->proto_name); } return 0; } trace-cmd-v2.9.6/lib/trace-cmd/trace-util.c000066400000000000000000000277411414302661500204140ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "trace-cmd-local.h" #include "event-utils.h" #define LOCAL_PLUGIN_DIR ".trace-cmd/plugins" #define PROC_STACK_FILE "/proc/sys/kernel/stack_tracer_enabled" static bool debug; static FILE *logfp; const static struct { const char *clock_str; enum tracecmd_clocks clock_id; } trace_clocks[] = { {"local", TRACECMD_CLOCK_LOCAL}, {"global", TRACECMD_CLOCK_GLOBAL}, {"counter", TRACECMD_CLOCK_COUNTER}, {"uptime", TRACECMD_CLOCK_UPTIME}, {"perf", TRACECMD_CLOCK_PERF}, {"mono", TRACECMD_CLOCK_MONO}, {"mono_raw", TRACECMD_CLOCK_MONO_RAW}, {"boot", TRACECMD_CLOCK_BOOT}, {"x86-tsc", TRACECMD_CLOCK_X86_TSC}, {NULL, -1} }; /** * tracecmd_clock_str2id - Convert ftrace clock name to clock ID * @clock: Ftrace clock name * Returns ID of the ftrace clock */ enum tracecmd_clocks tracecmd_clock_str2id(const char *clock) { int i; if (!clock) return TRACECMD_CLOCK_UNKNOWN; for (i = 0; trace_clocks[i].clock_str; i++) { if (!strncmp(clock, trace_clocks[i].clock_str, strlen(trace_clocks[i].clock_str))) return trace_clocks[i].clock_id; } return TRACECMD_CLOCK_UNKNOWN; } /** * tracecmd_clock_id2str - Convert clock ID to ftare clock name * @clock: Clock ID * Returns name of a ftrace clock */ const char *tracecmd_clock_id2str(enum tracecmd_clocks clock) { int i; for (i = 0; trace_clocks[i].clock_str; i++) { if (trace_clocks[i].clock_id == clock) return trace_clocks[i].clock_str; } return NULL; } /** * tracecmd_set_debug - Set debug mode of the tracecmd library * @set_debug: The new "debug" mode. If true, the tracecmd library is * in "debug" mode */ void tracecmd_set_debug(bool set_debug) { debug = set_debug; } /** * tracecmd_get_debug - Get debug mode of tracecmd library * Returns true, if the tracecmd library is in debug mode. * */ bool tracecmd_get_debug(void) { return debug; } void tracecmd_parse_cmdlines(struct tep_handle *pevent, char *file, int size __maybe_unused) { char *comm; char *line; char *next = NULL; int pid; line = strtok_r(file, "\n", &next); while (line) { sscanf(line, "%d %m[^\n]s", &pid, &comm); tep_register_comm(pevent, comm, pid); free(comm); line = strtok_r(NULL, "\n", &next); } } void tracecmd_parse_proc_kallsyms(struct tep_handle *pevent, char *file, unsigned int size __maybe_unused) { unsigned long long addr; char *func; char *line; char *next = NULL; char *mod; char ch; line = strtok_r(file, "\n", &next); while (line) { int func_start, func_end = 0; int mod_start, mod_end = 0; int n; mod = NULL; errno = 0; n = sscanf(line, "%16llx %c %n%*s%n%*1[\t][%n%*s%n", &addr, &ch, &func_start, &func_end, &mod_start, &mod_end); if (errno) { perror("sscanf"); return; } if (n != 2 || !func_end) return; func = line + func_start; /* * Hacks for * - arm arch that adds a lot of bogus '$a' functions * - x86-64 that reports per-cpu variable offsets as absolute */ if (func[0] != '$' && ch != 'A' && ch != 'a') { line[func_end] = 0; if (mod_end) { mod = line + mod_start; /* truncate the extra ']' */ line[mod_end - 1] = 0; } tep_register_function(pevent, func, addr, mod); } line = strtok_r(NULL, "\n", &next); } } void tracecmd_parse_ftrace_printk(struct tep_handle *pevent, char *file, unsigned int size __maybe_unused) { unsigned long long addr; char *printk; char *line; char *next = NULL; char *addr_str; char *fmt; line = strtok_r(file, "\n", &next); while (line) { addr_str = strtok_r(line, ":", &fmt); if (!addr_str) { warning("printk format with empty entry"); break; } addr = strtoull(addr_str, NULL, 16); /* fmt still has a space, skip it */ printk = strdup(fmt+1); line = strtok_r(NULL, "\n", &next); tep_register_print_string(pevent, printk, addr); free(printk); } } /** * tracecmd_add_id - add an int to the event id list * @list: list to add the id to * @id: id to add * @len: current length of list of ids. * * The typical usage is: * * events = tracecmd_add_id(events, id, len++); * * Returns the new allocated list with the id included. * the list will contain a '-1' at the end. * * The returned list should be freed with free(). */ int *tracecmd_add_id(int *list, int id, int len) { if (!list) list = malloc(sizeof(*list) * 2); else list = realloc(list, sizeof(*list) * (len + 2)); if (!list) return NULL; list[len++] = id; list[len] = -1; return list; } struct add_plugin_data { int ret; int index; char **files; }; static void add_plugin_file(struct tep_handle *pevent, const char *path, const char *name, void *data) { struct add_plugin_data *pdata = data; char **ptr; int size; int i; if (pdata->ret) return; size = pdata->index + 2; ptr = realloc(pdata->files, sizeof(char *) * size); if (!ptr) goto out_free; ptr[pdata->index] = strdup(name); if (!ptr[pdata->index]) goto out_free; pdata->files = ptr; pdata->index++; pdata->files[pdata->index] = NULL; return; out_free: for (i = 0; i < pdata->index; i++) free(pdata->files[i]); free(pdata->files); pdata->files = NULL; pdata->ret = errno; } /** * trace_util_find_plugin_files - find list of possible plugin files * @suffix: The suffix of the plugin files to find * * Searches the plugin directory for files that end in @suffix, and * will return an allocated array of file names, or NULL if none is * found. * * Must check against TRACECMD_ISERR(ret) as if an error happens * the errno will be returned with the TRACECMD_ERR_MSK to denote * such an error occurred. * * Use trace_util_free_plugin_files() to free the result. */ char **trace_util_find_plugin_files(const char *suffix) { struct add_plugin_data pdata; memset(&pdata, 0, sizeof(pdata)); tep_load_plugins_hook(NULL, suffix, add_plugin_file, &pdata); if (pdata.ret) return TRACECMD_ERROR(pdata.ret); return pdata.files; } /** * trace_util_free_plugin_files - free the result of trace_util_find_plugin_files() * @files: The result from trace_util_find_plugin_files() * * Frees the contents that were allocated by trace_util_find_plugin_files(). */ void trace_util_free_plugin_files(char **files) { int i; if (!files || TRACECMD_ISERR(files)) return; for (i = 0; files[i]; i++) { free(files[i]); } free(files); } static char *get_source_plugins_dir(void) { char *p, path[PATH_MAX+1]; int ret; ret = readlink("/proc/self/exe", path, PATH_MAX); if (ret > PATH_MAX || ret < 0) return NULL; path[ret] = 0; dirname(path); p = strrchr(path, '/'); if (!p) return NULL; /* Check if we are in the the source tree */ if (strcmp(p, "/tracecmd") != 0) return NULL; strcpy(p, "/lib/traceevent/plugins"); return strdup(path); } struct tep_plugin_list* trace_load_plugins(struct tep_handle *tep, int flags) { struct tep_plugin_list *list; char *path; if (flags & TRACECMD_FL_LOAD_NO_PLUGINS) tep_set_flag(tep, TEP_DISABLE_PLUGINS); if (flags & TRACECMD_FL_LOAD_NO_SYSTEM_PLUGINS) tep_set_flag(tep, TEP_DISABLE_SYS_PLUGINS); path = get_source_plugins_dir(); if (path) tep_add_plugin_path(tep, path, TEP_PLUGIN_LAST); free(path); list = tep_load_plugins(tep); return list; } void __noreturn __vdie(const char *fmt, va_list ap) { int ret = errno; if (errno) perror("trace-cmd"); else ret = -1; fprintf(stderr, " "); vfprintf(stderr, fmt, ap); fprintf(stderr, "\n"); exit(ret); } void __noreturn __die(const char *fmt, ...) { va_list ap; va_start(ap, fmt); __vdie(fmt, ap); va_end(ap); } void __weak __noreturn die(const char *fmt, ...) { va_list ap; va_start(ap, fmt); __vdie(fmt, ap); va_end(ap); } void __weak *malloc_or_die(unsigned int size) { void *data; data = malloc(size); if (!data) die("malloc"); return data; } #define LOG_BUF_SIZE 1024 static void __plog(const char *prefix, const char *fmt, va_list ap, FILE *fp) { static int newline = 1; char buf[LOG_BUF_SIZE]; int r; r = vsnprintf(buf, LOG_BUF_SIZE, fmt, ap); if (r > LOG_BUF_SIZE) r = LOG_BUF_SIZE; if (logfp) { if (newline) fprintf(logfp, "[%d]%s%.*s", getpid(), prefix, r, buf); else fprintf(logfp, "[%d]%s%.*s", getpid(), prefix, r, buf); newline = buf[r - 1] == '\n'; fflush(logfp); return; } fprintf(fp, "%.*s", r, buf); } void tracecmd_plog(const char *fmt, ...) { va_list ap; va_start(ap, fmt); __plog("", fmt, ap, stdout); va_end(ap); /* Make sure it gets to the screen, in case we crash afterward */ fflush(stdout); } void tracecmd_plog_error(const char *fmt, ...) { va_list ap; char *str = ""; va_start(ap, fmt); __plog("Error: ", fmt, ap, stderr); va_end(ap); if (errno) str = strerror(errno); if (logfp) fprintf(logfp, "\n%s\n", str); else fprintf(stderr, "\n%s\n", str); } /** * tracecmd_set_logfile - Set file for logging * @logfile: Name of the log file * * Returns 0 on successful completion or -1 in case of error */ int tracecmd_set_logfile(char *logfile) { if (logfp) fclose(logfp); logfp = fopen(logfile, "w"); if (!logfp) return -1; return 0; } /** * tracecmd_stack_tracer_status - Check stack trace status * @status: Returned stack trace status: * 0 - not configured, disabled * non 0 - enabled * * Returns -1 in case of an error, 0 if file does not exist * (stack tracer not configured in kernel) or 1 on successful completion. */ int tracecmd_stack_tracer_status(int *status) { struct stat stat_buf; char buf[64]; long num; int fd; int n; if (stat(PROC_STACK_FILE, &stat_buf) < 0) { /* stack tracer not configured on running kernel */ *status = 0; /* not configured means disabled */ return 0; } fd = open(PROC_STACK_FILE, O_RDONLY); if (fd < 0) return -1; n = read(fd, buf, sizeof(buf)); close(fd); if (n <= 0) return -1; if (n >= sizeof(buf)) return -1; buf[n] = 0; errno = 0; num = strtol(buf, NULL, 10); /* Check for various possible errors */ if (num > INT_MAX || num < INT_MIN || (!num && errno)) return -1; *status = num; return 1; /* full success */ } /** * tracecmd_count_cpus - Get the number of CPUs in the system * * Returns the number of CPUs in the system, or 0 in case of an error */ int tracecmd_count_cpus(void) { static int once; char buf[1024]; int cpus = 0; char *pbuf; size_t *pn; FILE *fp; size_t n; int r; cpus = sysconf(_SC_NPROCESSORS_CONF); if (cpus > 0) return cpus; if (!once) { once++; warning("sysconf could not determine number of CPUS"); } /* Do the hack to figure out # of CPUS */ n = 1024; pn = &n; pbuf = buf; fp = fopen("/proc/cpuinfo", "r"); if (!fp) die("Can not read cpuinfo"); while ((r = getline(&pbuf, pn, fp)) >= 0) { char *p; if (strncmp(buf, "processor", 9) != 0) continue; for (p = buf+9; isspace(*p); p++) ; if (*p == ':') cpus++; } fclose(fp); return cpus; } #define FNV_64_PRIME 0x100000001b3ULL /* * tracecmd_generate_traceid - Generate a unique ID, used to identify * the current tracing session * * Returns unique ID */ unsigned long long tracecmd_generate_traceid(void) { unsigned long long hash = 0; unsigned char *ustr; struct sysinfo sinfo; struct timespec ts; char *str = NULL; clock_gettime(CLOCK_MONOTONIC_RAW, &ts); sysinfo(&sinfo); asprintf(&str, "%ld %ld %ld %ld %ld %ld %ld %ld %d", ts.tv_sec, ts.tv_nsec, sinfo.loads[0], sinfo.loads[1], sinfo.loads[2], sinfo.freeram, sinfo.sharedram, sinfo.freeswap, sinfo.procs); if (!str) return 0; ustr = (unsigned char *)str; hash = 0; while (*ustr) { hash ^= (unsigned long long)*ustr++; hash *= FNV_64_PRIME; } free(str); return hash; } bool tracecmd_is_version_supported(unsigned int version) { if (version <= FILE_VERSION) return true; return false; } trace-cmd-v2.9.6/lib/traceevent/000077500000000000000000000000001414302661500164655ustar00rootroot00000000000000trace-cmd-v2.9.6/lib/traceevent/Makefile000066400000000000000000000030461414302661500201300ustar00rootroot00000000000000# SPDX-License-Identifier: GPL-2.0 include $(src)/scripts/utils.mk bdir:=$(obj)/lib/traceevent DEFAULT_TARGET = $(bdir)/libtraceevent.a LIBTRACEEVENT_CFLAGS = -I$(src)/include/traceevent -I$(src)/lib/traceevent/include CFLAGS += -I$(bdir)/include CFLAGS := $(LIBTRACEEVENT_CFLAGS) $(CFLAGS) OBJS = OBJS += event-parse.o OBJS += event-plugin.o OBJS += kbuffer-parse.o OBJS += trace-seq.o OBJS += parse-filter.o OBJS += parse-utils.o OBJS += event-parse-api.o OBJS += tep_strerror.o OBJS := $(OBJS:%.o=$(bdir)/%.o) DEPS := $(OBJS:$(bdir)/%.o=$(bdir)/.%.d) all: $(DEFAULT_TARGET) $(bdir): @mkdir -p $(bdir) $(OBJS): | $(bdir) $(DEPS): | $(bdir) .PHONY: warning warning: @echo "********************************************" @echo "** NOTICE: libtraceevent not found on system" @echo "**" @echo "** Building obsolete local version of libtraceevent" @echo "** Consider installing the latest libtraceevent" @echo "**" @echo "** https://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git/ " @echo "**" @echo "********************************************" $(bdir)/libtraceevent.a: $(OBJS) $(Q)$(call do_build_static_lib) libtraceevent: $(bdir)/libtraceevent.a warning libtraceevent_nowarn: $(bdir)/libtraceevent.a $(bdir)/%.o: %.c $(Q)$(call do_fpic_compile) $(DEPS): $(bdir)/.%.d: %.c $(Q)$(CC) -M -MT $(bdir)/$*.o $(CPPFLAGS) $(CFLAGS) $< > $@ $(OBJS): $(bdir)/%.o : $(bdir)/.%.d dep_includes := $(wildcard $(DEPS)) ifneq ($(dep_includes),) include $(dep_includes) endif clean: $(RM) -f $(bdir)/*.a $(bdir)/*.o $(bdir)/.*.d .PHONY: clean trace-cmd-v2.9.6/lib/traceevent/event-parse-api.c000066400000000000000000000174771414302661500216510ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt * */ #include "event-parse.h" #include "event-parse-local.h" #include "event-utils.h" /** * tep_get_event - returns the event with the given index * @tep: a handle to the tep_handle * @index: index of the requested event, in the range 0 .. nr_events * * This returns pointer to the element of the events array with the given index * If @tep is NULL, or @index is not in the range 0 .. nr_events, NULL is returned. */ struct tep_event *tep_get_event(struct tep_handle *tep, int index) { if (tep && tep->events && index < tep->nr_events) return tep->events[index]; return NULL; } /** * tep_get_first_event - returns the first event in the events array * @tep: a handle to the tep_handle * * This returns pointer to the first element of the events array * If @tep is NULL, NULL is returned. */ struct tep_event *tep_get_first_event(struct tep_handle *tep) { return tep_get_event(tep, 0); } /** * tep_get_events_count - get the number of defined events * @tep: a handle to the tep_handle * * This returns number of elements in event array * If @tep is NULL, 0 is returned. */ int tep_get_events_count(struct tep_handle *tep) { if (tep) return tep->nr_events; return 0; } /** * tep_set_flag - set event parser flag * @tep: a handle to the tep_handle * @flag: flag, or combination of flags to be set * can be any combination from enum tep_flag * * This sets a flag or combination of flags from enum tep_flag */ void tep_set_flag(struct tep_handle *tep, int flag) { if (tep) tep->flags |= flag; } /** * tep_clear_flag - clear event parser flag * @tep: a handle to the tep_handle * @flag: flag to be cleared * * This clears a tep flag */ void tep_clear_flag(struct tep_handle *tep, enum tep_flag flag) { if (tep) tep->flags &= ~flag; } /** * tep_test_flag - check the state of event parser flag * @tep: a handle to the tep_handle * @flag: flag to be checked * * This returns the state of the requested tep flag. * Returns: true if the flag is set, false otherwise. */ bool tep_test_flag(struct tep_handle *tep, enum tep_flag flag) { if (tep) return tep->flags & flag; return false; } __hidden unsigned short data2host2(struct tep_handle *tep, unsigned short data) { unsigned short swap; if (!tep || tep->host_bigendian == tep->file_bigendian) return data; swap = ((data & 0xffULL) << 8) | ((data & (0xffULL << 8)) >> 8); return swap; } __hidden unsigned int data2host4(struct tep_handle *tep, unsigned int data) { unsigned int swap; if (!tep || tep->host_bigendian == tep->file_bigendian) return data; swap = ((data & 0xffULL) << 24) | ((data & (0xffULL << 8)) << 8) | ((data & (0xffULL << 16)) >> 8) | ((data & (0xffULL << 24)) >> 24); return swap; } __hidden unsigned long long data2host8(struct tep_handle *tep, unsigned long long data) { unsigned long long swap; if (!tep || tep->host_bigendian == tep->file_bigendian) return data; swap = ((data & 0xffULL) << 56) | ((data & (0xffULL << 8)) << 40) | ((data & (0xffULL << 16)) << 24) | ((data & (0xffULL << 24)) << 8) | ((data & (0xffULL << 32)) >> 8) | ((data & (0xffULL << 40)) >> 24) | ((data & (0xffULL << 48)) >> 40) | ((data & (0xffULL << 56)) >> 56); return swap; } /** * tep_get_header_page_size - get size of the header page * @tep: a handle to the tep_handle * * This returns size of the header page * If @tep is NULL, 0 is returned. */ int tep_get_header_page_size(struct tep_handle *tep) { if (tep) return tep->header_page_size_size; return 0; } /** * tep_get_header_timestamp_size - get size of the timestamp in the header page * @tep: a handle to the tep_handle * * This returns size of the timestamp in the header page * If @tep is NULL, 0 is returned. */ int tep_get_header_timestamp_size(struct tep_handle *tep) { if (tep) return tep->header_page_ts_size; return 0; } /** * tep_get_cpus - get the number of CPUs * @tep: a handle to the tep_handle * * This returns the number of CPUs * If @tep is NULL, 0 is returned. */ int tep_get_cpus(struct tep_handle *tep) { if (tep) return tep->cpus; return 0; } /** * tep_set_cpus - set the number of CPUs * @tep: a handle to the tep_handle * * This sets the number of CPUs */ void tep_set_cpus(struct tep_handle *tep, int cpus) { if (tep) tep->cpus = cpus; } /** * tep_get_long_size - get the size of a long integer on the traced machine * @tep: a handle to the tep_handle * * This returns the size of a long integer on the traced machine * If @tep is NULL, 0 is returned. */ int tep_get_long_size(struct tep_handle *tep) { if (tep) return tep->long_size; return 0; } /** * tep_set_long_size - set the size of a long integer on the traced machine * @tep: a handle to the tep_handle * @size: size, in bytes, of a long integer * * This sets the size of a long integer on the traced machine */ void tep_set_long_size(struct tep_handle *tep, int long_size) { if (tep) tep->long_size = long_size; } /** * tep_get_page_size - get the size of a memory page on the traced machine * @tep: a handle to the tep_handle * * This returns the size of a memory page on the traced machine * If @tep is NULL, 0 is returned. */ int tep_get_page_size(struct tep_handle *tep) { if (tep) return tep->page_size; return 0; } /** * tep_set_page_size - set the size of a memory page on the traced machine * @tep: a handle to the tep_handle * @_page_size: size of a memory page, in bytes * * This sets the size of a memory page on the traced machine */ void tep_set_page_size(struct tep_handle *tep, int _page_size) { if (tep) tep->page_size = _page_size; } /** * tep_is_file_bigendian - return the endian of the file * @tep: a handle to the tep_handle * * This returns true if the file is in big endian order * If @tep is NULL, false is returned. */ bool tep_is_file_bigendian(struct tep_handle *tep) { if (tep) return (tep->file_bigendian == TEP_BIG_ENDIAN); return false; } /** * tep_set_file_bigendian - set if the file is in big endian order * @tep: a handle to the tep_handle * @endian: non zero, if the file is in big endian order * * This sets if the file is in big endian order */ void tep_set_file_bigendian(struct tep_handle *tep, enum tep_endian endian) { if (tep) tep->file_bigendian = endian; } /** * tep_is_local_bigendian - return the endian of the saved local machine * @tep: a handle to the tep_handle * * This returns true if the saved local machine in @tep is big endian. * If @tep is NULL, false is returned. */ bool tep_is_local_bigendian(struct tep_handle *tep) { if (tep) return (tep->host_bigendian == TEP_BIG_ENDIAN); return 0; } /** * tep_set_local_bigendian - set the stored local machine endian order * @tep: a handle to the tep_handle * @endian: non zero, if the local host has big endian order * * This sets the endian order for the local machine. */ void tep_set_local_bigendian(struct tep_handle *tep, enum tep_endian endian) { if (tep) tep->host_bigendian = endian; } /** * tep_is_old_format - get if an old kernel is used * @tep: a handle to the tep_handle * * This returns true, if an old kernel is used to generate the tracing events or * false if a new kernel is used. Old kernels did not have header page info. * If @tep is NULL, false is returned. */ bool tep_is_old_format(struct tep_handle *tep) { if (tep) return tep->old_format; return false; } /** * tep_set_test_filters - set a flag to test a filter string * @tep: a handle to the tep_handle * @test_filters: the new value of the test_filters flag * * This sets a flag to test a filter string. If this flag is set, when * tep_filter_add_filter_str() API as called,it will print the filter string * instead of adding it. */ void tep_set_test_filters(struct tep_handle *tep, int test_filters) { if (tep) tep->test_filters = test_filters; } trace-cmd-v2.9.6/lib/traceevent/event-parse-local.h000066400000000000000000000051361414302661500221640ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt * */ #ifndef _PARSE_EVENTS_INT_H #define _PARSE_EVENTS_INT_H struct tep_cmdline; struct cmdline_list; struct func_map; struct func_list; struct event_handler; struct func_resolver; struct tep_plugins_dir; #define __hidden __attribute__((visibility ("hidden"))) struct tep_handle { int ref_count; int header_page_ts_offset; int header_page_ts_size; int header_page_size_offset; int header_page_size_size; int header_page_data_offset; int header_page_data_size; int header_page_overwrite; enum tep_endian file_bigendian; enum tep_endian host_bigendian; int old_format; int cpus; int long_size; int page_size; struct tep_cmdline *cmdlines; struct cmdline_list *cmdlist; int cmdline_count; struct func_map *func_map; struct func_resolver *func_resolver; struct func_list *funclist; unsigned int func_count; struct printk_map *printk_map; struct printk_list *printklist; unsigned int printk_count; struct tep_event **events; int nr_events; struct tep_event **sort_events; enum tep_event_sort_type last_type; int type_offset; int type_size; int pid_offset; int pid_size; int pc_offset; int pc_size; int flags_offset; int flags_size; int ld_offset; int ld_size; int test_filters; int flags; struct tep_format_field *bprint_ip_field; struct tep_format_field *bprint_fmt_field; struct tep_format_field *bprint_buf_field; struct event_handler *handlers; struct tep_function_handler *func_handlers; /* cache */ struct tep_event *last_event; struct tep_plugins_dir *plugins_dir; }; enum tep_print_parse_type { PRINT_FMT_STRING, PRINT_FMT_ARG_DIGIT, PRINT_FMT_ARG_POINTER, PRINT_FMT_ARG_STRING, }; struct tep_print_parse { struct tep_print_parse *next; char *format; int ls; enum tep_print_parse_type type; struct tep_print_arg *arg; struct tep_print_arg *len_as_arg; }; void free_tep_event(struct tep_event *event); void free_tep_format_field(struct tep_format_field *field); void free_tep_plugin_paths(struct tep_handle *tep); unsigned short data2host2(struct tep_handle *tep, unsigned short data); unsigned int data2host4(struct tep_handle *tep, unsigned int data); unsigned long long data2host8(struct tep_handle *tep, unsigned long long data); /* access to the internal parser */ int peek_char(void); void init_input_buf(const char *buf, unsigned long long size); unsigned long long get_input_buf_ptr(void); const char *get_input_buf(void); enum tep_event_type read_token(char **tok); void free_token(char *tok); #endif /* _PARSE_EVENTS_INT_H */ trace-cmd-v2.9.6/lib/traceevent/event-parse.c000066400000000000000000005074621414302661500211000ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt * * * The parts for function graph printing was taken and modified from the * Linux Kernel that were written by * - Copyright (C) 2009 Frederic Weisbecker, * Frederic Weisbecker gave his permission to relicense the code to * the Lesser General Public License. */ #include #include #include #include #include #include #include #include #include #include #include #include "event-parse.h" #include "event-parse-local.h" #include "event-utils.h" #include "trace-seq.h" static const char *input_buf; static unsigned long long input_buf_ptr; static unsigned long long input_buf_siz; static int is_flag_field; static int is_symbolic_field; static int show_warning = 1; #define do_warning(fmt, ...) \ do { \ if (show_warning) \ warning(fmt, ##__VA_ARGS__); \ } while (0) #define do_warning_event(event, fmt, ...) \ do { \ if (!show_warning) \ continue; \ \ if (event) \ warning("[%s:%s] " fmt, event->system, \ event->name, ##__VA_ARGS__); \ else \ warning(fmt, ##__VA_ARGS__); \ } while (0) /** * init_input_buf - init buffer for parsing * @buf: buffer to parse * @size: the size of the buffer * * Initializes the internal buffer that tep_read_token() will parse. */ __hidden void init_input_buf(const char *buf, unsigned long long size) { input_buf = buf; input_buf_siz = size; input_buf_ptr = 0; } __hidden const char *get_input_buf(void) { return input_buf; } __hidden unsigned long long get_input_buf_ptr(void) { return input_buf_ptr; } struct event_handler { struct event_handler *next; int id; const char *sys_name; const char *event_name; tep_event_handler_func func; void *context; }; struct func_params { struct func_params *next; enum tep_func_arg_type type; }; struct tep_function_handler { struct tep_function_handler *next; enum tep_func_arg_type ret_type; char *name; tep_func_handler func; struct func_params *params; int nr_args; }; static unsigned long long process_defined_func(struct trace_seq *s, void *data, int size, struct tep_event *event, struct tep_print_arg *arg); static void free_func_handle(struct tep_function_handler *func); void breakpoint(void) { static int x; x++; } static struct tep_print_arg *alloc_arg(void) { return calloc(1, sizeof(struct tep_print_arg)); } struct tep_cmdline { char *comm; int pid; }; static int cmdline_cmp(const void *a, const void *b) { const struct tep_cmdline *ca = a; const struct tep_cmdline *cb = b; if (ca->pid < cb->pid) return -1; if (ca->pid > cb->pid) return 1; return 0; } /* Looking for where to place the key */ static int cmdline_slot_cmp(const void *a, const void *b) { const struct tep_cmdline *ca = a; const struct tep_cmdline *cb = b; const struct tep_cmdline *cb1 = cb + 1; if (ca->pid < cb->pid) return -1; if (ca->pid > cb->pid) { if (ca->pid <= cb1->pid) return 0; return 1; } return 0; } struct cmdline_list { struct cmdline_list *next; char *comm; int pid; }; static int cmdline_init(struct tep_handle *tep) { struct cmdline_list *cmdlist = tep->cmdlist; struct cmdline_list *item; struct tep_cmdline *cmdlines; int i; cmdlines = malloc(sizeof(*cmdlines) * tep->cmdline_count); if (!cmdlines) return -1; i = 0; while (cmdlist) { cmdlines[i].pid = cmdlist->pid; cmdlines[i].comm = cmdlist->comm; i++; item = cmdlist; cmdlist = cmdlist->next; free(item); } qsort(cmdlines, tep->cmdline_count, sizeof(*cmdlines), cmdline_cmp); tep->cmdlines = cmdlines; tep->cmdlist = NULL; return 0; } static const char *find_cmdline(struct tep_handle *tep, int pid) { const struct tep_cmdline *comm; struct tep_cmdline key; if (!pid) return ""; if (!tep->cmdlines && cmdline_init(tep)) return ""; key.pid = pid; comm = bsearch(&key, tep->cmdlines, tep->cmdline_count, sizeof(*tep->cmdlines), cmdline_cmp); if (comm) return comm->comm; return "<...>"; } /** * tep_is_pid_registered - return if a pid has a cmdline registered * @tep: a handle to the trace event parser context * @pid: The pid to check if it has a cmdline registered with. * * Returns true if the pid has a cmdline mapped to it * false otherwise. */ bool tep_is_pid_registered(struct tep_handle *tep, int pid) { const struct tep_cmdline *comm; struct tep_cmdline key; if (!pid) return true; if (!tep->cmdlines && cmdline_init(tep)) return false; key.pid = pid; comm = bsearch(&key, tep->cmdlines, tep->cmdline_count, sizeof(*tep->cmdlines), cmdline_cmp); if (comm) return true; return false; } /* * If the command lines have been converted to an array, then * we must add this pid. This is much slower than when cmdlines * are added before the array is initialized. */ static int add_new_comm(struct tep_handle *tep, const char *comm, int pid, bool override) { struct tep_cmdline *cmdlines = tep->cmdlines; struct tep_cmdline *cmdline; struct tep_cmdline key; char *new_comm; int cnt; if (!pid) return 0; /* avoid duplicates */ key.pid = pid; cmdline = bsearch(&key, tep->cmdlines, tep->cmdline_count, sizeof(*tep->cmdlines), cmdline_cmp); if (cmdline) { if (!override) { errno = EEXIST; return -1; } new_comm = strdup(comm); if (!new_comm) { errno = ENOMEM; return -1; } free(cmdline->comm); cmdline->comm = new_comm; return 0; } cmdlines = realloc(cmdlines, sizeof(*cmdlines) * (tep->cmdline_count + 1)); if (!cmdlines) { errno = ENOMEM; return -1; } tep->cmdlines = cmdlines; key.comm = strdup(comm); if (!key.comm) { errno = ENOMEM; return -1; } if (!tep->cmdline_count) { /* no entries yet */ tep->cmdlines[0] = key; tep->cmdline_count++; return 0; } /* Now find where we want to store the new cmdline */ cmdline = bsearch(&key, tep->cmdlines, tep->cmdline_count - 1, sizeof(*tep->cmdlines), cmdline_slot_cmp); cnt = tep->cmdline_count; if (cmdline) { /* cmdline points to the one before the spot we want */ cmdline++; cnt -= cmdline - tep->cmdlines; } else { /* The new entry is either before or after the list */ if (key.pid > tep->cmdlines[tep->cmdline_count - 1].pid) { tep->cmdlines[tep->cmdline_count++] = key; return 0; } cmdline = &tep->cmdlines[0]; } memmove(cmdline + 1, cmdline, (cnt * sizeof(*cmdline))); *cmdline = key; tep->cmdline_count++; return 0; } static int _tep_register_comm(struct tep_handle *tep, const char *comm, int pid, bool override) { struct cmdline_list *item; if (tep->cmdlines) return add_new_comm(tep, comm, pid, override); item = malloc(sizeof(*item)); if (!item) return -1; if (comm) item->comm = strdup(comm); else item->comm = strdup("<...>"); if (!item->comm) { free(item); return -1; } item->pid = pid; item->next = tep->cmdlist; tep->cmdlist = item; tep->cmdline_count++; return 0; } /** * tep_register_comm - register a pid / comm mapping * @tep: a handle to the trace event parser context * @comm: the command line to register * @pid: the pid to map the command line to * * This adds a mapping to search for command line names with * a given pid. The comm is duplicated. If a command with the same pid * already exist, -1 is returned and errno is set to EEXIST */ int tep_register_comm(struct tep_handle *tep, const char *comm, int pid) { return _tep_register_comm(tep, comm, pid, false); } /** * tep_override_comm - register a pid / comm mapping * @tep: a handle to the trace event parser context * @comm: the command line to register * @pid: the pid to map the command line to * * This adds a mapping to search for command line names with * a given pid. The comm is duplicated. If a command with the same pid * already exist, the command string is udapted with the new one */ int tep_override_comm(struct tep_handle *tep, const char *comm, int pid) { if (!tep->cmdlines && cmdline_init(tep)) { errno = ENOMEM; return -1; } return _tep_register_comm(tep, comm, pid, true); } struct func_map { unsigned long long addr; char *func; char *mod; }; struct func_list { struct func_list *next; unsigned long long addr; char *func; char *mod; }; static int func_cmp(const void *a, const void *b) { const struct func_map *fa = a; const struct func_map *fb = b; if (fa->addr < fb->addr) return -1; if (fa->addr > fb->addr) return 1; return 0; } /* * We are searching for a record in between, not an exact * match. */ static int func_bcmp(const void *a, const void *b) { const struct func_map *fa = a; const struct func_map *fb = b; if ((fa->addr == fb->addr) || (fa->addr > fb->addr && fa->addr < (fb+1)->addr)) return 0; if (fa->addr < fb->addr) return -1; return 1; } static int func_map_init(struct tep_handle *tep) { struct func_list *funclist; struct func_list *item; struct func_map *func_map; int i; func_map = malloc(sizeof(*func_map) * (tep->func_count + 1)); if (!func_map) return -1; funclist = tep->funclist; i = 0; while (funclist) { func_map[i].func = funclist->func; func_map[i].addr = funclist->addr; func_map[i].mod = funclist->mod; i++; item = funclist; funclist = funclist->next; free(item); } qsort(func_map, tep->func_count, sizeof(*func_map), func_cmp); /* * Add a special record at the end. */ func_map[tep->func_count].func = NULL; func_map[tep->func_count].addr = 0; func_map[tep->func_count].mod = NULL; tep->func_map = func_map; tep->funclist = NULL; return 0; } static struct func_map * __find_func(struct tep_handle *tep, unsigned long long addr) { struct func_map *func; struct func_map key; if (!tep->func_map) func_map_init(tep); key.addr = addr; func = bsearch(&key, tep->func_map, tep->func_count, sizeof(*tep->func_map), func_bcmp); return func; } struct func_resolver { tep_func_resolver_t *func; void *priv; struct func_map map; }; /** * tep_set_function_resolver - set an alternative function resolver * @tep: a handle to the trace event parser context * @resolver: function to be used * @priv: resolver function private state. * * Some tools may have already a way to resolve kernel functions, allow them to * keep using it instead of duplicating all the entries inside tep->funclist. */ int tep_set_function_resolver(struct tep_handle *tep, tep_func_resolver_t *func, void *priv) { struct func_resolver *resolver = malloc(sizeof(*resolver)); if (resolver == NULL) return -1; resolver->func = func; resolver->priv = priv; free(tep->func_resolver); tep->func_resolver = resolver; return 0; } /** * tep_reset_function_resolver - reset alternative function resolver * @tep: a handle to the trace event parser context * * Stop using whatever alternative resolver was set, use the default * one instead. */ void tep_reset_function_resolver(struct tep_handle *tep) { free(tep->func_resolver); tep->func_resolver = NULL; } static struct func_map * find_func(struct tep_handle *tep, unsigned long long addr) { struct func_map *map; if (!tep->func_resolver) return __find_func(tep, addr); map = &tep->func_resolver->map; map->mod = NULL; map->addr = addr; map->func = tep->func_resolver->func(tep->func_resolver->priv, &map->addr, &map->mod); if (map->func == NULL) return NULL; return map; } /** * tep_find_function - find a function by a given address * @tep: a handle to the trace event parser context * @addr: the address to find the function with * * Returns a pointer to the function stored that has the given * address. Note, the address does not have to be exact, it * will select the function that would contain the address. */ const char *tep_find_function(struct tep_handle *tep, unsigned long long addr) { struct func_map *map; map = find_func(tep, addr); if (!map) return NULL; return map->func; } /** * tep_find_function_address - find a function address by a given address * @tep: a handle to the trace event parser context * @addr: the address to find the function with * * Returns the address the function starts at. This can be used in * conjunction with tep_find_function to print both the function * name and the function offset. */ unsigned long long tep_find_function_address(struct tep_handle *tep, unsigned long long addr) { struct func_map *map; map = find_func(tep, addr); if (!map) return 0; return map->addr; } /** * tep_register_function - register a function with a given address * @tep: a handle to the trace event parser context * @function: the function name to register * @addr: the address the function starts at * @mod: the kernel module the function may be in (NULL for none) * * This registers a function name with an address and module. * The @func passed in is duplicated. */ int tep_register_function(struct tep_handle *tep, char *func, unsigned long long addr, char *mod) { struct func_list *item = malloc(sizeof(*item)); if (!item) return -1; item->next = tep->funclist; item->func = strdup(func); if (!item->func) goto out_free; if (mod) { item->mod = strdup(mod); if (!item->mod) goto out_free_func; } else item->mod = NULL; item->addr = addr; tep->funclist = item; tep->func_count++; return 0; out_free_func: free(item->func); item->func = NULL; out_free: free(item); errno = ENOMEM; return -1; } /** * tep_print_funcs - print out the stored functions * @tep: a handle to the trace event parser context * * This prints out the stored functions. */ void tep_print_funcs(struct tep_handle *tep) { int i; if (!tep->func_map) func_map_init(tep); for (i = 0; i < (int)tep->func_count; i++) { printf("%016llx %s", tep->func_map[i].addr, tep->func_map[i].func); if (tep->func_map[i].mod) printf(" [%s]\n", tep->func_map[i].mod); else printf("\n"); } } struct printk_map { unsigned long long addr; char *printk; }; struct printk_list { struct printk_list *next; unsigned long long addr; char *printk; }; static int printk_cmp(const void *a, const void *b) { const struct printk_map *pa = a; const struct printk_map *pb = b; if (pa->addr < pb->addr) return -1; if (pa->addr > pb->addr) return 1; return 0; } static int printk_map_init(struct tep_handle *tep) { struct printk_list *printklist; struct printk_list *item; struct printk_map *printk_map; int i; printk_map = malloc(sizeof(*printk_map) * (tep->printk_count + 1)); if (!printk_map) return -1; printklist = tep->printklist; i = 0; while (printklist) { printk_map[i].printk = printklist->printk; printk_map[i].addr = printklist->addr; i++; item = printklist; printklist = printklist->next; free(item); } qsort(printk_map, tep->printk_count, sizeof(*printk_map), printk_cmp); tep->printk_map = printk_map; tep->printklist = NULL; return 0; } static struct printk_map * find_printk(struct tep_handle *tep, unsigned long long addr) { struct printk_map *printk; struct printk_map key; if (!tep->printk_map && printk_map_init(tep)) return NULL; key.addr = addr; printk = bsearch(&key, tep->printk_map, tep->printk_count, sizeof(*tep->printk_map), printk_cmp); return printk; } /** * tep_register_print_string - register a string by its address * @tep: a handle to the trace event parser context * @fmt: the string format to register * @addr: the address the string was located at * * This registers a string by the address it was stored in the kernel. * The @fmt passed in is duplicated. */ int tep_register_print_string(struct tep_handle *tep, const char *fmt, unsigned long long addr) { struct printk_list *item = malloc(sizeof(*item)); char *p; if (!item) return -1; item->next = tep->printklist; item->addr = addr; /* Strip off quotes and '\n' from the end */ if (fmt[0] == '"') fmt++; item->printk = strdup(fmt); if (!item->printk) goto out_free; p = item->printk + strlen(item->printk) - 1; if (*p == '"') *p = 0; p -= 2; if (strcmp(p, "\\n") == 0) *p = 0; tep->printklist = item; tep->printk_count++; return 0; out_free: free(item); errno = ENOMEM; return -1; } /** * tep_print_printk - print out the stored strings * @tep: a handle to the trace event parser context * * This prints the string formats that were stored. */ void tep_print_printk(struct tep_handle *tep) { int i; if (!tep->printk_map) printk_map_init(tep); for (i = 0; i < (int)tep->printk_count; i++) { printf("%016llx %s\n", tep->printk_map[i].addr, tep->printk_map[i].printk); } } static struct tep_event *alloc_event(void) { return calloc(1, sizeof(struct tep_event)); } static int add_event(struct tep_handle *tep, struct tep_event *event) { int i; struct tep_event **events = realloc(tep->events, sizeof(event) * (tep->nr_events + 1)); if (!events) return -1; tep->events = events; for (i = 0; i < tep->nr_events; i++) { if (tep->events[i]->id > event->id) break; } if (i < tep->nr_events) memmove(&tep->events[i + 1], &tep->events[i], sizeof(event) * (tep->nr_events - i)); tep->events[i] = event; tep->nr_events++; event->tep = tep; return 0; } static int event_item_type(enum tep_event_type type) { switch (type) { case TEP_EVENT_ITEM ... TEP_EVENT_SQUOTE: return 1; case TEP_EVENT_ERROR ... TEP_EVENT_DELIM: default: return 0; } } static void free_flag_sym(struct tep_print_flag_sym *fsym) { struct tep_print_flag_sym *next; while (fsym) { next = fsym->next; free(fsym->value); free(fsym->str); free(fsym); fsym = next; } } static void free_arg(struct tep_print_arg *arg) { struct tep_print_arg *farg; if (!arg) return; switch (arg->type) { case TEP_PRINT_ATOM: free(arg->atom.atom); break; case TEP_PRINT_FIELD: free(arg->field.name); break; case TEP_PRINT_FLAGS: free_arg(arg->flags.field); free(arg->flags.delim); free_flag_sym(arg->flags.flags); break; case TEP_PRINT_SYMBOL: free_arg(arg->symbol.field); free_flag_sym(arg->symbol.symbols); break; case TEP_PRINT_HEX: case TEP_PRINT_HEX_STR: free_arg(arg->hex.field); free_arg(arg->hex.size); break; case TEP_PRINT_INT_ARRAY: free_arg(arg->int_array.field); free_arg(arg->int_array.count); free_arg(arg->int_array.el_size); break; case TEP_PRINT_TYPE: free(arg->typecast.type); free_arg(arg->typecast.item); break; case TEP_PRINT_STRING: case TEP_PRINT_BSTRING: free(arg->string.string); break; case TEP_PRINT_BITMASK: free(arg->bitmask.bitmask); break; case TEP_PRINT_DYNAMIC_ARRAY: case TEP_PRINT_DYNAMIC_ARRAY_LEN: free(arg->dynarray.index); break; case TEP_PRINT_OP: free(arg->op.op); free_arg(arg->op.left); free_arg(arg->op.right); break; case TEP_PRINT_FUNC: while (arg->func.args) { farg = arg->func.args; arg->func.args = farg->next; free_arg(farg); } break; case TEP_PRINT_NULL: default: break; } free(arg); } static enum tep_event_type get_type(int ch) { if (ch == '\n') return TEP_EVENT_NEWLINE; if (isspace(ch)) return TEP_EVENT_SPACE; if (isalnum(ch) || ch == '_') return TEP_EVENT_ITEM; if (ch == '\'') return TEP_EVENT_SQUOTE; if (ch == '"') return TEP_EVENT_DQUOTE; if (!isprint(ch)) return TEP_EVENT_NONE; if (ch == '(' || ch == ')' || ch == ',') return TEP_EVENT_DELIM; return TEP_EVENT_OP; } static int __read_char(void) { if (input_buf_ptr >= input_buf_siz) return -1; return input_buf[input_buf_ptr++]; } /** * peek_char - peek at the next character that will be read * * Returns the next character read, or -1 if end of buffer. */ __hidden int peek_char(void) { if (input_buf_ptr >= input_buf_siz) return -1; return input_buf[input_buf_ptr]; } static int extend_token(char **tok, char *buf, int size) { char *newtok = realloc(*tok, size); if (!newtok) { free(*tok); *tok = NULL; return -1; } if (!*tok) strcpy(newtok, buf); else strcat(newtok, buf); *tok = newtok; return 0; } static enum tep_event_type force_token(const char *str, char **tok); static enum tep_event_type __read_token(char **tok) { char buf[BUFSIZ]; int ch, last_ch, quote_ch, next_ch; int i = 0; int tok_size = 0; enum tep_event_type type; *tok = NULL; ch = __read_char(); if (ch < 0) return TEP_EVENT_NONE; type = get_type(ch); if (type == TEP_EVENT_NONE) return type; buf[i++] = ch; switch (type) { case TEP_EVENT_NEWLINE: case TEP_EVENT_DELIM: if (asprintf(tok, "%c", ch) < 0) return TEP_EVENT_ERROR; return type; case TEP_EVENT_OP: switch (ch) { case '-': next_ch = peek_char(); if (next_ch == '>') { buf[i++] = __read_char(); break; } /* fall through */ case '+': case '|': case '&': case '>': case '<': last_ch = ch; ch = peek_char(); if (ch != last_ch) goto test_equal; buf[i++] = __read_char(); switch (last_ch) { case '>': case '<': goto test_equal; default: break; } break; case '!': case '=': goto test_equal; default: /* what should we do instead? */ break; } buf[i] = 0; *tok = strdup(buf); return type; test_equal: ch = peek_char(); if (ch == '=') buf[i++] = __read_char(); goto out; case TEP_EVENT_DQUOTE: case TEP_EVENT_SQUOTE: /* don't keep quotes */ i--; quote_ch = ch; last_ch = 0; concat: do { if (i == (BUFSIZ - 1)) { buf[i] = 0; tok_size += BUFSIZ; if (extend_token(tok, buf, tok_size) < 0) return TEP_EVENT_NONE; i = 0; } last_ch = ch; ch = __read_char(); buf[i++] = ch; /* the '\' '\' will cancel itself */ if (ch == '\\' && last_ch == '\\') last_ch = 0; } while (ch != quote_ch || last_ch == '\\'); /* remove the last quote */ i--; /* * For strings (double quotes) check the next token. * If it is another string, concatinate the two. */ if (type == TEP_EVENT_DQUOTE) { unsigned long long save_input_buf_ptr = input_buf_ptr; do { ch = __read_char(); } while (isspace(ch)); if (ch == '"') goto concat; input_buf_ptr = save_input_buf_ptr; } goto out; case TEP_EVENT_ERROR ... TEP_EVENT_SPACE: case TEP_EVENT_ITEM: default: break; } while (get_type(peek_char()) == type) { if (i == (BUFSIZ - 1)) { buf[i] = 0; tok_size += BUFSIZ; if (extend_token(tok, buf, tok_size) < 0) return TEP_EVENT_NONE; i = 0; } ch = __read_char(); buf[i++] = ch; } out: buf[i] = 0; if (extend_token(tok, buf, tok_size + i + 1) < 0) return TEP_EVENT_NONE; if (type == TEP_EVENT_ITEM) { /* * Older versions of the kernel has a bug that * creates invalid symbols and will break the mac80211 * parsing. This is a work around to that bug. * * See Linux kernel commit: * 811cb50baf63461ce0bdb234927046131fc7fa8b */ if (strcmp(*tok, "LOCAL_PR_FMT") == 0) { free(*tok); *tok = NULL; return force_token("\"%s\" ", tok); } else if (strcmp(*tok, "STA_PR_FMT") == 0) { free(*tok); *tok = NULL; return force_token("\" sta:%pM\" ", tok); } else if (strcmp(*tok, "VIF_PR_FMT") == 0) { free(*tok); *tok = NULL; return force_token("\" vif:%p(%d)\" ", tok); } } return type; } static enum tep_event_type force_token(const char *str, char **tok) { const char *save_input_buf; unsigned long long save_input_buf_ptr; unsigned long long save_input_buf_siz; enum tep_event_type type; /* save off the current input pointers */ save_input_buf = input_buf; save_input_buf_ptr = input_buf_ptr; save_input_buf_siz = input_buf_siz; init_input_buf(str, strlen(str)); type = __read_token(tok); /* reset back to original token */ input_buf = save_input_buf; input_buf_ptr = save_input_buf_ptr; input_buf_siz = save_input_buf_siz; return type; } /** * free_token - free a token returned by tep_read_token * @token: the token to free */ __hidden void free_token(char *tok) { if (tok) free(tok); } /** * read_token - access to utilities to use the tep parser * @tok: The token to return * * This will parse tokens from the string given by * tep_init_data(). * * Returns the token type. */ __hidden enum tep_event_type read_token(char **tok) { enum tep_event_type type; for (;;) { type = __read_token(tok); if (type != TEP_EVENT_SPACE) return type; free_token(*tok); } /* not reached */ *tok = NULL; return TEP_EVENT_NONE; } /* no newline */ static enum tep_event_type read_token_item(char **tok) { enum tep_event_type type; for (;;) { type = __read_token(tok); if (type != TEP_EVENT_SPACE && type != TEP_EVENT_NEWLINE) return type; free_token(*tok); *tok = NULL; } /* not reached */ *tok = NULL; return TEP_EVENT_NONE; } static int test_type(enum tep_event_type type, enum tep_event_type expect) { if (type != expect) { do_warning("Error: expected type %d but read %d", expect, type); return -1; } return 0; } static int test_type_token(enum tep_event_type type, const char *token, enum tep_event_type expect, const char *expect_tok) { if (type != expect) { do_warning("Error: expected type %d but read %d", expect, type); return -1; } if (strcmp(token, expect_tok) != 0) { do_warning("Error: expected '%s' but read '%s'", expect_tok, token); return -1; } return 0; } static int __read_expect_type(enum tep_event_type expect, char **tok, int newline_ok) { enum tep_event_type type; if (newline_ok) type = read_token(tok); else type = read_token_item(tok); return test_type(type, expect); } static int read_expect_type(enum tep_event_type expect, char **tok) { return __read_expect_type(expect, tok, 1); } static int __read_expected(enum tep_event_type expect, const char *str, int newline_ok) { enum tep_event_type type; char *token; int ret; if (newline_ok) type = read_token(&token); else type = read_token_item(&token); ret = test_type_token(type, token, expect, str); free_token(token); return ret; } static int read_expected(enum tep_event_type expect, const char *str) { return __read_expected(expect, str, 1); } static int read_expected_item(enum tep_event_type expect, const char *str) { return __read_expected(expect, str, 0); } static char *event_read_name(void) { char *token; if (read_expected(TEP_EVENT_ITEM, "name") < 0) return NULL; if (read_expected(TEP_EVENT_OP, ":") < 0) return NULL; if (read_expect_type(TEP_EVENT_ITEM, &token) < 0) goto fail; return token; fail: free_token(token); return NULL; } static int event_read_id(void) { char *token; int id; if (read_expected_item(TEP_EVENT_ITEM, "ID") < 0) return -1; if (read_expected(TEP_EVENT_OP, ":") < 0) return -1; if (read_expect_type(TEP_EVENT_ITEM, &token) < 0) goto fail; id = strtoul(token, NULL, 0); free_token(token); return id; fail: free_token(token); return -1; } static int field_is_string(struct tep_format_field *field) { if ((field->flags & TEP_FIELD_IS_ARRAY) && (strstr(field->type, "char") || strstr(field->type, "u8") || strstr(field->type, "s8"))) return 1; return 0; } static int field_is_dynamic(struct tep_format_field *field) { if (strncmp(field->type, "__data_loc", 10) == 0) return 1; return 0; } static int field_is_long(struct tep_format_field *field) { /* includes long long */ if (strstr(field->type, "long")) return 1; return 0; } static unsigned int type_size(const char *name) { /* This covers all TEP_FIELD_IS_STRING types. */ static struct { const char *type; unsigned int size; } table[] = { { "u8", 1 }, { "u16", 2 }, { "u32", 4 }, { "u64", 8 }, { "s8", 1 }, { "s16", 2 }, { "s32", 4 }, { "s64", 8 }, { "char", 1 }, { }, }; int i; for (i = 0; table[i].type; i++) { if (!strcmp(table[i].type, name)) return table[i].size; } return 0; } static int append(char **buf, const char *delim, const char *str) { char *new_buf; new_buf = realloc(*buf, strlen(*buf) + strlen(delim) + strlen(str) + 1); if (!new_buf) return -1; strcat(new_buf, delim); strcat(new_buf, str); *buf = new_buf; return 0; } static int event_read_fields(struct tep_event *event, struct tep_format_field **fields) { struct tep_format_field *field = NULL; enum tep_event_type type; char *token; char *last_token; char *delim = " "; int count = 0; int ret; do { unsigned int size_dynamic = 0; type = read_token(&token); if (type == TEP_EVENT_NEWLINE) { free_token(token); return count; } count++; if (test_type_token(type, token, TEP_EVENT_ITEM, "field")) goto fail; free_token(token); type = read_token(&token); /* * The ftrace fields may still use the "special" name. * Just ignore it. */ if (event->flags & TEP_EVENT_FL_ISFTRACE && type == TEP_EVENT_ITEM && strcmp(token, "special") == 0) { free_token(token); type = read_token(&token); } if (test_type_token(type, token, TEP_EVENT_OP, ":") < 0) goto fail; free_token(token); if (read_expect_type(TEP_EVENT_ITEM, &token) < 0) goto fail; last_token = token; field = calloc(1, sizeof(*field)); if (!field) goto fail; field->event = event; /* read the rest of the type */ for (;;) { type = read_token(&token); if (type == TEP_EVENT_ITEM || (type == TEP_EVENT_OP && strcmp(token, "*") == 0) || /* * Some of the ftrace fields are broken and have * an illegal "." in them. */ (event->flags & TEP_EVENT_FL_ISFTRACE && type == TEP_EVENT_OP && strcmp(token, ".") == 0)) { if (strcmp(token, "*") == 0) field->flags |= TEP_FIELD_IS_POINTER; if (field->type) { ret = append(&field->type, delim, last_token); free(last_token); if (ret < 0) goto fail; } else field->type = last_token; last_token = token; delim = " "; continue; } /* Handle __attribute__((user)) */ if ((type == TEP_EVENT_DELIM) && strcmp("__attribute__", last_token) == 0 && token[0] == '(') { int depth = 1; int ret; ret = append(&field->type, " ", last_token); ret |= append(&field->type, "", "("); if (ret < 0) goto fail; delim = " "; while ((type = read_token(&token)) != TEP_EVENT_NONE) { if (type == TEP_EVENT_DELIM) { if (token[0] == '(') depth++; else if (token[0] == ')') depth--; if (!depth) break; ret = append(&field->type, "", token); delim = ""; } else { ret = append(&field->type, delim, token); delim = " "; } if (ret < 0) goto fail; free(last_token); last_token = token; } continue; } break; } if (!field->type) { do_warning_event(event, "%s: no type found", __func__); goto fail; } field->name = field->alias = last_token; if (test_type(type, TEP_EVENT_OP)) goto fail; if (strcmp(token, "[") == 0) { enum tep_event_type last_type = type; char *brackets = token; field->flags |= TEP_FIELD_IS_ARRAY; type = read_token(&token); if (type == TEP_EVENT_ITEM) field->arraylen = strtoul(token, NULL, 0); else field->arraylen = 0; while (strcmp(token, "]") != 0) { const char *delim; if (last_type == TEP_EVENT_ITEM && type == TEP_EVENT_ITEM) delim = " "; else delim = ""; last_type = type; ret = append(&brackets, delim, token); if (ret < 0) { free(brackets); goto fail; } /* We only care about the last token */ field->arraylen = strtoul(token, NULL, 0); free_token(token); type = read_token(&token); if (type == TEP_EVENT_NONE) { free(brackets); do_warning_event(event, "failed to find token"); goto fail; } } free_token(token); ret = append(&brackets, "", "]"); if (ret < 0) { free(brackets); goto fail; } /* add brackets to type */ type = read_token(&token); /* * If the next token is not an OP, then it is of * the format: type [] item; */ if (type == TEP_EVENT_ITEM) { ret = append(&field->type, " ", field->name); if (ret < 0) { free(brackets); goto fail; } ret = append(&field->type, "", brackets); size_dynamic = type_size(field->name); free_token(field->name); field->name = field->alias = token; type = read_token(&token); } else { ret = append(&field->type, "", brackets); if (ret < 0) { free(brackets); goto fail; } } free(brackets); } if (field_is_string(field)) field->flags |= TEP_FIELD_IS_STRING; if (field_is_dynamic(field)) field->flags |= TEP_FIELD_IS_DYNAMIC; if (field_is_long(field)) field->flags |= TEP_FIELD_IS_LONG; if (test_type_token(type, token, TEP_EVENT_OP, ";")) goto fail; free_token(token); if (read_expected(TEP_EVENT_ITEM, "offset") < 0) goto fail_expect; if (read_expected(TEP_EVENT_OP, ":") < 0) goto fail_expect; if (read_expect_type(TEP_EVENT_ITEM, &token)) goto fail; field->offset = strtoul(token, NULL, 0); free_token(token); if (read_expected(TEP_EVENT_OP, ";") < 0) goto fail_expect; if (read_expected(TEP_EVENT_ITEM, "size") < 0) goto fail_expect; if (read_expected(TEP_EVENT_OP, ":") < 0) goto fail_expect; if (read_expect_type(TEP_EVENT_ITEM, &token)) goto fail; field->size = strtoul(token, NULL, 0); free_token(token); if (read_expected(TEP_EVENT_OP, ";") < 0) goto fail_expect; type = read_token(&token); if (type != TEP_EVENT_NEWLINE) { /* newer versions of the kernel have a "signed" type */ if (test_type_token(type, token, TEP_EVENT_ITEM, "signed")) goto fail; free_token(token); if (read_expected(TEP_EVENT_OP, ":") < 0) goto fail_expect; if (read_expect_type(TEP_EVENT_ITEM, &token)) goto fail; if (strtoul(token, NULL, 0)) field->flags |= TEP_FIELD_IS_SIGNED; free_token(token); if (read_expected(TEP_EVENT_OP, ";") < 0) goto fail_expect; if (read_expect_type(TEP_EVENT_NEWLINE, &token)) goto fail; } free_token(token); if (field->flags & TEP_FIELD_IS_ARRAY) { if (field->arraylen) field->elementsize = field->size / field->arraylen; else if (field->flags & TEP_FIELD_IS_DYNAMIC) field->elementsize = size_dynamic; else if (field->flags & TEP_FIELD_IS_STRING) field->elementsize = 1; else if (field->flags & TEP_FIELD_IS_LONG) field->elementsize = event->tep ? event->tep->long_size : sizeof(long); } else field->elementsize = field->size; *fields = field; fields = &field->next; } while (1); return 0; fail: free_token(token); fail_expect: if (field) { free(field->type); free(field->name); free(field); } return -1; } static int event_read_format(struct tep_event *event) { char *token; int ret; if (read_expected_item(TEP_EVENT_ITEM, "format") < 0) return -1; if (read_expected(TEP_EVENT_OP, ":") < 0) return -1; if (read_expect_type(TEP_EVENT_NEWLINE, &token)) goto fail; free_token(token); ret = event_read_fields(event, &event->format.common_fields); if (ret < 0) return ret; event->format.nr_common = ret; ret = event_read_fields(event, &event->format.fields); if (ret < 0) return ret; event->format.nr_fields = ret; return 0; fail: free_token(token); return -1; } static enum tep_event_type process_arg_token(struct tep_event *event, struct tep_print_arg *arg, char **tok, enum tep_event_type type); static enum tep_event_type process_arg(struct tep_event *event, struct tep_print_arg *arg, char **tok) { enum tep_event_type type; char *token; type = read_token(&token); *tok = token; return process_arg_token(event, arg, tok, type); } static enum tep_event_type process_op(struct tep_event *event, struct tep_print_arg *arg, char **tok); /* * For __print_symbolic() and __print_flags, we need to completely * evaluate the first argument, which defines what to print next. */ static enum tep_event_type process_field_arg(struct tep_event *event, struct tep_print_arg *arg, char **tok) { enum tep_event_type type; type = process_arg(event, arg, tok); while (type == TEP_EVENT_OP) { type = process_op(event, arg, tok); } return type; } static enum tep_event_type process_cond(struct tep_event *event, struct tep_print_arg *top, char **tok) { struct tep_print_arg *arg, *left, *right; enum tep_event_type type; char *token = NULL; arg = alloc_arg(); left = alloc_arg(); right = alloc_arg(); if (!arg || !left || !right) { do_warning_event(event, "%s: not enough memory!", __func__); /* arg will be freed at out_free */ free_arg(left); free_arg(right); goto out_free; } arg->type = TEP_PRINT_OP; arg->op.left = left; arg->op.right = right; *tok = NULL; type = process_arg(event, left, &token); again: if (type == TEP_EVENT_ERROR) goto out_free; /* Handle other operations in the arguments */ if (type == TEP_EVENT_OP && strcmp(token, ":") != 0) { type = process_op(event, left, &token); goto again; } if (test_type_token(type, token, TEP_EVENT_OP, ":")) goto out_free; arg->op.op = token; type = process_arg(event, right, &token); top->op.right = arg; *tok = token; return type; out_free: /* Top may point to itself */ top->op.right = NULL; free_token(token); free_arg(arg); return TEP_EVENT_ERROR; } static enum tep_event_type process_array(struct tep_event *event, struct tep_print_arg *top, char **tok) { struct tep_print_arg *arg; enum tep_event_type type; char *token = NULL; arg = alloc_arg(); if (!arg) { do_warning_event(event, "%s: not enough memory!", __func__); /* '*tok' is set to top->op.op. No need to free. */ *tok = NULL; return TEP_EVENT_ERROR; } *tok = NULL; type = process_arg(event, arg, &token); if (test_type_token(type, token, TEP_EVENT_OP, "]")) goto out_free; top->op.right = arg; free_token(token); type = read_token_item(&token); *tok = token; return type; out_free: free_token(token); free_arg(arg); return TEP_EVENT_ERROR; } static int get_op_prio(char *op) { if (!op[1]) { switch (op[0]) { case '~': case '!': return 4; case '*': case '/': case '%': return 6; case '+': case '-': return 7; /* '>>' and '<<' are 8 */ case '<': case '>': return 9; /* '==' and '!=' are 10 */ case '&': return 11; case '^': return 12; case '|': return 13; case '?': return 16; default: do_warning("unknown op '%c'", op[0]); return -1; } } else { if (strcmp(op, "++") == 0 || strcmp(op, "--") == 0) { return 3; } else if (strcmp(op, ">>") == 0 || strcmp(op, "<<") == 0) { return 8; } else if (strcmp(op, ">=") == 0 || strcmp(op, "<=") == 0) { return 9; } else if (strcmp(op, "==") == 0 || strcmp(op, "!=") == 0) { return 10; } else if (strcmp(op, "&&") == 0) { return 14; } else if (strcmp(op, "||") == 0) { return 15; } else { do_warning("unknown op '%s'", op); return -1; } } } static int set_op_prio(struct tep_print_arg *arg) { /* single ops are the greatest */ if (!arg->op.left || arg->op.left->type == TEP_PRINT_NULL) arg->op.prio = 0; else arg->op.prio = get_op_prio(arg->op.op); return arg->op.prio; } /* Note, *tok does not get freed, but will most likely be saved */ static enum tep_event_type process_op(struct tep_event *event, struct tep_print_arg *arg, char **tok) { struct tep_print_arg *left, *right = NULL; enum tep_event_type type; char *token; /* the op is passed in via tok */ token = *tok; if (arg->type == TEP_PRINT_OP && !arg->op.left) { /* handle single op */ if (token[1]) { do_warning_event(event, "bad op token %s", token); goto out_free; } switch (token[0]) { case '~': case '!': case '+': case '-': break; default: do_warning_event(event, "bad op token %s", token); goto out_free; } /* make an empty left */ left = alloc_arg(); if (!left) goto out_warn_free; left->type = TEP_PRINT_NULL; arg->op.left = left; right = alloc_arg(); if (!right) goto out_warn_free; arg->op.right = right; /* do not free the token, it belongs to an op */ *tok = NULL; type = process_arg(event, right, tok); } else if (strcmp(token, "?") == 0) { left = alloc_arg(); if (!left) goto out_warn_free; /* copy the top arg to the left */ *left = *arg; arg->type = TEP_PRINT_OP; arg->op.op = token; arg->op.left = left; arg->op.prio = 0; /* it will set arg->op.right */ type = process_cond(event, arg, tok); } else if (strcmp(token, ">>") == 0 || strcmp(token, "<<") == 0 || strcmp(token, "&") == 0 || strcmp(token, "|") == 0 || strcmp(token, "&&") == 0 || strcmp(token, "||") == 0 || strcmp(token, "-") == 0 || strcmp(token, "+") == 0 || strcmp(token, "*") == 0 || strcmp(token, "^") == 0 || strcmp(token, "/") == 0 || strcmp(token, "%") == 0 || strcmp(token, "<") == 0 || strcmp(token, ">") == 0 || strcmp(token, "<=") == 0 || strcmp(token, ">=") == 0 || strcmp(token, "==") == 0 || strcmp(token, "!=") == 0) { left = alloc_arg(); if (!left) goto out_warn_free; /* copy the top arg to the left */ *left = *arg; arg->type = TEP_PRINT_OP; arg->op.op = token; arg->op.left = left; arg->op.right = NULL; if (set_op_prio(arg) == -1) { event->flags |= TEP_EVENT_FL_FAILED; /* arg->op.op (= token) will be freed at out_free */ arg->op.op = NULL; goto out_free; } type = read_token_item(&token); *tok = token; /* could just be a type pointer */ if ((strcmp(arg->op.op, "*") == 0) && type == TEP_EVENT_DELIM && (strcmp(token, ")") == 0)) { int ret; if (left->type != TEP_PRINT_ATOM) { do_warning_event(event, "bad pointer type"); goto out_free; } ret = append(&left->atom.atom, " ", "*"); if (ret < 0) goto out_warn_free; free(arg->op.op); *arg = *left; free(left); return type; } right = alloc_arg(); if (!right) goto out_warn_free; type = process_arg_token(event, right, tok, type); if (type == TEP_EVENT_ERROR) { free_arg(right); /* token was freed in process_arg_token() via *tok */ token = NULL; goto out_free; } if (right->type == TEP_PRINT_OP && get_op_prio(arg->op.op) < get_op_prio(right->op.op)) { struct tep_print_arg tmp; /* rotate ops according to the priority */ arg->op.right = right->op.left; tmp = *arg; *arg = *right; *right = tmp; arg->op.left = right; } else { arg->op.right = right; } } else if (strcmp(token, "[") == 0) { left = alloc_arg(); if (!left) goto out_warn_free; *left = *arg; arg->type = TEP_PRINT_OP; arg->op.op = token; arg->op.left = left; arg->op.prio = 0; /* it will set arg->op.right */ type = process_array(event, arg, tok); } else { do_warning_event(event, "unknown op '%s'", token); event->flags |= TEP_EVENT_FL_FAILED; /* the arg is now the left side */ goto out_free; } if (type == TEP_EVENT_OP && strcmp(*tok, ":") != 0) { int prio; /* higher prios need to be closer to the root */ prio = get_op_prio(*tok); if (prio > arg->op.prio) return process_op(event, arg, tok); return process_op(event, right, tok); } return type; out_warn_free: do_warning_event(event, "%s: not enough memory!", __func__); out_free: free_token(token); *tok = NULL; return TEP_EVENT_ERROR; } static enum tep_event_type process_entry(struct tep_event *event __maybe_unused, struct tep_print_arg *arg, char **tok) { enum tep_event_type type; char *field; char *token; if (read_expected(TEP_EVENT_OP, "->") < 0) goto out_err; if (read_expect_type(TEP_EVENT_ITEM, &token) < 0) goto out_free; field = token; arg->type = TEP_PRINT_FIELD; arg->field.name = field; if (is_flag_field) { arg->field.field = tep_find_any_field(event, arg->field.name); arg->field.field->flags |= TEP_FIELD_IS_FLAG; is_flag_field = 0; } else if (is_symbolic_field) { arg->field.field = tep_find_any_field(event, arg->field.name); arg->field.field->flags |= TEP_FIELD_IS_SYMBOLIC; is_symbolic_field = 0; } type = read_token(&token); *tok = token; return type; out_free: free_token(token); out_err: *tok = NULL; return TEP_EVENT_ERROR; } static int alloc_and_process_delim(struct tep_event *event, char *next_token, struct tep_print_arg **print_arg) { struct tep_print_arg *field; enum tep_event_type type; char *token; int ret = 0; field = alloc_arg(); if (!field) { do_warning_event(event, "%s: not enough memory!", __func__); errno = ENOMEM; return -1; } type = process_arg(event, field, &token); if (test_type_token(type, token, TEP_EVENT_DELIM, next_token)) { errno = EINVAL; ret = -1; free_arg(field); goto out_free_token; } *print_arg = field; out_free_token: free_token(token); return ret; } static char *arg_eval (struct tep_print_arg *arg); static unsigned long long eval_type_str(unsigned long long val, const char *type, int pointer) { int sign = 0; char *ref; int len; len = strlen(type); if (pointer) { if (type[len-1] != '*') { do_warning("pointer expected with non pointer type"); return val; } ref = malloc(len); if (!ref) { do_warning("%s: not enough memory!", __func__); return val; } memcpy(ref, type, len); /* chop off the " *" */ ref[len - 2] = 0; val = eval_type_str(val, ref, 0); free(ref); return val; } /* check if this is a pointer */ if (type[len - 1] == '*') return val; /* Try to figure out the arg size*/ if (strncmp(type, "struct", 6) == 0) /* all bets off */ return val; if (strcmp(type, "u8") == 0) return val & 0xff; if (strcmp(type, "u16") == 0) return val & 0xffff; if (strcmp(type, "u32") == 0) return val & 0xffffffff; if (strcmp(type, "u64") == 0 || strcmp(type, "s64") == 0) return val; if (strcmp(type, "s8") == 0) return (unsigned long long)(char)val & 0xff; if (strcmp(type, "s16") == 0) return (unsigned long long)(short)val & 0xffff; if (strcmp(type, "s32") == 0) return (unsigned long long)(int)val & 0xffffffff; if (strncmp(type, "unsigned ", 9) == 0) { sign = 0; type += 9; } if (strcmp(type, "char") == 0) { if (sign) return (unsigned long long)(char)val & 0xff; else return val & 0xff; } if (strcmp(type, "short") == 0) { if (sign) return (unsigned long long)(short)val & 0xffff; else return val & 0xffff; } if (strcmp(type, "int") == 0) { if (sign) return (unsigned long long)(int)val & 0xffffffff; else return val & 0xffffffff; } return val; } /* * Try to figure out the type. */ static unsigned long long eval_type(unsigned long long val, struct tep_print_arg *arg, int pointer) { if (arg->type != TEP_PRINT_TYPE) { do_warning("expected type argument"); return 0; } return eval_type_str(val, arg->typecast.type, pointer); } static int arg_num_eval(struct tep_print_arg *arg, long long *val) { long long left, right; int ret = 1; switch (arg->type) { case TEP_PRINT_ATOM: *val = strtoll(arg->atom.atom, NULL, 0); break; case TEP_PRINT_TYPE: ret = arg_num_eval(arg->typecast.item, val); if (!ret) break; *val = eval_type(*val, arg, 0); break; case TEP_PRINT_OP: switch (arg->op.op[0]) { case '|': ret = arg_num_eval(arg->op.left, &left); if (!ret) break; ret = arg_num_eval(arg->op.right, &right); if (!ret) break; if (arg->op.op[1]) *val = left || right; else *val = left | right; break; case '&': ret = arg_num_eval(arg->op.left, &left); if (!ret) break; ret = arg_num_eval(arg->op.right, &right); if (!ret) break; if (arg->op.op[1]) *val = left && right; else *val = left & right; break; case '<': ret = arg_num_eval(arg->op.left, &left); if (!ret) break; ret = arg_num_eval(arg->op.right, &right); if (!ret) break; switch (arg->op.op[1]) { case 0: *val = left < right; break; case '<': *val = left << right; break; case '=': *val = left <= right; break; default: do_warning("unknown op '%s'", arg->op.op); ret = 0; } break; case '>': ret = arg_num_eval(arg->op.left, &left); if (!ret) break; ret = arg_num_eval(arg->op.right, &right); if (!ret) break; switch (arg->op.op[1]) { case 0: *val = left > right; break; case '>': *val = left >> right; break; case '=': *val = left >= right; break; default: do_warning("unknown op '%s'", arg->op.op); ret = 0; } break; case '=': ret = arg_num_eval(arg->op.left, &left); if (!ret) break; ret = arg_num_eval(arg->op.right, &right); if (!ret) break; if (arg->op.op[1] != '=') { do_warning("unknown op '%s'", arg->op.op); ret = 0; } else *val = left == right; break; case '!': ret = arg_num_eval(arg->op.left, &left); if (!ret) break; ret = arg_num_eval(arg->op.right, &right); if (!ret) break; switch (arg->op.op[1]) { case '=': *val = left != right; break; default: do_warning("unknown op '%s'", arg->op.op); ret = 0; } break; case '-': /* check for negative */ if (arg->op.left->type == TEP_PRINT_NULL) left = 0; else ret = arg_num_eval(arg->op.left, &left); if (!ret) break; ret = arg_num_eval(arg->op.right, &right); if (!ret) break; *val = left - right; break; case '+': if (arg->op.left->type == TEP_PRINT_NULL) left = 0; else ret = arg_num_eval(arg->op.left, &left); if (!ret) break; ret = arg_num_eval(arg->op.right, &right); if (!ret) break; *val = left + right; break; case '~': ret = arg_num_eval(arg->op.right, &right); if (!ret) break; *val = ~right; break; default: do_warning("unknown op '%s'", arg->op.op); ret = 0; } break; case TEP_PRINT_NULL: case TEP_PRINT_FIELD ... TEP_PRINT_SYMBOL: case TEP_PRINT_STRING: case TEP_PRINT_BSTRING: case TEP_PRINT_BITMASK: default: do_warning("invalid eval type %d", arg->type); ret = 0; } return ret; } static char *arg_eval (struct tep_print_arg *arg) { long long val; static char buf[24]; switch (arg->type) { case TEP_PRINT_ATOM: return arg->atom.atom; case TEP_PRINT_TYPE: return arg_eval(arg->typecast.item); case TEP_PRINT_OP: if (!arg_num_eval(arg, &val)) break; sprintf(buf, "%lld", val); return buf; case TEP_PRINT_NULL: case TEP_PRINT_FIELD ... TEP_PRINT_SYMBOL: case TEP_PRINT_STRING: case TEP_PRINT_BSTRING: case TEP_PRINT_BITMASK: default: do_warning("invalid eval type %d", arg->type); break; } return NULL; } static enum tep_event_type process_fields(struct tep_event *event, struct tep_print_flag_sym **list, char **tok) { enum tep_event_type type; struct tep_print_arg *arg = NULL; struct tep_print_flag_sym *field; char *token = *tok; char *value; do { free_token(token); type = read_token_item(&token); if (test_type_token(type, token, TEP_EVENT_OP, "{")) break; arg = alloc_arg(); if (!arg) goto out_free; free_token(token); type = process_arg(event, arg, &token); if (type == TEP_EVENT_OP) type = process_op(event, arg, &token); if (type == TEP_EVENT_ERROR) goto out_free; if (test_type_token(type, token, TEP_EVENT_DELIM, ",")) goto out_free; field = calloc(1, sizeof(*field)); if (!field) goto out_free; value = arg_eval(arg); if (value == NULL) goto out_free_field; field->value = strdup(value); if (field->value == NULL) goto out_free_field; free_arg(arg); arg = alloc_arg(); if (!arg) goto out_free; free_token(token); type = process_arg(event, arg, &token); if (test_type_token(type, token, TEP_EVENT_OP, "}")) goto out_free_field; value = arg_eval(arg); if (value == NULL) goto out_free_field; field->str = strdup(value); if (field->str == NULL) goto out_free_field; free_arg(arg); arg = NULL; *list = field; list = &field->next; free_token(token); type = read_token_item(&token); } while (type == TEP_EVENT_DELIM && strcmp(token, ",") == 0); *tok = token; return type; out_free_field: free_flag_sym(field); out_free: free_arg(arg); free_token(token); *tok = NULL; return TEP_EVENT_ERROR; } static enum tep_event_type process_flags(struct tep_event *event, struct tep_print_arg *arg, char **tok) { struct tep_print_arg *field; enum tep_event_type type; char *token = NULL; memset(arg, 0, sizeof(*arg)); arg->type = TEP_PRINT_FLAGS; field = alloc_arg(); if (!field) { do_warning_event(event, "%s: not enough memory!", __func__); goto out_free; } type = process_field_arg(event, field, &token); /* Handle operations in the first argument */ while (type == TEP_EVENT_OP) type = process_op(event, field, &token); if (test_type_token(type, token, TEP_EVENT_DELIM, ",")) goto out_free_field; free_token(token); arg->flags.field = field; type = read_token_item(&token); if (event_item_type(type)) { arg->flags.delim = token; type = read_token_item(&token); } if (test_type_token(type, token, TEP_EVENT_DELIM, ",")) goto out_free; type = process_fields(event, &arg->flags.flags, &token); if (test_type_token(type, token, TEP_EVENT_DELIM, ")")) goto out_free; free_token(token); type = read_token_item(tok); return type; out_free_field: free_arg(field); out_free: free_token(token); *tok = NULL; return TEP_EVENT_ERROR; } static enum tep_event_type process_symbols(struct tep_event *event, struct tep_print_arg *arg, char **tok) { struct tep_print_arg *field; enum tep_event_type type; char *token = NULL; memset(arg, 0, sizeof(*arg)); arg->type = TEP_PRINT_SYMBOL; field = alloc_arg(); if (!field) { do_warning_event(event, "%s: not enough memory!", __func__); goto out_free; } type = process_field_arg(event, field, &token); if (test_type_token(type, token, TEP_EVENT_DELIM, ",")) goto out_free_field; arg->symbol.field = field; type = process_fields(event, &arg->symbol.symbols, &token); if (test_type_token(type, token, TEP_EVENT_DELIM, ")")) goto out_free; free_token(token); type = read_token_item(tok); return type; out_free_field: free_arg(field); out_free: free_token(token); *tok = NULL; return TEP_EVENT_ERROR; } static enum tep_event_type process_hex_common(struct tep_event *event, struct tep_print_arg *arg, char **tok, enum tep_print_arg_type type) { memset(arg, 0, sizeof(*arg)); arg->type = type; if (alloc_and_process_delim(event, ",", &arg->hex.field)) goto out; if (alloc_and_process_delim(event, ")", &arg->hex.size)) goto free_field; return read_token_item(tok); free_field: free_arg(arg->hex.field); arg->hex.field = NULL; out: *tok = NULL; return TEP_EVENT_ERROR; } static enum tep_event_type process_hex(struct tep_event *event, struct tep_print_arg *arg, char **tok) { return process_hex_common(event, arg, tok, TEP_PRINT_HEX); } static enum tep_event_type process_hex_str(struct tep_event *event, struct tep_print_arg *arg, char **tok) { return process_hex_common(event, arg, tok, TEP_PRINT_HEX_STR); } static enum tep_event_type process_int_array(struct tep_event *event, struct tep_print_arg *arg, char **tok) { memset(arg, 0, sizeof(*arg)); arg->type = TEP_PRINT_INT_ARRAY; if (alloc_and_process_delim(event, ",", &arg->int_array.field)) goto out; if (alloc_and_process_delim(event, ",", &arg->int_array.count)) goto free_field; if (alloc_and_process_delim(event, ")", &arg->int_array.el_size)) goto free_size; return read_token_item(tok); free_size: free_arg(arg->int_array.count); arg->int_array.count = NULL; free_field: free_arg(arg->int_array.field); arg->int_array.field = NULL; out: *tok = NULL; return TEP_EVENT_ERROR; } static enum tep_event_type process_dynamic_array(struct tep_event *event, struct tep_print_arg *arg, char **tok) { struct tep_format_field *field; enum tep_event_type type; char *token; memset(arg, 0, sizeof(*arg)); arg->type = TEP_PRINT_DYNAMIC_ARRAY; /* * The item within the parenthesis is another field that holds * the index into where the array starts. */ type = read_token(&token); *tok = token; if (type != TEP_EVENT_ITEM) goto out_free; /* Find the field */ field = tep_find_field(event, token); if (!field) goto out_free; arg->dynarray.field = field; arg->dynarray.index = 0; if (read_expected(TEP_EVENT_DELIM, ")") < 0) goto out_free; free_token(token); type = read_token_item(&token); *tok = token; if (type != TEP_EVENT_OP || strcmp(token, "[") != 0) return type; free_token(token); arg = alloc_arg(); if (!arg) { do_warning_event(event, "%s: not enough memory!", __func__); *tok = NULL; return TEP_EVENT_ERROR; } type = process_arg(event, arg, &token); if (type == TEP_EVENT_ERROR) goto out_free_arg; if (!test_type_token(type, token, TEP_EVENT_OP, "]")) goto out_free_arg; free_token(token); type = read_token_item(tok); return type; out_free_arg: free_arg(arg); out_free: free_token(token); *tok = NULL; return TEP_EVENT_ERROR; } static enum tep_event_type process_dynamic_array_len(struct tep_event *event, struct tep_print_arg *arg, char **tok) { struct tep_format_field *field; enum tep_event_type type; char *token; if (read_expect_type(TEP_EVENT_ITEM, &token) < 0) goto out_free; arg->type = TEP_PRINT_DYNAMIC_ARRAY_LEN; /* Find the field */ field = tep_find_field(event, token); if (!field) goto out_free; arg->dynarray.field = field; arg->dynarray.index = 0; if (read_expected(TEP_EVENT_DELIM, ")") < 0) goto out_err; type = read_token(&token); *tok = token; return type; out_free: free_token(token); out_err: *tok = NULL; return TEP_EVENT_ERROR; } static enum tep_event_type process_paren(struct tep_event *event, struct tep_print_arg *arg, char **tok) { struct tep_print_arg *item_arg; enum tep_event_type type; char *token; type = process_arg(event, arg, &token); if (type == TEP_EVENT_ERROR) goto out_free; if (type == TEP_EVENT_OP) type = process_op(event, arg, &token); if (type == TEP_EVENT_ERROR) goto out_free; if (test_type_token(type, token, TEP_EVENT_DELIM, ")")) goto out_free; free_token(token); type = read_token_item(&token); /* * If the next token is an item or another open paren, then * this was a typecast. */ if (event_item_type(type) || (type == TEP_EVENT_DELIM && strcmp(token, "(") == 0)) { /* make this a typecast and contine */ /* prevous must be an atom */ if (arg->type != TEP_PRINT_ATOM) { do_warning_event(event, "previous needed to be TEP_PRINT_ATOM"); goto out_free; } item_arg = alloc_arg(); if (!item_arg) { do_warning_event(event, "%s: not enough memory!", __func__); goto out_free; } arg->type = TEP_PRINT_TYPE; arg->typecast.type = arg->atom.atom; arg->typecast.item = item_arg; type = process_arg_token(event, item_arg, &token, type); } *tok = token; return type; out_free: free_token(token); *tok = NULL; return TEP_EVENT_ERROR; } static enum tep_event_type process_str(struct tep_event *event __maybe_unused, struct tep_print_arg *arg, char **tok) { enum tep_event_type type; char *token; if (read_expect_type(TEP_EVENT_ITEM, &token) < 0) goto out_free; arg->type = TEP_PRINT_STRING; arg->string.string = token; arg->string.offset = -1; if (read_expected(TEP_EVENT_DELIM, ")") < 0) goto out_err; type = read_token(&token); *tok = token; return type; out_free: free_token(token); out_err: *tok = NULL; return TEP_EVENT_ERROR; } static enum tep_event_type process_bitmask(struct tep_event *event __maybe_unused, struct tep_print_arg *arg, char **tok) { enum tep_event_type type; char *token; if (read_expect_type(TEP_EVENT_ITEM, &token) < 0) goto out_free; arg->type = TEP_PRINT_BITMASK; arg->bitmask.bitmask = token; arg->bitmask.offset = -1; if (read_expected(TEP_EVENT_DELIM, ")") < 0) goto out_err; type = read_token(&token); *tok = token; return type; out_free: free_token(token); out_err: *tok = NULL; return TEP_EVENT_ERROR; } static struct tep_function_handler * find_func_handler(struct tep_handle *tep, char *func_name) { struct tep_function_handler *func; if (!tep) return NULL; for (func = tep->func_handlers; func; func = func->next) { if (strcmp(func->name, func_name) == 0) break; } return func; } static void remove_func_handler(struct tep_handle *tep, char *func_name) { struct tep_function_handler *func; struct tep_function_handler **next; next = &tep->func_handlers; while ((func = *next)) { if (strcmp(func->name, func_name) == 0) { *next = func->next; free_func_handle(func); break; } next = &func->next; } } static enum tep_event_type process_func_handler(struct tep_event *event, struct tep_function_handler *func, struct tep_print_arg *arg, char **tok) { struct tep_print_arg **next_arg; struct tep_print_arg *farg; enum tep_event_type type; char *token; int i; arg->type = TEP_PRINT_FUNC; arg->func.func = func; *tok = NULL; next_arg = &(arg->func.args); for (i = 0; i < func->nr_args; i++) { farg = alloc_arg(); if (!farg) { do_warning_event(event, "%s: not enough memory!", __func__); return TEP_EVENT_ERROR; } type = process_arg(event, farg, &token); if (i < (func->nr_args - 1)) { if (type != TEP_EVENT_DELIM || strcmp(token, ",") != 0) { do_warning_event(event, "Error: function '%s()' expects %d arguments but event %s only uses %d", func->name, func->nr_args, event->name, i + 1); goto err; } } else { if (type != TEP_EVENT_DELIM || strcmp(token, ")") != 0) { do_warning_event(event, "Error: function '%s()' only expects %d arguments but event %s has more", func->name, func->nr_args, event->name); goto err; } } *next_arg = farg; next_arg = &(farg->next); free_token(token); } type = read_token(&token); *tok = token; return type; err: free_arg(farg); free_token(token); return TEP_EVENT_ERROR; } static enum tep_event_type process_builtin_expect(struct tep_event *event, struct tep_print_arg *arg, char **tok) { enum tep_event_type type; char *token = NULL; /* Handle __builtin_expect( cond, #) */ type = process_arg(event, arg, &token); if (type != TEP_EVENT_DELIM || token[0] != ',') goto out_free; free_token(token); /* We don't care what the second parameter is of the __builtin_expect() */ if (read_expect_type(TEP_EVENT_ITEM, &token) < 0) goto out_free; if (read_expected(TEP_EVENT_DELIM, ")") < 0) goto out_free; free_token(token); type = read_token_item(tok); return type; out_free: free_token(token); *tok = NULL; return TEP_EVENT_ERROR; } static enum tep_event_type process_function(struct tep_event *event, struct tep_print_arg *arg, char *token, char **tok) { struct tep_function_handler *func; if (strcmp(token, "__print_flags") == 0) { free_token(token); is_flag_field = 1; return process_flags(event, arg, tok); } if (strcmp(token, "__print_symbolic") == 0) { free_token(token); is_symbolic_field = 1; return process_symbols(event, arg, tok); } if (strcmp(token, "__print_hex") == 0) { free_token(token); return process_hex(event, arg, tok); } if (strcmp(token, "__print_hex_str") == 0) { free_token(token); return process_hex_str(event, arg, tok); } if (strcmp(token, "__print_array") == 0) { free_token(token); return process_int_array(event, arg, tok); } if (strcmp(token, "__get_str") == 0) { free_token(token); return process_str(event, arg, tok); } if (strcmp(token, "__get_bitmask") == 0) { free_token(token); return process_bitmask(event, arg, tok); } if (strcmp(token, "__get_dynamic_array") == 0) { free_token(token); return process_dynamic_array(event, arg, tok); } if (strcmp(token, "__get_dynamic_array_len") == 0) { free_token(token); return process_dynamic_array_len(event, arg, tok); } if (strcmp(token, "__builtin_expect") == 0) { free_token(token); return process_builtin_expect(event, arg, tok); } func = find_func_handler(event->tep, token); if (func) { free_token(token); return process_func_handler(event, func, arg, tok); } do_warning_event(event, "function %s not defined", token); free_token(token); return TEP_EVENT_ERROR; } static enum tep_event_type process_arg_token(struct tep_event *event, struct tep_print_arg *arg, char **tok, enum tep_event_type type) { char *token; char *atom; token = *tok; switch (type) { case TEP_EVENT_ITEM: if (strcmp(token, "REC") == 0) { free_token(token); type = process_entry(event, arg, &token); break; } atom = token; /* test the next token */ type = read_token_item(&token); /* * If the next token is a parenthesis, then this * is a function. */ if (type == TEP_EVENT_DELIM && strcmp(token, "(") == 0) { free_token(token); token = NULL; /* this will free atom. */ type = process_function(event, arg, atom, &token); break; } /* atoms can be more than one token long */ while (type == TEP_EVENT_ITEM) { int ret; ret = append(&atom, " ", token); if (ret < 0) { free(atom); *tok = NULL; free_token(token); return TEP_EVENT_ERROR; } free_token(token); type = read_token_item(&token); } arg->type = TEP_PRINT_ATOM; arg->atom.atom = atom; break; case TEP_EVENT_DQUOTE: case TEP_EVENT_SQUOTE: arg->type = TEP_PRINT_ATOM; arg->atom.atom = token; type = read_token_item(&token); break; case TEP_EVENT_DELIM: if (strcmp(token, "(") == 0) { free_token(token); type = process_paren(event, arg, &token); break; } case TEP_EVENT_OP: /* handle single ops */ arg->type = TEP_PRINT_OP; arg->op.op = token; arg->op.left = NULL; type = process_op(event, arg, &token); /* On error, the op is freed */ if (type == TEP_EVENT_ERROR) arg->op.op = NULL; /* return error type if errored */ break; case TEP_EVENT_ERROR ... TEP_EVENT_NEWLINE: default: do_warning_event(event, "unexpected type %d", type); return TEP_EVENT_ERROR; } *tok = token; return type; } static int event_read_print_args(struct tep_event *event, struct tep_print_arg **list) { enum tep_event_type type = TEP_EVENT_ERROR; struct tep_print_arg *arg; char *token; int args = 0; do { if (type == TEP_EVENT_NEWLINE) { type = read_token_item(&token); continue; } arg = alloc_arg(); if (!arg) { do_warning_event(event, "%s: not enough memory!", __func__); return -1; } type = process_arg(event, arg, &token); if (type == TEP_EVENT_ERROR) { free_token(token); free_arg(arg); return -1; } *list = arg; args++; if (type == TEP_EVENT_OP) { type = process_op(event, arg, &token); free_token(token); if (type == TEP_EVENT_ERROR) { *list = NULL; free_arg(arg); return -1; } list = &arg->next; continue; } if (type == TEP_EVENT_DELIM && strcmp(token, ",") == 0) { free_token(token); *list = arg; list = &arg->next; continue; } break; } while (type != TEP_EVENT_NONE); if (type != TEP_EVENT_NONE && type != TEP_EVENT_ERROR) free_token(token); return args; } static int event_read_print(struct tep_event *event) { enum tep_event_type type; char *token; int ret; if (read_expected_item(TEP_EVENT_ITEM, "print") < 0) return -1; if (read_expected(TEP_EVENT_ITEM, "fmt") < 0) return -1; if (read_expected(TEP_EVENT_OP, ":") < 0) return -1; if (read_expect_type(TEP_EVENT_DQUOTE, &token) < 0) goto fail; concat: event->print_fmt.format = token; event->print_fmt.args = NULL; /* ok to have no arg */ type = read_token_item(&token); if (type == TEP_EVENT_NONE) return 0; /* Handle concatenation of print lines */ if (type == TEP_EVENT_DQUOTE) { char *cat; if (asprintf(&cat, "%s%s", event->print_fmt.format, token) < 0) goto fail; free_token(token); free_token(event->print_fmt.format); event->print_fmt.format = NULL; token = cat; goto concat; } if (test_type_token(type, token, TEP_EVENT_DELIM, ",")) goto fail; free_token(token); ret = event_read_print_args(event, &event->print_fmt.args); if (ret < 0) return -1; return ret; fail: free_token(token); return -1; } /** * tep_find_common_field - return a common field by event * @event: handle for the event * @name: the name of the common field to return * * Returns a common field from the event by the given @name. * This only searches the common fields and not all field. */ struct tep_format_field * tep_find_common_field(struct tep_event *event, const char *name) { struct tep_format_field *format; for (format = event->format.common_fields; format; format = format->next) { if (strcmp(format->name, name) == 0) break; } return format; } /** * tep_find_field - find a non-common field * @event: handle for the event * @name: the name of the non-common field * * Returns a non-common field by the given @name. * This does not search common fields. */ struct tep_format_field * tep_find_field(struct tep_event *event, const char *name) { struct tep_format_field *format; for (format = event->format.fields; format; format = format->next) { if (strcmp(format->name, name) == 0) break; } return format; } /** * tep_find_any_field - find any field by name * @event: handle for the event * @name: the name of the field * * Returns a field by the given @name. * This searches the common field names first, then * the non-common ones if a common one was not found. */ struct tep_format_field * tep_find_any_field(struct tep_event *event, const char *name) { struct tep_format_field *format; format = tep_find_common_field(event, name); if (format) return format; return tep_find_field(event, name); } /** * tep_read_number - read a number from data * @tep: a handle to the trace event parser context * @ptr: the raw data * @size: the size of the data that holds the number * * Returns the number (converted to host) from the * raw data. */ unsigned long long tep_read_number(struct tep_handle *tep, const void *ptr, int size) { unsigned long long val; switch (size) { case 1: return *(unsigned char *)ptr; case 2: return data2host2(tep, *(unsigned short *)ptr); case 4: return data2host4(tep, *(unsigned int *)ptr); case 8: memcpy(&val, (ptr), sizeof(unsigned long long)); return data2host8(tep, val); default: /* BUG! */ return 0; } } /** * tep_read_number_field - read a number from data * @field: a handle to the field * @data: the raw data to read * @value: the value to place the number in * * Reads raw data according to a field offset and size, * and translates it into @value. * * Returns 0 on success, -1 otherwise. */ int tep_read_number_field(struct tep_format_field *field, const void *data, unsigned long long *value) { if (!field) return -1; switch (field->size) { case 1: case 2: case 4: case 8: *value = tep_read_number(field->event->tep, data + field->offset, field->size); return 0; default: return -1; } } static int get_common_info(struct tep_handle *tep, const char *type, int *offset, int *size) { struct tep_event *event; struct tep_format_field *field; /* * All events should have the same common elements. * Pick any event to find where the type is; */ if (!tep->events) { do_warning("no event_list!"); return -1; } event = tep->events[0]; field = tep_find_common_field(event, type); if (!field) return -1; *offset = field->offset; *size = field->size; return 0; } static int __parse_common(struct tep_handle *tep, void *data, int *size, int *offset, const char *name) { int ret; if (!*size) { ret = get_common_info(tep, name, offset, size); if (ret < 0) return ret; } return tep_read_number(tep, data + *offset, *size); } static int trace_parse_common_type(struct tep_handle *tep, void *data) { return __parse_common(tep, data, &tep->type_size, &tep->type_offset, "common_type"); } static int parse_common_pid(struct tep_handle *tep, void *data) { return __parse_common(tep, data, &tep->pid_size, &tep->pid_offset, "common_pid"); } static int parse_common_pc(struct tep_handle *tep, void *data) { return __parse_common(tep, data, &tep->pc_size, &tep->pc_offset, "common_preempt_count"); } static int parse_common_flags(struct tep_handle *tep, void *data) { return __parse_common(tep, data, &tep->flags_size, &tep->flags_offset, "common_flags"); } static int parse_common_lock_depth(struct tep_handle *tep, void *data) { return __parse_common(tep, data, &tep->ld_size, &tep->ld_offset, "common_lock_depth"); } static int parse_common_migrate_disable(struct tep_handle *tep, void *data) { return __parse_common(tep, data, &tep->ld_size, &tep->ld_offset, "common_migrate_disable"); } static int events_id_cmp(const void *a, const void *b); /** * tep_find_event - find an event by given id * @tep: a handle to the trace event parser context * @id: the id of the event * * Returns an event that has a given @id. */ struct tep_event *tep_find_event(struct tep_handle *tep, int id) { struct tep_event **eventptr; struct tep_event key; struct tep_event *pkey = &key; /* Check cache first */ if (tep->last_event && tep->last_event->id == id) return tep->last_event; key.id = id; eventptr = bsearch(&pkey, tep->events, tep->nr_events, sizeof(*tep->events), events_id_cmp); if (eventptr) { tep->last_event = *eventptr; return *eventptr; } return NULL; } /** * tep_find_event_by_name - find an event by given name * @tep: a handle to the trace event parser context * @sys: the system name to search for * @name: the name of the event to search for * * This returns an event with a given @name and under the system * @sys. If @sys is NULL the first event with @name is returned. */ struct tep_event * tep_find_event_by_name(struct tep_handle *tep, const char *sys, const char *name) { struct tep_event *event = NULL; int i; if (tep->last_event && strcmp(tep->last_event->name, name) == 0 && (!sys || strcmp(tep->last_event->system, sys) == 0)) return tep->last_event; for (i = 0; i < tep->nr_events; i++) { event = tep->events[i]; if (strcmp(event->name, name) == 0) { if (!sys) break; if (strcmp(event->system, sys) == 0) break; } } if (i == tep->nr_events) event = NULL; tep->last_event = event; return event; } static unsigned long long test_for_symbol(struct tep_handle *tep, struct tep_print_arg *arg) { unsigned long long val = 0; struct func_list *item = tep->funclist; char *func; int i; if (isdigit(arg->atom.atom[0])) return 0; /* Linear search but only happens once (see after the loop) */ for (i = 0; i < (int)tep->func_count; i++) { unsigned long long addr; const char *name; if (tep->func_map) { addr = tep->func_map[i].addr; name = tep->func_map[i].func; } else if (item) { addr = item->addr; name = item->func; item = item->next; } else break; if (strcmp(arg->atom.atom, name) == 0) { val = addr; break; } } /* * This modifies the arg to hardcode the value * and will not loop again. */ func = realloc(arg->atom.atom, 32); if (func) { snprintf(func, 32, "%lld", val); arg->atom.atom = func; } return val; } static unsigned long long eval_num_arg(void *data, int size, struct tep_event *event, struct tep_print_arg *arg) { struct tep_handle *tep = event->tep; unsigned long long val = 0; unsigned long long left, right; struct tep_print_arg *typearg = NULL; struct tep_print_arg *larg; unsigned long offset; unsigned int field_size; switch (arg->type) { case TEP_PRINT_NULL: /* ?? */ return 0; case TEP_PRINT_ATOM: val = strtoull(arg->atom.atom, NULL, 0); if (!val) val = test_for_symbol(tep, arg); return val; case TEP_PRINT_FIELD: if (!arg->field.field) { arg->field.field = tep_find_any_field(event, arg->field.name); if (!arg->field.field) goto out_warning_field; } /* must be a number */ val = tep_read_number(tep, data + arg->field.field->offset, arg->field.field->size); break; case TEP_PRINT_FLAGS: case TEP_PRINT_SYMBOL: case TEP_PRINT_INT_ARRAY: case TEP_PRINT_HEX: case TEP_PRINT_HEX_STR: break; case TEP_PRINT_TYPE: val = eval_num_arg(data, size, event, arg->typecast.item); return eval_type(val, arg, 0); case TEP_PRINT_STRING: case TEP_PRINT_BSTRING: case TEP_PRINT_BITMASK: return 0; case TEP_PRINT_FUNC: { struct trace_seq s; trace_seq_init(&s); val = process_defined_func(&s, data, size, event, arg); trace_seq_destroy(&s); return val; } case TEP_PRINT_OP: if (strcmp(arg->op.op, "[") == 0) { /* * Arrays are special, since we don't want * to read the arg as is. */ right = eval_num_arg(data, size, event, arg->op.right); /* handle typecasts */ larg = arg->op.left; while (larg->type == TEP_PRINT_TYPE) { if (!typearg) typearg = larg; larg = larg->typecast.item; } /* Default to long size */ field_size = tep->long_size; switch (larg->type) { case TEP_PRINT_DYNAMIC_ARRAY: offset = tep_read_number(tep, data + larg->dynarray.field->offset, larg->dynarray.field->size); if (larg->dynarray.field->elementsize) field_size = larg->dynarray.field->elementsize; /* * The actual length of the dynamic array is stored * in the top half of the field, and the offset * is in the bottom half of the 32 bit field. */ offset &= 0xffff; offset += right; break; case TEP_PRINT_FIELD: if (!larg->field.field) { larg->field.field = tep_find_any_field(event, larg->field.name); if (!larg->field.field) { arg = larg; goto out_warning_field; } } field_size = larg->field.field->elementsize; offset = larg->field.field->offset + right * larg->field.field->elementsize; break; default: goto default_op; /* oops, all bets off */ } val = tep_read_number(tep, data + offset, field_size); if (typearg) val = eval_type(val, typearg, 1); break; } else if (strcmp(arg->op.op, "?") == 0) { left = eval_num_arg(data, size, event, arg->op.left); arg = arg->op.right; if (left) val = eval_num_arg(data, size, event, arg->op.left); else val = eval_num_arg(data, size, event, arg->op.right); break; } default_op: left = eval_num_arg(data, size, event, arg->op.left); right = eval_num_arg(data, size, event, arg->op.right); switch (arg->op.op[0]) { case '!': switch (arg->op.op[1]) { case 0: val = !right; break; case '=': val = left != right; break; default: goto out_warning_op; } break; case '~': val = ~right; break; case '|': if (arg->op.op[1]) val = left || right; else val = left | right; break; case '&': if (arg->op.op[1]) val = left && right; else val = left & right; break; case '<': switch (arg->op.op[1]) { case 0: val = left < right; break; case '<': val = left << right; break; case '=': val = left <= right; break; default: goto out_warning_op; } break; case '>': switch (arg->op.op[1]) { case 0: val = left > right; break; case '>': val = left >> right; break; case '=': val = left >= right; break; default: goto out_warning_op; } break; case '=': if (arg->op.op[1] != '=') goto out_warning_op; val = left == right; break; case '-': val = left - right; break; case '+': val = left + right; break; case '/': val = left / right; break; case '%': val = left % right; break; case '*': val = left * right; break; default: goto out_warning_op; } break; case TEP_PRINT_DYNAMIC_ARRAY_LEN: offset = tep_read_number(tep, data + arg->dynarray.field->offset, arg->dynarray.field->size); /* * The total allocated length of the dynamic array is * stored in the top half of the field, and the offset * is in the bottom half of the 32 bit field. */ val = (unsigned long long)(offset >> 16); break; case TEP_PRINT_DYNAMIC_ARRAY: /* Without [], we pass the address to the dynamic data */ offset = tep_read_number(tep, data + arg->dynarray.field->offset, arg->dynarray.field->size); /* * The total allocated length of the dynamic array is * stored in the top half of the field, and the offset * is in the bottom half of the 32 bit field. */ offset &= 0xffff; val = (unsigned long long)((unsigned long)data + offset); break; default: /* not sure what to do there */ return 0; } return val; out_warning_op: do_warning_event(event, "%s: unknown op '%s'", __func__, arg->op.op); return 0; out_warning_field: do_warning_event(event, "%s: field %s not found", __func__, arg->field.name); return 0; } struct flag { const char *name; unsigned long long value; }; static const struct flag flags[] = { { "HI_SOFTIRQ", 0 }, { "TIMER_SOFTIRQ", 1 }, { "NET_TX_SOFTIRQ", 2 }, { "NET_RX_SOFTIRQ", 3 }, { "BLOCK_SOFTIRQ", 4 }, { "IRQ_POLL_SOFTIRQ", 5 }, { "TASKLET_SOFTIRQ", 6 }, { "SCHED_SOFTIRQ", 7 }, { "HRTIMER_SOFTIRQ", 8 }, { "RCU_SOFTIRQ", 9 }, { "HRTIMER_NORESTART", 0 }, { "HRTIMER_RESTART", 1 }, }; static long long eval_flag(const char *flag) { int i; /* * Some flags in the format files do not get converted. * If the flag is not numeric, see if it is something that * we already know about. */ if (isdigit(flag[0])) return strtoull(flag, NULL, 0); for (i = 0; i < (int)(sizeof(flags)/sizeof(flags[0])); i++) if (strcmp(flags[i].name, flag) == 0) return flags[i].value; return -1LL; } static void print_str_to_seq(struct trace_seq *s, const char *format, int len_arg, const char *str) { if (len_arg >= 0) trace_seq_printf(s, format, len_arg, str); else trace_seq_printf(s, format, str); } static void print_bitmask_to_seq(struct tep_handle *tep, struct trace_seq *s, const char *format, int len_arg, const void *data, int size) { int nr_bits = size * 8; int str_size = (nr_bits + 3) / 4; int len = 0; char buf[3]; char *str; int index; int i; /* * The kernel likes to put in commas every 32 bits, we * can do the same. */ str_size += (nr_bits - 1) / 32; str = malloc(str_size + 1); if (!str) { do_warning("%s: not enough memory!", __func__); return; } str[str_size] = 0; /* Start out with -2 for the two chars per byte */ for (i = str_size - 2; i >= 0; i -= 2) { /* * data points to a bit mask of size bytes. * In the kernel, this is an array of long words, thus * endianness is very important. */ if (tep->file_bigendian) index = size - (len + 1); else index = len; snprintf(buf, 3, "%02x", *((unsigned char *)data + index)); memcpy(str + i, buf, 2); len++; if (!(len & 3) && i > 0) { i--; str[i] = ','; } } if (len_arg >= 0) trace_seq_printf(s, format, len_arg, str); else trace_seq_printf(s, format, str); free(str); } static void print_str_arg(struct trace_seq *s, void *data, int size, struct tep_event *event, const char *format, int len_arg, struct tep_print_arg *arg) { struct tep_handle *tep = event->tep; struct tep_print_flag_sym *flag; struct tep_format_field *field; struct printk_map *printk; long long val, fval; unsigned long long addr; char *str; unsigned char *hex; int print; int i, len; switch (arg->type) { case TEP_PRINT_NULL: /* ?? */ return; case TEP_PRINT_ATOM: print_str_to_seq(s, format, len_arg, arg->atom.atom); return; case TEP_PRINT_FIELD: field = arg->field.field; if (!field) { field = tep_find_any_field(event, arg->field.name); if (!field) { str = arg->field.name; goto out_warning_field; } arg->field.field = field; } /* Zero sized fields, mean the rest of the data */ len = field->size ? : size - field->offset; /* * Some events pass in pointers. If this is not an array * and the size is the same as long_size, assume that it * is a pointer. */ if (!(field->flags & TEP_FIELD_IS_ARRAY) && field->size == tep->long_size) { /* Handle heterogeneous recording and processing * architectures * * CASE I: * Traces recorded on 32-bit devices (32-bit * addressing) and processed on 64-bit devices: * In this case, only 32 bits should be read. * * CASE II: * Traces recorded on 64 bit devices and processed * on 32-bit devices: * In this case, 64 bits must be read. */ addr = (tep->long_size == 8) ? *(unsigned long long *)(data + field->offset) : (unsigned long long)*(unsigned int *)(data + field->offset); /* Check if it matches a print format */ printk = find_printk(tep, addr); if (printk) trace_seq_puts(s, printk->printk); else trace_seq_printf(s, "%llx", addr); break; } str = malloc(len + 1); if (!str) { do_warning_event(event, "%s: not enough memory!", __func__); return; } memcpy(str, data + field->offset, len); str[len] = 0; print_str_to_seq(s, format, len_arg, str); free(str); break; case TEP_PRINT_FLAGS: val = eval_num_arg(data, size, event, arg->flags.field); print = 0; for (flag = arg->flags.flags; flag; flag = flag->next) { fval = eval_flag(flag->value); if (!val && fval < 0) { print_str_to_seq(s, format, len_arg, flag->str); break; } if (fval > 0 && (val & fval) == fval) { if (print && arg->flags.delim) trace_seq_puts(s, arg->flags.delim); print_str_to_seq(s, format, len_arg, flag->str); print = 1; val &= ~fval; } } if (val) { if (print && arg->flags.delim) trace_seq_puts(s, arg->flags.delim); trace_seq_printf(s, "0x%llx", val); } break; case TEP_PRINT_SYMBOL: val = eval_num_arg(data, size, event, arg->symbol.field); for (flag = arg->symbol.symbols; flag; flag = flag->next) { fval = eval_flag(flag->value); if (val == fval) { print_str_to_seq(s, format, len_arg, flag->str); break; } } if (!flag) trace_seq_printf(s, "0x%llx", val); break; case TEP_PRINT_HEX: case TEP_PRINT_HEX_STR: if (arg->hex.field->type == TEP_PRINT_DYNAMIC_ARRAY) { unsigned long offset; offset = tep_read_number(tep, data + arg->hex.field->dynarray.field->offset, arg->hex.field->dynarray.field->size); hex = data + (offset & 0xffff); } else { field = arg->hex.field->field.field; if (!field) { str = arg->hex.field->field.name; field = tep_find_any_field(event, str); if (!field) goto out_warning_field; arg->hex.field->field.field = field; } hex = data + field->offset; } len = eval_num_arg(data, size, event, arg->hex.size); for (i = 0; i < len; i++) { if (i && arg->type == TEP_PRINT_HEX) trace_seq_putc(s, ' '); trace_seq_printf(s, "%02x", hex[i]); } break; case TEP_PRINT_INT_ARRAY: { void *num; int el_size; if (arg->int_array.field->type == TEP_PRINT_DYNAMIC_ARRAY) { unsigned long offset; struct tep_format_field *field = arg->int_array.field->dynarray.field; offset = tep_read_number(tep, data + field->offset, field->size); num = data + (offset & 0xffff); } else { field = arg->int_array.field->field.field; if (!field) { str = arg->int_array.field->field.name; field = tep_find_any_field(event, str); if (!field) goto out_warning_field; arg->int_array.field->field.field = field; } num = data + field->offset; } len = eval_num_arg(data, size, event, arg->int_array.count); el_size = eval_num_arg(data, size, event, arg->int_array.el_size); for (i = 0; i < len; i++) { if (i) trace_seq_putc(s, ' '); if (el_size == 1) { trace_seq_printf(s, "%u", *(uint8_t *)num); } else if (el_size == 2) { trace_seq_printf(s, "%u", *(uint16_t *)num); } else if (el_size == 4) { trace_seq_printf(s, "%u", *(uint32_t *)num); } else if (el_size == 8) { trace_seq_printf(s, "%"PRIu64, *(uint64_t *)num); } else { trace_seq_printf(s, "BAD SIZE:%d 0x%x", el_size, *(uint8_t *)num); el_size = 1; } num += el_size; } break; } case TEP_PRINT_TYPE: break; case TEP_PRINT_STRING: { int str_offset; if (arg->string.offset == -1) { struct tep_format_field *f; f = tep_find_any_field(event, arg->string.string); arg->string.offset = f->offset; } str_offset = data2host4(tep, *(unsigned int *)(data + arg->string.offset)); str_offset &= 0xffff; print_str_to_seq(s, format, len_arg, ((char *)data) + str_offset); break; } case TEP_PRINT_BSTRING: print_str_to_seq(s, format, len_arg, arg->string.string); break; case TEP_PRINT_BITMASK: { int bitmask_offset; int bitmask_size; if (arg->bitmask.offset == -1) { struct tep_format_field *f; f = tep_find_any_field(event, arg->bitmask.bitmask); arg->bitmask.offset = f->offset; } bitmask_offset = data2host4(tep, *(unsigned int *)(data + arg->bitmask.offset)); bitmask_size = bitmask_offset >> 16; bitmask_offset &= 0xffff; print_bitmask_to_seq(tep, s, format, len_arg, data + bitmask_offset, bitmask_size); break; } case TEP_PRINT_OP: /* * The only op for string should be ? : */ if (arg->op.op[0] != '?') return; val = eval_num_arg(data, size, event, arg->op.left); if (val) print_str_arg(s, data, size, event, format, len_arg, arg->op.right->op.left); else print_str_arg(s, data, size, event, format, len_arg, arg->op.right->op.right); break; case TEP_PRINT_FUNC: process_defined_func(s, data, size, event, arg); break; default: /* well... */ break; } return; out_warning_field: do_warning_event(event, "%s: field %s not found", __func__, arg->field.name); } static unsigned long long process_defined_func(struct trace_seq *s, void *data, int size, struct tep_event *event, struct tep_print_arg *arg) { struct tep_function_handler *func_handle = arg->func.func; struct func_params *param; unsigned long long *args; unsigned long long ret; struct tep_print_arg *farg; struct trace_seq str; struct save_str { struct save_str *next; char *str; } *strings = NULL, *string; int i; if (!func_handle->nr_args) { ret = (*func_handle->func)(s, NULL); goto out; } farg = arg->func.args; param = func_handle->params; ret = ULLONG_MAX; args = malloc(sizeof(*args) * func_handle->nr_args); if (!args) goto out; for (i = 0; i < func_handle->nr_args; i++) { switch (param->type) { case TEP_FUNC_ARG_INT: case TEP_FUNC_ARG_LONG: case TEP_FUNC_ARG_PTR: args[i] = eval_num_arg(data, size, event, farg); break; case TEP_FUNC_ARG_STRING: trace_seq_init(&str); print_str_arg(&str, data, size, event, "%s", -1, farg); trace_seq_terminate(&str); string = malloc(sizeof(*string)); if (!string) { do_warning_event(event, "%s(%d): malloc str", __func__, __LINE__); goto out_free; } string->next = strings; string->str = strdup(str.buffer); if (!string->str) { free(string); do_warning_event(event, "%s(%d): malloc str", __func__, __LINE__); goto out_free; } args[i] = (uintptr_t)string->str; strings = string; trace_seq_destroy(&str); break; default: /* * Something went totally wrong, this is not * an input error, something in this code broke. */ do_warning_event(event, "Unexpected end of arguments\n"); goto out_free; } farg = farg->next; param = param->next; } ret = (*func_handle->func)(s, args); out_free: free(args); while (strings) { string = strings; strings = string->next; free(string->str); free(string); } out: /* TBD : handle return type here */ return ret; } static void free_args(struct tep_print_arg *args) { struct tep_print_arg *next; while (args) { next = args->next; free_arg(args); args = next; } } static struct tep_print_arg *make_bprint_args(char *fmt, void *data, int size, struct tep_event *event) { struct tep_handle *tep = event->tep; struct tep_format_field *field, *ip_field; struct tep_print_arg *args, *arg, **next; unsigned long long ip, val; char *ptr; void *bptr; int vsize = 0; field = tep->bprint_buf_field; ip_field = tep->bprint_ip_field; if (!field) { field = tep_find_field(event, "buf"); if (!field) { do_warning_event(event, "can't find buffer field for binary printk"); return NULL; } ip_field = tep_find_field(event, "ip"); if (!ip_field) { do_warning_event(event, "can't find ip field for binary printk"); return NULL; } tep->bprint_buf_field = field; tep->bprint_ip_field = ip_field; } ip = tep_read_number(tep, data + ip_field->offset, ip_field->size); /* * The first arg is the IP pointer. */ args = alloc_arg(); if (!args) { do_warning_event(event, "%s(%d): not enough memory!", __func__, __LINE__); return NULL; } arg = args; arg->next = NULL; next = &arg->next; arg->type = TEP_PRINT_ATOM; if (asprintf(&arg->atom.atom, "%lld", ip) < 0) goto out_free; /* skip the first "%ps: " */ for (ptr = fmt + 5, bptr = data + field->offset; bptr < data + size && *ptr; ptr++) { int ls = 0; if (*ptr == '%') { process_again: ptr++; switch (*ptr) { case '%': break; case 'l': ls++; goto process_again; case 'L': ls = 2; goto process_again; case '0' ... '9': goto process_again; case '.': goto process_again; case '#': goto process_again; case 'z': case 'Z': ls = 1; goto process_again; case 'p': ls = 1; if (isalnum(ptr[1])) { ptr++; /* Check for special pointers */ switch (*ptr) { case 's': case 'S': case 'x': break; case 'f': case 'F': /* * Pre-5.5 kernels use %pf and * %pF for printing symbols * while kernels since 5.5 use * %pfw for fwnodes. So check * %p[fF] isn't followed by 'w'. */ if (ptr[1] != 'w') break; /* fall through */ default: /* * Older kernels do not process * dereferenced pointers. * Only process if the pointer * value is a printable. */ if (isprint(*(char *)bptr)) goto process_string; } } /* fall through */ case 'd': case 'u': case 'i': case 'x': case 'X': case 'o': switch (ls) { case 0: vsize = 4; break; case 1: vsize = tep->long_size; break; case 2: vsize = 8; break; default: vsize = ls; /* ? */ break; } /* fall through */ case '*': if (*ptr == '*') vsize = 4; /* the pointers are always 4 bytes aligned */ bptr = (void *)(((unsigned long)bptr + 3) & ~3); val = tep_read_number(tep, bptr, vsize); bptr += vsize; arg = alloc_arg(); if (!arg) { do_warning_event(event, "%s(%d): not enough memory!", __func__, __LINE__); goto out_free; } arg->next = NULL; arg->type = TEP_PRINT_ATOM; if (asprintf(&arg->atom.atom, "%lld", val) < 0) { free(arg); goto out_free; } *next = arg; next = &arg->next; /* * The '*' case means that an arg is used as the length. * We need to continue to figure out for what. */ if (*ptr == '*') goto process_again; break; case 's': process_string: arg = alloc_arg(); if (!arg) { do_warning_event(event, "%s(%d): not enough memory!", __func__, __LINE__); goto out_free; } arg->next = NULL; arg->type = TEP_PRINT_BSTRING; arg->string.string = strdup(bptr); if (!arg->string.string) goto out_free; bptr += strlen(bptr) + 1; *next = arg; next = &arg->next; default: break; } } } return args; out_free: free_args(args); return NULL; } static char * get_bprint_format(void *data, int size __maybe_unused, struct tep_event *event) { struct tep_handle *tep = event->tep; unsigned long long addr; struct tep_format_field *field; struct printk_map *printk; char *format; field = tep->bprint_fmt_field; if (!field) { field = tep_find_field(event, "fmt"); if (!field) { do_warning_event(event, "can't find format field for binary printk"); return NULL; } tep->bprint_fmt_field = field; } addr = tep_read_number(tep, data + field->offset, field->size); printk = find_printk(tep, addr); if (!printk) { if (asprintf(&format, "%%ps: (NO FORMAT FOUND at %llx)\n", addr) < 0) return NULL; return format; } if (asprintf(&format, "%s: %s", "%ps", printk->printk) < 0) return NULL; return format; } static int print_mac_arg(struct trace_seq *s, const char *format, void *data, int size, struct tep_event *event, struct tep_print_arg *arg) { const char *fmt = "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x"; bool reverse = false; unsigned char *buf; int ret = 0; if (arg->type == TEP_PRINT_FUNC) { process_defined_func(s, data, size, event, arg); return 0; } if (arg->type != TEP_PRINT_FIELD) { trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type); return 0; } if (format[0] == 'm') { fmt = "%.2x%.2x%.2x%.2x%.2x%.2x"; } else if (format[0] == 'M' && format[1] == 'F') { fmt = "%.2x-%.2x-%.2x-%.2x-%.2x-%.2x"; ret++; } if (format[1] == 'R') { reverse = true; ret++; } if (!arg->field.field) { arg->field.field = tep_find_any_field(event, arg->field.name); if (!arg->field.field) { do_warning_event(event, "%s: field %s not found", __func__, arg->field.name); return ret; } } if (arg->field.field->size != 6) { trace_seq_printf(s, "INVALIDMAC"); return ret; } buf = data + arg->field.field->offset; if (reverse) trace_seq_printf(s, fmt, buf[5], buf[4], buf[3], buf[2], buf[1], buf[0]); else trace_seq_printf(s, fmt, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]); return ret; } static int parse_ip4_print_args(struct tep_handle *tep, const char *ptr, bool *reverse) { int ret = 0; *reverse = false; /* hnbl */ switch (*ptr) { case 'h': if (tep->file_bigendian) *reverse = false; else *reverse = true; ret++; break; case 'l': *reverse = true; ret++; break; case 'n': case 'b': ret++; /* fall through */ default: *reverse = false; break; } return ret; } static void print_ip4_addr(struct trace_seq *s, char i, bool reverse, unsigned char *buf) { const char *fmt; if (i == 'i') fmt = "%03d.%03d.%03d.%03d"; else fmt = "%d.%d.%d.%d"; if (reverse) trace_seq_printf(s, fmt, buf[3], buf[2], buf[1], buf[0]); else trace_seq_printf(s, fmt, buf[0], buf[1], buf[2], buf[3]); } static inline bool ipv6_addr_v4mapped(const struct in6_addr *a) { return ((unsigned long)(a->s6_addr32[0] | a->s6_addr32[1]) | (unsigned long)(a->s6_addr32[2] ^ htonl(0x0000ffff))) == 0UL; } static inline bool ipv6_addr_is_isatap(const struct in6_addr *addr) { return (addr->s6_addr32[2] | htonl(0x02000000)) == htonl(0x02005EFE); } static void print_ip6c_addr(struct trace_seq *s, unsigned char *addr) { int i, j, range; unsigned char zerolength[8]; int longest = 1; int colonpos = -1; uint16_t word; uint8_t hi, lo; bool needcolon = false; bool useIPv4; struct in6_addr in6; memcpy(&in6, addr, sizeof(struct in6_addr)); useIPv4 = ipv6_addr_v4mapped(&in6) || ipv6_addr_is_isatap(&in6); memset(zerolength, 0, sizeof(zerolength)); if (useIPv4) range = 6; else range = 8; /* find position of longest 0 run */ for (i = 0; i < range; i++) { for (j = i; j < range; j++) { if (in6.s6_addr16[j] != 0) break; zerolength[i]++; } } for (i = 0; i < range; i++) { if (zerolength[i] > longest) { longest = zerolength[i]; colonpos = i; } } if (longest == 1) /* don't compress a single 0 */ colonpos = -1; /* emit address */ for (i = 0; i < range; i++) { if (i == colonpos) { if (needcolon || i == 0) trace_seq_printf(s, ":"); trace_seq_printf(s, ":"); needcolon = false; i += longest - 1; continue; } if (needcolon) { trace_seq_printf(s, ":"); needcolon = false; } /* hex u16 without leading 0s */ word = ntohs(in6.s6_addr16[i]); hi = word >> 8; lo = word & 0xff; if (hi) trace_seq_printf(s, "%x%02x", hi, lo); else trace_seq_printf(s, "%x", lo); needcolon = true; } if (useIPv4) { if (needcolon) trace_seq_printf(s, ":"); print_ip4_addr(s, 'I', false, &in6.s6_addr[12]); } return; } static void print_ip6_addr(struct trace_seq *s, char i, unsigned char *buf) { int j; for (j = 0; j < 16; j += 2) { trace_seq_printf(s, "%02x%02x", buf[j], buf[j+1]); if (i == 'I' && j < 14) trace_seq_printf(s, ":"); } } /* * %pi4 print an IPv4 address with leading zeros * %pI4 print an IPv4 address without leading zeros * %pi6 print an IPv6 address without colons * %pI6 print an IPv6 address with colons * %pI6c print an IPv6 address in compressed form with colons * %pISpc print an IP address based on sockaddr; p adds port. */ static int print_ipv4_arg(struct trace_seq *s, const char *ptr, char i, void *data, int size, struct tep_event *event, struct tep_print_arg *arg) { bool reverse = false; unsigned char *buf; int ret; ret = parse_ip4_print_args(event->tep, ptr, &reverse); if (arg->type == TEP_PRINT_FUNC) { process_defined_func(s, data, size, event, arg); return ret; } if (arg->type != TEP_PRINT_FIELD) { trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type); return ret; } if (!arg->field.field) { arg->field.field = tep_find_any_field(event, arg->field.name); if (!arg->field.field) { do_warning("%s: field %s not found", __func__, arg->field.name); return ret; } } buf = data + arg->field.field->offset; if (arg->field.field->size != 4) { trace_seq_printf(s, "INVALIDIPv4"); return ret; } print_ip4_addr(s, i, reverse, buf); return ret; } static int print_ipv6_arg(struct trace_seq *s, const char *ptr, char i, void *data, int size, struct tep_event *event, struct tep_print_arg *arg) { char have_c = 0; unsigned char *buf; int rc = 0; /* pI6c */ if (i == 'I' && *ptr == 'c') { have_c = 1; ptr++; rc++; } if (arg->type == TEP_PRINT_FUNC) { process_defined_func(s, data, size, event, arg); return rc; } if (arg->type != TEP_PRINT_FIELD) { trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type); return rc; } if (!arg->field.field) { arg->field.field = tep_find_any_field(event, arg->field.name); if (!arg->field.field) { do_warning("%s: field %s not found", __func__, arg->field.name); return rc; } } buf = data + arg->field.field->offset; if (arg->field.field->size != 16) { trace_seq_printf(s, "INVALIDIPv6"); return rc; } if (have_c) print_ip6c_addr(s, buf); else print_ip6_addr(s, i, buf); return rc; } static int print_ipsa_arg(struct trace_seq *s, const char *ptr, char i, void *data, int size, struct tep_event *event, struct tep_print_arg *arg) { char have_c = 0, have_p = 0; unsigned char *buf; struct sockaddr_storage *sa; bool reverse = false; int rc = 0; int ret; /* pISpc */ if (i == 'I') { if (*ptr == 'p') { have_p = 1; ptr++; rc++; } if (*ptr == 'c') { have_c = 1; ptr++; rc++; } } ret = parse_ip4_print_args(event->tep, ptr, &reverse); ptr += ret; rc += ret; if (arg->type == TEP_PRINT_FUNC) { process_defined_func(s, data, size, event, arg); return rc; } if (arg->type != TEP_PRINT_FIELD) { trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type); return rc; } if (!arg->field.field) { arg->field.field = tep_find_any_field(event, arg->field.name); if (!arg->field.field) { do_warning("%s: field %s not found", __func__, arg->field.name); return rc; } } sa = (struct sockaddr_storage *) (data + arg->field.field->offset); if (sa->ss_family == AF_INET) { struct sockaddr_in *sa4 = (struct sockaddr_in *) sa; if (arg->field.field->size < sizeof(struct sockaddr_in)) { trace_seq_printf(s, "INVALIDIPv4"); return rc; } print_ip4_addr(s, i, reverse, (unsigned char *) &sa4->sin_addr); if (have_p) trace_seq_printf(s, ":%d", ntohs(sa4->sin_port)); } else if (sa->ss_family == AF_INET6) { struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *) sa; if (arg->field.field->size < sizeof(struct sockaddr_in6)) { trace_seq_printf(s, "INVALIDIPv6"); return rc; } if (have_p) trace_seq_printf(s, "["); buf = (unsigned char *) &sa6->sin6_addr; if (have_c) print_ip6c_addr(s, buf); else print_ip6_addr(s, i, buf); if (have_p) trace_seq_printf(s, "]:%d", ntohs(sa6->sin6_port)); } return rc; } static int print_ip_arg(struct trace_seq *s, const char *ptr, void *data, int size, struct tep_event *event, struct tep_print_arg *arg) { char i = *ptr; /* 'i' or 'I' */ int rc = 1; /* IP version */ ptr++; switch (*ptr) { case '4': rc += print_ipv4_arg(s, ptr + 1, i, data, size, event, arg); break; case '6': rc += print_ipv6_arg(s, ptr + 1, i, data, size, event, arg); break; case 'S': rc += print_ipsa_arg(s, ptr + 1, i, data, size, event, arg); break; default: return 0; } return rc; } static const int guid_index[16] = {3, 2, 1, 0, 5, 4, 7, 6, 8, 9, 10, 11, 12, 13, 14, 15}; static const int uuid_index[16] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; static int print_uuid_arg(struct trace_seq *s, const char *ptr, void *data, int size, struct tep_event *event, struct tep_print_arg *arg) { const int *index = uuid_index; char *format = "%02x"; int ret = 0; char *buf; int i; switch (*(ptr + 1)) { case 'L': format = "%02X"; /* fall through */ case 'l': index = guid_index; ret++; break; case 'B': format = "%02X"; /* fall through */ case 'b': ret++; break; } if (arg->type == TEP_PRINT_FUNC) { process_defined_func(s, data, size, event, arg); return ret; } if (arg->type != TEP_PRINT_FIELD) { trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type); return ret; } if (!arg->field.field) { arg->field.field = tep_find_any_field(event, arg->field.name); if (!arg->field.field) { do_warning("%s: field %s not found", __func__, arg->field.name); return ret; } } if (arg->field.field->size != 16) { trace_seq_printf(s, "INVALIDUUID"); return ret; } buf = data + arg->field.field->offset; for (i = 0; i < 16; i++) { trace_seq_printf(s, format, buf[index[i]] & 0xff); switch (i) { case 3: case 5: case 7: case 9: trace_seq_printf(s, "-"); break; } } return ret; } static int print_raw_buff_arg(struct trace_seq *s, const char *ptr, void *data, int size, struct tep_event *event, struct tep_print_arg *arg, int print_len) { int plen = print_len; char *delim = " "; int ret = 0; char *buf; int i; unsigned long offset; int arr_len; switch (*(ptr + 1)) { case 'C': delim = ":"; ret++; break; case 'D': delim = "-"; ret++; break; case 'N': delim = ""; ret++; break; } if (arg->type == TEP_PRINT_FUNC) { process_defined_func(s, data, size, event, arg); return ret; } if (arg->type != TEP_PRINT_DYNAMIC_ARRAY) { trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type); return ret; } offset = tep_read_number(event->tep, data + arg->dynarray.field->offset, arg->dynarray.field->size); arr_len = (unsigned long long)(offset >> 16); buf = data + (offset & 0xffff); if (arr_len < plen) plen = arr_len; if (plen < 1) return ret; trace_seq_printf(s, "%02x", buf[0] & 0xff); for (i = 1; i < plen; i++) trace_seq_printf(s, "%s%02x", delim, buf[i] & 0xff); return ret; } static int is_printable_array(char *p, unsigned int len) { unsigned int i; for (i = 0; i < len && p[i]; i++) if (!isprint(p[i]) && !isspace(p[i])) return 0; return 1; } void tep_print_field(struct trace_seq *s, void *data, struct tep_format_field *field) { unsigned long long val; unsigned int offset, len, i; struct tep_handle *tep = field->event->tep; if (field->flags & TEP_FIELD_IS_ARRAY) { offset = field->offset; len = field->size; if (field->flags & TEP_FIELD_IS_DYNAMIC) { val = tep_read_number(tep, data + offset, len); offset = val; len = offset >> 16; offset &= 0xffff; } if (field->flags & TEP_FIELD_IS_STRING && is_printable_array(data + offset, len)) { trace_seq_printf(s, "%s", (char *)data + offset); } else { trace_seq_puts(s, "ARRAY["); for (i = 0; i < len; i++) { if (i) trace_seq_puts(s, ", "); trace_seq_printf(s, "%02x", *((unsigned char *)data + offset + i)); } trace_seq_putc(s, ']'); field->flags &= ~TEP_FIELD_IS_STRING; } } else { val = tep_read_number(tep, data + field->offset, field->size); if (field->flags & TEP_FIELD_IS_POINTER) { trace_seq_printf(s, "0x%llx", val); } else if (field->flags & TEP_FIELD_IS_SIGNED) { switch (field->size) { case 4: /* * If field is long then print it in hex. * A long usually stores pointers. */ if (field->flags & TEP_FIELD_IS_LONG) trace_seq_printf(s, "0x%x", (int)val); else trace_seq_printf(s, "%d", (int)val); break; case 2: trace_seq_printf(s, "%2d", (short)val); break; case 1: trace_seq_printf(s, "%1d", (char)val); break; default: trace_seq_printf(s, "%lld", val); } } else { if (field->flags & TEP_FIELD_IS_LONG) trace_seq_printf(s, "0x%llx", val); else trace_seq_printf(s, "%llu", val); } } } void tep_print_fields(struct trace_seq *s, void *data, int size __maybe_unused, struct tep_event *event) { struct tep_format_field *field; field = event->format.fields; while (field) { trace_seq_printf(s, " %s=", field->name); tep_print_field(s, data, field); field = field->next; } } static int print_function(struct trace_seq *s, const char *format, void *data, int size, struct tep_event *event, struct tep_print_arg *arg) { struct func_map *func; unsigned long long val; val = eval_num_arg(data, size, event, arg); func = find_func(event->tep, val); if (func) { trace_seq_puts(s, func->func); if (*format == 'F' || *format == 'S') trace_seq_printf(s, "+0x%llx", val - func->addr); } else { if (event->tep->long_size == 4) trace_seq_printf(s, "0x%lx", (long)val); else trace_seq_printf(s, "0x%llx", (long long)val); } return 0; } static int print_arg_pointer(struct trace_seq *s, const char *format, int plen, void *data, int size, struct tep_event *event, struct tep_print_arg *arg) { unsigned long long val; int ret = 1; if (arg->type == TEP_PRINT_BSTRING) { trace_seq_puts(s, arg->string.string); return 0; } while (*format) { if (*format == 'p') { format++; break; } format++; } switch (*format) { case 'F': case 'f': case 'S': case 's': ret += print_function(s, format, data, size, event, arg); break; case 'M': case 'm': ret += print_mac_arg(s, format, data, size, event, arg); break; case 'I': case 'i': ret += print_ip_arg(s, format, data, size, event, arg); break; case 'U': ret += print_uuid_arg(s, format, data, size, event, arg); break; case 'h': ret += print_raw_buff_arg(s, format, data, size, event, arg, plen); break; default: ret = 0; val = eval_num_arg(data, size, event, arg); trace_seq_printf(s, "%p", (void *)(intptr_t)val); break; } return ret; } static int print_arg_number(struct trace_seq *s, const char *format, int plen, void *data, int size, int ls, struct tep_event *event, struct tep_print_arg *arg) { unsigned long long val; val = eval_num_arg(data, size, event, arg); switch (ls) { case -2: if (plen >= 0) trace_seq_printf(s, format, plen, (char)val); else trace_seq_printf(s, format, (char)val); break; case -1: if (plen >= 0) trace_seq_printf(s, format, plen, (short)val); else trace_seq_printf(s, format, (short)val); break; case 0: if (plen >= 0) trace_seq_printf(s, format, plen, (int)val); else trace_seq_printf(s, format, (int)val); break; case 1: if (plen >= 0) trace_seq_printf(s, format, plen, (long)val); else trace_seq_printf(s, format, (long)val); break; case 2: if (plen >= 0) trace_seq_printf(s, format, plen, (long long)val); else trace_seq_printf(s, format, (long long)val); break; default: do_warning_event(event, "bad count (%d)", ls); event->flags |= TEP_EVENT_FL_FAILED; } return 0; } static void print_arg_string(struct trace_seq *s, const char *format, int plen, void *data, int size, struct tep_event *event, struct tep_print_arg *arg) { struct trace_seq p; /* Use helper trace_seq */ trace_seq_init(&p); print_str_arg(&p, data, size, event, format, plen, arg); trace_seq_terminate(&p); trace_seq_puts(s, p.buffer); trace_seq_destroy(&p); } static int parse_arg_format_pointer(const char *format) { int ret = 0; int index; int loop; switch (*format) { case 'F': case 'S': case 'f': case 's': ret++; break; case 'M': case 'm': /* [mM]R , [mM]F */ switch (format[1]) { case 'R': case 'F': ret++; break; } ret++; break; case 'I': case 'i': index = 2; loop = 1; switch (format[1]) { case 'S': /*[S][pfs]*/ while (loop) { switch (format[index]) { case 'p': case 'f': case 's': ret++; index++; break; default: loop = 0; break; } } /* fall through */ case '4': /* [4S][hnbl] */ switch (format[index]) { case 'h': case 'n': case 'l': case 'b': ret++; index++; break; } if (format[1] == '4') { ret++; break; } /* fall through */ case '6': /* [6S]c */ if (format[index] == 'c') ret++; ret++; break; } ret++; break; case 'U': switch (format[1]) { case 'L': case 'l': case 'B': case 'b': ret++; break; } ret++; break; case 'h': switch (format[1]) { case 'C': case 'D': case 'N': ret++; break; } ret++; break; default: break; } return ret; } static void free_parse_args(struct tep_print_parse *arg) { struct tep_print_parse *del; while (arg) { del = arg; arg = del->next; free(del->format); free(del); } } static int parse_arg_add(struct tep_print_parse **parse, char *format, enum tep_print_parse_type type, struct tep_print_arg *arg, struct tep_print_arg *len_as_arg, int ls) { struct tep_print_parse *parg = NULL; parg = calloc(1, sizeof(*parg)); if (!parg) goto error; parg->format = strdup(format); if (!parg->format) goto error; parg->type = type; parg->arg = arg; parg->len_as_arg = len_as_arg; parg->ls = ls; *parse = parg; return 0; error: if (parg) { free(parg->format); free(parg); } return -1; } static int parse_arg_format(struct tep_print_parse **parse, struct tep_event *event, const char *format, struct tep_print_arg **arg) { struct tep_print_arg *len_arg = NULL; char print_format[32]; const char *start = format; int ret = 0; int ls = 0; int res; int len; format++; ret++; for (; *format; format++) { switch (*format) { case '#': /* FIXME: need to handle properly */ break; case 'h': ls--; break; case 'l': ls++; break; case 'L': ls = 2; break; case '.': case 'z': case 'Z': case '0' ... '9': case '-': break; case '*': /* The argument is the length. */ if (!*arg) { do_warning_event(event, "no argument match"); event->flags |= TEP_EVENT_FL_FAILED; goto out_failed; } if (len_arg) { do_warning_event(event, "argument already matched"); event->flags |= TEP_EVENT_FL_FAILED; goto out_failed; } len_arg = *arg; *arg = (*arg)->next; break; case 'p': if (!*arg) { do_warning_event(event, "no argument match"); event->flags |= TEP_EVENT_FL_FAILED; goto out_failed; } res = parse_arg_format_pointer(format + 1); if (res > 0) { format += res; ret += res; } len = ((unsigned long)format + 1) - (unsigned long)start; /* should never happen */ if (len > 31) { do_warning_event(event, "bad format!"); event->flags |= TEP_EVENT_FL_FAILED; len = 31; } memcpy(print_format, start, len); print_format[len] = 0; parse_arg_add(parse, print_format, PRINT_FMT_ARG_POINTER, *arg, len_arg, ls); *arg = (*arg)->next; ret++; return ret; case 'd': case 'u': case 'i': case 'x': case 'X': case 'o': if (!*arg) { do_warning_event(event, "no argument match"); event->flags |= TEP_EVENT_FL_FAILED; goto out_failed; } len = ((unsigned long)format + 1) - (unsigned long)start; /* should never happen */ if (len > 30) { do_warning_event(event, "bad format!"); event->flags |= TEP_EVENT_FL_FAILED; len = 31; } memcpy(print_format, start, len); print_format[len] = 0; if (event->tep->long_size == 8 && ls == 1 && sizeof(long) != 8) { char *p; /* make %l into %ll */ if (ls == 1 && (p = strchr(print_format, 'l'))) memmove(p+1, p, strlen(p)+1); ls = 2; } if (ls < -2 || ls > 2) { do_warning_event(event, "bad count (%d)", ls); event->flags |= TEP_EVENT_FL_FAILED; } parse_arg_add(parse, print_format, PRINT_FMT_ARG_DIGIT, *arg, len_arg, ls); *arg = (*arg)->next; ret++; return ret; case 's': if (!*arg) { do_warning_event(event, "no matching argument"); event->flags |= TEP_EVENT_FL_FAILED; goto out_failed; } len = ((unsigned long)format + 1) - (unsigned long)start; /* should never happen */ if (len > 31) { do_warning_event(event, "bad format!"); event->flags |= TEP_EVENT_FL_FAILED; len = 31; } memcpy(print_format, start, len); print_format[len] = 0; parse_arg_add(parse, print_format, PRINT_FMT_ARG_STRING, *arg, len_arg, 0); *arg = (*arg)->next; ret++; return ret; default: snprintf(print_format, 32, ">%c<", *format); parse_arg_add(parse, print_format, PRINT_FMT_STRING, NULL, NULL, 0); ret++; return ret; } ret++; } out_failed: return ret; } static int parse_arg_string(struct tep_print_parse **parse, const char *format) { struct trace_seq s; int ret = 0; trace_seq_init(&s); for (; *format; format++) { if (*format == '\\') { format++; ret++; switch (*format) { case 'n': trace_seq_putc(&s, '\n'); break; case 't': trace_seq_putc(&s, '\t'); break; case 'r': trace_seq_putc(&s, '\r'); break; case '\\': trace_seq_putc(&s, '\\'); break; default: trace_seq_putc(&s, *format); break; } } else if (*format == '%') { if (*(format + 1) == '%') { trace_seq_putc(&s, '%'); format++; ret++; } else break; } else trace_seq_putc(&s, *format); ret++; } trace_seq_terminate(&s); parse_arg_add(parse, s.buffer, PRINT_FMT_STRING, NULL, NULL, 0); trace_seq_destroy(&s); return ret; } static struct tep_print_parse * parse_args(struct tep_event *event, const char *format, struct tep_print_arg *arg) { struct tep_print_parse *parse_ret = NULL; struct tep_print_parse **parse = NULL; int ret; int len; len = strlen(format); while (*format) { if (!parse_ret) parse = &parse_ret; if (*format == '%' && *(format + 1) != '%') ret = parse_arg_format(parse, event, format, &arg); else ret = parse_arg_string(parse, format); if (*parse) parse = &((*parse)->next); len -= ret; if (len > 0) format += ret; else break; } return parse_ret; } static void print_event_cache(struct tep_print_parse *parse, struct trace_seq *s, void *data, int size, struct tep_event *event) { int len_arg; while (parse) { if (parse->len_as_arg) len_arg = eval_num_arg(data, size, event, parse->len_as_arg); switch (parse->type) { case PRINT_FMT_ARG_DIGIT: print_arg_number(s, parse->format, parse->len_as_arg ? len_arg : -1, data, size, parse->ls, event, parse->arg); break; case PRINT_FMT_ARG_POINTER: print_arg_pointer(s, parse->format, parse->len_as_arg ? len_arg : 1, data, size, event, parse->arg); break; case PRINT_FMT_ARG_STRING: print_arg_string(s, parse->format, parse->len_as_arg ? len_arg : -1, data, size, event, parse->arg); break; case PRINT_FMT_STRING: default: trace_seq_printf(s, "%s", parse->format); break; } parse = parse->next; } } static void pretty_print(struct trace_seq *s, void *data, int size, struct tep_event *event) { struct tep_print_parse *parse = event->print_fmt.print_cache; struct tep_print_arg *args = NULL; char *bprint_fmt = NULL; if (event->flags & TEP_EVENT_FL_FAILED) { trace_seq_printf(s, "[FAILED TO PARSE]"); tep_print_fields(s, data, size, event); return; } if (event->flags & TEP_EVENT_FL_ISBPRINT) { bprint_fmt = get_bprint_format(data, size, event); args = make_bprint_args(bprint_fmt, data, size, event); parse = parse_args(event, bprint_fmt, args); } print_event_cache(parse, s, data, size, event); if (event->flags & TEP_EVENT_FL_ISBPRINT) { free_parse_args(parse); free_args(args); free(bprint_fmt); } } /* * This parses out the Latency format (interrupts disabled, * need rescheduling, in hard/soft interrupt, preempt count * and lock depth) and places it into the trace_seq. */ static void data_latency_format(struct tep_handle *tep, struct trace_seq *s, char *format, struct tep_record *record) { static int check_lock_depth = 1; static int check_migrate_disable = 1; static int lock_depth_exists; static int migrate_disable_exists; unsigned int lat_flags; struct trace_seq sq; unsigned int pc; int lock_depth = 0; int migrate_disable = 0; int hardirq; int softirq; void *data = record->data; trace_seq_init(&sq); lat_flags = parse_common_flags(tep, data); pc = parse_common_pc(tep, data); /* lock_depth may not always exist */ if (lock_depth_exists) lock_depth = parse_common_lock_depth(tep, data); else if (check_lock_depth) { lock_depth = parse_common_lock_depth(tep, data); if (lock_depth < 0) check_lock_depth = 0; else lock_depth_exists = 1; } /* migrate_disable may not always exist */ if (migrate_disable_exists) migrate_disable = parse_common_migrate_disable(tep, data); else if (check_migrate_disable) { migrate_disable = parse_common_migrate_disable(tep, data); if (migrate_disable < 0) check_migrate_disable = 0; else migrate_disable_exists = 1; } hardirq = lat_flags & TRACE_FLAG_HARDIRQ; softirq = lat_flags & TRACE_FLAG_SOFTIRQ; trace_seq_printf(&sq, "%c%c%c", (lat_flags & TRACE_FLAG_IRQS_OFF) ? 'd' : (lat_flags & TRACE_FLAG_IRQS_NOSUPPORT) ? 'X' : '.', (lat_flags & TRACE_FLAG_NEED_RESCHED) ? 'N' : '.', (hardirq && softirq) ? 'H' : hardirq ? 'h' : softirq ? 's' : '.'); if (pc) trace_seq_printf(&sq, "%x", pc); else trace_seq_printf(&sq, "."); if (migrate_disable_exists) { if (migrate_disable < 0) trace_seq_printf(&sq, "."); else trace_seq_printf(&sq, "%d", migrate_disable); } if (lock_depth_exists) { if (lock_depth < 0) trace_seq_printf(&sq, "."); else trace_seq_printf(&sq, "%d", lock_depth); } if (sq.state == TRACE_SEQ__MEM_ALLOC_FAILED) { s->state = TRACE_SEQ__MEM_ALLOC_FAILED; return; } trace_seq_terminate(&sq); trace_seq_puts(s, sq.buffer); trace_seq_destroy(&sq); trace_seq_terminate(s); } /** * tep_data_type - parse out the given event type * @tep: a handle to the trace event parser context * @rec: the record to read from * * This returns the event id from the @rec. */ int tep_data_type(struct tep_handle *tep, struct tep_record *rec) { return trace_parse_common_type(tep, rec->data); } /** * tep_data_pid - parse the PID from record * @tep: a handle to the trace event parser context * @rec: the record to parse * * This returns the PID from a record. */ int tep_data_pid(struct tep_handle *tep, struct tep_record *rec) { return parse_common_pid(tep, rec->data); } /** * tep_data_preempt_count - parse the preempt count from the record * @tep: a handle to the trace event parser context * @rec: the record to parse * * This returns the preempt count from a record. */ int tep_data_preempt_count(struct tep_handle *tep, struct tep_record *rec) { return parse_common_pc(tep, rec->data); } /** * tep_data_flags - parse the latency flags from the record * @tep: a handle to the trace event parser context * @rec: the record to parse * * This returns the latency flags from a record. * * Use trace_flag_type enum for the flags (see event-parse.h). */ int tep_data_flags(struct tep_handle *tep, struct tep_record *rec) { return parse_common_flags(tep, rec->data); } /** * tep_data_comm_from_pid - return the command line from PID * @tep: a handle to the trace event parser context * @pid: the PID of the task to search for * * This returns a pointer to the command line that has the given * @pid. */ const char *tep_data_comm_from_pid(struct tep_handle *tep, int pid) { const char *comm; comm = find_cmdline(tep, pid); return comm; } static struct tep_cmdline * pid_from_cmdlist(struct tep_handle *tep, const char *comm, struct tep_cmdline *next) { struct cmdline_list *cmdlist = (struct cmdline_list *)next; if (cmdlist) cmdlist = cmdlist->next; else cmdlist = tep->cmdlist; while (cmdlist && strcmp(cmdlist->comm, comm) != 0) cmdlist = cmdlist->next; return (struct tep_cmdline *)cmdlist; } /** * tep_data_pid_from_comm - return the pid from a given comm * @tep: a handle to the trace event parser context * @comm: the cmdline to find the pid from * @next: the cmdline structure to find the next comm * * This returns the cmdline structure that holds a pid for a given * comm, or NULL if none found. As there may be more than one pid for * a given comm, the result of this call can be passed back into * a recurring call in the @next parameter, and then it will find the * next pid. * Also, it does a linear search, so it may be slow. */ struct tep_cmdline *tep_data_pid_from_comm(struct tep_handle *tep, const char *comm, struct tep_cmdline *next) { struct tep_cmdline *cmdline; /* * If the cmdlines have not been converted yet, then use * the list. */ if (!tep->cmdlines) return pid_from_cmdlist(tep, comm, next); if (next) { /* * The next pointer could have been still from * a previous call before cmdlines were created */ if (next < tep->cmdlines || next >= tep->cmdlines + tep->cmdline_count) next = NULL; else cmdline = next++; } if (!next) cmdline = tep->cmdlines; while (cmdline < tep->cmdlines + tep->cmdline_count) { if (strcmp(cmdline->comm, comm) == 0) return cmdline; cmdline++; } return NULL; } /** * tep_cmdline_pid - return the pid associated to a given cmdline * @tep: a handle to the trace event parser context * @cmdline: The cmdline structure to get the pid from * * Returns the pid for a give cmdline. If @cmdline is NULL, then * -1 is returned. */ int tep_cmdline_pid(struct tep_handle *tep, struct tep_cmdline *cmdline) { struct cmdline_list *cmdlist = (struct cmdline_list *)cmdline; if (!cmdline) return -1; /* * If cmdlines have not been created yet, or cmdline is * not part of the array, then treat it as a cmdlist instead. */ if (!tep->cmdlines || cmdline < tep->cmdlines || cmdline >= tep->cmdlines + tep->cmdline_count) return cmdlist->pid; return cmdline->pid; } /* * This parses the raw @data using the given @event information and * writes the print format into the trace_seq. */ static void print_event_info(struct trace_seq *s, char *format, bool raw, struct tep_event *event, struct tep_record *record) { int print_pretty = 1; if (raw || (event->flags & TEP_EVENT_FL_PRINTRAW)) tep_print_fields(s, record->data, record->size, event); else { if (event->handler && !(event->flags & TEP_EVENT_FL_NOHANDLE)) print_pretty = event->handler(s, record, event, event->context); if (print_pretty) pretty_print(s, record->data, record->size, event); } trace_seq_terminate(s); } /** * tep_find_event_by_record - return the event from a given record * @tep: a handle to the trace event parser context * @record: The record to get the event from * * Returns the associated event for a given record, or NULL if non is * is found. */ struct tep_event * tep_find_event_by_record(struct tep_handle *tep, struct tep_record *record) { int type; if (record->size < 0) { do_warning("ug! negative record size %d", record->size); return NULL; } type = trace_parse_common_type(tep, record->data); return tep_find_event(tep, type); } /* * Writes the timestamp of the record into @s. Time divisor and precision can be * specified as part of printf @format string. Example: * "%3.1000d" - divide the time by 1000 and print the first 3 digits * before the dot. Thus, the timestamp "123456000" will be printed as * "123.456" */ static void print_event_time(struct tep_handle *tep, struct trace_seq *s, char *format, struct tep_event *event, struct tep_record *record) { unsigned long long time; char *divstr; int prec = 0, pr; int div = 0; int p10 = 1; if (isdigit(*(format + 1))) prec = atoi(format + 1); divstr = strchr(format, '.'); if (divstr && isdigit(*(divstr + 1))) div = atoi(divstr + 1); time = record->ts; if (div) { time += div / 2; time /= div; } pr = prec; while (pr--) p10 *= 10; if (p10 > 1 && p10 < time) trace_seq_printf(s, "%5llu.%0*llu", time / p10, prec, time % p10); else trace_seq_printf(s, "%12llu", time); } struct print_event_type { enum { EVENT_TYPE_INT = 1, EVENT_TYPE_STRING, EVENT_TYPE_UNKNOWN, } type; char format[32]; }; static void print_string(struct tep_handle *tep, struct trace_seq *s, struct tep_record *record, struct tep_event *event, const char *arg, struct print_event_type *type) { const char *comm; int pid; if (strncmp(arg, TEP_PRINT_LATENCY, strlen(TEP_PRINT_LATENCY)) == 0) { data_latency_format(tep, s, type->format, record); } else if (strncmp(arg, TEP_PRINT_COMM, strlen(TEP_PRINT_COMM)) == 0) { pid = parse_common_pid(tep, record->data); comm = find_cmdline(tep, pid); trace_seq_printf(s, type->format, comm); } else if (strncmp(arg, TEP_PRINT_INFO_RAW, strlen(TEP_PRINT_INFO_RAW)) == 0) { print_event_info(s, type->format, true, event, record); } else if (strncmp(arg, TEP_PRINT_INFO, strlen(TEP_PRINT_INFO)) == 0) { print_event_info(s, type->format, false, event, record); } else if (strncmp(arg, TEP_PRINT_NAME, strlen(TEP_PRINT_NAME)) == 0) { trace_seq_printf(s, type->format, event->name); } else { trace_seq_printf(s, "[UNKNOWN TEP TYPE %s]", arg); } } static void print_int(struct tep_handle *tep, struct trace_seq *s, struct tep_record *record, struct tep_event *event, int arg, struct print_event_type *type) { int param; switch (arg) { case TEP_PRINT_CPU: param = record->cpu; break; case TEP_PRINT_PID: param = parse_common_pid(tep, record->data); break; case TEP_PRINT_TIME: return print_event_time(tep, s, type->format, event, record); default: return; } trace_seq_printf(s, type->format, param); } static int tep_print_event_param_type(char *format, struct print_event_type *type) { char *str = format + 1; int i = 1; type->type = EVENT_TYPE_UNKNOWN; while (*str) { switch (*str) { case 'd': case 'u': case 'i': case 'x': case 'X': case 'o': type->type = EVENT_TYPE_INT; break; case 's': type->type = EVENT_TYPE_STRING; break; } str++; i++; if (type->type != EVENT_TYPE_UNKNOWN) break; } memset(type->format, 0, 32); memcpy(type->format, format, i < 32 ? i : 31); return i; } /** * tep_print_event - Write various event information * @tep: a handle to the trace event parser context * @s: the trace_seq to write to * @record: The record to get the event from * @format: a printf format string. Supported event fileds: * TEP_PRINT_PID, "%d" - event PID * TEP_PRINT_CPU, "%d" - event CPU * TEP_PRINT_COMM, "%s" - event command string * TEP_PRINT_NAME, "%s" - event name * TEP_PRINT_LATENCY, "%s" - event latency * TEP_PRINT_TIME, %d - event time stamp. A divisor and precision * can be specified as part of this format string: * "%precision.divisord". Example: * "%3.1000d" - divide the time by 1000 and print the first * 3 digits before the dot. Thus, the time stamp * "123456000" will be printed as "123.456" * TEP_PRINT_INFO, "%s" - event information. If any width is specified in * the format string, the event information will be printed * in raw format. * Writes the specified event information into @s. */ void tep_print_event(struct tep_handle *tep, struct trace_seq *s, struct tep_record *record, const char *fmt, ...) { struct print_event_type type; char *format = strdup(fmt); char *current = format; char *str = format; int offset; va_list args; struct tep_event *event; if (!format) return; event = tep_find_event_by_record(tep, record); va_start(args, fmt); while (*current) { current = strchr(str, '%'); if (!current) { trace_seq_puts(s, str); break; } memset(&type, 0, sizeof(type)); offset = tep_print_event_param_type(current, &type); *current = '\0'; trace_seq_puts(s, str); current += offset; switch (type.type) { case EVENT_TYPE_STRING: print_string(tep, s, record, event, va_arg(args, char*), &type); break; case EVENT_TYPE_INT: print_int(tep, s, record, event, va_arg(args, int), &type); break; case EVENT_TYPE_UNKNOWN: default: trace_seq_printf(s, "[UNKNOWN TYPE]"); break; } str = current; } va_end(args); free(format); } static int events_id_cmp(const void *a, const void *b) { struct tep_event * const * ea = a; struct tep_event * const * eb = b; if ((*ea)->id < (*eb)->id) return -1; if ((*ea)->id > (*eb)->id) return 1; return 0; } static int events_name_cmp(const void *a, const void *b) { struct tep_event * const * ea = a; struct tep_event * const * eb = b; int res; res = strcmp((*ea)->name, (*eb)->name); if (res) return res; res = strcmp((*ea)->system, (*eb)->system); if (res) return res; return events_id_cmp(a, b); } static int events_system_cmp(const void *a, const void *b) { struct tep_event * const * ea = a; struct tep_event * const * eb = b; int res; res = strcmp((*ea)->system, (*eb)->system); if (res) return res; res = strcmp((*ea)->name, (*eb)->name); if (res) return res; return events_id_cmp(a, b); } static struct tep_event **list_events_copy(struct tep_handle *tep) { struct tep_event **events; if (!tep) return NULL; events = malloc(sizeof(*events) * (tep->nr_events + 1)); if (!events) return NULL; memcpy(events, tep->events, sizeof(*events) * tep->nr_events); events[tep->nr_events] = NULL; return events; } static void list_events_sort(struct tep_event **events, int nr_events, enum tep_event_sort_type sort_type) { int (*sort)(const void *a, const void *b); switch (sort_type) { case TEP_EVENT_SORT_ID: sort = events_id_cmp; break; case TEP_EVENT_SORT_NAME: sort = events_name_cmp; break; case TEP_EVENT_SORT_SYSTEM: sort = events_system_cmp; break; default: sort = NULL; } if (sort) qsort(events, nr_events, sizeof(*events), sort); } /** * tep_list_events - Get events, sorted by given criteria. * @tep: a handle to the tep context * @sort_type: desired sort order of the events in the array * * Returns an array of pointers to all events, sorted by the given * @sort_type criteria. The last element of the array is NULL. The returned * memory must not be freed, it is managed by the library. * The function is not thread safe. */ struct tep_event **tep_list_events(struct tep_handle *tep, enum tep_event_sort_type sort_type) { struct tep_event **events; if (!tep) return NULL; events = tep->sort_events; if (events && tep->last_type == sort_type) return events; if (!events) { events = list_events_copy(tep); if (!events) return NULL; tep->sort_events = events; /* the internal events are sorted by id */ if (sort_type == TEP_EVENT_SORT_ID) { tep->last_type = sort_type; return events; } } list_events_sort(events, tep->nr_events, sort_type); tep->last_type = sort_type; return events; } /** * tep_list_events_copy - Thread safe version of tep_list_events() * @tep: a handle to the tep context * @sort_type: desired sort order of the events in the array * * Returns an array of pointers to all events, sorted by the given * @sort_type criteria. The last element of the array is NULL. The returned * array is newly allocated inside the function and must be freed by the caller */ struct tep_event **tep_list_events_copy(struct tep_handle *tep, enum tep_event_sort_type sort_type) { struct tep_event **events; if (!tep) return NULL; events = list_events_copy(tep); if (!events) return NULL; /* the internal events are sorted by id */ if (sort_type == TEP_EVENT_SORT_ID) return events; list_events_sort(events, tep->nr_events, sort_type); return events; } static struct tep_format_field ** get_event_fields(const char *type, const char *name, int count, struct tep_format_field *list) { struct tep_format_field **fields; struct tep_format_field *field; int i = 0; fields = malloc(sizeof(*fields) * (count + 1)); if (!fields) return NULL; for (field = list; field; field = field->next) { fields[i++] = field; if (i == count + 1) { do_warning("event %s has more %s fields than specified", name, type); i--; break; } } if (i != count) do_warning("event %s has less %s fields than specified", name, type); fields[i] = NULL; return fields; } /** * tep_event_common_fields - return a list of common fields for an event * @event: the event to return the common fields of. * * Returns an allocated array of fields. The last item in the array is NULL. * The array must be freed with free(). */ struct tep_format_field **tep_event_common_fields(struct tep_event *event) { return get_event_fields("common", event->name, event->format.nr_common, event->format.common_fields); } /** * tep_event_fields - return a list of event specific fields for an event * @event: the event to return the fields of. * * Returns an allocated array of fields. The last item in the array is NULL. * The array must be freed with free(). */ struct tep_format_field **tep_event_fields(struct tep_event *event) { return get_event_fields("event", event->name, event->format.nr_fields, event->format.fields); } static void print_fields(struct trace_seq *s, struct tep_print_flag_sym *field) { trace_seq_printf(s, "{ %s, %s }", field->value, field->str); if (field->next) { trace_seq_puts(s, ", "); print_fields(s, field->next); } } /* for debugging */ static void print_args(struct tep_print_arg *args) { int print_paren = 1; struct trace_seq s; switch (args->type) { case TEP_PRINT_NULL: printf("null"); break; case TEP_PRINT_ATOM: printf("%s", args->atom.atom); break; case TEP_PRINT_FIELD: printf("REC->%s", args->field.name); break; case TEP_PRINT_FLAGS: printf("__print_flags("); print_args(args->flags.field); printf(", %s, ", args->flags.delim); trace_seq_init(&s); print_fields(&s, args->flags.flags); trace_seq_do_printf(&s); trace_seq_destroy(&s); printf(")"); break; case TEP_PRINT_SYMBOL: printf("__print_symbolic("); print_args(args->symbol.field); printf(", "); trace_seq_init(&s); print_fields(&s, args->symbol.symbols); trace_seq_do_printf(&s); trace_seq_destroy(&s); printf(")"); break; case TEP_PRINT_HEX: printf("__print_hex("); print_args(args->hex.field); printf(", "); print_args(args->hex.size); printf(")"); break; case TEP_PRINT_HEX_STR: printf("__print_hex_str("); print_args(args->hex.field); printf(", "); print_args(args->hex.size); printf(")"); break; case TEP_PRINT_INT_ARRAY: printf("__print_array("); print_args(args->int_array.field); printf(", "); print_args(args->int_array.count); printf(", "); print_args(args->int_array.el_size); printf(")"); break; case TEP_PRINT_STRING: case TEP_PRINT_BSTRING: printf("__get_str(%s)", args->string.string); break; case TEP_PRINT_BITMASK: printf("__get_bitmask(%s)", args->bitmask.bitmask); break; case TEP_PRINT_TYPE: printf("(%s)", args->typecast.type); print_args(args->typecast.item); break; case TEP_PRINT_OP: if (strcmp(args->op.op, ":") == 0) print_paren = 0; if (print_paren) printf("("); print_args(args->op.left); printf(" %s ", args->op.op); print_args(args->op.right); if (print_paren) printf(")"); break; default: /* we should warn... */ return; } if (args->next) { printf("\n"); print_args(args->next); } } static void parse_header_field(const char *field, int *offset, int *size, int mandatory) { unsigned long long save_input_buf_ptr; unsigned long long save_input_buf_siz; char *token; int type; save_input_buf_ptr = input_buf_ptr; save_input_buf_siz = input_buf_siz; if (read_expected(TEP_EVENT_ITEM, "field") < 0) return; if (read_expected(TEP_EVENT_OP, ":") < 0) return; /* type */ if (read_expect_type(TEP_EVENT_ITEM, &token) < 0) goto fail; free_token(token); /* * If this is not a mandatory field, then test it first. */ if (mandatory) { if (read_expected(TEP_EVENT_ITEM, field) < 0) return; } else { if (read_expect_type(TEP_EVENT_ITEM, &token) < 0) goto fail; if (strcmp(token, field) != 0) goto discard; free_token(token); } if (read_expected(TEP_EVENT_OP, ";") < 0) return; if (read_expected(TEP_EVENT_ITEM, "offset") < 0) return; if (read_expected(TEP_EVENT_OP, ":") < 0) return; if (read_expect_type(TEP_EVENT_ITEM, &token) < 0) goto fail; *offset = atoi(token); free_token(token); if (read_expected(TEP_EVENT_OP, ";") < 0) return; if (read_expected(TEP_EVENT_ITEM, "size") < 0) return; if (read_expected(TEP_EVENT_OP, ":") < 0) return; if (read_expect_type(TEP_EVENT_ITEM, &token) < 0) goto fail; *size = atoi(token); free_token(token); if (read_expected(TEP_EVENT_OP, ";") < 0) return; type = read_token(&token); if (type != TEP_EVENT_NEWLINE) { /* newer versions of the kernel have a "signed" type */ if (type != TEP_EVENT_ITEM) goto fail; if (strcmp(token, "signed") != 0) goto fail; free_token(token); if (read_expected(TEP_EVENT_OP, ":") < 0) return; if (read_expect_type(TEP_EVENT_ITEM, &token)) goto fail; free_token(token); if (read_expected(TEP_EVENT_OP, ";") < 0) return; if (read_expect_type(TEP_EVENT_NEWLINE, &token)) goto fail; } fail: free_token(token); return; discard: input_buf_ptr = save_input_buf_ptr; input_buf_siz = save_input_buf_siz; *offset = 0; *size = 0; free_token(token); } /** * tep_parse_header_page - parse the data stored in the header page * @tep: a handle to the trace event parser context * @buf: the buffer storing the header page format string * @size: the size of @buf * @long_size: the long size to use if there is no header * * This parses the header page format for information on the * ring buffer used. The @buf should be copied from * * /sys/kernel/debug/tracing/events/header_page */ int tep_parse_header_page(struct tep_handle *tep, char *buf, unsigned long size, int long_size) { int ignore; if (!size) { /* * Old kernels did not have header page info. * Sorry but we just use what we find here in user space. */ tep->header_page_ts_size = sizeof(long long); tep->header_page_size_size = long_size; tep->header_page_data_offset = sizeof(long long) + long_size; tep->old_format = 1; return -1; } init_input_buf(buf, size); parse_header_field("timestamp", &tep->header_page_ts_offset, &tep->header_page_ts_size, 1); parse_header_field("commit", &tep->header_page_size_offset, &tep->header_page_size_size, 1); parse_header_field("overwrite", &tep->header_page_overwrite, &ignore, 0); parse_header_field("data", &tep->header_page_data_offset, &tep->header_page_data_size, 1); return 0; } static int event_matches(struct tep_event *event, int id, const char *sys_name, const char *event_name) { if (id >= 0 && id != event->id) return 0; if (event_name && (strcmp(event_name, event->name) != 0)) return 0; if (sys_name && (strcmp(sys_name, event->system) != 0)) return 0; return 1; } static void free_handler(struct event_handler *handle) { free((void *)handle->sys_name); free((void *)handle->event_name); free(handle); } static int find_event_handle(struct tep_handle *tep, struct tep_event *event) { struct event_handler *handle, **next; for (next = &tep->handlers; *next; next = &(*next)->next) { handle = *next; if (event_matches(event, handle->id, handle->sys_name, handle->event_name)) break; } if (!(*next)) return 0; pr_info("overriding event (%d) %s:%s with new print handler", event->id, event->system, event->name); event->handler = handle->func; event->context = handle->context; *next = handle->next; free_handler(handle); return 1; } /** * parse_format - parse the event format * @buf: the buffer storing the event format string * @size: the size of @buf * @sys: the system the event belongs to * * This parses the event format and creates an event structure * to quickly parse raw data for a given event. * * These files currently come from: * * /sys/kernel/debug/tracing/events/.../.../format */ static enum tep_errno parse_format(struct tep_event **eventp, struct tep_handle *tep, const char *buf, unsigned long size, const char *sys) { struct tep_event *event; int ret; init_input_buf(buf, size); *eventp = event = alloc_event(); if (!event) return TEP_ERRNO__MEM_ALLOC_FAILED; event->name = event_read_name(); if (!event->name) { /* Bad event? */ ret = TEP_ERRNO__MEM_ALLOC_FAILED; goto event_alloc_failed; } if (strcmp(sys, "ftrace") == 0) { event->flags |= TEP_EVENT_FL_ISFTRACE; if (strcmp(event->name, "bprint") == 0) event->flags |= TEP_EVENT_FL_ISBPRINT; } event->id = event_read_id(); if (event->id < 0) { ret = TEP_ERRNO__READ_ID_FAILED; /* * This isn't an allocation error actually. * But as the ID is critical, just bail out. */ goto event_alloc_failed; } event->system = strdup(sys); if (!event->system) { ret = TEP_ERRNO__MEM_ALLOC_FAILED; goto event_alloc_failed; } /* Add tep to event so that it can be referenced */ event->tep = tep; ret = event_read_format(event); if (ret < 0) { ret = TEP_ERRNO__READ_FORMAT_FAILED; goto event_parse_failed; } /* * If the event has an override, don't print warnings if the event * print format fails to parse. */ if (tep && find_event_handle(tep, event)) show_warning = 0; ret = event_read_print(event); show_warning = 1; if (ret < 0) { ret = TEP_ERRNO__READ_PRINT_FAILED; goto event_parse_failed; } if (!ret && (event->flags & TEP_EVENT_FL_ISFTRACE)) { struct tep_format_field *field; struct tep_print_arg *arg, **list; /* old ftrace had no args */ list = &event->print_fmt.args; for (field = event->format.fields; field; field = field->next) { arg = alloc_arg(); if (!arg) { event->flags |= TEP_EVENT_FL_FAILED; return TEP_ERRNO__OLD_FTRACE_ARG_FAILED; } arg->type = TEP_PRINT_FIELD; arg->field.name = strdup(field->name); if (!arg->field.name) { event->flags |= TEP_EVENT_FL_FAILED; free_arg(arg); return TEP_ERRNO__OLD_FTRACE_ARG_FAILED; } arg->field.field = field; *list = arg; list = &arg->next; } } if (!(event->flags & TEP_EVENT_FL_ISBPRINT)) event->print_fmt.print_cache = parse_args(event, event->print_fmt.format, event->print_fmt.args); return 0; event_parse_failed: event->flags |= TEP_EVENT_FL_FAILED; return ret; event_alloc_failed: free(event->system); free(event->name); free(event); *eventp = NULL; return ret; } static enum tep_errno __parse_event(struct tep_handle *tep, struct tep_event **eventp, const char *buf, unsigned long size, const char *sys) { int ret = parse_format(eventp, tep, buf, size, sys); struct tep_event *event = *eventp; if (event == NULL) return ret; if (tep && add_event(tep, event)) { ret = TEP_ERRNO__MEM_ALLOC_FAILED; goto event_add_failed; } #define PRINT_ARGS 0 if (PRINT_ARGS && event->print_fmt.args) print_args(event->print_fmt.args); return 0; event_add_failed: free_tep_event(event); return ret; } /** * tep_parse_format - parse the event format * @tep: a handle to the trace event parser context * @eventp: returned format * @buf: the buffer storing the event format string * @size: the size of @buf * @sys: the system the event belongs to * * This parses the event format and creates an event structure * to quickly parse raw data for a given event. * * These files currently come from: * * /sys/kernel/debug/tracing/events/.../.../format */ enum tep_errno tep_parse_format(struct tep_handle *tep, struct tep_event **eventp, const char *buf, unsigned long size, const char *sys) { return __parse_event(tep, eventp, buf, size, sys); } /** * tep_parse_event - parse the event format * @tep: a handle to the trace event parser context * @buf: the buffer storing the event format string * @size: the size of @buf * @sys: the system the event belongs to * * This parses the event format and creates an event structure * to quickly parse raw data for a given event. * * These files currently come from: * * /sys/kernel/debug/tracing/events/.../.../format */ enum tep_errno tep_parse_event(struct tep_handle *tep, const char *buf, unsigned long size, const char *sys) { struct tep_event *event = NULL; return __parse_event(tep, &event, buf, size, sys); } int get_field_val(struct trace_seq *s, struct tep_format_field *field, const char *name, struct tep_record *record, unsigned long long *val, int err) { if (!field) { if (err) trace_seq_printf(s, "", name); return -1; } if (tep_read_number_field(field, record->data, val)) { if (err) trace_seq_printf(s, " %s=INVALID", name); return -1; } return 0; } /** * tep_get_field_raw - return the raw pointer into the data field * @s: The seq to print to on error * @event: the event that the field is for * @name: The name of the field * @record: The record with the field name. * @len: place to store the field length. * @err: print default error if failed. * * Returns a pointer into record->data of the field and places * the length of the field in @len. * * On failure, it returns NULL. */ void *tep_get_field_raw(struct trace_seq *s, struct tep_event *event, const char *name, struct tep_record *record, int *len, int err) { struct tep_format_field *field; void *data = record->data; unsigned offset; int dummy; if (!event) return NULL; field = tep_find_field(event, name); if (!field) { if (err) trace_seq_printf(s, "", name); return NULL; } /* Allow @len to be NULL */ if (!len) len = &dummy; offset = field->offset; if (field->flags & TEP_FIELD_IS_DYNAMIC) { offset = tep_read_number(event->tep, data + offset, field->size); *len = offset >> 16; offset &= 0xffff; } else *len = field->size; return data + offset; } /** * tep_get_field_val - find a field and return its value * @s: The seq to print to on error * @event: the event that the field is for * @name: The name of the field * @record: The record with the field name. * @val: place to store the value of the field. * @err: print default error if failed. * * Returns 0 on success -1 on field not found. */ int tep_get_field_val(struct trace_seq *s, struct tep_event *event, const char *name, struct tep_record *record, unsigned long long *val, int err) { struct tep_format_field *field; if (!event) return -1; field = tep_find_field(event, name); return get_field_val(s, field, name, record, val, err); } /** * tep_get_common_field_val - find a common field and return its value * @s: The seq to print to on error * @event: the event that the field is for * @name: The name of the field * @record: The record with the field name. * @val: place to store the value of the field. * @err: print default error if failed. * * Returns 0 on success -1 on field not found. */ int tep_get_common_field_val(struct trace_seq *s, struct tep_event *event, const char *name, struct tep_record *record, unsigned long long *val, int err) { struct tep_format_field *field; if (!event) return -1; field = tep_find_common_field(event, name); return get_field_val(s, field, name, record, val, err); } /** * tep_get_any_field_val - find a any field and return its value * @s: The seq to print to on error * @event: the event that the field is for * @name: The name of the field * @record: The record with the field name. * @val: place to store the value of the field. * @err: print default error if failed. * * Returns 0 on success -1 on field not found. */ int tep_get_any_field_val(struct trace_seq *s, struct tep_event *event, const char *name, struct tep_record *record, unsigned long long *val, int err) { struct tep_format_field *field; if (!event) return -1; field = tep_find_any_field(event, name); return get_field_val(s, field, name, record, val, err); } /** * tep_print_num_field - print a field and a format * @s: The seq to print to * @fmt: The printf format to print the field with. * @event: the event that the field is for * @name: The name of the field * @record: The record with the field name. * @err: print default error if failed. * * Returns positive value on success, negative in case of an error, * or 0 if buffer is full. */ int tep_print_num_field(struct trace_seq *s, const char *fmt, struct tep_event *event, const char *name, struct tep_record *record, int err) { struct tep_format_field *field = tep_find_field(event, name); unsigned long long val; if (!field) goto failed; if (tep_read_number_field(field, record->data, &val)) goto failed; return trace_seq_printf(s, fmt, val); failed: if (err) trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name); return -1; } /** * tep_print_func_field - print a field and a format for function pointers * @s: The seq to print to * @fmt: The printf format to print the field with. * @event: the event that the field is for * @name: The name of the field * @record: The record with the field name. * @err: print default error if failed. * * Returns positive value on success, negative in case of an error, * or 0 if buffer is full. */ int tep_print_func_field(struct trace_seq *s, const char *fmt, struct tep_event *event, const char *name, struct tep_record *record, int err) { struct tep_format_field *field = tep_find_field(event, name); struct tep_handle *tep = event->tep; unsigned long long val; struct func_map *func; char tmp[128]; if (!field) goto failed; if (tep_read_number_field(field, record->data, &val)) goto failed; func = find_func(tep, val); if (func) snprintf(tmp, 128, "%s/0x%llx", func->func, func->addr - val); else sprintf(tmp, "0x%08llx", val); return trace_seq_printf(s, fmt, tmp); failed: if (err) trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name); return -1; } static void free_func_handle(struct tep_function_handler *func) { struct func_params *params; free(func->name); while (func->params) { params = func->params; func->params = params->next; free(params); } free(func); } /** * tep_register_print_function - register a helper function * @tep: a handle to the trace event parser context * @func: the function to process the helper function * @ret_type: the return type of the helper function * @name: the name of the helper function * @parameters: A list of enum tep_func_arg_type * * Some events may have helper functions in the print format arguments. * This allows a plugin to dynamically create a way to process one * of these functions. * * The @parameters is a variable list of tep_func_arg_type enums that * must end with TEP_FUNC_ARG_VOID. */ int tep_register_print_function(struct tep_handle *tep, tep_func_handler func, enum tep_func_arg_type ret_type, char *name, ...) { struct tep_function_handler *func_handle; struct func_params **next_param; struct func_params *param; enum tep_func_arg_type type; va_list ap; int ret; func_handle = find_func_handler(tep, name); if (func_handle) { /* * This is most like caused by the users own * plugins updating the function. This overrides the * system defaults. */ pr_info("override of function helper '%s'", name); remove_func_handler(tep, name); } func_handle = calloc(1, sizeof(*func_handle)); if (!func_handle) { do_warning("Failed to allocate function handler"); return TEP_ERRNO__MEM_ALLOC_FAILED; } func_handle->ret_type = ret_type; func_handle->name = strdup(name); func_handle->func = func; if (!func_handle->name) { do_warning("Failed to allocate function name"); free(func_handle); return TEP_ERRNO__MEM_ALLOC_FAILED; } next_param = &(func_handle->params); va_start(ap, name); for (;;) { type = va_arg(ap, enum tep_func_arg_type); if (type == TEP_FUNC_ARG_VOID) break; if (type >= TEP_FUNC_ARG_MAX_TYPES) { do_warning("Invalid argument type %d", type); ret = TEP_ERRNO__INVALID_ARG_TYPE; goto out_free; } param = malloc(sizeof(*param)); if (!param) { do_warning("Failed to allocate function param"); ret = TEP_ERRNO__MEM_ALLOC_FAILED; goto out_free; } param->type = type; param->next = NULL; *next_param = param; next_param = &(param->next); func_handle->nr_args++; } va_end(ap); func_handle->next = tep->func_handlers; tep->func_handlers = func_handle; return 0; out_free: va_end(ap); free_func_handle(func_handle); return ret; } /** * tep_unregister_print_function - unregister a helper function * @tep: a handle to the trace event parser context * @func: the function to process the helper function * @name: the name of the helper function * * This function removes existing print handler for function @name. * * Returns 0 if the handler was removed successully, -1 otherwise. */ int tep_unregister_print_function(struct tep_handle *tep, tep_func_handler func, char *name) { struct tep_function_handler *func_handle; func_handle = find_func_handler(tep, name); if (func_handle && func_handle->func == func) { remove_func_handler(tep, name); return 0; } return -1; } static struct tep_event *search_event(struct tep_handle *tep, int id, const char *sys_name, const char *event_name) { struct tep_event *event; if (id >= 0) { /* search by id */ event = tep_find_event(tep, id); if (!event) return NULL; if (event_name && (strcmp(event_name, event->name) != 0)) return NULL; if (sys_name && (strcmp(sys_name, event->system) != 0)) return NULL; } else { event = tep_find_event_by_name(tep, sys_name, event_name); if (!event) return NULL; } return event; } /** * tep_register_event_handler - register a way to parse an event * @tep: a handle to the trace event parser context * @id: the id of the event to register * @sys_name: the system name the event belongs to * @event_name: the name of the event * @func: the function to call to parse the event information * @context: the data to be passed to @func * * This function allows a developer to override the parsing of * a given event. If for some reason the default print format * is not sufficient, this function will register a function * for an event to be used to parse the data instead. * * If @id is >= 0, then it is used to find the event. * else @sys_name and @event_name are used. * * Returns: * TEP_REGISTER_SUCCESS_OVERWRITE if an existing handler is overwritten * TEP_REGISTER_SUCCESS if a new handler is registered successfully * negative TEP_ERRNO_... in case of an error * */ int tep_register_event_handler(struct tep_handle *tep, int id, const char *sys_name, const char *event_name, tep_event_handler_func func, void *context) { struct tep_event *event; struct event_handler *handle; event = search_event(tep, id, sys_name, event_name); if (event == NULL) goto not_found; pr_info("overriding event (%d) %s:%s with new print handler", event->id, event->system, event->name); event->handler = func; event->context = context; return TEP_REGISTER_SUCCESS_OVERWRITE; not_found: /* Save for later use. */ handle = calloc(1, sizeof(*handle)); if (!handle) { do_warning("Failed to allocate event handler"); return TEP_ERRNO__MEM_ALLOC_FAILED; } handle->id = id; if (event_name) handle->event_name = strdup(event_name); if (sys_name) handle->sys_name = strdup(sys_name); if ((event_name && !handle->event_name) || (sys_name && !handle->sys_name)) { do_warning("Failed to allocate event/sys name"); free((void *)handle->event_name); free((void *)handle->sys_name); free(handle); return TEP_ERRNO__MEM_ALLOC_FAILED; } handle->func = func; handle->next = tep->handlers; tep->handlers = handle; handle->context = context; return TEP_REGISTER_SUCCESS; } static int handle_matches(struct event_handler *handler, int id, const char *sys_name, const char *event_name, tep_event_handler_func func, void *context) { if (id >= 0 && id != handler->id) return 0; if (event_name && (strcmp(event_name, handler->event_name) != 0)) return 0; if (sys_name && (strcmp(sys_name, handler->sys_name) != 0)) return 0; if (func != handler->func || context != handler->context) return 0; return 1; } /** * tep_unregister_event_handler - unregister an existing event handler * @tep: a handle to the trace event parser context * @id: the id of the event to unregister * @sys_name: the system name the handler belongs to * @event_name: the name of the event handler * @func: the function to call to parse the event information * @context: the data to be passed to @func * * This function removes existing event handler (parser). * * If @id is >= 0, then it is used to find the event. * else @sys_name and @event_name are used. * * Returns 0 if handler was removed successfully, -1 if event was not found. */ int tep_unregister_event_handler(struct tep_handle *tep, int id, const char *sys_name, const char *event_name, tep_event_handler_func func, void *context) { struct tep_event *event; struct event_handler *handle; struct event_handler **next; event = search_event(tep, id, sys_name, event_name); if (event == NULL) goto not_found; if (event->handler == func && event->context == context) { pr_info("removing override handler for event (%d) %s:%s. Going back to default handler.", event->id, event->system, event->name); event->handler = NULL; event->context = NULL; return 0; } not_found: for (next = &tep->handlers; *next; next = &(*next)->next) { handle = *next; if (handle_matches(handle, id, sys_name, event_name, func, context)) break; } if (!(*next)) return -1; *next = handle->next; free_handler(handle); return 0; } /** * tep_alloc - create a tep handle */ struct tep_handle *tep_alloc(void) { struct tep_handle *tep = calloc(1, sizeof(*tep)); if (tep) { tep->ref_count = 1; tep->host_bigendian = tep_is_bigendian(); } return tep; } void tep_ref(struct tep_handle *tep) { tep->ref_count++; } int tep_get_ref(struct tep_handle *tep) { if (tep) return tep->ref_count; return 0; } __hidden void free_tep_format_field(struct tep_format_field *field) { free(field->type); if (field->alias != field->name) free(field->alias); free(field->name); free(field); } static void free_format_fields(struct tep_format_field *field) { struct tep_format_field *next; while (field) { next = field->next; free_tep_format_field(field); field = next; } } static void free_formats(struct tep_format *format) { free_format_fields(format->common_fields); free_format_fields(format->fields); } __hidden void free_tep_event(struct tep_event *event) { free(event->name); free(event->system); free_formats(&event->format); free(event->print_fmt.format); free_args(event->print_fmt.args); free_parse_args(event->print_fmt.print_cache); free(event); } /** * tep_free - free a tep handle * @tep: the tep handle to free */ void tep_free(struct tep_handle *tep) { struct cmdline_list *cmdlist, *cmdnext; struct func_list *funclist, *funcnext; struct printk_list *printklist, *printknext; struct tep_function_handler *func_handler; struct event_handler *handle; int i; if (!tep) return; cmdlist = tep->cmdlist; funclist = tep->funclist; printklist = tep->printklist; tep->ref_count--; if (tep->ref_count) return; if (tep->cmdlines) { for (i = 0; i < tep->cmdline_count; i++) free(tep->cmdlines[i].comm); free(tep->cmdlines); } while (cmdlist) { cmdnext = cmdlist->next; free(cmdlist->comm); free(cmdlist); cmdlist = cmdnext; } if (tep->func_map) { for (i = 0; i < (int)tep->func_count; i++) { free(tep->func_map[i].func); free(tep->func_map[i].mod); } free(tep->func_map); } while (funclist) { funcnext = funclist->next; free(funclist->func); free(funclist->mod); free(funclist); funclist = funcnext; } while (tep->func_handlers) { func_handler = tep->func_handlers; tep->func_handlers = func_handler->next; free_func_handle(func_handler); } if (tep->printk_map) { for (i = 0; i < (int)tep->printk_count; i++) free(tep->printk_map[i].printk); free(tep->printk_map); } while (printklist) { printknext = printklist->next; free(printklist->printk); free(printklist); printklist = printknext; } for (i = 0; i < tep->nr_events; i++) free_tep_event(tep->events[i]); while (tep->handlers) { handle = tep->handlers; tep->handlers = handle->next; free_handler(handle); } free(tep->events); free(tep->sort_events); free(tep->func_resolver); free_tep_plugin_paths(tep); free(tep); } void tep_unref(struct tep_handle *tep) { tep_free(tep); } trace-cmd-v2.9.6/lib/traceevent/event-plugin.c000066400000000000000000000362651414302661500212620ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt * */ #include #include #include #include #include #include #include #include #include #include #include "event-parse.h" #include "event-parse-local.h" #include "event-utils.h" #include "trace-seq.h" #define LOCAL_PLUGIN_DIR ".local/lib/traceevent/plugins/" static struct registered_plugin_options { struct registered_plugin_options *next; struct tep_plugin_option *options; } *registered_options; static struct trace_plugin_options { struct trace_plugin_options *next; char *plugin; char *option; char *value; } *trace_plugin_options; struct tep_plugin_list { struct tep_plugin_list *next; char *name; void *handle; }; struct tep_plugins_dir { struct tep_plugins_dir *next; char *path; enum tep_plugin_load_priority prio; }; static void lower_case(char *str) { if (!str) return; for (; *str; str++) *str = tolower(*str); } static int update_option_value(struct tep_plugin_option *op, const char *val) { char *op_val; if (!val) { /* toggle, only if option is boolean */ if (op->value) /* Warn? */ return 0; op->set ^= 1; return 0; } /* * If the option has a value then it takes a string * otherwise the option is a boolean. */ if (op->value) { op->value = val; return 0; } /* Option is boolean, must be either "1", "0", "true" or "false" */ op_val = strdup(val); if (!op_val) return -1; lower_case(op_val); if (strcmp(val, "1") == 0 || strcmp(val, "true") == 0) op->set = 1; else if (strcmp(val, "0") == 0 || strcmp(val, "false") == 0) op->set = 0; free(op_val); return 0; } /** * tep_plugin_list_options - get list of plugin options * * Returns an array of char strings that list the currently registered * plugin options in the format of :

  • ݠq(.1רS32 XHSplʳpW2J4a1,Ma̕i5(es }m02I8QbXAprkVTt1g!ۥ Lth4gvb:&`hXqVi=r#CMFCyT+J=uj61*IMNqg*OH>ocDTiAbّU{dpDYauD5&OEQRP[]{KFM~4)9ZinLH³M2Z9DB;=RKcVvN31**cH 4iשtf ԬQzI pΨi)M+&CiiS9xRđPE2d+7EP։ȅ q PdM=L4-d3K'm"2`N}a6D.pX2;H˃ +F>GPJO{sq%.^mQxy1IDAT ^x:sss~[2%ܚ r FaHazep.+S*d,%gHCb+Kn-aB%%nyX\YlMYy(N٘-`ڿItʱWnD0n^9rJ;U@ 9W ,kP:R ʞAB^ɉtՠ-C ,D96v>IabI,J,eP2(**ڶ4] T/aJNP)[镊1W%KU(,R)q²eW~:vYM w)lH5dB))W oÖA`s>na RHV~,[5UKZ 㖨:q+nQpdNyP qƕCXC*R^[͠9G s|k3oi9KS8\K*1#;XN낣7LJ‘s)/)o^QS>YN;)yS!-4e_Cz6v]A٬eVؼnJl?`H'82(L4hCyD:Z :΍ .ZvUNerxfejhj|-8>twnYL#֙{w^r+-uc8W2 RYs5iNy~ʊQb()[R",eiTΗN- ᴧ d9˂iVZhxm\췕%%ҹLĬquPE=(9涜53 AqtT;rC;%nr,%%@<%RXا!MNך2TI!-zzC\[X빭@9tvnQXΚ'jvQ[Kea9Kyk;) ob77˲9T-UN[,dAGGyWrw}y睴m{F3g;y{wI>򑏰'> fggÇ>|Ç>W÷|#Gpȑ?{ ]}ヘ Mx{{ @ aJ C5 ;НotHpGGCCB}fCE>O@C"!5t!ХDBGnK\] د!#4Z RCG &AH{,#/!kkH۬"]B"&@!֛&֐R Єp~J{NC &$:~ GR"5a&9J!їhHtІ-}mɪKgd_WI]֏m@ o!Ε(MӜ4&+v,$BGJ Κf'5$IJt!c92aHJa:•Gi'or%:R!cHGG%eVҵpt'5lI)tssN,es-!m7)n tIt'mۺ> A@رlQ[;,DӄMS9U݋s5ڎl p|s(:jc5NNLM{< vLӼk 'Ie5nމp̞a58N]R 8W}7G_㨭Kkl[+ׄ;OG? 4't O:BNn<Bߪ;-|9>Z1i_⊐9 4ח_j4[n tesC}QݛpZsƴ9jsn,k/x%-5BNخBޘұp!_㬔ptQ n>$ʴr毴s5a 4g>n&<{ۼyoBs }(ٺ 8e–CwR.AJ)[gH;Ҽc]}\C1>vvfBR"u{M8KoCRk7g9tǐYk Ov~vvBsSsCv]]͉@wt&8Keq8J7vA,r_9N,S M {}&SLU>㚳.H;1t򼽾<ݵwׄmmGu/kH';ƍNvb2C?+i^.1pgyս嬅lJNPغquQHmk:ʍv Y:q Mi^sm uU'_y@G~=鎿 g- }m(GC: wul~:A 9~#R_Jta4kP !M{E]*GNGf͞~ ݹ?M9&/PR4I4|mJ_/BBs׫ĻOc6 K;8g*/&H;H duo7t,C#Kq*n\2Ɣ[2#t(2VKQ)^.\mSkRcV[Z ㈊dyfyYݠFlBCi|cJ@\VkQ^m]jyzR_ªjWר aYgzv#Kkd۬P~z\g)ʽjmv3vשm<ʗE34c4 F&ĥ2 4S 6&U (J14ҊDyn;^KV'3\R#:F M1vnj_"+#\ܳ]݊f]fM-=sft,_Oz]vyeCԚNʫ9vGѠ/Q{i2ul+ΕX k}ƚ%5bSW(Q375.^<^Rq'X.ZX,^%Hm&+:q((m-xX"t"S}{)J{EHYhE$E9w%LӴHWI{3 0{T^E~=D%37Zsuj5 F3HBtE6;v[{.WI7 !dEX>CVtT?Hu/Q)z4{%KXe+jVSPnt P4.]/m,GPG.ZB? \ G'R(P U̒A!WUzETV;i>zD#QA6ZLPX׉E R7ȵ ی7Md3k|)Pt-\CR+$e!/)l4XWla\$46u|n7GeYަ{$W U u~ߦN_0bSUG{^+i%a6:Y2@`]^nPh|3M:Ǎ.1:iFV[E5hD:CLuK29BSNg;syN~r !(J0>>??xs93v_ևgni 5JJ{]9npo{ѓrzz}RXN_ୟ=^Od3c9}ŃGXN)GXη,C}N/r{~wv군Gsy-0t=mPz4K!e鋳 .5<@ w=^ۯmPz^Ov߰0?+۱ wl[g+8{nHU=>տ%&ǹAmw9(̝ӏ9x<pTa,,]Po\v=rŻՃsCٶ A_9{< {B*|J6jh8Czsi-4A)|o{ 9zu'~Iל6rC&-R::pV=v9dS˹o(gIO>•cp.o,>I{d"P}=a}n׮QGR=Nlqu$Jc`- ~7?wK抗Wܞd/?=C0XhC=|҉?vCORy?#}[A\+إʐCyΕa5'CN'8xz7+>_.rcnPqzsW<*NI^~thכ:WG»҆pWAhKvsPVκi`_˶d(=CMR7!qbr(-ܘKoWrGuۓm9=Ba}ùfЃ>oܾϠwV^ lwɋJgIa UGb0|Ow>-ǰ9ѹqn}p󄴜5GnyN>u筋=bر0m*;/X #n yyU y԰#04gy>Np -zұѭ.-VCL٪G/2XI~4.?5r-˥lY zo6/qqXM{SHw.$ʋ8ی²9z߭5Jjqihm R1n|Ç>|Çoc|KYÇ>|Ç>|ߠÇ>|Ç7>|Ç>|Ƿ >|Ç>|mÇ>|Ç>||ߠÇ>|Ç7>|Ç>|Ƿ >|Ç>|mÇ>|Ç>||ߠÇ>|Ç7>|Ç>|Ƿ >|Ç>|mÇ>|Ç>||@I˪m)J!69u<6HF`[M"M`̘yCEV H&Hj{E26RcօH1*{ s+tZDa6ó,$aN-iHʄDn@9F$\J&V ,'Q-@-eh ¢>DXpttrZ8I&XfR:B`in~mjrӸI-˘YCZ$ENteRQcppFO([LYETz^ԤU'-X!:Kt2E7(BDjaV`fR1eؓEn2^VwhENh$y0I3ȉ#e$9z!0k#͓d9zpfTt$wىLsXfե0DAYcVaCTGDԃa&T)&WfjAzH$A:ͅ&9c}M#V]gDDqct Z!&t=9C# b4Cd-J=zCɫ,c-b>F7JzB" 7QׂQ# K' ƪ=zXnITo :f.(jlkS;Iw^qx}3D%lR7G &FL.QeqPAo  4H.`11Z2BȘ,aNJx=VGN.GHƘlC7Hӥ]'ҶHEmF3ILJ5bߤ]@LGv0%ƃTd~}fmXCќmO1Ow' ] 6 bTƈJ4 :*(f?LcV SX4 i`h:7eSM;un61N D%4 K̏ܤ&H^ f#*598~ EVgbܡ?H.g*b*6zG AcTJ0Z5nC:IyV趓kA=h(G:=5(I.S* KJJӊ b 8^Mӌ.uk,cEsf̫=4C4IFfH{" zR .5.EcբNh~n^?ޱ>F?ʤ2%(MC'Yx)HWE(f3ݤ\DH1w1EуD} I+*)ϚȞDI4G)F75 Јmpi uEVZw#ykd;Kcej1jPj#R qT+B=τ}&SBjo@}VC <$jE#9j1,uJ%D3̸ޝ86%mѴƊ[E8Z^v?ID)%X^zKiUhZlvfV%Qb:FsĢ`#LD:qY9E3*QE=`]4h1G)fTv @5m)PAgB]6cqXڴvI)&2@IJ4\KX1YGJDM~$j1إP:JRTa31NKŰ' qͅcU`KV=Rq.K$u+pB}D)AT(#{`͛dCXԘ2KTbA1 evu@,I*[{ؘs Zڂr|ՎR] F)hYsN9wJG@vfF BLR?ZXwl2F8K$ZF%#.JIf=xsL| s#Ck'X:]&zOXWx<!D1 Iq ?CϲY;F_#aĿ/`Uzw~u>9ʿ_b$ӋY;dtlݜ3G;ϿkYvnQ.)*k{ o~gX::x_e~/6:(1{Ϳen|f?8W(Fj*dۇ4[I~oA]Q .O3K{-S}&χK"ү~Xo|CwSu~_ͳk-;,8w8;һyRW/xdzg)/_!=^<_k||_R~;M~Rzd}ű_ߐ}wǎA~ϋKǘ89&+_,dzuhm`_;ļcqYu?JNJ;/Zz׮->8kO#|׾O=½:<7XE2Wpc_<}s(7cD~i-*ЇtlOX͌x+G;.sUg3ej|CM L}7zc;?M?B9W wC+h|;= # .Sxx_e2̒8}zߧ68}\nV7I>l^Caf&&//,l?/h9Z871}-I94K :_<4˟x_8L|l;rMQ~nvl] )ZFs\s|_~bdfqzXŏұwrgc:{m_:YV~`d*uu;apϵHX؄?A_${f_#g-'Ozȩw8hŏ.)">%^;%zMFlN1ѭ?+/s_/d"S)N~е%{TI ) =6N~v+bq>(9[orGO󯼓fdwW#o9~E^z'O5XWG9b_a|]27$<{O~NSzJ|"p'~|78]b6?FZ+n~?=«sݜꮱRzk̿)jO|'1K99*C|85w,}Lpv.WC ƿ%+W-п$|c7y_4~k{W8xA[n^̗V0=.#;i* cWw (,oYmMo5ҟ{+ѣl5O0%sw\z/gx$O?HǪ/w-NO _3ҹo`)‘Be$?Gyc:}vOGe6~s?Ovjlg{LoвS̉4~%?Wsi|bg {w49yE맗aKWt(?ғW])zPaѻs UNM~J<<2meyj~.^~j7?Ǜf_w?|Ϝ8_H/Vw-W\vPv; \9Dw߿Jcz|V"D9.,?y/u?GXQ>?߯7X4wTԍ1~|y/Kg(IT5d8Fo?3~k] קfW;S+7N2~hݞ`W|W_* =c˟"'Fqg=sїümk7|H9eGޯs16^|MyM:^)M==ו{wm5 SXJy*EKᾦ ]{ `C*;+{u>n}b ҳ77onq{:wM|7$@}EGğ!`[e~n[f/w24}x+syΐsV R >7~ɷ-^v[\˻;!+\d[ֲu|w[6[b`7knN=Zx[si,}5!bۭimcY5d}1lʆ7>}:(^yKí9s`}:M;F7]f8smTεr2ƭiW[~ Ψ[d[号C^;ש?wZ7ʛ[ɼ~V Ƿ[bg;_cH'ClX-rCv^þ2gW[9Cv!׿n=NM ~n{y^ 5ľ3lq `/<1e^c %ǰaVΥp޿_k[sp֜o5q'oe}ξ_?=>|Ç>|Ƿ >|Ç>|moĽN1 iϣ²,$V^(id,y4M˞>|Ç>|moitmJ,--y9z(J)1MO}S9s7nvW._//1==Vam{ʹ3  >w4!@: a_U@I``>Jsfv-u'ɁP]x*qpanT1& l i!,̈́(ܨkK"e @\ h`؍rl?B =azq '^(M9;pC}u B r㠝;mqÑYWRrQynh(ōyr۷osK{ӫ@ב MiOQZ[zm‰r9o!5\ݐѡ&S\WsؾʞYڱёA?Зrbp7D8#@*ӻ[>{rJT¶5pudjL0oIV6 s?Y*g^9kJay{,km U*pC:Qbtr{Ԑ8TtŷT~Uq~G~|(8z({ܤ\.t:X,'?I1M[7F0HG9 !d,;ء ځ;hD%BcF4kR2B/D&%Z*J"X1A_YҟkВ5ZIE{8a%\BU{H$q*kwҭF#TwNuڋu0X=V;zNMHJ(*$2[ABq(O+.չ1&M*ZgZG-[hGs{lTFӻ̆7֟@t/lrB=X "s`Tqƴ"k#5ZJkXQ6%nqaYg ,T@7@&k-J$q2*;Ңݜ@Aޝ'5_s}]"b-zN{8wMHPf DG[41JㄚP1l>D(Qҝv3QSny.ӏYAdw4i4Gl=@=P!2N"G5zaF <;vX)%_?EtQi?wnNrḬ̀8sp[$w.OZz=Ξ< Pߺ,L2ѫ*,0ΐ(> ?NJ;tTDu&).n0c!۬]7wY4fgNHut1v戉Yj4ese:źq +dQ9@F OtᓼDf2cܽ7C'a4'{SwR?Re<(`ƜӸ6jG+IBR^By,9wNmN&dL^0P)"7gNNJi.6޶K3@,R[ *o@ $uH`UF(׃lnc?8!V~>ӹ-EwSș\3dfth ];I \t0#yB$:f)F#tOC'T\pz\gT9`<܌"w_ќf WB'3$C.>Bۊg,RQD2|jsO5%"Evwڨ@iqμcS> dk 1+5>hr9 &&S&Fal4kGI^"6C"2YCØ ^=*es*ɉ9ΟEٮ }d,C=u3MfT{Dkf*$DœWؙv.N z` 4FxQ:X}3Mj #:2z*cJIpUx{֦"@fcxKG~B`یe2ژg2 ݅ ZyT 6F+FJC W>LO׈:?`Z 2ueaPY p64HseiR5Eܡ_bvUA6736hG,inΏ3ED4곬N3۬Q{?P6iq ݡq&rlQ#=1 $ #F%w:;L,b zΑ{n&W,VoGDKשU؝Ьβ2=Fy\# 8 uZt{>x.LƺՌќQ9~*LeR3荷c, ;5Fn^C Qfo,ƫAL[n~Vb͑4S1S&sH wƸRL,'"WM>p.#LxgF QaZ!ë1|r3aܨP=QBK1J&8 9N3&urtHG3 R2,IiL2ڣVyƽ$fM{5$ΝBIsq~%Qƛ-:aA;tK/g+<˛']M.N/b!)q ='OX#@ύ,/|G(ז<+,7I5I# 13i;K@IFJDjy KBH^f&c$9 Hs,m&)4dF8vIXMp#rma;fwIНgUlO211mR1(FA0ڷF(D٠ &)1a; ]4X>9P#d^Q7;~6 Fphhv)qB&4qªC^'t` B}EXb$#aycDQija:aIzY{'h7=٣tdo٠Aѡw0G;4"ѣ2ߣ>TIPLzH$&=6=fcVъP#_AuFsf1[:ɨ^w,Crm@Vu6`ԗ~4Qg~A^h}1fQE`Jm T@ ^_$u)S%cX)ZJ3'w'IɃvO P5j:59ZN&fypSV鏶11z2@3uPL;ED"H͠3:@qZ0D8w4h P D.UMV#N=O٠G8EtQ].wy` Ml'1r鋄; ٓtfWƻ:e1S2{r;}Mf`AR`~VaHd<'hzMLeR5 mLrh R#}۬]7:bVgnHu41 !Z&f~#g05Cɘ$,3-6Ad&VqAga*·1^ڛ3bY4v~ʮuPj. &6F혻A?K ; ڲH'Fdb3K z`>M q҉QvͅS ēYʵEbPp0T+右ٸk\"J'.5N$CܶF`ѬO1u<#3cy|GSckdz0 f~Aޖ'L{8È";A'iioЋa'{+HuF!{ޠ?2d=Jw$atvaH:A68F-3&o0P#ɍAr!)fUY T:#MArI)g.#: a Mig>bijZ'5U**5CCtlM2eX1g^.2lbK?C4j19FiWgTS#Lܩ1z`24v3}\\hUPTLx s.=awA.N v` loD7rڳMj '>sdU13ǔZ Vq}fqz(L99ؠ/'9X8zk\b\"`FݠmұCFl$r{m,?pf$o]U\`s6Ιs7S%RㆽA/Yb!:w b2gq$8FT6 N)6:VA' Lt\&<*fuwըH4Gɹ5z9ՙ4?x~;f{'TsL䠻X@+4Ief&يhGqQa,U4"A2 JPn o_iP,'8?z~\,E o'Qj15}=K`v{x)@~A2H`TAnΏ1y3FCS!GIisNM0ӬQ}?P6aPx#zmQI}lx;\|In$0&N٠[LA Ǜ^X;mԪ4+3ΌSdEˌ]#Id"&L^}̱>/G:ݱՌќ蓏9~*Le Mҋ'c,$:bS7%7CHz;;jGklL0Q21f)&\ Rq\ 1#A8utbvg=5l8flʉrD Bd'9{8 'h%7 fm;F\=<ݩ,h9B41Pѿy$enwnҹBޠ_XCI039}V^{^KٌƟ,&gaUcXy}ǃAh&z.XhpA?Lĵq^i}C{ɍ#d4Cs\[#Mȟy9E>ɣlE6?~o6ao"aR1`+&ݼ}ܒū0`+T,ɕ$dHSp8~Bs'OSqfag!=nƖ#XIXcIM){q69d♙9P-RL:7Jݣ'{fR?ՠRYM#IIM*ĈOn3/gaI2bD*>یC,!9īw1db]{~PНgctZIl7{0X;bUaStT)6Sۤٶj*,p.q <6.nܤV9{*輣M=#DpG{nu|2q$C2Y77Ǐfy͛z=z!~'~wͱ.ׯ_gnn;_)E\VQ.+x NI0^I G\5T b0se nI@Bʿe> @ ׈xCy(v栮ړlŠ֭q=:eN Р -qw F"5P["l)\US0┹xuq2\vmrԆԊX\.ߕjVJOr'[ϒ#.ruմp2A5TBc)gn4)0a)*Jܝ>Dz+y eNP -<-yK3_DI!W+2o*JJ8)5(WC%n9dP+2q1O( E!%qk4+TXJڥ.l++*w}p_cqZ_ lr[z9e8d ˓{ݫ{P>ѓ{ ދ3)剸-)Jyt[ rp-箏l@%x!SA3ŠWsn0()ߥ[~ԼWr7xkA;R>\7HC:HnK -C\_,M%nB]3ݮwwpʗ_fi[5P D*|nq]v 8>/;1S2k9E|oP`a)1!s#I5.ۣ.rG!nCkG7 |+5ɽO{n[sj@O[V*P-)ƛ 嚓soayG3kqr%8u7#};}&Ǝ!JK}r,L!< Kx5\YfC~|o9|V u{ᔼ+8甌oSBX,-!jO}-6G-onml^;fBX^uiY^)ƒ5ȭB9m<\^(%S.|Ç>|_]^?p8??}sk߱m?HA𲶍DM"t5&@H$: K!5&%:ЅDMhRK&5t)(#ф@44!ѤD#&H+SɡstwItM8וhBG&ѤB >GMe)$ H߅-@μ$Rc;ꮼց&t[r]8坧 I@:AH 4&$H!>ПRt$mbIACHݱemg)j2XҶ.$ GľԤ-=j dБB)5W2`[$}.ݱ=I:BJ&1uoMBxzѤ:RЅfCsǷiGhѵ{ᕔH] un[9\N e!E),4!8sդx.4>͑_4oMj_J/ܹj/)\q&B:7{qum]W 3 t!4l [94#%5qYGs#/KMN\_nR$^pRI m+;V> (w|!nhݱG4Px1F8vg@H3_/^J~Wmpr㔰m{a_'㎩!1t76NlׅYҧ4W:z|䖀9gL!,Sw:uw}A\$%RwpBN:BlNC҄vם\m[FI۟Д@ ~h^ε3]HtE%5vҎB +3i^\Ԅq=hH;v֍3A!vܔBs Sw+&쵉siԅ$s͙pEw45+7Κ咫;!u'鎾= <mb]tµv\9q( 9?ۧyM=] r9kzN?k$msM'v1&a9~*[s Mi]9YᬆYQH 7qf3=]Kmo)rn\VH Om9_og]QpɽrΕ!uij}^W꠻ؙ&A4Gz묕RjH}k]Ƴ׊-þrBy-;8Vnn|}2 5XHWgBOqRBx:Ѱm$5:aI\gtgOcpRګc/'8~Ne;gH7 k+) _qbBr»Ru#om(<;{w!Mtv5uhHiWA7 ʌZ&x5eLPX\&ֱnʬ) ,v_/-si'^MӍ-@c&kt zUbZ\RUeEvEKh7Zx_IlrZU\;LSh4Ҥo7רS rMһ:R2&&;^zb"l߬I&11[)>[ byZK&[D*uTX5޽u&a [D[wLn.9F^N4Boe~JfXꦆYh;Tf[%g,/t[=6/@X_AYO"i"{E+DNu hie8VɴL,!EY#ExJsiӢ͒_R-=4C0Y]\C{3CteI[z\yךezkhWdTnJ6_)rd[ވp#Q$N%ZW=Kmj:[jJ:.-H^`S[Ǫu[=VG4Kl˼!R+=Lv*7YMߤE*Xr=NUب/ٮǨn&ՆI5ѩ +Xf(q)SAQ&;ޡB"$k5j"Ϯ׸VcWC6^*bE1[ nsHfq݂dFBnhmw06 /2ٗi}nR~fuJ.غF׻$KAv%,W^M8Wжd#`"4PME%3 BATgZ<˨NW371.)+\mP}N &fJ"FJK4rgT-%f.mSUx>-1Y#׭^SK?IJr +Wk)2l5&5+gX"Wy lM˰U~usp&˯tK˘z%L]ed.gif.ͽ]&WhW4UBʵ;M5IdH0`F%8stiFV["{)T%ٶr9.MR~5mf>ŋ\f5I`FH;C0Niu7S].s*wEAh.vF{ MDi1cy*L Qm*U%kS$ӵ<%.UVW)nlKK?u;!6+)FԾVkAkuFS'UBWv)dj&N-w;\nJ! nShӔԺOlZt~mҹ>XņrilF'ݐ4^Vȵ,Yi0ȶuoTȮ]!Z'mUM5/P_'kFt;+y6W)R(kD15 fxQqf+yMj7sg)k ^nHe^T`j\M+ {g4:~bS5P(vil 1Φ)aۋмT6 _W\_ZQjH4.eyUبo߽IRla6tu6.ȲIPԍW0Z1 i-^hHK8+Y6 ~CM05@,cm%iF)CY.j{vaq3TVCA5SGheLvYGSbm,m4PX΅rˋ)Ita>DPY[F;B *Go]C}ZƋnXj/u9 4+A2&MCRC+$3e|T} 3%Z"Qk龰Lz^mJ+U͗hF3N?L{Bu|N“2fJBuiBT ZRE:;U\e*K;dLI:r XujXVv|Nev(TzV(~[䴳V4=MuoPo.ț%d 9U"%=7VZ1Fhwv\=FbZ s,F92Wxbj:,[giأEgQOgEJz=ܣTcArj9A:69Bk(fwoBHԴȯdlQgLfo+̄LtWMgb&EAL".7kmpxc.-z,K1*`Q.RA@(a2W*>|Ç>|gA)E<@ /JTUݣ$Y/31->|Ç>|o :WJpsOo}Ç>|m/>|Ç>| >|Ç>|mÇ>|e$;_ܗ7[;@ Y=a2uw/m5/p,#qʗY3(kl+U(CD|o2d|"_ A^e}H RhnJ*=*ĤڰFƶ)A1[’ - ("nc,H&$-b+s FWFRCkE%6댊K>t%IMJ/ Af\GV3Qn$E5|+I%kloÍ &5yD3XLyMT ɳb٢*Th2LOPGUgH4([ Æz !%Bljk5{mfF,Z4&%D7&5΀,:IjҨo hXCc%|3ŲC x ECVHaTU ] 1RCRF)g]%%f:j$ňYlj +Q:vJƘPkekIg 3H+ΰW!S4DZXAt>N_g̬LDhz)k#Fq)d!5 $-F4FʷHx.aAj-B9 fK| )md6r,ǰ$)alŧ21Tu(LZ | ĉA j5g4"H!I.aGettçbZ^+# : H.aABo`hq4/٢ADM.>X1d&ZSJ$HM@T\N_w)ȸM)%ら3-I5o9R!@JKU|&ChVX$1o@`H'&,FpJhPz+߲(3hQWF ZV&}&}~"ELdja4dIPOdtH |i`hz)@B]fLk` DF&m[-OY&XfJ6Bh>X1wjzOsbbvf`b-A:Q6PCzR-˛56EXшQ Q]J>daGH*F2-9nsI R6B8G0Kt\I,TXH Sʼn-"Å>\+MQ"Րb6A]*i8}QnjkT,k44'D,#UI+IaDSHI5 d*ãGnǏ#y[sQS$i1([+e,?7VC aiLb)k`DMl'M)Zxx)KsEvhD5VfHkY ULsR:NZg@H,emf߉_">s1SgSuZd52.PZ 5%jPKH|@$C!!$j:XD5oKsC4~ G3h1OOc4$#5 g-2ɒp87jt4uL#iFbdjQ"k:XII5k -\k:#I(nH։6"$5?A Iil[p kE`SF+bWDu~*ZIB60ӒMy + ZЏUd8BF)& 8U""n#8T 3bO%GoFIx.NTF]K" QHdiSmLnS475qYfRMG/ MD, 3.HL=Bt4GThF#6Ɩqk1p -I>$0qdC+qtC>!#W'4~dDqb)\C#" L5Bn HT Gm' pceYIx h$hϏ2VpE*N6hz*-|>!My8R#nKb$ҍEl (Cb 'Sm'.;:aӪ7ZXv="`44 GqD(;< Տ%bzV7 )M|!,QO2Mf,"mVhR0CА&RT)Z ÓhR<XbIa12aiĢu(I?-taU`T[FE-VMZ5fur3غA:N:H-",hՒOֈڄ}@zV!ܬCHh tX%ʶjj mT0c: ]㻮yD 4HM vxˏT]'h4o}eG~F~ON1F'?ɎOyp,֯~{y3v=7ϬP7Oڏ͔]y ?8 rXED\5ÙWɿ0f}OBGvt*f޻YyjG/9>0]mktVy: JY>0LC3'nD9Ɨ~vsޯ1}'#loX2UE??|A~OOMSx՟P=v Y(Fמɝ9zQ9{G=09?~__% C: c/y}Oy密ogN}q#3ɻczg_u‘{~gw8ι=DSQ}~~c:hyZnƒ}/'7/1o44W{ǹI `(;.4=57Y^]~2dK+%<PEpt=痯%7q,6»+ ;"k_a7>:™1>?So7=In3y)?gvd$@q+9>#?sКqb0!xdDi-o92"$8,;>O]}3_;(_ﺁ|bOp=ճ|r>p̅ ՇFyc?9q~ zヌ.F5 ]8ѳ_nDp?_j]`792?w2Ͳ_ݟϘV߬G1s;<w~6/'dR_|HPJ `N bSJ.yaG}x} !?ˣqo8{|~vj7M͖W?͞qCŶx8"v?;9z?# Gy| };hr/,m74?3;jIn _K~io/r3gӿI>4ɡoĨ7xV|:wi[<_y|ȓ|=˕?l_d?5|~#7qtx/n}3Uܾs㜟S+H#qNaz|ՏܼXrg9y]~m2'Ծ~?sẀlj䓷M_9 @uy7oCO;*f1?a)[_l>oy#;? )80FA!|#/GS;hI==f?|[wQSz懞^ࣷN,(sEVQeZ^@Z#՜|jW-r tmvU8Ql^>'9#3hGx) $}eѾ$M><>}O}'\qyqa5IYڦtVrC1$?z8oy_}?HnJg,y\v&~u<ף?{-|pE|YI,[#oC%x|SF܃@"Fl],n_'~e&Ȏ]Lj[qX9T3d _?Üx/hgyz+WĜ͟cM_GKiy.9fJu:hƢnv?*x^ƍez>IDAT7;\,̗&o $\'sk^ؾm_cd*Ş-Os&o,vEc <>ض}=ǯ4>O`Go==}<ܛO󃋇Y3x4W~{&F6Qz^}_&u"~: -G;:F'HXw]$M'W>ͣwqyeO?Ci4lwї̳g%sj\q^es-%/-0=I_ľqs?:TfG~F*w=ͅ$OwR}??br{y/n09x?۸ak{y.rS?oe$\ /e&cX-GJqql:y>"!-l ?ppm p4/\tZ`Ȗ8HnI, NieHm$,+ky^mf\%Z`:Qvp1Y4e!6nǎHóm,KB3],ߧeAM <02 p ",6czN w0s]t1h@D.M,3=iKl۽K p- ZXF&AE-Vo<q"[ec4]C65=l~ö}H'gz8vߖMl\[t=qlC|it|$-Geq 1=)0- }\+IZ8N^qѷXy8V@4cвBtib>MDZ=ZnkmHs]<',z29xM6gYng<\Bso8xMạ6w\DF`B\d`a9 O|mZOӑخkx4]iJZn-ݰn,W#0mhz'- vx]Sl,:c1i& qpl[ 0Z >a=rq]n pyZOڲm~;8x/\B#CM0B"[!`6ϲ Zn3¶7hY-W_bY -m׷0CrZێ+Ahr}ku-,,ųB &Xa.N c01=00&[AtCО]|um\ 1}`-.Z+,i$> 0vHl>-/Z+vǰٲxV@0Z:qu kj8CXG gp,lƲ[^=$,Tsņū37|'6Bl׏ m%+h\m{Rꡞ۟k!2L"%Hіq] 2,m  @h~A" Hv-ڟ!{RQvlgiMU%Z@׎i_mBI;ٓG,_|:U }~:1Zx]u/ku>=*Xݮ,8%ڪSHĵnr_)e @qѤmggub5%ÿCc wX֓ 8"$Wx^ʶ#MکmjzH;znC@ BB`AN!iDf:vzfB{ ZumkXeE кѧm3혧uc|sZa؛l7|bn ~߉zߖk'i]!B?i,v[n5^I ed^Cti#۱U=6/v!t:uEb]8);3hGNo[v^te"ԯkljрdzz~k m{B" cmu耦=79{vAbc[!:EPǚA߭KD "_vbv?z ;ꔻӑoeAzA^v{׎Zِjډ tcja'jG'aY׵' c1"Ѻvcld_ډ+B}enRfi/uҤb=v4Z֖atY:6A;nۈ= \ۂ:]ޘۭ`=u)E?:F:d7Nim{ĺmsUw-}G?X޷]O2:c :c=.[vqw>o;>I;wl 9qoGL(X)@hH e -<;hǫ@.%a2E~Ԏ0uc]a0J }%v_K6NLvGm^z?V`Ewlks[Jq ??m݆i8pw]=zVE\wA:ѣ- (%LBߐ XdLd$~!fH$32Tb;5%tqMnXZ""⮇ch[7 63Cd,wb<>Gn8غDJ#'8ku"Xjn'-#Jֈ,1(H * .UFܠud<d?J2( ghlIJ2j#LLjJfk*zc֞eN};aU}fxlF /Z$0,JVI 1>CY#6h /\41,VSʓg SQJ&Hn9m7l ZL+`NٿqvyoL\PzBi7ž*Gh&86涒GWh)v.5⯐K 0ZFYs/qř1 •O%vSf-:vkP@?-c8<6{-p>~AC;r(##SfLCs [DHޣ2BY] pZ 3ȏ[+$D} b4v}HNYK¸]bIl‘QZAk'{Jx- faF[Zdf7Qb.F"Y%#H3F" o 4Y-lҌDƊ &Alopzdt`M xu W c&`zH><2Vi߯Q F6.%Br0|b-K5a$$ irn`D2=4Le6so_f }p1=b3I֩cɺ`*͖EjV#'y1f*yat-kMѼ$Y81$[E ɚA>|,i.4(9cQL3l8'Pۇ!<*0O"^%lfOsV`!>"&4e-*SbQEXEk$3w)Yx)oe0ʹ12Հ пbpC<77jhI~![ Vc}$|T x4A|+71dYL c ŖJ38G*-L)#2=<@a=4OPdiQMTabu#ceMOLAflv^(Z I52F eLz XD:RE>d5g'A+ )uW55f\#kku*]ff`Ȳ7W"E'038~~H5Ȥ_M2bWqk(fy fQ_wiTۨ' Ҥdk wN0Xs%8Vt3ruYZ)ov864KcF#b?x`gEl݅i=Q h0{N MrjWpٝ+Xڠ^# J. hqƭ r-r@{N::+Ock ܁)ŐL362.ހ]biHI%c(ؾ@VpmF2η,- s㌍FCu}Yyx6^X},frUWaشM>>FcW`oƸ .Cbh0yxUgQ“k#-Z*ЉąIen8IfMw}og֢QL!n8P$&%+},sĢqa?ׯb_c('$\<ɳlsGX.bKޤ 6]c_o/&e(~k j)ny'Agk‚1ɦŅ~FDy+uajp}eVQl/Ɏs}'wɞjL>IR93:˸;6Cak @8m3̬Ԯ{ %d-6\q?GSf'&8y&{1M~v L"b~J_ydžv8"6Ì?c0Rtn~76i{X9PVk kU8m{u[Nbj,$9ıܛڕd!9eb,hB5tvLybZ 7#wM SGOvs`gljTSuD-MPg:=Adfx)Ny[gY>a6`u[=eY3P6F=ÜȣwǛm穁834or?r*O' سR&4'طJN59EJ=8@_h&8e~Sc:Bdrk6=Ù;.R,9FbK ?/"1Xs)l =B>n3aыR}k4r ]h3kynjsȎq"6Q'Wf%ՇqYq7;1ƧH7$8+} Xrlo#wŘHD 9ZJnq5Ήkxq`/59Īj*˫o, ̊6tGw /0?3gF&Xl [3)8cycD+JRt&ē1oRդ6`K QĞ)29} l;LjB!&ӻ8ʐShb?5-̱̈́.iFo ]J#v!.,xnkOY,[D iG2lX+>h{ <7p Ǹ8e 8o2^t(ݐ'{K 8c1eIse;[kd*6-n%AĜdcJwbm6R~ʯ > ###,--Qיapp{~0 nV)'a7 Mݔ)tA)7)B+\NotYy<ٓ\n7. L1?ҎYTB=nE(ܘ֕ Ng KS!}=i=eXO-\;';5n%)rqikayt{zYGQaՕ-%PׅI%M:iW,zTI?ꭷu;YA.N ٺgwD'vo{Ҥu.\)%18-vSc-c'W˰^c~ܝM\ziVp W0M 豷,)Cv$kiv]K բ{})c=\uR vBdﵮ!\=3i=fu?37NkXOWb^}KYmHuX/Ft MYo]v'd./Muo\_d,7ۣ;Il_KL2;tӁm{w^ғ>=Wu)!:ݛʿ~ϮvmkR5+M%Z,{qr]NlĞ;S.3nۓ~zpov؏ꑩOnTu=obZN[O퉙rciC)oKs{ʳqrʺ oj_W8ѱƺ%7{tT ֽWGLY/}HI;'n@;k\?XδA|:68))/ΆiЍ^KC=;5Sr +,Jv^;h}6&{lӯT~HģN_cD;n鵝{Y-/p~Iҫ]v#`_=cccR)t=q72;;Ny衇E/h4[ؼy)BP( BP([|KtMӸ;RD.;&u1 cCmBm+ h:&@` 4 kh&4@54.Xg:Bh"&tik!|ExiKk_OڿZX6[OmѺeл6=Gёv?hz[{_sHq&,݅ei۵oftAkvB9|˪}+ue_>;g {^(skl5B[zܱ2 dܰ{M]ok7Z]?m}wKZק v߆cg8Las-Qݸ۱@ }CepaG> vLo>ѕwqO]w{[9GO=me(ctbۺ540qꍎʠw߉ZOiA=CB[oi۱'-#w7u|U¿N[uyݶZŸ0IGOk/N{a]k_ks]v~ׄK!tM3 vԾ?tOАm{k^&~]f0Fk ޭ'w{蛴c=uܱN?-vlj0DM2z7n>X]]wuvl]yRۨnM[o{:j't \o:z{:ؕC4}DCݮpM1B v_ ~ua`;6ϮN:?$}N z"lO:-AO}tDc;CҾVص;ю'w)m\j7>XsuwxڶiԵN}wlF{3u:-=tg}Os u: ۷z8D޷Hx=݇7n\2.mNY⾡ثvcznw|J Ci!o̹*eZ,K_e5;AX|s](WM!|s+I^)'8a4$YSDkƉ"DJƫUl@e6t~=Jq$Њs4VR Ӕ/^]<M 2䉶fUj3z3 aXVZŤq4p|Q` <3qZ4u kv2guNF-u_@ɚk .̲fcLSgX.Z9VK p"U.\rĨ4.%vlSUJsrijr$WЃIVr|A],ڗFSIܒE`jX?FSo2U={?1tN ^TT,8)UhjHĢ6u|e m#īX\NbTZr(^,2r\\.r1M3c!X;0lfguG<72혬פMbiiN TK)^Xcs+"ϊu1R"|՗̞, TJpkTruh>x3 *3eL*,8[hiE]h2]:X|gQk\Z('k,&i4`WsL- YP>ꒋʳ\]9+*1#XBBS`Ng I.+hɢ[XcRt}\klAm%dIZ̪3"iή.иpRcɟc6!.S/ՙ2gfE%^昩_`gʳbjUNa.Y ?tӅu^М9r PȽ\9bTkM6S)CaY*%4 5?Bq( szdH\em9ͬ>KtsbU.bL\XhT`5 e8E+isZs9i Vr|ruOj"I̚q<ʪ ^"LVSŬGN0MrEVz~ͬQR]=z%.N/bYʭvLǨ.24j&ESn%ZW.X,qjB2pZΟ\MR(Jhk *1femb8։9b^>B^&`(l/;EJ #ϓJY㹪hh"kћ /WXXxӨ)q<ˬԉZ}TV+ȖEq5fш=y\OT5Kc(W9Xd-w]Z+S yV/rRLa%E.*^V)Uz MZ=8_)B}sr9/h 3\YٵYTXXiB17ё\t U֎ "2ay5 dfY)S 6MrE2De9`9ɩ"3(w=lc4h?J4ԵU$~Db8t8Q yiN,i1^Րy鞦a[u<[8᳉ c @>%Å4} z{-]$2ߐ': l涧D}|2j@:Bx"T_×̚۝en ᇛ`A`S%|\f9\U'H W3G"|/4 ,'6CzH=,K|>H#5t_ D>D \c W;>xӲvx:~c=6t$Zг k4 ]sÉ>Í6 "\Z!K8 uh^{nZS! "j&BCm}6l2;iAD?I>!}߀zR  4ၯ{}|CbA{{9@H<"I W{^CP2n+4 #~8_Am/m[\-e0>hahG\]k+Xvl"c0p@ uߙ'[H#B[փБ2ԡ>j:vtB?5gA{09Nf,лb[V$0ˆ`̞ }͖YR Zwk& ߖ )[މ0 Elǭ 0#"v۝íl&z'Z{P/ C^82p ֡ _B|#l5QGD n[" IXHi[H՜l۴!vYg!ANHv[ehQ $8Z# Duͣ8{VO#mH 6̋_ n/Pz 4 _k@+Bۖ2 ژk9ދH? º2!RG:22=l3]]B_zV Z 4d'۪~CD¹RA DoH"Ai&-B]F}@k\bO'n{ ^NGxa[ H#H^,T/lEIKO2׳ֆh椆¾G÷u1 mOL-:ȈI#<)|=lv޹!=\@aȰm{OYhlCxHE¾,a,H7 ^v6l!}}v?YG.zzBÐaZډX{xB7D 0C@)\a} c8nݨ66%2+k"}] BEnOD%_a۠lUxFSA <~OӺm,!"}4c/&!@:D: OrMxBGa@}h d@`[{F5 ;xA$.\ v&Pp2LM$y }<]v6|EjDUץ_KO߽רT*etO݇ WV< 2y;2}hBP(W^sZ ϱcرcajK*)BP.kEn !N'RJ}Kh[Cz}o=q"N<ɖ-[|ͺN{w~Mi ;AtefT*˲bRJlڌy|3}zy*{tVE4 t]=۶l61 d2Z8D 0Md2ٵFA,#`&if0: FGG7PI$Z-$eh40 t:-K!kkk,..rKKK=zonPTfu횝BP( %گƫ}|{gϒJ,," l.h p۶uhZH)>l0޷O6I<01jt]^wĝ`6RO|l޼yÀUJIT"7 0gggG>ŋyٽ{7aj4kԉ3mmۤ@wP8O<wyg\!j/~رx<2o^xN"4V;wb=Ǹ馛d2lݺ]'>#Grݻwk!211A<'3} q(ɟ gϞEuưmN\ĂN܎D"s5l4k)e76:u'Npi$l7ͼ ,..Ny׻şF<{ǏST`mmgϒH$x׻ũSD"|3att˲A9<[nmo{wt^og!ϣiW_}5]w'zud|k_cǎR*xG( r=/}n_~{OH$x;Ͱ Z-x{Or W_ /io&ᦛnOOy;S{vӟtח:r.t _r7+Dz,vW_M$a~~'NtL'$8'N0 of۶mwd$bH)?=Z ]9|0_׸X?̙3g8z(㌍yf'>a=!NS*x饗X\\qp͂3g裏pS,d2}\.vW. BP(yռH$ȏ0;;>1^z%}QJJw޽{yWꪫ9x ܹ_~>]f۶m<DQ^~e=Jբ=&;餦_)E|jj]o>.Ǚ_:"y7Iܹqشir{EjeVM8}4[y,@J8J%::'җDVcxxml޼]vQ*xVlٲ~'OR(~7fE 9tsOfttw9rbC|>xr/f m۶9+ BP.x o'|9::ʃ>K/ę3gH$ur'u]<#1<o~9u躎aq122BXdddzI۶sާ `O4d2 v㎦idYsc6M7݄Wǫ'adڵkCeYc;-wq㰸=/fffg3O311>IFGG/1n6|xG7 111>K4СCr94Mcdd!_)J躎i@ߙ$`ppl6K,Gѹ7Н>Ыιvɓcܹz>OS.tBP(t)%O==b{oVVV`ddBa sN\eϞ=pI^z%RRJoޝ9qv N300O>DZmns/s-sN_=?u9tig:}}} RV#e<Dz,$wb:tW_}5w߆9(A@Rv7ə3gػw/RJq)ڵ uR{ny kƵ^lڴFjb18w$KKKl۶kVBP({^s p]MӺʆalXӱRvI.};Y+L{$o|;@;ot]v;PuջpZoMX\\dttJcGJ,@7ݼbLB!tT)e8ۑ WP( 54;tt]0tӻ sWҷ%NgsmSiچؗv;Ί^X a}Λ)t/]wP[Ͻ=};n:CŷǕVsXIU(Blݗ{馛qwJ̕}({ǥ7+ BP(7߫Z?{y{PI$@ *Rl겪8{dv7{l6s7̻3L$&N-ǖeٲ^IEb'{^?<8dGb  S~ϯ|Y^^ro+Wwy~?׬l6h{oT*{<煨9\YY'kؿYx: Tr~?7<Aw?b}߯|X?|to{q/*'"""""""""05EDDDDDDDDDDDDD&DבCh<ܐXz"""""""""""""""wtz6U,}j/^5oezAPK&χ|~r x7iIV RNFVP+Nտv;VR$00a`ee\AAA>%BCCXpۍl&,,쁜_F<+++tI *H8sS7߲%\Szx ~L&:*6dw˯|OaI Y\|>^Tl6_˗IHH **~|@#Jك˔Baa!'..^|>j5JE222P 0;;KBBFχ\.ٳ'?!55F÷-^y|M~nDnrl6#JIKKcpp͆BrqE*++immG}`fffPTdddP(ceegiifIHHT Mff& >O׿_fff{/o[&&&8|0,//ׇ$11R?`N?4D.cINN&<< jT*N'iii"ˉBcpp͛7}vJ%J8:;; EӃBdxx\D"!99Çsq?;vVE6.G}aV@JJ Ν__|477cHMME"""""""""mwxhjj"<<zii)CCC͡hX\\'^㮮.^~e&tfϞ=8N|M-~w]v7 ~P\\__yfO~BNN`2׿N||>?)MGGaaa< obӦM_)Jco[M[[HMM??HOOg۶mdddzyW;oWUZh.\@CC?gS[[8N̿˿~:::7333\t,T*h,{]TWW//Z.FFFHOONRSSq\ϠP(XZZ"--?OJbb0ۻXxv;7|OlH$BBB&// mFFѰ}vt:4222H^/T*_*YYYX&!J &!!x gDFFCHNNFPFnn.B1/ݧ>)vލ`@#ٿ?deeQPP@AAdffHtt46mY]]Mpp0|ŧ>)J-oF``  T*!!!<ƒNQQdeeT* la u8@^^6 ^Ojj*+Wdddvq8VD.&&&tx Vt GFCNN7o?33]WA9ٴiİi&Z-999Knn.ŨT*Z-_WIMM\DDDDDDD}b'G"m㬭P(p\/t7 to'L@{^[[C"]"h|ZzXֿ4+^WX"""""""""l6Z@ %33vjbZ՟c~~JEPP}mf~~Z} 2V{`0aၜ_Fn7sssVFz0օ_y^vÒm~8NI[znnZqDFFO}}=+++DDD暚|h4FFFC*Fkk+uuuLLL`0>"p,.. s˅BV %<<[jBM& 555X,X[[nj5!!!Hhh\v Vᠢ.^/ڊD"A mx<҂JBR\׮]cyy(穩v _tvvjH$TUUaaaj<00@?r ͤb0fbb,..k.`^VVFyy9Vnprv;.\@ӡRtMMM۷9L&KKK\|-[000ѣG1 $&&p~PPP2YYYDDD immfq)rrrr._Lxx8̱cxGDPUUZF.sIٱc\xRIee%7ofyyU^{5An}gffI{{P`̿0fzzzᴶxBBB`xxN'?L7[ZZ0TTToΝCp%YYYaeeǏS\\+D" TNcuuFٻw/ t~L&dggq\\x*;Yo{^zzz U1DEEQSSL&c``D"""\pׯsV+Zq< 3>>NC*Eww7^"""JL&QVWW 7?ffFGG pN?͡YYY9$ v222hkk6޾777Gss3V0djj0^xejj&&&}Ar-o7GFFLRd2Jbppd2'N$n7BʏkkkhZ!"_~~^r <쳄`0fnn'N{ϝj1:t.پ}`/ j\q8Nw8ݻ??Y^^&,,C*Op8tb4?o{{{1L|>vMsspA(..RL&Z-)))|gaa&!peN'###ǓOϑ,|ܹs SPPfҥKh4~_r!Zd"&&h$ %%%tuuJgg'7# /TUUqAN8Aff&fya,V+կػw/2f>ro<(-[kQ\\Lkk+F6vٳgguuUjW^!::WgO<ŋھm6m>9j0T*=uO֠]s].N",,{r)f3vl6}o|QVVƾ}wKBB:W^ /~!:^u(..~HԩS|^kJ?~B"$&&k2GСC }p\ܹ;wr AcZY]]mصkVGbXz*[la7x'#=='xev;&">!!! VNVV vYXXx%n7gΜ! 2==-[{^UUUl߾0:īJss0iӦGBB'HKKr}>aaa|fΝ߳~QXXȇ?aRSSYZZbnn5$>>LℶAAA۷FGGiiia׮]<ǖ-[ a2HNNӟ4I8tLMMm8wFFB$L&0t:FGG`llPF#LLL0??/b''':Μ9CLL̆wuuuaXlttt022###G?"((RdttAL& l޼TLOOIoo/ƏcP&غu+磳S𪮭rHLLDRld2100"Z-۷o'::A(,,>OܐJ(JR)>'TVVD"A.#J~:xP*,//300@vv6:l:4 gΜ!99Ul6VWWqcX 99 "##ٽ{7fH^^M☟q|>555,.."ˑd<44z?SSSioo1 t:!:ݴvhp\477c2z}ygffBA[[x^ʕ+H$!_V8B{d22 Gpp0!!!TTT܌xnn.ddd}hfUXX999DDD{nasKpp0LNN Brr2Ǐg۶mw<'( Μ9ömۄc D?6JKKl$ ?6q~iBBBH$X,f&nppѻEDDDDDDDD<N~~>yyydddP\\Lrr2F Ojj*STTY\\(q#++|!u}?'-ɴ˩`@"000hDV q:3::D"ARKaa޺u+R^R)Gm!!!XVbccaXd<.gee0۷EfggbG?Q$%%mo; FCLL ZшNCӑ``ӦMl6YYY#::HTT. IOOGRa6ٻw/nEF{ĻAG EEEnxLjf*Λf||;w i > ! zGjj*f^Odd$c0݉-IDATlS cbbbuu;MLL 111)J"##IHH 44y233h4CHHBZ4 Eؼy3AAA,,,cNh4LLL̆MEdǎzbcc && ?554l۶ @~~>nyVIJJbjj Kbb"QQQBdeeJ%xr`~3yע7@"IRR!˙%<<z~=y@ tnpۇC"t_ J|dÅwNaa0jy[qֵ}Gs"""""""""C"lt@NS00ߋnZcԄ[59fA7 |>v6vGwNϭR|_\.l|>VVVr2'"""""""""/$ v%{`|>[!R.Jo9 qzDFF>PT*ש;WiDDDDDDDDDުUu!rOˇk<;F*|w 3|X,N}z<۾[sp85ba{oݮwS$Z+ܭyr\|ޟ`6( U?/Áb| r"""""""w;VqjL&v իzꨪbdd&''|2&`d2/^Ntt48q[ajJ6jjjX]]h4DYYDGGc6JVj„Vr°\x6a illvillJZ$TF#p8 \~VT*&L&z RroAoo/2aVKpp0===TWW d2 =zTbv+++9rMu;oWTTjRX~{D__nX_|;Wq7p7oի] fQUUFaxxxȑ#ml뫸 100 fimmh4T*iooٌ`Ƹa}|>*++ iPss3dff7Ayy9QQQtvv2==^c٨$((Httt(0 Q%gΜҥK4uuu`۩/HJJҥK bѣp%fff6(k>~iD^/̩0QQQ˜Z,ikktt fgg1 LLLPYYQQQ3$v;eee455ՅN#$$ǟ'شi\zF#\FFF 2׮]CV̱chhh聥JKKy VWW)//ʕ+f())ڵkfzzz()) 9JJJhnn񰸸(o83<D}}=faffNgg'}}} 1??OCCkkkº,455199bazzv;555g%Ξ=$=zv]P#y7inn6r8wc~~Çxr9:u P2""FÙ3gy{l6SRRB{{;r8}4k\.{9v;EEEw5 CDDDDDȻ#ۇ墫 T"---޽BA?Oӌ200@dd$x^RSS fDxx8j_!99<|1w\J*r!QQQ8p7x'BwuuގD"a ̰e|>AAA(JJݻ'xYjjj{<JKKqݘL&IJJСCTUUP(hZDv%l̠ٺu+OfiiBjkkͽv)))a߾}s477ÇO~BWW$''#[rr2\zyAcyTVVAbb"DrF#ϟ'//CvvE_YY`_===DEEp8@R111A__wmqwtt`XPtttv6mmuJRzzzx7(,,dtt_|^vڅlѣe||±cWoAbb"X, ߰i ߷oyyDŽkB ҥKyfn7333ԧ8O,/2111tttWf3j|d2Gq! $$O|RWWGMM zBH$ӧ dӦM׿N{{;z^"22˗/LFGG߿'O@`` ׾5PT߿Dɓ'fQWWǓO>Ɂ455!H`rrSOEkk+ Pq8PXXeP|>BBBxGiiijDVVse[n133L&D>O2yOR믿``Ϟ=\<'s6W_}L߯ ܹs| _…z?~4'|'OUUUl۶!sƲg#..$iii7V?Ozz:LLLxx饗8z(VLFFF033 x<XYY,.\@jj* bccIKKAb9~8I|OOHRjkk200 hh$$$O@\Ύ;eyyر@h4־fW^!##-[˅ H$tww6|>FK]][nܹs\.'55/i&Y\\$11ǃ^'..AEcꫯrǦM7AHH픖022!޺-..rid2###LNNя~Tܑd6#H!55TRRRjT*III!%%  "lphZr .ORZf׮]DGG FX~~755nJJJ`zzhhmm!Oz=x^$55۷/~T*^/ jz4tttDJ<#T*, 6 ˗fee(vڵ!lvIJJbnnz377իW] TJff&sssƹs稯fP(H$|>EՒΝ;1 TUUrCA1Ebb"AAA455DWW̠R BFee%d2a=~_kEjqEtww:488Hkk+<3455队GՒ)x^m??+? b޽ד񐑑Akk+ 9vklldhhm۶ kkkrjjjCղw^v.z d߾}x^, V0T*lh?W#GPTTNp8P!qW^A&@& 牋7duupFGGٱcBMM /_&..Z-C*}Ajkkٺu+:4vލRD.t:$==*yh6r _4662455111P(p8x!VӧO sssBȈ2::,EEE?gFd%i^C*@\""""""w,f#**J䐕EVV[l!>>x8p`,--}vX,LMMχ>!!\O.SO jl60xKB5Ӊ`@*233CRR!!!n( Mnn.dggSTTB`|| z)j5RT{poZ?Rdppj5ddd033Cff&wfeeJll,^(<䓨T*n7iiioR^'>>8"##1 ¸P('55%, qqqhZBBBh4T*r9Kއ?abcc0FƒB~~_^'&&xaD )DDDMxx{Z"qAAA$''CNNEEEd2&'' 橧"!!L(,,$55jvINNt",, DB ,,]ĭ199Ivv6v"++Ed2)))!Ylڴ%$ dggDbb"7o0n 4 >(4a ""$z=kkkܹRl&..xF#"qjAѐ2ݎB`۶mT*1 \.'22R0>>NJJ >p{mڴ%55*D IRڧ "33ShwZZJV֭[%,,lCL&#**;v^46mDNNpT\.:t^Ott4͛q:رCPMLL VUvt:r@턇$00Pjx<3dvvTy\.P,'11|½a=i pP(:$$,"##Z|&44r9b8HdiiIpYvmWr~-tMݟn:v^z;wL_:SSS¦σr w¹sb]7of˖-inbSS8p` c@@N5l6{~+\.n[}r/!""""""DFGG'Y]]ETސ{"qgC~n zw,Hp:HR!~Kӟ4JTz~џrl@n"Hسg[' }KsNjj*[MY_J?{YMx"فn yuN28sݎ!ۿPޏc#H_tbX:~J$!_ڬ ȢW$ g˿f$|sY _%""vnK$dD"!W?7Az%}NE-l NCZfot}[H?Hl6X9&x^˹E8·2BJσvu;Vq2fgg1( \.%%%qgg)k0ʕ+ (OҥK,,,T*PnSVVFKK  __ͼraqqsαD||<+++L`` :ׯ rY'Npu<:*jkkx|͛7s%AFoLFSS파`Zv &IDnlld``Ccc#& ^O[[o"$$k׮Mxx={i{/7PTbY\\իpilB`` ^gϲuV^z%bccikknJ`` LOO{n@k_~ׯ/Hܵ~7ЗHVVV(//gjj DBUUv5 SSSTTT0??hdnnJZvjjjdnnZZZr!P*1<< Rq:0>>`_… $$$P(_3>NKKM캻ٱcO>$SSS,//`HR'hwލRa49t OQQ†@ww7lٲGHH*J0Z4 $++v)//giiVQٳG(@xx8l6BCCe֭B1%Z-YYYb6jzo0F<ӟի9sʉ'0L455qU_gxx^xJ%x᧧9~8JP"""8u+>墪J=`vv*ګaϞ=V{2###jM={Rldee beee,.. k/j+WƑ#GX^^RQQA]]HR?1;;˙3gx9|0/,--W6mB"PXXHtt0~/f.]Dii) DEEQSSd_F&QRRիW7?^' .^Hpp0Ǐ/z)--eddF?<555`4y' fttThѣGY[[cnnEee%\.=JYYh4o068\.^~etv>J._$B"wf킾ȟ1v;*޽'O277$&iE&WWxQ\\T*p'** \lW^\jDGGfyyoNDDɓR|<<\|Yh#>>[ m۶ )dddp!l6fH||<šV9tN'O N:vر!izzuVP*L&b`8pEEE7<׆G!55BAff&[lv |l fNL&<|>o٘СCܹSHl6P(HLL$))FfggoͷZLOO t:IOO_hpRae;Fjj*;vxЗC)//' oN^^sf_duujjjx"sssŋimm%66\Z-ϟG"ܴj{AAƒ;44;/~Ass3RYf3A__?яcSxLj^())nYZZjJuu5###<#P[[KBBSWW@Ph^줧\N\\J={\."d2\.߰)̤3g0??sv˴QTTV%..m۶ R\+ŋj&&&P*d2^/nDBOO^Z-FQ!QVV^˗/377BR6.x@TUUaP(SXXZ&33[˕+Whjji!+L&2vJTΟ?Oii)VU, =ɡ 022¶m !))iCX=@PPEU( 665g>ɓ'ofӦMsILLԩS- \2W.oYyD"=%% N:e2,H$BjhD׳uV>,H̙3477!lHQRRBkk+>D\.Ҏr9./---½xv޽{ڵkm~N8ʢ7|FN֭G"Jt:pdee  11grUrrr6̱vN:E]] k&==)Μ9Cgg'n&N8#;;Nyy9µoY\\䥗^rZ&112p8 ۷@TTA4 B*LHHܹs\rUfgg9{,Mcc#B귿-UUU( e+"""""P YZZ%`fggox0F2 ===/ƒ%]ѐJbhhA2kn6, S:??J[T*p\ ^/"m2ڊT*%//R)3??OHHB(͛/--hزe L&!saaVn7$$$ @~~> 100@DD6mB&1??ZFR100@\\HRBCC 88Add$ LLLwVVVHIIbՅT*'$x{{{YZZ"55UXe֚z!e222evv5a200@BBiii|>aDB?rRSS ::Z+ z/\.0 LLLk(77*))),//QQQ8NۑH$z1L( t:qt:nllLHXYY! K`` ---BT׾5f3qqq200 DEEqu„F!"G"Յb!11aJ%ZZMWW!!!lڴ)DRmbnؕ륧I222 R͛GP$))) 阝%!!d2Z1n)622"0'>>!z=$&&8|@WWN@әdbb|&&&'::,$ 333<3޽HrrrGc@Tb0n:nzVVV5j7GDD066L&#::'Fedd餵N~~?8B4@ll,^)evvwƳX,455P(GV3;;j%11qgWWWikkCR BWxx8KKKRUU?,lJRgcgg'}}}BLL @rr; /* !) @6oތj "## `B{{;>4~ӟr!t:yyyl6hZRSSoh磾^ شiӆꬽUJ~ tG~qtMoߊ'OdqqB׸_:~A b̙3wc``V+Їξ.//syVWWH$lݺ9Äĉ'>ӧ?Pg'&&(--_>߉k׮Q__Rd߾}455 Rx<|uu56G}A7 H$F{1!jr/GDDDDD]3-Mw͆n',,쎋I$@V?E~ _x_PI$ gGq}?GnhݬouŕJPxlx<ÆnR޳x}Ynzx l6V&''PzihhLNNsa_'00ׯsEFGGvsEjkkQ*jJJJMGG'ODRA{{;NڵkLOOD"bBi(*Ͽsq/YXXרa&&&ޱj7e0444j c{^V]wVwl޼]s%nnNp춶6Ν;>rJKKQ*8qB+WfqIt:===TTTЁN>Ο?Occ#AAAT*?… LOOoN[?gϞettxJJJ&99xkm?k׮!n:Nccc={n"##oxx<;Foo/UWabbB]?Wkttt\n^|EtnEmm-rʚ""""""^M߹2)w5ljIZZ׮]t:y8wIII={(󉎎1vM\\jFjڵk͸\. đ#GHNNfppPPԕJ% |M YXX h^|EBBB0訐^5<<{ qݨT*V+8jjj0L\."##ꢴB[[ǎ#""\Nc~~9ommd2 ݎlfqqxKnaa4]]]$''!.hmmtr5f3 Dtt4===LMMIkk+q5z a~HDD֢V6N'555moȪjjjj`ddn)++rׯ_'**J,8'""""N w qߺu۷B:( p%fggrqeQդž={n3Ŏ; E"sN $88Nǖ-[OsTT<:J%$'' WGGVbZ-SWWGHHw&66V!<UUU,//Dww7*m۶# Y]]Ec47x6V+**]]]7p300BܹssիWp###d29Bww7.\ !!^ʕ+W W^a~~9|Mhll^lضm;w$((Vcpp֭[! wBqq1+** Lss3aaa vލ` ((p0ի;v .PRRBGGGESSSCmm-gϞeii89r`h={ȉ'0LJoo/ ;wN^//2mmm477t:tKpe7󴷷z9z(/~ f3\pFëʵkx7HLLD؈dbmm .T*!992dB9u_`0PQQAkk+` --k: RQQkƹs(--ĿgffHHHl6sQfff.--oV %44xbcc9}4 DEEq477sI&''IKKCIjjpk8p8FFFXZZg?ϟGբIJJ"66∌$99H(Jbcc\.>d_f~~ya3oaa6ah4 &&K[[oTj%** JEcc#Bhh(/2ٳq:>pZ-SWWGwwM|aaɅ 53;;+W\ɓ9sR&''oѮh4Ο?/\333={1;FPPϟ5Ν;xzҨ j5?Ohh(gΜa~~^D"*^~eJKKɓ'7ߤǏ Q}/MADDDDDnG%33;vp)&''Á k/EPPUUŮ]ώ;8)HX\\lٲ $ ׮]cϞ=={fff(,,GaaaN^^)))H$jkkIII!22ZT*H__d2\Q<h4ؼyq?l;vGOOM6a6X, r)/o_#|>222nz|5TWWba``H<w&))QZ-[l`0^]va6jܹS= ^XXjh׋e~~ao-|?88HBBB0L322$DDD066Vej7yHV+HDEE{nZZZ4"##蠯O DacN9""Ӊdh4bٽ{7iii̖-[0LOOۅ{F q51F(,,`0>::ʶm%66N?rǃv@^^Ft` >>^OBB l6ikki> ^xJ('Oܹsay駅P*++b߾}tttPVV&Dee%. q8( fffvttt H C"p ތ nwll,_8qDGG3;;ݻ&'',&۷{nCnn.aaa8Nv1 t:݆9_߷hVVV'$$NTT jJum6N8Aff&AAA]P oz>NhhMJdff"ikkn !h<JVe,//ߏV%++EM~UggЇ#!o~~^#**Jd,--.j2vݬ DGGc2X^^&55 !200< --hŽ}>SSSF /7>>``nnNwEnGoo"^XXOUD bccA׳4.]СCdff )zXXX֥;RHNNfee>J%?00 |_&P( Rc#<<4fgg"**8z{{9p8ddd0::,F8n7%H1(sͧ[Mp½l.v$")dRb)#'4frwd.?%NۑbI`A# @@4w.؊?O"JDR> py>< 8Z-<ÿ4ƈ&::Goo/6}6r(CXR q:LLLPTT$Ν; fR)@( N8HKKc~~TJTT~ڋܾ}[xx^zzzp:b0r s233hdllLhhwW?IKK#++ n[xۣh())"BEEEB!zzzg|.338z||d~?r G||>&79! ]u\ϓx<n7YYYLLLQTB!RPo@R177GZZ>bULMM ZLbzzFCbb"BqdƄC$|݋fCPa>@_rmr6пi:aI{<^+4菋TuɩS((( ]#Hh4ٳDžܹsX,Bl޼7EDln޼IKK P(^|G[G^TT?5nܸ B X""""""M|ixE"zя+HXXX@TVRDjdù_$«[BاV(T }ACzy& \.b _BT*?*_~ =6|]H$LOO#J?.ЅE~$ tW7pA;ߏ}yH$_h}ᢈO=~sc? 'A ωo?ˣv}e엧EDDDDDʄmq{ KIqB p'U$}! >džDqNDDDDDDDDDv>LX/Űlb%Gj>pA*\.!}`9^ۿ?H$\.~9{,###T*YZZP(DRR׮]̙3,--a49s ܹsl9x DEE8<ոnӅp}oo/'OSKe ;w)2220L;N*++r ȹsFRP(oMVV#o;vKKK_~q._̍7A᪽-YXZZB"Rhii̙3 444 JjTVVR[[#--v>Z&))v=J}}=XD@^O]]󤧧SWWG(b'AnPQhmmO+Wq/o?>>N__P`0z}ݍbyBz'Np5"""ɓ\pɓBuRaG+A"""7ǃL&CVf x#⣏>gt/]Dzz:ׯ'99zfggyb``ϳ{n=JII Z.j >lܸ3BPbťKP*FFGGgr!J=z 6 %!!,gϞ5kt:^ 77Tiii>|8=qof͚5V?͛7#HͶmhkk --Nؼy3/_RN(CC׬YCVV2C.366Fll,7otasssɓLLLJ(ٳܸqx.]B=ի/ HXniiiDDD^\.u_^:T* 1g@ FGGCuu5555DFF~z!: |455@KK`YFVT$$$P[[<$$$PTT$LC&jdzzVj~\.::K.Hyy9ׯ_TUU1??OLL P\t&bbb8pioog``bƈRH$ RWd/,y())!77DBBBSWW'l_^Ьh4dff#DAzg׮]ugg'MMM iiip%d2RARR###~룥+Vp p\?~\daaONNPAnn.gΜOCCuuu=zt ^6XXXʕ+~d2MMMϑ#GBrY!>>ӧOC^^TWWt:)((˂qT|d2QSSсVZY~=$&&b z="''.^J}}JEEOǦMzZMNN}}}>TJii) 1ͼkBu:Va֬Yn3M\\< l6z{{9w'|Xww72133Cjj*eeeFr?Ooo0 lܸLV+.Xz5 c6 BűctoF"PVVFFF "6n܈Zfbb1L&CYY+WD*"J*@@1f3V088b˔J%VÁB ..xz=VL>R|_6eeeRUUŚ5kbp8HIIarr4V\IJJ QQQ$%%!J _4Z5kZV/L[[o:_5`7o"Hxϝ;w2҈"""""""""wP׿5׮]l6300={سgDGGrJ$ o&>lطo333r Ǖ+W(**"&&T29gΜx<:;;c`ܺuiDZZ\p.}6륫 ō7y&LOOlܸXСC;v\<Oba``Jmm-CCC޽(**" qEz{{t@hq:DEE155ŕ+Wv"""| Bj(bŊP(h_ӌfgaxx"ʨX(kh?immeǎ( '""\gtt"jkky뭷tvvb۩`~~_Wb2~b7 ,,,O||<!4 &f'---466288@KK 6lx`XzQQfg299L&C.Ȗ-[G*P(ZZZhooRD"aݨjt:yyy,,,Rp:t:bbb O*&'''b RSS藈qG J\N^^]9Αڵ L^'77R)H3#+z*¿mذ˗/ -$$$Gss3֭c˖-ǣT*gƍrAIHH90d2 %K?泥Ξ=˾}dggSWW|KuEDDDDDDDHVJH$f(**b``BB^bA*bxX,$&&b4cll VKNNb6III!99O8&&&>fggfj5P>ٌJ"p8yu\B\.tRSSkdb||\`vvxFGGY\\$ H>+ Z$ Abb"CCCl6222P jAA ABB Pi955fCP"B!IOOf ER#T|>, IIIl6|>|>p:ddd`0Et8>>0 <[222B(Bӡq8$$$0==4111w#Vx_EGmT*_9y<{Ar/z_ q͟O"vc0jTx^qNDDDDDDDDDU|>ӱ.DPϽcZq:O+uL&<} d_N ivA}9KKK/Ʉ~C""""""""""T!+IHH HOOGVrx BP[[ɓ'deeq1N>M?999twwNTTZӧOs%$ p}WWGr\DDDK8s dee177$L&;F]]PT9x B蹹9~mRSSq8[\xE233jXjHZ-ǎ"J% `ۍV}kDIIɧ~ʕ+tuuW&ÇЀD"!>>rΟ?0999 rQnݺ%h͋<^ ,xd)<@w:܌墰:N8Arr2K/QYYIZZdffeRRRhhhbϓKss37odϞ=3gp%֬Y墱^z|rss9|0pQܹ#hDk4.]bH$y^x;w055͛x"lٲGÙ3gxW9w$'' H$444ύ7X, H %%fT*311A||<&YN>ͭ[HJJb``*L&111>}B \|uq-A+W }l`p8͛,,,Hoo/[nĉIVVV͛7J\(  @pW^۔p)ٰa$%%ddd|aC}ٳgB*rۉgvvSNGFF}}}>}D ܼyJfgg1p9x^|>PVR)ìYjjkk $''ux1::ӧ%))vv; CCC<b؈#22/騮J^˗/ Tfgg`rrHmm-׮]tP(0L,,,FCll,ǏgڵTTTPRR뉋C*Rhoogzz=\""""""""_{@hʕ+' ر\Y(**bzzÇ3<ǃcii Rɫ__Mkk+֭ٱc]R]Jzvsxs3338p]vbŊ B444pM~TVV2::J{{;ׯ_'>>7ޠEzzz>~t:;w6ׯ_ /Dbarr{}}ضm999\~JEQQ{x V+7r-RRRx/dGG/_?]kqR)s9f$V\IJJPq׮] 288@BBk֬!==d2gbbyr9FݻwKee%]]]HRHNNFPPXXHII j1LF @"JrB~_XXVa]-?%z3??F!--$N'`T$ r\^k׮ebbsQVVlfaaEnn.fdrrr'22ApժU`2dDEE!JdRP(D}}=o_G}B./kFooXi^DDDDDDD+CCс`@PRRBff&fvŭ[~:@;wR[[K]]ڵ*++,0L}vR]!'OäJ8[.4 >L{{` ?`TNEE44īJEE:qmIHH`qqٴiB."Z<QF.^Ȯ]hii᭷"%%EH;w~_# {C|MFVRp H0?FR 59qdeeǙ3g())+4?Rhkkcffv6o7n$22JyذacccDDDG(X>66aժUH$jbZl6fl6F_\\Lss3ׯ (JJJgppPʢ1l6+V`ffg}i4 III FvDD>Add$455^bt:`ii222~Зk4hiiψfffVKZZEEE455188H @p5p8155Ů] P(`"@RSSHHH`iiDΝ;GCCV;wŋiooKãKVJH$fXr%l6 iiiaT*Eӱ IDAT$ &''YXX ..$wH(btt@ pW.nXf-..Yƒl6Vh4 t: BB0`^gbbBfd2 aB1%Bdd$@qR)FD^LFVVNJFall /xh,\.hZ:11!=..Q`bbNzz`Ęf4 jł^gqqQ8p80;;KRRR <B4D8]P q:211e26~w zRRRX,055n' &?yz1aS8T x^ YYYl6!<;r077`j(bzzZGɄ@PnR&''ILLp+~R#|X, z~?\.RRR΢IMMr1>>F!&&Fj3LDGG%""^Fabb@(|rd2a2r9r\5ONNfiih|>. LF! 266FJJo]d2 fcqqtB333GBB9jt%H8ŋ9<ܹsÇKvv6]]]8p*ܹÚ5k\wV{ט$%%'55/e>'NH]]wbF?AN:EBB`^RSS9I||'V+SUU_h d *_2kfffIvonn>: |ᇜ?a7f)""""""""xfǡCr * 0?`deeqrrrظq#'OrMvMzz:nݢ^{?tϟ?D"Çww(= ٬Z{ׯyf ikk# T*ٺu+.?իWGmm-333X˥K׬V+Hnn.RR֯_/~ V\)eJg} .Iaa!\.v >2+WR__=999O{?T8~`ZVv͡C(..^cpp?P(đ#GxihhܹspaWR"xl6sɓ'h4ˏyivΟ?dg܌^w~wA}˗/300fҥKܹFcaa@ ݻt={Fii)匏sNN'N&''Ynyyy:u RJ⥗^555(JكvsI!_d||r Z;w2Cܸqxvɕ+WXz5deev>`aa|;_aJ]]dddpy֭[ǵkװX,lڴ.^eeeTWW399T*%L||\ercŊ$$$033Cii֭[,,,ťK%--"z9)V\Iii)N;&H(,,D& ,!o8::f3DFFb4K/DGG>O.YYYׇ[j*j\|; BSXXHzz:999HRIJJ"33S0JRSSIOO&E* L&6 LƪU̘֚L&φ (++ 233jrq-lقZ_gzzal;::$;;{,..ONN B!|>@@82w}X,RRRC˗/&I0hR OP(N#;;Dv;tFRB@"H\\YYYd2N')))Ft:}Rk;w$;;ӧO'111deel&AzzG sssv$<999$&&ND"!""R^R5k055ٳgYn6 ݎ磸N\\R &!!"##)((@zIʥ%~?`/244}4 Z*"""""""""_]tuuT*h4_v;)))ڵ۷oHDD;vҥK\t ݻ1477smrssyhkkhvڅ\.+]RQ]]ͭ[(++asr9R֭[t:a0p\FZ[[9}4&\6nHVV333]ǏBnn.YYY?qAJJ ׮]#`4z*lj'E"XV֭[ȑ#^̖-[(.. RSSٳgJRL&֭[377R$99;waڵ6mbzz72884%6oLkk+<, r\0j,Aկ~Ekk+jZ`9j5[lBكT*a w0 TVVRVVFffpÁNCp e444+Vrt:} HG*2<HMM}mp8`6)((Ν;_ t:zWr-!JEPP\\rt222TRvq\j233;(JL&LMM1::h/I8]V3<<͛7?SbbbF&իiii@ `|>׮]cnn1rrr$22203::ʏcbccl$''sjkkq:ٳGeObbWr|xtjja+WdzzI0$!!|l=N9jL&v;XB& Mrr2 EILL½]..8Bsssyf  LNN jt:(JRRRZBybbY\\\DVrRRqAxSSSq( j5333~JBꈈRSSx<΢hHLLt2;;K(Bc0F"L&cnnIRR0~fYt/,,cUTp8  "b||.~z=~9X,^/X,N'#{Np8A1 rHHH@ RH< BVN'lP(4IIIHRP(vZ-KKKDFFH$a(>"A"xuJ%Z`0L&!Jx<7UT r͆fCP!22@ E ;|_DLL `N'Dk.8 v`04Ch4DFFp8n/ccc\r"vM0D077'C* ajT,28\.aI.~L&Ptp8HLL$ 1??9NczzZxv̠j蓊عn ( RRR0Tp8t"^ o<ccc^111wE>@,7п o OfqN'[n o}Xn?.5П蟕!녓s_Q@ Rd׮]]]]466b0سgsn7.]d2 (**bƍOt~5EDDDDDDDD|)zg4X% KKKx^YW"UT p\DFFF>B'i!RQiy_g0mG9""">~_x8Q =*a)/b ˉmC. ǿx<$cpȸBxt\'d✈R\yu  3PH(w? ?54|kA]]?q,}=|Oj|*C& B '6I>v> ~vy. zT*)))/>޺u_.ve;͛71,--R__`0ci6ϧ7|RIFFׯ_TVVǺuH$}yo~bbb(//gbbB?Ndd䗞\fmyV+gϞ%33ݎd1*}ll,`ufԩSdff2??⢠ uu^.677gnnXΝ;GffOV}TK@"pHHHߖ/ rbccZG(ۋ\.… dee kj9 """""""MQdjd2֯_ύ7X/rRSSQ(>}?ZZZfPQQAGG[lFVK}}=7o^ Wfʖ-[> ,7#""ظq#uuud2ztuu}vBiiideeq!6nH\\$$$㡢7ofhkk6+WDPG!??X46m"''G0ٴiR>W_}۷oPPP@ii)###GNqq1GhRk׮ICCb4APpQ^Njo>%>>!f3^cǎF||<?~JLL .\`ƍT*p֭Z-ׯڵk~&XnKRAbr^דի9tW&99R)+W$>>u1>>Zf͚5/--q1\BOO֭.JKK###C8Xnߺu277ԩStttT*iii!++FA,Lww7rIl6 ;7??% P(x._"""zT*<իWI?۷o399IvvSKYnǟɟ(o&`ZMEE׮]#::EgϞ4a8|0F_ɓ'"==s-ۉ壏>T&''9q0555}TJFFC )4W~H$!٨T*RSS@דt:W\k׮HTTkF__6&~@TTn`0H\\[n[===wH$L&Hnn.of~~?2֭[Vb`zhZ]FCCo:~|>N'ZJ%׮][ !)))x< v;jp8 ֮]T*%77T*"""(**BV322ٳgOjm355ٶmܼy~2==lʕ+P޸טy&z^0t:&%%h!gevvnAF0|GA&-'&&b0~N}'~yFA*>0aBUUfshN8z;,Jϟٟ˗/3::RDJss3@FFzJR@DBJJ ݎ^'==% l6(}Zw]8q\|RFGGZN GFFMjj0"""""""""CC_C0DѰuVV^h4sO]]:;vpyΟ?n^ 33&:;;Yj+VB^~)Μ9Cdd$'64d2_&''x<裏}2V‚Jfgge0??φ >|VZEzz:J(nFSS@cÆ dgg }177G__lܸK.qU UVLSS//DFF>::(/S[[=֭[[8N'Vbhh[bXXXXiBٸn"##INN&/&$$p9yws@Nj |^׿8Z!11Nƈ#55r1r)1$$$PUU3]0lܸ)ʈݻw mmmx>͆ 66V0ӉR$0??T*r-brayX:>><* fp B m S(fAfpVqd2d2Fn'**J|h4{j|h!y~~6كf ׈p"nP(DLLc[XX@"뙟r F1??111d2, >LF|| Fh4BP(4IIIHRv;KKKDDDJjZ`t:n7%r|>, IIIBZ& 2??vphܓP(t\.zP(L&Kt k=\ aۍnG!PTXV^/B! .NEd2,kOtt6 LBpFC a჋`0b!O b5-N'G(B. RX,B! gj`0RkY E4 ^DZrp: {G#J@"xq""""""""cccwY[fCP05П$ /rrI _菋{ r299ɕ+W|H$vAZZSiבȣYV׋l~{(vǃ~ڄu~TN'|/'l6?5p8>>U* `3@@X""""""""""NBsk}XJ_Ju_,םoj%\qpqp1>}*~9RT$ ?06i耐Ep\ToKBV}/<9PHKz8]AZ8'"""""""""dn' .qM~߇OEr9RT(6nD"! dB1½)JP~sPHOذBe=DB   "j[ ;@\\.'?k#܆,/8.R.uonc_0Ν;?7}ll F\{}Buy}suX\#HI ,T_N;AR)VE]^~քe1;;'55|5y>Ir9BoXp8w| "W(A?}Yɓa4baaڽǎɓLMMQPP{ٳg"77WǮS]] 77W'зrAAwHR-s>y$O\/~k׮tlp|Mcddd$''E[n 96ϝ;ǩSq`ŋ9vׯ_'==o~\f#&&Cq(,,(JxYn߾ƍH$8Z0@X(+WVKtt2k Gx^?bĉdeerXXX1| "܎ZXXѣdee j\g\|9 ˬ//ttt000@^^*J8[ZYj{(|q茶<4WF +\xМLNN E"w~Tʍ7hiik7""""""""JX,22RP vT}hزe v8}}}gtt08|0%%%f=JQQ w755NMM VNB\x\Nyy9W^EVcZywcnn8z{{X,\.=Jkk+111tvvrav;jnh4\puQ__O||^Br;(_{ufV+o6===˕+W֭[$''zjV+Z ͛"<A9|0QQQ~?1 ݴRWWGbbpeΜ94>8s 444ZTTT044DRR͜={ݎD"ʕ+111Aaa{.""""""pT*dA!8 xh? *--M-..͛0XRSSbuV$ ^n7ccc;v JEBBof NHH ""i0$ fBDDD 8t:^O||>lZ-===]J%555<+Vxb"55U^DFFFHIInoo/c0w8aiimvX߸qT* Bdzi&Ο?p/Y|>ַp%%% gnnL& BڵkwappPмbnn{Bjj*)))撙Iee%*R~w~(ϟ'11o}[>}iv;/2o߾M_$ n7ĉX,fggyW:^y222R|2?яHMMݻwNee%DGGcIKKc˖-<쳔P(j8q\jjjطoc6l||ގ^gŊzikk:tRTT/吝lݺ^w]:;;*"""""""y>88ȁسgyyy477KMM uuumvEt:< :IIIѺn:^|EDZZ;v^{zY, |l߾;wm;ƫhq fff?#>|իWihh@kꫯ222fk׮ojq8Aشi=B}8d2166Ə~#bvv͛7SZZJTTsssxt"^¡T*]ƞ={8u|>P(hLp,--(dee!H'??ž}0 Kr233Q*S^^/LNN[###|Gܹ"nܸA~~>?я`nn/~C[[111Z!**Xt:.uVV+nB"t:i/2 j5>^Odd?lw >Ή\.PAP Jy͌p9n7V@ L&"9^;T*}rxOP(DQQo{EPDll,jݎ\.'..􇥥%Z-ZVqtx<d2DGGzJB͊^gi,;wÞ={̤v֯_L&㭷BRa2%""ӧOsd2nsuPoL~3fffX\\$66Ͼ}CղoRl6ŵkרbzzvիq8l޼ǡChiiT~ӟ 鴴 ϧ>y222(//%V\"\.l˗innhllL~ӟ 0LF"## qW^("""祗^~R]]Mgg'[l!..MQQccclݺݎbqIbb"ռ 455qQT*6${2<8iiiB7nxWp^~ظq#&5k֐Hcc#vz_8}y `BJ%/_j*6|\͛ c6ٹs'####::B!7t@T*hZ^/[nebb>4 j2jkku6l !!ƪUcŊtǶ$C穫cbbQq8Zr6FFFΦh]Fkks%&''ٳg.K֭Κ5kra4%==իWG^^ rF#@&P*<3͡P(ظq# 뽡\v"##|Oaa!QQQO{JDDDDDDDD*w\~wjj,v%B:NrX*lXl6Z-JRNdd 7p8zp !r'`0J\/zfZMdd$x^BzT"qRk?:R |lEDD lHRz=PݎC"`0rN0$** Dj;zzT˅& )n[lB.\.l6hh4,--P(y WW*nj5RݎP*.µ%. V+aXehgI_ݎRDT *"""""""RIѺx<bbbt}$Yn$OOx,7Ogejjk׮ 2~<#K{r]DDDDDDDDDQ D% z\ϊD"nvq:OOpp8O9OuN'DXKP(d2=59@ \رC9 żDs">= !ˉzlνH$n7RT( j4'MXG^VV1~8uiCO>OcW}mrEDDDDDDDD"/e2PI΁@T>?m 7H"|RZ{Z7}J~"""krC ߏ|N%p88N!G9|p1pr) [ |=*>Oon[9 $ '\-L( nݎ@'!,ex"Lxmx<54v]]]BGapp@ vv$y w,U-̥n FwwPl{aaYLC?Ν} ~f#zz`0Aϰv errgm! KKKB;_~Z,ܹY>NSH 稹)xVB!۹rʧ>.\`pp !|p{M&ӗ26.]  Eo{ns(#>p&N|^_#?mqžuy|zܹsLOׯl&Y;{,`bHR2228x gΜattBy%77Wnhh=zZYbYkiiZ-)))C?~Jd2^֯_$B~~>.\%)))BACZZZjt:Ǒ#GذaJcǎ mLOOGHBB w}K.t:IOOٳ\x.PTBCt/7a@ ɓ' dffJx޻>6ʥR)NbddSWW@ff&Kٳg9s dff>V*N:ESS8Ny]l&66r._EEE\vg(Jikkȑ#9sn6o,TgjH$>}ǻ8pNGLL̗2k\bxg!Ν;GYYP;|?A:::hjjbw zgϞe~~4{G}``06%%LF[[---255%l=¡B2LN O~+=B|FFx.? waT*iii^ᴏp_+|Hoo/%%%ž^޶ߕ\rNjkkd2QPP D455q\^ r#f||8"""TUU1??O~~}l7ls=;Ckk+԰fc``^of~~Llق`࣏>bhh;v^g۶mS__K/tKaa!PVVC"m6ÿΝ;ٽ{7555Ayװg?c˖-tttrlN[uƍ^ZK/\.ĄryqV+7o&%%Z͋/O~<nsKYYeee?~Fz9?O)++c˖-H$Μ9î]X%==y 8|0*h_xˎ;P;vLzk׮e۶m |JJ r{~m+B(yXv-XV֭[ڵkyi +//t˷-V+lٲ/Yhoo ^z%~:GSSj^}Uv0Lyy9P 6pUh4LOOK||<>,/^dnn (//gjj\?Q*LNN266\.gӦMܺujz= ?.x322dժUl۶ f3YYY>*`X8vN۷ E.+000@[[IIIv4 xwhdll-[vZ:::c&""d2.G,[lOOhkk, V>t< zشi,,,PXXHjj*ǏgŊ>|뭷DPw^ 0<<̞={G(MAAd?f||N0 \vGLOO}v}Y:;;ݻ;woodddsv Ν;GQQ@<@۰a$$$VYv-UUU8ʰlXVvd?֭[\~^~eR)===i@ii)0o6 T*6occcx<^}U~߰w^{9۱lwARIff&67|S0w:(((`޽ddd 8y$EEESYYIff&uuuX]ܸqLΟ?OLL III$$$pi 377Gss38NJ%oܸqRw~?B[∉lٲBZ-7ndΝW͛:)--( V+߳zj6oLGGsi&''ٶm RQQ;(((@XVax^.^^gaaj*V\\.8q顲͛7cn޼)DpV+۷ |2Ѽddd$O>zsq^/:LFNNC -^۷o 8~B QQQ_IKK )4׮]#>>,<)))ڵ>~m~?tuu,O QN:B"webbTlLMMuVHII!99Fo!4R7RRRB__MMMLNNR[["sy&''xR\\̧~NCp9fgg駟fllxRSSQ*tvvR^^N#++ VK\\8NyH LYY {@dd$E||<AD瑑v@[?TlbbbصkBm266Iee%?y饗h4DDD(,4233+WxW())y`#g6J~~>< 6l 55"gKks'Tcz1??h$;;={@ff&c߾}$۷ogݺukAee%0obbⱍQ*?'++s3PRR… ">>C+ܜ0>p8N{9n޼)\ }wPTܹDZ1Y]]hllΝ;fp A ݲl n|eee_ _(߾}G3ϐAgg'\z V"aaaK/()))O233#N_xfff,m@l*:u_~Y΁\.~)k(5n[nA]]uuu3SO1552^j񐜜LYYL$}&q~󟓗ǭ[weϞ=hdvv˅^ Mr9* Ndd$:7oSOqrss"dnJ@t:E[x<طo2Tk^^˼sAr9qqq(Jzzz8~8/շ 1"77v˿K&''O?#= xJIb0h47rǎv:::dXVVWWZ߸F}Νر"_:JLL$..Zcb zÄT^yܹ#f̙3"~n`6zx>. ł%$$ .KAɌjINN&66Dd_SPpa"""]Hu RPTo)))3>>V$,,$HHH **J'r]޽ijP(ܹsJ^jݻ 144Ԕ0oii'? Z9«Jww7f?LƋ/(L=ZJKK Dr9j.^2X!X\5fҿTIJJ"&&N'|=lڴED%{ʭ[عs(W`[__177'ޟ^1P$"##k|j}|ƍܽ{Jo.R$$$ݎbr!IHH <<\.9Dbt:Jii)eee§?HOODEEa4⋤͛g쟉v~f#&&FI}Dii){err^Ovv6B2;;李;vjjj!\͛71155+Brr2N!Ç<̔J%锗aԮ*xz=={}vΞ=KGG $HǃB@c0/AaqqNٺu+!!!g$99ݻwsE.\3%ȠvIXXG,Q*k|/^HMMҍ b+ 9L&111x<>#޽VvT*%330deeq!6n܈fΝn=Jkk+;v !!7| iii 7' %%G %%%8q\ݻWKeeeܺuzlBvv6Ǐ Nǁtkm4yo8r]]]KQ]]Mww7#** M~~0s:ϳi&FGGYZZ"-- ߏ` ::j>LSSΝC.cZIJJx=P㿵I000}6$&&oe[^.^$$$$PWWۅ/- |У}6fn݊l$طoDEE>载P(ؽ{7aaaTTT0>>N\\6FFF())!..a7n$44zIHHXc0;;ˍ7 $( <6mBT @1IIId2yyy^eee455 w , yyy8Nr9֭cdd'xF#ZvM@Xhll`0NEE<ӬFtt4lذA֚fJJJ0 㙞f֭~zJKK)**"22i8lbE__*޽͛7 duȠ]vaX%44TyyyTTT}voKHHF jjjR__/9322df._,4h4e͑ƍˣ 6n|F҈1n ǎCTb2Ƞ7n`2AT >iaaOnn.jfǑDII deerhii!** RIxx8ZF#KZZ###EVVRZZJ^^:aٷorA>sFFFֶRSSٶmܸqBZ&))IOOOfrrxa"Ncll K/ٸq# #4Xfffx/(( 99aN'kfÆ dgg˨jǧ~$JGGwܡcl߾*++!==Ba׮]l߾y^JDDdii;wpa4 lڴ ömx'(//'<<<+Wp\<ЀNW_'Ol&##/؈dD*++3>>۷ٴi[, rvJ%6md2Þ={` jʙS 2"T^y館HD<|h5FL&6VRh44WlFneebbbDsIt#ϣjEp^R |\^r6ZV4F*L&JI:ve"e4 -ɢYSyt::N둴 BʻnE ,!]'iVWWQTk)2Lw^<.K @I#"Tz4. dt:E[JWz~ؔd VWWVRVVq(JeFD/CBBD[KORpUHHHvEB҆gzzZ9GFF*L&UR$a5 jpFҴIiʤҁԞώHcUFNE$4uRTfim\YYA.w<-T_)[w\IKx/iIcWZGt:ݚ{z^Ѯ. Z-"KR7nw^OkO *zQϙ3g/~Z^S>χDTT*8 $05>4Z(s8^va`?I][}*~Kk'A<ߤ-k:NIAhXZZb۶mrHĤqICC88W;8mwL&cKԟ5F`Gw jN|jQT"bVW."Qq,}GzF!$$DXޒL/uROCS%)]Z$ݎL&[-[q,(---\.v $H;٥%T*QQQk;H@ @q,@۬w](P[[+ZA"""رc"7yRIJ*A $H oD@_XX`qqEږpݸ}Uhxf>g$)~{H@E/ X|of1H A 䏝jWLg%pJAj0> }j\dB)<~[ ?D2?C }G  A $H kWI+E}HQv_ [}$|/vdj;H~*;3qؿo"(` $H AHY _(]n&g{pki)Y$@p`Zlr.--}>6MDד궴&%J cZE.Xomp[-..vEzy^EUל85ey>6l6n~@KKK,//?gR?<*߷4~ӚI}%,..!daa;ӣuttX0tvv~rprH,wi65!Yu8X[}>#u~eeE|arY'].'k2gΜΝ;~sv_Ғk333|̈9Nf3߉ ]]]_e+zI'#͖D>,/}xM}h28yXۗŻvJǫhllZd $H _JҥKя~DVVsss8r>`bb^uz-HOOW^rq1N'ڵ $/綴p N'Z~?gΜݻd2^u\.o6/,..kիW9w-[ x7IMMe˖-pIfffg?ɓR\)±)_ծM\[[KNNIIIn1h8uZAٱcǗ.]O~ǖ n<*G}8s &8~ȱcx9r055E\\<`.P\r_|8KQђˈB`zzW#"rKѧ%mv300@ooA8 ,crr 1Hj+WpaZʝ;w{.yyyna E\$0Z4F#/_&//OdW"k4V\8!!!={ErssyׄkLEE===|>~z9v2^{Ms\hZ=pp)P)\r\ή]HOOԩS,,,`;Ν; piJ%Q9t7o<ӄq9L&+++x<ֲe˖GFV$H A||aXCOO+++pFGGIII/%׮]#"">ؾ};iii8q!#<ٳbBCCd۶m>}<xwZlذ\IMM۷T*9s ?FRev4,--rq֯_08H\.l477ŋ|466"X\\lNGGӴa0?JCCfΝ شiW\!!!tvM{{;>om@AaܹsGh8|0UUUܹ6mɓ'Y~=̠P((**"));v011AJJ^m6,--{ʭ[ػwo66&4ʽB0LLLLtI/_L}]ZZZp:X,1pܽ{$ #sN]Ftt4V!)))!##SNg*++tdgg{nz{{YYYt޽{f߾}Q\\ɓ'ٶmYYYLLL󱱱رDxx86meUcϞ=Egg'wFՒdž 8y$999WRWW LOO͛7? x7DVJUU|>>cJ%:uFfggINNˤͮ]z*qqq Ozz:|P1сnrg׮]l߾۷os  6{4޽Kii)ܺu NG^^IIIdff ˅zmۆN("##jyfѣ$%%a0 )yb{`͖DHHZMhh(jz$%%H͉'8~8RN~~ʯ~+,--2FٶmG?b``yF#hZ~aٰl,..OS\\Ljj*\v F͛yioodeeq ٸqX+;;; %77jkkGnVvEll, bhh08u}!Ƞ5Fkk $H A|ɱcxgIII^ʍ7P*X,fggϡCejj4 ضmf~FFF|2LNN>I~߲qƇ _FΞ=/L||<؈x<|_|QK)\.tttPWWG}}=r{gL&˜={n~jYXXvFaa!eeexX]]L&&''/~A^^nbxxw}'|Rl&''ʕ+ܼy-m Cȑ#G8{,yyyl||H#Rrrr8x 2LzsX,~ߐ޽{d r9mmm|g⋏5}_OO1G!33N˿K&&&ɓJ%19HLL$))gd2BBBP(Tu~~˅d1 M۷w^._Lkk뚾J rr6n(̯Jɼ꫌矓KUU7oݻ|>E~l׋A&2HfqqqDEE=O OTT. J^^MMMp8!99YKK$~t:jy^:JO?MRRDFF299B !!j^kFTT* V >~^ϐOyIMM~344$4&W^yE0?O1 dddi1n;hW_%** RߚCҰ0… ( L%#?OTT8vׯ_?!3k۷z?'ZMXXRZZJqqxg(.. -{__G $H AiG}& ^)//GQXXȮ]LvɥKxHfdd&>ݻ#!!rr+WЀbee/]![P;m'0>>Zr d2F,eff,>̖-[ڵ ѣGb޽{z$==~?%%%<$$$駟ۋfKCC^'xw͛}6 OgIZ^Sy^|Ez{{j^ ==Zz{{9x QQQb677Ǯ]L&n0 KnܸÇiiiRKJJڵkNjD&Ilv-M܏=0fZMAAPTTDBB}~)222ʕ+FaDyy{&hnyf8FQh MhnnFѰo>`bbDN'LNNR\\LRRwc0:::L&IIIk|gggnSRRBAAOYn{M*/2 Z-ar\D]YJt:Q*"HTQm囟GӡD}'I*mJeC+܋2/mP^/*JmnnAE4a9*J\{%i},.."_3~>^*wY"H$+F# ʹTo%o2* $$$zqݢ~!!!5 R;H{<∉Y3Ǘ4kZg`M1z<L&kַa!p,HK\.rJ%Drr2)))]HZ',)G &]+~I} w-HOOhؼX"\ww7B|t1@ %9n߾Ϳ^/"Һ:~$ /n[たkޝS\\LLL .KxD̑F $H A>rp8?LR?n!V ڵܜhKܜR=m6FVj囚0͏po\K̼^/׮]G曖XXX+W]2??g}ƍ7~ژt:]]]_fVWW{<jkkbzioo‚x288{?H A #Ӭq]Fmm-033ÿwR)ܸq۷oSXX[oECC&,, "LOOz%&Ν;Gmm-ru} IƔJ%Oz233Y\\W===رI>3*~_$ݿJ%aaa|gIQQZ=44|@?ѣG9z(j>Cill$)).^Hmm-[o,_sKKKdggT*E>Ch4B{XB!$KnRDhÁrDyPFʥp8ߎ?$555bx"ׯ_ƍhi֮\Bee%7n >>e~(|KII  !77n:ݻw#D5)f2'N ==8Y,>3¨K022±cصk.K\x?ȃY Bnfn$ennZ˿aؕIIHH~ii %֭%wPK*!IUӧO`7Rƀ8uFBbyyYDCw:8-D⣏>byy$N皶+ l۶""""e֭;woc(,,$//H֭[Gss3۷o'$$/ϊ۶mc׮]Fl_}RPP뉏&\755NUU|>9<~Ǐڊaqqv3??`4ϟFCgg'| NGss3< vBSSSCYY/_&)),vMGG&P@gϞ= Bd2~jkkٽ{76l`ƍ>}R1L( HJJb팍EAApObw֭[tuuo߾(_|z0sMX:ٰaFX*++)**իJMM VP\4---k_V|M%==ׯSSSÝ;w̙3gdjjގV ѧ477۷kcW|X,1^/!!!={z^'N0>>NJJ UUU\rVϸy&]]]~BCCz*322VԩS8NYYYannՊNO?EPpQFFF^Z[[大2455144DJJ ?gill$--P1$$$IMM %b72??999rAqyz=r ~~, $$$011ӧ!11W255E}}=III@JEQQ? p5Ӊr A _h۷Y^^fx(,,duuBxx8pyܼyI4 >p^yN'oy <===<_A"""D&a5!Ihh([n`0FOO.M6=  c0O?%66F"QTh459FGGٶmۚd2:::PT9Ilx 3j?5g˖-l߾w8f2jl6IMMEPßٟyudžf#**'022BJJ ܼy˿Kbcc1͜8qVB KZ-Zfhh'O2>>Fy`=xZZO=W\auu0^B`ݺuhZ0L|>֭[ MMMR]]۶m'Yi z=~RRRĸlx^L&KKK8N@&~9B{{p?猏388套^' g}bHMM1, QQQ$''#9<>|Xhq:磺MCCfZd"##={k.jjjx?sbcch41_\\`0訨(bbb"އA $H_(777gsϑCCC\zZ4 f "--MF&++ba*~znCSE[o -ץ/K/ -vrl|>~ia~p8 sM^/7ndӦMby ܹ/J>dfflt:q8N癚7 ''x8p1>>0nrrrؾ}; 5ut 8rΝ#//Fʊ0U(DGG S۴4fffX^^F SO=LB;woIff&۷oj7oӼ =ѣGyꩧHKK|x &''1=zi~P(z%aԇNVWWIhtb4YYYbS2u|>~0 L#zט:Fy2339z(FH jzM| G2WX,\.fgg9w:ND{zd2gp{6mę3g}6tuuŭ[CדVVcIs[բR瞣X^^fÆ ߿7n܌BJBRVeuueunݢO<_*GѰ B(5cQ. 3gΠqd2~jyq8TTTPQQAXXO=bCyz=Ǐݻw~|Ыioo999_BBO>aqqIbbbx<?~_yE~?deeqM#33#Gm6T*wvsqzzz8x ;v twwPZZ͛7橧"..Ǐ344fcÆ ( ߿z9Ė-[{.ݻuqIjkkaϞ=j^`hhHl||I&''ygȠ~>,01ܹرcw>*pBCCôSWW*$''s [ aaak:?gbbɄZ>ɓ'|LLLIoo/ 7l%QVVFkk+QQQtttԔho@wZ-` ==*ٳ>Khhra),,dvvBd2\.rssc``uQPP*͑LMikkcjjl˙Ve4߷lŽ;`nnu166ƭ[b6mĖ-[ؼy3)))^5cinz=iii$%%166|FTJ^Op,~_Ka^H%}_TR}KH:)O '}?NRu::nMY%Mvg5Hu4ˁedL&FFFؼy~(5 |ַ ̃+}&_T' ߏh$!!aM) d2R}SH $~`=N h700A.), #\\.`?lY!11jy׌ M}>nbzzV~nݺ5Lu苐@&;pI,zi龏 Ku}}S`*]'kt}XGGg2_>111’BJg2ļ $H Aq0>>.J"**jJҦ~:OQ9M"ܯr߹Jw=V?]XW@fCy]hL[~mq֗nguuUdߓWAIQQ֭[ӦD.?я5ݿ]kWXƇ=?꾏zfh {5IC&( $H |ThX,lqvY]]E^턄;>U@'ɗh|՘A $H Axb;}=..efggx# )>v؁Jwޡ7oG?׮]ƍ J%`||"Ν;GUUH'4:ѣT*q"JfCTp8P*"F9WVV$$$d]ٌ@MFFce( p8Ÿv~;FNp&RnhZ, Of۶mx<q+E- ##XzLLLPQQAqq1.RPP@kk+TWWLhh(&ITtvvrQzzzX,seٺu+uuu\xߧ3H A  詩ڵ><?%ztvv770z2339v呟N RSSРİcoߦK7$J;wNGYY{nz=6l ++ .c%.. f38JJJ蠤)((`ӦM\xBoc"77233iiia턄PYY$<sA]ZZ◿%r\񷴴.r9nѣt:g׮]hZ)++ҥKΝ;DP|@=99]v144 *9Css3{s96l@aa! (J IHH`֭ SPP@nn.pO d2;000@GGOwETRYY3:::s_k_륱9VQJKKה.oKXX466b2HJJ8*++Y~=| Z[[ %%E(LIIaӦMܾ}[2>>Ncc#[n088 /ׯ_Ol6_k^J\\ׯh4BII 6Jꈊ G}ā(//GVcZٵk| o===ܽ{׳o>Ξ=˶m۾LA $Ho#]^Ν;~:,VV%44K/ĦMˆѣJNNgϞexxjZ&''СC_A (Jh~T*˗/g"##QՄ .Dtt4vt~zo~BRQQQA~~H#i,d|D30ՒZԩSFh4ܹs x "44FhdaaijjZۡr9333{ٳ͛73==Mss3!!!\v BASS;v?)bs /hxw̙3ܴFII `ddDXXXÇ޽{ Eڊa˖-mBzX,ڵ ZO&** VBҥKlܸ$a -{gg' 99; ͛7YZZbtt.bccq\>nݺcccX,6l@^^[nknCC999FRRFx'x饗jKb0XZZBӑQz466R\\L__ϟgzzUزeItt4KKKl6 v!$H A ?z(L&TWWsMz=w2??OLL QQQj%''TҰ$$$κuܹsz[+WQQ+Wx 압V+o& }q8l6aHOOv$77͆f㣏>bddg}R+++dggHrr26 ׋fXXX`ff??!33۷os-}/6ϣr#++T v}M~? zzzPTÇp @kbNcÆ <3d2ȯ~+rss)--;wg}KܼyǏs!'''??ajj {<<Z*7n'vqd-E, DEEK__111dee122 `Zbzz\  /I||<&I~ܹ0#ʕLXX.[l@:t8N癚BRFxx8Gak{ 1 B&Dgg';wpi<Xz=+++l6Q9Fh4&v9nyy7r4 ׯ',, F#eeehZ4 Jrr2ܹsō$H A2<=66ϳh`0pAvILL lݺY~=[lڵkTUUÑ#GǡCزe vپ}>ܾ}[=_EHL Of111A\\SNaXPTd2E෬,l6n:9¶m޽UN:ŝ;w8r?#ٰammmɓ'nSZZ*LU*qf3~[299IKK O>$[lAPUUEtt4ZヮT*lUUUOOuu5~_|%Ο?/嬬PSSæMسgaaaTUUs=Gss3@?V9 rزe Vٳg)))p8ܳw\|>rssrcq@d2jBqqq<p lBii)UUU\~pz) h4/Lll,###DEEQZZB ::ׯ?Off&sϑ] A $!_]fXMOt i mI['D{`tI U"ϣjF$}hd,3oj'gtKzT^QϾayTgÆ ;35 ?_/E/ENHHXӇ3* Be 墻[Xc[Ga?"+$ݿ?̼&~7)JE:X:~9Eeyn A $7PB*J/xh@a |J}a7h_0!KQ?ُ]s|Em_ƣEttBÞe{Aj/,H A $IF ex@@r~U=66%SLdzL&b Ɉ%7>>v1͏}y4` $H Ao)E=nC. ?G+)+:vзݖ]B ;Y; $H Aa"˿(qqqX,&&&X]]E ;Yi_^^f||RFavvq EP`6nf҆WfRXXX`rr׋^t211A׳& FCHHZjE=4j(333" FQd2155%OOO`@.cvc0D{:NQyEVWWb\.dTVV)$n޼%FՊN[KݿM(LLL{9gffh4( F#T*j5j5 2??ꪸ4vrUzMOO377'ƌdll .ƞ"'Np4kuu%Z-LNNLR:9ZHzz7"TFqfffEV,//>Y\\fqɯP( riT*UUUXViiiArY pq8i#uLVsPravv%z=|:httTÕFGGų^xo͑&&&3"##q8h4XYYy dSS+++ܹsV-jjj"h*"]իWIOO k NGp8x8X]]ի~-..2>>Gӱusff$!x.1<HY955bs ccchZql,,,0555RY0k333t:8ϭVH(N8!))Y A|(_(_r6_Ntt4 oEՒΛoI__~VWWdrri4 j7nʙ3gطoZvJMM 8Nrrrt#p\vTٳI._LWWݔR__??$r;JJJ0=^W䙾pQ\\,Gb2 Esi>cv܉J⭷bppz{. ԠhP*׿f``AihhjZ8~8MA&JbyyX,bbXX^^Z9vT*333,//q8fO0L,8N~?W^*O"P@ׯbgrrn֭[466aկ~R$??!{kEL&.\ ++Kd"6 m6nLw ǧ~Jgg'vu֭]ƭ[ؿ?łFѰB񰲲Fz"׷/v`ZngzzχV]#xffggEy<F8@T"P(XZZ`zzZIee%T*1|188HssHM$5}200G}}}}p ZZZG} Frrrhiitttyob/KBBBʕ+ܹs|\ o\@_nŅ p$%%xoohhh@311AHH999deeq1XndddPZZnu5z\\l6ؾ}nIPUdeem6Z[[ eƍDFF200ݻgTTTsN #66 L&UUUx^tttEnn.~z\Bqq&>>,Z[[پ};jׯk.aΝl߾][,~?ogΜAgNbb"YYY>$$\Ncc#JZ~?ׯ__%;;v9{,X,l6/#iiiAT200r-;Fdd$ [n@:qF.^Hjj*l߾.T*W:p iii344B133öm۸uO<7oK.qFX,(J gƍ QZZJvv6pO@~1y'Cٳg`hhBnAO&11L!(|>._8lƥKcbbJKKE?rp\\x?dtt'N煖(55U`&6ܸq%!!!---DFF2==Mee%QQQPOP0::J[[֭_i q<߸Ν;|Fn߾ZbPVVF?|dgg@nn.a6'!!466ӧΦ~:;;Ÿsmmm-mmm= $׮]CPSSVd2111Axx8mmmdddXO>^OGG8f֭#;;q&&&W_QUUEdd$H^^׮]Bvv6[nERĞ={ϑd,--Dvv6\.ۿ[n߾bΝ;VO|V~v+++Eoo/XVn޼ɍ7HIIarrp:::`hhׯs8{8̈>`ddu:BIHH'|R?UUUܸq4.\`ppYz=ܼy,7o$##BBBz}yQ*\r&''"$$۷oܳ"ihhDee%o*.&&&g"__Q]]㡽b022Boo/ <>˿ܹs__344j}uV.^r_BWW_+1NxIMMƍfӧT*ٽ{H3ZTTĹs0l۶ A :J5 \.vMee^,//NkO<7d2Kjj*GeeeUرcCV{.#ϦM0Lkj{n^u1ddd3ϠVyHMM .P(P(455p8(++c߾}DXX3ΡC CVS__m\㷵޽{LMMqU„ٳl۶5$gܺu($q88qVpzq z{{׌bv!4?Φ ݎB[ /$DFFrmjjjψv ]d2300[hii_W_7r!~?^tinn&++ NGdd$.&ٽ{7TTTR|444s=s=;ͮ.EEE|$eeeر`6OjRh4a2x"JR Czz:|  T*ZNhh(200@KK ?яя~DTTuuul޼pJJJسg2֯_ٳgDբhFNDDNSst:r祗^bllel68۲e8lDDD0==Moo% ]vhO~ݻw **;wPSSJ7 ##Î;LJ}AѰ{n~_Ν;)))aǎk&~?|>n޼IJJ l߾*^WT{9t:ġfhhJh4]RkZ,<sss<3ܺu8~3==aaa?%22R|Fl6f_jn݊f ]I8stvvBLL nv;SSS߿L&6&6KZzd?!iii ʇ~Ⱦ}&99a:;;qExx8* ۽~p hiiAPF[[ҥK|g eee 277G\\lڴg}vO &//q@x|2/^СCԮ>L khdzzzK~"m|麴gyy6aajj[dΝ;w_~"""HKK#<<R)桄!ɰZ255Edd$jY~?zRITTᤦ+jebbBl@>L||<'NXsΜ9C\\0jb2z8Nazٴi---ܾ}R.\28 VELL رlfaaG%$''W^y 8 aqqirssV`~~Q戎FP033(n5L||>^e\.AEFaa!/8pX,`ttT^^֯_$~_Kn]E-_]}׋abb~gLNN2==``˖-444044Ć X^^^3$ךT*nHOOZ-ۋlorr2tttMNNtuur(**r٤)066ƭ[XYYMOO###EOOptvv"|jjtq`f $H|<=66k׮h$44'|]vƍ)++S__ϦMشiuuu֒́dxxAz)RSS%++ Q@6FGGŦI2[2H J\.zx"+++ϭUfffVtgp\gv:ns  EQ(Q$R#MΌUXom]k5*{x4F#JERLsnts )HATH}<9pm۶jyG|LMM W%++qd2[lEyZ-N7oL\\h4q0WDBMM &.8 S[[Kjj*_.|:tɄ\.'558vڅflذAX>zJ%ٸ\.oߎNd2{n&''YXX ##X x<{tvvDcc#Z=Ar EKdrr~vMRR077G^^CCCttt`ۅ v؁Vd%&&(񔗗OBBCCCj~ͦO6Ľ|q^G(),,d׮]r<#:&A詧`0ՅV"D6l 33J]]],,,yfƘg֭ T$fHee%4440;;ƍq8LLLVTUU!JYZZ"&&|6o~]v ”yyyՅn'//<}``Lz)ؾ}; {nQTՑOzz:<#x<4 jl6' D¦Mψ@EEeee p8D"Aѐ.hdffذa~4Z{QիdggOSYY+lF V@ll,nJ399b!114jH^[پ};R! [nv388H\\[lajj D"lY,Ξ=+xeMqMTTj|X\\djj @nn :Kee%X,l vlQ*䐓<$%% Q' ޽QJ N~~ 699cIII!99ZN';wdeev%!v$::ZHicuu{l cۙr!RSS1yfYXXtc|B4c=FVV DGGsaajjg}R<MMMܹS#))'x\碰Phc$=&&:6l>Jvv6===F=JQQׯ Qnj:rssyʢdz>Kaa! p!6mڄL&;v)hZD6a4 """"rwbX#9XGѼWDBξd"&&E1L hЃ@$n܅aHIIo%~?fjnOOOׇD"ATRYYI|| " r//jWFF6mz`Н0xu ###|_-_""x 222ػw/@NF#)))TTT EDDDDLOO NO=EeHHB" 9ӰHxUjtL_Gퟻd-K$EpN=!I$!$n~QBXy$nD)_ ̡/ÝI" /T*oLDn#H8p Bxh4!_VwȝMnO{f3厼@_'Է2?,>NZZψ_n2vG8fzz!>җ+++h41eFGGlOe Uq<>k=TTZwӉI444uO3gΠT*HPquut: ͣ`0l&&&!۾X,$'' טdiixfq5=裏 ( jWߊY˻wDkk+@`]'wKҥKőZ&++_LOODii)oB*$` ~~_p8r DGG3Я_Nkk+MMMl6p'-7vYpiii^u:::xG Ɩ-[hii_&55UX</,r󌌌pe6m$,_.|CR'o{nx饗XXXV4!ɐJ;333R\\LGGüTVV@7,//p8B΢Rl,& χ\.h4b6 B,,,Bll,}}}J!//O)S577'^/SSSl6bbb| 0SLOOvJ&<,.. :"VU(vfcyyΥK@TxιT*j*|>n7f2!} QT,,,`4{)oo ޴`@*fT`vvV؜eqqRRn333Ccc#8~8ØfJJJcllcǎFWVXZZbR4B 77?Qjkk/ 011!TXhnnf۶mXVfff}jjJiwDthxMvv6OT_r2 4cccMRR۶m#G q:244ZL^ٽ{7G 6mmm,// yyQ*)kׄ:ڿկ8x jUΟ?OffpӴT*INNFqI>`@Px|h?, DoBDr9333z9r'N &&U{9_ vbpp,._LRRn۷ '**A,'""""" s(r9B!Ù3gzVVVp8DGG#ˉ_gZ, of[rFEE"8FV :lrQ(|[ߢ42;;nNuu5/"J׋`ȑ#! hnn&))-[}v._%**^YW.ЀDss3jZZjjjHLL%~UTTbwn"PTTwl6$%%3ϐ& QUUѣG@SUUŞ={Ĝ@VV[ne֭d2ϖ-[pOOG @ @VVw`6я~DEE^wݵ999?D*ra6mȈ൵lٵk;vnkm۶233cpff!Ӊȑ#dggrȠm۶qeN'JN  ٸq#O<qqqHj=z&''Q BLL rn_ٲe˺|h4j5PHn~wťKl(JY]]'xBXGڔ pcɓܹSSH$ J 0>>Fa||k׮!x裏QT:tjp\~R)O>$ʁ8z(QQQ_"""""""sW}~!{A.#Jݍ^bގh$99χR̛6mBe2rQN'Fvtt_*^{qUكL&#baeeȿ˿V)--% bZ1L,--aۉazz^X]]E&T* 8N~_ĶmBbZٴi_ZZbuueV+~T&&&hhh7`ݨT*`0Hjj*LMMu֛EB@V#B†^gvvavECC333dggxpӕjTTTpް;wǏgDGG3==MVVfqq4KKKTVVg***0 TVVRZZ*I tۋ㡯 宷3399INY[?8 vL&п ( V++++rbbbX\\… dddP(JDGG344G(yT*hBA(bxx+Rhd2ӧO#J5F;wz{k׮qF\.Fu:PBfbR^x~AȆe @T"ovNNw1L455+h̰ ]VV455a0֕l6f3hZJJJ8z(*HVg?uuoNII ~!˄B!deeo"HNNȑ#`Xddd L&#** LF8F1>>(Cz9艉477 yyٳ;vIUU( Z[[پ};B^^#779xꩧؼy3nB&Ar yyy_AGLFcc#Py \|Y2+ ØL&r=yضmIII޽`0ŋY^^g!..vA-++Yr9`6Ϟ;w˅를Z[[߿!a+ɨp000SO=ENN& NǦMEZqƍY^^&))7044DWWݻlA$"++ bppdHKKcpp$ksǙtcdAGRR f(((x7[Ah4b ;;^pFee%a2!::lT*YYYx^6nHBBLOOqF6lذ111deeG"HVV޸q#))) ݻB^WZ3EsNͥP(D~~iT^^hdee{bX&11Z999FC8,6呑A0dddRIii)nKvv6۶mCۋVeӦM$&&7<X,=Nnlb_X,LMM Fs||A7X, n ?_ft:BÀD"paD~y|Q@s~l޷ȃ`0(S8B!TWM$<96rx׾s|1"Z{[DDDDD䛊D"aee/AktrHLLRdj?, DhDRVvߪV+ZzRRR2ͤ>Ț=E__yN|r~|^>a||6w.L$v0QhLFall~rfff@*###ڬUq_YYٌN-ڵj jJat:<LMM )?=7jV tvv211A(<::\.0ĉ FP0<<zL \.t:&~l6:T*F!::% 㶶ҭYRx<ƻ{7X⾸H?CPsa||\3b||\P|t:9?77G?p8*w O]]XV|ȭYnCzY^^&쬠t sv|>CCCLNN S@@xƢT*w׈<܉赵LNNrEj5 Fѐ/~ VVVW_}ɄZ&++a|M7p\466yf]]]ֆh-E*˹|2333?dFmv}Qv\vJ:::oKjj*444+`@բT*evvsαi&AA>råKx7yGpPWWG\\ Q__/6+X,_N^^/2~ .`XZAQB^gbbE^/QQQͱD8fzze7 h4Ḹ8r{Zq\Btt4fw}KCC7nddd)z-8~8 hp\#ln>ΦM]۷s 3R)>,pbPVVѣGdddGGLNN_  YٴiPBL&cuuaxn X>}#,66o}[ j4<#ٳwf999?C.M9 @!##%t:JNGNN333vΞ=`??W!z"!!2E__d"8pTK/dj- %:DKK +++zk>c뉉a~~ݜŋtttP^^N8_'N@T288H~~>px]~*t,//s^JLL sssΑ#GwS@ ŋ*n @RR?0|'dddt:p{릑H$?Lƞ={8}@_^^#ey~??yիvٺu+o6yyy^yf-e2|Zp?@MM͍Ր#68qg}V_|V% DNNO6n{{;w ^`0nB}] 2L0}>^NzVVV8x \.op8F瞣yp:.OJJ O?4z`0$$$PVVFUUnR)|Y/D˗۷ ( A رcAKK >JVV;wguu3zf^ŋQ]]Mbb"v͜1:::dXVL&=6l ;;C||<6l`޽w7P(Dqq1\rEx槦8<7wSDBzz:7nbcZ9qO>$j޽{Q(|+DDDDDDDDDn5Џ?'|֭[ B ehh$, L&O{0D.SQQ!* xHLLT0h̯k˿7ߤB>)F#KKK,..h4Feuu$L&###nv#q\?d2QZZJ ```͛8J%PiL&333l6v;>( r%z-jjjH$1::ʕ+W{L%#˅phRIII% F!ɰNg} />#N8!<#Fn7fl܈(//'11[R^^Rduu($gyׯc۹~:.V+===LT===ܹ{$ٶm BDG@zz:>|<ٳgF!`rrkAdYZZb~~^8>3??Аg휲X,?yyyjʰx<1\DDDDDDDkg'&&'jܹ[KUUî](--n6nȞ={aeeE~it:mmm\.{9!vmE8&'' 7hm.vOOr%RRR455T*Q(B000d"ݻ!##;w v6g}FQQQF233Y^^FTefggq8<3jjkk6m"--NRRRطoSSS~l6QQQTUU੧ZMww7yyyٳBNO*R$11J%YYYz*++YZZbffUߏV%++ V* JKKzL&*sss$''?1h41LNNo> X,a^?޽,VWWСCrcccxKѸ鄈h[D9atV#"j")9| p8d27`0sR>^nsM& p8xmO6]M p8Ltt=t:n1]l^G6wG$B qy]zU_GP/ ri~TH);;>S=)))p8 R)`><ׯ_G&,,,,mmmr֝7&&FWq7(OIDATttt^gV|lln<N{{ Frfll JZfbb^bccE=KWW~&G?BDB Gtt4J^ILLD&$2 ,-- L}}}h4T*tttz¸EEE}n_1::*(G\XXԿ^>33Cgg'6 @8!T*fEviooH$LNNVnk4fUq[~jkkh4RduVnPvkUFGGEV$  ddd;Qq\ ȥKP*dgg300Gzz:/\r7rdffbZYZZYrrro~C0͛7T*}}} ~YYeXYYٳ$&&"9uݻW0r k"wؼy3V7xC(YEKK ?X(=P__LLL :JECCo6<2H$QT0;;˵k1|>׿5ќ?t׵{jjJD JJztP(`~~P((t:y饗%66afggjQ@oiiaiiW"1|r._LYY ,--;P]]{gᠵhN'o X!|A2n7b!..ٌfl6pFd`0JbjjJxxCR$55Uw2r14 \.1͂QK/t:IOOrӃC~c"裣k~]FII h4JoRYY^gvv>7_DDDDDDDDV@'||;$&&t:q8477S]]\.ghhRɟٟ [\\Ʉ易'|x8)P[SS}XL*3 / ==gyBA8&##_|{ I0d޽l޼Y8ccclٲp8B@.3;;DoÇ| ٙ3gF^/GL(B&P(PՂk.^|E233q8B??bHttp̧@7|388Hss3hh4믳ʉ'r 4eqw[o166˗~Ǜobl(WVVxiiiҥK7p ~Áh^cdd~}w?3l6|ᇼk?~TʡCNfgg_{QDDDDDDDDPӧOã>ʇ~"3??B.#HdA??crrW7B=N'%%%4&&&xq~'NFMMpיĉ⡗H$Br0$==!X,H$r92VVVV6SVWW^OYY|{9u6mbZ1 cXzJEElڴDo͛ LOOR傑+H477chjjt ]oNcLNN200;8~8)))$%%QVVFRR/^ %''Mjj*O>$\z'|R$H^w|TTtww~^JAA O{B0QQQ)--PPP8gΜA"hhnnȑ#bۙbnnQf3.\ ++ FM|fzbb"SSSDGGNJ ({졸aFGG)//gbbbh4x'<9a^/RFg6{rrZʊPV+$rN'ٌvddffm6*++eǎtvvxgh4,--j%33UbbbؼyORhii6.JKKfppL!/>r?l޼L"^EEEڵ \N/TT`0%;;D!~aaU8@bb" ^_yy97nD"`XxGq,-- ߃)J%68q:,,,prssdgg pvvQma28|0X^/KKK$&& ``ee"6}yyٱc466rQz====~ueHMMIIIH$=Fr#fjjug:*++ILLd֭h40 ( arr\JJJ$ {۵!T'&&P(駟FVÑ#Gh4> ד;AX,!U"`2x<ܳru/Zd2RnR3gΰDVVַe܋:pz >bhrql6l tH$a~F h4uEDDDDDDDDПfP(P:Q(O qdDB0KeD"jwĻc0ߘCd>ݭ6aaݏ|tDam;0;vkcDBEE>w[y8\jM3@`0xOߝ"""""""""&vD~{,lNo0p8|/$ 6~WJw37rXYYoq`ӉlwQQQ DGG a4psBRAa^RDDDDDDg'%%1::JKK VDd2@vBLMMԄD"AIss3099ICC8Nz=팏*Z⾰@SS$$$%khkkrjڵk8q:288J"66!ۉ&z\z~BZNJz^ ===tvvCLL 팎\.gnnFVWWIJJbvv&F#III~!33p8L__]]]$&& ƑvJ!08ddd|t:LOOk׃ZqYYY!11p8L{{;}}}T*$ uuu211!(_v BrrP^H)h4-}dzz@ Gf|֪f_NRR.i W\all LNl¼KIIY7%11&FFFP7}(봵188(_yTbd'$$|f(/^dӦMI\\JN:;; B ׮]cppCJJ 466p8HHH࣏>É'$&&  ގ#!!OKK cccBY\\ڵkx<nP(Dww7===hڛt0vP*v~x RRR>{i`` 顧xJ%mmmtww ߗfwFtt4qqq;n7066V @Vyظ5Я_rrss?1:~_ŋ)**⭷ ==t\.NF{={FZ}xx%zzzb_֖Ykkkrt:*޽{1 aZ9w555[o"޺t?Oj{qFx8u%%%¢ʕ+?` &&ׯ{nd2?ψRbԄ ##:>#z)B k=22KKK|>zzzE* î.&''l(J& 100Ԕ^zLbccerr^['zgg':F'|B\\Νcl6V+ǎz TJ{{;2 oN#>>~]@w8\~ir9FV2V%pèioo/̃%z=կ&;;P(D[[p[_<(5лk6l@0ԩSa.^HFF|[lD¹shiia߾}BD(ޣZ SSS\r;w f3>H(666?jgVVV~:> 2??Oll,QQQQQQ<+++8qv;nz=6 Emm-6L~_M||<^_d۷OhpWW^? _Nkk++++p8x饗H$֒ĉ466R]]|tuu133?d2qI$fGG@f~VVVJ୷bppZZZhjjܹsӟQ~ӟbZx<]\v~{{5{#GC JDEEΝ;IJJٻw/ 477sU癛 ۃtnbɓꫯZwdW_eyycǎͯkǹz*---k111 hll䭷ޢL&B"PSSõk0LBrn CNIIh4u?Z^'!!A8H$ syǎ]HHHt[ XE__EEE?`uuBAAccc8N :ppp 6{n} &yB\N0DTޤR8t$&&EGGO>$GkY\\r/RXXHwwMcNee%/"7d26oLyy9)))TUU">>={jٱcшf7`bbw}ptvvRYYwq311FP`4;pyV+Ӭp8Ztwwsqy71Ll6oNff&䐙hj@DDDDDD\s)t:>('Onrv +DB8G?wF#W^`xxKqqpnDp8L}}=sss),,dƍ*EZ@( hhh`t:8בH$x^JKK9rOb.\Wj YF #[VV__1MMMJff&EEEvPbb`2XXXY~iۇJ" "Jț`0HRRW#d2 HR qddd}fN'yyylٲ 6PVVv4 ;Cyy9eeeVk> Dnŵk%!!lJKK1 x<Z[[ٹs'pɄlfbbIfggygطo2p8z`LOB,LNNٱcwɓfY]]FFFpBD@]]DEE믿jRPP@BB ,//f?b }}}l6!-[C o)te~ߐ/K/Dss3vn7LMM1>>?QTr|>;00lfd2F#+++bvhhxn7?, :E{{; lݺEFFFHHH#mw:jr)}]6l*>~fgg'0::pD2 TBlz{{l6 -TJGGBhBj266FII z7{x裏fx#++ N `ddIyy9yyyݻ+FJmm-zf3MMM,..vİeaǎ:utz=yyy$''а."%55|xذa.aШT*qݔ騩gr@('`ll H8?.~X||<F Ʉ^vimme׮]=D`xCt:QQQv3N[_?EEEl6&66LFJJ twwٴi]]]>}VK8ʕ+tvv255ᠶbcc Bl߾eFFFHJJF^^P,rssIKK'##)`nnNVߏ9艉fZ-. @EES]]M^^iiiϳw^6l4sssTUU}vQUUEtt4~>P(dee.}ee!vDbG<Q8D8)))j!W<::GVV333HRT*TVVR^^Naa![nE&1<>^䐚ʦM|Ux III!99@ FB[greK 栛L&TJ +++<dffxر*222J8>N$.66VHHLLduud!Gp*YnZm۶RhiiC1::J8'XKff&sssd2rssINN&==FCrr2EEEX,!7k#|VtBAJJ PPP HMM%))4M$(JH$HRX\\$==1$ <>ٲeشir\(i0zlذ4J% v)++cӦM,//c0PoJf駟F 9{e˖-$%%p8oxX ::^gaaN#--x222lR^^T*aلd***pDGGOjRINNsssPVVF{{;{*%%Rg! 222BEEt"Ɉ&%%^d *YRRBii)%%%,--͛)++CPv9|0ZqVWWy)++#11ƍٸq#\.R)O=~⨨`˖-$&&277J"++Kn򗖖v ;AX,!N"`2x<ӛ9nbᣏ>h4RXXO?}o+^A_XX %%偫8vn<.3gΰD"aӦMTWWߗ&7 E~ ?rׁ`0(hr|Q"e>p8,V7>%**꾽DDDDDDDi il6 ^.5햫`0x[us |>~K]W"d]}sRɾ}|{=wÍtr0#^{=Bum&h!To?[Wg2wi""ߔ[˃^[^DDDDDa@"NAY' 1y*vQ45Zug^$nx<'~ qݷ|Ne2^&k1BWH$@SD) qQ*Bn qJe{$oaW!PAJ9l";☈ }ۍl""vHuU("i $҉(UcxnG8Ք͆iEDDDDDDDnTqOJJ_(\.'P__O(B122Bmm-477SWW:|%\L||< ROZY^Q3W(tuuq5l6X,.]*vt:Prqet:3g-AKK mmma@ @kk+mmmB@.311!;KIIajjZAQ[[8B!:;;iii!99YP-U|:*CCC׳Lrr2PF:::A&q:::"99Ε+W0L\dNB?84} q_~7#|)tttP(okUܭV+p.H8s uDžaz{{vJR(OE._j%55KmmPAPZM||<\|#˗/3==MJJ :::jh4罽׳"|WiӦ엞~mnzF.]$TtDJ+"sssۋFydOYY"H0 Q__b*eeffs999f\ \v?V˱cǰ˜UL&*?}}}\v BqĥKX,cxxXESS]?nᘡ!{&!jV 8N\$)))8A>?ĝׇD"ʕ+H$'? zd^~eRRR8w{%"ޕ6L&p88s vB.3q8 266Feeez{{={8hhhݻ ӧOSSS<ǎ#99Y([s9~_RYY*'O4R)H$>JJJMS[[Kff&DGG388ٽ{72g"/^6, 999qn.QyINNٳ099I||bcc"!!A{gL&cX,bccAǗ_~LFGGQQQx<BE7?F#ӧOs!bccJ?~Rr9 ,//D0az{{)((w)))={B^P@Vhcqq$0@ :;;ٺu+oXJ+"kiiСC7j9yhZ,..b0 066Fll, [#x<0n%%%Vvo?p8ET; (((W^OZZ---vDRo)((`zzTʉ'(**̙3,,,0??=#"""""rsCG*BWWw&**Qx,l6233B&~y)..͛7saRSSJ8pG}ZD"!99}P(½lڴ DD"a۶mfyyj0* BA{{;hZz)jjj֕ \xj8@BBp(Z-FQXpA pxߏVG!77!@7LLLpY}9~8r50Wbll_~@ tG*Z棏>)y0oGyjH$BFJRYYFf3F]]󌏏3;;@ ?&r9cǎa69u---yp\8q~a4immYa^}UF#uuus1_.<_pc󴷷//sIx f._B@ѠP(8v pԩݥ_(bccq:x<2>>.|vhhty 333477gϲjѣlٲvxy'b^x|>]]]A^x hkkcllz{>_Nuu5Gl6Fll,/ F[5oO0n&l68z(۶me^~e^}UV\Z&..rɡ ͆D"._LKK f$<$$$066F~~>FF.^HBB;v O`6illl6388EPjQ*h4dCDEE1;;kߦcǎzimmg Ǐ'** JZiD"o,..b6͛|<3ʆ x 466y6}˳> ǬrAo.ԛ駟ߑR>ɓ'YYYaeeQnp8D"OO+uuu (,,n,H/^[za0.]d2o}vywٸq#UUU>}_|Q> q1BOsIV+&~Ç CGe|G4`1ͨT*Y]]࣏>B"SOtkpa9p6m\H$yfX,A!A_l~N8Ve HP|> l߾VˡC8qBJGEEw8<y?Rbcc$**<>C, {a͌311A(fhhHP Æ 0M6RM7TڵlOR)>}-[ىn'33\R) J[[V@ z 7Bn(J:DEE555];"[n壏>b˖-f]O"_GG>y7̧i"?>fnnB!9t,,,`h222ذa999=zsVUU1::㡼b"''WR^^Ntt4LOOc4bxxGy'xBO_3&&??'d~~4fafggOll,'墿L';;"$O>$<v}Yz=Bh}("֭[ٵkFFC~~>6l`ǎDڵϓEffZn5>}ܭ>cZy뭷8pM|K.a0X^^>ł餽Q?1Jǃ~Յdb׮]hZv;n9hoo`0xjE&p8hnnfvv;v099Igg'a_.KnAq\&r8vǎ#55ш륣I:::3::*?nw$X*"-B6lsa6EN'yyyBj200@EE: 6gϞ/Ts~'h$ Mll,nP(0^WȡMII!''$֭[q8466b0Y@ZBą \tI4vJ$1LLLL}vN>MVVqqq$&&=oa0عs'yyyMQQرyPT\qqqLLLƏV;w~p`0(466244$ -..faa{P(^ҥK?< 8qNٴi/^̙3Q]]0.l޼B{555'p%ʨ|$&&RSSwb˥K|2Bйs{J rVWW)((@PPWW'x#aوx8~8---l޼˗/ 󬵵B!R۷ox Ess3+++t:yX,dggsU\B__pVT*†jcc#6l >>Thhhf 1Txxׅ ZMVVΝX<}fBj5 ;^"pqqQnZ;JKKwK>}|;LMMaIIIwޡ-[i&.]ĩS(((`֭ ;v@.{111AYY%%%\|SN֭[j?fii(~?%%%|\p;CDDDDDA3sx< R6nHII deeje߾}`4X,l߾*KyfJ%^F#F栻ndT*RSSpb{^RSSyyy HdddFAӑΦM())j!PVORo`0$==P(FP(Z( &&&BRQXXHQQsN~G||O<,mY8+ |I^HGp8,x{療O}8fϞ=BHn$˒Mrr2}Sn9&"""""""""5V' nʩ]"eztmwĻt:U_oz 9lTxޛ~'Ʉ_s6la5PgÇ7pXc|U! qH$_8̽ q4Oz$S UDDDDDDDDDDnm{8p|>C|XC(t޳sn#W/D|"WHo>N|//"""""""➔DWW/_fiiTtʅ B z{{pPR/211Aff&CCC9svV+ \|6d2mZ>99#11T#j V^ 鬬pi, YYYr%_Ntt4z\Dn'`0pݜ8qׯ %v@!@ccݾ|2]]].\`ii4Ƹp3338wCCC hiiNPp_[)F`bb:*7=Uqŋ,,,J0^tt42ӧOBOOiiiX,Ξ=H$۹r pXȵv8B%Zd2166FRR(V}~~ۊ\v{oV(jfڊRdjjJx.>Kww7N())Rm8s Fl{ŋtww$WWWinnFV399)T"AΝ;GQ[[Kcc#>OP_V@_N# RWW^q9s}n\6lXsG]]---hڇRQDDDDD^r'*kVgw 8{,8q^OII H$j5XVlXV>Cv؁R\gepp/ kˬٳgh4$$$pu:::ػw/VN:֭[YYY?$99Y(et^}U*++l9s]vT*ennFƍO>& HJJ"&&)N:Ů]Jf$ r\NGGF 6y'XXXĉ s26zzzrԄFA. MAF#*V 288HBBݼK$''KccPjn5ƈ lذSNQSS#5ٺu+otwwXYYɓlذ$y 9Z[[RTh48:::"&&N^}U/ZԩS?~n333Css3`$F#W\avv"&&Vp\$%%1>>NCCu)fq\2::JFF\|yRRR ٘fNPB0300T*׋fd21440`\N__oDooPovvx$ 333?pPeuuUMMM8---( bccihh( `0(((?dddLF{{;555@fcpp7x$t:p:NKK $$$b?ݙf^/ǎbXB!~Bff& ^J~~>KKK<66.FFFXXX -- ̕+Wv  SYYISS]]]šhD^xINNF"@}}= \rj]N uڵ۷Vayy>#,Z-&!! ҘRRR(..&~j5Z.j5J떕o> Jٻw/ĠT*IHH`( 0>Fp8300@kk+ vyGV KKKT*BSRRfiÇSOh DVeH$KLL 6M9Fcc#sss 088DR"""(**{Z---ܾ}w"H(,,枨A4cbb(,,dbb(aݟ?^Xw.(V+nbll .իW󄄄ٳH$^uL&ʹx YnjiinݺECCÖD"۷o;P^^Nee%|>( z=*gΜayy>!kRrvd2Q(\xI}]J%CCC\v Tӧ1LBΞ=+7$$-&⃃=z_~i!f ZN#..rY]]… PRRBLL7ʹs r9R@__RRpjx^(,,drr7n؈Rq}r9MMMqEN'픔lLF}}=wqiڸr z^{oo/[{g^|EV+6q/ŋrQJJJXZZͩ|>2_5~۷oDrdggh4,TTTƟ~ƭs9ٻw/g@͛7yׄV3>"666o|{ߣ</^2'O/RYY) l6L&ʕ+j!#H  66~۷q8B* v3d{FT18J%~ݻw+hYXX`aa666HJJ?@ff&[t:DEE1444sss,,,`۩c[+((( !!q9q|:0::ݻ9uVnF#ǎ###@ @}}=111ڵKV&gEDDDDD<>V@Omm-JY ؽ{t{ﱶFJJ wܡ$666rAJ%SSSsuVC5ׯ_&""B:|ZikkC" 0\.d2t:立ﳴ?h4TUUQ[[K||M[[eee-t*DķZtuuo>a{!!]ד;Cee%!!!̠T*J|>^/A~ j#66'NpaVVV`0h͸D"aee )//guu7nDMM 333@v._%11QoV~?L&Z[["LOO-XVIII!44FCBB%%%444&QpQQQT*imm}@ jU׾磫p ~_x/X^{999d2<111DEE#GX,B|H"Ԅy׮]$&&͑#Gp8LOO\.TWW׷E8޳guuu\tÅ>~up% $$$p5'JٱcmmmL(?!+++ܸqC製{ŋIHHxO^DDDDDD>zLFJJ r^OVVYYYر}@FF'O:.zݻw߽W^yE.=`4QhOgs4\NJJ Rxr9l߾H1 DGGT*IHHjG||B`qql"##`sN<(yд\ղBnn.aaa$&& Az=j!!!$$$`0h4ERRL&c}}U^z%222&11t:G ÄxHLL|"7w}ХR))))( t:w&<<@ / wo߾]-lllpqrss'::B/(hׅbbbH$F*EHH>cccx<m3ф#ؽ{0dm6pݨT*RRRHKKh4 w@zz:8#55U|5 DGGD\\:vA  33{NRRj8D&w]a޽ő^'$$$tj$򈌌$$${N:z4ٷoN'X5ĠVy """"""".YYYٌdǎ_j忨˼⋏."z1L[L(ioo'44cǎ,:yѺ?-CCC444P(˟(2eIww7 x<)""""""fuuU"}ZN'NSYT'2"O _$ 0͂VqzKIw9yLhy! ܑ^/.@ Xzq:(JT*RDDDDDDH$!H>.XAA/N۽eYqߔMvA/s~T@x<9xVUQIr0tl.sD |8]πD">Լx@@(G8&AJ FOluF&})&j=@K_"c"""""""""|*Rt!Xp:?j|E EDDDDDDDDDD-=66*++%11R墴Oll,mmmvILL͛TVV2::JJJ }}}ԄdrWUU1??Orr25׮]c``O F3W*ܹs7ohbpeL&,//SQQ{P*z߿ϵk׈Sp88w---|>^^4{v:TWWsm4  DPMyy9$%%144Dyy9ccc$$$x(--۷t:u [9zG111䤐BWWקq9{{{;B^/ܽ{RBFZ[[1L&ʘh4"HsUUUBs {XXc3qQz{.tuu%DyQܧ)--%55Ux%j~?;v젽:ZZZ8{,}}}s%RSSz*ccc†~ΝjF#Ǐp011D"axxz<222Z~@sss/MHHwfVcllL[nQXX,k.RRRxrss룺III̙3|><(䅷$$$000@MM ߧ-闞$իW@ ===455qYv`` .p]v; XVݻLHHQQQa#GJ",,h8B DZcDŽJ;w.hq:߿¨޽{sQ zilljB?jC)Uc޽(JZ-aaaB~aߏVرc$&&htP*288( V9<@XXSTTFr_z `I·~Q*DDDmmmDGGjIOOpgbbb`0 Hꢩyz{{"<=)088H||< J~:CCC\r>}Vˍ7dqq_+d22`0ʎyH$?~nfggH$BTnYgZ޲|>? .pCBBFCtt4b۶mEDDDDDDDD|n9w999>|˅#kQ*\ζmۨIzzz0RZZ;gnfٳ\ CCCtuu?EEE|'..N`+JN:ŷ-x-]z)СC8N<2aLu:@T%Q  CCC,//v' .\@jj*'N`ppVK^^xhnnȑ#hZS__(aaarAWW]]]466 !44)^INNt,//fq~izzz|kkk^0WX,\.r9ΝD(444044DCC-+++aٶ[":Lǎp,˖MNNvIJJB&h+CN#??ϓoRUUall Vb JQ( J>HϦj|7LDXX xK$v2l6ׯ_gaa-.uL&:DMM T*~?LNNnصk*"""_0cccd2A[WW֯C~uVVVJdjkk[Vn߾M__wr\s:-x"/^b կ~EOOv"""""""""ʊH$fN'۷o@VV,--!Jaaa1RSS1 DBB&&&bkX__ Ya||I 2ͨjBCCioogmm@ ; χ` &&|>;w2== R۷ Zęx<[:\NWW. RI^^VFCDDnoߎRUصk6"""ضmccc#HHII`0Յn'""LLB] l6 & l6Rph4nhoogffv~_Nrr2aDpdff266f#%%E' *Yd2!l6222cyy -LNNb4INN&0<< 999{<\.fggIHH`nn$fggd2 _4ł``qqQZ-l6 r$22Rd2+++VINNfyyTQT8NbccYYYajj\l#zL& Dpt:,//c1 C^^' A?COOHR}]#"""""""djjJaVWWQ*DGGoH}ǎ_j7 蟇M˃?ItJqq1+++p]/"( ǚ=(jOdKv;BsСR#t"?4emmKtV]D= f_ !?T*6*KGvQ rҬy^NC^@.cs='L&ڌr}*""""""""D"r}jaS}x^|>s >׋R8O:nAO׋D"\#x 8ؼ^>`ο|oAs @@PM?kZ >i>יM].QQQTzx^qLDDDDDDDDDQ#]<QED> l6nW D˝;wv$%% Q/\`0Dii)$''SVV&==n._L]]KKK{q]Mll짊p8P((Jjkk)//gnnL&Νcaam۶a6)))L`Ν;\|^/h, O&>>uy|t:˩2v h4h4JKK}6999(JZZZ(--"sUHLLvSTTD{{;wpP^^NMM C_ #fjjO}bBrrc348N$ !!!ܿRFGG1x<aR)!!!\t:IIIannb&&&6r ~w넅=>lllziii!<omm2x<F&''),,dttd1缈W͆rd[2?#fRRRsNln߾ٳg1 hZN>O?Myy9F*F#$..0Gyy9?uuu7 ::FCUUDGG?6 fdZ[[Y]]jŁr Gh4hСC>|V+&7ow^}y]F? ~gffDƍXVt:oF҂T*e}}?? jb BAyy9, ,,,dnndbL&{3FMM \ztڈΝ; ˉ\Ν;GZZ333L&rsswDDDDDDDDD>E@X={L&#..i&&&x駑LMM8|0z233"##l6yZ-q͇feesNOD"a$%%P(tDDDk.r9@^ρt:BBBh4 WGG~{N֭[Ԡh8p|pp=V+ߧ!!!R[[2 dggM  66PvލF G>|VZ牋իP^^NFF$$$z)**"""4rss)..fqqϹs(w&33DBll,,//S[[+Xf$&&b6ٳgz׋ZvKss3tww444099Izzp033Í7;LMMq9⨩appufBBBhllL~~륺&.\@ss3ݣ.cqqȞ={p\9s^۷iooH'##cǎ!˱lLMM;sABCCx =z022į//m6gϞeۍRG?MXX>ҩjRSS_Ikk+KKKvs `69{,ǎ#//@pܻw焄 F/))aaaAh`_^{5ZrUſz~?jSNoF!wqQ \.Ο?OBB