pax_global_header00006660000000000000000000000064136071671560014526gustar00rootroot0000000000000052 comment=6f61bc143ee5521f64de2f472d7f36e46f929c49 pspg-2.6.6/000077500000000000000000000000001360716715600125125ustar00rootroot00000000000000pspg-2.6.6/.editorconfig000066400000000000000000000002671360716715600151740ustar00rootroot00000000000000root = true [*.{c,h,l,y,pl,pm}] indent_style = tab indent_size = tab tab_width = 4 [*.{sgml,xml}] indent_style = space indent_size = 1 [*.xsl] indent_style = space indent_size = 2 pspg-2.6.6/.gitignore000066400000000000000000000007511360716715600145050ustar00rootroot00000000000000# Prerequisites *.d # Object files *.o *.ko *.obj *.elf # Linker output *.ilk *.map *.exp # Precompiled Headers *.gch *.pch # Libraries *.lib *.a *.la *.lo # Shared objects (inc. Windows DLLs) *.dll *.so *.so.* *.dylib # Executables *.exe *.out *.app *.i*86 *.x86_64 *.hex # Debug files *.dSYM/ *.su *.idb *.pdb # Kernel Module Compile Results *.mod* *.cmd .tmp_versions/ modules.order Module.symvers Mkfile.old dkms.conf pspg /config.cache /config.log /config.status /config.makepspg-2.6.6/.travis.yml000066400000000000000000000005101360716715600146170ustar00rootroot00000000000000language: c addons: apt: update: true packages: - libncurses-dev - libreadline-dev - build-essential - libpq-dev before_script: - ./configure script: - make after_success: - bash <(curl -s https://codecov.io/bash) env: global: - CODECOV_TOKEN=f5247bfc-2837-40e7-b4f8-285ad10c7dfc pspg-2.6.6/LICENSE000066400000000000000000000024531360716715600135230ustar00rootroot00000000000000BSD 2-Clause License Copyright (c) 2017-2019, Pavel Stehule All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. pspg-2.6.6/Makefile000066400000000000000000000041031360716715600141500ustar00rootroot00000000000000all: # Include setting from the configure script -include config.make DEPS=$(wildcard *.d) PSPG_OFILES=csv.o print.o commands.o unicode.o themes.o pspg.o config.o sort.o menu.o pgclient.o OBJS=$(PSPG_OFILES) ifdef COMPILE_MENU ST_MENU_OFILES=st_menu.o st_menu_styles.o OBJS+=$(ST_MENU_OFILES) endif all: pspg st_menu_styles.o: src/st_menu_styles.c config.make $(CC) -O3 src/st_menu_styles.c -c $(CPPFLAGS) $(CFLAGS) st_menu.o: src/st_menu.c config.make $(CC) -O3 src/st_menu.c -c $(CPPFLAGS) $(CFLAGS) csv.o: src/pspg.h src/unicode.h src/pretty-csv.c $(CC) -O3 -c src/pretty-csv.c -o csv.o $(CPPFLAGS) $(CFLAGS) print.o: src/pspg.h src/unicode.h src/print.c $(CC) -O3 -c src/print.c -o print.o $(CPPFLAGS) $(CFLAGS) commands.o: src/pspg.h src/commands.h src/commands.c $(CC) -O3 -c src/commands.c -o commands.o $(CPPFLAGS) $(CFLAGS) config.o: src/config.h src/config.c $(CC) -O3 -c src/config.c -o config.o $(CPPFLAGS) $(CFLAGS) unicode.o: src/unicode.h src/unicode.c $(CC) -O3 -c src/unicode.c -o unicode.o $(CPPFLAGS) $(CFLAGS) themes.o: src/themes.h src/themes.c $(CC) -O3 -c src/themes.c -o themes.o $(CPPFLAGS) $(CFLAGS) sort.o: src/pspg.h src/sort.c $(CC) -O3 -c src/sort.c -o sort.o $(CPPFLAGS) $(CFLAGS) menu.o: src/pspg.h src/st_menu.h src/commands.h src/menu.c $(CC) -O3 -c src/menu.c -o menu.o $(CPPFLAGS) $(CFLAGS) pgclient.o: src/pspg.h src/pgclient.c $(CC) -O3 -c src/pgclient.c -o pgclient.o $(CPPFLAGS) $(CFLAGS) $(PG_CPPFLAGS) pspg.o: src/commands.h src/config.h src/unicode.h src/themes.h src/pspg.c $(CC) -O3 -c src/pspg.c -o pspg.o $(CPPFLAGS) $(CFLAGS) pspg: $(PSPG_OFILES) $(ST_MENU_OFILES) config.make $(CC) -O3 $(PSPG_OFILES) $(ST_MENU_OFILES) -o pspg $(LDFLAGS) $(LDLIBS) $(PG_LFLAGS) $(PG_LDFLAGS) $(PG_LIBS) clean: $(RM) $(ST_MENU_OFILES) $(RM) $(PSPG_OFILES) $(RM) $(DEPS) $(RM) pspg distclean: clean $(RM) -r autom4te.cache $(RM) aclocal.m4 configure $(RM) config.h config.log config.make config.status config.h.in install: all tools/install.sh bin pspg "$(DESTDIR)$(bindir)" # Pull-in dependencies generated by -MD -include $(OBJS:.o=.d) pspg-2.6.6/README.md000066400000000000000000000305321360716715600137740ustar00rootroot00000000000000[![Build Status](https://travis-ci.org/okbob/pspg.svg?branch=master)](https://travis-ci.org/okbob/pspg) # pspg - Postgres Pager Everybody who uses `psql` uses `less` pager. It is working well, but there is not any special support for tabular data. I found few projects, but no one was completed for this purpose. I decided to write some small specialized pager for usage as `psql` pager. This pager can be used from `mysql` and `pgcli` clients too. ## Main target * possibility to freeze first few rows, first few columns * possibility to sort data by specified numeric column * possibility to use fancy colors - like `mcview` or `FoxPro` - http://okbob.blogspot.com/2019/12/pspg-themes-what-you-use-it.html ## Screenshots ![Screenshot](screenshots/pspg-modern.png) ![Screenshot](screenshots/vc-mc.png) ![Screenshot](screenshots/vc-tao.png) ![Screenshot](screenshots/theme1.gif) ![Screenshot](screenshots/theme3.gif) ## Options * `-a` menu will use ascii borders * `-b` black/white theme * `-X` doesn't clean screen on the end * `-s N` use theme (default theme is mc theme) * `-c N` freeze first N columns * `-f file` open file (default stdin) * `--force-uniborder` replace ascii border by unicode borders * `-g --hilite-search` don't highlight lines for searches * `-G --HILITE-SEARCH` don't highlight lines for searches ever * `--help` show this help * `-i --ignore-case` ignore case in searches that do not contain uppercase * `-I --IGNORE-CASE` ignore case in all searches * `--less-status-bar` status bar like less pager * `--line-numbers` show line number column * `--no-mouse` without own mouse handling (cannot be changed in app) * `--no-sound` without sound effect * `-F`, `--quit-if-one-screen` quit if content is one screen * `-V`, `--version` show version * `--about` show info about authors * `--csv` input format is csv * `--tsv` input format is tsv * `--double-header` header line is doubled * `--border` border used for formatted csv * `--csv-separator` special char used as separator inside csv documents * `--null striing` null string (default "") * `--ni` not interactive mode (format csv to table and quit) * `--no-cursor` the line cursor will be hidden * `--no-commandbar` the bottom bar will be hidden * `--no-topbar` the top bar will be hidden * `--no-bars` both bars will be hidden * `--no-sigint-search-reset` sigint is not used to reset searching * `--tabular-cursor` cursor is displayed only for table * `--only-for-tables` use std pager when content is not a table * `--bold-labels` bold font for row, column labels * `--bold-cursor` bold font for cursor * `--vertical-cursor` show column cursor * `--on-sigint-exit` double escape or ctrl c ending pager * `-q`, `--query` execute query * `-w`, `--watch n` repeat query execution every time sec * `-d`, `--dbname` database name * `-h`, `--host` database host name * `-p`, `--port` databae port * `-U`, `--username` database user name * `-W`, `--password` force password prompt ## Themes 0. black & white 1. Midnight Commander like 2. FoxPro like 3. Pdmenu like 4. White theme 5. Mutt like 6. PCFand like 7. Green theme 8. Blue theme 9. Word Perfect like 10. Low contrast blue theme 11. Dark cyan/black mode 12. Paradox like 13. dBase IV retro style 14. dBase IV retro style (Magenta labels) 15. Red white theme 16. Simple theme 17. Solarized dark theme 18. Solarized light theme 19. Gruvbox light theme 20. Tao Light theme see http://okbob.blogspot.cz/2017/07/i-hope-so-every-who-uses-psql-uses-less.html ## Keyboard commands * 0, 1, 2, 3, .., 9 - freeze first N columns * KEY_UP, k - navigate backward by one line * KEY_DOWN, j - navigate forward by one line * KEY_LEFT, h - scroll to left * KEY_RIGHT, l - scroll to right * Ctrl+Home, g - go to the start of file * Ctrl+End, G - go to the end of file * Alt+l - go to line number * H - go to first line of current window * M - go to half of current window * L - go to end of current window * PPAGE, Ctrl+b - backward one window * NPAGE, Ctrl+f, space - forward one window * HOME, ^ - go to begin of line, first column * END, $ - go to end of line, last column * Ctrl+e - scroll a window down * Ctrl+y - scroll a window up * Ctrl+d - forward a half window * Ctrl+u - backward a half window * s - save content to file * / - search for a pattern which will take you to the next occurrence * ? - search for a pattern which will take you to the previous occurrence * n - for next match * N - for next match in reverse direction * c - column search * Alt+c - switch (on, off) drawing line cursor * Alt+m - switch (on, off) own mouse handler * Alt+n - switch (on, off) drawing line numbers * Alt+v, double click on column header - switch (on, off) drawing column cursor * Mouse button wheel - scroll vertical * Alt+Mouse button wheel - scroll horizontal * F9 - show menu * q, F10, Esc 0 - quit * Alt+q - quit wit raw (unformatted) output * Alt+k, Alt+double click - switch bookmark * Alt+j - go to next bookmark * Alt+i - go to previous bookmark * Alt+o - flush bookmarks * a - sort ascendent * d - sort descendent * u - unsorted (sorted in origin order) * space - stop/continue in watch mode ## Ending The pager can be ended by pressing keys q or F10 or Esc 0. With option `--on-sigint-exit` then the pager is closed by pressing keys Ctrl+c or Esc Esc. ## Column search Column search is case insensitive every time. Searched column is marked by vertical cursor. Last non empty string searching pattern is used when current searching pattern is empty string. Searching is starting after visible vertical column or on first visible not freezed columns (after some horizontal scrolling) or on first column. After last column searching starts from first again. ## Status line description * `V: [d/d d..d]` - vertical cursor: (column number)/(columns) (char possitions from) .. (char possitions to) * `FC: d` - freezed columns length in chars * `C: d..d/d` - unfreezed visible data in chars (from .. to)/(total) * `L:[d + d d/d]` - lines (number of first visible line) + (number of line of display), (current line)/(lines) * `d%` - percent of already displayed data # Usage as csv viewer It works well with miller http://johnkerl.org/miller/doc/index.html
mlr --icsv --opprint --barred put '' obce.csv | pspg --force-uniborder
New version has integrated csv support - just use `--csv` option. It can be integrated into mc * copy file from `/etc/mc/mc.ext` to your `~/.config/mc directory` * insert there
#csv
regex/\.csv
    View=pspg -f %f --csv
* restart mc # Usage in watch mode The result of query can be refreshed every n seconds. `pspg` remembers cursor row, possible vertical cursor, possible ordering. The refreshing should be paused by pressing space key. Repeated pressing of this key enables refreshing again. # Recommended psql configuration
\pset linestyle unicode
\pset border 2
some possible configuration:
-- Switch pagers with :x and :xx commands
\set x '\\setenv PAGER less'
\set xx '\\setenv PAGER \'pspg -bX --no-mouse\''
:xx
## Attention When you use a option `--only-for-tables`, then * set `PAGER` to `pspg` and `PSPG_PAGER` to `less` or * set `PAGER` to `less` and `PSQL_PAGER` to `pspg` # MySQL usage
MariaDB [sakila]> pager pspg -s 14 -X --force-uniborder --quit-if-one-screen
PAGER set to 'pspg -s 14 -X --force-uniborder --quit-if-one-screen'
MariaDB [sakila]> select now();
MariaDB [sakila]> select * from nicer_but_slower_film_list limit 100;
`LC_CTYPE` should be correct. # SQLite SQLite native client doesn't produce well formatted output, but can be forced to generate CSV format - and this format is well readable for `pspg` sqlite3 -csv -header testdb.db 'select * from foo2' | pspg --csv --csv-header=on --double-header # Note - compilation issue Some linker issues can be fixed by:
I changed 
gcc -lncursesw pager.c -o pspg -ggdb
to
gcc pager.c -o pspg -ggdb -lncursesw
On some old systems a compilation fails with error
/home/user/Src/pspg-0.6/src/pspg.c:2403: undefined reference to `set_escdelay`
In this case comment line with function set_escdelay # Note - Installation When you compile code from source, run ./configure first. Sometimes ./autogen.sh first If you would to display UTF-8 characters, then `pspg` should be linked with `ncursesw` library. UTF-8 characters are displayed badly when library `ncursesw` is used. You can see broken characters with incorrect locale setting too. You can check wide chars support by `pspg --version`. Row `ncurses with wide char support` is expected. Re-run `configure` with `--with-ncursesw` option. When this command fails check if development package for ncuresesw library is installed. ## Homebrew (for Linux & MacOS) # brew install pspg ## Debian # apt-cache search pspg # apt-get install pspg ## Fedora (28 and later) # dnf install pspg ## RPM (CentOS/openSUSE/…) The pspg is available from community repository https://yum.postgresql.org/packages.php ## Alpine Linux # apk add pspg ## Gentoo # emerge -av dev-db/pspg ## Arch Linux The Arch User Repository contains two versions: * [pspg](https://aur.archlinux.org/packages/pspg/) is a fixed release. * [pspg-git](https://aur.archlinux.org/packages/pspg-git/) tracks the `master` branch. Use the AUR helper of your choice or git and `makepkg` to install pspg. ## FreeBSD # pkg install pspg ## Using MacPorts (MacOS only) # port install pspg ## Solaris There are few issues requires manual code changes for successful compilation - we successfully tested `pspg`, but although `pspg` was linked with ncursesw libraries, the utf8 encoding support didn't work fully correctly - probably due some issues in `libc` library. There are problems with chars encoded to 3bytes - unicode borders, .. Two bytes unicode chars should be displayed well. You can use `pspg` with usual accented chars, but unicode bordes should not be used. Replacement ascii borders by special borders chars (by ncurses technology) works well - looks on `Options|Force unicode borders` option. * Solaris `make` doesn't support conditional statements - should be removed So, remove unsupported functionality from `Makefile` (`ifdef`,`endif`), replace `-include` by `include` first. * After running `configure` remove link on `termcap` library from `config.make`. It is garabage produced by `readline` automake script. Combination with `ncurses` libraries makes some linking issues. ### builtin libraries export CURSES_CFLAGS="-I/usr/include/ncurses/" export PANEL_LIBS="-lpanelw" ./configure ### OpenCSW development export CFLAGS="-m64 -I/opt/csw/include" export LDFLAGS="-L/opt/csw/lib/64 -R/opt/csw/lib/64" export PKG_CONFIG_PATH="/opt/csw/lib/64/pkgconfig" ./configure # Possible ToDo * Store data in some column format (now data are stored like array of rows). With this change can be possible to operate over columns - hide columns, change width, cyclic iteration over columns, change order of columns, mark columns and export only selected columns (selected rows). # st_menu This project uses st_menu library - implementation of CUA menubar and pulldown menu for ncurses https://github.com/okbob/ncurses-st-menu # Note If you like it, send a postcard from your home country to my address, please: Pavel Stehule Skalice 12 256 01 Benesov u Prahy Czech Republic I invite any questions, comments, bug reports, patches on mail address pavel.stehule@gmail.com pspg-2.6.6/ToDo000066400000000000000000000006161360716715600133050ustar00rootroot00000000000000ToDo ==== Known bugs ========== Possible ToDo ============= * custom colour schemas * hide outer border * hide inner borders * draw scrollbars FoxPro style * row select, column select, export to file, copy to clipboard * mouse support for range select * support fetched data - columns width can be different Similar projects ================ * tless * ngrid * muhmud/lessql * visidata * tabview pspg-2.6.6/aclocal.m4000066400000000000000000000472761360716715600143720ustar00rootroot00000000000000# generated automatically by aclocal 1.16.1 -*- Autoconf -*- # Copyright (C) 1996-2018 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) # =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_compare_version.html # =========================================================================== # # SYNOPSIS # # AX_COMPARE_VERSION(VERSION_A, OP, VERSION_B, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) # # DESCRIPTION # # This macro compares two version strings. Due to the various number of # minor-version numbers that can exist, and the fact that string # comparisons are not compatible with numeric comparisons, this is not # necessarily trivial to do in a autoconf script. This macro makes doing # these comparisons easy. # # The six basic comparisons are available, as well as checking equality # limited to a certain number of minor-version levels. # # The operator OP determines what type of comparison to do, and can be one # of: # # eq - equal (test A == B) # ne - not equal (test A != B) # le - less than or equal (test A <= B) # ge - greater than or equal (test A >= B) # lt - less than (test A < B) # gt - greater than (test A > B) # # Additionally, the eq and ne operator can have a number after it to limit # the test to that number of minor versions. # # eq0 - equal up to the length of the shorter version # ne0 - not equal up to the length of the shorter version # eqN - equal up to N sub-version levels # neN - not equal up to N sub-version levels # # When the condition is true, shell commands ACTION-IF-TRUE are run, # otherwise shell commands ACTION-IF-FALSE are run. The environment # variable 'ax_compare_version' is always set to either 'true' or 'false' # as well. # # Examples: # # AX_COMPARE_VERSION([3.15.7],[lt],[3.15.8]) # AX_COMPARE_VERSION([3.15],[lt],[3.15.8]) # # would both be true. # # AX_COMPARE_VERSION([3.15.7],[eq],[3.15.8]) # AX_COMPARE_VERSION([3.15],[gt],[3.15.8]) # # would both be false. # # AX_COMPARE_VERSION([3.15.7],[eq2],[3.15.8]) # # would be true because it is only comparing two minor versions. # # AX_COMPARE_VERSION([3.15.7],[eq0],[3.15]) # # would be true because it is only comparing the lesser number of minor # versions of the two values. # # Note: The characters that separate the version numbers do not matter. An # empty string is the same as version 0. OP is evaluated by autoconf, not # configure, so must be a string, not a variable. # # The author would like to acknowledge Guido Draheim whose advice about # the m4_case and m4_ifvaln functions make this macro only include the # portions necessary to perform the specific comparison specified by the # OP argument in the final configure script. # # LICENSE # # Copyright (c) 2008 Tim Toolan # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 13 dnl ######################################################################### AC_DEFUN([AX_COMPARE_VERSION], [ AC_REQUIRE([AC_PROG_AWK]) # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. AS_VAR_PUSHDEF([A],[ax_compare_version_A]) A=`echo "$1" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/[[^0-9]]//g'` AS_VAR_PUSHDEF([B],[ax_compare_version_B]) B=`echo "$3" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/[[^0-9]]//g'` dnl # In the case of le, ge, lt, and gt, the strings are sorted as necessary dnl # then the first line is used to determine if the condition is true. dnl # The sed right after the echo is to remove any indented white space. m4_case(m4_tolower($2), [lt],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/false/;s/x${B}/true/;1q"` ], [gt],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort | sed "s/x${A}/false/;s/x${B}/true/;1q"` ], [le],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort | sed "s/x${A}/true/;s/x${B}/false/;1q"` ], [ge],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/true/;s/x${B}/false/;1q"` ],[ dnl Split the operator from the subversion count if present. m4_bmatch(m4_substr($2,2), [0],[ # A count of zero means use the length of the shorter version. # Determine the number of characters in A and B. ax_compare_version_len_A=`echo "$A" | $AWK '{print(length)}'` ax_compare_version_len_B=`echo "$B" | $AWK '{print(length)}'` # Set A to no more than B's length and B to no more than A's length. A=`echo "$A" | sed "s/\(.\{$ax_compare_version_len_B\}\).*/\1/"` B=`echo "$B" | sed "s/\(.\{$ax_compare_version_len_A\}\).*/\1/"` ], [[0-9]+],[ # A count greater than zero means use only that many subversions A=`echo "$A" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` B=`echo "$B" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` ], [.+],[ AC_WARNING( [invalid OP numeric parameter: $2]) ],[]) # Pad zeros at end of numbers to make same length. ax_compare_version_tmp_A="$A`echo $B | sed 's/./0/g'`" B="$B`echo $A | sed 's/./0/g'`" A="$ax_compare_version_tmp_A" # Check for equality or inequality as necessary. m4_case(m4_tolower(m4_substr($2,0,2)), [eq],[ test "x$A" = "x$B" && ax_compare_version=true ], [ne],[ test "x$A" != "x$B" && ax_compare_version=true ],[ AC_WARNING([invalid OP parameter: $2]) ]) ]) AS_VAR_POPDEF([A])dnl AS_VAR_POPDEF([B])dnl dnl # Execute ACTION-IF-TRUE / ACTION-IF-FALSE. if test "$ax_compare_version" = "true" ; then m4_ifvaln([$4],[$4],[:])dnl m4_ifvaln([$5],[else $5])dnl fi ]) dnl AX_COMPARE_VERSION # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 11 (pkg-config-0.29.1) dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dnl General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA dnl 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a dnl configuration script generated by Autoconf, you may include it under dnl the same distribution terms that you use for the rest of that dnl program. dnl PKG_PREREQ(MIN-VERSION) dnl ----------------------- dnl Since: 0.29 dnl dnl Verify that the version of the pkg-config macros are at least dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's dnl installed version of pkg-config, this checks the developer's version dnl of pkg.m4 when generating configure. dnl dnl To ensure that this macro is defined, also add: dnl m4_ifndef([PKG_PREREQ], dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], [m4_define([PKG_MACROS_VERSION], [0.29.1]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) dnl ---------------------------------- dnl Since: 0.16 dnl dnl Search for the pkg-config tool and set the PKG_CONFIG variable to dnl first found in the path. Checks that the version of pkg-config found dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is dnl used since that's the first version where most current features of dnl pkg-config existed. AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])dnl PKG_PROG_PKG_CONFIG dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------------------------------- dnl Since: 0.18 dnl dnl Check to see whether a particular set of modules exists. Similar to dnl PKG_CHECK_MODULES(), but does not set variables or print errors. dnl dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) dnl only at the first occurence in configure.ac, so if the first place dnl it's called might be skipped (such as if it is within an "if", you dnl have to call PKG_CHECK_EXISTS manually AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) dnl --------------------------------------------- dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting dnl pkg_failed based on the result. m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])dnl _PKG_CONFIG dnl _PKG_SHORT_ERRORS_SUPPORTED dnl --------------------------- dnl Internal check to see if pkg-config supports short errors. AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])dnl _PKG_SHORT_ERRORS_SUPPORTED dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl -------------------------------------------------------------- dnl Since: 0.4.0 dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES might not happen, you should be sure to include an dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])dnl PKG_CHECK_MODULES dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl --------------------------------------------------------------------- dnl Since: 0.29 dnl dnl Checks for existence of MODULES and gathers its build flags with dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags dnl and VARIABLE-PREFIX_LIBS from --libs. dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to dnl include an explicit call to PKG_PROG_PKG_CONFIG in your dnl configure.ac. AC_DEFUN([PKG_CHECK_MODULES_STATIC], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl _save_PKG_CONFIG=$PKG_CONFIG PKG_CONFIG="$PKG_CONFIG --static" PKG_CHECK_MODULES($@) PKG_CONFIG=$_save_PKG_CONFIG[]dnl ])dnl PKG_CHECK_MODULES_STATIC dnl PKG_INSTALLDIR([DIRECTORY]) dnl ------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable pkgconfigdir as the location where a module dnl should install pkg-config .pc files. By default the directory is dnl $libdir/pkgconfig, but the default can be changed by passing dnl DIRECTORY. The user can override through the --with-pkgconfigdir dnl parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_INSTALLDIR dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) dnl -------------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable noarch_pkgconfigdir as the location where a dnl module should install arch-independent pkg-config .pc files. By dnl default the directory is $datadir/pkgconfig, but the default can be dnl changed by passing DIRECTORY. The user can override through the dnl --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_NOARCH_INSTALLDIR dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------- dnl Since: 0.28 dnl dnl Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], dnl [DESCRIPTION], [DEFAULT]) dnl ------------------------------------------ dnl dnl Prepare a "--with-" configure option using the lowercase dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and dnl PKG_CHECK_MODULES in a single macro. AC_DEFUN([PKG_WITH_MODULES], [ m4_pushdef([with_arg], m4_tolower([$1])) m4_pushdef([description], [m4_default([$5], [build with ]with_arg[ support])]) m4_pushdef([def_arg], [m4_default([$6], [auto])]) m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) m4_case(def_arg, [yes],[m4_pushdef([with_without], [--without-]with_arg)], [m4_pushdef([with_without],[--with-]with_arg)]) AC_ARG_WITH(with_arg, AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, [AS_TR_SH([with_]with_arg)=def_arg]) AS_CASE([$AS_TR_SH([with_]with_arg)], [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], [auto],[PKG_CHECK_MODULES([$1],[$2], [m4_n([def_action_if_found]) $3], [m4_n([def_action_if_not_found]) $4])]) m4_popdef([with_arg]) m4_popdef([description]) m4_popdef([def_arg]) ])dnl PKG_WITH_MODULES dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [DESCRIPTION], [DEFAULT]) dnl ----------------------------------------------- dnl dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES dnl check._[VARIABLE-PREFIX] is exported as make variable. AC_DEFUN([PKG_HAVE_WITH_MODULES], [ PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) AM_CONDITIONAL([HAVE_][$1], [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) ])dnl PKG_HAVE_WITH_MODULES dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [DESCRIPTION], [DEFAULT]) dnl ------------------------------------------------------ dnl dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make dnl and preprocessor variable. AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], [ PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) ])dnl PKG_HAVE_DEFINE_WITH_MODULES m4_include([tools/ax_debug_cflags.m4]) m4_include([tools/ax_lib_readline.m4]) m4_include([tools/ax_require_defined.m4]) m4_include([tools/ax_with_curses.m4]) m4_include([tools/m4_ax_lib_postgresql.m4]) m4_include([tools/m4_ax_with_curses_extra.m4]) pspg-2.6.6/autogen.sh000077500000000000000000000007271360716715600145210ustar00rootroot00000000000000#!/bin/sh export WARNINGS="all" set -e # Ideally, we could just do this: # #${AUTORECONF:-autoreconf} -v -I tools # # Unfortunately, Autoconf 2.61's autoreconf(1) (found in Mac OS X 10.5 # Leopard) neglects to pass the -I on to aclocal(1), which is # precisely where we need it! So we do basically what it would have # done. run () { test "${V}" = 1 && echo $0: running: "$@" "$@" } run ${ACLOCAL:-aclocal} -I tools run ${AUTOCONF:-autoconf} --include=tools pspg-2.6.6/config.make.in000066400000000000000000000011261360716715600152230ustar00rootroot00000000000000# -*- makefile-gmake -*- prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ mandir = @mandir@ docdir = @docdir@ datarootdir = @datarootdir@ sysconfdir = @sysconfdir@ COMPILE_MENU = @COMPILE_MENU@ CC = @CC@ CFLAGS = @CFLAGS@ @COVERAGE_CFLAGS@ @DEBUG_CFLAGS@ @CURSES_CFLAGS@ @DEFS@ -Wall -MD LDFLAGS = @LDFLAGS@ LDLIBS = @LIBS@ @PANEL_LIBS@ @CURSES_LIBS@ PG_CPPFLAGS = @POSTGRESQL_CPPFLAGS@ PG_LDFLAGS = @POSTGRESQL_LDFLAGS@ PG_LIBS = @POSTGRESQL_LIBS@ config.status: configure ./config.status --recheck config.make: config.status ./config.status $@ config.make: config.make.in pspg-2.6.6/configure000077500000000000000000006335731360716715600144420ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for pspg 0. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: pavel.stehule@gmail.com about your system, including $0: any error possibly output before this message. Then $0: install a modern shell, or manually run the script $0: under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='pspg' PACKAGE_TARNAME='pspg' PACKAGE_VERSION='0' PACKAGE_STRING='pspg 0' PACKAGE_BUGREPORT='pavel.stehule@gmail.com' PACKAGE_URL='' ac_unique_file="src" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS POSTGRESQL_CFLAGS COMPILE_MENU COVERAGE_LDFLAGS COVERAGE_CFLAGS enable_debug POSTGRESQL_LIBS POSTGRESQL_VERSION AWK POSTGRESQL_LDFLAGS POSTGRESQL_LIBFLAGS POSTGRESQL_CPPFLAGS PANEL_LIBS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG CURSES_CFLAGS CURSES_LIBS DEBUG_CFLAGS EGREP GREP CPP OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_debug with_ncurses with_ncursesw with_postgresql ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP CURSES_LIBS CURSES_CFLAGS PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR PANEL_LIBS POSTGRESQL_CPPFLAGS POSTGRESQL_LIBFLAGS POSTGRESQL_LDFLAGS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures pspg 0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/pspg] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of pspg 0:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-debug enable debug build Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-ncurses force the use of Ncurses or NcursesW --without-ncursesw do not use NcursesW (wide character support) --with-postgresql=[ARG] use PostgreSQL library [default=yes], optionally specify path to pg_config Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CURSES_LIBS linker library for Curses, e.g. -lcurses CURSES_CFLAGS preprocessor flags for Curses, e.g. -I/usr/include/ncursesw PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path PANEL_LIBS linker library for Curses Panel, e.g. -lpanel POSTGRESQL_CPPFLAGS cpp flags for PostgreSQL overriding detected flags POSTGRESQL_LIBFLAGS libs for PostgreSQL overriding detected flags POSTGRESQL_LDFLAGS linker flags for PostgreSQL overriding detected flags Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF pspg configure 0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## -------------------------------------- ## ## Report this to pavel.stehule@gmail.com ## ## -------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by pspg $as_me 0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether termios.h defines TIOCGWINSZ" >&5 $as_echo_n "checking whether termios.h defines TIOCGWINSZ... " >&6; } if ${ac_cv_sys_tiocgwinsz_in_termios_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifdef TIOCGWINSZ yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : ac_cv_sys_tiocgwinsz_in_termios_h=yes else ac_cv_sys_tiocgwinsz_in_termios_h=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_tiocgwinsz_in_termios_h" >&5 $as_echo "$ac_cv_sys_tiocgwinsz_in_termios_h" >&6; } if test $ac_cv_sys_tiocgwinsz_in_termios_h != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sys/ioctl.h defines TIOCGWINSZ" >&5 $as_echo_n "checking whether sys/ioctl.h defines TIOCGWINSZ... " >&6; } if ${ac_cv_sys_tiocgwinsz_in_sys_ioctl_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifdef TIOCGWINSZ yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=yes else ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&5 $as_echo "$ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&6; } if test $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h = yes; then $as_echo "#define GWINSZ_IN_SYS_IOCTL 1" >>confdefs.h fi fi # ensure CFLAGS are set if test "${CFLAGS+set}"; then : USE_DEFAULT_CFLAGS=false else USE_DEFAULT_CFLAGS=true CFLAGS="" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # add --enable-debug arg # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; fi if test "$enable_debug" = "yes"; then : # add the DEBUG pre-processor define $as_echo "#define DEBUG 1" >>confdefs.h # gcc/gdb debug options if test "$GCC" = "yes"; then : DEBUG_CFLAGS="-ggdb -O0" else # default to -g if test "$ac_cv_prog_cc_g" = "yes"; then : DEBUG_CFLAGS="-g" else DEBUG_CFLAGS="" fi fi else # what AC_PROG_CC would have done if CFLAGS were not set if $USE_DEFAULT_CFLAGS; then : # default to -g if test "$ac_cv_prog_cc_g" = "yes"; then : DEBUG_CFLAGS="-g" else DEBUG_CFLAGS="" fi if test "$GCC" = "yes"; then : DEBUG_CFLAGS="$DEBUG_CFLAGS -O2" fi fi fi DEBUG_CFLAGS=$DEBUG_CFLAGS if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi # Check whether --with-ncurses was given. if test "${with_ncurses+set}" = set; then : withval=$with_ncurses; else with_ncurses=check fi # Check whether --with-ncursesw was given. if test "${with_ncursesw+set}" = set; then : withval=$with_ncursesw; else with_ncursesw=check fi ax_saved_LIBS=$LIBS ax_saved_CPPFLAGS=$CPPFLAGS if test "x$with_ncurses" = xyes || test "x$with_ncursesw" = xyes; then : ax_with_plaincurses=no else ax_with_plaincurses=check fi ax_cv_curses_which=no # Test for NcursesW if test "x$CURSES_LIBS" = x && test "x$with_ncursesw" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ncursesw via pkg-config" >&5 $as_echo_n "checking for ncursesw via pkg-config... " >&6; } if test -n "$_ax_cv_ncursesw_libs"; then pkg_cv__ax_cv_ncursesw_libs="$_ax_cv_ncursesw_libs" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ncursesw\""; } >&5 ($PKG_CONFIG --exists --print-errors "ncursesw") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv__ax_cv_ncursesw_libs=`$PKG_CONFIG --libs "ncursesw" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$_ax_cv_ncursesw_cppflags"; then pkg_cv__ax_cv_ncursesw_cppflags="$_ax_cv_ncursesw_cppflags" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ncursesw\""; } >&5 ($PKG_CONFIG --exists --print-errors "ncursesw") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv__ax_cv_ncursesw_cppflags=`$PKG_CONFIG --cflags "ncursesw" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test "x$pkg_failed" = "xyes" || test "x$pkg_failed" = "xuntried"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } # No suitable .pc file found, have to find flags via fallback { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ncursesw via fallback" >&5 $as_echo_n "checking for ncursesw via fallback... " >&6; } if ${ax_cv_ncursesw+:} false; then : $as_echo_n "(cached) " >&6 else $as_echo pkg_cv__ax_cv_ncursesw_libs="-lncursesw" pkg_cv__ax_cv_ncursesw_cppflags="-D_GNU_SOURCE $CURSES_CFLAGS" LIBS="$ax_saved_LIBS $pkg_cv__ax_cv_ncursesw_libs" CPPFLAGS="$ax_saved_CPPFLAGS $pkg_cv__ax_cv_ncursesw_cppflags" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for initscr() with $pkg_cv__ax_cv_ncursesw_libs" >&5 $as_echo_n "checking for initscr() with $pkg_cv__ax_cv_ncursesw_libs... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char initscr (); int main () { return initscr (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nodelay() with $pkg_cv__ax_cv_ncursesw_libs" >&5 $as_echo_n "checking for nodelay() with $pkg_cv__ax_cv_ncursesw_libs... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char nodelay (); int main () { return nodelay (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_ncursesw=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } pkg_cv__ax_cv_ncursesw_libs="$pkg_cv__ax_cv_ncursesw_libs -ltinfow" LIBS="$ax_saved_LIBS $pkg_cv__ax_cv_ncursesw_libs" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nodelay() with $pkg_cv__ax_cv_ncursesw_libs" >&5 $as_echo_n "checking for nodelay() with $pkg_cv__ax_cv_ncursesw_libs... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char nodelay (); int main () { return nodelay (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_ncursesw=yes else ax_cv_ncursesw=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext else ax_cv_ncursesw=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_ncursesw" >&5 $as_echo "$ax_cv_ncursesw" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # Found .pc file, using its information LIBS="$ax_saved_LIBS $pkg_cv__ax_cv_ncursesw_libs" CPPFLAGS="$ax_saved_CPPFLAGS $pkg_cv__ax_cv_ncursesw_cppflags" ax_cv_ncursesw=yes fi if test "x$ax_cv_ncursesw" = xno && test "x$with_ncursesw" = xyes; then : as_fn_error $? "--with-ncursesw specified but could not find NcursesW library" "$LINENO" 5 fi if test "x$ax_cv_ncursesw" = xyes; then : ax_cv_curses=yes ax_cv_curses_which=ncursesw CURSES_LIBS="$pkg_cv__ax_cv_ncursesw_libs" CURSES_CFLAGS="$pkg_cv__ax_cv_ncursesw_cppflags" $as_echo "#define HAVE_NCURSESW 1" >>confdefs.h $as_echo "#define HAVE_CURSES 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working ncursesw/curses.h" >&5 $as_echo_n "checking for working ncursesw/curses.h... " >&6; } if ${ax_cv_header_ncursesw_curses_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE_EXTENDED 1 #include int main () { chtype a = A_BOLD; int b = KEY_LEFT; chtype c = COLOR_PAIR(1) & A_COLOR; attr_t d = WA_NORMAL; cchar_t e; wint_t f; int g = getattrs(stdscr); int h = getcurx(stdscr) + getmaxx(stdscr); initscr(); init_pair(1, COLOR_WHITE, COLOR_RED); wattr_set(stdscr, d, 0, NULL); wget_wch(stdscr, &f); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_header_ncursesw_curses_h=yes else ax_cv_header_ncursesw_curses_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_header_ncursesw_curses_h" >&5 $as_echo "$ax_cv_header_ncursesw_curses_h" >&6; } if test "x$ax_cv_header_ncursesw_curses_h" = xyes; then : ax_cv_curses_enhanced=yes ax_cv_curses_color=yes ax_cv_curses_obsolete=yes $as_echo "#define HAVE_CURSES_ENHANCED 1" >>confdefs.h $as_echo "#define HAVE_CURSES_COLOR 1" >>confdefs.h $as_echo "#define HAVE_CURSES_OBSOLETE 1" >>confdefs.h $as_echo "#define HAVE_NCURSESW_CURSES_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working ncursesw.h" >&5 $as_echo_n "checking for working ncursesw.h... " >&6; } if ${ax_cv_header_ncursesw_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE_EXTENDED 1 #include int main () { chtype a = A_BOLD; int b = KEY_LEFT; chtype c = COLOR_PAIR(1) & A_COLOR; attr_t d = WA_NORMAL; cchar_t e; wint_t f; int g = getattrs(stdscr); int h = getcurx(stdscr) + getmaxx(stdscr); initscr(); init_pair(1, COLOR_WHITE, COLOR_RED); wattr_set(stdscr, d, 0, NULL); wget_wch(stdscr, &f); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_header_ncursesw_h=yes else ax_cv_header_ncursesw_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_header_ncursesw_h" >&5 $as_echo "$ax_cv_header_ncursesw_h" >&6; } if test "x$ax_cv_header_ncursesw_h" = xyes; then : ax_cv_curses_enhanced=yes ax_cv_curses_color=yes ax_cv_curses_obsolete=yes $as_echo "#define HAVE_CURSES_ENHANCED 1" >>confdefs.h $as_echo "#define HAVE_CURSES_COLOR 1" >>confdefs.h $as_echo "#define HAVE_CURSES_OBSOLETE 1" >>confdefs.h $as_echo "#define HAVE_NCURSESW_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working ncurses.h" >&5 $as_echo_n "checking for working ncurses.h... " >&6; } if ${ax_cv_header_ncurses_h_with_ncursesw+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE_EXTENDED 1 #include int main () { chtype a = A_BOLD; int b = KEY_LEFT; chtype c = COLOR_PAIR(1) & A_COLOR; attr_t d = WA_NORMAL; cchar_t e; wint_t f; int g = getattrs(stdscr); int h = getcurx(stdscr) + getmaxx(stdscr); initscr(); init_pair(1, COLOR_WHITE, COLOR_RED); wattr_set(stdscr, d, 0, NULL); wget_wch(stdscr, &f); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_header_ncurses_h_with_ncursesw=yes else ax_cv_header_ncurses_h_with_ncursesw=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_header_ncurses_h_with_ncursesw" >&5 $as_echo "$ax_cv_header_ncurses_h_with_ncursesw" >&6; } if test "x$ax_cv_header_ncurses_h_with_ncursesw" = xyes; then : ax_cv_curses_enhanced=yes ax_cv_curses_color=yes ax_cv_curses_obsolete=yes $as_echo "#define HAVE_CURSES_ENHANCED 1" >>confdefs.h $as_echo "#define HAVE_CURSES_COLOR 1" >>confdefs.h $as_echo "#define HAVE_CURSES_OBSOLETE 1" >>confdefs.h $as_echo "#define HAVE_NCURSES_H 1" >>confdefs.h fi if test "x$ax_cv_header_ncursesw_curses_h" = xno && test "x$ax_cv_header_ncursesw_h" = xno && test "x$ax_cv_header_ncurses_h_with_ncursesw" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not find a working ncursesw/curses.h, ncursesw.h or ncurses.h" >&5 $as_echo "$as_me: WARNING: could not find a working ncursesw/curses.h, ncursesw.h or ncurses.h" >&2;} fi fi fi unset pkg_cv__ax_cv_ncursesw_libs unset pkg_cv__ax_cv_ncursesw_cppflags # Test for Ncurses if test "x$CURSES_LIBS" = x && test "x$with_ncurses" != xno && test "x$ax_cv_curses_which" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ncurses via pkg-config" >&5 $as_echo_n "checking for ncurses via pkg-config... " >&6; } if test -n "$_ax_cv_ncurses_libs"; then pkg_cv__ax_cv_ncurses_libs="$_ax_cv_ncurses_libs" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ncurses\""; } >&5 ($PKG_CONFIG --exists --print-errors "ncurses") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv__ax_cv_ncurses_libs=`$PKG_CONFIG --libs "ncurses" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$_ax_cv_ncurses_cppflags"; then pkg_cv__ax_cv_ncurses_cppflags="$_ax_cv_ncurses_cppflags" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ncurses\""; } >&5 ($PKG_CONFIG --exists --print-errors "ncurses") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv__ax_cv_ncurses_cppflags=`$PKG_CONFIG --cflags "ncurses" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test "x$pkg_failed" = "xyes" || test "x$pkg_failed" = "xuntried"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } # No suitable .pc file found, have to find flags via fallback { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ncurses via fallback" >&5 $as_echo_n "checking for ncurses via fallback... " >&6; } if ${ax_cv_ncurses+:} false; then : $as_echo_n "(cached) " >&6 else $as_echo pkg_cv__ax_cv_ncurses_libs="-lncurses" pkg_cv__ax_cv_ncurses_cppflags="-D_GNU_SOURCE $CURSES_CFLAGS" LIBS="$ax_saved_LIBS $pkg_cv__ax_cv_ncurses_libs" CPPFLAGS="$ax_saved_CPPFLAGS $pkg_cv__ax_cv_ncurses_cppflags" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for initscr() with $pkg_cv__ax_cv_ncurses_libs" >&5 $as_echo_n "checking for initscr() with $pkg_cv__ax_cv_ncurses_libs... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char initscr (); int main () { return initscr (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nodelay() with $pkg_cv__ax_cv_ncurses_libs" >&5 $as_echo_n "checking for nodelay() with $pkg_cv__ax_cv_ncurses_libs... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char nodelay (); int main () { return nodelay (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_ncurses=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } pkg_cv__ax_cv_ncurses_libs="$pkg_cv__ax_cv_ncurses_libs -ltinfo" LIBS="$ax_saved_LIBS $pkg_cv__ax_cv_ncurses_libs" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nodelay() with $pkg_cv__ax_cv_ncurses_libs" >&5 $as_echo_n "checking for nodelay() with $pkg_cv__ax_cv_ncurses_libs... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char nodelay (); int main () { return nodelay (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_ncurses=yes else ax_cv_ncurses=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext else ax_cv_ncurses=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_ncurses" >&5 $as_echo "$ax_cv_ncurses" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # Found .pc file, using its information LIBS="$ax_saved_LIBS $pkg_cv__ax_cv_ncurses_libs" CPPFLAGS="$ax_saved_CPPFLAGS $pkg_cv__ax_cv_ncurses_cppflags" ax_cv_ncurses=yes fi if test "x$ax_cv_ncurses" = xno && test "x$with_ncurses" = xyes; then : as_fn_error $? "--with-ncurses specified but could not find Ncurses library" "$LINENO" 5 fi if test "x$ax_cv_ncurses" = xyes; then : ax_cv_curses=yes ax_cv_curses_which=ncurses CURSES_LIBS="$pkg_cv__ax_cv_ncurses_libs" CURSES_CFLAGS="$pkg_cv__ax_cv_ncurses_cppflags" $as_echo "#define HAVE_NCURSES 1" >>confdefs.h $as_echo "#define HAVE_CURSES 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working ncurses/curses.h" >&5 $as_echo_n "checking for working ncurses/curses.h... " >&6; } if ${ax_cv_header_ncurses_curses_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { chtype a = A_BOLD; int b = KEY_LEFT; chtype c = COLOR_PAIR(1) & A_COLOR; int g = getattrs(stdscr); int h = getcurx(stdscr) + getmaxx(stdscr); initscr(); init_pair(1, COLOR_WHITE, COLOR_RED); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_header_ncurses_curses_h=yes else ax_cv_header_ncurses_curses_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_header_ncurses_curses_h" >&5 $as_echo "$ax_cv_header_ncurses_curses_h" >&6; } if test "x$ax_cv_header_ncurses_curses_h" = xyes; then : ax_cv_curses_color=yes ax_cv_curses_obsolete=yes $as_echo "#define HAVE_CURSES_COLOR 1" >>confdefs.h $as_echo "#define HAVE_CURSES_OBSOLETE 1" >>confdefs.h $as_echo "#define HAVE_NCURSES_CURSES_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working ncurses.h" >&5 $as_echo_n "checking for working ncurses.h... " >&6; } if ${ax_cv_header_ncurses_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { chtype a = A_BOLD; int b = KEY_LEFT; chtype c = COLOR_PAIR(1) & A_COLOR; int g = getattrs(stdscr); int h = getcurx(stdscr) + getmaxx(stdscr); initscr(); init_pair(1, COLOR_WHITE, COLOR_RED); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_header_ncurses_h=yes else ax_cv_header_ncurses_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_header_ncurses_h" >&5 $as_echo "$ax_cv_header_ncurses_h" >&6; } if test "x$ax_cv_header_ncurses_h" = xyes; then : ax_cv_curses_color=yes ax_cv_curses_obsolete=yes $as_echo "#define HAVE_CURSES_COLOR 1" >>confdefs.h $as_echo "#define HAVE_CURSES_OBSOLETE 1" >>confdefs.h $as_echo "#define HAVE_NCURSES_H 1" >>confdefs.h fi if test "x$ax_cv_header_ncurses_curses_h" = xno && test "x$ax_cv_header_ncurses_h" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not find a working ncurses/curses.h or ncurses.h" >&5 $as_echo "$as_me: WARNING: could not find a working ncurses/curses.h or ncurses.h" >&2;} fi fi fi unset pkg_cv__ax_cv_ncurses_libs unset pkg_cv__ax_cv_ncurses_cppflags # Test for plain Curses (or if CURSES_LIBS was set by user) if test "x$with_plaincurses" != xno && test "x$ax_cv_curses_which" = xno; then : if test "x$CURSES_LIBS" != x; then : LIBS="$ax_saved_LIBS $CURSES_LIBS" else LIBS="$ax_saved_LIBS -lcurses" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Curses library" >&5 $as_echo_n "checking for Curses library... " >&6; } if ${ax_cv_plaincurses+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char initscr (); int main () { return initscr (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_plaincurses=yes else ax_cv_plaincurses=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_plaincurses" >&5 $as_echo "$ax_cv_plaincurses" >&6; } if test "x$ax_cv_plaincurses" = xyes; then : ax_cv_curses=yes ax_cv_curses_which=plaincurses if test "x$CURSES_LIBS" = x; then : CURSES_LIBS="-lcurses" fi $as_echo "#define HAVE_CURSES 1" >>confdefs.h # Check for base conformance (and header file) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working curses.h" >&5 $as_echo_n "checking for working curses.h... " >&6; } if ${ax_cv_header_curses_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { chtype a = A_BOLD; int b = KEY_LEFT; initscr(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_header_curses_h=yes else ax_cv_header_curses_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_header_curses_h" >&5 $as_echo "$ax_cv_header_curses_h" >&6; } if test "x$ax_cv_header_curses_h" = xyes; then : $as_echo "#define HAVE_CURSES_H 1" >>confdefs.h # Check for X/Open Enhanced conformance { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X/Open Enhanced Curses conformance" >&5 $as_echo_n "checking for X/Open Enhanced Curses conformance... " >&6; } if ${ax_cv_plaincurses_enhanced+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE_EXTENDED 1 #include #ifndef _XOPEN_CURSES #error "this Curses library is not enhanced" "this Curses library is not enhanced" #endif int main () { chtype a = A_BOLD; int b = KEY_LEFT; chtype c = COLOR_PAIR(1) & A_COLOR; attr_t d = WA_NORMAL; cchar_t e; wint_t f; initscr(); init_pair(1, COLOR_WHITE, COLOR_RED); wattr_set(stdscr, d, 0, NULL); wget_wch(stdscr, &f); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_plaincurses_enhanced=yes else ax_cv_plaincurses_enhanced=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_plaincurses_enhanced" >&5 $as_echo "$ax_cv_plaincurses_enhanced" >&6; } if test "x$ax_cv_plaincurses_enhanced" = xyes; then : ax_cv_curses_enhanced=yes ax_cv_curses_color=yes $as_echo "#define HAVE_CURSES_ENHANCED 1" >>confdefs.h $as_echo "#define HAVE_CURSES_COLOR 1" >>confdefs.h fi # Check for color functions { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Curses color functions" >&5 $as_echo_n "checking for Curses color functions... " >&6; } if ${ax_cv_plaincurses_color+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE_EXTENDED 1 #include int main () { chtype a = A_BOLD; int b = KEY_LEFT; chtype c = COLOR_PAIR(1) & A_COLOR; initscr(); init_pair(1, COLOR_WHITE, COLOR_RED); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_plaincurses_color=yes else ax_cv_plaincurses_color=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_plaincurses_color" >&5 $as_echo "$ax_cv_plaincurses_color" >&6; } if test "x$ax_cv_plaincurses_color" = xyes; then : ax_cv_curses_color=yes $as_echo "#define HAVE_CURSES_COLOR 1" >>confdefs.h fi # Check for obsolete functions { $as_echo "$as_me:${as_lineno-$LINENO}: checking for obsolete Curses functions" >&5 $as_echo_n "checking for obsolete Curses functions... " >&6; } if ${ax_cv_plaincurses_obsolete+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { chtype a = A_BOLD; int b = KEY_LEFT; int g = getattrs(stdscr); int h = getcurx(stdscr) + getmaxx(stdscr); initscr(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_plaincurses_obsolete=yes else ax_cv_plaincurses_obsolete=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_plaincurses_obsolete" >&5 $as_echo "$ax_cv_plaincurses_obsolete" >&6; } if test "x$ax_cv_plaincurses_obsolete" = xyes; then : ax_cv_curses_obsolete=yes $as_echo "#define HAVE_CURSES_OBSOLETE 1" >>confdefs.h fi fi if test "x$ax_cv_header_curses_h" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not find a working curses.h" >&5 $as_echo "$as_me: WARNING: could not find a working curses.h" >&2;} fi fi fi if test "x$ax_cv_curses" != xyes; then : ax_cv_curses=no fi if test "x$ax_cv_curses_enhanced" != xyes; then : ax_cv_curses_enhanced=no fi if test "x$ax_cv_curses_color" != xyes; then : ax_cv_curses_color=no fi if test "x$ax_cv_curses_obsolete" != xyes; then : ax_cv_curses_obsolete=no fi LIBS=$ax_saved_LIBS CPPFLAGS=$ax_saved_CPPFLAGS unset ax_saved_LIBS unset ax_saved_CPPFLAGS if test "x$PANEL_LIBS" != x; then : ax_saved_LIBS=$LIBS ax_saved_CPPFLAGS=$CPPFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Curses Panel library with panel.h" >&5 $as_echo_n "checking for Curses Panel library with panel.h... " >&6; } if ${ax_cv_header_panel_h+:} false; then : $as_echo_n "(cached) " >&6 else LIBS="$ax_saved_LIBS $PANEL_LIBS $CURSES_LIBS" CPPFLAGS="$ax_saved_CPPFLAGS $CURSES_CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { WINDOW *win = newwin(0, 0, 0, 0); PANEL *pan = new_panel(win); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_header_panel_h=yes else ax_cv_header_panel_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_header_panel_h" >&5 $as_echo "$ax_cv_header_panel_h" >&6; } if test "x$ax_cv_header_panel_h" = xyes; then : ax_cv_panel=yes $as_echo "#define HAVE_PANEL 1" >>confdefs.h $as_echo "#define HAVE_PANEL_H 1" >>confdefs.h else if test "x$ax_cv_panel" = xyes; then : else ax_cv_panel=no fi fi LIBS=$ax_saved_LIBS CPPFLAGS=$ax_saved_CPPFLAGS unset ax_saved_LIBS unset ax_saved_CPPFLAGS else if test "x$ax_cv_curses_which" = xncursesw; then : ax_saved_LIBS=$LIBS ax_saved_CPPFLAGS=$CPPFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Curses Panel library with ncursesw/panel.h" >&5 $as_echo_n "checking for Curses Panel library with ncursesw/panel.h... " >&6; } if ${ax_cv_header_ncursesw_panel_h+:} false; then : $as_echo_n "(cached) " >&6 else LIBS="$ax_saved_LIBS -lpanelw $CURSES_LIBS" CPPFLAGS="$ax_saved_CPPFLAGS $CURSES_CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { WINDOW *win = newwin(0, 0, 0, 0); PANEL *pan = new_panel(win); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_header_ncursesw_panel_h=yes else ax_cv_header_ncursesw_panel_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_header_ncursesw_panel_h" >&5 $as_echo "$ax_cv_header_ncursesw_panel_h" >&6; } if test "x$ax_cv_header_ncursesw_panel_h" = xyes; then : ax_cv_panel=yes PANEL_LIBS="-lpanelw" $as_echo "#define HAVE_PANEL 1" >>confdefs.h $as_echo "#define HAVE_NCURSESW_PANEL_H 1" >>confdefs.h else if test "x$ax_cv_panel" = xyes; then : else ax_cv_panel=no fi fi LIBS=$ax_saved_LIBS CPPFLAGS=$ax_saved_CPPFLAGS unset ax_saved_LIBS unset ax_saved_CPPFLAGS if test x$ax_cv_panel != "xyes"; then : ax_saved_LIBS=$LIBS ax_saved_CPPFLAGS=$CPPFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Curses Panel library with panel.h" >&5 $as_echo_n "checking for Curses Panel library with panel.h... " >&6; } if ${ax_cv_header_panel_h+:} false; then : $as_echo_n "(cached) " >&6 else LIBS="$ax_saved_LIBS -lpanel $CURSES_LIBS" CPPFLAGS="$ax_saved_CPPFLAGS $CURSES_CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { WINDOW *win = newwin(0, 0, 0, 0); PANEL *pan = new_panel(win); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_header_panel_h=yes else ax_cv_header_panel_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_header_panel_h" >&5 $as_echo "$ax_cv_header_panel_h" >&6; } if test "x$ax_cv_header_panel_h" = xyes; then : ax_cv_panel=yes PANEL_LIBS="-lpanel" $as_echo "#define HAVE_PANEL 1" >>confdefs.h $as_echo "#define HAVE_PANEL_H 1" >>confdefs.h else if test "x$ax_cv_panel" = xyes; then : else ax_cv_panel=no fi fi LIBS=$ax_saved_LIBS CPPFLAGS=$ax_saved_CPPFLAGS unset ax_saved_LIBS unset ax_saved_CPPFLAGS fi elif test "x$ax_cv_curses_which" = xncurses; then : ax_saved_LIBS=$LIBS ax_saved_CPPFLAGS=$CPPFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Curses Panel library with panel.h" >&5 $as_echo_n "checking for Curses Panel library with panel.h... " >&6; } if ${ax_cv_header_panel_h+:} false; then : $as_echo_n "(cached) " >&6 else LIBS="$ax_saved_LIBS -lpanel $CURSES_LIBS" CPPFLAGS="$ax_saved_CPPFLAGS $CURSES_CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { WINDOW *win = newwin(0, 0, 0, 0); PANEL *pan = new_panel(win); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_header_panel_h=yes else ax_cv_header_panel_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_header_panel_h" >&5 $as_echo "$ax_cv_header_panel_h" >&6; } if test "x$ax_cv_header_panel_h" = xyes; then : ax_cv_panel=yes PANEL_LIBS="-lpanel" $as_echo "#define HAVE_PANEL 1" >>confdefs.h $as_echo "#define HAVE_PANEL_H 1" >>confdefs.h else if test "x$ax_cv_panel" = xyes; then : else ax_cv_panel=no fi fi LIBS=$ax_saved_LIBS CPPFLAGS=$ax_saved_CPPFLAGS unset ax_saved_LIBS unset ax_saved_CPPFLAGS if test x$ax_cv_panel != "xyes"; then : ax_saved_LIBS=$LIBS ax_saved_CPPFLAGS=$CPPFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Curses Panel library with ncurses/panel.h" >&5 $as_echo_n "checking for Curses Panel library with ncurses/panel.h... " >&6; } if ${ax_cv_header_ncurses_panel_h+:} false; then : $as_echo_n "(cached) " >&6 else LIBS="$ax_saved_LIBS -lpanel $CURSES_LIBS" CPPFLAGS="$ax_saved_CPPFLAGS $CURSES_CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { WINDOW *win = newwin(0, 0, 0, 0); PANEL *pan = new_panel(win); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_header_ncurses_panel_h=yes else ax_cv_header_ncurses_panel_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_header_ncurses_panel_h" >&5 $as_echo "$ax_cv_header_ncurses_panel_h" >&6; } if test "x$ax_cv_header_ncurses_panel_h" = xyes; then : ax_cv_panel=yes PANEL_LIBS="-lpanel" $as_echo "#define HAVE_PANEL 1" >>confdefs.h $as_echo "#define HAVE_NCURSES_PANEL_H 1" >>confdefs.h else if test "x$ax_cv_panel" = xyes; then : else ax_cv_panel=no fi fi LIBS=$ax_saved_LIBS CPPFLAGS=$ax_saved_CPPFLAGS unset ax_saved_LIBS unset ax_saved_CPPFLAGS fi elif test "x$ax_cv_curses_which" = xplaincurses; then : ax_saved_LIBS=$LIBS ax_saved_CPPFLAGS=$CPPFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Curses Panel library with panel.h" >&5 $as_echo_n "checking for Curses Panel library with panel.h... " >&6; } if ${ax_cv_header_panel_h+:} false; then : $as_echo_n "(cached) " >&6 else LIBS="$ax_saved_LIBS -lpanel $CURSES_LIBS" CPPFLAGS="$ax_saved_CPPFLAGS $CURSES_CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { WINDOW *win = newwin(0, 0, 0, 0); PANEL *pan = new_panel(win); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_header_panel_h=yes else ax_cv_header_panel_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_header_panel_h" >&5 $as_echo "$ax_cv_header_panel_h" >&6; } if test "x$ax_cv_header_panel_h" = xyes; then : ax_cv_panel=yes PANEL_LIBS="-lpanel" $as_echo "#define HAVE_PANEL 1" >>confdefs.h $as_echo "#define HAVE_PANEL_H 1" >>confdefs.h else if test "x$ax_cv_panel" = xyes; then : else ax_cv_panel=no fi fi LIBS=$ax_saved_LIBS CPPFLAGS=$ax_saved_CPPFLAGS unset ax_saved_LIBS unset ax_saved_CPPFLAGS fi fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a readline compatible library" >&5 $as_echo_n "checking for a readline compatible library... " >&6; } if ${ax_cv_lib_readline+:} false; then : $as_echo_n "(cached) " >&6 else ORIG_LIBS="$LIBS" for readline_lib in readline edit editline; do for termcap_lib in "" termcap curses ncurses; do if test -z "$termcap_lib"; then TRY_LIB="-l$readline_lib" else TRY_LIB="-l$readline_lib -l$termcap_lib" fi LIBS="$ORIG_LIBS $TRY_LIB" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char readline (); int main () { return readline (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_lib_readline="$TRY_LIB" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -n "$ax_cv_lib_readline"; then break fi done if test -n "$ax_cv_lib_readline"; then break fi done if test -z "$ax_cv_lib_readline"; then ax_cv_lib_readline="no" fi LIBS="$ORIG_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_lib_readline" >&5 $as_echo "$ax_cv_lib_readline" >&6; } if test "$ax_cv_lib_readline" != "no"; then LIBS="$LIBS $ax_cv_lib_readline" $as_echo "#define HAVE_LIBREADLINE 1" >>confdefs.h for ac_header in readline.h readline/readline.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether readline supports history" >&5 $as_echo_n "checking whether readline supports history... " >&6; } if ${ax_cv_lib_readline_history+:} false; then : $as_echo_n "(cached) " >&6 else ax_cv_lib_readline_history="no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char add_history (); int main () { return add_history (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_lib_readline_history="yes" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_lib_readline_history" >&5 $as_echo "$ax_cv_lib_readline_history" >&6; } if test "$ax_cv_lib_readline_history" = "yes"; then $as_echo "#define HAVE_READLINE_HISTORY 1" >>confdefs.h for ac_header in history.h readline/history.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done fi fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done # Check whether --with-postgresql was given. if test "${with_postgresql+set}" = set; then : withval=$with_postgresql; case $withval in #( [nN][oO]) : want_postgresql="no" ;; #( [yY][eE][sS]) : want_postgresql="yes" ;; #( *) : want_postgresql="yes" PG_CONFIG="$withval" ;; esac else want_postgresql="yes" fi # populate cache if test "X$POSTGRESQL_CPPFLAGS" != X; then : ac_cv_POSTGRESQL_CPPFLAGS="$POSTGRESQL_CPPFLAGS" fi if test "X$POSTGRESQL_LDFLAGS" != X; then : ac_cv_POSTGRESQL_LDFLAGS="$POSTGRESQL_LDFLAGS" fi if test "X$POSTGRESQL_LIBS" != X; then : ac_cv_POSTGRESQL_LIBS="$POSTGRESQL_LIBS" fi postgresql_version_req= found_postgresql="no" POSTGRESQL_VERSION="" if test X"$want_postgresql" = "Xyes"; then : found_postgresql=no while true; do if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi if test X$PKG_CONFIG = X; then : break fi _AX_LIB_POSTGRESQL_PKG_CONFIG_fail=no; if test "X$postgresql_version_req" = "X"; then : if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpq\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpq") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then found_postgresql_pkg_config=yes else found_postgresql=no fi else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpq >= \"\$postgresql_version_req\"\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpq >= "$postgresql_version_req"") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then found_postgresql=yes else found_postgresql=no fi fi if test "X$found_postgresql" = "no"; then : break fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the PostgreSQL libraries CPPFLAGS" >&5 $as_echo_n "checking for the PostgreSQL libraries CPPFLAGS... " >&6; } if ${ac_cv_POSTGRESQL_CPPFLAGS+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_POSTGRESQL_CPPFLAGS="`$PKG_CONFIG libpq --cflags-only-I`" || _AX_LIB_POSTGRESQL_PKG_CONFIG_fail=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_POSTGRESQL_CPPFLAGS" >&5 $as_echo "$ac_cv_POSTGRESQL_CPPFLAGS" >&6; } if test "X$_AX_LIB_POSTGRESQL_PKG_CONFIG_fail" = "Xyes"; then : break fi POSTGRESQL_CPPFLAGS="$ac_cv_POSTGRESQL_CPPFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the PostgreSQL libraries LDFLAGS" >&5 $as_echo_n "checking for the PostgreSQL libraries LDFLAGS... " >&6; } if ${ac_cv_POSTGRESQL_LDFLAGS+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_POSTGRESQL_LDFLAGS="`$PKG_CONFIG libpq --libs-only-L --libs-only-other`" || _AX_LIB_POSTGRESQL_PKG_CONFIG_fail=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_POSTGRESQL_LDFLAGS" >&5 $as_echo "$ac_cv_POSTGRESQL_LDFLAGS" >&6; } if test "X$_AX_LIB_POSTGRESQL_PKG_CONFIG_fail" = "Xyes"; then : break fi POSTGRESQL_LDFLAGS="$ac_cv_POSTGRESQL_LDFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the PostgreSQL libraries LIBS" >&5 $as_echo_n "checking for the PostgreSQL libraries LIBS... " >&6; } if ${ac_cv_POSTGRESQL_LIBS+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_POSTGRESQL_LIBS="`$PKG_CONFIG libpq --libs-only-l`" || _AX_LIB_POSTGRESQL_PKG_CONFIG_fail=ye fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_POSTGRESQL_LIBS" >&5 $as_echo "$ac_cv_POSTGRESQL_LIBS" >&6; } if test "X$_AX_LIB_POSTGRESQL_PKG_CONFIG_fail" = "Xyes"; then : break fi POSTGRESQL_LIBS="$ac_cv_POSTGRESQL_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the PostgreSQL version" >&5 $as_echo_n "checking for the PostgreSQL version... " >&6; } if ${ac_cv_POSTGRESQL_VERSION+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_POSTGRESQL_VERSION="`$PKG_CONFIG libpq --modversion`" || _AX_LIB_POSTGRESQL_PKG_CONFIG_fail=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_POSTGRESQL_VERSION" >&5 $as_echo "$ac_cv_POSTGRESQL_VERSION" >&6; } if test "X$_AX_LIB_POSTGRESQL_PKG_CONFIG_fail" = "Xyes"; then : break fi POSTGRESQL_VERSION="$ac_cv_POSTGRESQL_VERSION" found_postgresql=yes break; done if test X"$found_postgresql" = "Xno"; then : found_postgresql="no" _AX_LIB_POSTGRESQL_OLD_fail="no" while true; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pg_config program" >&5 $as_echo_n "checking for the pg_config program... " >&6; } if ${ac_cv_path_PG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$PG_CONFIG"; then ac_path_PG_CONFIG_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in pg_config; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_PG_CONFIG="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_PG_CONFIG" || continue ac_cv_path_PG_CONFIG="";$ac_path_PG_CONFIG --includedir > /dev/null \ && ac_cv_path_PG_CONFIG=$ac_path_PG_CONFIG ac_path_PG_CONFIG_found=: $ac_path_PG_CONFIG_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_PG_CONFIG"; then ac_cv_path_PG_CONFIG="" fi else ac_cv_path_PG_CONFIG=$PG_CONFIG fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_PG_CONFIG" >&5 $as_echo "$ac_cv_path_PG_CONFIG" >&6; } PG_CONFIG=$ac_cv_path_PG_CONFIG if test "X$PG_CONFIG" = "X"; then : break fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the PostgreSQL libraries CPPFLAGS" >&5 $as_echo_n "checking for the PostgreSQL libraries CPPFLAGS... " >&6; } if ${ac_cv_POSTGRESQL_CPPFLAGS+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_POSTGRESQL_CPPFLAGS="-I`$PG_CONFIG --includedir`" || _AX_LIB_POSTGRESQL_OLD_fail=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_POSTGRESQL_CPPFLAGS" >&5 $as_echo "$ac_cv_POSTGRESQL_CPPFLAGS" >&6; } if test "X$_AX_LIB_POSTGRESQL_OLD_fail" = "Xyes"; then : break fi POSTGRESQL_CPPFLAGS="$ac_cv_POSTGRESQL_CPPFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the PostgreSQL libraries LDFLAGS" >&5 $as_echo_n "checking for the PostgreSQL libraries LDFLAGS... " >&6; } if ${ac_cv_POSTGRESQL_LDFLAGS+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_POSTGRESQL_LDFLAGS="-L`$PG_CONFIG --libdir`" || _AX_LIB_POSTGRESQL_OLD_fail=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_POSTGRESQL_LDFLAGS" >&5 $as_echo "$ac_cv_POSTGRESQL_LDFLAGS" >&6; } if test "X$_AX_LIB_POSTGRESQL_OLD_fail" = "Xyes"; then : break fi POSTGRESQL_LDFLAGS="$ac_cv_POSTGRESQL_LDFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the PostgreSQL libraries LIBS" >&5 $as_echo_n "checking for the PostgreSQL libraries LIBS... " >&6; } if ${ac_cv_POSTGRESQL_LIBS+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_POSTGRESQL_LIBS="-lpq" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_POSTGRESQL_LIBS" >&5 $as_echo "$ac_cv_POSTGRESQL_LIBS" >&6; } POSTGRESQL_LIBS="$ac_cv_POSTGRESQL_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the PostgreSQL version" >&5 $as_echo_n "checking for the PostgreSQL version... " >&6; } if ${ac_cv_POSTGRESQL_VERSION+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_POSTGRESQL_VERSION=`$PG_CONFIG --version | sed "s/^PostgreSQL[[:space:]][[:space:]]*\([0-9.][0-9.]*\).*/\1/"` \ || _AX_LIB_POSTGRESQL_OLD_fail=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_POSTGRESQL_VERSION" >&5 $as_echo "$ac_cv_POSTGRESQL_VERSION" >&6; } if test "X$_AX_LIB_POSTGRESQL_OLD_fail" = "Xyes"; then : break fi POSTGRESQL_VERSION="$ac_cv_POSTGRESQL_VERSION" if test X"$postgresql_version_req" != "X"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if PostgreSQL version $POSTGRESQL_VERSION is >= $postgresql_version_req" >&5 $as_echo_n "checking if PostgreSQL version $POSTGRESQL_VERSION is >= $postgresql_version_req... " >&6; } # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. ax_compare_version_A=`echo "$POSTGRESQL_VERSION" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version_B=`echo "$postgresql_version_req" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version=`echo "x$ax_compare_version_A x$ax_compare_version_B" | sed 's/^ *//' | sort -r | sed "s/x${ax_compare_version_A}/true/;s/x${ax_compare_version_B}/false/;1q"` if test "$ax_compare_version" = "true" ; then found_postgresql_req_version=yes else found_postgresql_req_version=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $found_postgresql_req_version" >&5 $as_echo "$found_postgresql_req_version" >&6; } fi if test "Xfound_postgresql_req_version" = "Xno"; then : break fi found_postgresql="yes" break done fi if test X"$found_postgresql" = Xyes; then : _AX_LIB_POSTGRESQL_OLD_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $POSTGRESQL_CPPFLAGS" _AX_LIB_POSTGRESQL_OLD_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $POSTGRESQL_LDFLAGS" _AX_LIB_POSTGRESQL_OLD_LIBS="$LIBS" LIBS="$LIBS $POSTGRESQL_LIBS" while true; do ac_fn_c_check_header_mongrel "$LINENO" "libpq-fe.h" "ac_cv_header_libpq_fe_h" "$ac_includes_default" if test "x$ac_cv_header_libpq_fe_h" = xyes; then : else found_postgresql=no fi if test "X$found_postgresql" = "Xno"; then : break fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the PostgreSQL library linking is working" >&5 $as_echo_n "checking for the PostgreSQL library linking is working... " >&6; } if ${ac_cv_postgresql_found+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char conninfo[]="dbname = postgres"; PGconn *conn; conn = PQconnectdb(conninfo); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_postgresql_found=yes else ac_cv_postgresql_found=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_postgresql_found" >&5 $as_echo "$ac_cv_postgresql_found" >&6; } found_postgresql="$ac_cv_postgresql_found" if test "X$found_postgresql" = "Xno"; then : break fi break done CPPFLAGS="$_AX_LIB_POSTGRESQL_OLD_CPPFLAGS" LDFLAGS="$_AX_LIB_POSTGRESQL_OLD_LDFLAGS" LIBS="$_AX_LIB_POSTGRESQL_OLD_LIBS" fi if test "x$found_postgresql" = "xyes"; then : $as_echo "#define HAVE_POSTGRESQL 1" >>confdefs.h fi fi if test "x$found_postgresql" = "xyes"; then : : else { $as_echo "$as_me:${as_lineno-$LINENO}: PostgreSQL library not found" >&5 $as_echo "$as_me: PostgreSQL library not found" >&6;} fi case "$ax_cv_ncurses" in "no") as_fn_error $? "ncurses not found" "$LINENO" 5 esac case "$ax_cv_ncursesw" in "no") { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: The found ncurses library does not support wide-char." >&5 $as_echo "$as_me: WARNING: The found ncurses library does not support wide-char." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: This means that pspg will not correctly render UTF-8." >&5 $as_echo "$as_me: WARNING: This means that pspg will not correctly render UTF-8." >&2;} esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for roundl in -lm" >&5 $as_echo_n "checking for roundl in -lm... " >&6; } if ${ac_cv_lib_m_roundl+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char roundl (); int main () { return roundl (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_roundl=yes else ac_cv_lib_m_roundl=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_roundl" >&5 $as_echo "$ac_cv_lib_m_roundl" >&6; } if test "x$ac_cv_lib_m_roundl" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 _ACEOF LIBS="-lm $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5 $as_echo_n "checking for library containing clock_gettime... " >&6; } if ${ac_cv_search_clock_gettime+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char clock_gettime (); int main () { return clock_gettime (); ; return 0; } _ACEOF for ac_lib in '' rt posix4; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_clock_gettime=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_clock_gettime+:} false; then : break fi done if ${ac_cv_search_clock_gettime+:} false; then : else ac_cv_search_clock_gettime=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5 $as_echo "$ac_cv_search_clock_gettime" >&6; } ac_res=$ac_cv_search_clock_gettime if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else as_fn_error $? "Function clock_gettime not available." "$LINENO" 5 fi ac_config_files="$ac_config_files config.make" if test "$ax_cv_panel" = yes; then COMPILE_MENU=1 CFLAGS="$CFLAGS -DCOMPILE_MENU" fi # supply -g if --enable-debug if test "$enable_debug" = yes && test "$ac_cv_prog_cc_g" = yes; then CFLAGS="$CFLAGS -g" fi cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by pspg $as_me 0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ pspg config.status 0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.make") CONFIG_FILES="$CONFIG_FILES config.make" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi pspg-2.6.6/configure.ac000066400000000000000000000025321360716715600150020ustar00rootroot00000000000000AC_INIT([pspg],[0],[pavel.stehule@gmail.com],[pspg]) AC_LANG([C]) AC_CONFIG_SRCDIR(src) dnl Document where we keep our .m4 file. AC_CONFIG_MACRO_DIR([tools]) dnl Make sure aclocal actually found it! m4_pattern_forbid([^AX_]) AC_PROG_CC AC_HEADER_STDC AC_HEADER_TIOCGWINSZ AX_DEBUG_CFLAGS AX_WITH_CURSES AX_WITH_CURSES_PANEL AX_LIB_READLINE AX_LIB_POSTGRESQL([],[], AC_MSG_NOTICE([PostgreSQL library not found])) case "$ax_cv_ncurses" in "no") AC_MSG_ERROR([ncurses not found]) esac case "$ax_cv_ncursesw" in "no") AC_MSG_WARN([The found ncurses library does not support wide-char.]) AC_MSG_WARN([This means that pspg will not correctly render UTF-8.]) esac AC_CHECK_LIB([m],[roundl]) AC_SEARCH_LIBS([clock_gettime], [rt posix4], [], [AC_MSG_ERROR([Function clock_gettime not available.])] ) AC_SUBST(enable_debug) AC_SUBST(CURSES_LIBS) AC_SUBST(COVERAGE_CFLAGS) AC_SUBST(COVERAGE_LDFLAGS) AC_SUBST(COMPILE_MENU) AC_SUBST(POSTGRESQL_CFLAGS) AC_SUBST(POSTGRESQL_LDFLAGS) AC_SUBST([POSTGRESQL_VERSION]) AC_SUBST([POSTGRESQL_CPPFLAGS]) AC_SUBST([POSTGRESQL_LDFLAGS]) AC_SUBST([POSTGRESQL_LIBS]) AC_CONFIG_FILES([config.make]) if test "$ax_cv_panel" = yes; then COMPILE_MENU=1 CFLAGS="$CFLAGS -DCOMPILE_MENU" fi # supply -g if --enable-debug if test "$enable_debug" = yes && test "$ac_cv_prog_cc_g" = yes; then CFLAGS="$CFLAGS -g" fi AC_OUTPUT pspg-2.6.6/pspg.spec000066400000000000000000000077051360716715600143500ustar00rootroot00000000000000# -*- mode: rpm-spec-mode; encoding: utf-8; -*- # Pass '--without docs' to rpmbuild if you don't want the documentation to be build Summary: pspg: a unix pager optimized for psql Name: pspg Version: 2.6.4 Release: 0%{?dist} License: BSD Group: Development/Tools Vendor: Pavel Stehule URL: https://github.com/okbob/pspg Source: https://github.com/okbob/pspg/archive/%{version}.tar.gz BuildRequires: ncurses-devel readline-devel libpq-devel BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Requires: ncurses readline libpq %description psps is a unix pager optimized for psql. It can freeze rows, freeze columns, and lot of color themes are included. %prep %setup -q -n pspg %build %configure CFLAGS="$RPM_OPT_FLAGS" %{__make} %{_smp_mflags} \ prefix=%{_prefix} \ all %install [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT CFLAGS="$RPM_OPT_FLAGS" %{__make} %{_smp_mflags} DESTDIR=$RPM_BUILD_ROOT \ prefix=%{_prefix} bindir=%{_bindir} mandir=%{_mandir} \ install %clean [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %{_bindir}/* %changelog * Thu Dec 12 2019 Pavel Stehule - possibility to specify NULL string * Sun Nov 24 2019 Pavel Stehule - tsv format suppport * Fri Nov 15 2019 Pavel Stehule - fix entering string on CentOS 7.7 - try to process -F without ncurses start - infrastructure cleaning * Mon Nov 4 2019 Pavel Stehule - materialize dependency on libpq - add internal performance diagnostics - few micro optimizations * Sun Oct 27 2019 Pavel Stehule - non interactive mode for csv - possibility to take data from query - watch mode * Wed Oct 9 2019 Pavel Stehule - better handling Escape and sigint signal - more comfortable usage of readline input * Wed Sep 25 2019 Pavel Stehule - pspg can be used as csv viewer * Sun Sep 8 2019 Pavel Stehule - complete support (with multilines) of sort over columns with numeric values * Thu Sep 5 2019 Pavel Stehule - initial possibility to sort by numeric column * Sun Sep 1 2019 Pavel Stehule - column search * Sat Aug 24 2019 Pavel Stehule - vertical (column) cursor support * Wed Jul 24 2019 Pavel Stehule - fix minor issues - left scrolling and theme changing * Mon Apr 8 2019 Pavel Stehule - fix minor issue related to draw menu, when terminal is resized * Thu Mar 21 2019 Pavel Stehule - use higher 8 colours when it is possible (fix Fodora 30 issue) - new themes - new options: bold labels, bold cursors * Mon Sep 10 2018 Pavel Stehule - possibility to show line numbers and hide cursor, menu and status bar - new themes - fix some bugs * Thu Jul 19 2018 Pavel Stehule - menu support - new themes * Thu Apr 26 2018 Pavel Stehule - compile with readline when it is available - history support - fix some bugs * Fri Mar 16 2018 Pavel Stehule - lot of bugfixes related to searching - code cleaning - 8bit encoding support * Sun Feb 11 2018 Pavel Stehule - fix few crash related when searching was used * Fri Jan 12 2017 Pavel Stehule - possibility to replace ascii art by unicode * Thu Dec 28 2017 Pavel Stehule - bookmarks - searching is much better now * Fri Dec 15 2017 Pavel Stehule - case insensitive searching * Fri Dec 1 2017 Pavel Stehule - less like status bar * Sat Nov 25 2017 Pavel Stehule - lot of fixes and new features * Wed Sep 13 2017 Pavel Stehule - initial version pspg-2.6.6/screenshots/000077500000000000000000000000001360716715600150525ustar00rootroot00000000000000pspg-2.6.6/screenshots/pspg-modern.png000066400000000000000000003452761360716715600200340ustar00rootroot00000000000000PNG  IHDROPsBIT|dtEXtSoftwaregnome-screenshot>9iTXtCreation TimeČt 6. prosince 2018, 06:07:22 CET ˃ IDATxw|ulI6^z HTzv,g8SO) [(J Md3?B $BEvf33wB%2d?PW!B!MӨ'z߷oF )T,Yftt6 UUQUYB!BѺt:t:zzܹsK,ٳ-//GUU4MkxB!B2Uwdׯ[;Xb2|;7m* !B!h4FQ5jJll.B!B+ɓ'O*fL;5w0B!B!<e:^ol@B!B\ ʧ !B!;!B!W6)<B!B8B!B!J O!B!%B!BS!hmTcB!.B!Smn? (M/YӦ01 ﯉܊85}5g]όד5w4B!4~<㌺nW O!W ~w,,Ŀn{d<~nC'1*Nk;W\]e'.u #a~bfyI8H/]iBN-{v|~W73oƩ=;ל KI<_^ɶ8m4<|?ׇg_WCAM]D/)?MqYGy`l(2Yx=೿D+o {bO߸;X/W1S~ǟq[OZ}SZߐ~[t܇_/fdJ11=Jm9}> gU<u<>hOzWšFaezd{_(BzwTix7/V!#t:ȕ ܿ6^_HV/&MtA;7^8\C!v,4w$Nq=1o/s>,X o -?_p>v'sgqDQ#訝銪)l] EF39cX.Jf2i黾䙇^g/׌k%ֺڲQ}^|7obVT?thގ[u<%7I$OЬ3>eZ,wL[~MǦ),aȐPr6mKF ! '7Ǚ{:yy[x{_VRx !hJan(͘vBP 4-b4'dRc';8e)rxi*4=LHbaF_闒L~̙߿d28)0|&g{rh5/%\!m'ޭVn[<38yەS!&*Vocm0%%XRҏŲtP Nq sy_AeYи~]",:^..Tc7c?~AыVu73a!Y䭬/FQJI/t۝k*yxNqr߃KH GCt !ۯ|}=gI);RysS̻w.@qlc&r(AIlQTu*cx >aɏz?:wBPJkyXw߳W3uzom19MGXGoL]np%$Y{[6-Tfu(t8?hA!>غwSnB=B!BM_΃s?$g,ywH6κ;& gG/x1('!¡S!ĕʴ3Rlv oI$yB!hATU7ƱQU8$Ǯ%肏SyE vc IJX>!BѬ:G2ׇAP)`+f*;>!BPeee|f9&+,Kt4Zl2/5}XfLe߈n%7zL9j'C\OŃOE3܈qOIѴIBFо,z23gFdiّt `ń1ϼ#{: 7v 3gxu?&j;{%S?IddCsE &:c'۠NuN䱬4#yhNϘvO="~-5w۟ZݶW Lo`g)Gfz ;O(w_ٔdrhDzWΣ߉jt/]gKUp⍑Tv~*x=MCld^O]x^ EJsNѧفydc!CYKIw| V~.[nJ,m#X;4̸-t];pŷzZ#=ٴ{Ѕ]<[ť1zvdyq@qaܯ;+ XۻQtE{㯼f /\n?G:3դcx}OUuYO[k +_;rEũz"NDTuzJ-+Pa9gZ +s&TY>W4O3ĥ_a#=++h-W+\QRz3Fbl#Vb?K`ou701Zc|CX(:NӧQWpY~K6b~LsU뷆jESmT*(Ieߟ`K>E&B!j*ԙ\ҷ剳y5?\zj+- [Ūao'ڗzu O1hdZ.rOA&X1_WtEHVP>Xl9b-,NTblFR)5~˧*NxkeUǧQZJWPv.>SLz\ K~Y=yv7u^2؜~vCaNK퇏*T#?7\˭ ƪ} 3O`NK8Y>ia=B\Nr IKd{!VN̕$O3~V+0-[e!ٿMXZG`!{yHǢj*vu-8.rB! O]`/|E)Yo$Чݹ^oŠiߐy{7M=-)(]A⦃L5U袍3?B5 r-7r0>׼t;r l\'yS:1I50Wu}# ;;uGWwb;Ӆ+8e"~g}'R=c7GƍQ<桀R)$Omz͡`gWs#?}&E&_5>:S/HY\?^(Z gb1}#z0ntlPUncP0sWcs =4Chʮ 'ح;[fUwN?}7i#ɩ6zeՓɞ95z&KCώKH+&\y $|_?ܓep Zh׎:{zGq1 w: 7 qO?+}fᆵd~~Yz3??9RSuI8QWg}#fof19đTu˯QoZX*2+d%Iw0?=u_sȿ7W6/)-:őYz x}9:~QK2>$*1ᤞNS42n};xj}svub驳4/DZWʈf65 ,q;łUDݑ 8>a7, (&7=^KO/=B@L<` tܼh /u !Sp盛XN ^#cY͓SqwbeY^]t"Qa0&e+ Z,Va1ikVn(ALw Nq桑|MuatccD'vglQql*7œZt1(1-6k}7'؏9Ag 1C:?{,!~Bߠ+#X;4̸-t];pŷ^GhO0.k~D z5t={ orSҰun?{CyoEs6:LnZCٿԡ^kXMy]GOƻc$:䋷SV_ہe Y̙rPrc >:6o{:|5M C,7#=[:R9m]뗽O_ßeLcNAck]؛t0KDFiL'_'}cZc@eX~€%˗ѹWQӿtp^ZޞR(ƍQyiOl+9q`{R܉*#t!)=z^U-w%SL.PBJɹeYq16 &R)NٔvB)PԶ+Eֿנ"n~.c}ULsVd6k_78$G"Ӎŭő_Cۯ4(rUR7ֲke/: HQeT5I;AUײgS9B1M6*J@]c4;[-?VdџSةKưj(? ;7cBgrk%dԯ}5!$KC]9UOߵ,&A߷9#K1&<.{%>{yV Ԡqꯦ٤Y[9sgkX>MώL pT::ΣpѤ,9~yDš<;7 F?1[&\~4@ɆAGa"JS CIGwV]n 0 3IWm|x}lYlF`(ʢMI4&(<0v:֚Olt `ty2_X͜?߾X g3stDYd_BҊ8~-`=;ӫeaRHȴQ@Bzjn&h8|R? ?QdogW/tlѕ߮!/y3wuyg;>d|ב]2{ D9:21Bx*~};dk_j^l5Y߱5+VB#W5?\ nlˤ+/?ĝax;1/䩭-vjyZ?hEqE`24!?yZm~jkw_qgkߤ(>6ؼekZu ujʵ߂.5S ÃX{) !hmdR7G秭_0y4s t7Mrbj~B4 W$CX!D#KoôS)c3m'cIya8\rz(^ϿhcR[!DKm6ɏcI~Fwi4V!B!DK#B!BSF췖!85w(E~Ix7t+ҎG&y7B@@! j0.ص !B\>B4=C#X9z3o yH3oLh٪ !C!D !$LU3`WnAtkB!rJiF')0'F12/wxah+7=l8ŏuDu˜ (1,x6t >ǍG7&1=(.<4 'l㦁Y:])#Ƽ3Ψ췎o/d#=p:zRT$ $Qs#׀3[01ߤ ?Bo0Ӄ*qAI,+ʜ gJ(CCǐ!dbm9sB?BBj?Cٰo ]S _|SȲ|#= ~F C$?%mɟcZx dEb4≕PN~>gq:% EaUU4MBS))3RKwXc/3_%U!DSQ* 'X^TlbK fl OmX,':pt7sB 9AA}n|?$%N߹)x"1r4^;Vsp~ӷS&q,oH.|Y>h6VZ)H{cmcڗzu O1h;{`A8u6Ne#B=/O5U3@cU$*zEWu|+oXq29C=;0 ;2]=@c信s{2J-T\Ntfc#ڗp$l{$?%mɟcIEѦ4p#YsVgNi9ܑ۟w = ȲADlQߛUYrxK/FE41'Q-2lv AKu)q*eKjI2_w9R[-:%&ybB\.ؾ4xg۲nȒㇺI~K0Ki[Uא\w\;rB!BS!B!CI)B!¡*.t[$ZmMϿBҵ}uK%8a$%=B!B!J Ơeiߺ nQ[xcB4&6$f 㑫gsw19U{<[0|)d'4w4B6Ie{Zmz!BfqqZ55qRUKL Gq0V4WB iN9ƑSy_͜UӀ"8 n\wPhA4X|{埦ɣ`1 ,vp;DG^k o6P7D\wobZIVΜsL4-ȿ`FYΉ;3 %G?B!Dۥu|3c.RLҷ!'v-li`[ {3c_ÿuV.xڡ垮;49F4Pb?5u! Ϫt!p00j6oS׌8qƩ<[1P^ۯ?OzAghq_b3;\;0oJܔ\Pzޝ@AA:ϛeh5y}+g⫚֙x~pwjfݩX>IV֠v<2f3rqķy9{{Dz~{E64g4No!tO:gC7þ񽉨m8ޱ9X3Oƒ ^rWo{0؋/@q-n{\6jn oVV:2ޜ]Y:~g8 kr/JzǍL[_vD b{NמcD'vglQqgU718o'8cPb[Uiwzsˊ\ucH|2Y[goUWeoOboiW:@juZS*k):Uǯh`> k+j|WDZ].ixŗ|90 &BcUܻCJÑvpDp7 ;]c7\VO#1ZTC?\>8xVJ|@n`Q'%B.*{=;w=O$eS/Lc)d󑝼OM8TUU4 Mbfу,,k_JN8 ,eĤí꒗w8eIDv &@͜k3( ̟?{WwԾ|CYg0ë er-ڈ:_E=X᝹pMp o(,WKدi6=d6[L:InT?=C(ӠTOhE;b;Åh.jW#RVwy<;:N>\gr!Hߞ'qrF#rJ'L:R3\t}yW]+(@YPƾc;xgD#PgT)?Qۥ__uh~yyu~^Uy}8ġrK%[럽RG8 (k mag׀86W3c('(ɄUÂn.(8̐Bܸn;6W; 9 %ZfHS18J644e 2rUU [oº/[9i`7WL($"s;CB޿d x(?O̒ûX}y5*99Q(7z7ĩ(U,%|כBI BM檂W_/WgS%lWB^9$ jx$PɥWqi,9e/([YyߪQ-L^=TbG,(G24 0|2?n;{|_x30?n*ve  ̇Tu/=l(͝w %hN݁^DQT=Rng >8ƦQPZ)ފKDM@']9g%xLaf,S^Q3R`N}D9C%h#>+S\[ Jؕ|ΔT68oN:^4ng3x&OU'*̧y5!ΫOl?Dn3͜?򷯮K4n8w9> 01cx0GaOܢԙ&XSmO]ǯ¾{<:G炗$bM;2f %h/6-:%&z]JԩL;S~agB+ۗ]a729~DZ$ #4Z`i5]t)N !B!p()<B!B8B y} vB!ի- Em}EҲnBkij9~DZ$ #4[ =B!B!J ƠӧB!>z\ K^o9j89~MռS!BMgBcpP_OG7PŠi1;|nk+W#RG+Y!h%*_sf+ bG<֜&X?~ʹ4] [l ;wBCͅB $Hj)=/6mگT#A[%J-CO1/V5C @ǁt %ýk;%驙K Z 3Wtࠅ()NpېfVB!D}3}tP`8]!-C pӍPt R[U͌Ø$?OEojMIZ a0YzxA|f6f~rVWDN*&6G9~| THiLCQlXkP',]r-}aT q%ïc~j!2'6SFyx].킷LuL9gtƫ0MG^^ o<_5~ݙ@NV+Pvj_řyCG3)3#>WvL@J5 mgȔ:)mx%h]1ӹsϔ` (]h͊<XbrmUӧxAgر ,;#mXMxZas[<83yH 9̽.Ve#/] 3gC#LYY]v< <4$9/{wL"Nȴ̾q:yp2o>c +17/ bݷ520Хھ وhV:Rj!/9B0l;ERq}j a}y@&?y(NL?]R;o _ ƫ۶An7~sܿ?;V+dӺDt_8Mo%|Y||M[Oqg~D׷kdps6jkZxB $$V'A$:m,,.TXx'L Yzþ%plآRst 2ytr39ɼx,ZZ|Z@n壸$Nǒ2w"V?¾)0%& A5A8v$)6|JOІ_'d2h+׀\]Y@isdO4&OޕĽDfp*568ײBn oR88C Ivt3i&F]rFLf3ZES/#gNTŜ.yih9vG9ZG'0꯼Pm|u@!Y5nNxh4Y#PX%ˬpu QCRZ!%5Dy[Oq0ୖ\RYKʷ]m\?¾P 8ab8M^!l.͹njn )X8È{'rDxjۧ0 kp:_|/>ԇ%ʷ쪩^ʺ&x!#xw+֑cC+D]䕕u`q{pOfc / T@M]g*eh1h|ZrUQ,U |X |pTZWr |lJ[$\H* PNZAAM$Xh:TK4ezM嬪p3ZڢnSaFuh!CV'^Ydw mF*m]U wnlJJn2qpMHZ(.2 i&#^zr*9%{bl0&6ǝ]Bimu3q $KLuuDz4ٞttN ̲>h⤘/5QjhՁۺr~>OApw^ G՟':[|[\7D;0 ׹h.u1AukZ;g;8Ρpt;dI7jCyZhC@ǁd|vaHpHd,thѭ)ǜڞ)'s WGcZj(oA~-,X9z>qXqnЅZό_ xU)iZx“ S%~><"ڰ7VEA '~%`FJ,4ڰ,)SmDM`Pxo_-syLe6M-=;p 瓑h1Gz<9E xǐ/T)JǞvq{ծ9'/7W 6o׋C:˪":>b僡>fODAko~Da VZf:5_g31`閺hެ_c(O5a p#~/OOBOPLy\ (J]'seE^myjXK/ZFFDE& .N؜ ;I_5_lW[ߤIfR> KHՍ͍ޑ|Ǎnܘ/96Ϋm jF~HkNB!hfRIMMt^剧)fQfc-duB!͟t<6g6f_x{OL_!B!B!t<B!B4(x !{%_uy̼&S{3&U"Q##QoLC#{:BL+Uςw''WKQX|AL{ z6ڴ3M>>yN鲓&™ׇaP"qІ, MI]|pOdP! : E@)0 ;f-0kXYzt <13wBn6RmX=˕ES' < l̄ZR[mt8SᶼyLI\BSΛ b@%t4!{S0Vyښ%ùˁ|VhSe;Kot/rN򷝇XjuױD7+2ѷ*mLLO¾=y WS.Of .E=z ěPǙ?9xuO-dX&r̀\Bor h܍Wa8xW3J9ֆT/rϰXuUyCsyiVU|+C xX@qfLS%(6ۙ@q-gDA v%d{ d6:ͣJ|T ~;W̡ >Lo*WuI Ë O#1G_˖BLj/;6@bE{pضa5icBPc>k.!,@ ~x{ѕ+X '4"}}` Rv L4Q_3 /*n̍˨-c tvrpClo}4tx&~Yz|a) 3(TN'h|}<{X2ѭVϻ2kwxjWm>n~?wtV> ݃}>Mu_ZSWp6$-.|K8S> ;Ho%"Z]Yn( ӹ#bLDZf.J(O4i'@Bbe"1zف6yA,zVWzzUHc+0TL&֗adt:SXoط [0pSUj΁! <RfV5g)_$0}n*x"rq';_0>WCn5Bql ;[Mip6! dgCRxm))Ĥk{UœEjyrhd$%7X˷j\$g*'-8oTﲙ={ () *vd郊lFUUT3E%=z,*S03Kx1~.4Ql峸d3Xk#y\f Sx\᭼.?9]:Ҡ Дs2$ s4Nj=ya_y)r Ck(ݜ*(@iGJ:%Y@BJjJ`[-%|S)y.. Ltjrx&j[Wmu'6JG=] )0vZmۏ?m3b!zXnrp~7BvZ4c yN0^YnkO `憗7ġ6o7+plJu$,c΁\ ?4lB46 ŗ`GL*IǮY -%#}@UꌪeUy8' 1Z7l Ck/t>Gz9woZ>Hr WɫsGZ|} @Օ(ϳ2%8d̉l:W?T z+ k-`jMaj.$BH('-{FPkP  9RT1Xqh /~+FR48/8fxVuS 6­s D M4#Z"LOI-@IxvۆԾL%a@m\wfv !LŷU}L\;c\˓/2 ^ rĪau7(ԛ6z Z=Z(W-#s9yxàsWPgiG['L~UC@<ֽ7x J> <9J|ugF HnOSXЊmAZNh6Qm&ƒBNӣ-s/ԡY?ę`N>{s(e0B!4ν zw3GT9oi-UNl:\xnt6'!C```8PCtÝ.a7 x:KT֔cNm}dT87?!%xn{Ȟ+?Y'ΐ ?8L9$ミi|a4ay>\+?B'ƎPj4i3> *J)zZ~_d[[oDS{ Zm/?} aCrX<9d炦}$ha+)S{eM `1;@tǼ," Yz0뭄y.>N2h#gR,q8կB4*Օ? ̄V;TBw#F !@0u2L{K_:wì`f ?FMW)ցx6ү:IQފC LR/Oves5LK$$4 XNy?ìy>\ E%p(m嗠uHޢ-?S+\ pb$ . \B*DP\g*5eLq j;PI?M[5G|(!|fҊM4z> q5R(q1_)&~iٕ \s+~5 7A:5bd ѬӊƅK'S݈)[SEGNs|8w]"1^)?i`ʅ_s/(;"7Nj-9C 9Qdž(u>)MF21TezGc,UŤ^8?(x:8\vjҿVfc ##勞{f24uk [4Lg|BTBR!U5 d-gi\}$ꇇW7#¢ {˃jbǰbdhVޱ=)Zr#=́xt?*וA$Ѱ%V́~8:M2ʅQؚٕ?Ư:Τw uxKK4x1]W)uiѥ=4TGⓒUJ9Q`"<(<=2'4:kd.Lfm;3*ޢ3q l~Ô_}'e`N>{s(e0Y2dWj2 Fu?MSB&2в|_\}\ݓyLB3ٜwϥ2mo)qwo;7r,-ܵnnk6ɹ<l/}S aީo(OF &_AY/wT2\uX>o{ob?23O<0^s:/L`uQWf`jX~ҷZO#Z,]/xV .XY\|̀^wl[ji\}x!4kBOiRً+8:KQՓ9ϣW<5j-U##Ql .N[5r7iD~OÒ6R~u}sw$_Cqe7fR[!hCy7Z-x8yԩu4BQV!-DN^xrne6:6[oMSO!!O!11{Zf4Ba,B!BѠ)B!AIdz ?(kB!DEp~T8TώlB!B4!v2i&tDoԂ5&l&ja*󯫴}d j97 5}^Ӥ *'| vR{B!V[O!B_mGV|ON/)?jj a+xsXs/,zeG!=X̎"1o',Ȁ™ׇaP"qІ7 qaLx| )K#BS'ô2탮S`zxw>Z a04][b?nH'Gy+";.. \s@ ޣL毀2rIc0#6r)B4#:4bWBLYn<;@fsȮ+?8} Cz ,[ 1Nîᦑ~S51Ys65d:][adx;ךKalvi#-P~ SCv*,&OyW:c(:Qs+B:Qf:mԦM?Wۯ>{>a *72-.RV/ !-JA1 J৷-D5Mq6*|uvʜO]&x.|l>Xj+B!nIS!B!DB!B%O!B! J:B!B!t-7Z19/L ӟt.!93ӽ:vfcq>= Gs,GV:F\Ԫ m;At>C܍Wa8xW3JQg ̈́ :UBn#q gr39ɼx,:DXK'lFUUT3E%=z<56/ĵR9uH GM;~"Z#0H[ŽD0ÆA cM9up I!/Q5][)F,L:ncE#er/ʬƿlܔ]? {A_ Kc-iKS^)U?^}!V\Mr5Ӫr0+(OޕĽDfPuNqA/IE]}ygDs)+1/ f qp%l/-)@+efߥ uNF;dVNmzh:jHJ+N *%\:f.tKn&@Sɴ,<r\xڕ%4sӬZ# W!3'~%`FI-RQkFy0hJ̨)0)x0o\[g㢪 ",;\w%5V-ky[Zݴnݶm,RfYbni j" : 3Ǡ`~x)9Üswcvio=rGϟ+1AG`O,9#m:bKq,ZnOh+Perh3fuyĝ^ѐ{űΞF+?\kqQثħ@ݑXWW7,b:m0h 'wUi<H[$I|V Y +``&KLvўk J?VƘɮJ,5 @.WbUAݯRH-6nn ˂,+j!f>&&>ں}a׏SZap< u%Ra˰q ?@nMLнx..B<]m űtH ֻ5|ue- $|ž8h|3J+,)F@M~L=`b/сG ej|0 MA_ ̽\W7sg`QQFړ&ehByG; !MG=6 #tp+gZAg>KdCIʼ8yϵ$zC?4|CxU0s,J45af:n܆4i0huxk;>!jgm;ph }6C(ꎈ~; t>0d8 QTH:`tq`l ndsO߳faX%MQǬ̈́$fѥ-WOA^7՜yCgwn9O"{ OB޼Ej`i&9hH-bɾ]4;7~<rؘm'(̫tԼxڎ7d\c*d6\;?'uNنs'l+{ĝNOlOZ 3 VHng"?0-;@. G`e#]r're_م+V8L IDATcV\X7+/aMjMO>rn!]mB!B,I<B!BT+I<B!BT+I<B!BT+I<B!BT+InQ]hu0MX1tjQK|f[8;f,9CCuBcncKK#vHH/+,[!{̀>%Ó @GGB0Mx {+,2US=^Df೩pe9y'cW"Xy-BB(vv B\ ^&]_P SSVgGUs}w Az6aRcQ6arR*hM5F>n iqy/:|/~`6 =Xj DL?´en {BJ$k÷WQIM/Gd7޶x#<7JJ3/w pvn^{s+&sg>BxKG`/dWaf8!o n/7&-ob;E_<&}8==*#״ɬCWtL@j>{%27Y70&`!|sLZ-'M(Dv#H7ҢAZ9|QlgF c17Sf [4܋+winЧ\ A=k}!p3dgp^##oB8>r6عn 25$,s;͍TW-?)>)B2pFCPoXO8>ѴN^W }4kB)v@Ctd%154شeJ(}P X2*"~lMɤvpϿS! ϔ$av#`UpbR#Evo}a^i)!tqv$%c|J[ijLXm80 C !i: \رé(q V&VgB s<}Ř̙Ħ-1V8r;I0:(̡Y`~)p,:=ȼZXծ#BL?p Y|x [邫[2 94OWK0xs yNsH5hz@Щ#|gd>ϻGSQ[{}'> yd_RbQUbNX[u3g4~|yW5_A09xZ@Ճ^ ހ?ꂔ- X`tV7^Cٰ!n犉UrX7w; CI钕k0:XB:weݬ}6V}-Ba~i4ʍ!6OيSyyگ]Cȏ{Y4*ϱX.VYv qw&RMnɄ]O=2HGg p3r.0vtw&.j U7x[nw|eKL mS:92נU앾Av;VfW)V. b^l6qzWI/23Keߑ>?fVF5*TVMOa)n+|}]j3`yg`sGa.g7B;\T^$:G8}v৫ k9#4Z;îCu$?ݛ@Px|˟]_ρk(>!*;'x":I*(حW ߱M Ź=75~>n1]smUѢ(T( D-oebUA\ݽRVJh0a̜UMjew p1o_eXU2jh/[i⣭+ a9jTHuC55叫D OFX F]OFY&&׸ űtH⇌Kf0 XgxdA?R\B/C[1~t\τ7l'J)jM(/hǝA>if!x9ZΚ wh݌ByEIT{6q9>LnþL6Y뚼nŗaa^xc-oE),̓NaXԥcѿ̱|+"hׄy+kҊ;|t2 {۪"~ `n@4:`SyD+lCl yךGjDa!A2}Q!n#/-gy," Yl(d`^ߍM<ŅYܾ}Dȭp[07/I}e:dkKU`KpҿYۄ g//[^&ffTd.tbۋ؝?<rؘm'(̻ixm2+B~ I~&r&VM=3f8B_Mn:ɰu{XQS-bxt;XcsIqJω|ݳF! ><ǭd#necL8JNo't2}:tfKWBBvS)jNi0ed_BFpNYHzѳaZwC\-WؙC˟eQQ~eX٪:fť11(ΉEqC+*ޤIT/9룪]q^!}rV!B!˒S!B!DS!B!DS!B!DS!B!DS!BFsfH)B!ZHiD>=0&o"vN:r6ⵄr{*BZl;/he` 3X1<9Jz&,:[EwUy>!D^>{ p H<3ypj_EThZo>Zp3I !85&یIGa<i7K˵ فQi7E8;%cK\t0,~e5f'aDo7 O4FFC=wH Bb㵺P45- n6ÌPsqkC 7xɯmmc@!06hɰ3X{yN ! K!r6عn I"y9lkط˯eӐ?9Kܓ39/Fݡ[uHPt z@Cg@txxz|emk. olLJ)0X ̀OVҚC;xf&w5HB^|x& 0頃ÑpRom; Av:̹ƍYtVΰ-o:l*-e3u>Ύsϲ3C_ ;v:?1;{X煗V咮J se۾s@t4RDXlIᗳ`֯S$R `+p2ȃUÀhA>т|V#\)z&+ y&G@Ճ^ 4=ND шꐲq$뿅C+7+*Ş `t?5nx*P& $eӭQޛC0_Y 7&/ /Sf?9.ONvilqxK\hHfŻES>(AqmZQjy 3چp?X11>yčMIC؍>zPXY*ofBvsS8}vU2/yɆsjK{n:szr@ȱ˺ 8ߪ }Mȳ;K<=Ts P1_c_B!čB5BjDr| kj*J_Nܛ@Px|˟]_ρk(qa_|,+R|~4rʉRq +ϋc ICA)1ސf @͂`=YtФ+L+ݧ`XV0ӕi| L/W{CaP %փ?L>:Q#O!VضoI601r8שL:5|uCD?(_>H鋯 quo\,=E!Mw#bxS2kA}ðK|-e]v\ϓ0>w?@Zg>b8EQǬ̈́$fQIB:K'˛t8P  O_+$l7씵-VmI/HVfJGClP uvPCUx3ڣq77j*[N->rz΁ Y΄/}wߞ k;^y BS&&}Ǐ6. ol ? q({<;+|0|ⴈj?j[|[Ўo !B!\kx9 c"rx򘳣B!BNZB͇ 8~`k<*!B!뤫B!Bj%B!Bj%B!մt9,{ =:F̅g!c<B!Dy,8S|B.iD>=0&o"vN: 당k*T5ǼGߺEwmk~*#-- Jn(ŌkY"ҕ3:E&(496*>}$G n|X V|1D.fq ?Uxj7S%. &= -O?'&@CgGU{S=^Df೩e@asCpSbP& < ?Cp ΎJ`+($$< &^q>}w Aa9mä0m´Nz!1O@ 4lȂq51҂O^t.^ګШ%r£K(0h"z-|Ǻ??M xulX1ZoƵ* ZV7J*cZ?NlmpK4ґi!> ٕ|Ns#sI* Qm;)*y샷Ȇ<|$B `JTGfGPc٣oEyK&52[^N"YHUq>RH8yX !Տ)0EMOB <4ߧJ#oB8>hÙ|Dz!޹ajy9lkط˯LJWsG|*Ed; Av:̹ƍYBL )oW{K| &D@h}fDo[WX0*<#lM k&v4\ԅmqԛj£$F}L erqwuË^L۴u[yGmNT+ YwR]+E52+}~ڇ'h-|&vS"X[O>+cQb$թ*"֔M>oMI߆8ҔׯW! La2TXV-9?w$IgU {߂f<|x]#᠓sV!K<3C_<'n,3CD< K.Our\'T,{)Cq߭)?x[Y9`ºCU^@ ӆ¿si!*iG;g8Y޵z2h2..[-d'L@~KcbUAȳ/Yvp77}eAQ`7H,(2RGyW">P6`͜Ws=ǡ(rS eu|Jm]G׹ D5BjDr kj*֕KM/&g!/.sjΞ@ 0j&Dh!SjeByq,Ľâ!ǝ&4oxmMx魴;/Y!5Z۠B/fO 0:h?K6?XiU QΝMfEEykO*9aE dsGftv3-HJM `XaikpCz0a u ZZ^¢ ?،n<֊E]:fе_q| vo7 @n9-JTl"K@_7 Q Xah?gC{_8M# >Hb: +W5Z<}# IDATcYDؔxqy}7"7%lVun )扅P([2^; mɬ*l` _:u᡻a[󿀗c _(՜yCgwxE,ٷ&]X?#"v'ϗHmxى]#ېrV؉;L՟)yTVXg;:N4X\o:Y7+9ٞV]}'L?gɭ O`޼y4NʬB <  t8P  O_+$l7|ڪ'\=@xg1P1+34bH> ͇t9RTDdYꪺ~YqjL JlsbqE%_:F\YXhu]Q&5H&zk]Uj~b n7|萋YB!B!$B!B!$BWyՌZ7ڊ !Bx !B!Vx !B!VxְȉԊǦ q3jg5١%7q!)0b.<3@^ kj%0AQ+Pg!B!xi8(O|Oz*ɛN&3f旓_SX {>>E[/,Dg?pfJ GgSdZ=+guՄ5l;/he` 3X1<9Jz&,:p[,xZi+Vi/=UzuENF\k3ypj_EThZo>ZPr*f`T;ﺅs.ú۝uۻ }C~w؁ ~FR!ps]`kPXmä0m´ZօP@MTд"kpr%cK\t0<6<՛;u@(j0Dn{wo+͎^ᣙri .yiЧl@?IqOcB(ђ]f-yQ&w?ɬC[NPQj;~GޑLФgGqD{Ց4X9|(Kd۱oP[:nT'nm| ׇ(Ov}d^[cKˀI$1\L !^Ȯ >n+S,+R.‰ܠO/8΃zlBfȒ@9o&jkBι_8M[ .[ͅrC7Gބ!p.} FgG"ls74-B6y9lkط+ Ρs7iMٞ}[Bkϯ@)0X ̀OV̾` Lϭ+a50!h O/֝]#W.> )y>rdSqbW+ʂ]W:6%`VQS8@q!E$G2%+ZV"|/BB q()# (Lڃi?n 7 > +:&R|y4 so>hoO.z !Gp/H>SZ`<AttR8YÕe0NkdÜ;a8%Ig {߂f<|xKlnّ~(f)myOk<xFЬK=dą `8 X=^ZKw-`?} &9 ZbRXڴQOx@c"OsA8}`h+!\@BSRMy$`[ Zl2X&蠀+Q~Fbiy+[ !Ezd!R(q V&:;Q]R3`̓߂ZFZ ~X,X)P& $Xi)R^+xoAϼA]#6Ts >8S0,S @Nn P UUN-ve(Ek-UP%1x[n祲+iwJU+`XvP n hݩmҪ Ʉ]O=w=I/`\B?G50`<xR!Vq|^&qc0fƳ!|PnCu ᮙ|\'T,{)Cq߭)t=͇cF.<Pi5T @cgC^%A.q~)`!)"퐯T}0h1XUi4wJOa7H,PJkn0 ``&KD&A40\X!CB, GOFBT  /]z,=^C&Ub3 䚝k)> ?aHgZ\V,!A;,2.ڍaOyhJ:C[50 MA_ ̽\z~M XmV Z,h{Ry . CB!BT &;hZH< űtH⇌S2'Ԩ>̤BSs!ZG\_Ҩ_`(փ$B!BJV8Q t~pSO(< rgy," YlHؼÛSRXו54lɰjLz 0@%j`ThjWÁb}/r|`CJ!B,v} s?O+ (WI<ۨ?5Qc65^jMe-B!5 KpB!B!\$B!B!$B!B!kB!D3n#BY+*y^NE )B!ZIY"'GS+njvBz'n ui/y Q'Q~<*ٮ^iĬ-y0A4x,.뗿QU=WunDo&_{BT=kj%0A! YDd5~vuᅳWs>–ΎFd.iD>=0&o"vN:--ykdĔK#y Q|f[8;f,9CCեCrfXGz]OQILd Ic)H7 !Js Ė4-)0y34l,|}m9k}[LgV|꯫\ɃSb/BFj|~vhWD2 | ./f`pvB4Ы3`D"7!onO618z𾪻N'D $Gr*ڻBQ.|L'n%@K/-4N\tnn+s4z/G_O:<= t > !%gث?,]ka9c7u\l)|/^Oz3c?# C=zy3no{y,{yE;/]1|[HsEsƴz1l\~Rhfr4!p{ ~$Ԙ9U W}ŇϝՐEB/,ecGqO[KoNʟ|CaA)ĬoOrx4qaf3 `gtL[?;slaJI| &D@zIɻ` Lϭ8MNCή74/{̲~HsU~32M3@C0?@85~%5Lڃi?n 7 > +n7w^C@o.K=df]A9*֓Xدh\߻7~uYkŲTi \'|)u}4F߮!xtBd嚯Įb|w!MZrw+ǽ# yʗȪu[wǴgklNT?Aq']Zm;]<S`眧Ɨ]:zn4e38& Bt"1 ^Z^{]ߋbAP$MߒyHHB$ٍr>C3sf793ˋêױ~(|O2* QO1 _y9$tS?"#-k%$IC'bC#m&`[sv¿ ݌w0&ċ OXow:6}>g۟ V?zK^cx=a5+ B|}1@̥h| Pq.a<t+_Õ?o`c۪addx~:b"1HjJ:AŰ(ab埻J;:u[2) )d#*U#[t"-6J2XG`K3 ITT<i%&x_I|[bd t!\pU8q4_X1 x/>)0qfˉ<HM,Ε2X(P7ɠR+K~ɷєې  -6I&e:,?䉰w[{A|:J+*on,w~$v[I(;Q?s@19CNK+ g[sI|ĊWt}HӮa`as x~Q+,$o⣨$V\':JɌ1~/dO,|iȹ -su<% _ Dد+M{rw}=8t'ymܽp 2akI j?+2H3s&|˕DQgw4 l:d?D[hԌ[eBZ|0aL&LZ>0S4Ez0ًQB˿B\S~D&t,l#]rHLKT +*JbGb@/'Az2iq5ҏ&vOuڈ@[]mtda |5݇ff{^"u,f4'$0xxL$K0l! ; 鎿F.bӽ3O;@҆ڛ[ȢgIj0*nbOo:V sϣ^b&_<͎eɇY! (co;ICг f['J3{/^c3kI׍GPMkPG}ǐF*%IAC.!NNjDhJ\1-yFN+\.2S!kyb/9?<)?T_ l:A?+"ga]bVS}|I VBn׍CYylVyd5ᒢl6bg/$zW z7 œ&t<F7'Z/nH*5ΒLJ"Ч7OpG\j) 5a=yf}Az.qLxh{@|*~nz>\Nn6~#?O4 5 Z87}F޸uZrIN1cVoT^Һ଱P_HUK{xzQ:m}Mڼ0|uZ{OǯN:ՊUccyx:C!MdTA$n{:tG2*9ߡ(Q(JJy䆁č;5$Es+܏mw >%U{~5\~?p;UO]:C(T+\ɑsX~ia82{Fs ),ܟh *^>f!a /8̼SW +[2KLNv6iZؗWҤiE,MwX>n2*?~&3'p-em܀LLV׍YCN` \ʓEL5f@gvŔZAp_ IDATD_t/w}V6PѼ_X3fESz;h~.O)ߛn7Ӽw=l*ss;7R)7t{wcT[ 1?庵wYz.xy< >:J+yL,cq  l;3Ln&(,²+_<{[|up^V # /itjLRD$p Uw_ĬW%2)*}In}ʕLH5g- Ah{ɸy2Mg XBZ}aWiJj$2(zwfMrϛ/j~#  B=*n2@g=~q6n8!: t8) )d=ɓaofgGR^$Wy!pr~>},%Ahx 1n{A#   Jt̑h[dڮo;/B"5m,K ! B 9N B$#2]?]D=Mv !|s#k(ugIj'ޭ+oLJ0μu2w ڀ¸⊽ }TP:17ύ'l,?AZل"Gw 9  h䬵2ASm-+ҿyIޏ(Cs͓ lzqlRڦh.@ylZO&GK (q˝B0Bm-Mv冰+HaѼ[Xb9)ALc{CYX]1lZ!,pK.goIMzh#:I{9G}<m÷S{3fVAr oPP8+Yn.2]'47ǖq)RIu0~5V?!2veIl:I5_1K{ ]m[-y nt~cH`gWcg`Mz'sT:rr oԻuab,<˪  i? ߋG{\,RXʊ n{⛽7%'/]骲r23űX|ll{A:9 RHDC{=YSzQZ?ZEwAܪqXp<ЌSa9o;f2zwd&w:P`vߌhVizro3 Gf*(|z7Z#]p֊>n˧СMxo3UV ^@EۙDFi:FFN^})";AFi yc2tR+&TAxͽd~,clEAT$4w|6}怮LpsC-!L5zN n6<̓y01y᭘ɬ9e+,P|G㋉ sm9K4=yaPw9 jc_#h"(b!)YB4_MᶫM]%zs W~ባ݉oVF (<ݩ$Sc[ B[P(A`)9gIj0*nbODx3PJ{l`U+{-+PY^¸X2+ʀ<:ܨPahtz|lfrm xNm]l5^Ou!&\16޳)­ 4R!|"9\>ʓ [_TtGgkN\M#2'yDo-AD3c5$O7r{d,NxVǚsSMaؙo7٣iy|'Ȧ$fl8/r1?DϑC9zVeӷ/}5*׎$??SvU^|k ؿtWY8'f}Uy1 %%(I=~z5pC{].1/UDjf/\jfVbXQܳ-t(8^m&M(#wg!7͜>1VAAG"`^MZwo1Xt:Ap:T[AAt ePȎh/\"|UgVNkXpw{BAANgQlˎH̱M 4K'T,w6m&b Ei[Yt6A:m,{3?;NRBރPuAt &{Zfm%j`6!RK/1ǻxUedf<cwB`K7j$IA z5MFU-5+ , 'N9Qu1RnZLZK0nJ w< )u=xfEvF̺R & fM1vV?^􅏟& SKh=LRd+Ga|4}}*j-vo gGal\e%OGӉQyސڰw|;4* +gأp׻j3cry#jىCoo(P5RKN\Ƅ]jdCeMǫU@ H*J`0e&t[ Iv:淿&$t< Ycc'5028Yՠ Sxn&~Y'8`Sy p&] 6'|(]A&23}!U dYq %5Ϟt[zW"-2X2X[AE,:ÎѓAb~b,ЃA,Q|a4-%2J.u CUz3ȮW&>~me Pʸu:?Ш 0 ,;EF.Yԉ:}N/ + LXEe2l\|xܜLKY]n*8m,U#vwWXTY}Y{ u߂a[L^̫U{yB?!lJ h9HQQ]AZaYĂ]8'Ti`bvAɄIGiX )l #)Dh+J 8[/XM!D-˿9y1(_7:ey33AjO^z=/@Oh0ޠpf3x>?Ӊ:d5ǺݔEzq2ۍ8c9[hQP +A nWʠDܑ]hKā/@1N} I06򺃼NW! -W)4W@= ThnAXW>ܶk0jB>:uV=zBkΏ:f q}rP\>ڇ 5X$PV-ǙAĈ)|>v%pJd"ۖ[vd?ATt0j(8{'~\9 S3/UxfMk7,Q9`z<|+lx%f~*PO¸k+`t;i\Sr@*Lu9V.GCpH];z0Nc{'U'F±plpR %пKY?AAh&EU/ g_Bba]bVS}|I VcxQۗu;F6sΌ`,cUlۅeEXb{ׅ')@g,~&WeY v~~wS.p&s߄kyy^ʓ xQs8y ȇI `ɫુȫ>T_Sm_X`.Xܨ쟪jk~ 2y_>]l&csHI^kT塽ΦYC+ؗvy 0zP7r>6YK<1=ar.IcWaUN1VAAADSAAAhU)   *AAAZx   Jt<AZ133#LۼV'AhlVjN$Jd$ ܩkp%>*Judz +Bg)) tXr:fC_vL llEAhNT#1F;]uo8aB)x7C (ݘ{7&> |l]A8ObxTp0Y.ŎCA:?<3(~8Y<؜8Nono|_5Af&)?׏c*^/A ,*/ w:N e6u)ʜCHH}g2w@7kĩ@ښ%w$*?AڊT̼^FNǏ!,ƀ-b4Y-S;t,6 &i!UH tR@ ̜  S\#G §!ſ-!,pK.goIMDĢqx̒CWzVDŬc9P;d 7 Y{0QɋÇxǒCq8P8Ʌ'Mcv&&Px%=NFE99"/-ƂD9\h¬/G֝G1K,* G_yo&2fZ7J#p"6'9d }V{aOV=b44plS,;S%(ߺ waN*T[AK%Uۋ?W ~|CɃDz$-CRe+@|E{dݩlڬ.˅B`Z*~ Ɇ \pAx& ٛ/d4ef +Hj4k77GRf:gĵn"x]r$A>agGU#u2T|c;/7D@Of%OkΓ><=naNggAhBBIZ1tI|I v5;W=ŰihC H~ (MGZ0cbv@D0q<:Q)Cap<,e(U.JOGtt:?s|}:e,Mȣ{p0 Rby. gwҏh\$N C3ćGOJq)0Zf2) )d#*Ni!k<$.JYqUYsoY_|]{HS/_]d/(XeEQTdME|(ˊ; BhE `~-O:r֓[`9ŊVn䘹%0gwtoNi*?0ŦL;/m gp%\":RrBՍI;;^2Rs4B A@v"#(˻hB ƺ`KހyuZ|=*L2.(20iuHI+Lz%H"# EU R{y9 ? ||RsUQK*)GVd,ɮ W_jKt5V䩌AԼ_˕C=, Pe#1'gOrC܋!>c' ? &0W $B_Å 2xl@eMV2(2Fr`?m;AE19/˫ς.*Bs{\OMYȱFrU5GԞZ6K7\xxtVhc/vQp )w|F(†{a" B3V IPZ[ whHBI&Հbo2mM;Yc @Q*RUZm N|?D/W섪:6(ͨc4:>66i߯-ʯT*vΗ&"I e⩂EMnQHIX,d {>\~ {◬PꂫIdgnL#>ؕ) tLJĥ9d-B'j2)EtUyP=/A3a%)A3MO_)w25oh|8̺3 ~6)9rc^ Ӫ0x/:Ծ-9Ґ0^ꁯJkO4ǃdžbƙ|:'=$Z܅AN*<=z$D߂~,~(r`zj@( ǍnVB뛁nWqՠѼ՛N*j'\`STKʐ̇#YʆG:w/ȣfgkݾ/\ ;3 E*f6= OA:_ ǀz@ԩzXmxJf} #Xs i }C2赦T^6_hhQXGཕ2!,xqxR]Q?U=նfz΁԰+ S`燠]K^_ @h ͥT塽ΦYC+ؗvy pq!%9ǘy`@REv0y7΃UC鮲p*7O$9jØ=s/uNë&V=A6%1cA~헿G)9r(GRTªr~W1Y,8ё嗉NIcaIRξsGl]XsG* Moǃ)nۿnog9kfI&WzTJHM~G:.5gۤ^-*UU|~0+ [.JRD$UOMT5կS ñI*#<-xӞ뼸OOW%2)*}"_" unvgcU%i*EQ;]oi5?65NO-CСcLF#  at(,r-IaL-< $Upp_s[   x~x~hd6_տ XV3]3'  ZT[AAAU   ЪDSh~ {і`֋.,cg92Z.B#sKoAo/|OI⿄ۻ)DП^.B%oAN1G% EeO~ͿpK덕pX'4Dbx4(u͝M} Ÿ畩k>Ԗhݨpֵ R8JJ'& }ƵRKYhxUX mP'`N1i;mhR۱9߇X"LCL#%}7 R/= t6.qnX[ꂗRʩRt(~l..KJkA<.g@9NAfcBDug}NÒ}/oDvN }0هepj Xt/L eg`W>L6}ˠҁ,`|2<*NkȮuwxeV}QůZ| Y~;U ~pY?p7᭽`-'x,Hu=7`DONj f<#aPbWM9P>\#G §!I)<3|ٛv%GS8Qs;h,$Е2Q1wN3MCqq9yf@r!<ś*+'3yP-Oo'#a, !I-#p"6'9dt/Wd BBnr4]dQh7FrY.݉P~c8Ȕ}*vɅ'McNqNK b\|v&&Px%=NF}yL1 iDq%8DW Y5A MCǷs,cXi^|s$}{o,fAT0o`+c:/ڻ`W' dݩlڬ+ |W5S͓9qB`Z*~ Ɇ \Ú A~2aɴ?- /lx&xfoy]FAO-0o^Ul,Y ]7  :[> pbؤ#A< 㓜Y8b4UްG9;=dC",ďhUN'fӨ rÏ ޛlo]׆ۡ!x9T@ =Rp:71?mgER7GRf:gĵn;_ FZظ^,IU;)1qaNd^rQ1:؃7!U޼1]ԅ}h&qEGΔNW_Ol%T}>li4 (t;(g({Sf7}{w A$v9tI|I ƚ \׵ftywM++ bش4á$?[BF#MKj Eȁ1-j%̑az`-M?4B[`L]KJ?M7k,@+_NFiYK\sX(ƣ+{v-8ɵK2yt:9;L|x4ʬTXXBA`9r2?IMEIY seO!z(T*2"?yePk r#e/pH8 ߏLlJkJ+1*k#\bd&8yZvBzI)&gr~R]_Ʃ戆H͏?I9eb:YBMILƤXExT6^zF 9UՠrwXni^̅!IaJ`nqm kGC"(ւ7B^̫ zpxNЪS⃉]E&&ڃ Ev-Az9e.JLړ^ uYip`%713m2Ò< U6syD*'mY d,"SHh$hVYF-:ߕIᒣk{E@K?Ϭdz ٧@&E)ۊژZOc*ifK ŸT ۻ GxjB}6tf!'^Ug@ PjoO8C'HR%^(f K[QʻT*pTfu"S(l"+lo$ttB>:uVz=zK!2M2SV?}l[6omɲ?t=2 =N >J>T*vΗ&"I evמ$~MWW 8TǷV+'t w`5)|\^>4oO@rfǧ]} (+ $f/}{XGߡ#Rq0qh5{Щ.hLJbQ7?>]uCT!)3\5ЄAgϴS<S%; ;/A3%)w|TUϝ̤HZ HF* Ųe׎e,Dj(2ɤd2HLHK{9L2s% ~Q0G%*6 V a|AK^U͇?VvCB)AZ -} WOˁ_mMh4odi؆:x]3RS9ɺIDt4 p8y<ٽ < fzG1Wk"PtN̊H/DWQ.yEZuF|ZU?sAtxsuG23԰Ѳ& Rc҂B[F/SMʯ9?,&Vq|mx2pw߫\ۯTXL#aH yY gS))WfqśԴPR ϼx#=3 c/|U B x3 !̓v =#.ϙ K6ԗ&wupp{'_/<ð{SPd@a{<#x{kq.x3߄f8sKXH+ۈՍu'@-f{&>*ܺ owLb?#y{O٣ b،9:#{JW$>֣]<{ ObԓՆ9gߧJdEdCB"SrytMys0>[jKd]vb>?_Y6u"%YE*Z!G 4,6Bi^9g-p*WwiI^=;A!]gؿs]6 UxEN9 2Q*h Eew^U?Nxs{+|{τo%-ZL Jll"h\/x]dc]*SuT΋ۜv>\jeu/$p L tݻ%B!B4~ gmgS_wl0k> z)xYH){!B!D%guPa *he?q{`vM'B!uHO!BkzBp5B!B!j$BkcKhԾMl˃1ϲ:Kᩉhapw|V_f v,2qc7aO$JGd,%`̮sG% ,=SڪlcCG3.i%mh(tfŖNӺS; .b"F17Xw*|ל;Sg$YNCjasڔfO3y@k E}9sv駁Mļt<~?`GƗm qqJZiLϮO#w8}Ħϧ5G0-}GXW蠸$Ns64^gx{!%ʳj`$^y!-3x)P(@zʭЏ#CH3'Y;@ZRr RK-P~zkoJTŵyg]2xTh(J|g4 ܃rF \](q7y\}A>e,-Z)NI!DCih(RVhGRBR?gDk2ngQ*?أy2o[Tb))*zEW̄xyj:A#DMU_UDUAS) Z.De 1/]~(A$6SC9iU 4yG:j`Y O18AB>$έV=U-K.({+< Uk0 5= ZfǗ9tT+nB\;}hnk =n k^_9V ?8 IDAT0@\u FqKi4E,.CF3+7e$._h̴BH8C:al cGBdSD=- =p,~ O03EWKE }3&]\>r8+Ô}ճ3ڢQS0o]W|w:ۜbtjy!ĕ舘O tiz|#VգSg>g[]a^jQ3!dJv8oNHfF~7R6r<gvWZ¼Lކf3=£׫5nZ^MK4 _{!L f<5K8{fOvOZr8X~3+NҬĖц-{=3 c/|U B x3 !3W 6~AR8faim~j;g&'gDIj 7]ZyoyHRfR^qT>uWBY۬RX#yW5!ezm\'RNQ[.*,;ɫCxgx^5($^rYW]Z1 vl=h+pVoL$IsuQ^.w {'œGvV}2,ENXe-;שׂ^N:773lwn\q ESA!fK.h|.:*KzmN;CX:fZ8 kcrݽB!kKm>Ȝ`w`Yaֳ8O3bB!BQ$*,{]eV"}vDB!Squ !Bqk<B!B(I<#҃uU0O]}9IO/o_# Lf;㍳I>[3FsgfzN! FT- F1ʢuʪE] GuYtLy#sFz7J!$7kl&ڦO mIjPBx/xd' $񼬆x^cG-9`с%oVzp`K` lWa| k~هƿ=+ =plcL})aIِ~0utdX,?A0nKF(o\;Èh0¾50G8.B:Ylge|cD'uc 5Wb0If܊Q~ r}Ss7trvo_i.<OVȦSy *xLfQL rngulɷ݁XrOXqA q4r[CJ0ng'TPL֝7<;ͲfWw:(Y_m@2|5LtW1gq, &ҬK$ 4e$l{{ 13{<7 [Q=ADݦ.L[O}f%~+u/zÛ3asgaʻ.B6&ҽ|OXN2bl@?'[rU:G˜[Jغxv>+?ܟ;V"ֿlǬ~?H% PrOa]̍ W]Zx4允h/v%(f;3xZ[A`5(DMP!;D YØitzɂ^5ɭ꒴~KXn p)􋄟Bj1+´J=[8nidAd[(0(M v+lqbb:!pI1:ӝ垐Xw;;4 =}鼥%Yܞ#"bO| ӈ?Wqԃw8h vT$M1Q@!*NcqA)NM/!? wTK5J̭Z _{p[.I%|p3G0-_P*4O ` ?ʪ*QKhg./ʈ h?24s| B?Gb|IPTv0,Z ? ra< h&7+V 0r^Ocx@Q<kpr)|90Bnu]4.JYBT>9c`(6@S$|LzZZnfn.tl*K|•ѮyWԂf `Oc,%%gPUxxDf;WJFq j,c0 j(,*Gg2Qwrj:ApLBԝb(\ׁ4 "ԷIg\go~I@>_Ќϣ?VL~T=YycߕNr:.8b(pj|IP~V?keIk`ye}ߪ~_CZ*4Q q@?G?VWۅBڦ|9ϤԔj<6].t|=SH˩݊gKA8RrBtTqrF65)P:BFtS(E(rJ23iK*zg~vt*6 f'BH8C:aw^:h5k<4? L| H Ϡ\/'JA$s?=ʭ݋pҬzOyIųena`􅱷(-- ! ~Q0.vW)7!p8p!z*<z(.[)C.w BM`2]!ufĞ10Qxz6زBU(ʼT|4hKZӾ27rEǬX 4MBh,とpZ6Jc@sď\䎦84;?]XЩ ހZ¼Lކf3=£׫5 QTXL#aHČf g֝y.IB\K|a^l= Ͷób `3032‡_Opj.̀7>Qذ+qҰx?ew3y`X·'/AO< _̀^qV퀞op^v!X?{aC*]{S+k%`$]x`ZϾ=$VR-NA|w ĬD朱pݴӃ}=;{Et Y7EFQKGұ_7)o>[jKd]$Y(ٿhF1 vl=h+pVoLGˈ!w +{GvV}QQ_(./.ZwYW!սJǩt\onp/=Ά}'0:j11rF_"׻T<,M9|bwA,m ”~`Lwؽ[N!B!D 6}9ux`1À+ay yzJ!B!D%guPa *he?q{`vM'B!uH !B!Qx !B!QxV3}xw>5B!c7M`mS)%xV3g"<纎B!B!z2zZ,jl;7/ƙQo2 ^Cڄ%Xn]d4Yޜ۝B'-bb.)95~eΔÍ^~|{<% Y[aw(OFwB6:gHTЅCy}o,,);>j ߕb dz<ռ -t l.q7^ݝcx=Izj{Dg˧7&u4's|ŋdžf\JF%Py%bŗ -gn-'ҏ#Ĺ=ƀߌwଆSsiɲlAhIfe]*SƓ%݂IMiWݲ) 99,XΞ-񬶻eun?|8_->ψHvՏ~L$븷}0] ߞDV[x4E\Aqt`w3i7n7g }7*0d:3gt̚xG0a3=#/P4T==|tJf?;cpd+)𿥄hH_h(KfQa ,_Of$Pw/yg \|#@"ѯC/fJ}Gb./xnL$(Ǣ~O 6wbÒ~Ɋ|mbaP|./pmh֚%404†WvA.arr?ܟ;V"]~7Stg/f co CV`Hkƙj迅I#[Tz>Ѽ@fN'h8U[`{,M)楐h[&,YA}e#K&ؖ|ز#p#DrܦXП}2t6^JTIJM˒Tʢd+Zk# A>3G0-}GXW蠸$Ns64n}4ij*E<~8zY9|p4nh$= ߟ RMuF|q`qkΘ7K֌%>?RV8qQ9p JٳM/O5.Yr,o/dSyRmV임jB4bQLCJK'{#Ao Gʢ\( w/(*|R,usxڎp^C'ݷڐh׼+vj`_3z1hOIf7 ߖץ`f):0}/+6d4v̎Q>fBuNNdŃIrVGȰ_Zbk"X!FdDFZ242Rϻc:ݝC~FK^uտʗZJJwUEuJTT5JT4RMV*DQdW}'EiC,<} xsh^V q@?G?VVV+`>8YiCGKA8RrBtT9D-JL%? v6HT gWnk\>vf:x00Xa=MáQC4<<.9)lD'`4ѤYI:J%dUqaa֕AM K4tUӻqrW_DFy!2l*+|z@֯Q,~=Rcm=^$&FtC0p< 0wA .fVB *&s?G5Ptz̊@ڴ-/D]L\+fir#{p's8w 8y<ٽ < fzG1Wk"z٥?hB+ވVU@.8+pޜ.F̌0]B(1`l£ðUO!WP"ST=7:G&uɟMtZzUR8U-./DcIm7 ĺ73cvrfɲg[jFƶ͚#]҃/l ^p| JܼD:٩|u38ي);ڒI<{ ObtȜ3n񻸚$6tqŇyTV̂1GG3dZJ8IrkfC%t2{w!ZSȩen_wWOΰjPH<WH_Y6u"%Y6s[G7>kȅp[iY\3 oI0;.۫)9rU]> +Nw/ENXe-;שׂ^U޿=|)Yh]O-&%6nbi2 n?U"~뚫E!}l,rKejҴyq+V~}RzC= 0eB!Bhm ?{6,{gy !B!HuѬެ8B!,B!BQ$B!BQ$i-nw]D!uL 1h11h3uZxMXT]OfBk&g}G W!h3C,'7B'FkhZ,ut;7/ƙQ^Ti1"aKK3RB!>ɼ;dc ;Fܢ c;f4cucgFGHoΌz2z _Ԩ /]L]=N? O%ӸVXu'7<8*̓)fK7-d&翟odbFTo]Jߎ=[\m !A=NʓsYN %=!v̏;Ĝ~zc/|  tnx O*ê-0d,;Bm!B\RDG_mZrG0ߤyp&ZӰ-|kT [ⱡQ64uf#oIPL֝7<;%#2taDOMhOXO' pXS==[Y]>8Z7͋tIqo`=$j !/ gBД>H#춹+~]uh ъ4 n0|_(C/ ?ݡwZP!hLgɜŝ!%lI & ,gs8^'3wKύeXi_!ٸc5+Xhhmѻپ+?~5[3|SzCZ3ΤT9~!x|z1{ـ6**vƼ)kI0x0q® L8mʆ\H͇@? MZLL] n`Ձ^|;h+؉='{2w>ODa?L 1#+ԀRd^C~>CsjYd!^Z©" 6 vOLSj#~!Dc OCף̙V0|/{v h5{!iֱiNp e9U D=u IDATB]./ʈ~B>lfm_}*.d'F;AѤO\+L>G5N+{?PU;FR)ڋ_zI.|K讨A$9j07JYr_i}DKv-@) QoE![ztyPN*P秚z4Zc5/{r8 X{"0o?q#LU=:FCNGTm62^x\SJ_?=TqV6xz= ߅+jxZYA)1тŒ6s>j_nƟvcmf@^Q.B;j V& Ҡrf 37 Zȉ |16E%+pޜ.F̌0|)m`6i0#8fdEA/I~lϲ=6)Y'(-b،9:#{JW$>HR%/;ɫCxgx^5($^rW+rѾhTXx^pr'e]V)v¢(+hyg]T/3:!(uB4R~Wy]W΋ۜv>\jeu !B!h$B!BQ$B!BQͅu3ɬY={v]!jH.̅z!3B!B!j$שSȔBQm,i}BP.ad۱}h["s:/ikۘh I!B!NFgt !A=Ԉ||=v-MEnc{t?'lb Rװ .wo_3}F >uB4 ~=Y5kvl>'dOqkX%3|~й %i/ٛ]#IGHoΌkVSO@ s]GUՓ©` ˥G/~WZiOɟ韊/yNnx~}q^B!5߳geWzuNËrCnOz8SO[]:>Z t.^f,V+UmW2)yy33`u Sׁ_ bm[0PN([$4!4={7|ּS`+8XB~ G v1ԇaH[(<r`f| W`K(t!8|.+%&M~ϿQ1 jSV6.(ЄASH>o_ xZ~囲/Y_|mV87tl}fos~UB8}c*U /Eڐ^5 R½)B=H /' (tWw %P-b[!f;A'KջxDe)STLxOW{Ŋr/>[&ܞ[5NG+)nyyZJ;ʣ\F|gL<6t,ރ&1(M'8Sys+O烽{x;ێ> Gt&|:nR@xz:縜D0YݜE15<%vןg wbG?]&su>g.oO"ɭ/+%p|< 6zx]rvVZKM4n[mwAT/676y@cf@ xn<zR ;C!,*0d:3gt̚X~fA=SosAǞ~ zb}J fy ~r3Ż; I9-B?eIBF pF+>qkͼ5[``+DP3Sz!IƭXJo֋E\rs A.ar bh^z#08ԋʭ10ԇ%Dn(f;3xZ[A;iE|bv-FsCYN>ѬFfBHx4kF3rn1Ԃ Z=H:qlܱq,4e+^17!p05LJ%>_i8i! :2&uA$ '[h-TODLى=͆+j\z- rzA;(A/~^Ő+^C`[y[BpeBld-C2Ȱo `¦eP:vAaگB4 Y.zS<ѼEīʵk`3{§78r/z/Z 9l̄`9'z,VgI>}Zɽ0u;'MD73q|;348Zk4&ۅl6l4U0#Ql ZÓ&U2KP+uRU#f?n#K3Lf<^XDM'@sutfRG|^ѡÍMUqNUDUAS) Je>_XÒ0?^꧆xmso}8Z 9jY]śGڙ,K5@>P @_WJ5Z!XU 2^ j|aXkLnR+;}ţBXsuG!tY9eb'3Yg)<1 TG 9x@AY&\rh_-M3BM1U*T6yÎ0zhRj F3+7q d~/!ͦ㍉| R(UZw-] ōR+W3:A,NѡE{%&),O(y끘-(hh1t =p,~ O03Ep8Ck c {$;ߙo`OTTˁ_mMh4ǧ:6گB46"hP4 L-pq5kN)2 Id pd4Ӄ?vlCOa<߮Ip',LgYDڠ'Y5V #ǀɳ ÞVed6 04ż^;DADWjO3?ޝUUq$q)s5tj*3m4SYMe6-O)Gs,TPTd{D4Cs> ,'#B ]q_{.B_i+Z8#.C)kZLi62VƿĚs5ï/v_8w-Z >IE9;o;Uy6MBq2MІ axSp署\O@<(KR;l02q o=fڞ7:o%ҷ÷wŵFuheUuԝ~eSHcbb- my5Rh+X_ yQALqI,o6Ӯg4qvG-g˱¹WhE|5xGY]5 ReCv9|7HI]YU FE1HwKcTDŹe[Wfv@jLMqګh* 3ht3 Nj{눿ύ}|EV1_;{%f7w`-i,iWJzWN/s.w^Sa\>HK| =|h$-]o1cPbc)KPTZ#f[\Qgޤ>]Ҵ^jڐ+~^ynvs/>~01W8  B!B\ZX˘%r'[{lZ?Fxz>=xx%H 'B!hTX6gV~Zu `}^ !Dc WCnc_hL:FNua\η^d FfhW2c(L} ?C措j?CcpཾDNvLWPW:Ol俏|=n(~E s‘oEyd[,e!`0m(;t!c\x} L+àshxzǩﷵ OJ7)Ŭ|s6р $;A =Bq$8PR1&> ;@AXng*05I00އꪴT7gSgԫx]`pK!#Xo o i|߀ (& aPv ⾂@DB!DsЙ{nLW-c}LM<^3oGOLΩ=S5730Gȯ=º0K[y(*棝;oC;_p3f}MXN፻XiOWw!.9Ύ8Vɽ wWݸ*f`ʃAj?{2HUOWzu@O<* Yyh%[shhn#y|~VۜxJS}|F14ՊBtl>@cїIxmtJ$6.3PG.aגՋ].@%4B?l]?î EkNYuzx~Kyrv-А7'l Lxp)-=BD? z0~H[.ƒ0mtq[ _g>nqw¤io>!Uiܽ0n+w}usWxy*.>C'T_!hr+z]daFXJDvdq?Lj!'t"zz@q #0>!&G6]הPom]Ix:J^e]*%!%{SO!2,xY=%MWڵŘ[J]$#cO61ꧥB%<|t `8V.otP\ק?0yr|W#Dvܟ3+>YXC;ԞfY00J7gT8aEf4' L'+/^; ߫gA|t!dAEĭCO71`,$y寇o atл5Y9V%@}h8TY`K,^/$~A (͂%Ke=[B!N12:bAIi&3RiJRɖ| W⭘4p4)ѭ0꼹ΧN<<3}[<3vL<8 Oh ?Tb]F{/zy;vtfSpe_nt 9l>K/!/f4*TMӨTʬw_"s⮱+j;ə(k ta<devVVPn/ۤc@7qǙevJ]lHLk1I6BM5U(tnZ&|®ׇ`|A@d&0`/:+k~,=ЊYsx\zbe .`)8ث@xA ^@Զ+TJzM,ַKa41BXmBG_(K=p !Kg2 +뭧RV+V H<~NaRd($/v eqfU!fX/]^3BU+zsâtfWB>1.ިf`O:SgTUîTj ⿒ٳalX _:O_՚Ma׽لҳ=I)ְZ,R^[r(qZ E5.}@9U,!;pt4^]QTwkUrߠ9l6VB!.mB%\tMZa8.(PRu61 8AeQ>ƶzs03[*\fndYUB=1SDi=MQ}}U\߽ODzy2?Z)5VY=[X\1`sʏsCJiSs.(4Ê0i少wڽF%z\tZFFMd]ZqA:\=ۅ_]oeʼna@J5Z!_-'Mr0?OnxGfB x;? *\Nؤu ' ; 1ic,9:R~|*P=ivgΤ?YŌ8ٕ FE1HwKcTqwWGuҷP1_;{%fC߳R4EQ6 vUCTשtYܢ>¸|xa4-Ǖ~ܵwjcƠ6O,BF>-{Ώ-*ߐUӆ\ʳnw˰k/嚈o?p+uit !B!.Mʒ 6-R#<=c9B!B@l*,γV+?:M|0>hB!P[!B!JB!B!4JsPxzY-@e%A!B!ND=ø@U,C,?PS{XjҊP_!&z6r,*b_!l !-HXrcE{D1czHn*j1"cx78;q1i0Sx~ك.4T;]Cf/%>5g|}ּJ&`v٨<MV#{'ԚoVɽ wWݸgDhg}#qȩwxօ]2@QQ6|:lcvS GGnͲU1D;Op3f}MXN፻X͕+ U}gG@`otuޚo:{їIxmtJ$6%Zآze1]#s;?C~]V:! TϦ>"Ŏ$X\L'77V_Dt Et<[٭H 9m\=aLx` w'ǃkU r`C0m!DtIiSZ1KdV%{CB;g+< sxV/] /?]?|$LI }BB4"7?F-&|6 ' 1U}Ю-RBV"9_{plȰ fb06bj~[Nnu Q !7)e?(&Gq_Y|U'QrU[OeQd: f֕g3*-{>ud$X﹦V+ӟsj9+ցE=yt%|v 03+w7=#͊SP[`h ts֩ ѯJc ][dnHx~cvF1cOO(JSb+a/A.2={i m {7]xK?7BQoGTA 0p(V-r(LΗ ޭa2ȱe/k؝RX Jz@ZswB`2s5\7WPTYd)98ۙ4p`X5H!Dsp0Q<3x&͇<Kq8F^#XRY #^ ʯ{7ZJqi6ëD[3ٚ;29# nόN[!ąbVu.TW?:;a+ze154rʭZc kf!7NO5b֑[z8h&>-cM1.ިA&VSU*aWUT*5D~N#.=̆%k ^x  eN4TT=yZ޷)7rqz^GOtei=IѥS6hIA$<+vςax`Dk|j(i<ʡj1~>{ɫ>^gϯZV< ZR_Ё ZU7jg}ۂuhzOg:L  !hh&:B=J1UXҒn w0w^D VJ΍>l[~lɲzcUd3?څYi!c++6TލUj%Ǒqs{3;*jS/DC*ρ0j*C3\ad<[irS )MURe 9Ws0^ܢ͟ z qyP2T@sÌxã5yY ' ; 9s2cw>{~u0z4V=U5NuDcal?pFPrB g( ûm שxy|D& X{0di**Ŷ J4:0SkT Oʥ+_wݩVN$,wxߎS֝V{4PEY9K/CnX:s2cw>៟Vj;k*Xp0b@ Z!($VQ?p`-t^{|T8 X#BgsZ,JFs˶켞Ԙ Cy7 6I፡wJ rf:ͶZy/ >ð2+ J㕭~C o{ס]ܲ+3; 5HQa&&8mǏ+,8~ꩪKeaf ⽛ncA!UmI+pbٟ̽iU.&VcvJ8f͆:+EYei`/n_u%~w:X5 `'2]]|6f Jllr9Sܘ2p(]õdjh7Oi-iZ Y5m?⩷ȐB,`|xY{– E#R\2pV=tH=]̵T{)p+`$ǯaapFY8^_"n'|t;\lʫvÏ~b#_=RzB+UO0n6muƦt`5XW[E1yt/h\Kޱ0a ,A9_.f7qmvn>Sa+v{ 7&T̏Ǭ"ݱ5v|:Mq#GM!0QJp ́J'0Pv rBP L"à}T=Q|·`H7𨀔?o } zy# 6xc(}| 0r ޕ|T  b!# :y !hbJ1/ Zň0]PvG։FiY0SҖ^ Oh݃y6+y fhnY{ p;~z؍Kٖ֙d K+8Ag7&y⫖>&ect-]Ψ*11 &1ä6 v yi}z&0r[TPLsh`_V2'$AKLe1nD;9o`oޜu[1:6#D3):6`BǠK: L[zJoT(\?}N Cx%8OqɆbo  K|7G`tȊ7{CBNo# .a#[я$FghվzЮ-RBV"9_{?#OdX\{tK֝_阞P?H;N2uLf䊥JdOwhyLߜ{><'u3y[4: cJ9&Ԋ񷲝 ZDqe\U],oÄ'hA.{oW± -2ybcػ M3_q޹ ,7# * nzBi@f9&ANBְfXpjx] !jn⡨J`R(7 Bj1Xsa:piw |Kߵb7CsaF*bL[Ɲ&:>B!®#XTljkGɡgpm#M>߹]m*_nt 9l>K/!/3;W3)8!.䋤LR+d%~v!с|wJJ3OPǶd&u7' >t:@ПDnޑIz\x(.^ȷIG9{w@B}i.(z}7DfW[X>}fҡƄ0~xGvY6BKLJK:O ,-vU,g_WES rdB!BեAfXBDPѩjq'2yݬ:;a+ze15eh[2m&4Y֓W7r;jSWD+zZhb5Jq4qX'Ӱ~!t,DpC]3zJއ73]Bwjq/߃MpRq 5+Ɇ>^g_WzƝVh a>B!.Af:\pF+~.h!OU E>񧆣rFx"ҋs@TJqj:M]U| 6+P:\Q+DžPm6cpn=aIu\nI)kOTJjZb͝35}ٶ>*V+9>[&KTRxv<'q%1Vwaf-49&yÌxã5ٓ p]=aJ`tW |ZlKA |:ÈZsDJ)KGϪ;X ׃\`HR2غ=%Fp! `Cy X+c!"n풸ˣ & [v(`㪨*(tv^8;Jji6 x0"=y2xU\t&!OZf&{4vzY@&2eK N1֪~OU[{^ uZ4UBS6rםptzljJlO;H qٹ$z<#~^_GRR(E^Yܚ@IDባ,.㚓h|v=>j9[`O_G-{2 >~ʏ2y{3 ]+޹&8J=T/g4<^ٚ7v)pbٟ̽B B\vM;dQ޵x1}wsկS ֹA(¸|xat !Z+kqӿƌAu>TQGLh-؟/dMSZK;?p֫0~CVMr+Ϻ-n%1r&>& a !AB!B%1r`I ^)}1q^| kJs/B!Ió!l:,;&Z 4x1;_!P';B:P[!B!JB!B!4<BqPGVlLMQ37&Z! O!B!4 66%v988St}J48_NE*cne3-ש1#Sq;7ʚ;*Àў~š}t- IDATα&x wMQ`._`ޏ`q|vT!\?oA C`0&L'/ 7CJ\< }`sB={kRЎک gаKOM|߱5ofY΢YmzJ`v٨<MV#{'{9Wzu@O<* Yyh%!beRt7kG]yND @׽y-BC4Kj勹:oiJKjt:0 2;K+(mQN19d*۲)t q+`y=YQ | nwPRɌ|چ !.-S3 ̍ a:M+5P:ORЗ(m0ic=h1WT*zyP`9U^4)̮}xc]Q;5N؎g =cw0],Y{sSn憈LZZXM.RQ0QjKix*vςax`DkϪxd)K m&44""ђHnA⿃x@ LIuUʫ~ o!JOYP r@h~==dR!+bFw0w^D VJDZe! la!`pgƀ)? )V+9>[ǜ 'piRavj@IUf3f{^43V~zJ\ZP[ 3Yp?z`AO/!#}6~_JF,,=70lt[; "`XF W!䩥,+,L'dpE8`2q}l`Ar:Y]Epɗ)ׄfgNRlDܪyqj!]6~50xU3/כg]M_W.WF0g{9#4 *eEVir6>f帋/ ei{:]Mw^'-3=ͭR z`n e#Ϫexze3im>Ϊܤzk`>c-\z]ϺY2y)VVz-;9G!X n/8ծϳ!h =amIU!.{0gxVߨ?BxQH;y֞shl7i:zq o6l{R~s5RsR<yaXRRaaשG?k{%}')z\?;muv1so*iTV9 =B#"wZI|klO7EU,<̌Awm0(&a3zFwk7|r'GI4?~|7?72hM;dQ޵x1}wsZ E2StZO4.>[mEѨ}'uoRZӴ^jڐ+~^ynvs[P[o?p+uit !B!.}-c 6-R;*!B!xl!Xi՗B!B\NdB!BF% O!B!J-L #2Z!hwi4q]ݡwKښJϵQCE\$j6!BҪ#/{g~չw_6l=x0ܱ+]ixl |n .G~~.=,Lr5iEK(YɏG s>}sG"Y#`w-bKG;Ǡ #c /ajjwS.Da@k Bd.>gã҆$a1(*283:言#ADd!&[ @'$;]I,sӏyx71AR'83'ִׯ*,Pd\AZF!w)IJ\b@P 0 ›deb5ɫRQ{UIy*G@\J@&;z女#gh>No?W~WÅAp0AH2ôѵo]7Qep@~m_$|n(L4& %|foXM-ӻEO:!(3CN>gn>Q!%}2LaI߲DܷdS/Qѽ>lwl׬$dW`F ;/+Ys[t D%F?ŇGbLAVE¡Ex\7Sǖ]cWC^>_hV+( yC t3kT̴/jW֍|   xud}Jx{1y𛞎Dz#mRBaJO5>*۶j'sw:@5yD!ĕK5WaʘeҰ@ 'HL6QMY}BjaRd*ݢvϠ\fGwP82U' BJ&=0ʘ;~־&v&ohdpzYrXkmnH'-Eo2 -Z Rٳޑ.H<<KWt}HTѫG::q}SHs4^V ] N+\ v[0U@yKu0B4|gBk[h`@K6뿿BXqFw3ANNP;UQK".B'u#?)uG)Kb `tf,>õhV+|YoF^ sr͉OWfO4{ gp']ڠf5%iF%qt YФW+x@ ucVcH !ʬZli^| ',}8O1mh.XI\edci wRóncxQ'~}NtG5tDM|`a6b=&=pOzBh BUGQA)g0Á|4D]J[͓kbf'Ӳmxo}0=-/mNPTFNԕ:6X&2^H'7 o8u}Y|T]aA8>ӌ9>^dMne 75>f{}x XY`=0݂Psgg!+TF5kĥOeŗ=5 s5wׯYϡ\Nɀg-&27Gi΢Kxu+$0)b+Zw_ pSNܣYƧS861.|u;osۈ m> 'z=d;ai !-kz'L{Xhez9ol\l1[( Hb ך*h=ǯrI@܊9uOc7t~<[n*b+Ɇl#zv ^ΦiD}܍ӗ?c̕p[+MU<ƻa`2ACH-w{]l=`B\!B!D[sϰxMwvxfR`%aJVK^_(_}Ogf@:vTi5tݫ05$K}qAyP~ݯc m+'83'Vu@&DN$L5f[7<4)9`oB.)o,u5y<٥2X-`iCqaԮL2K_Q`hؽ6.7>Ii߸\KxDx̶TW&yU c"j/$HmR *G@\:7x xf=IFH+T`09>x ku0v33%7@BZ:} )INw&I'O 5r SW>7&`]/\"T|vO]}]a1;M/ T*x~cQ]Nupj`DXU[¨S8X5uT nΰa9TCi*߮B!\S}x1LJ@|%7 ө$n:bQlS]SʢSG1n+埩9d8v͘vB3FN$_nCl/:Hj:Η"n)me\8גּl`y 'K-XIanŕ TVw&|QarrB@nql5A,XƳ0Э#+Tݛ?{t &*/.'V?Ӟ7;T̲FLi|͠/Pb9WTjƍB!\B~u弱qO[L\-U]![uT^s4G#ɝ@FlgE#7*8sA 0i2RFoL%,˰-55ɮiEFk/PK]ӰNMF@p FW&gXU4v8L>ޑ.H<<KWt}HTѫG::q}SHss<^ IC`>n׀fR;y[~e@?PwUk5E!蚍ݶc IDATx-b4XVv 󝬺Y)"p:ľN'[,-bg 'M"Yiߥ1A% q)'ztw4j5UF=p'!<<+0[0QnpOOyq$.tc! *`@0l p)0exnŮM p΃^N¨!|`l6oBqe+h&n{rVG~<߅F܍㣁1tV@cU/Ec4ݚ~$wao^u !Ly-8KY9p_O:R~XK/j ƀ#A&$^Kxu+$0)bh ZC5]?nQ=~ t)yg{.z% Bs9ߥ?Q<%1}bB_}_hi4hv~tq>4i[n}u75ڊF vw$B!B"SmEc,nӽU;/;*!B!h$ ?!B!T[!B!JO!B!Jˁ^Fg ! 7ܫ1aX2q2F0ý%'^7]B\2I<B!.DG>OfD _'Ik|s!pex6F>2VQU?8I/f}̲T㫗󉨏^Í|7W,_'~p>]fq ! K>COa[E2tcȝx;[FozS 3uzB\ o"̝>w_dⅸ)F'x@өc }p򞓑n`yѣV6T5 @ܔh'TJB* ^*xUPqQkVq'Ur/ 6σg!&r+Sq+fr==;ЁqlSlz'1yQ:eq7Nׄ&;Wa .}/l ^Ǡ }B8ZQ?F?`:֍tyV?jBᾗad7:vBץya-Ǻxh(y- ,Dz9Re? <܄)7&`]MaI߲DܷdS/QѽA *C"ز{kXb_ahbm%/D{2@7#NmH..(v|MLɃ.װ&Dˁ*lZÎ >a9n_WX<6{o˦6o~ua g} 2t sz.1 -B\tK f `t/b,tSVQy<98^J Q+쎊 'n&aa^FݯVv /b(4V}&/+sc\\#DZȸ=gc;` fR3; N66/$[⛂qX_>〝!nLsF0勯A/􈖑L!q{tr0xзkCzsWaF/ GY)i-vaqm##尣AHe\W#,>*. 0nd s3^f{}^j-AW`t6 yׂZ.1 Fq(ǒÄLG9P\Vlf߮f5g6aCW}K Emt0)x(EP P ?s_ ~4, 5C~zW[!>h?RӃpxM%T,'[Z>x;ʡSܽ8:M,iЬ[V : iLOΥ',8*雉_]ۗO'#ҼXG '0ר^P#7z_ޭ;Y`-]!Y|^(\Wfq*=7o8 F!./Wߥ?Q<%1}biJTF_m'k ~~}'oҜҤm9o֝w[Toטj+B!WKO!B!Ex^4Xj8Bqyc h8 ȈB!BV%B!BV%gKPWQM!BQX2q2F0ýji z|X'[2VQU?8I/f}̲T㫗󉨏^'u:>O!B4CͰdi35\.O1܉ce4+ve>i2;fg;<[.B¯a0uқ_.Zȋ\ fw^u(Gx\> ‹.Mԙ6Zn-]uy?^_1 WSq+fr==;ЁqlSlz'1yQ:eq7N;X0sâmPCjڨ1[0( Ge?L???6PWFSgIĐp#[?imA VF΂x}4^U`u!0|7I:B R{f1_B6ē[dAYg]/AC`l8@r@ lb*#:w-kCɤ%I7o~ZHOT%iIt_ 5qyΟr }Ֆ_1ܰaW1O:-K}K9i 2%q$2$ҏ-&%Ʈ_m|SW>7&`]gR+xMf`O##%,fI q!fé%O׎i7yշ{cӄ(x9@]w 0Vмxzdo;L <=l{9(g?z=5N**s^D&֯>e'/eYwjW "=}/Sr+0᫴\{(1ܴ/^CVDb^1#aV?pvkJYz(FUm,dk96w"M_ 1xյ? _,aد-%u#.ckb0}nY_i'ixc4QYrSH~y4n: ˟bs#17ͦږV e&qJQ˹mJ||1w\6 Z!L0z˴jj@K\}9wjdLae\EV+V{W݇{v`~0W[q\zs6QMrF;5#c<#[jjWvMàj +c;hypuM85M]á+&ӵů *x;nwo\K$Z?[h>ZÎ >a,(LE$ߕG?pN~ua@ t5k S=7+0np~cki/!H8Hw*jO?sMgZ|ʓNYE@z)dk8; Tu1ה~Mǁw٨ޑwh_qYe:o!HiÒA?Ȥ9 4%tǭiȬ(͞Y;ygZY~A' q1Γp=w{;˃KLL*#Kcxbus{-K͌z(7D8sؼ8l .'x4n$O6M+Ymx*z$ 7B݇a8BF¬>`&ǵ]B!eʂ~#& /\VDfN$Z"T#xmHo !̨](+%M,0]`Rnd~VFJ/"hpxE5hT*A]y/-=SA51xiY-Wiu_O{i@߭fr=fuL,>*. 0nd s2K_\t | Lkcr-#`d},I=LDʺXz4-{8m%Vo6jf~Y;d4 7>ոyse?~t$mL2m? ~fA)SBf³O,; [߄}@990??a#B)cX̹O, p4^~E=lt[y  //^VlN:[תuzS~f1T TLL"ՙ<}(bqsQl 7Du^s;;l(糝[t@ou{!/Ncyh4isOkT]m/\a5ކG߾kt:5)͔ 2uhq/DcRp0+>.C]?nQ=~ t)yg{ !\ruswO'OFILlXߗ|2Z&9]*Mږ[CfyeMvB!B!~$B!BѪ$B!BѪ$B!BѪ$B!BѪ$tnOk例t1.B!pqjK&NF<}fw@28r ԜOn"뻘i^wBfᨳB!Dв"I;؞ !Z$O⇌UTU}N˫AYo$l9|"^?%μ=ie;! KzSּrѺ>xkr'ގѬہޗ{rP1$l5 "{\<^/D1@0w>, }Fv@F/EuΊ4>:ܷq g/:vފ=ڌ|xog0{7B!h¯a0uқ_.Zȋ\ fw^u(GxJJюz_3@_An̜Sκp:ppq?-71uMOdC=;?/JgӴl>#(^[m ^Ǡ }B8ZQfxCഭ  uEu ߀O\p{]l=`Bp4V^i #A1p^3!{gvA8Eչ@/yڨj2},#5:Pc{Xmx~`<|Ъy08EJΘyoo#TdC7pr"pGD?nݑrw,>>:5'83'F콱}&:RWF P/'9#{SVQWϓ]/V=gF$SʦѰ{lH]n |Ҿq2`ZM^L22WP]U)ߓ#I)=qeĞM%q^.IOŲ>;߄{V/4P`,mOé8M,|v y c@|><3Yq 7Ap0AH2ô.B!G){SїշpİlY}gnu={f'f%!<82s'ܲ0?+ؘLZXtӊBIZW.CM\"I'@$̉_rMj%ȕ<1IX jWeH[v#tMK]KW? ÒBeo "_&$.{NG`jp^g<+_"l ~Y#uQ IDATH aYienF8ޑ\>\"P|vO]}]a1;M/ T*x~cˁ1}LߗیL\5`Xm+!IF :l"FBg`P;ÆS vXVYM O!hW.|Ǒ 2/`: yfNڛ)0ﮊeҮ1v>?z=5N**s^DQX,;5+GV}~>us)iÛ^L+GNjwRPƼNeļ*b|pJ݅W=fGXiE(bD]Ye!VNZȱjs'ܴŕ TVw&|Qa.{Smjպoı5`aϾW@4Rowo4f<~1T'w{Qn -%' Tz/QܶU%P >M\}\ Ok Kkk3/P뾵ZUŹP 8Z!RMV1c;mRPւguE5|C?Uo d"+[.yZXM)pn}xgFxgPP[3PYN~G5IT`6DRS|خiMG6.Tj +c;hyuM85M]á+&/O"9`xuD^ +耖C^=(?щSF<0{_qUưxjWۤO~ua 'PA?_g*ᗒf<ϻWau#쯪-ʡ ꮺb=oB!.#Z"(v󰣶JSVQy<98^JN_~f34~tpW*y(%UFX)RB2+`0咒fj%ߙ;k<˰.6P4aqesc\\b-`WXÝ|cl,^jfcG!‰_<=ődkPxdwt2 7ymu0$|``i va C`X(\-  yN ֫Î}BuFc7ر !22f"$$(Z0T#xmHo !̨](+%M,0]`RndpAHe\W(EfBW s}]fV /3zDk4alVθ0_u<,>*. 0nd su-&27G˵࢞Kxu+$0}GQfwSH4H  % BS@  XPYl(5p& AA J$6ٝ# <χ̼3ϼ [FOҬ≡MbڌxXN?}֓sp1'>/d?>YX¦/o".\osᙇa] SQva6<~wgCظ ҫB9]Eo=*_ߠdG7ZG&?7Z3/Í{6zNLb1޸y>{y9!Yg/ #~xwRQLzuݥ0XtBJgvy;ڹ3s}9B ȮI "|Q 2RTIQ_QQ +^a{ct\+ K˸bm2Ʌ翑!Bk>ߘ UGBmK%ѻDZ%hWվTٮNNUm8CanwAgvJapk9Ҥӧ7zl a.I:Bg*A^˓jm@=3<%) A;^K_Z|D~WIڊ+H?ع6\i7db ,=xvB!D̑?a͒'kJVqG=o%Iy3ϙ: !x;xV<KZk?+#B4v/3w̝~[N2s_!D#A!B!JO!B!JϚSφ y]~Ӑq#Y!Pyfִ2ܯ+l_M1ō)Fǜ/D#OM{WT7Q !B;[0NyZ<5{n;v~yP3+4=9 [js `d-lZŶ'"BTPXSk֋ZrG:t8#f.52 w 7cp`nNkkny!.K a#`'p|*kN>\='/~V=bg_N3$bn}.)ak705e+)*?M!E!<N݉븇ё%BT"g5BzEmѷs_r-w557G&pgo_>'BHy]m]N2־؛Y\P=a9?F׶̍ˌqԝR]1کl& YƝ" Vt/jdpN˗8!Я-?`Xhxz6$:|BS-R00ňJXzxuksJ{c3^hm`Ŏ]|q #<}].d{suWk'vrF72 a`iX;E|:oow[؆zN<’  mso'3Ga&nM`m);P:W4JЄäpkKsxrW2[,`If;d3#MW./o v΀˗e$$̜SoKؒ•$Hb`enIî^ 7+w4Bu+qh#WV^ ~8#Rc0 |"<(Q鿁 !Ż =4&6U(t ԁ8-_&[F_4b/A7qV*k&&zyr|W1GӖ(vj0lr&IWbB}5=4iZ6¬\fNSG0."lTK#э{\z_tᦦ^lڹUq,ҵ6^h2SaKb1lJD,E]B*$T叏ʘ>ţWjm&"3M!37n_ oNЊaFJK `o#~8ExZԟd W^y7>o&wqb2?3sʓ8U/wH889҉'"R7 0hnaOX` (7X!V\\h@]a5 uwQcD*7Q I+Oh|/X,NۈY\`\zO@ lJo-goQXtsiӳ|GnF,ߗVZL|/d|yqh'Aa.%6Vu%׸3!̧SK> q20؊M$|'$2V~iE]+:Oo*pۑStUK:h -Иxif6]]ZS?B70Gc`Xn8ūkq# |b ?Nն* L2h'k|G߇B!D+Z)/]+1 g_?T*1BSe*ӡ9]2Q kN01mͥgxX =1|F'lƬ7XBìԗ0Gy4z#M0sL|vK/zhnXhM\+AZox/o__jclv2UAT:".a+܌| c6G8:2=/r6C87ِ{nSmLl| G (Mx z]=V~ pMoUݷBqR*h x-56ՔN}|u|q VħO[ >{q:O2:i^A؏` рs=Hc[)96c!M 1y-;{e`Hx?|6;gv\ŏ`VZRQ^KyL-lbWjRP^\lGPth?rt4j +t y}mNĤ,̿o = Ə~3<ޮ)llg빯Ck5R&8AZ^en|ã;w;u`/`ɓ 8'R3yx鳽traйѴ=_wmE*nyT|nz-4iQ t}o|;Փ64+b3̘s#xKtٝ55P>zgn5ׂ!.1Xa\xaX0rWÔy`Yym[bTaӧ Mtp|/^'݈B9];4}.7l~IcE?>l9m<Ckl|6s_0^y0 X*ս_X+n$=0g\_։T6dX>9y Q;[3yPfddNˮa+o{ ;~gFsgY`q=|WV87cn~7aj4ig3񾔶9!Yg/ #~xwRQLzu7/eG~, gN!VZ[pܙwDp¾TKJ!U-SAuʋ_B$0gÎhHapJQ&E:aL DE9*$k/hW9sQ(E-wEtI4]ØXq=w/F1or5{s룓Snq[2搫~X9xٟB!gw潖j@ 3NK)D$]mB!Du#ljbIv̻w! I<B!D[N2sftt$BGB!B!j$B!B!j$5LOE_pgˊۼ*ݍB!Di6详Ɣ[Fck#y/S2Ƴu m#/@ᙱVx^ϡ !ޱ5a Ao(-ڶlĢlK&D[Is~"e׳:? &t!]kƾ| A!o(,)|ru9>d7k{߅G'eg:xz` ~tki_aދSd ұq93H=lKm!n\ψeVoY٩+J.`uS ё!Y cV߰|1׋beoɫ##B8 47-`Yq~Nx^̥؄Gy`2f /:x{A6=N𜶤*Y_ۙC^o%oI {&aW | FW_-2-*Z:\\wJxzuBa:xe|͝B:$vݾ q% 4q$F@ܑW|4ɉIxk84^L}$ە[U>-#q4-y - 3|:y%AT=iBtu*'Dˎw!* ƼQM;p=<=ܓvLz2`v LSYǟr^҉ GC\lBe-aSkNg({iWGI'h\r~J@@$zP\&aتMBĄ^$@Wphإܜ\%҈'{tc`"W~GdAivUtmxZ̔DؒX R8Qx>KcQbЮ I'U.㣸2&gj)j q2xtV 3*U*/Du !#q~Nx*~'4RaW*6Ž w2yJ~Xݽ wN zt-!y3!bCJaVh:ԧpQX\['!B44v~Lk&lv 2"΍}0oe[l`\nhl+`mҸ14_K#j#;g^2Ieuzch*v J喞efy:^{/mB$EY2':4#DůqO\}L>kk-o/Il/ oM/W+MuV}u Qe*ĭ@sO]q]ՍԲ^LϜibz2q[E׌; +, < &@j2l*l&K[ .|I^ >s +~ ]/ܽ- ߀ !p>sC+5z vU^@Y~++SIYm%Ǘ1HIaqCϼL-aƚ'< cIDAT񶗰#wF;IUǭ͘@-kÿ `Ǚ,/nNaȪx dG<#Èޝe^][xpR8m˫%߹Ν{G7h,I彤R2tBԤ` RTIQ_S2P5B4\rߜWu(X h+r(olK yn!%}1|ٛ]vˏےq6\?T]mB!DMQjޙZۆ'-8-I9OW[!BQTs$<x[M,IΛyN5I@H)BQO-'s3w::!DCWx^ء7lkG6^~kԯcI׮:9}Bzfr}}2S!B!DS!B! LYӓ1B!BqM0PO -nTUQU{"Fj7@۟cd$X -~='5{-11/NoswbzGS_x0fY jYUU:"KZOa#:錿s?›a~)|wOng`?F=UTL3BqqtlAY"3&>gYXBo_p ]#ou5E>e_^\..=x־|=//GG&J3: EJ sep5@n z no qNb6l]ώ51b(Vu,8PW5t$tFnʮ2T4Fnz9ͦHc7N^x]fGSi }nR3c;ߋ{wK!2[˖J 3IX™i;;}7Zٿg?HJ?iQi *=[T ^(Xw?RCgxg1?2: 9t):񯅣} &5^ t6Q[PG::E#X(z_߲ +?;"אjRlGuSK)QY7}6gۘ1'^y+]]3JlCBjQ!Ea8[2z`*ڢX.lݴZ(OF\I_!g| W+frby!:e0mefZދ`iUU1/=`"ky<*r ̿.@UDŽB81{~MIy}ɉ(AYgfPD&4 hՂ(;o:DQ-$t /O-m4~̖q5Ia>i oF#&F'!]uld{{^! U&>  EA/lZy~UqĮ(dS'Ј'OL /?/ąyn!:&[zۂ\0/>/qG@V+d퀟AN ~A𛩲^ N@zIMuʉ~WT+~5.9gEi϶}yC4j]ʬ_0{G9ӛ|<=dڪd}{nϖ15GF0%Spd9,!O{!p+'lze43)21LVxOfx|;p`*EU=lR6^:RLL{QQ+/{eR%_~kԯB8Fuu ހu>TXQGuˏےq6S\M֭iV!BрݓC)d_8NAH۶m`mִkmdf!B!Dæ wt-FCvp^M#B!RT5L$B!:gU|_DIENDB`pspg-2.6.6/screenshots/theme1.gif000066400000000000000000013742411360716715600167400ustar00rootroot00000000000000GIF89ar """ $%#$$%%%&**)))),,*,-*..+..+//---,00,13/11-2422266639;:::;;<;<=<:9===34CUKKUUUUUCCCDHJKKKSPNRRRVSQUUUTYZXWVYYYYZ\Y]__\Z]]]^_````bbbcccbcdeeehgilllknpnrsqpmpppqrqrrruuuwwxuxzxwyyyy{{||{z|||}~~~~~*******33֪9! NETSCAPE2.0!=,rCH*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳN@ JѣH*]ʴӧPJJիXjʵׯ`JGٳhӪ]˶۷pʝKݻx˷߿ L[#6̸ǐ#KL1;t}ƹϠCMӨS^pб;Xq۸sͻ7evѽȓ+_μУKNxнMvⲧ8@R|#hM/Gܺ(BOfyYY˜% 8`Qoqw|zD~jтuu4e7<xSA^YBIc_V3C*N_tE$ ܏,\~2zC8@:zbk"DI@a"J J@Gu3*Zؙ@)R4! (3 -Ŋ$,9Yx,f0a$a+E\.7u. /ְ:s9+Y.'`ǀq \Ģ N-ʁȉT}ttZhc.<&(&QH@,I1`耈C,|-ӹxx#! z;@x͞c!80./FPp( /j4.q wmJ ،htq`4&A1#i6Sc+] ٮuh30%q-XяR@PG=졊L@f9C88KlyDtл}O.< GE 1鯩nt$(!jzN `@4}d>S:)c/ZAW:H 4T"| (1ZxD h z &&cˎٮW6Wȷ3)'娅t֭c(X/[:bcf8/WNV ZjK?i@֢ pP "3,l oꮈk\WgQ 8Sa?Xbah'YtЄ:b";UKZl q<~a6qP@th$}082V~6x:/4c"q%+ܾ0=pQֿ^E,a k,=(G+gt̂?@.{do2עÒ-X [ 1zIvp jIeW0KshGuJveG ep ćW)gRT J- q2 _slsF`EC uADڠT2(eg0D}@cg Db toGvЅ7v`TxV#Q@UwY=saH ^Pze0PxTy`-U@`5}tMtGY [ VV5& *G} |ZeޠTІ6z@ L{اJ o(*SV~Z%$kd ` g 8qdqyQ Xo(X(JV8rvAI0P vQ 3xp( ;-نt 9 Bȍ 9#ka:M0 MMiH h՗dXnXЉwc TVPHU@Ttoq tUIbepk1x۵n+57T `:?ݶ\dA} Ǘee/ ԊMI(g  5P- a)$A9 Ph}WǠMIfja~ld (ybU ` ː հ p $MGK yxW!weHQh0`IYUȑšT+G^6`9'*isE@sMxhT0EyuWG/i`rpɇ` e}nu{%JXd wf pmAU`:?45@T%y ꠣl Ve #je؉ٔK ~b" y;EɥƇ/" _i3ZoZK p pd (r5a7%9i0 # +xA֩q+gTJ~4-h)JE:UXV4 iYПJ,'zx1J8cu']ѵsQ p!Pd` P-pq XK@VeA*m - ]}1-&V@6]@Ѡ3#vAPbu+JNPR=T]V}XZ\^`b=d]f}hjl-@וr-J}|׶u]dػq\׀Ԃ׏ ؛A؈}ٻAטm ң-Saٛڬd -еm{reۮ׾M#饪4}KɍwA$]}؝ڽ=]}-MEAꍲ2+~뛾쟎a`,bn͎즎+80P0=.츾KqԳn/G C .#.0W@S !p4ʠ4LZo/o+@9^3$o$o3@?50_QI/@6!?%'4ZK|0oQ`ȡ~N0; i[1omːN _:e5@MI<>ް" <Bp/0u\/ | O¿o o__1a<?_oސ!/<ț7>.d@C_hE4j/7vE$~)UdK1eΤYӦYV RZpj.)Hɧ ^[c TMaŎ%[&9wthQ$89L0f}uwI&vd7OJ.4.m~sɸI%[N;/ $\B.dV[c <!hlXijD\ 9"Gb>$,˸bHP T FN %03i(4L4U%&\ibD _h0;h2S05P1ߜRΔR/ӌ[4F NPdI5S+;'4A'KPUm8 3{GmǛ4]"X$E @p$eF ZA/=lfEv\rͲ%euZ6%Qf`!II : /%pi5e)`q۝Zl03`M]S;0~4yM@hK.xbr@H_%kd~ Z ֺcUzi.\:j5aYkᅗXLrxƼ~ⱆb:fΑi;,{49WHe`,mʆ\x؆ n̙~Im'ibV:t|TO购QFt4I~`/vOp=ISzrw.q^ogݧ`[zy[8}#S*_;uΗϵLm?&^} wc9FUyDR kz+X{{ _KȻ݄ Ub6ƒN[\wDKSg"p, T`J#\ $7Vl;HRcr-Z,Q6 bP2̃3gYІB(8)X!cYAxu $>A$$S|F O:ҵkۯq6єk0({y[ć5a b25Rr-yyJD);D΍x_9)qL6)O܈6V=t~Ma+ 羢 *\=IwxT2Ɏx.{^:A Urx"XhP\#Dt4"娨lO2w-O !&g ј1kOԘ9`^9Ӎ6G@ҐXVuLHYkc^-N-_'Ƹ񡒟HA!e!Ei~*F,*:m*,a ;tHĩt+a3zc`Z4b6m G[CՎ6tΈF*&COٶZU`ɪ;ܙ%,27Vu~-%"K(yvm'Kդ Uo.{MIBGI]Ӱ[6^V̰+/}?9ȦX ۲Ҽa^IDHWpZ6S=S/抱U$yqm|cX;q}c YC&r|d$'YKfrd(GYSro|&:P|n-᫟Ӄӆ̞J7#5Km3׼1%h&X+s~ 7%('_3DžwyWgﯧm3&k:bcP ׶Ҡ&U˻Gp6 8YY&v}ld'[fv]l,wuW9kRms wňOLL渉gnIF7a]5q_s h٣vfp | '>x+` g8MMp35Ն8}n['.f>$_~JxǑd|2wwGK{#ˑwʡsT]WyӊġX&Gzs$Si~`9=o!{~v]kg{v]s{!R?{{Cw'|>x7\y,GR~r<.쓧|-yg^|="mIyӟ^w??$<@$Hyz~}IO瀇ûbx8=+?3B!Lk@3@ @P1H9&$B*dS0TBӂQH'B( Q9_0 A1sA$DCЈ0 H>ӽXHF,A8A| 00ahxEQ QyqEIDhNtHCat]Q|4EF`|ak4l?edF| 0? xDCx$,8xH>0.|G]!x0GpȒx@H{" 8H|08@ m HD|D|xVh"Ԉ 55Ј1m tE:aMIZ(W)P>ȤMhQɒ(ʣJEeɡFdJ˲xNO|M=*΍0 `ʼKKFCh!X(\LԈX5@v:C$4Ql ć 2ˬHݰ"!O|-Q|@I܍k)  J۸EMJMK|` Ň5Rlݘ.|HQ_!۬*SRv: K>lL LCp"пdTLhhݗ3Rڬ@%$t3=(R|@PQFuT|h#L ' Α 0NFTΨN RtJ$͎N( OUΰRT]MU=Z-  23>H02%h% 31@V|VhS?PAPA-CET?7@Ȗ<HzW =zLmɗJ@-Ji80$0J|-5ȉhOGS@"ʎ VhXV|"}Y[Y YE8CHV}V4VccX8 C<9Ҧ}Z͂C8:`# W M1ZUZO8Z"QTG4 cXDۺDЀTL[I옏yU,Sdl!hhK@z9XUɐELRg9܅!}eHhQQh5u?V ]h1pO$$Z T PSx@#Xݨ%^V`>䭱. _c^ے- hE}__3^_KEMUCFJ_^`=-fn`l 8pa) M"vCaVac6a~ Vyl=a b_!b ֕>b&nb'G'&b~<$d=.0Xb4CU-c5.&pX\[elb,<VPU``P*jXDFi>-BO>؆kLJ&kdJ6N?SV>ecWvexGx4@T;[n ,.?.?֢AZ6_@YeCćUmU`d4GINB([Zax;&Uc#e[ccV~e[|vXXnͣC)h4/:C2H$U fc.Zf%TC6tC8|:$h2$dl>D( CPDF%+%ICVK,\HЎ 8.:p\TTEVEXEZJnT^\-`Z]vi|(clddelFÅmthG,AV kd6tDkPpj|FFЁz#D6Ƽ >Ƈq,G"llTPFGuVcsy0se ZpW^PZ+mvniG V`G?R$``ZX`WxVEݞ.nVmsmFo8y *jn1Z\h nT_m~Vj`ifml|QQ`]K$X2 Kh`III) 'QW\F`JʽxktnXshx(xp~ʨ OK g4K^r\ьmtA8qa%K\c\˦|Q$َJmq^Y%vYt[pc l;(TLla&I'(WiHU,X7`MkuVMޤO$:=L NTQU-OX?A_N ΢$soprٔw ׈k)g )"!!b0Bt0.جZ$~"OA|Zdyf0[8eApUb\8@Zʄ5W9|ZaD)Ԕt1XO5aVel-\#9 6ɵ&b+0,vy#*,p.9XLmjZ#@d'uQPn*l xipV0x ʐ9܀x+GfT*Hֳ씲@#yy?A49,HZ kdm#c[kF[>jةr͍@I-b:54LSOԘF0H9>SKdEXB/ 4 >q$pLYB"1-!C` cD hK (spbDX|,ɅN%%/N/<K+Iz =\9pb@);۬֔)d%;#ꙋ$#0+3-3S 6|ă ͬ> :Pm MaRM8%ꍐdzϞH:ZX) i@6+ZfN?v_@29N,^:\,N/>ހ2d(hO9 M!opϻ&^r(cP\&WKrNݦDf5׀ēay '}ȘYз a(fx#J#y~9W  0A?OWz fOӉ#xlИI8l=x;H( ? 2J Fɒq,B=7 `)D[?!!̂_3F'坢@б4pw`&e o.Y DP$a g\"C?Gy/Иv1e85)zXt_v 3 >1ph`8\! (3 ,4Ffq$0\h@ (pSԁF8>Xq V-3h0ߖ?nF7J'ר/1k@Qƒm! v|BTiG-s,$94*VQu|H BJ"mb:KH @ |XM 6!'HBDh94~Z!I,zGЀ@(1 a_RjR$j&@ZRa,hmt!`O,s?PN)JcSRk"8xD @ЂkTҿ4k-U6u0Ê۩cm/#>gDḆCtHqI{^#Ss.vO'ըG,@P~Tns% k T;)JǬ=&XpjIgǞFpCBdDd TS=H(1Tv%<d*YYc"0`IP=e/eFIC;TK]ڛ\z%E %`.6T׳!X TSZd98`[TȊ Ren&TX:OpZ[$IzH&FR$k_&jlr= &n b$7b@A @ 1Y4ao2ւLX[sMqNe}Rjginjj]A&z'gvpAqb%bd@|'~g <[~{:P}'vz&}@},p>z.)$ >@$RB}hHYqP4n$@_Rb(>0B <@OLI(@R%@(4^H@NՒRi (@P0G,P[ (ei='z*gJ~R$ |,~ (h*jJx} 4 1ND1A(p<+Cj|&\j*6*>'_ +l(8Iڱ&j_(CHȥ4k9AoĀc*A|5A:Sflf@e9$@0b%ilz,,TQHl|@pφv@02ң&2̖Af+؊-يD,P ^Dڶؖ-ۥꩫMmA@E0BPܒ, Tt" D HAzx͊[ج DJhДlze\ҒD.\d]`D^14֭ҫx$wxG| />HGn>*/R*S?Iګ*@.TPnР`,%/>&iDJϒVo* qnGm,Ā!Fpft-gkM ּW^dp JpEi?m:@5#ă(ȩJ)k𫦫 *:yf.(w/*k2.VH<+ oQP=!$Кc*"c9]&'Ғ-;/#[ y"+2,#?rh((2d9 #?2<4%ƀ"Ԋ"or'""#S)r$"#,{-k"wTy2(2r&/20S02%L$";3132CV4"YI@x"|5:3;;3<;7<׳=+"}ٗ;=Sw,2?7"BM :t@?4DsAs;;4<d4GјutF4II4JG4KK4LǴL4M״MtIo4N4OsN4PktP5QO4FgQJg4 B?<P75U_5VgVouO/5WsWQ5YtXtRYgU* Q!5JP5uM55`V`wua4ava'vIP+6dGdO6e4cWK_bcbkvG;v?x6g6iihvG]jkhPP#4nmnodӶj7X Xl+voitsusttp#7d7V 'qft0'4ww57w Au:@O vӴz3{r+O3w\utjg|o6f'}f6wO7Qh )htyv'r4^(+%l%&đQu đ)h8 4h?lin{tx?i)g)8i5V)8_'CRy?>hd@Xi,їi ח@y@ׂ À_u_5>MMR-39>z47 hzKIkjJtj}2Ntz8p,4O:;z٪Ou,te7stvk-I㺮{yx?jG{đ7tBX @,( k-+Jgwz;5dO(;!kn:U:U'z (Ӵ7w$|kˑ", <<[LJ{?`l? #QH4| CFx?hy7|Fw4Q=QGMSƇygt{,I>77<ģ~fx!BK leA@'A… ёp, !1x~kӀɃE@IHR#C<%RTQ'O0+Mt)yplhàV k\sֵ{({# c"V/H37$p?#BAqb͛7C./ѣE'GLh6@NeOBf;'ձZx;wd@֔;Ș^ f~8ENF mܺ IN<Q?Q *@A|"N.S'F䀓f @xC=@1e@kAL.=\`EDɂS` F~nlE!"4 (il0+.0!ʱ bh"$(~S̃8G:Dpȩ(DH(o>HSЋ0쇒2 NA& ZA Xp $)Q?=o)L[NRUWp"=++`t0@&R3Zk}{@"Ö=/n64&KC[>$@yݗ~7/W >.r݃ށ9G ͘= dM&$9pR$C,)l]>sgMYfhhTfy騥c^íy:k첽kTp/}oA{ +pT|v|_FzIFp"H`KW}~3 OuKrdh w߅x@,Qj-@ou'gݽCً?5Sڏ .7KQ bAlBB:[A@gzPW%] [\>hm>Ā wh#i{; eȝ~ԁNvNfpn HuJxFP$.!" h"sXxO.; X#wTƁq WN$pgP=#_8G2"7B.$X(ƽ]2cQ M/X 3 >`hyF2)4YNf.B́ b`]6}@ |i(c6.lB >쭆yqz0mv#@sD <],U8)Mj&CxC|p\^O-E-Fu4]AmrwVT ]hCQG=MnJ4:gDIC8lA9 Rԅ@, e(AX+  qo|S*UD 8JE F2cvK3&dO?bB(|`P $azh5I^ԡd7dViGX 6:MgZhIjԽ5.]jmbہvqzGWv1PV!Z`5 ɂq]zPM&) V{Bg  0It^ Uj5a:DIkVc.oQ=[3.%.rc` 12{!j~{UmgS?t x.`ŕs VAJċXĢAV$jpКd"`b,c&'C."XX\0b0o bxnBnPcJЙcNG@"aFf&hl8 b `d0cH0!~0X(/p !PXgp Gm,I "P0!N]ABb! #i$ȢF pEm"_'a06$0.xې$aPG  @D쳄wqzTsa`dT̜񗙮etѢ dIB*6$' 2yٔAyxS۸z}I3C<P?^Aj Է<`%~.΋T5_dy t9ƀ)G|HvDYф_bUF6i[3j~:xCjZ :ֹ<HPBfH`>%PrsC~?fKs%hZ'b Zk\u ;.Dv$)v㐧6ɡ(ysJw鰫~<c P;$8 `5V5#D47 $|9 TJrK}ȭ~ۼ.E3`? Xa<@e?\JAD~4⁃/t|$-8Up \%(E<}%h+A]`ڽ7޽| $ c\8o?a;XC ~;@/Q/l\J\3ZGgP%YϠI3Aiauw b?jl?o'iۻ/ۿ?` $_< &矀g (^iO<hpH|kPჱ4S8+&A =hԁp@c,-]'tNIT1ZA3 >TRw 1v]>P0{rv`xi;Ǭ!1' €hN &Ґ(05 G$0+Q"؀$KAk?\PB B88Gk8@@"H^XcyD xl[.ZGtH(F/:@ yqB,tmHN9ē8 5L3K6!<?Mvfu-lŪR +zsXJ͜9/ 'E3Ξ㋟MyONoyz袏N`MhSz뮿6{tN;麯;1zN|{ެ(S]Ь_}=;h&>_NQO$NsO p*p\ȿBp%@_R)D)WɞBj _? p.! ahp!5>̴\C>~ա YH(e>xA,V-01 !h1Q/O ?41/0,A@3 @T}9##U8ﵐ +@> r̟(` @(` Ĥ>QҔ $'NC C( OR ``сL$WՏ>2 pͻ% x " H6Mo"h0mI !)-P 3Iq<}ʄ @ǎydD{)2 |(oP= {;"!TĻ-/;`w.x;m`e?&Cފk\e-@jp1IMnBZ6ҕ.rK?0 ##GP;,<8V\R>Sks0⣺ztlн{]]##~|,X淓F^CDXA *ANFxvӛ'yg= IL|e8M?|Dg4d>" !i C&Cy-G?mLC;Ɏ}h<?! T0hd#G\}2qXҲA&77VA1tzڮT}atMmzF?9!}rxE0WN K5m|[ΏZc_x'Ixb 8kz$Uvի_+ZǦ-nytb/| A_5ח(KD}ZպVvn Xy39Z7&&nv_c8@bq&</;;NYY?g%_?=46,@. s#p3G&g+1[Sۭ^i~ƴ_qJy E>˟ƐW9 =s'wuy7jjP?'xW{t`老u8yd:yhvz P ?h9A7@ˀ== 6 Ѐ %j:SyրKƂ炦#3D E8  Ѡo؆AK8~各lWyQ7`pqD^h7F `U ܀ ` :^(vV= PqG]_tdGx?'G r4cHiN@Hq(t{8~yN ~`uKI J` d&MX]ް ڠy&Ix^-PK$KdK?]L CjV=qLɴL]P:Q p P.` F`;OO!MdMkO肏6 gVH@ u㧋A8d]Q先H^H^]#S ` ` XHjWQZj#R 8@2.SVS= U2/ BUVUvlEZ%džn膼nXiH% )&e\JV^V]6= hހZSz$9QFڨ15:VK=. #5]8]Р4 Gْ ҠPfj_h Q`p`A2l7#;r#qeql~:ĖB@ɗ=J@?J J !ڇVo y yOڪxfpppqWq?ušYf5c+Ȣt*qX3 B BS.gt'tںh @:꨼wɇqjpoua Q W(X&(c^h0w7*wq1|gw6wo?10 \yn xؓ:\^ah?Iw 1 HĕL(L)dNMMD/G4k @Y9rIהMSu U \][\i|7iF啔G_ef[? 0RIy @\1#aYl^TJTBr/zkIb &`@f ,S]RҌ;QUWUԜT|:%&hˑYcLʚA.HX|<  xExS,#f)g\ZZ<`k`cURBkbb(!]\ |C]+^ _ }@Q4+5#V-&,~a0a[au%:2HLg~M4j8:]wR_$]LXGP`Jeb:_I Rʐ 1֥WZCofhJAh|g 1,QwMNR..bgnW#=oucUq4iNQUݭXM:9m| e~8Z_f|k53<`"&gmFmi%/$LBn2 DPqR* C$q q,nF "&Mr%{rr9K.tt47/7Av,B<TNt/ק+KrҽyvJIzGF8~i?/>Xn2,2l.:nx{Bz|aE@c.J,L+;B~z1郮 t[5s|Q}kyN> ޿DN섎ؿRȮ.@#^Ӿ=׎ퟣi^N#eCBQϑQa=$7jg7p#~'H/3| eM|h3  g&jmG11 s79e%_?'iT(?d/O^2/*_6o8=qHh0B MB9LF;5dS6z/XisjKJd51KED q Tp xǢ|UTU^pUVNh* .l(*Qm4K0 ś/vX8{ZP(oT.Af%/@2KQ ё Y$h ˒ Vʋ/n~\4x38[̝3l}cRD][(+9w)y"UU~]PANҊj*ci52|zC]#jd $j!23< 0d@F !T# @mExOp R>SLHH۱~~ xXXҸR43=Ij'T*4b*?|0h 2<IխU .$` WA74(ZԜȡ>cIvҠ:3ЃC:[N$JZtZVf3%(q)\Zxx x`4S/vR3ԙe!HQc- WC #L`~TeA4LĜ -(@EW a;#h>pVLB z&#gKWD'5jk‡m59S8M 6ю RL<;!vֈ_ߕ|D~䦻H93)!>Q}%~xCl\6SxD29ҕ|%6 PA91sÛt.;q&,3Pn)ӟ 3i3g>sL7Ntu%<+>ÏFaQpT0'HURuGQE]YQ^ )BR%PLҳGEjRUj͚MMӒCF9>TĪjI) }^x:VfLO4Ёh@+O뤤*<|C0s5:bҰW~ ` u3ªKJ>(0]"He YYF4\\z$+́ZUr8AҔ4`m,Sbю A+yV *R{ wu4p زuEdWYvWJ4s =h+:Zר [( ?(wU[* X P^y!2l)Grܶ(5ǜ |EX**vAh E+ H8<oNs& C04Dkx@T~( YɉA `v!J-w ׫v03zDCj-E_tcX٠nje.@K\ &0gq 5$ڱ qk`ccF74'(1l6Q^ʌ@N{zl7 $"Jf<üj/`167hFG>^4#5=܋|4%p-ұNT{UO8JЫ%t a t7!]  k4!iPb=b?@p8r>p6 wuy]]k·VfOEͩf>cψƶ܏h0:{͔sYOXd},!G @p3(]BTBPfQ|DqOB߳#- $֒ݏ]=G˛@4>lJTts)mo1iGLWm;cZXnTRա;AȾ87%ƒac^ke+_{nzO@I"rMK>}t-g]2ǹ}3%wg8=g8C=ku˯;=0=|Y-+/;ux>"0@sH0>JK{,b y [ҩAa[##q+}9[ӊs[3r3i*@}P=|ؙڹٝA0Al ;s؆m~s)|?ۆ=:@H $  "")TCCD,  &B"!B!B«B,B: 1$:k:H@g2:#g-6r#̨.eL- O pxRR9P ђ.,( P:-rںl.隙ENs#Ї0 "5~ &u+$Kʚ'pRPQӁ(QxMQ,/r /ZJ8P30#n(@- o0 (>0.0REeTЂQH8ObeUO R0E͒`;1Z11Ӝ(2>y-2*sZ X2"322`TU_ո˱8cMebU6MSF;q@¬QÔ@AՅ@]bЅnCJg!0y-LЀ " N،TUնĤ^4$5X PRXhQ)b\. PG`5WmEY 3qmr # =smz[^X]Z| f) -(2`̂LjxRhXxTГ 882m a͸׈b2z!9Qݸ5 [qNrZ ډ:AӦ$B:WڝS0SP30f@`.P4Iطu<ᑽs kBɒ-Y^W)ݣ:݁83P?a] ]#L }>پ!9Ӆi?igY 6 F9\ ?|V n+_U7E_v=LWgw4ZЫͥ%_ !P^^KXLBPQc 4؜ʉb ѹұaۚ!*VTћ1/fa7}am=5qޱa,yDa DE'.cd 0S` 1 S %JRD+2Yl r"3N(*:E " YXf"Xb  \92mT# ߕ6Fx`'vc7hxf=wA   9 Ho} &pNN' *Ҁ{w 4 `}`q`~V`(!|,먟sb;LJy~l`` 80,lXJa4D)}0K:HQRXbayqlYiXSo"iSΈ.XZt6Ax@h2ǒ"M5hH<JEr٥_Y$bk͸[x#p0zw9\(>(SK-/Ë6K-O0i? >@:h?+SK,*(*j&hJJR鬖ꨀ:*K )A8UYP( IQRpfv[؆YczX ohcM6cMikZ㍽cfߥ nְ#Yq{gh+O-M?)P-M-OY~ҼJk8 h?%sr+C'ҟL,<#+ ۵_K薹nI7ͼ[9ؘ/ik.3;ˠ2s/nSŏ_Ơُ2$#IfiJg1L@3;ݫ̮_>Szn=b#_GfӆvmjoiL9kw&g֓8x&aLUM08**b/ZW/+ 4hÁc@%ɢɲW$ [B 9O]cX {xݖ1M,{;f/(}v6TtA7 ]g ece]SRX@j<\qhĢcW.a`9jݕN/Ť0AC^`BuP! ABy1$N ISI(`ZjKv%<_@6LP @d 0F<xW0/h 5< p"׽d~abr tL_gL%(E# 7A1'!WP# թb#|W ͂*76׉ ݆ۏ X)H @01!|?7"[yfĕdɖ_ܝ__ A`y@ 9AH |KD2,ވ 5z`   ! 6BNӅ`J!ڠJ` raVbY!,-=-Uߌ ӕꡆaH GjTIbMɡ .I5"hZU,YUZa4]}Zaa"q%P^hyx}&Eb}aB{W}ٗY{ڀB ,pE}A9Bߡ"*"~[mzɑbcczaDYMY]Ym@Hz @l ^?AF\cf6 .߷y!"yICDNEHA|@ZF=GNC-\?C DHA!a7ظX8*8[?9!: $RI\¥dÙRd?d?c@$LdL֜qN-AeFQ]|a֙\VT^3>c445b$W^->p^=dYbb`J%A.FcOPYg Z&aB 12e+x_tau %D&A_gkk&5q( MNpUd !rrs!x&Х`w$bfA},J|fptgG}gBjhu:iF'2h[gDփ !s6l~Z肶XhVIa, mx&aaouM~kkn(N! >!8VI1bpZfyiF&^[ـH)\)] 0@ٝ!(%-)a,oDizpX%efz6(0]4R#`@~@4A `D֩i>))(ƓơV py夣j)OeP:Jjz#>&UDD | Qnkg* *@Қ 7Mx6VxrpYdc~E&+k瘮(G$KìڭeF̕hQ,@HljOѽЋN0TXޠM>#d%,QJfA%S2HRkAXهI %Pk:-ƺиH΋'a-maj|-t֤bXlnЙ͢ڪee/[> \ce90`Biة#(PŁ"nrJ"j`H7̪f-ȾC a 1u~Ie 2Hh^g^J)Re`bEc gEFRõ,D N FEkmerDRf f'2vqoA o\.CHouO;|^/ha>gh^c6岋4/ƈ苉KnHLn؋9Knh.υ /Ef{nuƲF646J1G*a00 #6l:g;c.ao~7|s9@H|I*؇-l#(Ȩ 11ش1XB(,̂~"A豄R!iF r!{!'r(%R@8@LH'B[Fh@H2++Y'\ՕC xV?fu@X+<Z DV99h@1A3gs b)@GfA6["}@@X#ę Ck3@=*abH#Cyrqhh|#F G4S YsGgjXqF Y-F@ H|@W(EeX @,(V35ڡZGYPC[Gz2Zݦ歳D h%S)@F\˵=0ru6t @r@( @NN 44=dE<40ÙS[lB-dd FdjszAT< 6d{+j}iq3hCr=i $] zo9!dpXp:4ZKS|YTSŇ@+#Nb@HAhFDe\F?#;_g4{?<Xx=v>k@B|~ @Aq9><]rhfG5 X=p 5Sى Ѐ \g ZS苾30$_%dڣG?`С>pR o , B^YCI%GTeK/aƔ9E|7oƋ gO?@QG&UiSO,WSbƗ 2tHkUv0. ٵɓЦհ6C[oƕ;n]wջo_0Å ,TPMpa n OtIc07k^=۶ܵО:%JԧN,Y4=Ru돰g׾{w?|yѧW;# 4A׿ P , 4dG܋P )<Č20lC`dkA I$B АCٳκ(nN>Qn9>q褃 R!,#LR%l'BFo>3R˥-/ S1,3DS (|d9(yđ:;$F"a"݄S; 3=GKf̑9VlM0TM9OA UQI-SQMUU7)i[qU]y_)\UO;MNcO=6YJea-RD9% !,9hYlc1@:xhͧ1&6(kX-8%ID9D*_tyrJ2[ԙʂM; !E-\hOY0 !,BNYlc*\ȰÇKDȱG <ƣɓ?' (cʌ'PVdD8=w S$СH#4ӅK>:0jSNbukVR"*vhA A;'0!F2aYoLZpoxʂ;LYNÐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸s_ޟ qċ/o.:ӯ'>:E{<|c_>O3!,!Ol(^*\X=UŅxhŏ؄  ܸ6)%LFҴys˙5{2SOE&$T?b5]1J6Hb c[ÊMcOvA=*05+w@%(5]5M5[c} ןZtޝKW` Pg?+W 2~ħKA|/p#7/K5T !:,r;H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ Jѣ8'(]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˵۷pʝKݻx˷߿ LÈ+^̸ǀIL˘3k̹ϠCMӨS^ͺװc˞!۸sͻ 6ȓ+_μiNسk߾|:ËOqӫ_Ͼ˟OϿh 6 >(Vh^f"a (∪}H(*4ȟ6@ Bi䑽L6YANF)唬)IX:ie\v ^)&`i"lRfpiri'~tީ矀gJݠ&P.5 餔Fhfڥvg~*ꨔJ꩞ꪕ꫎ 묅J|ڊul c K\S*L: EJKp yNN_>o暿y~>nzۮ>m?K{ގ>l |O?kʿ|>O?j}n}ߪ/~~u eO?߿vq&ޭط2p|"(AQ  >CXs&(D;"y%NX)RyVEq"'1^fؽ5|n|&G_#u=~ -=P<$ @%-z$$S$IS%3&LrWd6)J:%*;UIQ+cYY2Ler˒ѱ%0da^I2e2e|)M)RU&6mn"8q<өN5m|'<(yj'>Y}:*Pw<(BЅޓ 3#zRԑż2QM(H#ґ& QIS4k(}\*Sд(Nӝ>Pꠛ8F=oT0y*Tq#թJgVMNr5AX*֐9+ZSֵnOXZU4v+hWP͵+`7#f b[2v2}?"X2v  vU B0hc %mi%ԪvQka+%mmq$ێo$ߊq{$㾖Br.t$FWϵn UlWG=ҫ^n^ҷ}k˾o~H<0/9.xD}J, 7 /E ϴnC\#>P/"~1Q,˲6~sK x)qv,!"2|%CN*dSSee6Q21f|,y>k~s,Ĺv3s=Y~O-h@:hh>Fn[&MIц+MKX4iЁZӣ4=7Qsԝ;5\]iXkNSuWfZ՟SMj^sYp.vYkbrA~ gSn 6ja]\WVs{uMn`VBzS-ηoDoH)+%Sq8XMX8 q>xuG^8(OW0gN8y56 =ЇNHOҗ;P_t5pAYz`6|`ձu{$O=q@<xxϻO‹=z;:ׂ/| ϼ7Oz7Ow>;9>ADo}ۮϽwO;\(K.>(`{[>gA" !<,9^ H*\ȰÇ! ,9^H*\ȰÇ!,5 H 3oa"JlE+b̸񢿌?(1Ä(S:[re@!X,hH*\ȰÇ#JHŋ3jȱǏ CПɓ'I\ɲ˗0cʜIM(sD͟@ J4&)*ȡ(=EH*S.c5Mdx;$]ez7OZ(z͕=֞ZyP`$O{ɕ!p!{xnpUאЊ8oDbricDِ)YGA٦X(V%c-f{)AYm`]t'x @sVHeB :Z!F)L*O`'A,ha i{xPX.Z eBLF)`jW5BzFj)4~Uh[6Av6i -Wy.({;W%kY ?#"CN0-F5O(VapC6C:C^ڞ_;_Zq&в5W%!ZFZO_YԕL-Tm .gi06‚cra"eDaN0saN`4\ {c I0@y\$Cj-_Ex,v&rs'g#\,rV !tHGN)NiarGjq"qcҶBA"(GA.!TIJZ򒘤cNz (GIRL*WV򕰌,gIZ̥.w^r 0IbL2f"Ό4IjZ̦6w mz 8IrJL:vD'm.+zζ.q;RE/xݳ"׺M.y^٦7-ex{ݞw-my2WԬj\RW /JB6#L`Xm0ŋ–-1v)^Xͯs/;8/  ږ0*-l;]p}w<&GBNO^,T)e"̝3c%?9>\c-y1| #53 $k,h443}n`>W9~MiQӟWo;}$\ְ(udU^PTV=jqc^\zU$:>~L+SPz0^OvLӵNez=h'v[]ii0۽^yۋIГO;񐏼[wY{GOқ W/cnYOs5߻W跏;=g{^z;ə)ؗ/?>;K d [rD/7.dZ?xH~8X hXX G@P؁Hx 0 x0.͐ +"x 482sG7(X4r 0XJȄ MH-Ȃ45Ѕ !K \q] A^U uXYqwX{HFA.da!hMHg(0  X AE!  jv؆H؊u|(x~᷈ /؈N苞Ȃ]h.X DUmԃ߷{8w~8 X(8qX)\؂](fQBq؁hԘ荰8(8ixP;X =( yh2tQ6I`XKÉpX8 Oْ(N3XLȅؕ(&GI 9% هs4ě6@Q0Ȕy_36A|wWU7Ov7夝n7}sĝ[)N9Ky[|g}5t?%MEDOgtxiIMwN5qgctzSu tʡ씠SzapcjRKFVކWN:E5F[fo,ڢ*4:fK j\gqBSDK1JH*M"ʞN7{:p֣YU[{Ǥbk$8 w*'n&M!gFMJN 9:]XjqFAJ5$YJԟpz}6)&]:cMdeī :|ZJ^tCӤ|g|iǬY@:|:Ԛ.d*hJt1n&nL*KIJSEjPN TKm.V^Ɗ Ivgԥ] IEW `cjRb kvE7t}fﵢq@*e!Y$V{6:G*s-KJK[I%[Tki6{ PʨNj:wv!+_njh\;LBJ*}{,cSM ;Jw ?:i" |;:!I{W#mڸe^s+*Ŵ亣Ddiw+k3[qo+ie[J[rKgмʼ;;)Oۭ+Z໫⻝ F+KK׾uNۿU4/lL̿ٽ4Wk k5`ً4¸ [b[l'gܰD5|8N`[Ƌ+jƮ .U $P\N2Y[toS@Œ^,O6̿bIϻ+knSigFY#Y<šx|hLa#ƞƽUKN:նv?Jqt{v["h wilJXq\ŎulowkY <LTtő;ƂJk/j=a~ʧtJ ˿>̱p[p mNͣ{ko*ͣDa ^M&ܲĽ|lO춶lKw}z gJZ]'WQJw\]V-K;!}M(Ťur k)ݝ*%¦ѭۯů$r)+y=Kd2|Ӎ|Ok;i$Em܌M]c;lzR 8 P/ո[Ֆì@Ā\m6e_ll\\qS.մrҩzֻgy4o ̀^ :ءZ˨k<'lǐLlzږlLס8Oۜ4ʗ^>kÝˮy]-t̾ng8L$ m,~ܦٺRg^]mH~pЙ-[ږμp lnZ4:o>. ]'n%[-/@S!~U-n7N]OB޺ =dA_JL Z7H/ɮ^}bTm}QNjt?)^^NVFE>܆_ĸ~Վ }/᭏/Nnr^+oO=l+ߝ/xI>|_gL!H \Çk$9pb)&HG A$YȍSgƥK#`8M9uOA(Q>&e qiSY|i&&H mΤWaŎ%ٟfUvԪV쪕+AyF{_l;< ' *bƑ%O4|;*tjUb).sν#kG Q 3+$,ɝV$m$IJDm:+$#{ɮ#w,S蚄oA%,rA(T΅#@\h0@e\FߜS7! !Ü)ͰRH9S@U!IЄt˿DF,uQrttGtRQ?ecqKbr ͖\2ao}GdPZ"\G_E܄M7dY *Xr)ܖG;v_82oXtN\lؤE{/6a;*b&p 1,E!RR2c%s}$ ŦNg~d7ld%B)ADd'qрj\"DCzr3\& YJ7"2PtH < +27VP0],bnֈ(S(7\[H쒗1WuD$&]'Lb8KPtW<$"a_[3Ži\&TaMLP;ٸp=[^0xteySfl_ Nb@/A|ݰTE%-ޓcUE^7>OH[SCgTT/]L#(3T^p&#/d^))&k0~ԦNY2Sa!8UWwUptgzXx&Zlz5!-C:o&"N.qd6 K_Mg %0$dG "Lh\cY'&-UmL{˞w&=FmVD]nֹc[umw3;l^l-Z},~E_ | 8[pFs3 yϧ/[P"wfp9N֑ngKSؤl8;-o.;cI8uJ=o??Ju;|A(?}%2}^u57=Ƽ?3fԚωU U~,wXy*{7x.iBXJ| z~![̯zQFRoq=J\} ӏvԋa^?Jc(sE靧$;Yt|hDTls7yN_y=F!@p +$gz{`M#.:1>HxQp37?fs p S ?8+Ļ=h !@Y/K^""75+S2rxdH! 4ރ/ ⮫Jq <8ٿ@KJzsʵ4<|űJ<%]=sJL$C9,T7T;< `bX8ԉ|ӫcKV0[L>FdH'#: ˫ɛuj"B$,iRJkl=G ˩k-izI,k| IN,F:<2z,CL;+N8>ΑR/O[̳NՋαADó+s=w= $4DpBQ QLPLlЄTɿl|×E"ktGEz>|M-5̔(59<Dü6ƮRzA@rRQPS15G7$2ɾ|K+ӕSQ>%?M49=)Tx%8xPBa U$+C=27/ۺ<&9 T?>$95 孻C\[8*v/Խ-.GN,IIp]4SB=EcHRRUuك:25Vv\?8UdD僽67jxA.B~jh=cgNkm=.V}ӷز^E8YldtEHjmd-e+M_`> d59mٕg]>'5Ug'=Ni(٩Ff^ef&/Bjd;^ifF}5cpq>0-^жUfatkfDPl<۶nUR9К'XbV3o_,χ`^}Tk`֦mfb}WPH:"eCaWlٞ~p$bCJYբmqbZ\dq-k>'ApjB.:8vc=0"q$G%f@'r0n] oφ\b[ö2 Ke*M_i/' 7q(݂:]pl>aaUVUV m f>^~mVllFlen6f O>\}aE:L#{PUd{T|ǂT(~P*~XDO,|ڗ}ǃTHg}$5n.yA:ϼ9WЃE (Wj:݇8G6TvYHmy!!8OCT|VtEиաIЩHT$IG*x?1 ebyP*IZOVZ3%]zKen&A;>g&m&q9'u$fo}'9(d_:(4:)Zʓ!, ?H? NApB B,(qÊ+NԸ"G; )IKJ$Qȃ0a83"!,W H*\ȰÇ#JHŋ3jȱǏSL' H HqH&[ʜI͛8sɳ*)R 2EXTѥPJJիU:%zXjٳhӪ]1&YGWuݻx[֙@GÈ+ ;^L˘1jLәEyZըc˞Mm h `sMȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihl8śStix|矀*蠄j衈& 6s2 }JJ饀Z馜v駠ꩦ(6jʪ뫴j뭑랮 9+v 6(zuNҙ-dAkKd|[izlо.+K/{giio.EpYТQpV;| |"' i)0$ZV 9{VYͷ\M8ŝ^ 㨧6qߝ KϬFrdNؠ᫧nŋ Nnzyo\3ƃͳ~csso>+z7۾(9i{<X/*MmkV>:J %X+ w &ʂ!DX<ń(L W0 gH8̡wЄHHD.PH*ZO-^l"H2h FJcE9xc GNH)C>RD$L881xF*BCВ̤&7 ELrxD*yPґfă*JV'P/, B2&y"/?Ib!+UB&,yi(Xe&ެ8oR,)R޲ml5QNxRGI:qz3-?8P3M(Jz3m'= {rcA Pvq%.JҒJt(E=I3eERdӠ.ùю@bPWRTQ51y}hӦ/oӝd4VJCTe4\ѡdWXKVW"Hלƪk^WNb4k"՚Ft<(E$aωkt*ӽZlFQ b]*Pj4-WUkF+&BZZ jnXҀ!,f H*\ȰÇ#JHŋ3jȱǏ @ɓ(S\ɲ˗0cʜIs`*UR ( @ JѣH:ĹgʟJJJիX;$2EdKٳhb9SpʝK+qxk߿M@lO+^̸cqD\˘3kL&7yӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihl9śStix|矀*蠄j衈& 6s2 }JJ饀Z馜v駠ꩦ(6j꫰*묩J뭋z멽+fZgQg~BKƜVzgL[r{lIΙmYPiЛ oT z"& yrf$k%3 t ,֭rZGL2f;V1{-ҽ4eLd0is Qkm⌷xwLxHm5֊Ǽy?.sѮtykr1_\xqw^^_ͤb7 K7/}ˊdo觯/o 'L:'AR  * GHz&LaPP, W d9 _?,$ ZEJ݉Y,nߴ$*ؾ4yZSibg]@Rs+טVbm8{N,<,mK]ڶ\}ukɂ  ^м=̫@; Du(z;_ַ!,u H*\ȰÇ#JHŋ3jȱǏ 3V@ȓ(S\ɲ˗0cʜ) U@ '͟@ JѣH3L EϤPJJի*SPgUbKٳhӢLmIpʝKБ)܂\ԫݿ d!SX̘ǐ#KSޏ^N̹7 _#Úͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*iAST:?f馜v駠*ꨤjꩨꪬ꫖b 무֚:*j*+k첰*>kVkf,vr 6kk@.+/Λdl/z l鿚l0;ž6L nƪn;j<&3l–˿ *)WZ.۩A9:\ 42'K 3*4P۴)|E n5D#m5AmWvo0sW2,7XkuG_ƅclxĥbcvܔW.塢L~>Ԝ)Ԣ¥˰چOѭ6NNxhWw)o:Zߧg)ͳͻB_^Ҿo6|zmg.8c,{o:i-ܶlY>.~Cw +M#8`SX4)dg(*Œ.~ ^r5"&9@V8DmT+o; x-*j+59.z` H2hL6[H:jQv#>~ IB$"9GE2|#)JQ eĤ%7Nē #%CIRq< rGMd qDej\JYL-sIH#x/9]V *yYFd*Ƽ*E)GZb&-Mfz`&8ØTTHM9ϙexD;E9/Sq&,gI/+]Z2h8zmc7IJ\G0ЏID(=qːX,)GE:K}>4dhA5ISjShM[:QB)DQJTI^h?ԏ2uiRUT#5p2}i>ӗδ (W%V2pQ*~CI]WRx<W V ]+XȮ/5(?klP5r9(ZU+QQYƶukIjV}+ ޶ A[؍bQ^%hRUmmt],pSv5 [ D= }&xho1sy:eeZ]Tٴln vgu+Z[:E)N{%~iulib]>1cohmgLix,6#T$ y񍇜H"Kӳ2e@!, H*\ȰÇ#JHŋ3jȱǏG@R0ɲ˗0cʜI͛8iV&= 4ѣH*]ʴӧR(QXjʵׯ0TR]˶۷p~LK˷߿q"8Gc=^̸ǎSTi!k̹gE;@ӨS^͐(Y> 0ͺ۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무jS:?+k&6F+Jf۫v{,ކ,k覫Ժ n @+\ ǫmû@R<1~ w7{,mʪ<(l,GkW,s?SKrCOQtH4LpA:,5[u9GuZm[4s۵bO=H7lc89v:uƆU^8^-Z.Dʹ3{j;}x֬'}qÞjx㏿s^5ѤK-zgN7mk<; {6 Ü~$#mr#:0˾7}>#Wg>{X5]xUHY/iqk$ԢJrkS*m6H^z6dW z`=%ZEVu32]MUJЇ&VYM::W 6&)MKVv']jg?! z-jOS=Ŭq-v#-4 }pORQ.wkVMi@;;װwDF\ڏeb:hbWܽk7^%%0k6/s]:UeКP }k]mծU/ G7'qPLcBXM>d STxPiL)+N-2e Sf}ٟgn ˶)m2 0ѐ=dVƯlKNGEL!, H*\ȰÇ#JHŋ3jȱǏ= *) @`?RI͛8sɳ'M)uRϊAQ0zӧPJJ*PU\P\ÊKٳ= @G2x@{JLx˷ɬ`*Eiدǐ#K. bp`ϠCUh 0݌6c˞M3ӥ. #FM ;V@o%6&NسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+S;?,l' 7 Wg<0wl0,$l$.q2l82: Blq@34CG-5POd5U|Zdm][=Kl+PFy5 Y[=6#xE7;:8嬷> G^/lîg~{wz{~zߣWϵ>{kNF=kq+tK;'?_Ku>U,|:þ7ޥ/_ \ů+1y )΄V>z+5 w" "H(Yl X=m`W:0S <~#b H+w|=5P6 G:UQRAdwnG^M(y[Fw5nfC{ZT,|-ǭՙNBfy }`eU^Hz^SPe+dϚyw%hwz6`$陡:C31c=M6'J x5F;~zK7zv(tG/]f9 g?vѯg!1, H*\ȰÇ#JHŋ3jȱǏ@0ȁR|p˗0cʜI͛8sf IѣH*]ʴiE1പիXj&<)C׳hӪ]˶GU $)˷߿~XϑR+^̸c+l zk̹q)jϨS^͚a >ָsͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫N+k,lo 7찼 ?,1Ol_w wq$'jSm`6=ok=P^SX8N8{ W@bwx1PfCGڮwƫ pA ΁#^xUNrVH0~^4'gGD^<)-["Hǟ)ϊk#>R͏"6Z- "{iԼ(叒SSanJz%0Y3RFMYv!D)+9KղfdK.w^ 0IbL2f:\IjZ3Ӽ6mz8Ir,g8h|'<)y̧>Y},'7z̀,.MԡD' jsHrQG?vґeHIR\4HEhxt4h2u*4TyOgJԢSFf*RQ-Ѐ!, H*\ȰÇ#JHŋ3jȱǏ*HQŤ˗0cʜI͛8sY?)\B ΣH*]ʴӧP/7%RLʵׯ`Ê g^ Z*ٷpʝKGX ݿ Lhs#KLYrO-Mw@ϠClU pװc˞ q SxL Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,lUN,G,Wlgw ,$/p('2-,1l8<\s@s(MFL74I?-Su_-Z3Lccmh+uAngg7 kmlO7Ą8 ]nA/ĂO猫wpknਫ=גW.A-ײɷo./N¦#ϱ'?CF/zZ]\?~_.d1rO?˯K_6An}`+(;q~ $hϱz'=yFBץN|L]x>nnKa HyՋt(”ݯt`wXdh@M0d"ph*.VT8 q.f=}/|sch9,}~1<>nFﵐ=D*$8z$By g8҄dLe%WʦٱtZ,ϖ1p̥.ˎteiƙ!d/%̣5ifiI4IjZ̦6nz 8Ir&gv3|<y>~g>Jt<(BЅ:'fDJъZTh6QvM(HYi'5 AHR0i8_*SqNBC4oSz)IkM )>Yb43)mDTZOŪ9S*fW:Ԙ~ 6*ӳUk]JjMutj<Ԧt*k]zdtTXNЏIDZe̖,e5Ҹf|&aXԢUkb]V%-kgk[6e'ۏf lL1[TesMv\ W-aTֺwz \ᦵ=zW0,ЪVl/u7zbm>[j5lIp8'irt]?vpoLa\pk#x5cX̍f냴D^h56ֱ_ maּѹcЇYΜfU|oo_mTUZΫ-.]rʋaQߖǥ&jK_eSM5^Yt}Ayzui;!, H*\ȰÇ#JHŋ3jȱǏL P E(S\ɲ˗0cʜIM<DAJѣH*]JӧR8ЪXjʵ׊)t rӫ\SP׷pʝK#tYEhd La|l R$hM˘3kd)𵯿6^ͺ'=@}2[ktͻLG` 2Nn(0/УKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,swS=Ew;_/}` -_jns,o{ L_-p (9 L/la 'H #^'B0gg$^m9|\B%P\EN._(2f ]Ԩ̙pe|༨Q\ r::y"HF3ih<똗"b{b"hEf/{c!(C+V hnR\*Dx`}8DIno wY\҅%/HI.\2au&,7')bn޴e9@L:Gtn$9 IJP !g<:xvӟ?\e_L3ЂMBІ:D'JъZͨF7:Pp iA=*Ғ>&MDQҖ0Lg S)N?ӝ> PJԢFMjGQ2բNͩHj jUԮz#kI'!Tࡠd5IA: zàm}@'яʵ/q5(VRU}4Vu~jVUQ%T xe1{W֡xD*:Ѣլx8k`EKZhV,evVP4oyPƭlܟ6עPm?&їV C3{Pl*+-u]" .|K_^]nI:_k0D[~4=pvC݂6 d-y9`W%p**Qe{:b6ōG}+/^(]iu y}L mC&W0[ĒEqLYX3?c #T~p_'` Wro 1KY.D/ˀ^[Ld Zbv3z[}\$|_ŖMuԐ4zSTcvu9$zūkn8-kKWgڸN(dʚopj{U+:܌m3+*Wz{+ +UK洵Mb#+8M-p+b7"D/=V\!, H*\ȰÇ#JHŋ3jȱǏ SL "IL!P@0cʜI͛8sɳ)JD GB ZϧPJJիX%HցK]:JٳhӪ]{4?U0RLDz˷߿WlWǐ#K0\s/nLϠCK&L WͺװyNA_ cv#L8OkȅKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmtS$=?J7PG-TWmXg\w`-J3Mhݴj}5nǭ5rmxxd قw'7>8G^aCNזvI6Ae޹藗n靣d<:֜k}ۮO۪gӱWդ/ʹ@{>G/OOS`=i~;oST9P<ɓ~3<Փ[O&Pjv-jƾIl\>o !DNS;0j.Jot8_ ?Cx' Hg>n|݃p: aWŵA`!vA/y d!"!T"_w>:BR=z:,CCAІȣF9s$$xQi\YAQ&yL%'Ir]tZ,Yqm8\l"D03=֜!, H*\ȰÇ#JHŋ3jȱǏSL' H Hq˗0cʜI͛8s֬"EI'ST9ΣH*]ʴӧP+9 Fjʵׯ`öjbӪ]˶۷MR:V$ܻxܲ/LÈMĐ#KL⪍1W̹ S @KG^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmtBS$=?J7PG-TWmXg\w`-J3Mhݴj}5nǭ5rmxxd قw'7>8G^aCNזvK@k 9藗n铣d<:֜k}ۮ쮷Yton袗4۞+$"$xB:^uãіūP_LX?7!"PH^ K:`2xAΌ (GJ |b,&Fg븨Lp|$(#[c1YV&s,'GК[PmajY*&vSr|:Oeȓ<Ϻd\@!.ge}.ûMa;je2)dX<EOj%5tc*׽5Eh?җ6s;JztKlF7{@ǡC:| li~M{.67tfnU~1S N-p[!,  H*\ȰÇ#JHŋ3jȱǏ @*(0e,cʜI͛8ss` $[K˞_5ӧPJJ*ʠ1`ZUV]ÊKٳS6PfTيݻx9$~W,PÈ+^%a5l6ۣ3k̹IL@ѥI{^ͺk% 2%]ͻ ұ.o^μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx|OOn'7G.Wngyoy;>zG~zꬷ.ny{_.o{ss=7_A?~}훎~k?xÏG ΀[82pqo^A= A)w{ HY[t=~h?O` W&ꖸQщLL ݰS'|e4Q3+8rώo4 )|}*b1h$x2NRt$$xG9p4] HAM _VN`leII|NI$$%7>S3pT)AX&.HGqռ]1<& ;InjћNgJ󝡄.Y8zFf%Ot$@BP4բE;QD'N~ =ͧQ:e@'JҒ&&Q> ,MLgԦé\P$vu!]PiJT鴤G]Rs귦:PTJժZXͪVՏ%_ XJֲhMZֶp\J׺U^ׯ浯U_KضMb:v}d굲%,f3ٹ hGKڔh,jתƵ+l1Z a=Ijgںlp; i_-q;\<@cipQ\Umt v(~LvY;׼=YS*.a{oj{mwf m%Kژp gc;۾rY؟FnObfq/o=6 }njju/ ZI涷K+۷^x%9p tPgms+X/$=W񖻜Iwٚko^p,Bx OlE!, H*\ȰÇ#JHŋ3jȱǏG@R0ɲ˗0cʜI͛8iV&= 4ѣH*]ʴӧR(QXjʵׯ0TR]˶۷p~LK˷߿q"8Gc=^̸ǎSTi!k̹gE;@ӨS^͐(Y> 0ͺ۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx|߀.ncS$>?7G.Wngw砇.3N騧޸骷~9Ǯ9n{'@3G8W_SzT;_췿w~Ϗ9z8*g/|'@9 |8 N\uG NnWr4`Nxt3 qk! A(֎>L 7ٹ/0.T *Є@Jn[ K%CXA!6.(t/>5:n$g8p_C2p}!=0vC pw:Jr s^H@~tVR"Ou2KO$0GWR, MJ߹R\1BH%6 x7ӎM$f4jb1\ 3HBB2R/'JS$7m)Ӛd'HOkz a ˉ1 2Q#vrd_E <:ҏ&LWjKntLwS?KqZSvAzTO^TgXXͪVծz` XJֲhMZVZp\:׺v+Y׾ `Xp5,b굱d'K:,]5VrM\C;\u UiQֺWm]'!T2-XI;IУW-p2~wUC*1alEhXyZ^Ūx5w3=oWS"-\0T 7o}_趸D}ޭHZԲVwK;aH]nSa m͊`c&v^/&.Z+-vmmM/^-n?! zDЄ6jH{FMf#/z7bzn1WZUXhKWA=+}KG94|j9rNvg:Y٬v]ǐqMtH򎫠\/SYm',oyKv3 }kC/74_1s.pl^wɇNϞŽѧKڑyH WWwmSNtK !,) H*\ȰÇ#JHŋ3jȱǏ= *) @`H-cʜI͛8ssULşA]ʴӧPJThKSVUׯ`ÊP̢U ݻxUݏ&2-پ*^̸\Qv`%?̹M1#Ŋ װ7أ`¥ήB 7* vxУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx|߀.n'7G.Wngw砇.褗n騧ꬷ.>OO/o'7G/}Oo^}}'}o觯o}O^6uG D{q H ZP o;:8Bޭ%<;~0cB/@2@ (=0wFBWCЄ1HDqC`A 8AD9b/ްza X6{M|c麗;:/ƳB9"wX"ѸEь9L$<ЇL'II*VxO4b&o== ᑂ Z2S~/f.w;^/T"GiNngc'dt$Fi!.JMӗ))%YJoV24d4eVs^6Jo3?k )@ 6!:OHvSe!IЎfptf gL)OL2'yEwBhȘbSFўRn\!p "=3W(CRՄ(DDuxbT>ͪVԭfq]*IF VՎ ҔDHZֺYū@)毀 `KMb:d'+XRlR, mbA+ҚMjW{ZҲu-l)+zc3X RKⶸ=.rjYI6[Tͥrv׳F* 74&VkkkT73%H_]^׽0a+¦"UC?r/U0&`x_]N70g+b~=qdbߗVi1y x1`A*cAqlawֱhc"o]_8)hM,cUn2)+̬1~4A~s+*IFs,]0sqYb$/sY,h@]W5S=rLo:1&\Vz&u iGˍ0ADr -AOס=';ϡ1A=Y__iɥ5 h'1ǝYaK΢A7d}8yhnj+Ŋnuh)W71&knGRqFF3\j@flpqdM.O\~gن@ǻqަW=fƁa?HOmt [ꝭ:ksWS[{}ht%߶]!,G H*\ȰÇ#JHŋ3jȱǏ|rR\ɲ˗0cʜI͛3TAeIv"ѣH*]ʴS:bӫXjʵז:2E*C]˶۷p=7 \U 4߿ |4% ǐ#Ko(b̹ϠmveJ ^ͺ lpUظsͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx|߀.n'7G.Wngw砇.褗n騧OO.n/o|Þ||>}gw/Ꮿ|S~//~#?|k]G yCq5`%3AvۗAQw46h={^H@0dx ΆS!op(; A$0K4)щGd!"eٕ!8٩Q1aL`)>~s܏f9vnry\T#o泟Kf0X_NqK_._ƿV4ckJrt5-YCҠN< jQ#ZDC?8Yի&cmhwgκǖnke`_2׿53]\vGφl}Xyre]nym \p}h5ےv)7:3玘8Io9m-iuY ofqgy%s)σZ⡽Eϑ^k/|P{.u qR{}Xzsvj],krZ훆;f\K7 !,V H*\ȰÇ#JHŋ3jȱǏL P E(S*cʜI͛8s)0S"HbKE*]ʴӧPbBJ'2 ׯ`Ê2*SQb5,~KݻxkB@.ʡU Hy+^̸1YU6 (ж`츳ϠC/p ) @RE˞M'=@H}2b Olȵ,@cKiV@yسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx|߀.n'7G.Wngw砇.褗n騧ꬷ.n/o'7G/Wogw/o觯9So HL :c '? R 7z 5(*&l Sxds!w@P>$ O!Ə DbiC&ωbH<E]] F}1EA5QV<HG9Q[|_=>ycH@o7Zp\@*HBZ򑈜$1yDI&w  )~`(HF~4cexIHOl%A?EL")K] |2SHeN!z|4*Nt)'2p09N8e/iCr2I6s}4yHk լ4YRK7LuӋ\(/'r~tb;4v]cH:EnF&aE)Qqb4- cq-E'? ޳,MzR<0ZLeR۸ԥ&4Sz_A7VNQ'(ZUTv&ӝLl(UMuաIK *5a k?2Q5;ȏ2We*a'K*vEeǘIw 7ZдT,\j "ħlG8[4~; L`J pKMr:Ѝt[Z-onUwKMz;}u+_ҷͯ~_޷]gw=q ] 'L ܝ4Rj$ߎĺD?V*!DbtxF.qr*ME*\b)S9$Rbo[ƃu bVZnjd Afnq uwkg>ͼE2pL6CЈocq|7)pyѾݰ5}a@>uNv,W Ը5u}\Nv4]LU.ӟ5a\;گs]VZֳxj^>FwqU}HaMJw]V5լ{#ж>]T?yvMq^[mm]d; uET<nkOڎp.x+D6ǩ+7EK>塃ZUNr ye>=ִ؛sP98.辘g]+}Upm]9Ϳz|kU{_w {}c˾h<4gɯ.b8ޞG1hk=ߗ\򰏽)/֟KzO]=`OGuɋ;Ư};}!,*V H*\ȰÇ#JHŋ3jq#RtcHH\ɲ˗0cʜ)3E*)y&NS XѣH*]ʴ)Ûv:uu'SjʵW7O~=k EǪ]˶[8'w *˷߿>;*^̸) y>̹g- MP*~^ͺ5k5]ͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TR7]YeXC_eCa49\YApNԥAe.D{Y`}y}F )n٨J旗ɦ k T'DXbE]^i)el^(y%}ϫ:*lR⚟ DX%Zi^N}FZ3jD:첱*+Cn:j~{k *1ﰚfjiØ\&\,jFbK<{<@q[s9,4_Ɖn˰R&2E4F^:f7M;lp m3]+dsUtv m.DϋEk6ؐ/wj-RAҦP9k7SUڄ~LSnQO~q|t䪃c!g_>;#UkCO0;^zJ+Ij厧4?O;9=~[!Τ@2%-s@"26v-x+R Jn W(s!`>VyĴ@І%Hĭ/!ejX}KZ(ēPZp=1r ċnTSe4jktJ.1 gg,#~ǙONHqO,dL0":/9W#׾@J:4(~ #Vt K |z2e-rTTdL ܶ, LYʐ%ss+]s- eL( lQt+3t٘c1da'gJ +vS#˜, sU@{n$ _o yZӡbA/Ѕi;EI5hE*:)=ѧ%jS" 2 ^NwJ#[9@ PIV@EMQ7C1pO=Q. ! -WiT!fILVq̤7ԍʪVH@2lUCEVLac]׊pi&mf‚iT$tU3^Su,%)z^f*Np,MjJmC*Qǵ ݨm3˒J-\W Ť mFH1tYZ*w&_ܿh 3GK[VsF\W &>t.njb-<9^!5$߹׽. Kf) ҐU˚U-}MCzQ|)u;^wj5ũM6S0ΎO3J*RSNaćne1hq-goD+∽p#]kW"w:1 /+Q7e!yԦ3JFb1&o)O;'EҘ*3N{:M-9S%<,W mhq :}+{׻eB\Sb6ųm 9Y[́3QT˻JXrY[d%,}.G8.GxC-r[t="pZ^ﵗo;7V_ 熨mb\[3f=ܖn\Hko >|S_p£[O6qSk|yF|1r{b-b9eA)bxy S"X&x^s(t7zC09T!tuwZdkvJDuL7tnYxIfuYVJw@}IX{'ZET%vo&UGjG]jpFքGwHHV gyhHVMTHdי*ڢ. SN:[KiU yrjCqD4%U6x{Ȗ 9D7Rt9z>wm&n6I}WjvO'h,tyodz.y{8} q`m ě<5 eȨhXIxJN0E&Zוɉr9*%S8zKeN-r9Z i>i5G(V !EjGE W(W#xʒiS*yUb#fikȩrʉS}Iڸ.ljQ;q۹@ [{kVj>'t!! 00S7Wc뺝++{ڭYCu;[Z媃6f+D嫼{+˒I1̺۽{k\;{UPB !,2FV H*\ȰÇ#JHŋ3jQ t 1H,䃕0cʜI͛8s_:IV2hşC!4ʴӧPJS Щ"X5]ÊKY P:*) (-˷_\p볰aCKǐL1f'#ϠWlK?rͺP Yv_`Wͻ_P.~J8ͼУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tքECXgAz~YcdThPgaPᨢM1HJg* )@':_Nii1ť6EШ*$觢kiԫ1d)}>*lA*t&/}).B:۝ ,һzkWq7[-ȭ1<+ ,Q;3c^ Mlڶi'ĭ.o75AS llB,q_G4cۛ-SX1oFY]07h֓kFǽ-8_$i·OkG.秶dW.g˹R#m27֦+PI:/Cf':V?qxI?^P;t{͒^|XP4Wl3Ϗ|7r634w|5~G|;?Tchlq{{Ⱥ1%g)f#@,n^K7J(L ī0 ?p^r! !RCQv͍JzC!κa=yMτWJh£5&"#Ϫ%3H1\BxpWL˜w=QlgxQb1jTŅQplcIH!UH#(Xʋw"+G1_YˑmLЌ4wFZN̦6-JmsJ]MʼnqqxY)rz4'DMwN`zg3xNDJH=ӰmMs)< j6YT @FF钓Owfԣg;iC!ԠBhғnTt /}2)_&PDZSZX_XRjhA2JvիbZ5"dQnqhE"1y)JƕTYTXQ G\GaZvzD-;fum+E+>$&)5ش5Rdpd#)/ʎݯ&c]8Y:O 0wtvAzgm- *.[TL'6RҘδUzaMWX2)r6һzM_+v&bC2d揭q.Y"aC!Nmk_mNO2٨=?Me1{z=hvV~鋷7ƞθ{ arˉܐ[WOUvNJg}iee)?s9咦k' |H9={Kg?swOi `.'4c>4]dn/W$K8-ԝun3R5ZLnUH^3yDzU{۞chUxYd:ܬwe#? [ItrȀ~m(݋{\Z~Xe}:'|o^p]wQq9o~Uc~4qWqzjW&#w*,%ׂBt`i/Jpj:#TIG`Ko%X'bvwt[CgvwUcuL]YFcG/4'edFrva*UCg87Uc}U@Zwikŵ2'k&xcą6x=_A̳gug3sexhPOMvY0`08"W#Ҋ{&[l R|i(s:-}q(qH߆~VY}(5~Qq<~'}OxxRl *cVEY|A ەgX-X@pxxU LiscDY)oNv_EFxrt#щYŅc'|JVR%C[S8uX5^ Xׁwq#5Xi ڠԁ:a$YIfP Z;Œ$J5!wAc8it(M>9\17RV)D9Fa ˆ,r14yXd(xScyCS|{hcT(=Dw$m ĵi36/*EjRIx245]iGx>WeO;4:ytlGv:zQ ۢQ{{6!J fiKjJY'yժoiR['84ޑ̊EٖnG "nrª빗#6jjCMbGpJ#4zō yGwDd+:{k's )bHzN艒Gn:Y [6Pw7icu {Wt]1ۥ4Ezg땤uU4Q++y:秳6c.JBXiGu'HKfFfY=rDknʖUGs:gZSaæq/{Z17v:npITzt dꛏZV԰;/B{꧙؀Hi|š*{ZVۦ3KiE[U(fTPÛlXUFgӇ噝m L{BiJh[s)ˣZ㵣M h+Տ۳уi%yulU L [x j 5Q%I~J$XQ%آ'h5ڄ3Gvg1jk'Pקdz()/[f\dGmf 46'\{Hr`?vg3^sk7rzF+yn۹؄nぁ:D|y<kt|x̘ǐA,{!ȃ 6 Ȋ<ɒ\>A*CA! lʨL<ɏȩ0ɘDs?'LHʿClmAQ,ʓp˓>Fb,˺ Q̊a1 |,|^ƼČR!Юl\<|yV1,_<@]t}AyѓgQ!}#- ˀ-]=, OEьHp=8}}X ^m'Țeԕ @ͧlr-[-s!,ZV H*\ȰÇ#JHŋ3jhJ p)IH\ɲ˗0cʜ1LU@ ͟@ JFFU>H3ӧPJMN|1֯`Ê[U&d%0MlʝK7ՁDԧ޿ H୿SXxǐMߦ3kL*[6ɔӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8X@ģ*@&7YБJ$Ag`DܔK>eAdPc_#a$dVڶ@k*@]z٣aYu҉f&dS)Йxs򉛟 ?S;I'_AЛaaT&j%Aejf:&:םyflL>.F+w:fm}O6Zз .lgaPᮺP+лRS&/A.2}&#,*$B:SGLYO' gl`(쏥l6Szp i=WrDodL3^_Q;rUs[;0[{u]akCh&ݰL]c tMQ[xր78yWn9[#mj̜F.}py聉-i? +l:C[:P*ʾjԬ.j;s)/KiRϖnNAo/X'Ի#:T^dXkT:%ed!+]ߠT@Z٩V1zqĦy 옖6§ /`8 *_fT wĒ)qcHXXmO#G6,.m?4J&?1amі;=+o}sbӢH)y.@&jHӚ߸6F2e Dw"G2b,6cQ w<,! 8-m"H_zdT4KfH:&22{pb BCP""ĸ6JR&8{NL2c9".ЌgBifQص?镀6_@.v3qjLyJ,NՊxsgKW?r;l%(p{>wPrTCf@%JP T}E_Q5rOѳѐ+ڛF#VG]~qLt(OJThHMRB.. LB:a6x-JHC8d+cI|-f*'B\kC>.J~JX 1#տ"iNc9.i+ [ZDbj8 C2hU+g86n1mYExIfņM=HY2ƽS;ʁ Df}\rXln9L¹pTwKnMz׻qql˸2My/}c*SQ3hN9*7:;< o40O'|Gn5 DQiP; s'~jy% @I-0[ w,vק6dwP7OY7Dplj\}ZMER\e*IbeVn-[&X4߼jN'.daQi6'UB863jhC6. $d:D:r+Lދll[)m'ܪ3~KO'fxn/[nGekUKfeЎ"zMj[sԺvlmr ;M *39~L_~B7ntq:X0+Xwwx,.f) rsFUY+rAۮIlM=(Ozr+4+埅ُpjnqSf : ^=t+jg6loކo'.ddB?}DE4B|G1"Eժ'-+ߊ(l Z{q&=VSzD8=ne6 d;?lG.%2׾BzEkKloæt]m7wk6>ݖiӾwOTn^367E>؃(T oÕGlW\+lf0W>;ŔT/H֞`gxl/Nܧ[w+Fq'c63G)gT'}җcvr Gh"73v0rr K,Ael1m5e]F:׀gVzcbzRemSGSbj=ue\G_g6u5xBf&2Y7Yw^K6RbUS>1ohw[vmKypb XUt['bFlyS3y5]YԆwFxݴk}:'\W6C(JuȀ,odœRš gwh;dk?7XdYgcJ*JeuY :=ڣXw*4 PE4֥z{Llق&Wz*,.+e&11'Q8;UА xY;˳6kG9}H_Lk7KҐ }_Y[7;& 9dCSik˶zQKƨ݈\۷]!+ ayj[_ѩ+~:R=>ảKxA!,ZV H*\ȰÇ#JHŋ3jhG8#(S\ɲ˗0cVB+=Yϟ@ JT$MjSӧPJg T%z@f֯`Êk思d'fڷp%:3sC޿ 8εyy;ǀ&ś-Rː3kk,k"d*zә*l?rY蛾^ێdqS⦻,}fBT*r põ[dARe&,!tkCm;EQ\?!\ʈ<*A0C%@6eF[JiPخTC|4IҦ*AQSU#tA3sʹA:ЮfU#\Vnqc+U3xMg=ع'S88ʕg7V1mw\[4}^&ewRYoW;~:`:$&#dyC^n[QP }=C*GL}Z ~=߾ѫ+q翕~Iͺ7.oNr)dxzVB|80!bgqR 僥$jcž!.|5xͫIC[DM6%ĊTlwǻ,a_2lы_[TCi-k7[ֶvF4DhJH"3 gJ51O4[ g6%mO2m $YGH&D27F:moP@6c, &.Ol8C,LfY[q2,if:53Ijf@j nHԦSh=iv!ro$'K`^Rd$~|'J)ßHYxO`/4@EG-B5-D'EfNv 'IUBPnњR"Tb!9SՓ!:(C&C QaH=*lzHf.[#-w/P꩒.] fmZJUxͫ^Sa:}_u 4lFsIBfX1k,)㈸_q.{vٱThh;]QrjQNa2ekv+ґj-ZueZ*VerٳRpT,B xMwzv g{%BRoéFpC+i|)R}YRZ?6.%~J!عSC;RVt}nCt\Եe tJ0P+ ^ YIKgC‒Ű}Sr:UApػc[zjQޯ>Dk.'`׌'p3K+M9v0>ͺmX {[9ږnGro!l7tihK#:k^4B[NRa>gMjϞ t9aR9>_4Mb[[Ʈ/9֋󐙂ꖱ){0PB8΄uDhF\uuO&JGy.AhCxzvX&6Hbh[Zkŕw4zx&yf-8~.*axW5a7wukkjV\X;DbWhiuIOibszivŅuzzC1G؉B{D7.=|PFlÇDUmwmm[}SSn8FGdWpcE<=&&{d]kyvk5e>uJW2't Wao(O-ua$HrgcdKvP=Jg5$WM\*eͷg2'e5sh`8'8~7䈿P_&tglƧt_h 9#A$Yc&9hIyVXh(qx^m2uvXSnjz(hB],9XFp#l(y5yz!B}\wIy(hP,xIM xfwדJo31iHzLZ؆fzI"~RR F(֊ibc|R;n)@XeؘηS&F}~c%|c\sxwV7 )abbIHDzFu42FXȍ -qXFD,Ē(T[Ipb&hsD} *'Ѓ^7hfnՑ61Y2#(DџƄ>Sgt5JjK8\y-慄#fIVwPyxGi)dh ňyih[K1X_ĢtJJW4l(y̵*knJ>*ukWzGvg5;T }YX"Zj\m mxlŷ)@F3"!x>wF}ii&D`fb%):F2-P}xHFOӀɧ_Xُz:ɕ 1'zA.7-i?CJ*S36D-T6x4x٘كҥz кjgzd-SJ`%]p)wYHZyZ]:uhldh?rH:z2J]fJ[(Y6ʙǓZyYC'溰D_x8xK짉6"K05&{j&Kbh*1kg@P5{1 г:x 0 x@U0 g"$UG,kQgx0 @kXkxе E˳PE*04Eam;=oG1X+xK0 g ~KSK~(S0,cKU+v{y [+ W˸Yp Q+Kp[鵷z۵<{1qU`1[{;b;K0_M:K{n[q[+Р`;bi4˽q{^{D[?е竷Pg~$۽+o ų>a ([k !,*NV H*\ȰÇ#JHŋ3jQc  ұC\9cȑ,cʜI͛8st @;MV!Ϡ!xӧPJJR*pV=fJٳhJZ%P w`U˷߿-eW{!ǐ#md\ϠC94ņțEYװcnX%L V^U6pȼdãKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tixMS ԧ@X`aiSA ?ʐBH2ꏦ)AV=_~"j*骢6HhrHkx++ª_"+aџ鬆9*ʺmk覫=hU (CknI/6ﵨ쫮z0 qv{o$,0,4O)[rIƛB .毬bmvx@2EBJ5lX(0Ctyƥ\pl+pgg%{Pخ޷w~JɇwGϑWngw7dN&ߦWJx_Nͪcn&Uo,6ʋꝴ^tޜ|Z?eMLw/o>KLW?uѝ'ۋ:5FH?۪}6)|߁V Xv`Ks^ɲ-ho>e O%[!U =caЅ_Z>@ H"怅#w?ɯ[WJE\#6́B".8) Q5 axF4h[sBlx̣>CHpZ;]) "}Z-hFe+**T!d&IN"oK(MI9mglWVN=,9KZZĖ2D_f$0Eo#IjZ̦6Aʝ"V}DUϩN.$wt$; :-^,d[;~Cnzp,&RD'JъZ\gB1>5~bC)Z5UdlFG:@ Ρ\噧_wͱy덻 ðsʽ9{hL&ѐ'MJ[E+"WB[}3zzu}}\FjҀe)/Z⯁0@/9ЎM4YWleζ:/zuX 61t b/K^/%|g/6mtj\]g':SSwi~cRڅ7-C|],Eu Zd97Fr8n0[fЇN]x6mgKFnRЭ.ϑ[&F9ʗN9! ֹ^]}&x{4/~PUj82ȅ9\a?"NH~/y'z/MtC =ATa8H z$>$A| ?y>"O&d_Ly/?vߏ >Dž~N2:qwz ,H(a}D(7"{/@Aȃfj↿9!a! :IxjtWH=(x4V胉8wF%${x`x!J}IGx<'ՁxWUc7CX&R88x|t]hwUhȍlXtqhxz!,*V H*\ȰÇ#JHŋ3jQb б* b˗0cʜI͎)R7]B gУH*]ʴS;HT#>Vʵׯ`_4а Sr۷pE:v 9E{ LVayL堈M80SL30P M~@c)%Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v9!X@d&4CgiSfAlI^jVצ)dX&ft&y}&t&Ob蠍@yУk:t a^*vjۧ"D+Iiz馬ZꫬꏱT@Fjf,l=*:*&Î +Җ{Zt'p;,Խ+'eِ + UvƲu,$ǔI"Fw|#?$2):L/<+3\44B"4W:o'9D/=X&aAO沈k]tS='omq9"BZ}[7T9nllТ2na^5 w=x3n7L pkJgpK=Cko쳧Ӷ>\Cu??ZFnu51xo+sȣU+X`w$phڎ (yUj,9g\!zޮǹΎZ-\ APd#<޺*K^ఌx wab.V`H2z|3#續 jt ~g2i+{yU Y}dg;4BLw?+yr ]RHڀK!,jiI!ֽ ! X;َtY eK*)CNp &iFDhSMg.%:W:vhfEic fv{jD<,nє07^&I#+; oy'7zzxg~h|@JPsAЬ*TazP qc G@ y*AK= h%j1bJUʧ g1;8)(:Sִ;A W`P*Ч-UvN!nNהLf`Jֲ5JYȟkCV;2+u%^K5f h\ׇMk,y8Z7rnf"z̏EW:ʳT{*UfHB 2+7ZZ lj)y%_6Ln2&ϡ]+' ܹ5nzL)ZۼM~b͋)}{&I[wzMu=K2aYԋ~Ki|N–q0Cq!*e@jW$M%BU C!j5ݕJ:Q8Ye4adj`*'ñG+Dj8jb$q\S;UIzX:VCU1:VCk]eyk9xOZٛӰi n:sWCϭ|4;ƹ%gVJtk`tۜJ6-%p!ӯ*(,^3E/M;t}9:`&XLlL]o7K-ܺ| zvluy}JAQXy.iuWYv/L/֓OQ1=p*N/0E8)E' %K,c@+?\LbxW5>rك=e{499F+k1\67ЍwWĠ_|2m/طg?{7ChX4{~}4#5#ugh̃IYmhr2~Zj-af}nVsՑ-Yc]̋a |7ǖ|6ޞnԥnSLv޵mvqio%wIsy35v?ʂyq߯.ߍ.o~= G]:J!qxggaU~tagrاuGbfCF`Nw|bser#r%s4VYqdiTVxGt'uc@q8BYeK7xE5OIEu€eF[u"'rR{afx7Rk7VxXPpy|0gw'chh|[oG|!V{ qXniyN>SCyx[fx3oy3[.kUy&Gtlӆ5|]eUy:\5z1yxę~yOou&^חKvvq2 3klH\܄WZ4^.xVʂ?}I^%'zFvK,QۻK۷  :ajkv_ G+A ^*\{ <l, | ;1 I۽݋c !-/|vV`2"{&KX051%*+|\LNL2<5 B,?Ħ?d ֏XY'Ky&Aw& $6jZ@*曈JEudQ襛Y&X,JƩzb2Ai+I@U|d)vj(Msư`I0P,R+n:+oWti 렱bl얦~nNJ;mLfbl(϶)0jB3b lbsbZf%VK3]$KSZ.CU%k6mgSG6UuS=P ]Wgj7M*Z_+b=-7}p~wCdj- 9?MvW} 5k^3.uܛ)7MI/>l8;E^/|v#T ]ߊ|[^vY,~kwyI_UCz3v3;;m˾Beӝll\nu9b`L8YS>v/Z닠_Bj`0(FyhYRƒ-T[|>uP go!49OHň81ʊpY4v-*zZH2BɟШ 5:C陜B8޸,ݹr8-uar1obKIȕe 7گ(3I1wD4't5(gH1lUbmrlֹ2%l?AARL&z7He:DM䨏OA%5)Upz[~S3)MnFt=Jht$!+"@DϟSC:?)tOu’-s2B3P}m/?+bD{_I iRGG`=$iE),k q *J$Y;F/vt{ih7ԈrkSrl]IʬvmR,=׶ź +`dL2U.MW̆jj[hz[f\*_(f}MzIJ^VIAkHzԂmISOA{*"kPd\g(Pgډ %^}'!\) C R6X-%˹Aiz֌ybc>JTy\[{b*:bJI2SXDӉ>.+t d5.Ћ+FVu4'!-^Q%`mƙ%;E:e ޯ}dĦ):Ժ=.f9^.MVq96=n=aF5 %1[45bYizp,KbWҴu1u^N!Mz߆^=iF9m8$NŜK>ٿ&gz®}#SJ9dьbu<i^e!Nt:a/\&뿫**M4@ΣpF)w":X%u,GGO fͮ3:Hf܀KwFuyγC9`?ccgR~^c? '|M5~QWbQ/ =5_ooa vkOZߡfog܏ϡ\lO&wײ#Q3Ͼ'{ ß ߣ̓t[hI`]ז>]g^ rG[r81b$sgVIbh7@41ac(:wsu/suVdeHrIe"g%gvhB"3hئcGUptvBrwagg1wB+LH~^nb8d(Wqx=bpF|z{;$eͷG7YtXrxzj{mUz(y"m'|7H҅ŵz[6[7Pj{,z~H'zjȇ#|-kH՗t`0hUȘ_8~8gv~o(Gp5[xp2&e":h`-)x8-8E@Qt@+l=sqxm^.vHBQS^X0c=F>rp(>,!d+tUoXw(E#&RAEfGwtIb8YTrShvVYEBYFiojxƆEn!ye,yz57jw7[LjBrI{wnXfS`Uw_'؋ŗYa5mNUćLJDb啎@IWؙŌ8E~',El`Egނd'y_i6v6ti$,Ix~RzQPsP'7 9r{7@IFD;h i yS ǂWDIStTXqQeFZ֑ `qa~C")y|1+y}yfŃ_Xh>~x WLTIWN>P%8'xy6\L^14:F ţ|o頝j'vYyx[zil IڕsFږW] b'IƋwRJrL9vzl$bcb}&ꍆ4IL($t}82I4 oc&vOj&:#U1eSql,uZ8-cSQ%@svRuʩx8^:BQS=Hsx~ƕ?T?9STc93u*9-Vt اYS؛Qڭ#ZLZKuS`СS ׯ`Ê?c P՜injܻxݻJ y 7nHh*^̸1BJ*븳Ϡ}8(違Zװ#[ ؠբ,/˱ yC8GspسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|WbB4Ꮲ@thshB82ZSL!Af!iFj*S:?6rJ`z *{줅J[RH:` l * ,ˎKIJ+kc+BBJj6L:Cl IܬnZJo#[j'ǚr*,0Ӭ<@-D j4}X74(Soys"ͫWWin5+ؖ:O ᱽu~Bq͞R=~{V+ủ59.sA9ykt.褗n騧^KlBSmܰyAffjmھy}^|yM&/lҏx _=Q79ߗo觯S7h"2^?cb@V˜r05U5)ډeb(KcÞӂ?Z8BlVZs)f[h@ H"H$$I ! Podaw@rbd6Q+c`y81 jHN L ) GY;41*2P5I0yfm4o?cA>π|[u.jx-?+bW!PHe5IbjuM\{ѱTٌۉ"v؎;bqY l|թ/U DDŽMQ}م+EN4;]%=B;a;.1nb'[م6'-w[ԎڞΠ4à+=ಹ3ptgf-;!vi㮰T-ņz9_/g7+Lt@6C"p/Pn idI|%ms':Ҧ3\;(9ťPh3 _73ra(U[IRW8tH更ȉi(n5ˈnNE3Mcgu<^bhyōmN88:XzH~Ѵ3 3sh d#>I[rO G6unn Z9EqֈT)z(iRA a4g{ q <z{Jr/Qy͒:(DW9'mwGh_jg10(Z:j~Tvgoǡex%J;jUnX`XutKY]FZ!EV5+9yU<N I:V;R'&n*@4q*%ʤ*x GgoGEZmG4rzc:#Ojvo* tYN{m!,*V H*\ȰÇ#JHŋ3jQct)H\ɲ˗0cʜؤI2RJѣH*U Υ?n իXjӭ?Kٳh*2mBʝK]:y߃ |4ÈJǐ|jw1Ș3kk[LӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8hmZy隙6)F * i>(Bl:ۜ"ʪzRvY&,sF+mS:T^\j,AƹDd.Z)oABvYi nd/Cg޺dj~[[Z+^Y}*t0 ;6 1sa/0#N%~@,,2B{I!‘N>KM]\G;43EP;UKYoV } 6K$#NY}Rp@rS9JmΛP|_=ɀ~ky/磟{樧E)O.vP#T9tm+o5;E⮉JiRj)tD3;|J_=T@jO[Z&T 鰱/ރͥ2䵽OUTwM GYs@VU]@Ʌ j+UWPLv2leS`THY<wVe=!{n7S BI /ҩKtɛK$1}#HL"M 0`OtfxԦŖpyj Xض60+׺DYPיDv76rB\$UfH?>bg1jP&9ђntC%qgS(6oMr$"*+Ƀ$N}WNt" ^F%K!C?JQkn~Ѥ*-, 5> LVSԥ mO*TbS8Ak*}jCZTBl/\ JֲҮYfMZڢf~IBGU"Kiѕs"n. ['4j%8i$IeNMu=+ͳ jRd|82"%\yՖ-%jhjve)#>FЎ4-yޮ¸z1AnGf6,SUKMɌn;}Зqr7E[ltGʼnN!Μr\6<Ӱ ΃#lFE)=NTy{b57 1>WBW{pi3t&FH%W&4(7<ѩ._2 Pdӕ?+wM2p;GΧWTmDGm6N5p~|:zׁY+do ] l]v).6-l3[5pi3zC}ܧk>eӚVeVkAuIdzaw[4Kً}Z~8-)K˶vX/ m~o\f̡ۿ%n},7O;mН_|BY~Q翝38/$NJʻfBldzT}8k&kԩ ?asRu`)f㑓;5}!ױUWƯ婜@rq7RJό[eKW̒bÿjjk]汛hw̜ÝvqE[|Ӷx&:݈v& XDK zPm_wZ"T}hk>8V01ctuUF).6u_L D+ɖ+z^Y_kͽ;b~3Ӆݼrռlq|5r߻v%ݝmOUGJVc^uW4u b"rMV`l?sQ'O%g%TWu6rWw=us4bhLA%bsld T(pTtett''5u;rTfGFHveL؄NXk3UAQgtg.ÅiQG$?Y+A|z Ilc9giyx:+c-pqwlw{-$}.J4$xk`&3]8ֈF qm'Xs[n%`1laȵnn\G){x(ٗMޔkf8O_`z'̘o ֌OhȀC"j޷0[eR7 Ȃq1VzlրrDWQ3LsA؂ߣs:[1Sdb`(9t$ue"C؏gV"rQuE}X NK$YRtGv-e5-U0*um )#/iD$kI 0ɂȢ%(G3G/_QxEKP֋Pw~KWx:1+fGt5GQssHd\v+مDmC2I%)$ 2si%i˜f۸Yb/X$=5]IUj;=4Gc0I#ȩ'KYsss62#_)9B.(4{lt#~&șJa yY8#1;V:f7PH^a&GjtH{Vo3&C^,g•h g]6F5p}|bW_w &t_е헉L:7['T%*/*Y{*|`1Cy٥OE^\MX%9Hza(]VXJ OZJ+j,R;Ӈě2Eu8x^MOI}aHTiنebzcEq~7JתdžO*}ADcw颼V]eozj#7Ww(5W,٬C*Gj jR)WZ-}b6y8 ZHSoZwd\7"GHbx98Ib 9zi}iQ;Hh{qǡhg = 84|cc樨Y`8t'j/VVA꧶ĦڷaʧH:rBWi{5q>n\ ?6~H+Y#|GF6beY\ >x1H`i:+ۼq? ˇhDԻuYS!7 S9;Ji1'|Y9 %Hk,vj]D&D(dNj˩u٩jY]rAذz$A LL^<ݹu9L%y !\&,yx͹15Jm*FsP ™h/%"S{} Xōר\-[dӯ+ Nq챳p2*:sîkCkÿFzl}l<njpKF;=߯Vi.t黶~9OA Hpv%qv d |WNNZRxAy8)OA0J{ ŽK`n-vH"HL!dL vQ&=YI` cR0.pgg#B UΆsJꈡA.UY  R&|+wH*$'IJZ򒘜5I YRꤏW0JQ*2cwJTd2c(];~@pi%CrEl/IbL2Yn9$ p|#'ʗд̇. !Cx+,$O A.g[Zՠ?ה>x^y[`zKWMr)CDze$z%V"]uļ-mg[ ɮ$o؎{J~M ‡²&>Mv{0ll6X!\N;؋z/HRqu5y%]BIn.'O3 Ѹ>DL!^ik2!NjJIecSUw 72gɿrY_r%$pX]+T2l>Ђ-3_Yo\04#AI2CAGϕtEJ"Kǂ M ZII3dW(vxVm\]Ϣ.eCk:Wx̩S lMU639o~1 pOmlO$c546ڎl8ex_{F~{z_dZl.-|_イ72caUh ŵ{_,"Q`.^Õc3Vopq87vZ'NSqVhDuU(YrXT;dvew}8?6i_EXx:UBK2OWth7uZhiQ9H[y{Јކ>Yhi>"lW[Iz_ i=@zF"eb}86f~miT0 lx[؋qH)?(6XpKYVy85xϷy|]˥hDΨhxfK+ agiXwR@vN+0oۈk ȗHjZ؄yzȑKa QXf|va6cjl Y9hL9|ylho~ WSǖo2Xn WHXBryIv.-{AC٘bq֔Rդhٞ'yZ5g[g~)p J* w;eN89Bw{b`;(r zؘ67<Î=d㘙K8$AȄrsS0xe'Jj5Te/CiJPY&ʓyGCsɚ0xC%KY(eF)pzftZnЩZe. _JȍhHqwdn<54O,T g6`l ?I8(=wnV4MxzTEƇ=NE fWڤiؙHC=N-cYq:ڂ>ZCg(E URV4جNyAʃkC{ٚf&X魶YRv=_{'dgSldy,֨ծu9$7K~I7jbٯiu|}T)6>Ri(PUp.*;3;.<&!^ѧ5[7 4ѳ{y/=+]1;*MD3a/ۋ= VdNc[VRJ0.K;Kj Br^۷PsS˴yvHc XK{qw{sޙaeck]涽NV!%XU h[' ר!,*V H*\ȰÇ#JHŋ3jqRt1H\ɲ˗0cʜ*IҤ*8y JѣH6L1AE@:JիXcYEgVL"ٳh*jhZeٸxaJ 3E+^T|H0˘3kR}Ө6]԰c˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L AiM*)A)%AOrUV9]eŘa_:@jfp~I%`vyj@gNQfk:l騙.JgAƉhEyСZ ꩨꪬ꫰*kfPtzګ|IjA*lzĢ5桝> m.;kh{'WVk퉉2:2ZMNi.z`6Nz ,s7gpG,WlgWFqzJ%1)'wI%-s-/5sX. =cAkg=I F 3R\w`-5+/d*ni0_KqF,{(=SWik̂gg۸=ޑ6=9oktlonq5jI:ꬷ.N/bոW7|~o 88sf+f>}gw/oٷvb%f6B28XƋZ̐G~ <˷0E*Ҫ ']]΃?5{$L WCߨ`8)i!t 25P+9SxTy"7Cypי⎅.z` HTjS+P04OjJ;})c _bǴqf5)9! y54e!ڨ&E22"$bp,CɲXy#7汒񇩄cIZ̥.rFdpyc$G` 1Q2g\lPJ1<6UvMt2x`7AT6R^yvv#ay'@ekYyVO6jty҆"ׅ}, Zrj`XwgU"U= 7aӊԅ[BZ.un|+X/g -,5|Q".gLc!IW/#usIT$ykYv@lx<t(^XMLNK7uW .g G6PrQbOE)nJKR04\ FZ 6gNO no%iWZ?y;Xri';d] UҺIkɴ ` dq@)Vۃ-6]7z^DgcoZÙYe!YɰaZֈM4Ҭp$)VrڨD_fj 7и+e/٫ds1XU[].о s![I%o1eƛiKtو{$!ˇ 32j[Vb]G9\y ?M&s}s]ױV5( epFnͽZiْ4vp,e1OkMgP(vr3^ݥ{[.گ*@ȿ}ی?;f=Vyܦ<3~Vv@we:wfMoϸ=f_/\6]^yI:7"ux95GHq#Ξ!71ldc!L??b?ߛB08%qw<naaDvUfZ/'ey6D'\hjGF%}crj'tz]|GwuXzgxQ)6m+({sWkGF2h4ZnC8S;8L&S\.(=EoGxs6Ƅ=T^^&&f*8Eh[V0Fq8>&fPdb/Db|U}&V0Ht}0؈ (v(?~HK 6IS8gZ|8P)v==XK XMdž`PzVTiIԀWfxe%\{aHh_iuSa4hDGvXod`Ds1fvE^%g'hȁwGwjjv8uJT>䇣1AiAňU7diU.bY&!6rrLHE9F~r*q~Ԇc&#C0Exwu|bX}93LdZwtפmNh"slZ^?w}i9plWMdv7N\~Q8k5FvWXLٔYW3gߦ+l>HfnwDohO^œrjwi"x‘ٚi Ѩ'g~RrGRyT,Q0-}LSnf3K;9_LݩHƝ=GPNjVGN9%論YfFTi(>^~(MAN0fRy2#$mJk-||'2p\`Gh Is\!K%HRpLOiZtKӦ*jr{D3ð^*M Hɦ˝jVJA,iӯ {aӉX(F͛cYɰa!_62B,j"/&mcL^U4DP(TD%jK ꐋ$.UR9ԧ?(u i3C'=N{\G3zMl¬@zl&Gj^j B)h^We> x,S|9 {P=XiV t,}gLc5vռ?E@پY": OFfS,`HdHUtʃs͕v+.-P(_5ڶ`W2tNGWVvjgCkG;`ZTRu:$[^q91\5SNU%tudݥjm>Ud[t>]Da7b5q5|_Bk`cfr"z %֦^-FX?g ""ʕY\Az#(7(eZ*E4H^>n,vac>5e@Uke;<>uo>6wN|fcf]FiWb8i8[fHdHms_bO1b2\]u4чz)m.X'no4)tt;ĈۃhQxx)RXS CGX4k(j%H5A0R'db+n۷0Cw_tsdZ\Xi؈g8UH "5@/'iсXx1Y @ÎH;v}׎~THGXP7׏xsɸX&9{E'~v|&䱉VV|/x|Hɑѡ|yX}'xgi.7Hs<&{xs4+rgԲuTŲrNP,EQYVyA/g7sXׅ3xR^x|A(hulRxRWGCvQ'^դLVqq['Qr}ghB蓚Q} f*YK{yU~woNʼnBִuXuu!]yGnWyhV3&Rgtԃw|7q)0盬ET)( Yb ~ʩلf(*LY2.7HnFם)֖ v0Y|'^yy:([I`1O0ɠ_@J/cDtn ^OA ׹NĆzcWUElf-:@I.8YaGXգ06UxXWڒNIJҴ{^'3] ^ڟ_jf}cze≦Ê#i@ qj(URz'VʅgtŨL:1zz呩_ȣ[',<:傣Zjz j7Z| )l楷:HT0dR:.{xFÒu(k,WyhK&FyD&ĭ8!ht֊ǤH }qpx.%j8Cр}RYvkڰt2D8Y.q7*?F)/FwMʚ} axiKƱCI('n4䗴w"4y_4SwvԞRLI8نʧJ vxA3WY\z8=G 钣i"ӛĚj*eHUUMoUHsJZjW lIrtw99;:|8U˸홠/ka({k [)JٻP>ꩺ[{?eӪŖǵd˕ǻTĩ׻ʴO?1OKeMݫpT)W^Ȩ] +7Z w~:& zY֪4ᛸGu< |\ns0U{7eZQJZdyL`uiNh|',+¨ B?LEJ$w'Pt#J:8@SC@V$gܱAD|O]`jIZPj鋌ZbqU-#K,spLF]̺f:ƗffzK1)stMejER'2c+X˙I)[DnjF)")0<)|ɇ ɐVofi0T1‹T?cQ ' 0QDok0͕=|ΊMqH@M{Y2nyTj*5{T8Iwʒ7w irn|l1%v!' =;|}`P&}jmaɈ6=ꂥmX˔}tmos{ԅ(.JY|\3.׫؊+cNMZi,|kw"sEݐ{b?17Ƒ~ް n>.t59mA2܊Dd>?q1N:;.1N;.-AHN㵉C]; ('>?=~lAY_`JnP.O>q>wcW.P qjs$Nx9WNOQ푝Qyt^E~^<~\豊n2l^nCn[1馾A旺V^>d^نqz>>Nt9>,N^jE*o/~^ ^NNIyb!.,V H*\ȰÇ#JHŋ3jȱǏ*) @PŤ*HᲦ͛8sɳϟ@ViB͔4r̥PJJիU@$b=H ƪ]˶۷p=*MAG)Č @` L:k@*;Ę3k̙Yv;=n_ҝS^ͺK_,.mi]ͻeD2rܦU^μ@oaZ7ËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx|߀.n'7G.Wngw砇.褗n騧ꬷ.n/o'7G/Wogw/o觯/?C)U HL/,'x?R 7H@ r GHЃ&LQ|! ;( 7PC?`75<%Љ1l! &QT_xE$f1]"D2pШ ~xF*70sE/^4 >pvT!)@o+ NЄ&9L%A*@ԇ'?3jP4H3ґt=,(Җ(KYKDN7m`BS1xs? $0Q3-(׉LzӪ,R:Ӯ+j*ԑՅgU`OVS6PZ^ԛau;G1tOWkXV~իLtT(]W8e6ntSP]3(̥NRTmc?J].;X}Xie:FB2<=.\?LNbn'qβZ$&j KȚ^׊LgUiybb?Z7/*Z\~ۘJԎxrKqM}4%LPΰI GfN*!dD %8O6αw@L"HN&;61L*XV򐱬.^L2d3 e5yn~s,/IryY;;64E+Zv3@۹ǖNoiG{ӀuϰѢȀTy|.ti׺ɷ~t]OC.Tz A}dGY@imc~6\WvϽ\g^6}Lכα},oG;{ߕ.DZMnS;۔v .vC瞷ۛsoL{|5pwGىִ ?xιís>q| G7}b9nWs<㒖kq^?8չn7OO~'}֠&Ӈ.;3o }:͹θd{fvʕ îf|Aз{AK_EjX~޿=7??T\Wƿ.qtkkHf~(g 8h!,G H*\ȰÇ#JHŋ3jȱǏ@0A=X ˗0cʜI͛8s92*'QzHtѣH*]ʴӧԫXjʵךF"~]˶۷pv0 K!@ܿ L8gX) :oǐ#K QQ2NIϠC'M1ݗ'S +װc3@d- Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx|߀.n'7G.Wngw砇.褗n騧ꬷ.n@1o'7G/WogOws͋OЛׯ=w_@H0~;:'U0̠8 No@(y# &я(xF*<<!:APS{H"q~G&VaM|`D*px"ΰ ,4a.Zpy AЍ |GGxh-ϏbaILxHPqHqq|^"Q41=Mn&kc&R{<% J4~\4 GV$RA[2'a sqT;S:kf$aD]leC.f1a #M3LiLf‘:IzbO|&5=}Z h/JҔe%ۉLP24ƒgC8O{ZR(b (P&Y}T@)IjRSm<'=9QnFrԨNwQְY7U=@aYMA%4srhV͇լ49OǪQ|ޑ.,!Z](뭵@yZoh'2xied[yWS K:Ӭ= 4CΓe%.cl5A+j;E-:NlgKͭnw pK-rV΍n+ͮvz.xNj\w=ouӫn|k־ot[_=o}ݛ[2M[`NF+aa 0o93a1`6ï%maaƶqwubڸlS@r[$+9 &|_*߸ Wr_.[9ZcL-C7eNɜa4wYXfٺi|yd Dm'?9ޭe9ε}f*9o,g2wԗ'meTԉo;@#=kUtLۙÖ_P{i.) Qx4bG)fщ(bdAbQv|FL] [7I "І(I:4f  Yx4 HJSҊ,*[IU^.qWr !zN Û+KyG#,M>}I,]z߬/8b,f$J)S&ӕ+J[.s|J @N ]AwFctdCPQ62Hk6Q( 9OY- 9Жѥà )ə~2 $Ȩ>\ꔌ hH ErS2nVd*5aJՈVuUN7ũAC~*tMZ N k QPnkUWϯ FK,hRv_d7Nͬf7z hGKҚMjWֺ,lgKfVhqޚ pK.r [2w}no܁pV ͮvRwKW5.v7%oz3a-omYZv of@͒oi^W;a X|MSqw[ςXı0Anb~e+V%αݻ{Õm+d!8(۪5gW31.{Y=7k&3$^nxU|ervsc+bu@9Fsg02:~obs7i{4GHpN4C+&muiLzϛq?eXףQ3(Nvi ^e;V2[,m\Ρ5)w[.vm=b˞թ mm[omw6s5Pߔl? 0]fv9Ϧ\\,7/+h׼8Ʈk\o5yU]Π-^ۑKv;N!,) H*\ȰÇ#JHŋ3jȱǏS  ȁ"3y2cU NhI͛8sɳϟSW*)&DJJիXb})j˗j:PhӪ]˶ۜH (P3fc߿ ЯCg%U]#KL_W>Л` LӨm>82fƝݐ۸s|ҵ?رrMYȓW&gt%kνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx|߀.n'7G.Wngw砇.褗n騧ꬷFn/o.{7SGW;gwcɋO>_}?/\o~+(@~#`X:p}$яMcT!=H; ЀC W♰$RȐ{!0w:l }XBdg%rƈIt"Y"$>:T .v1^C >PxI?&A0jdcS,Jq~w"I#jэ !Y1Αmt`_ tDB%'<ڑv>rSSl" IҌă.'QFͲ=e xJWQ6u#+YQrT3=@1/xFR&KqZrl3JQ.sҼfUʳb6ImX}$A9Y%Z3jH_Vt$4LS E@6iXVxd_\eʛNԦ«Bzs k`7XMb:d'Kʂl ?2z hGKҚMjWֺl3lms[MoKMr;:w}m+]Rh;Z x ׳=iӫֲ֥wC;_m߫֞a z3aF?'LaVlKx E־mEb/m[ c ػ4v;W8q<"F9&o; Φ5kcyXslYB޲b-yp~.&cR]:OaVF1]ˈq^B+6~4' Ϙ^gx-ouV}slyN|h@rSkK09ӹ W3eoyy '{gmuNyoDyG{[Q'zջu!,  H*\ȰÇ#JHŋ3jȱǏ'P*0ɲ˗0cʜI͛8kVIdIUYѣH*]ʴS=I jʵׯ`þ)%Y(˘3kYrpˠ XLӨd(U ۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-6RI%Thlp-tmx|.iMru+G.W.g7y:'k dz밣z~춻:> OݓO/_x@ ?wӫm?EOxLR>o;OB?$+m @, @%x 9g67qpmS[;iB*D6;dNΑ~ [zΩ,5WLl[NuMmFrKi g[l5| e{~u~[8g e{vlڋw(#7tuk[W݃P+Ϲx]q !, H*\ȰÇ#JHŋ3jȱǏxW HN\ɲ˗0cʜI͚)TRc&E#*]ʴӧPJ%bg7 PEjC^ÊKٳ*LƝUImr˷߿-N` #VU=[L{Z]1L PY;7$̺װ?RzВAzV@ N\xΝ=5>Of{PɊ$P`h_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx|߀.n'.0\]1G.Wngw砇.3G騧Ngnz밻nN:゚|O<E<_G/Oo_g=\3>O^Ͻ{> =8~η4Qߟ>7C0To' t҇~0S*xA2 JN^h B.yC P|7]OI?&a9B$"?Bd)! Py/ `\]7CƕrF w tqkBF.F9u\ >{G L#"pFb0 :F8NcsE6q'#^8JM҉b*d#ͧ8αaGBNq'(J>}% [򐱌 Շ*Cc5IG&C@6Y<7ahe6󝻃gI…|#-8Y*oGh.O̞ NdB)ϊ`g?6J?rT@ Fpd[*+YX.rkv٬9qwl3и6sh|e-U}rlnal_xDt/3sped/٪sK6yK/|iMҠ\LcZʔ6t-cEնv4c¹M_\oqnmMSƴ=,TƬ<[rJù0E|g976MIו6kPojϖ2 edߕNWp֛mKm6lƙv-nwg !EWNr㕅9g!, H*\ȰÇ#JHŋ3jȱǏ Rpȓ(S\ɲ˗0cʜIHRD@ JѣHRIɕ9JJիXdZ)ϓ)~ٳhӪ]{" O˷߿.2ϯ s ǐ#K+̹ϠgV&b@ޏtV!װc>8 >I@Ƴ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'mmmPG-TWmXg\w`-N7Mh}lgmvpkvtmxs7}}vMx 7_3LS.{yon砇ns= =8}zW.8ФGg O^ފtxL "3O?<&hІn$ڸ)Xt F7юz HGJҒ(MJWҖ0hFcJӚT3NIӝ=PJԢH-jPԘ.4}*T}*թT jHӪZ` M*ֲԬ/%+ZWֵZkV*Sx]3~*_p2v%-lGX2vrmd';Rhf!WN"]= Z 8E-HUXΕul?ڂvͩV#{6uf5:ܭ浴mp5ܸ6-mgUoANZn7rK^ђEr:uVKvjto[WΗm[K׼Uz{ខ_wj/_vxn]P5qp|7n|7/Ѕ.qc55pwU"+$e1Ob㒷ްw{k} o1\V"V+i\5k%3Uկt\gNdUL5z ¡f*~ bA[҈%4M{bMU7MRtԘF- Nϐ=KbZ/WլF1!, H*\ȰÇ#JHŋ3jȱǏ 39Aȓ(S\ɲ˗0cʜU@ϟ@ JыRoӣPJJի'SdN)8G~5< =|yQW^ФG z42;n88LN;xL 9徻ζsG?>5_|ꏻ}4AK]EЗv=lPis_aL!>ϗ=#1OzҤS?._<}{H/S·>1.{ l_m>- 8Be'_列T% B5쓝ph@j9[&A2.K"w%}㋡7xǓ<p]<h"D 3 {gD:*ЎGEZsXD GGz3! 2I\D5nM$8FцQܣ?{ `1,P!1ݓ$$HK%ʑ4:c#C(ѓ%)ґ}x[-0rʛD &l \ ќ$&9غM85>xB{&~r&6GCe9sD75S-dmhEGJRKti[J%򲖠el !'ͩ+ujNt @?JԢHMRԦ:PTJժZXͪV:ԭz`%jWJVhYֶp\ߺֹuuWW}T `+b[T2}lU#+YRf7rvgXQC N d(iڣzv}-lgK[֫5jn*۹v ejo5rUkr\u.a;N}.fkݱ x:uU-qjܤmod]bQ B^w]uL`׼{ޠ6Eo{`J[rWݯ CW1[ x 60c ogୋqax PI|b =QRw1~eθƮ0{u\ 5@6kn f> f~[G4̀UG3whTY p8Ez(HAsٮ}d7&eu3qa=r,nAPfݰ ˡz3mAqtj#1S d (̐m2i$"[FȴA2ձHܣG? &PX3vcd2t1ucI*ugA~Ҕ}T1aS%ʘ }!:k*z\aKpp%%MȽ8ʱsf'IϽ|ʬg1)OhvI#5EeKC7f4Cd 8y bH7ȏzJWjԥgNJI'"j7eN)STl?ɆJԢHMRԦ:PTJժZ5YSծz` XJֲhMZֶp\UxkW׾~ Z+MbX2tu,d*lZVճd_1Қ=jZn}-l*۱ks-pz5|hd@wrY-u]fe5Wk*S@v[V%n9k[f u}U׾5H~;`m{w-h Kt%oW5b5ok?zv]Q_Gx6QCyֱ:ńqs|ƎqfEy\}w z- #y% @N"nz`V>-0z5 /h?CAD aZ&Љ^ANE%n~F$B(skcz:͎r Rq鑏O# ~K)1/a\b53y"ՇNѓC3БEQ`FCLwCCm<"(gIˡ1l-V q 0azŴZ// =T s1ٰd Ӛ)f˦) 8IrL:vOp泟U?JvMBІ:t}Dщ곢%(F3юz FCJR|#=i֛}LYKVfU-;#+ZNշg1KӭG5nh{۞ӶlVV^'ai[mx ש7.9j5w+{[NRӵ.`g VFxLYVyE0z֕ os귲Y3L_Bï%Ekמ &o8S6pkSځn`ú@iCl왟 9#p猎ퟅ\ЈN4Dz猷P0$4< RN4 !#, H*\ȰÇ#JHŋ3jȱǏS /ȓ(V9A0cʜI͛8siJ&y9QdϗD*]ʴӧP*sCTT!ʵׯ`Ê0} HʝKݻ4} d s\~LÈE/u볬˘3k Rm)!k @h9^ͺj{vl /ͻ q~z PУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Ժhev+k覫+bKڋ,'. p> ԯgoqmq,2#TAT,$l37;4=Ϝsx@tC[lr)k%A1K(?\cݵBt?j=7ݪͶM{.wKd47{/̄FyݷԀ'^8ܐuۮS?\sm3ϗg3ڂι r~뽸ߏ[mo➓v#2w;&N X=#TC-d4#l&1xm[:/*ochD+6nvPCd tW mN$NR DO̔]+JRj%,e)9Dzlbr/+1bZL2f:Ќ4IjZ̦6nz͚8qL:vq @ρ=BЅ:D'Jш6E3 ЍrTH)yt(MJҕԟ/gKczϙjt6%'A:sԧ9=)BsJӢD==@t25ISyNէ*TYRv5]VZղդggSŹ)kE WvʵtEM ӟ N:؂tGj!!,I7VK`'PÇ#JE3jȱǏ CIɐUi(J N:D򡇚+eɳϟ@{\R˘;EaΠPJJC4mytISVӪ]˶@TNغ2C$VAP ,Z5 LG*S5j* iD԰˘V!wu.rӨSL2ݮxGL1hCڪs [^@@'A4B `УKNسkνËOӫ_Ͼ˟O:%_~ (U()H GŠa~4aj>8Q>]Hyx>DN" vbF)bbxRm$Xi)Y1YR|W Ŗy%GNQ%DT:ebZFY=qy#Drњ1YoF $b9uIZ類&MhQ^8yob!f ѦnhFe٩zjz*h+Bz,\fj7@ZjDǢ89ުMڪ"žZފ Kn+if[/. `nd.i|>N*dnjoJ\p \j2so [+k jq&w2j)3g.=kԍn3IWhH/<7;;[6<WqBLnrS쪦AtvZ-5;\uy <Ïbit#p3bLjm(I9a ?;sS8]\Ѩ_mpojG\5ih_I;5/sC#ůF;~:H_Hn~.#*X.ʟ!Hy{4%`Ad)Ap='D\8f$R 1ڐ<0Y4C])gHTFjD0Br |'? $ QhR" Bd,3JSVprC4bDDfJ$dX0L[*r 'p1EXM%QdOra' OԩCqP=_Nsf!7.j<=b  $%T4Ќ<Ԟ:8 |BL;R"E1ϒ\-kU!pt+"2%E>>+P'ՏEiMHo|ԗNԧL*9Sq =cؤ:qWa:V5\dYYv,gTZL a6-UK;|CECjʌ-BK~te2kngTsr-p_{^7*x[W%y. תAy^r;UOao"v*naYPwWI\+8/jsͫZa v6;b:j]pI=/BoTb\Vso\_Q֟ɄNYKi1-IޝP$tU{ߖꤗۄv ]-˖Ʌ2jJgxb>U[(nyB meez$t~qMg_S̽PMٌCΥb-ZHKk~x Nӆƨ4Z# j ǢY`VgcV=M6BviJT ŞYlֺ$AKTO:[Fa=#A3g{Ǭ9D߶Ή˚p*2k]Mր{7LblM;UqL" 8Hz<@#xHwDwd28ȷlr$G?C)DAIF zid=uIrP?s?F*ҏI)`g 'h^_Q^K~ ${i>v=$vGvSe y ›xH[tKW{ˋ~xcꌿ:oŻx/_} xןt7ooTv{:>R@wR׭7?'|G^ зCoLǖ~bkg6#Q:h!hTgfLZvtFZ)胇Uqhd̆k&aŇ %OUhƀn5kW(7LV K7|^EzֆX؉fփwhL@87CƉ&cB#GZunC5n>v`O4Q%6Su-HRk`tdEbl*Ft5b7GbH(HRhsֈݘ.ITCvoef@xjɢ]Ãh(}|Fff`嵆mUhu{cej}_v5iu(m4\U0ْ̆uȶx(Ȉ "$ɒAV(!Ra>Lؑ=p6MYvoqѳv)U:J;ؕ w4PCI3{UIi'HJ{Nڶj!ڣFJʭw۷S4\˥^ 0c[> _۪dQk8${o6I}c){5Km8IJZ;؛눓 RoK* zz:a*˼)^) JH[TZKlx۴"DZJ zk8j SCZ|9+jsi* ˮk=1d{2ѥI[X{˦k޺{,Q;;_̌$^^~N >|#t[~= W['"w" t]m^Z,fx6=ޠ2m\MCO(PCzLŹnUyb^,@5 ֺ~iiWc\Zo$b,2c/LxǫlO@fBX(ٙR>?8SrR_XnmT%zC(o* o6?lnk OĜ __' " o.eȟoOځ_8씤 oP/䟄/Y5~onEk 2`A "TCk 8P@2>XcŋCqÌ?dҥÑg>R%ʗ/c<͜&#)bʠI.8J,2m:$H?N:i*Dنa>TiՊqk\s>_%ڐ_WDx.`Vg>:3Ϟb%Mх1a@Ӌ:&][i[m\{76u*gNY㵟mrzukGw;^}wbӯI N_|l5;N~?]tϥ3h#l!0k@*鸄&D: DK-9O5@,l ECFL!"0)C")D_Ѭ(Q #JGR^S/O)Cʿr<JL,ǒ,K:tLȷD34SO/0˺hC \sCrƆ д@B й֤4NeN>!I58U2V/UU"QԀ!,J6V*Lb =,Hŋ3jȱǏ CX?)FLJ I͛8sDh-HѣH*XJ @]"dOҫXjjUj=?]˶mǒ)9`YVWmI`Ҭo }+^Ϲ* WQƘ3k渁d) S^ͺװc˞M۸sͻ Nȓ+_μУKq5+Ğ;F5x>dž/oO̿k x]v(^h-{!f"DlP]yȠI80ڄ?Na#F0ba7(ލ嘓 |1&H3EK# ~AID$KPXR(FД"B`ִ%]!mi7v#{^dO؞x١?fg, v{^yAj8>Jg;ngYW^)dV:োZک9ީKRګjݥ(I ޟRꝢΉV0&eN%eGb~8Bވrz鴴¹%[vb'{7[Em컌^lEFzK̯*/Z bښq2l&R+*QU0#AfmDBτt!lH@HJ#+G3A%L;g/,k!gMS8bc@!DZ F*ʋ,d-Z'VBOV>:qzj",p[Tx<'q}#9?ΐV痕P=[%Mq"r*?H+*<%LJe(xeb~R/ƞ`<&S_r&\Mqݶ'vrk( Nq+8!p!l'BbkyPS^h+?.ԠjAh,QR֎aBG) IOb)\sTS5'+$սjQEKFIԙn5*b*XCrUX֩ $_:MY)S ZJt$@UIT:G'A;Rjb>Y"ꇣS\ZQݪ&shBUHf.׶'%¬ht{?Ih-,MB&$q3ލR*wR۳vI i {~V>Jf YVV&iiYY2»i> %`g!MuŪ^Wb\#lAiY=[Ќq ,H.D^ 47,^py`[ LNžd5l]9o2}gF}x[_v&íL=]ϥF jey38O0Y ]l61mB^ԗftfHYi h$яM a5NC*4%!%Yìy"YO$iL"ulDWdn<{Ȗ5O=mgW[0I4RA~Lm) {oȭ]p88&cw~vcEcD~SWb_g+g5X(ƀdOve@排!WC8Wc(TRv[`g=|_gx\5e]E[( %E!hmh8' D~Nh"a٘w&(eN؍B8;UU`Tf+ IVHVzqExk_G!fdJQ;樖HI}!4AFdǨK e|988Z1"툇1ɘAsֈUȒFaz)d*Y >e[i ]8C<99޴O@wc◇yi9]وjّӉ h02}霱YIYjƞRM9 O)YW[X\sȘi (LbaX E! Ɍ蘋*W: V/xJbzJ*EƎkIQ%<f9ܑYJ4 `SVVCŐY71HvR*Y;wwחu*!YG); uhީEC:7(\0削STUivȧ ) YIIڡp:U$?hD*Jhʏ0dd i&j(:GJ_ʬ K& `euO@ ~D3bتm fI .:*dj_p:EZٟ)i+ ;$יڃ*xᚓK[r%{/y3gR ER eʥjƉ%ȠaZȂV9{V/zGJتڬ0;o*֪\{`ɭpJ'kS>ʁ>:}ڠȤY TH"ĺ4jRQ [V>j+*~)[1ۓKʜ{;+[e벯 ۦ -˼˝ ;=TQԼZ+#I 9bZ41;=JUL暭+UW˰ƚYڿn{<̰ \[˖;b| +XXIm klG&zL|֔ϻ绹: %OŽN 0; w i O{:!ŏ:kѢ4 ,;qy{I NLl<5Lы^kfȭ(ǰFJsD 5Zʶ`bڲ8h ɑ\lu)t{L™L ç:+kK˩,ő)ɡ\ {ZiDŽf[n lCs<ǭČDLk bk`|\p IVln%mߌ- y{ܽ mID;o׬Hz7Z*̻lX*nKHXj,l'5!](˧,q7[ QɌ3<)]mۿ*Af8΀$=BM1 M h(m}} {ĥNݧ{f&=q ͽ|Ğѓ=>e3Q:L͈L=>Ǔן&^~-.-oΛ>CN<٥^.g_ N:މ=bfܟB^ۻ֍ַ-عދ Xнs9=%AsJtu]3 tvvK.M^#'d-"MRCRzM? &|'/ m-m9pC9*D}ЎO;^2OܝΓ!yYoMbI4ޣ;mwk^FZn.M})bNfʗY!!v/.[NԄnۄ&۽p)΄bҬ[m`2h_H2BieET#On$J/O?D4?0oÿ쮲N/ٿOOPɇǻJ?zNZ S#3p`A&C{B\SWt)PHQT:tդ-2T]I6ȩ1-ԛ7bى%~|a|#"H/y1Xw̙'o'ᵐE^ȖǏG$£Kj blM^ݛϤVe5`'.7nsvƵu]g^g.޼9Ͽ $Gk>Gy02d T<\0tLo :0 ˰JA1 "9V):PH*5l54LÓV.ҭ{kQ-`/2# $/ƜTP2( m 2*˰ .Z@4Lj66C2N ; 1I+KNC%I4BΥQTB-3oS-̉ǝLѭ*տw{UI:* 3S)bQ+V!Bkᬵj][oQVBRAunO !,J6VL P E @Ç#JL1<| Ǐ CIɓ(S\ RaKUR&B o JѣHG!ͥ-iꀤXjʵ+0keZ_Yy۷puNu=8' LpI47]&_2P5Lp㜐μLieza΂hAS9&Ӹs9 ®U7pУKNسkνËOӫ_Ͼ˟OHrYQ(DCRvP G RCi"eKk:%Hbf#u%!}`l򩦡nDhWu"'}hX]*ѥtfZb򇨜 `df"* n) Yk6j?`2kGZ+M [F["d6eꬰBlrH*龘.f{T- &L+kZ)j2뮜v+V*v,ǬN0x MBF1.S$e/%!lhƷ1\D(-9C@)IcC?8 |H#E*27ЂH=,%h$g$#5@\d IҔ%" 2<ȑ|Jr4J/#U+`KE2 C%x^>$d%or lRY<&\>Na?KpӐE7}IrG3f0Jb.0T4QHl*$;vmDT/~$}@5xt@i~s|D_VJJRR2ҥ(' EQjЎ% [ٕ7B}!QbTwQB\*z<*բnBj}*DLjd^u"!FN;$l*B4h5!N%YZ':ʌKFrN ttg;7Vztg8Ê&q,cY kv=u*I Ӳ3z'hW=jwu4mIMLi,eɵ+ђ%l>Hf$ev,ӕ\uduyI䚷I{/?JG]>;uumeDΆeMOzV U!m+NK.(zCbW7 XT&1E#eĉJ[b23*B5p \bȾluk 8*'-e~զ 9LntR~ =bN]tlRX1IܛK3x/cqv#_FԷ%)3Y^[/㹼z6A`GĴeg}g7zn|_yA5AgQZr(kȖJ2ReG˖1K}9D38F,cӴlȻUXyqDz$gkDw.Tk Dlp9w>q[=xD*"<#,I.sS3"zH:nUGrnmF*ҏIw&zGrSy)Aޓk$HͻW'_"vX OJᏹwo}>Oc$gA&= B t:OI(/y%> ]#7;/$<#$zJBosI +~@=g>"v+(#>G$S~(۽_lگ炗u3 yƓ$~$'tt/7z6}'u&r,Q{xwqkyDW|tKGqAz$oF#Z7bo,n(tC5nIQndWum`mc*ޖmUdהl3'gleC`4mHehdkK†%"dElfDIkb&k6aZҥhbWF4jDXhƇ6ein^hn=inm8EwfhXAieՄ Odj#TeзKǶ~[lq5ЖSW%\(:D8IYG )g &Rz*)hS;fY5:Uzѧpi1CɞHI騱AɤbJZSy#꧛ʣ3n\*=uT4Z^*k9j^fՋdIP:<瓞enjܶ%ZΈ)*Lxɭ_% ;3hɮA:Jh恤HzOV̪D(u4fSza6gk¦$Y ,X*X)jĒʲ f TIݙISD>˴NyO;yH+ԹO哂 5QB;GkK˪<敁 [6+jk^ .Bvf!hI~NV*>2˱wUR>H85@3H斵5'1چʯ++J(Ji5*){=H-P,~ZS`d̶ .%! WW=b1ޖd'I&6Q:ymA׬Q'ވܷܿMݪiW%M劬hLk=҈íݚX}l^*^$]Ջ̴>ܜݐݢjqNޛ諑}+>]X9[] LVVIym} /֩hu<{nMɎ1KԖ`㧻"_|FMX jKOlEb vٝ.] #Zn  +oMu^'7r - i%VlMmցA0} [޼BbaNjٱĬgNH=)Krʏ^|؎*$X㾶jCͮ!#%.݁f˾[0+NH'讲Β][J O'dnl$l\NlRO֞-q^m9~Im'hO>J,-?JaPǡ>$$UHjz=oO^g $3A.D)#PE)B@ 0I)UdiV!͕ ITHpMO1=yg˅+V$CsSdL)UYYƌ BDx5סj-@ ­].m&|,Ҟd";t-Hv,\dTbRm烃F~XQOU+vfȦu-ϦQBrCҥyMZ=S|wm?{&2T}Lƺl%:X|tUj|}ql/@@/A&!tA Z0 A + PzD[ڐSd O8񲤎54 .;Y-4̱NO^*7 ˾$1,4+6 Ӫ0{. *6\2N'b#h*3N9ǫ1|rES3 sTQAR=5##M崿0bU;_u::ZT*5*Җl `V骻n-dqY /gs؋UN3Fw_Y*]i7NKN2.ӆNbNb)!vMn4v1 hltcˆrKkM-7eEf3r&!UQgM1#Vby4Gh1bdS0g%,[ ym bj"( l^4M1fI,;+-I"?[ѩ] ʨ"kjުk@ZF sbAv N[~f*%{R ˥ʯL0 :k¾N,G~{oĚok[ZBh#$1 {lpRKoj1ͣ,iǭzLt8`\q ' )u"xsWvs}\B{0)gJna{l?ۜ7ƹzvȚf(vc\d:w*5CK&h΀85 Ik}nv]z }퇒^T$x"JI,߹<3g=C~xoG~DM/>+_׏o$O7w>@+ þ,@ NsAρ 3}:j%`P\H!:(z*y@͇nBCQ9G&HMJ^yD IwnRE?UaW+rjIdӢ5NHcO'2DIh$Q d("?d#\t'R-}AhE;돑,DL |xɶ#*92^h"a^B|P#DJ8*-MuXβ%#(/%)n&32ٲnv3הe82NMʕ# !B /@,4 Aw3:t ӕ!?CDSd'8@TUf7(9{JDPY>ӈMPFI_LrhG[IKT/R5WBяf2ĥ&#PkSr %!oS~ok ˂FS 'v| |V V{ j䜘lS ՗PiWa4=Hovդ̬d-_i]QaO ͯ.5xu\T+]#d)tѭU6 S6g;XMGg!c+QZ'ByWƳ;ʤN>UЧBOJנ,<*vוeZ>Hf*]o۵@ҭzVӽ}e}j$ikK1VNssMe\%\Wwo"uK榬=oC[Ûx.[;J'I\`UBX!RLG'դvLJ דDngRfIxƉ婇s3_^EuYLz=l-kpilꚆ=(UkOR o[#)e=4-hz9w"i xF*0<Adوz(K9ӡ4sXݑI sL_w&GMVS B)Dh]g{1Nv'c;H?&!lܩt q[!H$V7"v{31vwSoJ x7t;tiQӻ57H2jO6w%b#ȸnw5tAldӺũ-o6Ssm96x)tN?M];\! x=~jtθB ^zSޏ2;}0-wsSn?4-P"9ܬ!Ȼ16.w,N-柦0Pd&Ee_Pv_Z_rb9` uc$dbddb#WaG3dWc7(Qf'c؀-hctz4#-vH*Q5$7~Ovdec#ae%6OcH6FM6?xFS_؅._&FZY2u-f$f K`gi6I`q7'g!&z]~]XgugO8]ރgP%Ph]$ZE^|A1aI%_%Ee\R V|UGQ(VxNbG(BeI 2eUh, O5SUs&c, \IVWeqZ!6Xg5<1*E4ZJNؠ_OkF3ڠ)*zwSjvIeD'ڞzجs0L"j:Lʆ:t埊NKʣ=:ZUZۯW=鬓e*XÚ[vNk& \5xJȔ馄vʧkj!ũ*Bs'۝ȅKx;J# E;j Z4zTZ /‰S}jR3`] cHJUjcHrq.U j'f$7E\YI:`Ja۰uߚx E=I Zi4kX+y;X kTkE_@_J^:[5UNjfIM ;6[8)7;mr{}۲2K {TC $Y|Bb;JI[$M$Z^k$ӛџJhjĶ{edjJʼ1DUKKܣ \Dָ_%({u{`-z`;d/<:{ "Ⱥv [5-2TLWV'I6h\K!;ͻ4K+uTm=۔?[<YLϩ˽*{c{ܿ\jLKȼa6!:bR3UUe<#f+h ,V\̱*̇yRòwk{`?N ]kDyT4Zdl UՑŶ,EӺ!{j_yºGxZ,}J˞y'|˟*ɷ9[&-6R87MӼ@8 5-X@;J=)FC#ӿ -E,NԨ8ѬPܚDdYc{̷G/=$ *JJΨ{a}۷LՋfݨΏ*&dVl|ʫ̿Y4 פȦ笥 ƸҊm2"{ņk]V ܎pML;$D^݆lŎFN򽱝;N}KIԏBӢߕԒ ; ܽ8Q2=]ԵoܤʾԬ?F&C\(K+â]֪=\dތ!j#,juV]4(3MRMø*{_6j!;ϗAм|/NThTM,݄Az+MwZCǹ^--Rm ~_mXYݱ^ X nߤ̢J͝~k$a٭NaӞCo/E~+ީ-&CC=4vBnVLưDUT6ƨ@g),OXvY+)`~ pZ%Z?H_w+rl$!~pPyɗo=F_}_wOꌊ򰹞MzS&`־O"6d 'A\0aC%N ĉ RDG1dH)UHp#I&WTXpń/<'Ȗ4R!ƢH8SϨTʑ)Ԍ1NxsˉA}H(QWɮ*LpRhσoRYVEJԋ ׯ*n*b54ϛ1ۭ`dɢ+eձpYa~Ʒogh'TvnI!*q+'t}t뢫g>vzV|yӢ=S=S~~~Ͷ߷~+<;?0͟₫m`2o$(%иj.r$ 5.TpE:l$<IƎ @ H / "J5{D:Xd ˫î[A'v(IRF7,K%k2ʲԦ1ϳh2$ªMAQ1[5kL<߀;#kTt7W9tIT9=OU43TO4Pv%QV5r Vے Vz Z{kڰJd.[L|ZgX5]v ]\sW^SUWx)W_9^zR{ !,B>VSL AL` #JHQ"*jȱǏ CIɓ"S(0 UI1"JU\>DJ@ JQ+)AuyիXj+Dz2E`խpʝK!KLPP& EsBº+^+^?L-P*.˸u[z0>lAΠc˞=T4ClNan Mq)(@ +|sC)>νËOӫ_Ͼ˟OϿ(hDM)h ]7!qF8ԅreHy!P %l%v'Պ,$#V4zvcg9ҎV GDebI&5YԓIYbB[%Y)QSMabeEhR%ZyqY& ߜ^Ig(͙ѡ!?:&v99q:*(%Fay &nJgQ yjP~9?&l*2&Gq6{Br˦jkYN( ("ʭImkjzl{2޹Klvq2i*;,Lʌ~h>Ksiz.vevsƭʌo0 :Ò ~h~99{0KgAsg.ZQC@!˶:3g\ʑd&swŢ-}ZOԢv^KP.2,;B$+^ϊ6t(f ى4yEkc3K6BNV-̛,,mzX@Y=kXZeRy-?7|nJWrl,V9֩S$d$ErDZV}QQ1^KDO]!HCsIͼ=;}#kh#gW֫^tt۶A&[$]Kϝ/`P'*yIޏuCp͎:ύc[@!Asϣ\A wNq?>6vi{"C՞V#wz?vkD,'y]r$Ќf:~xf`B5lSEk5lj'`# S_AOAZ!a]vjtaX1fXV]wVi~eh|`g(X!gcBhKVcS!@hGI9(F(XyǤJ[XLf9ddQfcj{tlG[M9zĆ9f+(dx8eMPnMi(tiCVxDh/hh %hx]N83}X]։7VfF4!8g4jR/U5vhWB`lXFFlAvxFF@Ԃ`#8Q#adb[fUPAȈP[D؃)V.eMx،5؇dv>`c][ud%ƃ;cȌeޘؐVipeEEtZ":|mxp ꨑ̔>26yXxRXYPug877cxZ|Uj VL%jE&=TϘk8$GG(T}T{yF#)F9IET$Q8p?]2gA5'\FyFhWfttyyX9YɅڔdBNț %GHV鑞ٚg9\uZ3KIhHX=[Ɏɝ88iyQ)+Ԙ(qA[lIZn9i8=e˸EzơD# 3eLBtIf8 Y&9%%484ț)iB8`yBsUVM[g J `:NUP GHYX),yIg9JZT\VQ\i:vْ#I)j֛i:9Y Veƚ3ڞ N\SCюIO0jdy&lԠ#' *ZU¢$+|Š4ZxXjkUb6a\QEL5ZZIکWAi[]ZmZ:뙠-X4^XI]HYJYb؂u*!zaO ŜEXhɍoj:A+K0Z66ڪ/kf۳iLS57DJjJb.MٖUj ^奺ڵSvʬu1fкCsˋz_w[ykGVۣʕQ$Mj`1骟UˮJbڪRX1T!ʯT[:˻BW (ZAtJF'Pں Ĵ&oĐ7 Aʶ% k!ƼaP:y~[[9˚:[C#çjL\e/yȣZa G ˿$)i:|!jɂɶT* [d|{|UJUK_ٌHn] I&Ш"ҨcmˊUM1ղUs6Xٚ1[Z2a]cMք׃ɮ\мn>&֎Ѩ.{|.NحŹ.WWq~5_7.ìڦy drXHX"> ?Pˮ] L}^SQnWec]~:- .ϊn}pޭ..K O>\Lnń^L|Г{WᚏGQ֮ݤ*L9gֳ 34%hVnTB#ҽZѵ-縍C.ovxzln?DLܮp$XA .d)!J0"A2g̸qk vt(ҡA \ɲʅ0O\I9uɰ2ZDxI7{(4SP:t!ΩYnmO%LR%2lCSŎȣ Ӿ['S+_=T$=pnί^eݫq#C\`;ݮzШ@ <̳ӯAZ6dֱbYI6ާc.utqɳteCe_;oz= =r_sԫE]oz{f-^њ" l(# J0ۘ) <aB< P!?+ Q;qDSŇ`MF{Fp\G3oG S<"G#sL1'ĨBʹ'1<*{k2Cƌ(*I-S/9鳪*:W?u@Ftr6BvAw>W1@5kvSQ=iR cjöTΪpm^ʥw~sSX_Vw)JP#^ IT:&WQnȋ=}#e\ί?/?n'x埝귿~lˏ@OBl'H^T7 fBupCN¸p:"la wʐ+/l oF'2T]R *<U>rx݌8$9VbHD./pHH-~}s1! ꉰI< ;6g"u<&'@ܢU9Tg$3=҉/HzdKzpPx"*r<+Ig@D2̜5 h,1d"e>B34sL3i L%(GۑS"T/k&6ґl'';J_2W7(F~F\Q4aSkECCgIDh<-4Ac]Lr4R$q8:i6ҏԓC Qyٕ3*IE+Z43DR{rsMf Չ4]j6pjR5W< T\Eɸ)+Sܴ$B gS8*RP0)YCO*R kbPfJ~ciUeQ?k"6J,<[V8NlXK<ZڇV,}4..yW2Hr*\:Vrא]U[}HX2JymNJ[wQ6_6WYJR_^Yu'x$nmw}NH&T@42_؄UXU cH)3*!?nIc~Mbkqq7T'2qrGRd.PW%qec 19 FIEiV3hŠꚴO a;c{Y_U+ǻ[SQӛ`=jNCk[v[m{j~: $K{uXD@{ZCtj@Z(ڸ1 Yq:[8#˾ ˱R8KZMZ_2+'6~8,\zB6 [Koˠ9t[iyr:{PӾޖZ袶*F -H:nobfK𱁆+?;lqSˮz:m/l&'/?V 3J>- 1\.ڪ+8]UΖʏ},.u./c[,O{iiiNmԘT|g\C;f횚z),~M. -v6 F_̵t=oF{d/죧 wcnO[̳VnЉczުFVo'XoȤ 2rԣzc}/2I,X$R5tlYurYɒRhM3"Օ(l1S>zU{TRtx5eHnV& q+RiiZlM[ܙML9 Svl jEld5i66¢4nuJe[NϪWsiй#ضPqj=RZIrC,i yM*t vV<PAR-O˓A,97(# gCvs[b֊ld#9-˙Ȉ~eGg$A"Wr1od=Ӗ2@S̖$k^#9My[9E.A_2;*>|``HSvL)laSېg[m[b^2P[Oڍnߕ7 8mSF*U{]U2nR 'ww= .K ][|~䭼ܑw?9;~sw2m392xO]URkCvrϭs{T/zaӷg9ףnp{~WEew}[8>O/Z\Wk ѫؿ5? ohc<__|#qyωzЛ)Ey+Eđk_9Ro~Aju]{ ny$=clv7{TSEuOܷ>.SwSUgtP?Czsg| AW8|Hr{W?pr%h[ p(\{T0'TȀ*1z. 2{2( ؃ (T0ʷ*o;qi'u@`gW}7ge7~U8vSa]u_VaX~WMmgs+utE؄xww'q$GzGhn[QX785 K^VQ[^q؈}÷L耨g"aZ'TG]GHwz#{w8s6OU%qv*8N(tgsNcE~gmiH}͸NvXJmNxnوO۸Rd0PDqGwWyrh-GG$Hzwxy(J.GkII}X;:U~я3"qh1b%G7}1ĈMb؊,Is"XJ9V'Cոm˨}]~7IRȕ֍I HNȎtV؂1y6y_w.xؓI$O(;h eiO*\ekXdʄ~>Yw'ѷVI{9\^UԸu(Tțb蛗g)״Aؖf^tiy iVY I)@HV%9Ș ٝH`I%h$AwH{%yioY9҇iuT)FVI9כ ʍ ' %Y\ZAGE<4R *#3Kb"Fj8+SHxEҎZB։ՙUy {d\lT[jj1Hȇvs] }'o٧fሣXh)eYɜ,dڢ$ _iވ՚IgĨ{/SuʠJx.9QJ,xl U$y8xJd ?Z#Ѧ 3HJ8*졭IIʡXj*دZvlJX};mꝪZˊ[#Nhs讈2T  ˫3K%yJjA|aF7=KGJ!GE{kxYKQ+@Ck)GKt |ڳ SMˬ@pjqylX)끶s):dkQD$1;٩jj!{{[~m{;`'N)ۮ?۵sċʧ[j* TjYA{iA*k›]k̻%k^^ 4ݡ2zk;>[{+滑gA"ڷ-$ʷ5kM^JyxbU3U˽ۣ%X+ ,)!HrK riЧPJJu*D( ˒2Sp`ulճhӪ]{0E͂ $8 Kv˷ǣD *N,دǐѦ)Js]ڽ9iϠCZ&Gb]8Ƣc˞}1 @WNȓ+_μУKNسkνËOӫ_Ͼͧ0\]TW_GO(`lu 58!ut!YXUr蘇eS"E |"PXXҊMB5bQ$ aJ*dF6ЎQ!)9"%_EZy YɟI?^2Dž9vZ'P' H' ㎎NI(F=ɥi}OAJgVy$Tz*U2B:Hz(yd}X*O飣:gqk)%b45'_V*- H۟O'}$olB#"ip*;n  Bp|[ #!GJB e.$@"FxY0!J7|DQ, ?DAmkKN/fb)꧊5`Bx-WbGX!Yg, h\Cq8\\7J"FF鐒krH-B< OI=:g;dO\UrOo)\2$/s 'Ir$Df21MQػDiN3 )>r#\7E@gY$5Gk|g9NћZIE~fTg@ՖqӒGjx&@4EQNTh0h^s9#e, fԖ,'9KӘztHY"Ҧq eN ՘5%LQ>S$L iL}Djs9iUS)_)SS_@OZP<:OBT7 f]zOաX YϿV`M(`6^M+2},] L͎!aU\TҚP aVBmej(-w|{$!xF*&G&mH\.&яz/ЍnLBr׺, 4Rq~LB!=b+u݃^ېh@]ٔ~B}N-vh9^;/It#tϾuznO>+ULg}TF&^w;_ʟ[||_gC_ꏗϿïB|W}7 y{\#Znçnwn&{z't݇zPgqfw{xj}w?!KgP%Ɖh5?U(f'QrLA-(lUr1]|e~~#Gw(3B AuGy;xYX? 8XWWcцH>玿/营ZH'|zM߈{8@ՋAF%hXt:F)78HGTq`(xD4yxpiJ7tX7itU駈Rq̨Ygf(|v+(F"ƖO)g4z)DSHxj$T'H9ى҃,ij!fyÂM9`yMD鳙~W= C }@{2'DC1x0EHٛMuؘ~~OHiYH]_)iGĐhi&|! gIȗ~)sYX)"逈KyVg-3(dfD.!'ٌ&KY%tY]CBC+JɁ-\~ɜDEi6=Zv]*E#) ƝFפ!wmH(Kɞ"I6H &݉[vdH/ɢ"ڠ;G*[$gsy&a) wnJڍ9t#BSV>4 *JdWȉ8&Dq92X\L(yڨAI!يzZ8ztz㊍lڥ itʛpJV>184Y둯 bX[8vDCz!6 JD 7ۯǰ{?~[x9N",̒O2SG~8_LVql , ܖҧp{ƌJ&Rr5 l ۻn[şh_>Ȉ֋jlɃ E,ʱFS*C,JH [|0S3̨}dǣ+us}ȱǏ CIɓ(SDXE_ R\ɳϟ@ CKFcy0ń>%JիX2~fVIqS۷pʽxPX@Mg La/mXeNK˘\a] P̨Swޅ| BѱW[$-TblͼУKNسkνËOӫ_Ͼ˟OSY?o feO`O &hՃL޼6/3^_|+p-s.p-k oI%Ƒ~%稖0rckJnH[ 񞾫k ݸCZ±>?8K;)y!'ϑؙ Oo #H3d?u/A'|&y?*Pi% zy6PF"P O8:h,  5zą# ٤Cvp% ;B,b#"*LNK:y d  Sű}Z I1(~dcޛ&1$5Jcfw32DK9q}g$GёAP!G0|wIɸG&!gd#و<.$jt#%YPd$ɅRb%'-?j:Fli>m?^ FJÄcH@IF|3Ib" DV(.!o3`:9 @&̜C'9pf? M"G/ǓѴ)f;_#@Ʊ$B\g*WLwYW:׫vchBm&ldQٷNylUfᵷmf"|+FfQfݕr7Sfծޭwu+k.#խ[;6s{I܅ s߯mN",5^]~7{{vNf) sIW\B}f)?6Jn5*`guRXW[}rN͟gy g{/sKܺp7i򐟑#sWn<{ܾa7'vN]oz{OF>jيEw\`o|YN=uvZT{?|p]b_1}~=snZ7k~Єߙy5wϞ+?T'Hy7yppGWzw'']gFهqgE5}T}zut'WA7w'HW)(s/V1}3^5(q9hW;8LGO$X"(gLߗoigvGG'~Ejw ǀ4yVw?h\y'xvx(,ȅWxq81{}'}EVC(;ׂD0؃O x8t9pG#Cd>Qt'8}x8C5wxׄxQr'wȇShd;Xo8)qxH{k(rNX^rxw5:]H8x؎(}zƨ4(_ Sh'c[D ( wG{QǑ؃LvIn) BRtXvcؑF4~x`%YAyhx1)Go8pTqHw@ՕٓyNQIJ_֒ė%Fɗ\_KaM'da8%Pshpt)*>m hDžW2|W9Ȍw8XHhRՔ;Ry@YPHOɕ[^yYqq&77ّ4[6|op0&I%g~驊ئ'Ę?=dzzA9H)Y0Jz::y) kI YyZ>ʜ*hRϸ:}zjǝ[P Rz* KE#z=Һ?ۚgzCAE[lʓHi77*iy!Hɐ!ĵڵ k pJOh\IJI8˨ZR٘:ˠevxz>X$~ *ZD`Z0{qɲ: Ym;[OKG+I{KkڨM;QˊpJkjY빆4ڕq['d {A;:znKwPqA+z<ʸ[*L[n+˷Sw[" IEikk幹 ֫+* ۤKv9!Lې%+!,+\"/[)܁[OQ;âu,E,o׆;GܬSlxkCl[ll_| lĬkUBƛ[@vj^<}h:CF{Xjȸȁܴ>*Yz:L<}y:_F*m|\gLhYf̾9P8WXѳ bnm:I[RhȲ.E *Z+:{i..k ܶƛ//ھ(JHxc뮧N쌈r+\X[2s@*hJ n*?,œ*'维Ds Pܠ? J /ِˌXݶ2ߊ5Nn1Κƒpss4 Q}3kv*k=>;۪z~}ߨI63aK", Dt.g I,h%,U ; z0O!E44* 4vP)3

ɖ8[r$(b2%0#(b:] Y$c!9LmRLI8tdڣ;ixs̬G'C|r ='rԄә|"e)ΆF%t-K+2th@*W$ Q2` %EKJBSe Jσ2 5i?)z==)>OP s])lTjRkvjURgVQɬ,UiUiXjPzT)C׾S:eLqdT ع^Яq%buXȪɰL,J]*Wi򕳄,\X~6vb֣J%kTMvmovuwhˡN)1.Z'\.!";F1.ui$ەI3ɩwN*/x;\(*] y n彮;K)A/Hw$un},Epwά|'l 1w1-a"hN1_C}ngJ|!R;vq|V GU,$wMrڽnu/j)ɠGlY%4в_J67EmYY7v f6y뜝Y>}٬hߞVYgzeH P1OMύ2[QӣmSQYUK\Y?y̍f h-~~34:>4=9Ξn{}l4n mW#۩mA q+Rk.9ٷ'kMϻѮn{p Z4-[teM13k Dclc|ő]pL?Ʌ<񋋜v4C͚[fenU K.˖~w?.p;EW:Y~j$ejk65؝C^zi~,cyiw| n<{GÿvI~vw&/+ks7ŞȪGn+{_COu{[ozwSt&{CX&x}phCҗftѧw |7g|{G}~ =%}}x'i&WWy~L4iu?jxjCxl oyAyl\7K((6&}x(%7"G~-Wjw{x~SG(Ji}]("f؆Djhwvx2gs3\(H_TiM8zzoI%txGl"U8sSy9H;pCvWuXhMwxxl(>[_S}s X}(m|؁br,H˘q8c'XxvPuȍK(׈F֨XV臧_ӴXzhx%w x؇&RH Ih ׂɑ|Ibi(V\h(i)EYY9}nFt W'ؚǔw:ٙxؘG'ȝLh(WY Tr C#XɚYxiiIٍIjgIy؏ r穠ȥ|xJ1)izi*:()GZjsOzDʛ٧j*QZXm9Sک: Y κꧥ '!>,B?V诠? #J\8`*aǏ CIɓ(S\ɲD@JmiBLj8mtIѣH*]*R, NU9B`ÊKNJ:>9~Dk0) "P LXUVܒaB@ }̹!2\W_:sӟc˞` ʸ$`4K ~m+ȓy'<&ɼ` }]Q~*uөW4˟OϿ(h& 6F(Vhf !Qe ~fX(-ًa(`82#S=㎀ԐJD$RL"}Q6y%X@b餖\襋`Z8ŖMilz&IgIXHgy6gIwFśpɒ$IR):Q!3"hFjJHz eܧ".z&ºХ*Z EI?qcZzj j#j್jm$vlz HiͲm ll2&-:lޙj홡ګonD zmp.\o$ VL/Ll 0S,# 1pz;ѠJΥ"qĚ\gr#+]mx9#زrD [jT{RзD֜f  #^(]/5ޥaY_ifi_}~4S,P9 LHxNL 6[ V5pA nG8)D(Zx~}7qK;X~7m3mUM}M5Vn.]ryMܶZ>Kx ~WӖoL}ODyHމ߳  nwj}P3/aJekrOS\H*yzy^DW6 )}yoĜ:^T;Qu|/ {q{Na'Vx |ѫbh?Z%Q[k'܇ L}`:h[xs~wu(pH(hB֗yR:׉DzH?Egpxkl刂ԘxHzX芓['DhEq؍qydžxňU~8mX]D-X8hSxVK(mͧ|Ϸ{] iȐc{F8X脧ngso؎鈏x( y89D'hr8)R5oȌg(Qd(4Y(DItRIuj~:Lzz$Q}U&Ljzzʨ:񪗔 \֩ :遧 t$z) KʭgTZz]Jeڡ֊_Z[xZᛛʟ#:MAK KNjį*ɗ:KrlZʝQZujOQKk!Lj۝&D?KSԊW **cJz|;f*rӰ+[zr˲%At[9Kx{qK`ji[) ۖ]{W{5{@NzR˹E8)FoZ}o4ZI#;u11;۳#vz7Ҕq7'g:({)kI r{#+vk˧+:b>BB[B%KIYd;ͻ 뿱m 㳻!lK++ -,¾+ěкvʼ kyֻw۽ë.KçEĥ۲+{[ĭy_lmJġ{9dtܢ%LaM@:BʻK1JPkȕj7Z A5v ||m o~jĒhƘikčʝD<ƴDyDZܦYaF Ĭ\lKlDZ+l\nH o˸8l)ɿT;M-!1, H*\ȰÇ#JHŋ3jȱǏGɓT˗0cʜI͛8]V:(r'C*]ʴӧP>HШ Gׯ`Ê A.SPآ)8Kݻxe@J2&߱#pÈJ0H{BFU˘3kbJ#S\`ǛS^۪'w,ʭsͻ+ܒ'7` p^μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6Ю6ŴSCfv+k覫K+Kڋ,,'. p> 4gJ"K\-A2/ *l֌gm 1L. Ek1ulO̴X}u̕-o׮}'.6_vמSn~[|I_90:C6@qml<͆420dk<? z?Ђ  HB0`BpO O^'C}}Fx"+[H-`:"p@GE- ya'Dψh\Z/;{#(ḳ=Q},E?  1F~lb:y!$#ӸɄubEI(GIRL*WV򕰌,gIZ$?r^r0[a<2f:tf2IM^N&6mz 8q3<'1tZ,:Lҝ̧>lj}rHB P=1J2(DZ<H":уӕxALV2OQӤL ә2(EqSHE+ԡH-A# Q&56E%ԡD,JVMiӫ* X`$kTVxuTI?&!W*) Q2U_PTj*V,6Y)K'Lbիݪ(![zm%`ьʵͫU{ QiT(@_S$}lf͊iե+UPv rX榒=6*N7k([QF"hQZU𞲦w[XI̴u~?/.+Eo)Wjq{z7Ehr1;amrJRR]Eװg[}ĸ-+ߺtj~3VnH(JTcHurm,ԧVhUtraX2qZ4im웃:smC3\=ļhG;Qn-]hz5yyd;[3%:ݴGLMD??}Ʀ!M:6g@!, H*\ȰÇ#JHŋ3jȱǏ= *(0ɲ˗0cʜI͛8izHJK) 𙳨ѣH*]ʴӊ;{|bӫXjʵW *U]˶۷pAPd+˷߿ED+^̸=Q 2I3k̹3ҺتӨS^PIK˺۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&68ŴSCfv+k覫K+Kڋ,,'. p> Wl Kr \-A+0[rAF6;g׮!4ӒsCK3G:+Z;uն \w}^s{sԎ=ނ-A{Fj<6ӎ\P,okPW}-5Wa'8q/>-B.5OQ׎g6vOm8-~׍xY밗۸l]V9oyJn꡷\Tksw޼ o}+n6ӭ7^vo=回6/| _Ynh ;qy_#Bw?q_ǻ:66}_ |ٺ>f-ЂƲa [T<0qt\[S zz:&PC]Ka،F7.F-^C[C8>5ra,Q} #HǐiwXhq}rH"PӟU4 NR 0KwnҞgFljOYvԡ ()*RQ" GON҃$TВ2DCN=ML0SuROP5%OQ UZU$j'c~LWkπvj'*VJMQ=T.<+ץhO էFUMfV+ְ`*dӺOV! kb-qµrO Oz֜$lbWmQK[d.63>Avm>cj5Nۻ5l]zO6WP;Zn%mk; r-'g3+\䆵sS6MIu NWol9أ>e#p a SDU-Pv״nS5 8nTǛ7-n*ѓa.'NgXoE_;9Ç%rQST *ZC3!a-sٜC@^Ċ9A063nBqγI=_}F9 d !D-^F2ބt9!, H*\ȰÇ#JHŋ3jȱǏ@0ȁp˗0cʜI͛8sUJѣH*]ɘ?ViJիXj @O\z@BOhӪ]˶[&2!l˩}˷߿:]" ^̸Ǎ 5 Rj!k̹grfwϨS^͚a @ӭsͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫2:ŻSk,l' 72 JL[w "0&7r 0lﺌ |> /ADKMsF-GMgQoZ2_ 0KwuP-3ӭ=z xR^%-OC.qi3L+?n/Ҏ?v[Nݤo|7=|<~/C0߆}S?q̧@ICD@|.cAu_\[ (+z83a.~k&qmàuGg?hwBq".}=D^Dpkz z1x_6Q_l "pmT\@D-j̍{c>9&0c E͐~"E: 'Iɗk%ņmQ (1PfZ'=* C(gɱTRҖ0,3 0IbL2f:Ќ4^R̦Tn g2)rL:yNrt'<)yz̧>~ PM6ZmqhDJъZt$ :{U.DgPN lyLc>T׌ձIV?<`}Ÿ}Y[b-S`Ԇ9r'}3 1L3MSS.}K[^vvԎp3g@:޵)MZ,e6;wlbߚv']Nf ٶ56Oj 4 !, H*\ȰÇ#JHŋ3jȱǏ'(@4YE$*+cʜI͛8sS 0d =# ӧPJJU)&RtՄBjJٳhӪhDశH˷߿@VRM;0ǐ#K d@UP)MyY\S>MۢI ak\]-poȓ+_~u*8t^23سkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$[9S,0,4l8<@Bm+5+8; TWmXgmZw-4^ vOMhaCrLHߝ2ACݷ@^KAFˊ۬7g+a9'8˚/N㈟9ˠ\tꫫ,ް.^N;̞OM#y7rߎ{-zlPI7=,}w;L|#~/Wkrz}#]Hq}\w |Y$A!pxY< {R", W?lw! /fkf<ouQB:{`7C &zB,"'ؑ۞6/naаBPw\Fѯ~N3GHΈc88Jew`gC/r}c$3hH)r{ N$#W 7Gzs]&x9^n 7Ԝ,o9>YjpDDVds%28@e6j2IͭUt,t2?j88Νismlev~YI@JЂMBІ:D'JъZ%]2юz4Hґ%=JWҖ0miJcJӌδ)NMӝԡ@ :Ԅ=RQ:OhRJѩRզ=jD RrըVXYֱNt@ѪVHjֆUMHzЯbԯY^+UrHE[X6T4C?X6l^ZNh;+ڣij-i] qmlTvEmjsշ,AK׫J#\$ ٱ7BZT٨uE+얶 ih VԂ׶Zuu׶oA+߁7Y'˕T (߁z5Fﶫ f0ck` 5\^:nGLaC4e:Y<۽+^̸q; l s?3k̹sc S^ͺNȘ,V۸s}0 ohs ph>0`>B΅Y#`d @͛H^M?":1|K!w!^PXTbFCuqk<ȹ1MT&Cu[<(Oy%C^?pwe/f*N~~C ƘOee0 9̽r\gz~ֲɌf#ё}3~Lb8UЇ;bgzcy1|VAYjs/{hE9*pmgNVW󒵻_VOQT7ȣFkY{4}ۏnǖަi^z-ˌv~$۽zߵqcRCn_Ꮕ8e!, H*\ȰÇ#JHŋ3jȱǏSL' HN\ɲ˗0cʜI͚UR(icSW&E)*]ʴӧPJW%'OCH:u!]ÊKٳ{^՘`$z@h˷_&wV :EZAѿ#KLyl5\U&@ӨSNkupn8l sfiS ۻН@ `, 4ӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx|߀.=S7G.Wngw砇⢗n鋓ꕫ똻nn.:ラ|O=˷nG/Oo}׃^}o3ޏ^k~|SA[nxH@_o NI]#u|FD$'@ʃ82O}` ec KH:!P|C A n* @xH*N6<\w>0XW2*yB󝑌md# *QWF #=8ьD|97ёDc% %eGQ7ґ bKV|4e#Lrw\'[CPް>,$#DTr"%ϨLVʒFh&SΘĥ0LgJӚ8ͩNwӞ@ PJԢƔ*FMRR29u*TSRXͪVծjժ^ Q*֤S=+Z:U2[Jנµxmj^z׽~\ Xt8El`2G?`FU4RbVQ?SBձ3EmUUK*)& Ve=cЏ֦ ,o};Zl[]ܸt mtӵ.uS\";ծkbK^iz=Xi*Db+SWznOkZ䎗9H.Xk\X r;.uŰOR4[mURjaW ~a*7/zT~Ri#z,rr6te\ԺָV}/sϻ 㡶ṞlwxE9=^+]X沑iV[8ۿ.4xB>/Aoλv{Siﻸ;S|?MEyܯex'NqS'c7iƶOU_ FP5NW5 !, H*\ȰÇ#JHŋ3jȱǏ @ b˗0cʜI͛8sLQJ%MLΣH*]ʴӧP/dO=jʵׯ`IѢbӪ]˶۷VQd(ܻx郗tLÇS<+ԧ`Đ#KLsc̹Ϡ d ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg5lSt=?^-dmhlp-tm^|~66'7#xKNޖ_^x=PsN@n:ݢ߫۝zr٤+.;l>>9}c{]AȷͷCgxګM߫=OQ~^yOy=]?u$ȿ9s[6Aqc"H u]&B !Jȿ~C\?.Ca\χt`AMPe`Aѐ3a MH'0RTHBMw_b ECc܈HD.1lg!'GYPe4`E2=2H&PjD$}Fic4H(bxFP!(W9FUF~e?I4N\<32#">4e;:󙲄`9%o\wӥDB#*wdP}"2ٙGf5Km\@P) ĩƅs=Iъ΢4;@èHG9^OGqO#B7S7[JA$+? PJԢHMRԦ:PTJժZ?Vծ U^ +S*ֲ>fMZֶmE+\UҕvY׾u ukQ=bX&S},dJXJ6f7r6G?.ճz4R~ePQZfn5K"Hi{\᎕xpn6˝mR Y4.cjf.Q ^/fR^׷El|ܡ׵F*zҏItvD/,X 6_m{`W Fou`v sCr{ tmmZbxE0{q|*ǻ ]`䫎&iSY!m!'9 民e_<˫ em:LrW˘Yfg̉-#cE|9ѳ/7MeN{u*&Mjz4-FgMi 9ɰzbFŃp,e8Ր$D=&KԒU+1o7֮-k6יƵ n%#OAoλ/~~ a}3J#?vx6ִܲe#[B<8uTs_#?WXW㋅d!,  H*\ȰÇ#JHŋ3jȱǏ 5" Eȓ(S\ɲ˗0cʜ) )TI1$͟@ JѣH3LsϤPJJի8 (PͧXÊKٳ9۷pʝ+Tg ˷߿B]+^̸c]Sqǘ3k9$s@mӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dm6ZS=?jp-tmx|߀.jM'޶7~7G7WngS{ᢏy馧@@.{킻ߺ9xo|G~o/7A-է. 2x] ^(R!eъlc -ҰJL#7"NI4p>6QcWB*7/a,XF~^$7DIuT#&3>S"GPo!HO R,8K3^]/3a)J!bIRl& (2boivL8@d4CGzq}f/5s tL?]l<(-yi$)QN4NL;V(H9IV/L0;zNj| BFJ4wNӞ@ PJԢHMRԦ:PTSPXͪOծ"^ R*ֲhMZךVWu+\*׹v`סըͫ`KX⵰a2}aXFf7rG?|ճv4R~6eb_BնͭnHiu\~xpK"W`.OKVׯjARٵnbWƪy}vŽQMOJ#:$ _7lQW`w /3^.`>XͰfҷ0gT&qLs/lcx%덩+x a!Xmt#;4qcX.񌵌a.k-r\6;x%>S˹a2-k,ArgB9F٪f ́7Wȓt[Dou~^-[f/y†LlEZ*dӺΗlr[_GC7T.uxeUSNUXQ[`cMm6퇶Mm?Yx/sfqϖWvqEslŢՐ7k}{CgmonEHT?V8a%؀!,) H*\ȰÇ#JHŋ3jȱǏ= *(01 z`I͛8sɳϟ=d) 8 ta1@ @ӫXjʵ׮B2e үR $0۷pʝKפ %[ZÈ+WޏU<@ O,̹ϛgZd,$ װc $ɷ 2iܨRУKߪ&~rOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx|߀.n'7G.Wngw砇.褗n騧ꬷ.nS>?/o'7G/Ng߻w<އ ˝C}ޥfue~bl9+}cW\0r _=p?v._'2ѭg<ݿF6οm;ݴK:1*׬5w{uroy-B{}oإ;w!,8 H*\ȰÇ#JHŋ3jȱǏ@0ȁp˗0cʜI͛8sUJѣH*]ɘ?ViJիXj @O\z@BOhӪ]˶[&2!l˩}˷߿:]" ^̸Ǎ 5 Rj!k̹grfwϨS^͚a @ӭsͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx|߀.n'7G.Wngw砇.褗n騧CM.n/oȿ{7?/=Oo_ww}'?~̟꯿@ßԷoӾ'O}]u@:+ w5Ю@ jw?xτ$L Yv/)Ԑ-] o<z?]aWQyCQD)PT@@9qKbrv1]7AP_g) B\qI|"E5=}$$lX7;^4m=E:(F>a]e4\?J_v6dK{ ݴ^tt& nl'ܴM7,({c_׺o RO/ŋf|#1Z>sUwegr+'VE:ϗb鷅p>e+7Yu7ӷb7m!,G H*\ȰÇ#JHŋ3jȱǏ*) @`˗0cʜI͛8s֬-SIѣH*]ʴ)ƞd鴪իXju&O\C׳hӪ]˶ǞRTi `*̺˷߿uL ؁+^̸c<ȝkPk̹g(iϨS^z Pt۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx|߀.n'7G.Wngw砇.褗n騧ꬷ.n=S/o'7G/Wϻgc{̋O觯췯o=gO@ ۧx<@1} ^H ZP ΰqp DȻ5;GPs 8A8|_BxdKN# gD$^^W)ְ'=,.``H!ΌT9|dtEE ;/fqZcIHD F xD%rb'H*r򓛼N"!OБ;C"w'筲?IS 0HL j1L&nYVZ<&)M @8PXsSgyDj>s ͤ=U4XE:̂zt נˑ꒠3i OX0N"%ZȗS8ў"3>*AzԦ6j*FMsxԮƑ 22hMZֶp\J׺xͫ^zֻ ,Y*¾M\:d' YR|,f&],h{6AiͺڹV]klCK[MmsZ~v-kw;[ lqm{ܻ.nIУf.vK]w;Uh\ҵuns+;_N+&d+~'~׿l0u |`& Ml%LWINk ?Ô ql4La-S0la.]SkÏuy*2_>uW.5R^J1vg0h 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸kBX`Q+,sSLaP%@6{.]+Jj,KmiKq+>.kze ?hݛ2S{S,g.,iS :ֲg?7#/&^봴jo~ANtуy۬|?_{EC+rDn_N3s}~7@~/_AwYMD7?jjD`O9n @ (0_ǫP4DHo8ŭMsG%5{q{%`O=D wfq"-}D*Tm QJV9Qty~%(P} c%ᇶolqj3'1O Rvn,b0K_SOMԃ?f,S3`I1hNs}]5jl[YifuT}-}; [g,bg[>te'8vUx%gI*Mfy$l ݭNS{%.J [Mҍ vM MxprS`4Yd℃B6eSd*XM5B(2&{zq nkRSUlxsVkXh؉QuAS zwhHN+(UXw\}Cse<|$7nGrbRPw #bBFZYÌ!NNxXH::geh^UJRl(Bs6e`WwRu$6pG҄p#y瀖xH \Ȑ9)}'6u~WI"Ըgl/{#نvrwsF,ub0)E;T|O${Ɓ+~>F TWg|rw8M)v 4wdR9ր먄Y6oXN aIU|cI>QÌp(87wzX,ܥu Ai^u`^8hI{ C{W urSpW2tHnI;w:c06udiV8f|Kؖ'9#ҎW=Ht') yH)!fCsO&THc.2Y$`؝Q9WSVטb\f9kف6/soa"Ȍy %7'| g8RWqӃ(tvV1퉋#Ix#h+-ZsX)c5j久'ڀH,ڇ3(`?zX*%Zˈ|sÀ^Zfz}75~!F 'BjAbp#*y|*C9|(ڙkKBnYWf'(hY㗈&tÃ!%aq{566窣<ÔɋqA=ԩ@J ^o)hUƦzժ=z;Sf3oz:!i|إ%iEٺ`)3yCJzorW;W=i ?iIxI oۨզAj K}Ø vIw!(EbqW'8%H85Tɱ6 +Ai4蘸:pNj.[eJDk=Gu=VLkeOThu2Ưc`[۳rx˰U;ڷ{ %8&ě&{;Nr qyuJd_ɹ;kgW)u;ji$쩺|%ʍ&vaz皼ȩaؕC+*@j͆V lϋ炐۶K;)\xP'lK'Ji.qkdJ[kK>_`o6w9xT5;K&`7'ug5k؅]xpܳ\d1eQN#Ʃh|M),p+I^QG_ !3a3yTy<,gaOj !dٶm̈ sɱZ R5= |6:znF :Le\v4]v{/L# &<´̎xdH*ڼ5c۳I 3fʳo\Ψl;γr²! (kWyFl+6#7U sRË[7pRkQ9\Eǚc ;Rje#ل7|IhW]Y* wWpEqt#neU,|W \dh%K-A4RЫi%7<Ég7ҡ[? [Sd_dS̵ϦBwS#BUԡ:x0kPGCJΆM ;ҫV&*⾼(w緵O |0{^~ n>^h&;ޠYފk"> ^$~тm*,~!Rce .->><}7C ."KG1!NL-Z>i$;_L.I].dN-t`cZ?=β3A.wnOg>#儾Ba.5HeU3,Op@2\P@A`-l~ɲnޭ>N>IOk\, w>7N^(=S`.䉞:.eŨV8:nO`^Mn^ڮ4.>j~ jNc^>(;3>{-~VN0Vg8o?>@dz~ϹJ$ǸxГ^0j9.UAbN>)jl?.YN1>垩~??h?_?__?/o_Oȟ2,?//ݿ?Ooȿҏr/XT!XA .dCEXE;#ĉE^-#UTX$,/Ɣ(R Ł2ޤ&΄9u9Q?.]gRBHWڮ{ `U2<ߜ#~\T2Cr3hc_EL;4ìS.( !,*S H*\ȰÇ#JHŋ3jQc THɓ(S\ɲ˗0!VIBȘ$ɳϟ@ JLD+ӧPJMyTK@pׯ`YӨX:"(p۷p$km tr˷߿=e+^lQpdfL)h@ V:/MӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h89UB@@j E TgBi{)}ij^&AgbIf@Z}h g%*PdMjo i$E9iK9hr&?z)wJ鮴2k*Ŷu6 2ъ6C֎zu'AJ.@ n{Л&)m =묒".._{Ɩ{7,$lC'b 2c)~I0o.7weC=tg:3E\FmgW[M;*SvҲ}Yw_'&ƲJ5n7Cg]jv6ݷXp^}ZRtGS5~) [w'[ZW/eϫn9ہ\&vI|QQYY%vcA(\_$<]f};;%*s]2E*t*Ub]J&0 %ݰdgAlwBo]p(LHvO$ .$S0pU%8XِVN0r+GIe7iz\ޢ2I36( Ǽ1)1WwtEFqX#P@dIRc%ty#-2H>>X$j(R"텛$pF31ʥ%D^"Ӑtw+nI\],+w:er$fErBd0ISJM3kGot:vsv֭ZFPy\ d(IljZfRd8aVhjU>WC1O\U=3aR *ʃ,T/f( DZ@q J4ņ,'9$2+ɏ6ǍaӞZ!(M؂*OyqiYQE<+WSdf$$7EuY]+:+yqbZTJŽ'Mb#MjqX!wmlS'KY]:pI9t "Gk˽ݡEJJ^\$g Iѐ\7yJzVr+Gf-+Spci=6υxkK.7իh`{Znn %'^xlK<$J#wWw5UH̫ '+ZW 夣Ic{bQSM]>a"1׬e0D.M;cmo8t 'zD `+s?N4RS (tS8gQ$>֙]0mŧ!aM` 'EILTKu&\Oa"4Cr-a4#˼4Qj).]Nj.gLTD3 tru#S%R,OT]RM9d/"qxE#FԞB';0M(2A;0~Zwό-twW9sgMfh{t%o~+-+j3}3E~oVweuV6>(fj#5^8ξ/u%O|3poʋF_>_#qw? xK*3M-rg_MܤITۘފU6arUTvvhuwO'kTg]qkwi$zyGA(swx*r+kWxxsS.'_4X6p*XVv_wvbՃ>Cn'Q}gZ"m~+x7#c'VK'h^f.ȅUyv7VE34bƷc7[HViztyӖwD4h6z1lVZNhpvHv:~䵁4B$06s>mq| xpH4QGUEs.}Džkva`vx僀bi !YL`Pr27+0Fk_Hݴ[дxxҨ2{Vih|XӍuԀ:(ׇ 7k6l؂cvL (XM?wYbfbmw#uXYruEyS]hI6aC.WS&'vl}]c@ 8cvI}xIQ6B gԒǎO9Pi{Udtzć9hkxS='@ɉWn(Wh2$9ܲpexJJur `F~hqbv淍 tz44~2V89чn<'$xgW(wEȞIiys,H8Yu@xلY7\㤇aX\KU)gqM(Zyfjg2U.c0?5c旈&wy9y|'mZ9cghcED)X:(:re]4i4w~8Ebvs5i^|?SfJf7WY*],jHYvהW(3XB ou#ט & yg9j }^q7rY7-Iߩ:OWɤևmzyhj/B)x6w{* u"yZfz㚬]I)Â:. hx镖5]i`VJ{ҝZd@EBiYcZW(yӔ 'a3";A뙲h8(;qOOW{Nme>en˵]n8qbA a*HSD1ibK f)dKYTqb,jbH'xמʝaٸOPiD*BEJ> DiaGRܪ\WFX/K'Kt;+AVGkSMBZزzZEfq]Șx .4E%g{jK#xK?WcڊCا>cp:4LuZdkrzl8$ lU'L*hddZC軌cJdh}m2|!R[ d g)0L奅AmK|&3@zŅ-Ԅ|/ ~pYJ4Z-|×h95r~%=2[k\&mSlrlʼn|@ "x\M1{6shhf㖨Z\@|*źU3;X'fɝHܢ4ghU̬n$9TGFK 0[L,1Kʹܗ+L6ZjY6Zh,syj | ꘻7ƿ.<~aʜWkrPs;},zWbID铨f%ICzJ '/[x{φm{kn;fcverS9v+[ש-hڔsxtـBiMȯ[A<ҝX=fNi46zdyL6uK慬F͕;5LS(J[9ŧLW-Oyw*v6=,=`Tl ƅ ǪllFbw_[N48!<8ll:z0w͍X嘩.11<>j$f@^TcbaHALo!,*NV H*\ȰÇ#JHŋ3jq#RtI' ɗ?I͛8sɳ&Ye \3R)щ@իXjզɡ]>HT ӓaP5۷pʝ1Ew| 5Y)%È+^Q)V]*U0bk̹b#Hiex^ͺ맠UMmQ.8Ӳ*["NiУP$A `2]3KOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌9Bi'aF?XL*УXPVE **Ja)#!AƮ:j&듰1쇓Q,f+-m׆Rq+k/vZkzpJ-:KNLqB 1ݮ+0,4l8e+ԪM.j+-0 t}NzJS `wNW !!jlfˇ@j7XnlrAPmm^n?sj{-?.Wng"qi4AHt١9>{뱾.>nl p 0ƒ/8?ogw}Cr?D!F-_mߓVd.mƀ a@}{ "2A>Ek+ pZF;dVZ-a,R, g p3Xnx I*# |[q账214l5Ki9" S: dB`F:~.:1d%Z2#@퐄s]w9a)=˃d0H/:y!;9H(qlJX> \$՜ JD\zSK0,R*8 cHtɺl1j;a%R23 U#Ki\d6Hzqp4azB|Fg,!0Pa@EÀ }g+t5XN<>dtYJI'JMJ%g:s}Ἀ+8ͩN?FSpB$;P-SEˏrY#;SA4*ZN} \DʰGfR͐MiʏlT!S7Py, >5eSWDϝ=(G:9V6aUKtԝVqNuam@K #T{=\5JY`2Zdhb%uЁV#^Sˢ[-[ۂ0liS<,WaY'n\ΒUVMpHo nŻ({62FW9?zۉ0|E>DqUыV80lS.xGL~ԟZaHil51~PM"!=.*cy ɎElGGM0| Ye;*"*aZ,֗2X] ?qk2x]Y@7l^|h\mdq(WN"Ёqb:\;XΊ hrxОg1Czm Pc%an|l+OVլD=zkm,m3Q,ٽ=ChTL]E_^.7_P[>*1CKVR55p~;EL]BkOG8y^ON$%N$[ koХc5sZ1썋}N53ƅzy(5 kμl ȇS9#m{T#D0wn1 GO$ũJmHC?{Z`÷Zս iʕFIq_ -Z3bvs5wb/Q029Ld'GgO{e0^^:g6u}ó&:b ^]=&@l~ڗ/)f2Oo_ y(gMۢ3.O'e~T=rgh=8|Qv}rJsȷJu %a'sUh cqlg:(x~s ȁ͇e,ѷ7*%)v4X`hg.(qEhobWo2ǁTXVEchHmǓ_{eHtdFԥ]YTFxENI'\C<5fBoև*7b]NڶI؊Gf2r786KC+[CaIjh%Ixf5[L+ wۓ+%[̺OkV[Vyy[fHirJBvik.y5:nǂgv@Ttkc<)g)*{ Q,aSPXS5*\kh4z7K,>Lf8x{@xO\ #q]3M)>$D}vsbZjWƃ$4\c)TxGk}S)+J {3&l\C?Bd~vG$2<\zE^dcſLŏ[v;al272W13 4ť#ql9]OD: ʹYdyԅHV g&u)tnnyhLҲP{zr=P2͏+ԌlKIvmYJ+KK޼[$|]v2=Z2Y}=o̷6L5[:~͔y)_ʈ:6tԋzP/н>-ktʾmȻ:ѢWkܤ!O-WiL+ ΃L]r|۽ܾxc8gM llZyxs֗8ܪځV-ey g yym?[ )ʗ=Ht]&.#lmE:A'2.#]=@ щZ{\SXkuuIBox]4;u\WkZ;% ޻_DeŦڶ)Ԋ , H`#e`skgH%=Ԝȋ \jM0guʆpL6i \:n/-yʱip xNv$&QđYlNMnWJGݤYgh_.DJp>DcVNaT̵Юk SU&ɫ⦰>C))#2AhAz Aq&q0z ˳l}1 9q% $>0 _7/n!XJFOa| O*C/JPLOL?WoU\O[VOVFs*%pX]>oOt_WmŧnongOͪƄA/Skh[}WΑ }[_t}{+9тy+]{H<+kYQg`g%ă#`C6ջiO) !ff5YpKh|bb&[ b!759u: q>^@5ole͢[SҶԇeE-mCm’%{[W|Oيt7kjrD4y˨ +Y4ě;y$jķ.7Dj&9r6}u*1 lr `hUNE.cfi8Hj{i5򦷛~PbkYwq{馥6^GHwvKqS=S5|:~Rwr= o  W|-uG7-(7qYUO>{N!ǁXW ^u|]V%Wp;Zŧd]eV=^՟laڀM cGiDiѝuF`aRWNEVgj1㗀]Hx3sTgu{_2@O $T(v"mTxJFC&fe h#:g26|?)ޥccD38DX)pFJeRńaHv hCFU2Kw\X^s{VXcLZ<1yvcs<8f;uB8:@|\vJiNxxmVvĂ%v5Qt`8_M{jȈG!<e]CQ4eo](Qe~Dh`>^(jS&YKH3S[5zm(O'tdzhkA8Sx~W+ &[4GZo;_&Cؑ`pȨLZyUGs2Hxic]ziIKu?KO@֔ X(u8&Iyh2Z\Fs7;z4hwCiGi.uT.O<]/EQcQySi͆蒕KyrXkZGewg;M?C 4Q E,5y/:gOxxyP3!I  I_~HI)hWYWX6FvquV!'QB=9JSa,bVo1TxkrW\_8\bJYtS+(urŁDcX39-9e1ydP*ݹV3hhJ7ٞ邚O"3qF4>U3mXLsiSUy- :sfџa;,chS3ZR| 1);vZ c_$̩[X`FVbG梮F‰DNJ.59h }1lVi$qbih^HH}IVX|*}5EoTE'꜏z:L?D§86׏fj|%{j5j~|7R)xO17#8lZאֆ#T9FEgeyHNo+w&ö{q:qTxg(ժ+E99ƨw6rwLxtxfR6I:^%:WnOkGK 94&_I; pEJ(\"*:VN cz`l/c`ʗ)Zn*qX'#4Y˳j`-8z<]$FvدXJ`{b[eצRzHg;nTtXp8Fvdk i_+{YzuDQ] .tO)XL*X{sìdI^kvʝ4(v(=lW: tWkc4p&M֬KD%\bg)ZY5tH|H={e > 7I6P@)[ڵk[륟Ӣ+R^շz<>V S,6!D.۫׍zD{'a7f+Mkty b%,'[/Ӷ+)2$4Mk[s KXJFG똣x2)\<`uyp5(o9X3k[-T`TjtH +'vˈZGo IZNW[CL3)7iq܊:{z 9WZCQL{wL=yl~|l`l|8ʼz{T7̎j^yGiwzcUõwnh?{u {t5t[貘Sm3<Ԝ1Iu޼1@<ǷZX\č\f<rĶKΔXU,,),\k}ǹ iKZg<iJb|7plmuLYۭk V cSWȐFP+(zEK`Dr#ylcˋKҁIgf{Hܕ8lN LݖS]@I}X cNHxIu9m4| |̟Y{hW5Zsts[:M͒=s 4׌fkLٞ٘2]و&~Ke jw@C|>YڋY= xh#gX0cLurG뎟[i[ 6lj=sD_]ׂw~*6H\gk̒SϽ6k"<6`A)nQ=MW xʙ#5R98`y]"> t~}UJv6M ]|xÚUSJZ ^mT?0)ሁ[ؗŋX*y ph~!WHMy.|["*ϣmE=^ᚬ XqM{d1茮(\ =hܟLH[Vaf~j~bJ=z=n{ꎕ`;_EJhNR_V>gU18\i0yWڱ ք&p=\ׇ~L/$Mk7j#MXO% E?a5 [`_/۳J"%3WRgnr&fX}]fV|f'vJe$SD'LTJ+dYh:q)k]s!YrV6kg{A=e?++thw^z^|w_~EWiy)`3`wa !,*V H*\ȰÇ#JHŋ3jQc Hb\ɲ˗0cʜI&5]V9 JѣHLALJJՙp"p⃏*KY&2Y)p|KݻxfX ҧ@ LQrdž#KLZnZϠz P OC^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DFY)L6MYДVAgA%sPFۗWBD&Advdk$mdbv&rɧ'u~v@wnyPTꉛhRgꏦ2g?siigr(qJJŹ6t:)*)J*Bg楂Kka"R. ky ¦lEr{f;mC׹A ϖD[%dR%'ijq_Q@"ǖl(׊(AdF,gJflAj3:c,,S$X4)73MX[%ʚV@"*mB_4͒k%'*]GtW-pZ$ ;~-JJd^kS wT ':l$6]ΜP~o~qƣh pAǿFv%͖Yi{/#j7|.>;4@|۔wo>;|2S]&3۴ 7ᡏGkHBE22PTؼX/Q|*h"OWzȸ&1i\L WHЄ[T5;s(BC̄>wl8 >$<$'s@z*ӡwu Oxuk|LMZkWǾEkJ5CtXf_b:9^`կNϋ?$y=,~;B.2FŽͱSd!(GI="$Imʓd4fB)Y(`>mk_ eJrtdI[b2 OL2]/U7 1,9κΒ'3pP;wDfgLJЄZ(CżirͣG3hW!-ҔGgXD%&'TaQ{<Ξ`;hHW4=Tܭb7Jx4 a7 mʭ;}eSK\>\rm.oZPjV;4["X+f.:ɼa3,9CS1o7V6ek ɴRQ, M0ۀhmN=\ƾ,163RTR:lY[FOqzb~&*QGԋf \NL(-DֶPE:˽a?:kfXR[5 YXt y7#o yA4\h}wDf,?' MΛg%l҈nLCzM۴M}"+KzMQN0S]_e|xdN'z4af 3+k[ >lRo4x~U}] #8Sn>DKtϻnƔm-٬>сM9#=ބy3'hfc7}]E>4^z[/rsJn~};vՓ-zDrw-iQ57aҍ%=Tlhi#ZnO͏Hj}mCp_OT}>doTOD{Ԗ^%Vbâ{q'y6b}E_י{W(閨w?&yDAu]rQ t_9ƁɞKV>.L$}Zcs27;}h*- J'E%G'io=?V6ZӠ[&$,y`9y5 (1^_4zzd=wBI*5fE>)j8/XixC+y^ z9v8&ʤu`z+ gď`SΔ cfcY4eJz'_jZot|ihP%0ԍxBjƂIFrxN1Z7ZHMZJڈWѪ]%/J(يZ9ur\ǔ/qVYU|Nhym:hvhzÈT*i|5\ jE8v7}2l+(/Xjj~wtoCX&S!ZvZůudkO٦2؄"7-g=i2[CFkwwi<۳92I$->[F"f;x19L `=ԣaPktRzpYY\;SJxo S8fq6osWmv)ҕDڇZMUğd5{y96s{z;j]~pRb&Y;`r[~9槆FK>:L홦o4{Jf[m{gٻ|Jj>J׸}WH)֦is.&;&S}Dcb_ YއM-bMr-IZAԕUdOzۿBI,̛,Ha @!R|Zx "<$nLiu0ӵSJw7i;îA&Ê97<79 ڎX06iK4<5=dsRS.[ZI70̅D.wӮY e{Ǻ_*Ē,4vW6YȒXSLɕLPEdU7hZ=Mk$eu<,HuCCWιicͱ+6YZ\w#9.\lMjhLL C\U|qa/,h$T# w̭x\䌰DUk_Z;/xsh c~Ȕ4ӊj8}l #lsLFUm8$~WE X^axzh֊ M&9Ģ̫{G:x8׽X =~2!<~H.3ܢ3o ≮IB\98ؖpzry=S ,J|S!m:ȩi?F_WƻmnNVp;lmLq{KAzj}~Smgl;`yKuI_ȷ$^  -D9h~onQn_o?"o _.1LNcs $@>D oSoVUN^,O PԞG_H"b!$;_oYclo`/+|b+AyEp߽Do#_l0X3j^A6D(q?5Oj$R_~o?vS+[/iYO&'oOOş}4_^D&+$X` dC%NXE5nѣÀ!,*V H*\ȰÇ#JHŋ3jQ#tH$S\ɲ˗0ctY?)ff@ Jѣ m"OMJJU>SpZ\ÊK,RzEӟkʝK.*)( | m/ǐ#Kֈ޹pf̹8\ ßS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)aa$ASLᐑItBO.)9 %@M6i@Q~)dN RR 9љ^vfO'AV@FJAj>lbV:y٩lBg~*YjziGFiJcH2*۔I$b1;j& *AP" &>9쎸kB+>jjLozKdy2*j~kfX&BKh ; qnp>Z2lLё NNƦ;_^ϔF<8)V qZlA٬*ݫad쪦b'cE§>Kuԓ*tܭN=J,ȶ­v pk$)8oۇ0q/oS?7^ Q)r&,kw&x>Pn  pM>hlpJuAf yW)2m%nٿưe~̒rXφaBh.e]h*ZZA0mbd%d"wJ^c61/}`ݧ+$ {iT(ĈPnc^b:DJ (w,ʡZJTܐXfV)RYJai||T$=?:Cհ@4"ZR|f= ^Dmq&9@Lh4'|5+^xiVГ+IdH0'EHD咺N:tͨF7*񮜉ԉfX}E>ɱf8RڽhHIDVRfR>Z^,"€mv;$֐hS cǐb_%L,n]dUx~U4z1 v툌<~u]Rּ2n NX.. V%fMV[Q(1&2KSYAgزqk7,WtJ~t[{b`TmUwE.b\YU{Ԗͮv ȕ2tEҭs-8^EVQ󺷼CF8l^J)ҴE',0ڂ+ !W.Yg9cMtj*ŦjX4pv?؛% k-NQx-̋u]ں11[UcSM UaFˣF—ciVd^Z%JJx#&S= ~Q5ЈN5ɁnV}4 jeޤ)}@pibX* %Z}BRy棆_tޱqT7/;kOu)M`Ka n JmZsAŭTM<&viܾ'ٺxpC~h,7mxhN'5_w˻5S7}.p[-px;8pœt#y)^qxQuWfy*U}-b[b:N#׈9Wq[F۔IXm؜_8eٷ'%NuFKYpVrƮI&þee?ӾNK{NHkTc{w‡= L[u̽l qo0 (XXv`qf^"_[e/HzםsO0kGgtAk|ئTЏɧuNb?-y.X/It.H3AKLAs pmd_5TYWoqP~d3aMDV(cmRn jAmcy|`!̆*fB:G%s-uFԁ,$$_umVkVf޴=+؄PX%\SxX8r{WK]iY(}_|}g`4E8qdPqh]~'򦆺s8S8_.vCa#9=ǁ5~ rHsLBX~8Rɤ cy'rH~8h7d>?5lv(Cace(i)tHȊqKm%B,Ӧ[B# a4(qxf"(ZX=֌(nWjg ٘VZl 6~c8noՈЇ%7_lfc/fAJ~jopg8ab^"9t!^!IO L0M];q&8}J{uqmkgtciSדTrH?2AW1KuJ2<@$r}ZoPä)'sstGbz/Oss#mL-t&:]%Îy9fr?lHXa+Z鷘uvNK'wz:}3D 3=D|dGbuTy't)Umg?F5'fiEyhG\IGw\՚IT5 <,9;6f`zKvpg5:&t9V4U՘ 3W[54:XhEcvfYkIF]FJvj8©2!uCY$sƒ&GJ}y=j@hFuQ'5xG0Z(\'}tcƤȘ5Zw8jIYz|0?x$)k?RÐDz֓aF9P8vg뷢|*HYxJ$x@ߨ.Ni&biXDh4ew75ojU0Z8Chv#v%,HOnr|C&7EaxlfԩūcZIq*=h'E5CI|Tz J?j-Vw(B\ncLUy[Zz#Ʉ:1-,ɜ ’Z+;*[ʦIʼ;fKY'GHȺKFJF}ŝǣz#q8K,܋/EdPfDͤH#SӼ |0ܻLU鼩'a:x{ MB-䕾ejIordɲ'jT[EmIe`C:Tɘe\`IZo]@ 4-O'0XW|ᶴkzR?KF͉$`csb}CO0ؤٮg5<}4`.OZ 4YW jmbd176߹"[N<7)ܭމy؝ݺWRFZڭ]W=ܭ}?wm1-5޶޲X9a $-CxҸs7ue8g TXfl.*դdP16 =TnBPT3Zfڳ'.Ueh&8=n=8.E~:zJHeLR+|1ݼ=iĮ<(婦Y25c%_ZD|ˆWBN*ʧo ɦؿYLwE@f^ժC8}،{EXʜM ]T]vztwR1OYg,+gj\ijލΐ:*Mޒ֭,_6?19o;=,=: q==5ҰK0}aFlrEm_?q$UDԈ \l;63ds>}bLZI{ XPjy5NO;剚R_qa?%nl9_&?f]IZ?,_.C6 >A[%`'U}yv/FmY-E:Q#4w$l 775vUAPoKFMq4ǐ#KV [oƅ;ϠC2>5MѰc˞ݰWn,O~+ 0 T;VУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)t6ɐ9RA*ThCY1}B*PQ: Y*(1E i,JZꏤ륖*Az9뮘*訬Z쟧j:nڬݩ-|*+mlSܩ+*̫.$n#^.V+ iй:{Glq"c,r>RL4?j?sSA~;<~~#P+(|3y2v_a nkwadzz/\E {:gqqڕBVLzhlj#-!E WofU>x@^ )D[c\6ծ@ͯnwsû\@!Ř5 fhK_wB($⃤\DX>kyo>458>By $ :,yr+ [;CdTeQyΫ!|7IV?"%&/=67mL%ꛡ)Ϋo-00˦>4TAd۠yk \Ѝt#Zn_ A,uc!,f~cO*k͉![ DDb8{[ [ļ5d]HR5մUwsԧ!;SLԨ*#<3z:2)Zu9quduٹ~#Z߬X>AZ> qImʹel,Qk*+9O(w]oguH>L9|f5=@;޽_ff}0r+̮Uxw`[mj#jFϣ;.gGOn5_ww󞯉^_F0? ѫz5YԝN3 WNГ>KQoHֳ3j;ypcrziav;Y7 v!dGU4L#${EbVikܩ}7^@N P{~xRa%Vb=GaW]¤7 |c7xAghX7u8uk{dpVt奀WtQÃtc:8g75vr7qjgQuggJrLfs$QQJVvxdI#*Se3Dy&ddqrhT9f&v8QgrqNXn(pASp`;Znl?0vq851s-zFEsOhn6/$lq0B[dPݦ4Ĩ~r~Hb+GbcXJċ`x)@a.A**=h>.HZ&p-Ԏid)Vv{(aKhhJeiC I.%I$Kx%GT77!*Y6y1lF˸qT祅<;EO_xj#I4u1Hi3@j J;PM~f5(L5=#㕕92Gcrg?iTG6Nf)oaԓ DvSxє&0Fَnɑ(i\B}瀴aPYf;seԈF{y`Z#Cu}MTXim7O }jCI{LI/ SY7 DViSi__l9@QrQrQi]86MI0Vz^%Bh)sL&:JEn&;iiiX3maXx/B b q qfL @ G&1V|`Fbo/Jd8GB-K*wi8 og؍CBF&*qNjxS8h).]n&ʤU1T*(VKXzoUhM)7BeDB|듦xn),rZi٥69Bv)'vi7XzoFfڪJsҦђ骶zڊ L%k$S*I[/;:ᵪ;oڇr:A^)jw׬:ja<59n "mڪ<:VfĆm+3$F(8ԗQKp\>nN|K0Wj\xtJhPxsٺx> Ԛ $E9PGYl(V{'* 19PHei3vN,+9a%U t?e\ɧS&X=!وdrF6Hɮ8As۷~Cd~zgKiIT5Ykv[9:`Ѣ1,>m `ȰiC+HUw;yX+Yq)hRA(%_$#UZFyɒ8}_|y:~Rl9旌īO|ˋ[y¢[e'*IJQ5"|׼GXX\t<"L!sCO 3d5<ܰ>4ːόĉ,|1t <5뾺,ZOcc{(4b<-'ϷALÃe X|+ LVBɛ0YNq8E`.-b8a/:pz^DztGz4!LqE-ŔI*"u긘IxP&DU 8:Fh1JxxW,ږ[r֖Dr, ί>'ʏBB~io`983pȴU뺶m貣d]w]:Xy \LG̼7S[W)7ay}R"{SD}|0/mND[XԶj54=}(WܖE/j=mA f*Nk]O59fV/ĕaMK\XD+׸62;,uyGYF2d`Jȵד۰XG]׬)ۚk.Tf%\ty%ޫ,zns~KG⸆ѝ=MdNeMPz)E,Z䭐١okQ>;΅;n遜pgyi=٫Qc,g8ݟA+I 1ھiq\hޕLJ1s.E,C]S $zIDxJȇvm?op+fw ek<o4qM_K4|JL:8G~gC-ޕdz9N|W>:2y{J$ k T6w6Jӑ6Lwʕ$~2]Ҕa^G~O]|Ń^iY͌!2O i^\OrH^5N_]l F;ɩN< \\LyVڸS $Xp[ &tŢAb䈱G%9D5v,%BaR !K9uOA%ZQI9^8ś!ĉͧRT*4rH]#jũjӧ&2=0oYڗS*%\aĉ/fltC\NTƛVn,3!J>%W͐_lhIz/f=o'Toؔs4dIv;/bұ;]sGZN޹.~{ϧoֈJլ{$3-"ϴLPhl;0;,6պ3&r>K4Dyz볥o˘;WB9$._n\cpEJqJ*J,/K.K0RL4TsM6u*ȚtHL)s6O@tPB 5PDUtQFM41HǫQL3-*KTɸ65TT9BTcu,:2qHz㕬L3hUvYfKkI* &'o=;;t'qYpʾ-3 C"dR$Si^|@% Q{Q:w'_QufB-LkVח4&XxdQExX%v'a;ټ+/UKygBm--4ou]]ZUJgzjj=Yᚼwk6lV{m3s*8ɹ{ܯ &(1B|oƗ p(n<;*|p"GW\??\u~3a]Is M?]I|?>ZW7#{leyt{r7Mԃ41W\y~t{_̻/I [w6/{֛h@QolcIU?q>g+# k@pM]@Nw-*h3~5!W2# PXl]OR=ށPI:K~CŀC!=la)iT|0 yh=.#D׍@;!Hdf VRN,] sUPo S@!,*V H*\ȰÇ#JHŋ3jQc t R$ɲ˗0cʜI*Lr͑>ѣH*]ʴ Q;{6`` Sjʵז) (2j_Viڷpʝ[T(*<=*{ LNvJ5|_[Ð#KlTo%|6ʠCMqg!#w@ף7'n+/ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXfS %C_:HXPZrAk&ԦBeygrZgFyei'A\9&ɧ?tAh @t'}F@y h& y@2z)~j_9*B*ꯌ.ګB,ڊ벺BoNz- {J6 Z)B+vK2K+ʛZk /|({lo>OLpzr뫣v 6l/"e պmv:GsD7du䪅;l4j\>7Px4k3 ȺY\ u--|{,2wÉA] k]e-v`8FO=8).-v٩zuz9y d_MnCh=;x; :&˧>o-ǣ8鏚mvC+~ cAn|A9[jHR.=L}6?: qg6E$Ym}HiANXjT1CRo#l*muv5&Mij-MC~uy+_uc!+u]hK"pwva CM`Z 9'=~Zq҆ə4sKA_qV' tsy @BoO 0{X̽1Pw #lCeX"%q]n{e*R] !Isə$T$HG= Ӛvj:tr?ȇSnAh*uzJ(ZURp) 5uJJ'pH#KGiU^1Xo&AO͐*+UM\¨ubNf1xu,TKZJ2Cr \əfςv gXAR[5V9 2nڳ"Ln 6p7hQV ]9rs1G7jJ2꿇2 ^n"~)-YVɪ\y'¡Soh=}~Cp}W7g=w2}/S~o~T1;{~p7ueHZ|I0BTzTv&u@O>yl"c{S+7^L/|kWSFuwIAoDxj`b]V>>e>HS,'2?VMdgtv&vT'=|'|Ÿ3~Ȉfm+X5Cw/pxHtm59ExTިS2o|vgg+KWye,5wu0W#EJg1(H [ƂT'y!*LjTlًɵ`Qm(d3{Ncʖ*钁0{.Q`L*ӓhw}{%S8R>G$psvS:H{"#fhfr5>dzGY= C\ozs1/-bWHcQ*LDUsW G$u;ա,Sngf*h5*Ull 35" ܩ;nU~z/f_st5y iWu Dʢ]ڣgj`ؕjY(Yd{I#6ڭj:z=%k,T6r ֌ }骊Ǯ{86(Jg%*<$S(Gy7|c_^xW<dkTWkED?Kn9CֵEe̺uZ0fZ:btxCr= OTZ瘦OnTD1.EB+Dt4VDa"VO%t8<ȇZ˪]XV@Feg*aJfTɢT9W;\UD [ & ff%+j(B%DղZThJƱ{TY*+ۻEPNk깪x{:ǚF6锣fo/4 +PQVlsca5˪v.CTpF"HI9*:Ņ0g! SyY쇬X B4Y0w{.+ K̩ǗbU)st%f23iW浄`:.7-+?o,LS^E=7{$,ow@LW-#w!|2 Cx Y?A΀}ڲe_jAIûGLx\Y|/r{\8 ,"rQя¢U3X|c0-F7D@jyv LqLCs bZϺj2?}?]}{9,J궃|,Ϝ\V#K@u"ƦW=dm%@Y#ɡIzDFQq=y43 &FřLFbȷ3˹]١j9@쩈$!{Az.tC_eOj;E4Kt!x8bdZW~j`v aػ1E2>6z#3 KJf< 3b8k,T#6[4`ܬ(Lj@mE ۙ&)s [hω1ffeܹfK<:ݺ7ww1" 2G#4E{f;p+e=DN%Y\˕K^NI؃jMX~Fn:^ļSǕ" KLڏr|E[Ǜ飜lqLF@ ΀9↾7:KUPG2ȷ۸mn(٘-]G=[~cT+-J[KYRrzNuyGu|{>M5 IjA͝C/#v6(B~&7.)ʉbNA ~fЖvg-Vea 8J+A(k)JUilX3~vevmg0]%P^/󝖭MTO\IN> ѓ|Ay?9CBBo!hO`e߶@'ɵ(G$LqjⱦPП6zS:1q,)Cuհ.{mOk*FXJ$@ЯQ S A<Æ\H +2p`E%bѤG :4׸5oa~uLz}u)TG-GT 3pC;\ACqDK4Q@Wpb|o{˴ ѿrH"4H$TrI&tI(s::QǛh<.)(46l1 )ͶL9s,͟܄/;c/sQF2o<0+Sy̱9+ -$-AiOQV[):C"NC#Ԃ5G B5l;%XduYhL͵ĺзii5WAb-\s]vSU4ZxjVRm,S[u\ u\gyV[J_ͪ3P܀An܂ 7ݑDbߊ*ӌU"=Yg!r]Mnyi&PNͮZX߳!ZUfդVYh_gV;ϵvV{nFrFo|p 7ܳ*3M)*Tɳl3rnm8wQtH5W-ұrLwRvR_v"vIk+0rk'=y'~MEa}{DܠɿR1'rKAbkصNa$#!xB+(=P;<ױwd!Zp"m KL >s . l=~a`j_cb 0Yq AIQx<0Vp;⪎.۹pIHGf/vx$b%w{do%9sM1Hzd$mCN{ sٓHRY/Sȴ7 äK!,*NV H*\ȰÇ#JHŋ3jq#Rtz I-cʜI͛8s|JD衧ρ),0bQUJJիXm 4§G!بeӪ]˶ۊ>CdtwLN(VPU&@`Ę3k<c?W|\9^ͺ3m۵GvpנR΅KN]s܃!ٵj^ӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌n=SLᐤ U "An*B:TjzЩBjiA: T@Z)K[+ꦦXp+ jb&l6{?J>keZ߲B۪KB;PoN;QV o# g*jK\kqVlj̦%LО0R[<(mN-LIDŽ-KG-TWV2ZtBMcA_[=% om3]bcYH]v,ʼ5 uݖj3ἆo'~xծK=H\UG^$q^M7 Nav+ݸ ENmp.{ljw?Mnv->獯|Kߦr,EbHOn5\_FJa T4M;Nrf@`ZWJׄ1N,x߃#hCȫrTbVKMv X&"Z ׿>_RgBXFn`qLA59OFSPfAW 9#R?,!9RsU5F^wI5Xg.ҨVm{,mL6$ h 5==4-{W'gؒd3XKz[ v^#/OX;o㾁e6M~۵W_xr^]}{,=^Wh>z>|ռ1O\9#j-su=ߕzRs{?Q+{oܣ~ONtw:E'9Ց@T85Q7`v6i1O7uTvrIFoH_kw@6BJ;!@rzR&u9lvm*Rtutdk6f-? Hf(s=i xp2(LC3&'eh:lǀA~1KS7h3:K84<Fhqs/F$#h4ou5FhWݶ*Hyb;%8-lsTivp9؋2~5fq'Șʸ،C2YX$؍TB~8Xx蘎tC^_b,w_u*HdwGaWbt7Msbm6F]N)4tI}fikF͕c)T<;v\^w6`Z;_ce1 e-M@XcZaW4m/u%IhxǕCv2UT}X)FqIFՃWZj]xx>'y 4evǒ(I}eiGㅙVyB^Y[eUmS|dEZguiW@`Ccwu&Շ%49ișirgV~@`ER!Yy^َ+ٝx{G:+IPCJ >y>+) YfAfHfȜByL)zjK~4KX.' jCqDz9ڙ_&iX ʄ}I2Yk%5xu)6X-zV/UcdFhŚ7ZZy.>jз\awTZVXy\ڥ^~KyipCۙ9&6yiX:j*)J%* xt*`YTwnqc2O䓁g^vf$eW=iٜRcHubyshjl8pZ24كj}F2IVYsوԩlpLY<;XVC]hD^}TwAJws3{=nwG5D4,%ruY. m zqv'TW)VC\9kB> DYk3;VtyxG {"zZھ } ,9H+w#Y4I$קٔ8L [JyI6j4vcMr J\֤:2 qsg@ {y&l6 ʜ\ʦL7ljx%XtѻvZ1kRo R7lG̨=v+|M]B$s>Hpfeɱ#-,i`xWH۬\l_Z :C3gjZṬɄRDzh ȽM<6=m[6j[rjh!-9"u>DTF,PRݳT-7tZpISz37 N~R5Ꞌm.)dJ H?ƃWtg.%)*Ijz'4sdz3!Zo‰Ψo;Yp4wfL?GPϯ X:? ΕIe{jݕw^p;j4rm.K?TBlD0̮k~)kS' J׭u\]GkW71~K,ԟU>^I֫r;:ʹ caaj˛iM՘>.yRh'#H 3Ə} ol6~V>g#Wf~2hӤ,6~.(`V}"O=Υ+ .ޥ^18j S]{?+}n,Ljt,}M9]5~h|ZW,FroZ{.-a*J~ã d=K*4sZYeir"||qv9rg˄efn&^dx8m,~6+H"vFP"@jyh'[kMj+HGWu%tԞ_a#\]zJ+?DbKKXcSyz(;փ$kC̮}-x H9Ys宏hZK^_v=Ss;-lЕȁX;M ;+"NH\jw7tp r'\zOy~gIKXxi aX .4p|hA0'^#7nq—2(RD/UD L7GQI.eSQNZUN?5z–y.RKqʑBEli֤נrIKP̢+͘7ʕerścȑ%O\eYfgСE&]ɛQ;FkرeϦvq٧buMvqo8zfsѥO^uٵow&'|8Ti^{N>Dd IJ&$CO~tE";-)b & 귿*)k{vP-omf*f:ʩ뚮ڰ/S(̟[|LZ9 L7tz#RKQatxQ\RY5xZ*D_kim. mt97lԷ*wvÝ\S0$Njj @:iB֚;m:k^rZءg3s;9଻*n.퉋>2Kt!nca7m>O0QS}W'ۯ]M&®V}S.{ϿeNLxU-%9C@꠬t&8 J k0  g CAT rB6,'-Zc$MVZ^R'8#oN!ArU }IKrbT(*S$B/P눘Q~`=5юj H찍(b~qj,Jo+ᔈDd#R(#B,=Q|d:/%d8i}NJ86R21l]_$y@pÊLM[̶A'^HI<Й?3Қ?1)G )JQ#.| g1d@4D'jя q1%;tCJ((zqirj Dj:4i,J=(=7IARtVi~nZrfD5Ւn"^l^G;UUNwYmVu/?*rJض*BɇÔ.:ͲUY^X-,2g}ĺUȭj8+Udrˠ׺ V_V\TJGnf2A&EmRIYZVm)TFSQUsiӥ>6EcM\6trNJWZzSv.$L]4I9qY'lYRliܞJ-b]Lgۻy 528 ]ljum#nZXVcsϦJ!" jt<<^, }JqWd";P{+}ᐣ){Vm8.k{ɘ9f3K%w&ިwr(-*rr ήGlr(=X،6n3C*]#̼2Ґ:|hvx^T(؝sǣv)hW|6 ԮqSf<ٻNfVM^Kۨ|.vS = Х Ja$FHvSSP2]/Ow)fJ{;M<>M&\Ѓ;m-ԟBY:ሯc_v;'vM.5<+Yalsms+Uk+R -}.Q"~+=8L&lU`أ8ﴗl[ /uގC+sܼ+W7W;lv])oQC\:5&_lS>cGv.z>u<,7J)ٿز""=9eyU=yW18&Hj?Gɢ)U6*S bU7v/󪚤{K;{4YwexFh3x/ E:+W;\W;MŌʱhSak8IkL;3yS{;稣88?f9(nij9)}~nh/F%Sct[TJ+Z>{g6i4ܘz nغ8 we;ۼR~{C }jk ۷_*WJbɢs=ʊ\%c`XԆ^jws][Kg9) 1TXmВ[jB^)y55]ɾ *lvŸ";yV}RyR?{DTQ,&7/>f1EZX*c{Y1;s>,K5QYǞ3ܽű^|KfFgj!(̽b\fR ǧh][la h/1%' *g[x||*bǹ_?#,gl8.xWKNڳX5ʽd.yiY~X4R{gZvGM[kQ櫋VIe3qc[Ivt[ eU u۠,vG*yٛɣ/ :vax F|ƃȢx!Lca=3jbUWm%|mlxqɩwWyױj¦m8w7[7WU]zZͩ|JNٳd[WLcY~<}ڥǬmK{!Zگ}۸]-t_Ewd t^ds麢Mge hfhƙ牾@4覙q~|sMt5zP^]F/ ̹3TK,etZn$6A5{Yt ʿm:*֣췇_Cdnz؆j;N\\_d1{ }<5ibx>ɮ~~5X ]  1s_ S ul/x >6l/ O٬)kyj Upm\?@qknjoA_ U#XA.dCX@4(E5nG!E$Y2 ND2˂)%L6k4Qş=%ZQI;$Ȕ MprRFx P375ӤE{L@tPA$P#DUtч eQH#ȹXsT?JTOhMRPC]/ !,*V H*\ȰÇ#JHŋ3jQct)H\ɲ˗0cʜؤI2RJѣH*U Υ?n իXjӭ?Kٳh*2mBʝK]:y߃ |4ÈJǐ|jw1Ș3kk[LӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@ ɐ!)Q1NdASIdW.9DQ>_ U*}[fif m!$QNpyW9 wie ꦟZz)S~*tyCy)ALJ@Zh}笃Zs'o⚞+' )zjN*6[krw"+jv,vYhBI)z]+D Oo~j N)s% HkL xMra,W+W9KDTObiS8'0Yvk%l&WXnl#MZ:f\^iΎb&`򚉌%9B{$MzRBg>-)s"ٵw <~vh8 MVsb  ?-OМ)MPS^#IOGӚ< 9*z\BŤO3oz؇J]*T’ԤԎ[/3SP4ܲ8w-Wu+0vK7LSa:09WMYUjDAf!TpXٿr4 heW՞V0'䔰g֓UZ8uo[^ۘ)} a*uI=2S{`|Kٴ*b.qb,iauWۜ¬j{Ö9εmu]ewϫY՛>J^z>Zj /`FIM5p`LT_VyjYE7}p;L6J'K{-a%lc:؆'֜Hb1BCVI!̇Im-XpTֈ\JR\#XÆ"W2"Q0'qVqz`i3F$Gv*.JKړX5s0df{Gsm̴29^T#E.=i;lMe+@7˼LS2+Jҏg$b_Ot^ӣez)]WZųsYaf]^Ujk՚篋}SI9{Q; 8Uh's+&q@}YJƨm)9Ӹ͞RTRimU09u\GwOi4Q,@ЇNtHOzV,tP . 'SXϺַV4)-ѽ!5À[ݥY:ۅnO}]쎕ǗO54)yv)9n+ $Vhnٕ<zb=}%3$SW}QPQhiG~TZ94tKob5vzjn~)OEeswkؘ9.xm&&l3њy>$d߈ &XdDLoכjy怪ؐ{;bYeZ1ه._LPE:~D6ai)IA%$~ מV>PKY]dPxiXKw'7ԟß>ȓ::Omq&Yc Z(,Z9٢2:r@k(fN21xd_\75!ZhrTvs=VD>t6,txi8$d{5\>j']Z{xfڃ81(q؍ =6,v ҆WHd0`fNJ襉{SU9Xdc 6N"괟婽[IRwj_u:TzNH&H=R0W'D7duX6W| W$JYpRJzwo$y'b%d +t/;X΄M3L(Ȁr Ua'IW@v rJ۱#bZBiGCeB{(Thf,gmטÙ~0k[F)[l11ꢧG گ˕;h 9#Ɛjx?yooj)UHVJۅj~Hg0ܨk9oo{fE֨`ҖiiiFUwmm!ur\vkčзUv=rn9;zo{f'V +pdEECEq9pz#p3l VYt.Z`M,D*{Ȼ [4Cʎ:*c5T?7Dt7ƛUwHtz2+!@W1CIi+/8f@[\}Xkz_C_1{ ZEu]򫳊j{[ƔF|Ѥ28+XR :k;ئQzyKȦ,Okkz6,\`YiI@|tpgJt쏣n`)LMȸ}u0Ū q)HQ{x-d쭁ȨDJAt xJJC k>O:hz\Ȇ\"3[2e/7t,+mЉ睻HP{+ʝDnfp Jc[KKk=T_ɉkz;)*:ٝƂl{SYٱ̹8Mj+~u̶,W |U+\ɾbD˶Z)Q @\fm V&g ٻЃ%~,]-#  )U.E!#eyы+ѯMMmxsJ㞕5t,ӓlr $SvL5u˿cfwTcB{y,gl^4m`+I`rz9=gҐ\'Dǧ)}%{ṅkhoGkrKk"7YcnG W-|ϤT]aSf3ןtgJ)vq`rh UC՛Yo=tm=j&;]ݽ1ʥ8&<{J{voI!wtܗ%ޥBTZ2]ƉݲR&Rʴ3xyn2C]r&!h⇵;}XѼۥ-6ǦM4Ӂb{OenzZ\'kϊý'iZk#.X'G\7ܗRX@lBGՀӉ^!unbUiQD*x`̹{+&+@ ;l*_|W|盄VxS겹~%\y fl,WTgv&[|ޗY*M 楺Mꌙs~ѝs1MX2XNqBkNKJ7Z 2*xk>l> dojnjoLie~ێk:ߴtJ*.j#E%5:F0npx.YLs uv颮m~7|a^lb~>3Sqm}2ԧʻ*DZh .qJM?F7,+OXo>-+21͜K-T_l/*me>|l67Nxx[S\@%sV;=ϐKF=qo(,ˬ^g<}˒nuOM\k̿˩r"}⚶'idЬpnkTn_!@GwkOvl틉 s5FЬLBlF._N9uq69{ ,O*hŀ#H@aQHp #bH1EJ\ǂb(rdG(Ov%I1eΤYM9uOA%ZԨΕG.eSQNZUiRYnצŊ5رW6u-[qΥ[]y_&\ذV\̤U|e̙>~Yg'߬iԩrڧ뚥UϦ]h2GKJe9$n}O-`iٶO^λkO( /Tڝwu|*ϏcLH2p;n>#M{cA P;l/&TqE+|DK<0i3F_dqH"kskpGZbp?T%h? 9,K01;D%s3ӱj$k28ʸtP'ôNK?tЋCp 4GB=- !1,*NV H*\ȰÇ#JHŋ3jqc t IH$Xcȕ0cʜI͛8s>ΑU@ OS]ʴӧPD¤Q(uȮ`ÊKEx0Pl6ݻx`B k Lݾ ^̸s[`,eJsN~̹1*yq S=p3װcVoOnks@bV^5[qУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tigX`Pz.4I)hAyZhL:hD"TiBR@c(J:Qj*j2)>N`*|*П)Cif':l K;Т&ۂ{mv{ *ښУK럷PK~ʋo&{/,l N笭*+j ~o;˿xF y2˕,K l*rL+2 ^!Q3Ш<Z,v:{Q?KTGojWDw~T^l&28Sݱ1Ml_{GngUo)8"p[ȫKj8hNvA)c c3l8ʈh7/\m sxpl#!A1H (&n #И Θ'К1kXE;vl")kjSS"UmZ=az6WQ3e*unǨԡe)M~*jZ]Q(tb [Z4&~(h! j됊| t+uUpZתX*h0ؕF̌xjW֖sy4kAkͭn΅3)%t-Z/ಯ-tib\v|UFx\M+ѵcZLOEѽ}{-mh-m,^ES&Yjˈn0sq]bEؿ!k-J-q8bT$Ҙ(B^L|aj1Oe]{շJqfcܕƼ1A2VGT 9]c~|~~"OȎ}+ÊZy3'=]2l {<ҭWA90`+"k;Ҙ4Si+i"dJ5MRUîF`,GΥsEĹStQT,Wro5Baۚ)MGYo)Rcf%MxдZe| hFg2Xj" fIWx:qƱFrݭv7Ƃ[ k%\vkĿ54͡ʸR6cM1a>QiYffn`t搻.TܨDchr@œ3:tGj'p,+#zMy%vV{U!nzދÚuذٌZ#E ̼iW"jt9\ -/}VěҨs` l}gO[Iىfqt6mof=W Uu56Q\$$KSf^(u֋Ȍ1tx?yF4wwxc1Ui0tYhb{(&:@oxRW< 4_5daGuVjh^:uHs9qV%by;2rBRFdtqjfFxO0)IKU"EЕm%'b5I yN Y-o2#U?s4.yckfw,JDus7H.*ѢGPB{xw,^c Uhy )eThRgv֓R`s`jٕ^e6%o^STJFKcC掎t9=dbixS癔9!xtvIF>Yue)7O}V] GXԛI9ه4UW_W'7xC`#Մ`IFƀV Kp{2S9KAG9aiTÐ%6!I%9" gD 9Ww"`AWHUYtCU&Ó JÂRXӅYxrUR{Sg0j!KiQC8/j= |T8JYqP#}YeGC)5iHؘ!jl9aW9*Y*uʦxzʛh1Z9=L7*!}iCQ66d(MqgrnfB6~8z&naoiRn#_ zSIJfeRoII -hLجf" jj'oW2'h: trolci~z"ʄh艳J{wחo}.#/VU{}iox'5wkq1^ 3aP#Mep٨YDǝ9jw\oz|̧}<ȱNݿ>k}]V~g^Y-L%c1}XfjCTHKs$,]s ow>E\ Z ԨoSﺮJPOSI)| 8ad_<_k}d.dȈL.l.?x_)yMs)U$kn4W -_7IRK;ΞJv ,ҚnABKc~à|밈/ >rB1W4Xڷ֯Ui-IkWM /+U3gg؄uxANĥC)2 NQa2L0 1RHǍ!5LQdG G4IK1eΤYM9uOAJt ʇsE-IxСGR|pС]aʓ,Ѳ45fKXz< RPy_{,jŊV$9\N8XDRŘ2ݸ&v sV*E:m`رeϦ]mSOo'Nnqɕ/g9ԐwZyb~3ŏ'_yկg{χ.UzλMݰkl5&TpA,/ B 3i:(1q—3 .Z11jLCclL *˜/t:bpF$T2j*4j#njDM$:N݄\rL2dF/J, 4-!K1KE.OKpOK9!4Cls=2lJ|(NBb,벳*SXcNS{d>3Т+tƩ*EOYUvYfuYhvZi.Ov[n[pw\rכCt][-׭\|uTǬ Tu&{mmQvG4_ ;m^'I;VÌOq7D&^qSZ$eF]n(d{eqTM\U2D#d^Y2>mfyktDLNJQ6O_b:*նcn[AӴ.%th~_Q={izݔQ'I"r%upC3Uѳ.%?nS|;QO.ZIuMĺCf{qT4[|cڣV5 ^}[W2rMKU\e؇ڹyw}~k.k5P$` SpZ\ÊK,RzEӟkʝK.*)( | m/ǐ#Kֈ޹pf̹8\ ßS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)aSdBHAMJS6T%yO2$IJ&cZY&m$g%Qo]Gi'c҉P MdxNIh)P%h9Сr.?~).ty~z$&ꢨ2PjYpeO&f~%~f쪘"l,>+:,vIkZ,AZK賶빓*iBGlmŠ+ mлզw)Zjk;Ghn 'm’+ҫp!#D+;+)-DW.*HJ[\PG-m)O-X\ff'.6$}=*beggMuEWy4oKꤞ4k.%Җ_4R|,݁#~N:79l89枏^s<{Sݻu?m[Svч;v咫w}^9a/렦q 7zsw*>b<ΐHlR421y{@zm 2o 8])\GEAS{t; PV! NS׾\Lc UBrBp`  x`VE&ĕqudH:xcG=i# KA#"=E:򑐌$'IJOwSB}| 9R&ZRy d^QR~VJe3yVj%fI[{bLE22G4L&o[E2)zXY"H2On錘aTk/\7a4g )M4_9DqS@>lPQl IjiJ*2A9%Pq"<ȦNf89ȏTwAfPO <7Kr FEƺϘS1L~м!VVcd*POP:kl©[E)f\}*YREϻgH].qϔ*k@׫z(gTIZ;o,RF3p hGuVJZ괛ԤjyqeFm{^ELTWY(מrJK![פ3'&og+|ޝ2>qVaG˚6l2WTKZkQQn5) pX=W=)/_=*jp-]WU[{Yz<,rE< OWǭbtn)_Vn9vy#CFmqpf-7.SVEFfyUlOt˜|7$0t[e FNc<~ȜXs?-7syOw v5ڊ\DhKjյVM)4>iWUE+>+<g5WݫDk.jWS6PBb귩_TbqYijLfuC>jëNg ]MP`w[` na_$t2)Ћ}uxj9x[`Xj*{ P07'<z99KwsF.iǘ^pc]2 NkIzt0T+jK9`LKlvo'uݔ+0nvzI^;JjXrXo'Vi2\s?~%o ^v#1&O~u;ӝn˛_ ExԻ[.AҼ@Yfwc֞/ˎpB=E/C5n64 ̈́D]'Ygx.2n.qb3t(XW%x0IXH}{P|G.7`yR$_yjup2U5Lb$cJ`7Pf(ir4&^Vip8vY&Wtrk%/uGT&13x(ɳVd0$@8׈w:ehXΈUthoq"y4y?Iӊ<4r?INyX)GVh8h:LJzmT(|K8R?h72e(%*A544~K*Ttt'5 (Eb>HRv& ^ʼnbEyT_wd(kI˖v&lWxX7?6:q t4}9/_t!-{cv.8Aɀ}a!*? uGRF?S3::ձ}QMeW,o۷eg|zuSJmVfkhx#}z4zʊǖ7{ pR}DZD< vy~Zi6,|Jra Hk{xˋ Xv)ʞz\X{*;Yi`;EIȝ塦mb,u,.ȺyYG̠)f<9l\NSΝńi\s\.mYxlw{zC9KzۿlKͅ - ѷK'FHq:i*a(u%a?M-J]Xއ䷡Nm{Q~X>$]\.^寪R9bn7p7g.k> -nka}pt^ -Dy4prjNz舞N#}l =鏼K ξ~CJ2Je-ɒsɅȍٍ̃gK,}RؿV̷iUětFWYIŤC7гLp'6>i]|tN*jiJ.nPˊ] q)1qA]X-AF1,Wi+! 6_rS)Ob]B$?1O3O<4_k8=Jz={5ͮ$>J1 T=/PqTh+7:?QTsF>?! gr/SIaj acPhnrVA|Ptmz*[0i?}aC맗-o5-<nooϔک_Jk}$ul$?1$6/Yj֧ڿ Ur-!,*V H*\ȰÇ#JHŋ3jQc  ұ*) @`˗0cʜIM<dye= JѣH"/ńyBJիX{YeiV"ٳh&Y<ݻx5J uX`È'o { 0WX˘3k,Ls'L [Cէc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&aSdBPF9aДV4%b_:&9iCjAX@hfAwTB{ۙy9g0!JhU})۝OZ@m:i餔V gAR*Р.TeQr)奐z^uJ&_6h^Z*朤Ί~ 갣eڪJ떁jz)Am*҉lf.Na)yVp҂kY;k.\{,&l+Lm/d.n;Wlh {q (ƫ놼(0ܱ (l p>Z/1C5$;e'm#4Z#y'Ơ*=3ׯNM.]27^Zk'B$y1]w砇.c(j֮.{Ϟc^3AU b^.| [֕t2A/.Iߜ}E/oW>(Vk#z?{E]K`斿6J[W2m~Xb6c_f-I0u2 цF,z]po, Z0"{6?65pVTۡ6~!W93_~BV84E7nKH"TsS/eP(fEPa8du%32υ:S¶it$!t2/Ȓc aD* AQRԽz8AbB"%41q$)êiꃘ̤؈ ܞߜBy%,F-I[B6++֧'fYv7jvHp G[`"tpZb+n' VWe4=Z% mG]9ɶ{zR&xQ*,WR{'(8mll&,Z;߿\2pDś^w[셯ոޢxe ǢkIeb~RNp-}ɚa*8 o;4'xZY&j+>NR 4dF%Fne]U~wddo^d\ߺAߚ vy$ qCo6e%Y?oZ3i%> |7~9ozC|C'ц ]SBf?dR7~[cvZ?Q3nJvcHEeu`CF{ک,OثYOmkT/Va_L]6fe֊XBnYifim̰v5v5=lO0ηq~b7AϬpB/':65~RՓM5-5p%AvJ+hdؾk ;):|hs_ul'Yuk]% zt>Eu;nǠoM'^TJnMi֑:[hOߥV5*uv̕:BbOy+wO9χ["+QMݯHLxNxeeH)[!ݪT =5 =<|"q?uwt-]2kn 97_"!'ۦ?o~w4^}˿ozYvvr~e6 ؀xX[u o5F4aiTrxfgr8%G'!@vv~V,g0OouIv-j`K.li`mgcL^Vu:5]֕[H?p/T`4\b5Z5CzrDJTItt=^afJU?3aechb^XI؆:kbdf03eɅe(|3E]V;dd)(V\X(x3Opxgwb=xd(_Չx gxVx5iXqAxCzJvqb=mW ،㌟Ft7w-%HxInc2g?uesy2tn8'bWtwz3wsR[ITq4Veww1Dw{*PCT7Y_-{ .RȖoH\GOlDFw47ASI} zdjis7K#wT%moG[·3nd`7~`BΒxY{IK}UDxeanј<"_k'tuS|wtB)v98Y|81t|yـv&g3QIƘG7gWqn,8>fZ /6W7Ca_@$awUՋ95V.7A]PJ[&.fӨRPDy,z4FGx_fvp@ZC6gyxIɭz"hE=㊁H5ԍXvms_(2Ot j`zRc=?گ7PB)Hx8@լzuc$s:nMiLy8WUHVQHA\HW'ie4XV7vH8Zy厼k40cCwsbttg;x66]5$D9=xDaضy1X;jQV0\ˆ./z]N]kg/8Y4kT<*~tcUJٵ6;P[2IIh8vW~ GNˁs{zޗ|7Y[uG%vl֕4s^圡,Ud7j~ 3~E{-kTG* 99ds89۽ӢqDI+k۰' ી{/@9{PPYtu4GGGמCJzoRb}GK{ UH!\\鮁e)L[fx>h;dZYG39zؚG+ÐǑǰ"LDaP[p4//D,Lkc,5x3<ڳytYrti KƗrM.ECcK;}bMژDƈ»W&>aCP.ckH爁{~+yŃ^ Ȯ:ləI+ECԓ.Dl%7:̣y)K=I*6Q6l" H܊RϞlQk#M̋LN?M]Y>۩6 њ=sR]v׵'툮&*U3Ea˟-~i7z1+,f52]^+Mѷ?3f)n sH=F7~PbυC뀽"?ܾ&H$* ~~A K690_=;OFAaa?C/K_4O0[/P!CSr[:9fc2WoQK(9^.CoGT`llH@~ˍix`?C~$6?)2DI[p's|LO(_u/J`OuN٪b_y""?/oh+?ϟNJ݀!,*NV H*\ȰÇ#JHŋ3jȱǏI#I\ɲ˗0cʜIs 5MVΜwVѣH*]T#M-7 ©Ujʵׯ LB)8Vڷpʝ[N: T'jB)M2͡Ы :ѬxJ꫰'&A. iZ~Q6{\1-z 꺮zj⊪zJ*A;ަ+кo ݙ' zB 4qI|ۭs,wVںr 3 i;-DP:lch7lt84*uX# s ? qx=_+a'C}ɫrvѡ"}sZ[.*g5fMcsB$g<&\ՊPᓧڪSMqY_7Dž98s[pm1>c<Ч*難taSyX^:\מ.κ+2zǭ5 '̮Ƭ8//>+LJHXR[۬5{^BE-{5$zB"^ȈGgÈ91aJB6ϊ" D!qmݶ')pfhb5IF㰖*(^<*hWKsYHQO"rHGz %nϙQL*Wie52^ƚ+K\s{b.?rˈ|+-1 &H̤nq _$iyф%ܞV7p*Hɑdl$9j.t\=y :NOȉ]g9ݵS gA퉔XQ(,Y( R˕B {<3B;s'E36e"GXA:]h7i.d&uMKґTL%,ԪwS%u$g)Pf+-- S(sSmEuӌvϭ^i778`taQz/6d*1J7UpIdaHI llY úS$5(DЦUlwDJ#|D5R[v p?Y:.Ζ\K}s]F?,ZT;-u q n:N{ߡIVsTs}u|ƕ~ҼGW׫hC`aJMՂ`%]흰*/ַP"1̦KW1vӻ8'TY~@r HN2IB*,?R\NJFaZɱ]T =,W 32juɶ>b.z°+E]*^S"VQn }VDW^3epG^-R>e V+ZrڲG /F]'Ѭ>;y$]l.:2&2_Jz\eC~1K$"xA n\O8Htm5 l۰qc%;vGiÚpf\ts\寂uQ' ?pa%⭝o^սiЁ&g$d*14 }N91' NL7IQ}l9wez+ķTv,' AOޑ>Zۺ϶;5ؐi"BJgm*],Ws-;80\?|RoJ!_z5nuZmvc]}y)})C߃ֳaw7XvgauO} 8XRr-Tv4LHväp 1}K 7Yx$,+j7DeQCwgW!f^t0txtWW_>kO7DrxP7}~Vn|ƅ`HLKfHzUtSkj7TV612n8flF8={SZetiEmdarR1YqX<Άipx-1'ejsVN3FmNGptppv:ʧXa߳c~pz'|ȅ>r4hϴ@ӂI8F0SVEz(wX ظCu(%'w&ex(T0xӅr(042=Hw`G7?P.PՏxf݅WyY\QqETE 2zܧ|hjWk}z2y^# .(_(}dU8t:÷|mXWGQH9膠œK<W}%z3YAi65c7R*5q] ){M=ɑG^Ւ~5Z1xEl Wٗy 88٘fٓTv 872WBy`Ƙ jU>tAy}VM(Nx.R|)Sb]ǐȈ.>0,f$yX'2ӋSY~'QiyjUlAQk؜^Ty|USgdk[U7wɜCŚ6`SvBy䞴5R<G-XǗ)jsS]"ǗS5V=Vi}de~ꇞx3ۥcwՌwCF7+ȢÆa[3qAfET[xqI:T*@%SywCK&YYiv VgDGKDgh'-ѥ{g /Ղ#'fm*e3&2Unڛz4yZ6w{=^T z^H={72?')o郈VDvf}jƥeDss}simoigp:LIyjtk;MyCUiXeUOoY^b5GGնW;LTgzDg݇ʟ?iI:փEkD3|KXA׮`jHg6 NZ%GfnLJ'ƌi{kbwm^:lUZqEH;Mz=tx}6q+wdFCtf}f%>\xhDB .w$7;Ha>ooףYx? xɪ'?@zG^.'VcazCkKxpblj@L~Йh~'Ƈs{غrfj`,9s,ip9+MKJ^}ӆ^WDD^ G,DWi'֕5K+sZXUc,|^(M.As)飤>~$n-V[ꪾP"4LZvل+N-n2 /J*>ZҼgLƞG v<>kW蟮-uŀK,"qyJ=H,Qa)ԣnW=;+H&I;΃f_ޡ-ңY>o1?K%!(o#Ɓ/+,1o7fnA!(!!8A?GFM?=N/c#pUokO@_hw_P`OzoN}+W[67"Z/ll=q'o|b0?C!O:_sqʏw\!,*V H*\ȰÇ#JHŋ3jQbб*HQŤ˗0cʜI͛[@IA*]ʴӧP|@)jD`ÊKULuن)HVݻxe{u lE+^̸qҪ>t˘ k̹Cƣ?̺} _L+R`*;,9УKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dih X84mR&8&jrFB.g{:hD>h4XYzТu*jN)vXzXz@xY'" 'ꬮ*흷C-wRj-F뭬bq.hFZ'ƻm֚*k~K->f-6Ŧj o*. X+kC ܫf<1*Z[s';ṷj-'L Iz:7khp,T',yYUyb jb۰%>Y+nJ+2=PRokt*|[G;E$6"NG_ĺx3zm9&(7A(:s{Gz]8kN|n^gcVf!q%@ j-5TR;6eF]Db7oy@iU)vlGNO5p4jXsNg~_rwFC$C2l7nk_f&y.WplIh:fB.f6iZ|PmghSw;3/`59n[hP#UFhiFFFF"yhw8"g۷TW]egf#⁆ r~"NJX)0؋CxKGdt#w h8?s( Qk%T$7VWaWPcQHָNXLUMmk{UGw明WSG,^wTp3Yrz[JȎѨ5 o)'SאXjSRhr쵐1ogn2H^IBLGu|w0YW]cqVXeUQT[Dy~A=PVb9.Q{c2D?|ua)m\䌼o!IlIIg=un/u;ȆF~8T|gcֆpF/ldHoGCFȉ`y#h}3zw99'BْSQCn! g0s5Xc+{6v9!@ )\.SGeZ[{ g?ې~Xc׈ rb7Hh{E;YtK.stYWzi@vjCIjeiqeW[:mv*3K6bR8r뷹xZ: qSI1 :l 5j7tˋ'7)DSD}Kkhr[q[ :㻁[Gfta t۩QǯC՛Anهo5ѭ yYVKDtv7K(KA,XH5"Sg^~Ze?1E"gCƙyKft瓕IaSX kմKk b~Bc|ꙚM)km+vwèuyFE]9,^NhK> OxA9}9]g_#Xt`|n#*cjwt Q! AmcNm̳!!bZ1}Ome#!2vo0t\cbULv/X%_N'~ouOΏBW_\_ΪQdXE%&U _*X Tؐ Ç%NXE5nG!E$YdDD8S<–s8sʃ9`ʅ8)(O>ҴIYnWYYNTKQe֜ٓOqQLK,D#.AL&bݣuecȑ%tmж6z"߇q´0ҢP-[Sk˦6jɹuo'^qɕ/gsM&+ZH%NwA!L,V H*\ȰÇ#JHŋ3jȱǏ$M\ɲ˗0cʜI͘U2Λ@ JѣH^oNL*JիXje3 ~JٳhӪs@ UܮKݻxLi*|LÄu"H!أb`KLe:k1ȗCM4 _ADٴװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx|߀.n'7G.Wngw砇.褗n騧ꬷ.no'7G/WogmswOћ׿={@7yx2s ' V^ σaGA zG?"94Rz2ao ?!*H c%2C?SDuD ]4ýpdL7F0p kTE8q3g#Sx>^ЏٓiCJ#9$2b™7 &1.nx $' F>f2w(KF@!7'p9I:K eX@:jfL&1w\)?iSd5^z3ye-cEp"/9tVڬ&5#OSљ_+LnҚb,0eҘߌe8c9*4Ԝ'e0ms|#7m$>mq`!_%4s}fV.Li5oj6s7]7YtteQgi55OZѰfsKh:74%=k&юƴU]=cN1}b/nﰍ]\/ ;V6^ǚtro\ N)k{"jyGzί&olTk:7}w{^1~krխvgF6ƣ=m[G3.oww=rH'\ m\_[݌wKih8υoh_7rK#\nsY[8n8k?!O,V H*\ȰÇ#JHŋ3jȱ H1$zǂU&(D#Vى@ɐ#m)S*af͡PJJիXj_NCʝQ!$:ם) v+)ܹ% LÈ{*p熲:bŷU[q kٟh^ͺװ ( ΰ_= @!lIx~8b9m0.Qسkν{C&iS@סX@*~N'/(VgS 6z/U ޔ_(wXF~aeKp5G$ht=!; JQG*RK"؆UZ(D]}bc(7T`6y[D)v@bm_U"`S_FihbA"uu#%U2Ckٌ9`64RNIi&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8L"Xd54 sC< :BLkuAWE@WM kDdĶAk=Prootu i*6B^cdvDDOuxƁ=/>gm^wD[iK/@nA,Zt^弻>ҩv LJ›#Լ@rϾ|UC9A}gBN:7S0]uXOmB+_޿G<7fuȰnS g*}~f>moj;Ɏ 9=ɭ;BaovX5XsaBvҕlѷ;O M 7aQK`a;n(%P!`*$As"7? na!k'Qx\hFi;ؐmod ThmΒ D;/ԣ*HDRQKԣRʄ}D)h<J`{kAb>(hIOw),Nyrv*2TW&|`uz.oc6Iq+=fqؤylQ3Py TLҢІ]e-HmJWidEGJҒ~grD KQ 10XSR.39BtP"V6K!2S He ZgVObQ ҌVJopUa720aK:n# ҵtbKri/P,7yQ wΫ rLs'L ejA77:*;k a6R8Yح0$K лaۊX1r c5[4Nmhٽv3xEpY'F LxUGZVdit[R8וm )8Ou׃n.!iYn/q#H 2~}AFIF8aRοm,5S]w)fڳg-o/֪ǂN` b<xQ̭C S^>/nd Ql]'LJ>f!͝Ug 92>QEy9#( ޡe4јδ7bזnNۺt?*;*k AER9O[5*@\k`׽3j#Һ!>_Un4]:Z\]&V8āfѤ;)Wz`-znƵw ?WvpnݥIfR˾Py̼zn~po 64=/{ixYPR;״ݔA+Wn\W}˰(/K;,x&_ nmYY*Q0rŰoOq=vӭ\o=59搭 ߲K!j4~PúEzx䀤̭u`otq\Z߈[~jM5 :~6᳣/g&!T#Gk|{o@>*A/hn{;_YQkK{9>{C|c=y9y 1+o'SE?˾ߞVI}r4u9Фn{xL>cD*=YW7GrYW~W<*\ǁ+hgC=m6O7ufl~#gf"pbw&1\[7hefU.Q5sC!ikE؃PR89hbքq;5h2T(}ahW\SRlk._vLFv,cfRQV%-٦LW`mVdEd5\VIokC6O#r8&}-VKxbr'ZF5pOGg+ g  ]pL!XXxdB{gAQW6C{,whiNJ1HH*6G98Z֥6ny8z7KHWED;Mu/UwfX{x$IYv3nu)dgCk7+Is"tY,׋7^iMxtAJd;N^D{ -vWwFniwf|6:}^jXtWD}׎MD>FQo[7^wwU"Ք7aFs 1|ӐYuu)PBeÔ,w4y~0~~陸S9V@l;)wx>Q$r\E7Bǁ~vfpzr.i,%f'5fl -HT&XT%*wwf$s8:VclY2Vc[Rn %\vWRgUTGq3pCid1|twq|:29QE8wamƜ[Yf^e8.z`3bYdb4 ybm:)DdjB6h9JWI<-U'ZRǦ_e΃=G9"?* 6B,lj`5 KO,::Gg2lVn6XI0Ttwvҭi.9;HhQƒ;[*†+ja@zCHAǶ@* Khk2qJjXC%r*%'%ԫnJ?XZf0"EsZ.1jV3z5:U#wӹ}XH>D-A:<w֗ך)͈P,MW@L =TJ5jtY^xJjkJx{:GXpuYd / ]kCDֱbxErÝ4>{.E׀BK~' \G/zbyxa5@}gzY|\[^)/*@iK| qysz;ج{q*H%ǹY {]Iy~K{,zZ*;dmYGS~ Zٳ2gf (Cki~. **}0xsJEM_l;kWӧ'Mܽc^e^%'{td%eYn7eAcj"܉x?RƇvJf+ēIJh IV;zJgcVj N pׯfeYg ĝ/\@ls'G)SJ>윤BΎ?7e}xx+_G͑/:Ǹ j) ;]&YtS{ `#){ڈ_D(:Hݎc-^vPXOM_iڂkѺWkyFl%Ree4JP׵flې٘,77D<z:ۡoR]r ٿuU HnH{Ǚl9b3g:Du„Q錭mv銁䡞gèvLs~븞BPFM{5gIz8YU, Yl Xyю~y>(⋈Bw5xH?ǘPܣ3]f}h &7ޜ+ǭLKJͪM왱C3ݿ^޿[kvu!=bzF,eY-Z~+mNv1Y<)$>!(>z{Sg58&Jm)ٿ2kiItM /oqAS@8Y$Y$鷈ϕ[S@g dC%NXb)Sb"0ƎEȑÏ'UN4ɰJ1eΤYM9uSgJ)Mr SЗ0dQQNZUYq$:_F_zҵkNiÞh(ĥpft]L_&\aĉ/fcȑ%O\ٲʷ4ey%y{iԩW^ UlC(&v4q٪u_y~z꫷z~{~jca'Ҽ[|N}i+^$b׾lT/~Nsp.kVIs@zO<0Wl"KN^wuO|L:W2n %(̢ ߽ .7'L:E22k2=+&Y5R?7"E@q?x#-ˑ:@"̟!?TTɃϑ@;ˮXDA a@Z6A @T/1k@ 862nAoӻГ@ܭ# O2['"55(3)B0+C˩+ 2.3F8H:DKpƸR..:@:o C;5b*$r[CeC/Kɡ:CܛA-1<<,u+l4|wY!U\1QT|H+HܯoB[{1ER1l@y2 &l+(5$1L"<캀 8Dy2򪊙ƩI 44IiI?Z+_!390ټx ʑB{@OD4Rt[Jwq;a;Jd[$K33+C@="KwRDŽT08 ,KC:&jw9J4#4%؋%֓0BBAâzI*Ó)ǿdG qǶD"=skTF쬘<ڼ=>dʇTA8F4DaEl.B48HҳIEƫB`Ԉ pDƘO b ?b J͔ġlP P P P ĴӿcFx =QޚϤk⡾`LLDQƺd˩B MQ[ ,pq.1zSZLdAp#C#NtKj*3(14c+BB@܌W/׬y1\|SI# r/NPq DP:TKmgWYKc.FvfeW39X %aMFT/ؽL)}_k IJh~DmfN-bbUʻhM:dƙ mY=J`0TWPUV mmnn.n>nNn^nnn~nnhn߶nnnoo.onNFofnnoooo֬^pp.>pw?nopp  p ppponoq_qwpɩqqqqqq r!r"/r#?r$O?Y%or'r&r)(r+r-r.r/r0s1s2/s3?s4Os5_s6os7s8s9s:s;ss?s@tA/*(tC?tDOtE_tFotGtHtItJtKtLtMtNtOtPuQuR/uS?uTOuU_uVouWuXuYuZu[u\u]u^u_u`'u2@t2@aObGt4XX?`vhvivjv[wvCOvDgvkvovpwqwNGF*vsIoCwBGwbw'w{w|w}wn'v:*XCwGltw_xoxwu/7xg7xxxxwWtg*yH'cvwx?yy?vwyyz/z_7xGvx7zzRGbtzyvcGv{{/{?{O{_{o{{{{p!q,V H*\ȰÇ#JHŋ3jȱ* A )R` TH- RNJ1Gɳϟ@ JѠ+L:65@`If՚J 3 tسhӪ]˶[a2UV,N5lZs LÈ/$X]~*qJ)%oϠCMZߙOr y8^6-ťsͻw[z 9i -(ܶ^KN:V%H 3Mjg \ӫ=7L3MQ_ۏ _o'TN$ | |I :H^re ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&0F+Vkfv+ӆGknVnbnkᄈ믺;oLX`m7GRwq _q # mln2O-| $ :$-3Hx4Ҽ2~\RXg-1I*CW5;vg4?bC>p˵xuR@/f5&lnjdV!'ݔW~/Ԗ?|ۍ M2ɳ^4uKyҤR?R&dZ;I+Nx7X?/zHSՋ?K;y]WAz;o]yw;ȃ?.->HK|^\.ng{v.Z7 ,NBB5vJ72E( +g}sC :UaHZΗYg:10Z;"W&wk C!5>/v AgxWG"\[;%ωxl Rlo"Hib!oHm#6p GnIAxẉ*)GMh2{).YtY.U5hXV+=mj_2WfBl̈́I1ݑat60jқ3YA.L:%N's_ 'Izj >SO1DSgD9| pPt hI? j%CAQ$I"j@"R4&AQtF R,hIo~Ҏ8MAE:ԓRt!EQ'Ԥ:ԩLH_Zу4M UѮ j8F*Gy>Q=jQԡ*+TTV*^'*ցT,/_7*oYZ־ ,\YZR,\ӿ!icRXx6=K[+#bv& RUի]*oMRv*-)m.Vőm5ܚ-'9&W!li˛\VmU:ŽLj4}.8Ӭk]kսռ]/ikO7}VO_*r*w -1iWКgmꃇ޸r*5?.g"$3Z%R¨1s]*Y!r*|*v /o 9XQ\+e0pK"u3^'Veem+!G@ FhZ*ߚb2s=4͌Rt@5Ri W6rAz*8DhOIZAesv.Lju7A7rwϻ-.ϭz)Vj dwJˤBğw |ƺӅFq `Mm2SU[-BY A6e j 6[:1|]Zr3 ?~xZ"[R}i/mY9?0K~ܳy&V|-6*ԁݎSuϻo+&s;pOq"-n;G"(Y[ķ5l^I /чtIc~7t>2 $rQyycJ>'\zAk"'MO7Pl^๗>˃ܐ+?/䷎ر'{rڧ{cQ+}n5@g!n7b`freEV:\twoww|ȷ^XW~Y#p~7&?Qzno#;uHrASNk5`ՅW*8r k k&W,5\.p1~t`HńO}@^qVE8xesiȇvjShSD}iy|4mxeyVP}YЖ}v͵ԥ%R 'b7r-v|(Fk}ETXG4O_H}XZJx+Wxd0}G1ddGz|\n|dWlȎxzb{7z>fkFbG9Y {ewS%eٸq;脷}(}RH-UXVX URhFLiV'ǐs8a^~~nlfR#THn5m7~(Z*EC a%V$Ʌ؏W׃AuBhrW]jTx`ւ[n}PUy_\o[%oL)"^q]t)#[kˍnnbۓa"ߴl_k^n x5 W+1c]azW궻YO\18lkP5_ !kg{٬h!GB޽xѩ7]͂~H"zfEZ \呻Z֪P?-XTsΌE>Yk: =?iwn=9],W!tY`=~Jo[|.u\Ռ\z no̖o$vxP5hkSIy~_ +}+"=>&NԢNsLWA .dC%NXE5nG!E$YI)UdK1eΤYM9uӧƁ=IтF.eSJ-bQ("ՅFlݚAb*Q(Beժ4a3d Ip 5yEfډd? F+ׂXɎ=8_s!O,Y$35^3e8)ج:LP[IT1M8s;4.p͓F0j!EM/O ;ߏ^;ܖك} ŵje`-mnx[8O9< E.3무6ɶC "o + i){K/Fk4cnH/#3t&Tqʎ8Ӓi3v+ErE,hdF KEsMF׮DSO> 䭭9+s"Bt4^ L"SJ|4#],0B%lT7FK66]T@T״\Oe-5Sc;aAOWCߔO%l,>Ys6TtR%͕.-5fIfGT{m +=(_yRl#?~sZ͡|WBk9 :et\ x@)ȈKZRW>eGvS7/vYhgz\・ չo{;]A10)ڝ~Q4M.*Ib_G$WQ~E N3* @yG&nRͲ<}[_b$Yon誁YpZy`4X7I=Ӗ`go.eV؛Vf8-&P}8|'pn`Fh!HN!d۩v۬oN{PU N[jŒd.RkrUW(5o7 U2?.QHF LSJb!N:u3rh%BP2ɱb&[W[i'@9!UK` h%H&pQėdf3?U]|_#dFglҌ3MpS$g9yNtcLg;eVX}0Il笜",/zQdx$ ]4HLm1t̜$Q_AD ٨600u:KPTTNeNMu/E*QKO= TH i% ^!9hR+z,l;)ɐKjPH5< fL*z(C:SMm:2mU%+H)GU+N}=(lݠ3DjKr6^M_T0jf6#-cXo'ˊd,:'bvT[$^ Sxh՟bjZb^S^a/zRHFNsdI:X GcX !ɼ5g0/-hy+f5^k[{_N =^5ź5nW&p |`'Xcno N p:s |ԍ|駃IY:g9mh8f=u^;kS=*\ERz-}#|} .ctf Syma9\؎|LmT5Ug9a,EǼ#T~ٻ2|:Z/l~tc$cTa&|9ú6Wed.S5.l ɋt-պV(O'V9X=ᨡ k)ɮ$=wCNjEV7] hS  f]Pu>'T \P_ujFf 'l?@WqcIUVc.rZ+F]řUlE2FB ,Iy|OV"Z`^dܘWg9dDi-}5"h:R$C'zэ~t'=>G&tÉ759Q+qOGe9N6YU^&e%SiϬhsbAn 鬰;/FZ/6rkwqh隆<@5I7R[@SV8 9+%LAt ˦A#A7 S2׃":s4LCVEf1 5$@C32#)^nk bT-e A J{$$bdKT9bFqњ eE4 N\7\q"n17L zBG3%9Z?DHN>S俆DX͙dJw$t<>L9I JJz:zyp5Yc?δl75@䁓 PuЙdL LP$|ˤ tI 7I$< MI{J5}QT&DR3$R&%DA 9TlI&R-R.R/= (/J1t,2S4( 9e6=%S;=F7刌F@f!T'MS1D;+&kPId?KMUC6tH@8CƎSAS-\SQB#/QXZݮm+d0"U`}P@VbEV`gU VjVkVlVmVnVo]o Wq W@r-הAWb qm3VvuWzV-GCWUB' rTslV<)錝RؙUXԳQ={'w؁EBXAYTPٟ`Y(F%YBXӃEHٷ/r̈ Z0ԉ`YIYJYV-DuSYIDŴTCɀ%WӖE ] uT񣛴Ga{[Lm=m ZV[َ(B%[1ܛ"zm\}\ȍ\ɝ\ʭ\le\\͕\\\]-]=]WM]֭mn}]mWٝ]۽]]]ݱ]VmWcUUie^%^l]^kl-;^p̠ _׵^j5^kgMcu^_m\_@W-_uxE=VU` vg]m_`>`(aVWu}jVS`_:z^V^ a ^ >_v"V&&5haf ce b3$_=Icb)`z\:bamV-!.3Nd]uud7V7VFn]m=`/B`>fVDVdTKNIJV`%F`^b noy e,b_e 2fecU<ebI^XN`6e`afa2*cf@c>gdFgQߔa8WY\\gugg`|ddugdVf݂N[bhnhWv ]~o.gʕ&hch !,W H*\ȰÇ#JHŋ3jȱǏSL' H HqH&[ʜI͛8sɳ*)R 2EXTѥPJJիU:%zXjٳhӪ]1&YGWuݻx[֙@GÈ+ ;^L˘1jLәEyZըc˞Mm h `sMȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihl8śStix|矀*蠄j衈& 6s2 }JJ饀Z馜v駠ꩦ(6jʪ뫴j뭑랮 9+v 6(zuNҙ-dAkKd|[izlо.+K/{giio.EpYТQpV;| |"' i)0$ZV 9{VYͷ\M8ŝ^ 㨧6qߝ KϬFrdNؠ᫧nŋ Nnzyo\3ƃͳ~csso>+z7۾(9i{<X/*MmkV>:J %X+ w &ʂ!DX<ń(L W0 gH8̡wЄHHD.PH*ZO-^l"H2h FJcE9xc GNH)C>RD$L881xF*BCВ̤&7 ELrxD*yPґfă*JV'P/, B2&y"/?Ib!+UB&,yi(Xe&ެ8oR,)R޲ml5QNxRGI:qz3-?8P3M(Jz3m'= {rcA Pvq%.JҒJt(E=I3eERdӠ.ùю@bPWRTQ51y}hӦ/oӝd4VJCTe4\ѡdWXKVW"Hלƪk^WNb4k"՚Ft<(E$aωkt*ӽZlFQ b]*Pj4-WUkF+&BZZ jnXҀ!,f H*\ȰÇ#JHŋ3jȱǏ @ɓ(S\ɲ˗0cʜIs`*UR ( @ JѣH:ĹgʟJJJիX;$2EdKٳhb9SpʝK+qxk߿M@lO+^̸cqD\˘3kL&7yӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihl9śStix|矀*蠄j衈& 6s2 }JJ饀Z馜v駠ꩦ(6j꫰*묩J뭋z멽+fZgQg~BKƜVzgL[r{lIΙmYPiЛ oT z"& yrf$k%3 t ,֭rZGL2f;V1{-ҽ4eLd0is Qkm⌷xwLxHm5֊Ǽy?.sѮtykr1_\xqw^^_ͤb7 K7/}ˊdo觯/o 'L:'AR  * GHz&LaPP, W d9 _?,$ ZEJ݉Y,nߴ$*ؾ4yZSibg]@Rs+טVbm8{N,<,mK]ڶ\}ukɂ  ^м=̫@; Du(z;_ַ!,u H*\ȰÇ#JHŋ3jȱǏ 3V@ȓ(S\ɲ˗0cʜ) U@ '͟@ JѣH3L EϤPJJի*SPgUbKٳhӢLmIpʝKБ)܂\ԫݿ d!SX̘ǐ#KSޏ^N̹7 _#Úͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*iAST:?f馜v駠*ꨤjꩨꪬ꫖b 무֚:*j*+k첰*>kVkf,vr 6kk@.+/Λdl/z l鿚l0;ž6L nƪn;j<&3l–˿ *)WZ.۩A9:\ 42'K 3*4P۴)|E n5D#m5AmWvo0sW2,7XkuG_ƅclxĥbcvܔW.塢L~>Ԝ)Ԣ¥˰چOѭ6NNxhWw)o:Zߧg)ͳͻB_^Ҿo6|zmg.8c,{o:i-ܶlY>.~Cw +M#8`SX4)dg(*Œ.~ ^r5"&9@V8DmT+o; x-*j+59.z` H2hL6[H:jQv#>~ IB$"9GE2|#)JQ eĤ%7Nē #%CIRq< rGMd qDej\JYL-sIH#x/9]V *yYFd*Ƽ*E)GZb&-Mfz`&8ØTTHM9ϙexD;E9/Sq&,gI/+]Z2h8zmc7IJ\G0ЏID(=qːX,)GE:K}>4dhA5ISjShM[:QB)DQJTI^h?ԏ2uiRUT#5p2}i>ӗδ (W%V2pQ*~CI]WRx<W V ]+XȮ/5(?klP5r9(ZU+QQYƶukIjV}+ ޶ A[؍bQ^%hRUmmt],pSv5 [ D= }&xho1sy:eeZ]Tٴln vgu+Z[:E)N{%~iulib]>1cohmgLix,6#T$ y񍇜H"Kӳ2e@!<, H*\ȰÇ#JHŋ3jȱǏG@R0ɲ˗0cʜI͛8iV&= 4ѣH*]ʴӧR(QXjʵׯ0TR]˶۷p~LK˷߿q"8Gc=^̸ǎSTi!k̹gE;@ӨS^͐(Y> 0ͺ۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무jS:?+k&6F+Jf۫v{,ކ,k覫Ժ n @+\ ǫmû@R<1~ w7{,mʪ<(l,GkW,s?SKrCOQtH4LpA:,5[u9GuZm[4s۵bO=H7lc89v:uƆU^8^-Z.Dʹ3{j;}x֬'}qÞjx㏿s^5ѤK-zgN7mk<; {6 Ü~$#mr#:0˾7}>#Wg>{X5]xUHY/iqk$ԢJrkS*m6H^z6dW z`=%ZEVu32]MUJЇ&VYM::W 6&)MKVv']jg?! z-jOS=Ŭq-v#-4 }pORQ.wkVMi@;;װwDF\ڏeb:hbWܽk7^%%0k6/s]:UeКP }k]mծU/ G7'qPLcBXM>d STxPiL)+N-2e Sf}ٟgn ˶)m2 0ѐ=dVƯlKNGEL!, H*\ȰÇ#JHŋ3jȱǏS /ȁUR" p˗0cʜI͛8s4ɔ) IѣH*]ʴ)ƞ-S>H1ԩիXjʵpYA^Ӫ]˶۷S '*p˷_xܻ+^̸1㔐S<8ˎ3k̹Q{ ӨS^pCDZ۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무jqB+k&6F۫`VkRjz kk+-V oK tr,ll3.L: 1' s$Ҥ ܭx@c2ٖp v+@tR@VI1xL4C LPǝ7?đ?:&a4^w@ޙ~3 h9c`ږе G@uB W@}4n[ :x!Mt]xԗgXE5:5xh-PQ^^S(iAyjT9h,IP8;[S\N?BPK%R͞D}? И 4TUb[UjTME+1Jt[oԨT$jTSZhM֛vҤjaX:,0YՖpť\J"U,d)ͷ2}kAOKNԊ+k+[. UXVܬ-P%qK[T.v}_*UZun ̪D/r)\^~ֲu,i6{m^F7/wV,Q^>V+m.m{~oX 0N4rZbֶe.|kazf0WKacxq?9TFǢUG0!/*mGGRضI/`W*[e!m. !,u H*\ȰÇ#JHŋ3jȱǏ 3@0_(S\ɲ˗0cʜIsf(OVd͟@ JѣH3nXgҧPJJUM}LQ@@`ÊKٔR۷pʝ3Ń!-ݿ  خ?w*6Lǐ# }pGJ̹ 6^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐FZbzQj饘f馜v駠*ꨤjꩨꪗV꫰)*+찿J챫,.kkF+V,fbm&+kR:Z׷:4A~nӏ$,Nkox@Ŏ{aUe pȜ 1I* aN237w:x26LcjЬItK_e$gu?om;3I7}kA_cc6m5wћnԚ6]UWOC8X{ν8U aO3D<4ΜO|9ߜ :=53=5z^)# =,9Z (?U;2Mwu><HK\¼/j'gjglC f6co6Q CD U> Jh*Ps a tܯ g- a G3mwxUB0a$Ę-B˜F ː$$.D&p|BIQ򏟌V(5RNL*WV򕰌,gIZ̥.w^D%0IbRL,fڒΌ4IjZԄ&6 Lmrsf3)rR D9vg0KxS1yJr ?eM-\ |(-*N.?Iщ)πvԠMJӹR`B/BLc ˓b4}MU & ON5%gRk*LGe*R Rd&UNmV׹ӭr 3JӜ,FT%jSjRrgVTƕJEWKLzU0-%beQ.֬4l;Vε@3PVV]͒4ymkh%K֞ӵiOa Y:6gh,l3MNMW.u(=jQ XWNurwK]V7DkYzR<\Ϟt \h7ҵlgK߁g~ITrU+-F z;Z =+V ޯaXVl'6j`jXj'T'81;\Vd(L,by=2{ Pn珣=I$F&-,˗'7Œr͛6 !ʞ@v)УHi 3ѤPu:5Ud }z+NY"KanjmIDzuKcZE[QoN|3 !J, c ##p`A"$ߚ (a†!3,fɐ9sF`@!,f!,c ;C_AgpaC"bA2! ,#c93ПA8L@!,*` ɐY㯠?Tx`Äq̙!,2c9CƟA$5  !,;c诠@ $cp!,Cc诠@ $cp!t,e H*\ȰÇ#JHŋ3jȱ H1$5@@*, x@I"gr\ٲ`ȑ: JѣH*]1e)!xR.JWc 6a SP۷pʝK )GR]3@|7>HfJv -Hjǐ#KL2BSMaSȔiװc6; LoD-v$C PnȼV9;У+MY*c -ɹ.o+ヮ.Z~ɓ_1Cyrɧ 68uDl6JQUa7wvFr:h()T*LNUA amPHjhH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+֛SXAX`QQ\о LS@_\bO "SL, //9 s$ 13;Lr&wt#X۳J9cm<ەS ?|לS MFom1 ^1B w˲` ~틜ǿи6j.'HAF.p `B4XAy"`"V~S>Ną&VV>:jz B:Pp>`H˗ /0rˠ~)oá)N{©ap_0@.2Ia^=ŏ XϞXžUwǚ-MX3r\7A)4䜢H b]]{%gkΖ5 jNRdϩrE;X|Hޗflb~DKg"Kr(̦6nz 8IrL:p~<)zz̧;~ @M|4(BשЅֳ='" ӢͨF эzt_ehHёn:UMvӥ&FK*sAq>k:a) i Djmn.a5ϖӷ2~d /br/H|rkq9 M-/IYbI^nڿq+Rl t Drowty/ܒb7V">[M]H#=9؃NIkh+V_XNKw}355\n7իμ;"Nq5O뚷7t9^l6_xqh* k{ƏO Pŗb5r˻[oM}- kX S;uc6&uHo?=SrMr7?wKrU3agypEo&}Gp!ǀ3|rGv z&DswwwVKy<`sXC>'H{fvFtЅw9O7HQWs8Uj7y&V'FrzyKY-x~=?D|vfKQ'swuMhwwy}m*׃禅c~`xwD,xQH80"'u\q}熧yGA{`HdbXztz QDxq(t{E{tpvpgD&|i}8Xh}xr7MG(nFX4z",kׄ5HDowHXIWILC9~Xmg|HnD&vd4Dh-t A8y9sC>m;Md+(8Y^(,a4gM:89RN6tYSD{wL SyԆ(pfm@_@/BAL vy6֛ {))uxqhiY$穎D,hon؉&Ii{KAdmvL:u-9GhqxT[Rɐ@GI1II)> Z&K75if)|ιn1GQ.ddXlp(8h{mvYI:/zisڡOZw>0I}鏵uSHrdFE4>?X&Ds#Li/ڨ"FM Dz*(@BӠXye QK7~{*siQt6g`kJgꦙ9zZw3k;;I֩[D|[atL׸%9RBXF٪&{}*$nYM뺥I-~7zw5~H7nUD 1Awxmz:8IG1W9JVL=hؿ*. wKۤ2\tEM1V _#,G\5we*;SCak4[ѤsdPh|gFlh 9gO5wR ÎfrqꇍwAK_g?\sG*vktU s˼˵|@LqFA̾|Ȝ̻|皭Aʬ[ ';ќzdƽ}"DV۫KLA+ǖs?doV,뻞` ,( }9Œq*W=(I7i%3x;͂=؄ ̿46]،؎s ٰAn`<.v^"Jyͱqٶ}iخ뜳NB=N+a+|M玪j(|YL2Rܞ$6ܽ-{YKt~FI8МL+(tכp{r:ߓ|?mlIipS Tal)^֏ΟͮZN. ,0ָ~gԟu|&A6.>^@~zB+KԊye 办;sgƾ\dw?lwh`mŏ'{k-ߞG0ƗD)ƔnzN0Jp-sAZ u[8"A[I2C./*Cj6"وqCsp 8c}Ĺ#uTrI&tI(rJ*J,rKKLi>.4L4TsM6tM8sN:$s!=O@!´&"*DQH JI# t8زo8DMtEt?BRKUըXL3Fa|1Lu4:͟JyVoēک><6SaeWFLZ9=$nQlUӱ'21s3F+Su՗ޮ}^%@R3P2Xk8~WrWQbCUJy0]XO?ѓk01g{gzhˊ4zivizj2etMJnNamą>EU`k>J^ b$˦nnP:7 knLMWp0do UQlp"KtY°1B -|L]걜R?fJDժ 93iX64Meh@D:.xiؿURUQ?g ![YP60D n끙cȝnQA7SF Gk1yΫ7d]4޷!boOUT 5YMfLxA H_Sz?(G91YN,)nv6"Tr݃$k ]iOyon[ȰaFSӤf5y6 i M݀$g9yNtSNäQ9@󐸉%Du,'E#5Y ')!@T(6 +aG)e8|Qr$DҹdJ[OLXp))Y46 /% 9_ʤAIN,iᣫndGR,z̔ Ӫ2=*k>Κ# mIqZ`V'fb!TU,EV3/z  ֚jmY!)MȪSfl^7ѕ~H.kxX>&֐SaR_t)d2%MqlZ4X<>2؞kaRgcc4j[j5Eép@@ŦęM˟-am#W>7:\sɏV&vٓy2cj qY\u%,k9!1bpfLп#&qM|bMH6W]ň3k`Jqm|cX;ZCdo Kx-ms ]4T+s)sF脛&V]k\曮p~$u̚?K sT)FKG ]$r>jLJ'۴mLjV2\AZ(ժ.l9k%^*vXqQQDJXegzrp:NͶ5gWθFR\4]KVV~K$~R!ZT2 VB<$fjG3pg\Vn~#'yM~r|W5b9o~pĹz.NAcFIm|frsMÜAK_4Ꮷ8۠}6:e#jKLFk4dĉfG!ǀ4FC e$H#CTHo܉oƈ Gs:GTAuLEKLtnjTAGb|ƀlhlH|edm|F4ňI*džʝȒ,eʓ,y-l}VxESLCc  Io%VPTF!M0&5U{V# LsWuRWUiٛٞ[ER1MSWȣUP|A'UT?XwYzeA{]TtZStSD[ҢűZ"t¶͹úmμ۽!,*NV H*\ȰÇ#JHŋ3jȱǏIUR#p˗0cʜIMR4?:wNB*]ʴӧ ZQT>Hq4ׯ`ÊP*왂ځp}Kݻx-L@^*:6EP+^8k rUn̹ oHwf)FͺUp\N  ȹxܺ+#μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)RX`P YSi})(DzThB ħ-:%B:hb()@vꏦn:ZkY竍z +*@z+PKiKаJб{vʫF;ER)a; zֆK&Vy+&{ɬ )**Ngw7$l( .0h5>Kn0\qɼ-4xF^F>o, q>ݴ;Lu -S+ךvg~*c)rۦ0\'. m6d-;4Y 3=قX9vU۽.}7бO8ܙ;zN9剋OsC};׆s^ŕ󫻶ߞ. }=;[(6z_~7ij5] qI1:*b<1qXU4A +gZֺDAu"gVWP[&uke{]FݙNZ.>j#dY.2$߹f R_֛VY6 謇ń 2+TƋ)jƪU1{:WGml1pݒR2bU;]jweZOtBjg"-sOhT\A:lyC4^̏bh,*aDT #ZT *HA0rl6MʝW4AB-l%={%?B/}꘢*0QU#̬Vծee4U9.fOha"Ӭ:\Fn;]zi,~ϜT*nO!65(u:0TZEn mbADK_0xNMjЕGҝ|cHi{i͇ڢvO>X-D&ѭUk6g om:}$Q Y<:vέ16njAʏ#3ym/R]MV[iIo&}6RkM}FX(p vS PՖ%O(NYFnrW<di, g0+R¡b/Uݱ=ʑ4"? D6^c\eA^ kMJ:|66͵ZBG")cզ πҳI#zlrw 5)({FGRZ<%=.s!<ݢsZ6ۆKImQZG5rMP56hcv6|FU솸,;&`id ئ6A@t{;:dm_!ЛJKpXւ:/j\Or8BoG6야u9UT+f_U86p| d1^m..TS޾GKv&1s;~B+.9Vair9FӺ,;wRs=F9Kڝ}t17fBeRf>Ck86ebǃu#%udXf*}637["9G$KX+3_X_[%]E3(v6uWRxJ5`\`-8 H[``&"x-ytv{Bg(ؔM3 X r5H9UDÌ-و9oXjN_Z与ȎtR.XIs4X~SuwLpFMA/vs!t1~ 9^MJc&wkiIhGFpvBO--JIId8Fs/G>* hKbqewR<7",h;gBL CHX3:5Jf~x5>tǓsJujTYWC~e@?Q·oJfOoxlz/aV2wΖ3\ؘǘGc3͸LH(#Xve16O )OSdx#Z̵qZh9] iHD:+լJsJ<#R)ib s+ԮD)MY>W:9 'k.w3U'oʱy[2%Ei0NjgJgw DzFJ1˛KkVc*l"ˍg{5Qʠ{|-uekkWiZQQt[}W~X%F%LŀxNjW2IlY9X5~'B|G]̙|Cg' R \=|چ9UVգC1; )]GIwך^Y;*3̭&]!Ex Jڲ h,>0-)ss9ʻ}u5jȺ8[X銱 ~zϚL~."ˬ|.j3f4u:31zeM4&ԎGzt8vڐ +&VW]bDJmKh/*` L\ND y۸YJaZPΑ/9C Yn~:9Oo딧h_ c/` i.!N,8#2<%MhT`$-eO9ȁ'i_oq?3Lˈl3RS7ĩ`\=XdS~ {䱸v_z"(cbV[3ZʠBp6;Z}ʨOauRr&j+kX(qBφ3n7ݳzzgo2P` .šC 24(bÉ1nhcƉE$YI)UdK1eΤYM9uԸOA%ZQISQNZժɄYȴpeӮM%[Y0!,*V H*\ȰÇ#JHŋ3jq 'V@@*!S\ɲ˗0c Y6G9y JѣH J RK1իXjݪ2EPtkkJ5˶۷p02EqBg޿ ,JI8 ~ KL)l:` `Ө)*ghw!۸Oo(0qa%),9ȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`z7aИf>fIr&T'CuY &pZH'yl*?c>gwN @|I6:PT霧j (թ~楘 )ҚevJjz,+9)Эn,ԭ:괓Bmy*dk. J:ʾzY-Xkp[+ٰ.2 , 2n@hFB*2zL,l kЧ+80^flDab-twXvmK79nfQG{[ hA/_f&ŵfDgrVl9}ktkmG:ڬj{[]˼J>=G~*zj+#4ZCi}G}|GϽ+=S<:ojYlO4)oUZ6ݕb+k:)a.͖绻 ]`W–eP; P yF@@ sZi DDq!/5(#VƥD}=*"#ڇUOqZOp51ic0¥e1g8KY+}z iQU̜(E1-z.ldxHQeaCNu+H/K}Jn|eIDa#'ɥ|%}(L >:Fx8Kd:ЌfFGY*"D4,-&#on*&9򡍋cqT*Ԓa`B:スS Wt+]t $FA*(9#jʁ8CWVfHGK:=t`|׷.D7}ҭt(H`jRDRγݩMËte8`O')b4 qb(t^:}^ KꚖ|,ovҷp Q 4A֭b8J%|$[fzVL$=&ee`KiK|K%\{04LI.cU4αw`ly#rAِ2cǮX]t=g 泠BYXI$Dd~a]苔ij?y#IᄈS|}Pwv>%wg>kŀ7}<ӲVY${fPѣ^evS5 c'T_G.Wh3;b2S}WY(tsedorჩ/tG@:tIKHNP84pf^ !7QhSh%bCq[xem0e'ucOk3QT-x? w\v\lr'gJ$igU*bֈsgq>^@ w5ja G~mX󂉋P*C]B=mVN_s~~m _e4Řg%t&Wz{*T58s4ptjDoȌG|7_5/tYMpLC wgj8XqwYr/L؏H-0G?Wt!uJZPIV>?Hxs94].QQ`8HF}DVqu+lԐ0t%|N@hWłvmT:T?GxnVjSQu,Hy5YT89(C5W=Qsft.~w{bJL&=S\V@HSX\,QiIa`c}yWpVSPuR1=^`);h)w7z'{681G]3TR&dӅ\9\Y}03<3OR4a"H5If/8v3$؀z9ŏkƉs&lC9 Fՙti؝I2!y虞깞L5Y08yz<1d.C9 smAWgBAi]YrUD=Y񝕔AIvH琒#voWJ{XgBQ)sK98jNVx/9FCT;i@J Dâ|d{3ݔ?8>R+|d؎yب^XUmkPue(Dx9>ClhĦ'jX^3&xlƑeGToGCS(q:HR> Mwy~/*)lZd,=avb}z3Y`VoCJJ28W`V?~KX*HxpX9$MXpYC:C'gaz Wؚze*U:)8W3%g vVF{E՗CAJJsʋ`*kgx浨6S6`H_tz{U:``VȨٱLHfvJJH,;uƷ)j*%KW);JC}PsC17jBQ1ʠWC:Vl[1-yIXC[o+Ѵu[ΪYr2A|( &I)ld/$/,C sX+5Lh)_Jt]D|&ԢE&N6S~2?܆~kRLB`DШإŭ:=SńxÓ@*.hܙonŤfbR$^aGWJh LfldȒ<_EÔɚ\D-f!!֔xt3F7w|좤d:싃WLEF3̺f֕JµOhpX7gmh?Cfhrp /YP+lGbֈhZ䋬El%JcʹEp ftHt U ~?b%)ۋ"YC(=j˼D+m L 8#ѬG#B,RhdT,Z|D٬On| GG {0wSA ͊vxZDf="yx fLp-c VO&ʷ:za.a|]؆ bc }^mLNݏ5 M˄%2xgԾڬ\i[{{ۉ۝2mbJvDw:+jK{xwK,Kiu9TJRzYݵÝL%zF2kCy0.> -JucQiKC]޵j<* f=rY,fZ Y.mE͑g-yʷG+qY|LmL~ݯnN{k^Qˊ̈́y1h=u/ 7T?5_v+aU+c޵K]z+*?ՃGmuyMm#ҕ(y3x5مXnZś͞b?X5"[umfܡl_{p@f1xw!]jޡoo/o_.h#luY0{D _oۆ)?)_&fYޔ}li__lPnK3z&o&X3woO_$޼AЄm6h //8J X#XA .dC%NXE5nX^jNMiҢeϦ: !,*NV H*\ȰÇ#JHŋ3jQa 4б! z 0ɱMlIϟ@ Jх)R\G!&]*C UN"HfԇY!z׳hӪ]˶mI H՟U% XeLÈE&WË"@?046_+'M4#'fu NlQ N8j ܠju@ᙽBOܸE~`Gj@oɓ}t/yaY6c aQ7ЁE(@_zdd $LmV~ r,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+mX`aP^mAStKQQa{ UK.A.CNKg+{Mq[B [0ʉ lEO? C/gTq[f oA`VBD4 + .$d OX;ݽ05!j@:w䐨MmB('NEotE_X-GHre<nбBo`ūU$Gfxx\_%A0f.3^#2]OqJ]ymi3j>oLhz/D.<(=†X4ڜH ; 8 8q0DY0w>ufE˵X5r+GU:N jN{Uw8M};֌Jgv}yϷj-ꑇ-F;IͨU;L2uuMӕnۥ3{NnB\L+էNb[zurSeĹ9ӦaKJαm:ο)3Ɯ8 7$#e˦`? [~~qrcdw6g6q&Ɵ zoYq%ٞ6iHc* #vC1;ky^+p8M}7r>elʃW1;4FگFVM:}`\dim3 pc;LbklC;ak<:cgug}Gh*H{(Fx-xYdjXX)RH)c׋/d6d@sC'r2Sq>d@0uet3{HHֈp^>Q8!28Ǩ1ba`(Qkp~(#ӏ&6r2xay$%Wq %A9 )#FW.eH89Qs(H#7RK)-sT* S.2֓IH(FoMR9TeHP`MHswO {WkqquSG[)1Tl9ys@9rY$ig  #dW'zLpym42 Q4y#w>5,7BROK)hWNm4fx.Vh =f,3{+mdoEWu8yreI6h5d~((o@m֛fҚ{IkhTȒ.c ťʞhʭsYIz:j}Zgz(5 ڭ R1MO9qZЊMhJyVW4mgH?jwlI xtYJÓ )\V3ȉ^`[+]rt:X5UuIwq .J-ڀ:Eank+3+{K7Έ*FbIYzy?do*cKF륣+*Qcr*:Z3h? Kq7ֵel&iۜ+/Bܩ#Em*.H KJo{g9sY) 5kVeGW˒kk:Q٥$Y+ھ9, [7O{goӿi:cv 4 Sӎyո!KP- +˭5{1*f;{E@ͳp(mg6Uڼ1\P/WU6k,Ugo.a\n_-pzH*LNa|L)x5?!FA}|ȈB2gT졘٨;mȆ0v dD5B;biUʭܰ/Jv.KߗUcf/6JL@Z A2xs{y|ft_ ,. m {M̮l*zpQSK0fQ]\W-j\;+l/8nk lrLZ ]RͭS:!4=#h;qQܳ9BIS,SWL&-@JIEګKi,IDG;9+Rt ʈ,(kaѷ/ؘٚ#^FFΔ,=}GOugʟ>(tڷl \Ҕ"ѴC:T-M| tZ-* [98¦{CkܤumܵCSRDl_yo|>Z/CjOl̛llo?iϝ=+[ G] kݱZ'XFBb {"a2U^mMmFݺMMQ\T;{X)Z[sq[b>`;fN˿,N?,DŽ }ڦM$nd:.%-}"0?7bsI9yc啎p n/M]ެA|+8Ju}O{S-wċNĝ߯bSj<3cGW2 +Myӷ{iJ+=P][ZcUjr^} S8.N z>F:rO/Eϑȫ<\b/90Ut㺒e+Ӟ8  T+s+)Re$%έ㌺o S_?BsxQ])zC] Ա.·d4jS ') b!菡@, L80E V^Vn%Evɑ]/sj+#FN6W|q-q#|rŻc r,M8sC}tK7tSW}9Wmsuk'y5t=( I sۃ0ĠC3 OR1q?yy7DNj-e˫V¢(LU:W.$5%8C澈M~ 42K :^V穦.*BJ~>!` d` U~(`{b0GQv4,`ɆRݴC9(滄xMAG Lf7xq Ti=f]JV|0UvҋKzHs$A0{: 4m{ߞn|td$ GnFkd%-yILfR]wcENR$e)MyJTR[URc⼁MOcJ,gga[\-_cLݲ)%[CM3e$XR_ƨMuB [ 2Wt{ 95;1+_l8H 0J7XC^@+z&lZNٱRb13JqAщҒ"BP*4XB1pDU,|N Wltc oU싵Rx'>D0!1 5FȣY\B$ZAaG )u#! dd^\SC5.iR!-xgV3LEwS*5iDQ Cމ%۩kCV 4]zd.bMhNg1uZi{[:3m,?vz{\&WensW!c2t{i.i]24kL+zs+ Zu ]0~m)𵲍kBZ%'+W_MA'}9[F }s;KY0`Tu`!3I2hJC[ Tp 9{c8c#H=M]LR۵I,=ILF/OzKC=ɘ4_^ɗAf[ ~wZ XӉ jY{s:%&t }hD'НBG+^| bIs(-:{d &ux8}D-yg&qS۴K3&flx㜉%6bX˼be(Vg%ִnqgӦd|YGe͵~g3Ѹ]kg{ݾ*T!(q{q>$ ;f'%omnx#~8?@^7 <4#x R >n$_ħ壂h@jWy=!} ;/|oF~g~_oI D|u;'/s?{??;~H>H@<k> l[=@ >$At?4@?$?thՑT? SA$= ,@ LBAܼfAX@A##=<6D@/>R,D *D]d7E(|a9 ;pspg-2.6.6/screenshots/theme3.gif000066400000000000000000014737061360716715600167500ustar00rootroot00000000000000GIF89ar !&"("(#(#) """### $%$$$&&&'''&))(((****..+//,,,---,//...,00,13-2400022233344477739;888:::;;;<<<===>>>???UUIhUUUUU@@@AAABBBCCCDDDEEEGGGDHJHHHJJJKKKMMMPPPQQQRRRSSSTTTVVVWWWTY[XXXYYYZZZY]_\\\]]]^^^```aaabbbcccdddfffiiilllmmmnnnooopppqqqrrrsssuuuxxxzzz|||~~~U/Y1W2Z1Z3\2]4[4]2^4^4^4_4_5^5_5_4_6^4`4`4a5`5`5a6`6`7b6a8b6cUUUUUUU*******9! NETSCAPE2.0!K,rmH*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳ@ JѣH*]ʴӧPJJիXjʵׯ`JGٳhӪ]˶۷pʝKݻx˷߿ L#6̸ǐ#KL˘-+VϠCMiƛuB *pO"P@wmNe-faɀ,2VzɌ)^C ͽf Yg}X 紕uKwfܰ]Mqh46'+䣏 %(b`Y3|C YC+' #geJ?9HCH -J]ly$IN0PCɦp50Hc7dQg? FǴҍ|vEY{'I*Jך:-AW>+bJ PMŢ+뮇%Y3@?TAV,C %B,dYYʬc։ k;l0kl?<|a3,(YH^@i? K/;PБ1`0<<(rud}Qpd!C4Ep?~ M?߁c8pa?ShY8%L8ጇ4䒓U9]7ޖ<tCeN@A__0,x0#z  0d0 $6xA)jBS=˃K!J? 8OHD(4b9ITP̥.E#ťaxЏu HW`(p~xejQ7#4y~~:MFi0+i^3L0IL{S00ƒ0.+! spzH{HThAyЀ@ u(Dt-6a.a"EXˢ1|0XdI 20Y `c ~\@9Hz<~58 4*H0蕯~] S ռbJC% Z(.RA4BЕ%1@dJY"6me1Yka"P sQLI.8  Sh)Z ~#@ÙAv"^xAe {` o.7;97-獮~_/-m/ 8/Zq~pp PpIpY` U{kx%..P; K[#w->Ld^HNl 3Ps)[X&.{[LfU,5L6pL:xγ>πMBЈNt1bq4%"Jѐp,dNӹ´G]PAuDMVF7ujW3qkL?@^ereK؄sP Xq>?(XkN<Wy?>S@fto??GNx<#=GCBI0ga(mfrapΐ04Aɳ d `xfЊBH$ eNp?aGgF2C%>ZEc5O}lFetFi$|՘E[E(WzGh!JdEXtH9jA n;3Hz+C:hPR:TZVzXZ\:ƆIMjce Oڥjlڦnpr:2ZgEƤEG5ʧAwa{{FjkZjc`: ڨ%ʁZizɩ=KCZ*8uK:zJjbhZɚj : Ep`֊Z:j:jʢ $zYgp p\A" <ڪ ur(\@vfGxbt9uw(WwwWGv`sV4'Zұw*x='&kR+rB'g%OG3k+!si"&+xA;bLVsa{Y,dA|̽d,ժU}+c1_a}rlj,2-'~pkzk3>g;lQ[tY| Y-'߇{~Víb}]Ʊ[ص@O9KT[D̒[5W5i8de:Z6˫;5:(ۨk=d-q;^HԪk1fq L<ɕ,ɜɚK|ʀ[I<[ܚdA;%U[U KWYͿc>EY ~N 뇰#)[_1. "T!D.u6|`,fȝX½Z@O#G:wy2ʖfǏRa䉓0tcǏ=V y_ \úHU 0bȀ`J+~Gܹʗ3{QtiKBs6.: O o~(@4tEgË!xså9O b5A "& `3 +0/.tP )kP@ qŰF,I;ʹh3l +9tBry!Uc )`"ȧiDp@Xȥx0.i@%tJrh' : 0` z Q,:̳$3Tw~윳2DRM{&ETS+CU[C`]U@#3i~pqjk8% * 7x#L"N (4pL0%6j7mtz e8EPB m[pk *\X7(&~ NYcYX/7^!hS YdH6 5Vi yg2! |1Y)|ֹكsk]af@bsf0mQWkj`g'ŷP:vl&gyN,~Q:ܹfeX27q{p{]ts<3V0^uuZ=vgva+!#A1$(tx`4쑓m1`2HkN и2S 8v%/TL("2{߻g>opԾ jh'E _?# L`!>hv) =p/^lCX[ ,9P"kfE,XW]kPؙ&QSF,qZ$b^ 8@8GT/$d 5DH@ A )HH.+yF:rqd'WwIOFK3 RRd [T0O<`^y)mSf;`vy[( 0X~S_J噾0WL,X HM<0:9r"֬P4#NvzrST,PM\N g8@v{ P qFu d3nj5P6,@k(]ڀ X2@< Ig0 @30; ut%ISR$U$5Q" @^hQJ X*W 2Ӛ޴0~Sb>% jH+!~UaTҕ `  M lғP"q TVQ Kx ʪ,UKjd!E-leٮ-O ARu>2 +Hikb3~f/r|#A IrQ:.vt.i}7<ʋw[  m›*A赏 c ׌t]\D( % 6⣎xOHFrSGIJV’DŨ e:SNۦ7 #qO_t*ĸDܦ܏ XQ"H`+2F. y\rʣQ ,.za_ &[V?"&qe`7Fsx%i;>;bߒ,(C;kNdbN1BkǜgY!MiL,5Y kN7li3RXqs\Wlg,q#H&].~{xѕک3g?]Fzva10x5ғt$g.Ti]:'[}kga>ɷo(R;)BWw붳h ᅠ_w_3e1~Ӹ2 IM~ۅ ߗfeN\}7OAmr EtͻFt E1n-8<@Um`|S5X @b%iPzVyIY{#ӯR? ZpP.@Z+k Rj+xr8<]Y4j4G I<8, N[ܢ- x-s  șx00 AŠxЋlA:=H4 P "&ĬH B- T3Զz.,SC碌2Q9êd.ʋ XB3]X~hw#C~A/xF4DhRKCj2  @0 sEH!AA:$=?DF?3$g1aPY5 _l gDIdB@CAF,kT#SIEU4CHK.ʸр5ڲѣ2d 3fɨ@;xDD pBd~XȂԉ9{3Șz,2HɗH@:>vUtVՙ4HH|44^{ l 2Jn#yʤW~06 $DJ쇥lJwKFԛU;0 KyI6yIiЉ nY|[qs ) K~ȟH 1LiH6*p δ~7*+̶ͲLsM }s~s  K#88OIϻ L529HY:p9NV8꺴C#1*#\OcG"}l:=⣫âLdOzOKWN,PkP(BP%}PSPRV"vH=q'k_PYzI - C=f PݘmǰPP+LA M!8س'cR;ý(I>(2j[?>곾/? ?0%?*z@*>*RS +*#@d+$5:w MbT+M&T,8BATAT% BӲ"l-Z5M-Lq-"¸-1,TCU2%bzIH.(QDD@DD$BDDTD3Y˯GøEXF!\%]u# <#ZV_ sF>9Fb oLƗbF~Fd1IAGr #1o<9id~p2tMWZW-%.SSr,> f>+rS!>@{*$^(^?')jL@9~" $eXM!Ha,jcJKeA.tA*B<ʉV;/ 9F>hD2Vd@d/B[ .EcPcE]"auc+dCd.e#)!F,WGܯTN/CW~X0TW[Q^eS<^WP"gZ\!W^TX&~e Xkf0foG& grfs[#k${]d[PY_Z1H,cAZ?c-ڛAهv] yfY5|VfK~)ZܴNʽ[f[[ۺi.Miߴhf8jUd[˩aA\"ĥa܋׽Mzӊ\%7]V]k ͹^뺖!e_}> ]}f ެu^EZȶal*Prl@OC#Ԝɦ`zЗ^u::El(_qTm6<$ދmކ6Mm~=_-Y; f0p':RƘNmV %`(`W ^l``V ЅU $M￀~p.p%R(a.E$a"nbSꩵb"ΩopD( S/6?ApT@!8^8dK]`dZ%GU?Uܢ 0F&or,-)般|1Z*wB1[ n"_C8.M!GC-fley cp+f_.EETerCeHe0IbF/SLڍsn;?hFr;f]qzVgFAygvu_gCrm1_ ]Ou[OX(eo2|F^R3lNUUv hW?نNԋh&r` 3z_wnfw'BsIj7i4`!J[uri&֜JOJiVӊ7Ꞟxx ra[kUsj YH>j7jeqܒRTw|\.yk2k% hzViz\8 k88tv(!yHjl/A.M"{"l{7PWZ6톏mP-ֶ6|:|_TS|o>n/Ǽ7}|]z}0D}Hf`'fN!5گTI}pg{(K'Rg.>p+qsSz -p= ?1Sq*~\52諆 4P!Ł@,C0G$ ^ c>xVzcȒi&ڧ遮a_XZynTط_V`J+ųH7Е=MYOpMjRz\r%b9}h%C33 tƀYϞI$ ` ph?Iqm (@uhT`7@k4;**;IӪ \g9h?zh3Vf{}*+P4@)Tc-m& qtK@T9(;S8&"Ќ 9!;n2A#hc:ޚpFTô~pO64*-E[2{>؂%jT/3YmZte>œ#,Y19x3Y?hÏ:&is e@ -6kigT§۶L|SݾUS-PK7-QO\24K.Pc.سP?g9<̕5z1V#8F$c4 K#")  H0@2 A3^!q=SaO~Dg跓}/a܀'< xS^?#`2(iP)0I =p( AR>< `/!9!(D Qr/,H,v=!Cq~p-v0\dF%2"Atq`Nsx# l=q)r7!{cF/rDa!щ|$$#EJ2)%ȁd$(PdF$&bJ0#9+p"%&q JRuG/ʂ'IbL .3(_M5ID  nБ\JLh>4&! T\S 63x@O}59q p,R P 80IL%0E1ѵq " s#! Їj@ 6v" HDҝ#r7@BJЂMh #\9Dln#$w-&@:v,I5Vf 8DS-"XMu'3'MIOO(GAꀹՅE(C!JQnԣ*}8[X*nTB%Ved@ t@W#%W)ܭ 5-S\Mr ]POu/Jce/|!K~ `ߍ~?LQc!h(/e6[ hq*[ІVfjXV89 jR5:moy#m,u@7-#n1C5bS3qK4:is]U:Zܶȉ?q|zǓ=/zN`W%oy`7ס]/l^">ڝ|S̽{ 7`@y7 -Ah,$C(FL,#]NCq7gbFxx:(v(n&++O@HE+>IG9r5T{$ yAe#ءDKPr;u#^%߽~ǎx J|e-)WvÎܤl&y?W4j/V}r!O&ZɌ'=Orj}%GPve'WoiԡwUȪKu?pAO9D$ [|z-yWi2'lJeŕE?! 'f64x]t^l5V~@.T=ăNkuq^r$>GtL I^! ]]P~xsHEv}@?kx4ĝ}Yא|}]dבP9V V4q؝ dX@E_ 8CF) aX"KG rѕ ʼnuYTT4"Aa?@3a*0ȈL!!:E`L /̚M-a?p|b(a)L`g *Za#Z2B<".]!\aN"[)#$[NN8Pa?C 4¡4Pk\@lY`8=򀜒\9ɩ\ʕ;J̡^!< ZhAFdБ9vEL^f]C(]]K$/dORMƉ֩mIERd-Τ$(%SNe9%Y%Q^9#Uv% %^@;D PZ*\zeyV"E^NTj:!eOC\D[aO&Tv6US.77$!0_v(^b[hnG9 DkAfXCcDMT-L4RaN_]NO9D8 7xn GtFYiV 8U ,`pvD UVTXY&<X"YV,~rg]U.pV&6>h(`Dfa* 39mԀăA2b-͇6悲V–.֖}Z&~"begoo9 WgN"NrYseFWa?2+@@,nIDz<@7킃<~ ęG2 (wf& rea!Eb)#F(NeK@48CXI]@v1 `03=@jbWJW~j 2nQ$&*YQ%YFdd'bEA")D1AgT"O\=,LH()"E+ (.e#n/ #^12R 23^A12D@$La?p#OBA@6,k?tC<b=@rmҐZ7*ՀS@-m<&--#R?B2@(NNONA0CDD*@DAl xVAT D۾-D2RdYdMPF֫B&vUG*$"JKf 1n刮>)Cn)eT%SpQ%EP&RBI;A' (>e$)P8/^oPo2'Y;%&:S]ƮBc*{QO/d*d e.pfng/ ɯW/Q,/j2oRf?Hp+-f7ߦUu&f|gRa_F('P UsCtNgN1zf'O\TFm@hLM0sAU1TpNVL)z^gU {~_|U+E~[e/XPZ-+rige`* : ^V@\h]qlkeD_9@H eXfhL"g#[֌&"W#3hk2blm'E +$) l`?4)EiW`QRni~g6aRtuedCeN4 2WR3)"!6C2Rgb !*2Yrf)Aȃr>nX!e_t *8ir.ߑP -vtlIn9UݣHmy!dJg+OߌmVBFdCm᛻-\B6_ShkKPUd?uO±!bfni$)w$HBnr3P.sN6d@lt.NQ7b6t$.N뺮vooi帱~z"6 ov}kBowVW]S$7.%wwox"0OTbZ*Ȳ+1;o1msuŜ/81P8P/ffsw8Ʉg8 C4oPI0O&dk+N ]MMygH 1hyg /Xy}.9#)ߏgP ynu 2r|lÍ >z'G%72rs g:^:kY2Ӗ/+B[9]2fc5i6OFi.ߩfO5:8y:7#{V8:|R8ɤ33ؗ$X"e4*<_x+D*EbG9CCzu&S{ֵW;pkG{%~㻹+"+`C@ @k]*?I||N2gFw/8 P7w{w['G>싱E{>Wa>$>쁸+ycb\L8߻ɳվQ>v8O7wxO?ETgW yRy{̩[GSSF :TGOĎYYt- : $ z+@X%^?y&X,ӄć)>qcǏ!G Vkٶun\s{o^׮^o1xeP 7\p_T\"3VGA_13`um9b#a!+P1t1XZعUmf׾m0޿/nЉdoQB<mjdlO]8qO/ \l@Vtq|0~.,3fX 9m b='Q ~) (zh jFbfZc~lGG tȉ/jrǓJ1.WseQs2 )|Ntζ-m5j)@B>PA pCbF~ӼT1h)MH A1Ȟ SPE%~PUUWa"'>yhU[}t~65~BR=5Uc}'Y ܵ <1W\rݲ  Uw0vqF;lk8 % *8}Oqkj (T8V 6ia"!'Dyc`e *Vnyc!bxusܝ4ݺ| 2𖭞v~ek yg2D gNdȊ)Z wY`-XԱl^㞻nF~o6jQ v |I<~EP\PWwG?csy 2=MvqG=dcx A1`6#h@≊IF j(< RV z驷^ޠVp|E Doz%~[X?08u/%PK =p.AXBoCS ,9AuHDuPH4br(<|"θF?e,YԢEtq`bԤDA!D 9s@9z"u|я$ D21T"SHF&!HK^I$"iIJ:DpY Q RC9x-gI@4.ݒ %̋/! IY!\e4"/&6!>@_b ]g1JhRl / Y"'>3@p@4t8P%2/ KB\Fx%',z Q%%ARbQh@pvD r,) ;#R'lyiLgj xBd@'`Y @5n-& NԬgJZò-n6Ɑ:g8Ј4q%@Xr3h;ީz8Pj|>MOV|!׬g%;%u ql\<꼜ū!s Xְ43+].ڕz(!,X*LDVcmN@-0)g"'ˬ2EЄFA1Cց ; p&f3_o]Ӟ-ZQn5\^5Ks3Xl6=ؘ[gOpBjZM %m?-A mgjujcjvMAk"w#,yC~<M&~A)> !5nS _:IG04C2=|\gmЄ$,uVY^!3T'Zv,p܇'DTv#}fhmB=ʑϋ>NǤyxG>z^]/Y֣󖞔5Cϻ }}_~'̵hY/Ǎ9(߶m9|ә?>?}_A*p?xPѲʧ+c: ,)DJT\ d*٢]JF 0n'pZ- * ̂%Т(֯* "h". "3>#4p-&xJ,KaO$kЮ0!,; K&gu/tLքjIl<ֲfk L$-ł#ؒۜ 6'f !D#7!MsB%牚mRGl\w~22x$ :n!],h ( @N N.6/.L r0"00Ce0Hiv. ϒ.QgnMR(-gHI w‡i5[O5O. 7n)9s3ύ$,:N:;H:<<:Ǔ=)==pֳ=ӏs37aBO O044@-O?I8SO-/BBAOI&}HD ` og&t 4CAT!h6J.(G2` t X:70Z0Y$%UH(HBW ^e0-D-|`J!LʪJ-\Ia0,vLP%jpn0FuqebAeq2@H1 K#(Sc5^k-J P pEV *G ^-bk:"n!AشT U3 JJ>pOCcsxUQ>qOY;ƪq3>;HRb1G0uʏY َ K&]$)}p Z$W[Bm SAW5ˀbbh` ʦVu}LFVTG4c= TSY9R!]E֑[Y[S\aMvAx`XLLyy^5x=[B5p@ ;':Cb)6\z+A LޯOɆbٹe0>e`Q,z!bBA$`f)e_% h :!H R>f1Ch-higi>" R!W8~ӷaļl*-Sn6+Mخ!@Mk (F2[+)u)m5?mͱQcÁa__U~W2%_7vq,y u.n3f1]7K19i[CW٪L6e_,Hy ϽZ!x| ؿ!^ <0… :|1ĉ+Z$"#%W,Q8E|jʈ!,Z?n1DJ!;W 4СD=4ҌL4jЗ u#{*5رd˚=lӦiۺ ܹoڽ7޽fC >x faȋ!g0|1aʐ9l1cɍ)75 3L1կ |{uݼw <ċ?<̛;Dԫ[=ܻ{>Yw%I%5jǏ> $>}!LJ! ҟ R} "|| " `RH}$Zh"b** <&+wJأ(T!05FXDX$WB"ORy&@LgrIgvމgzg~ 蟲tChh.h> iNJ)\7߀8cz{G# ‡2j2b$+ !2Ȯ22,$R쪌: "k Z< ȷ"H>[- ɺBoZkȷo[-H[m[, ,#""bǃHBk tBMtF= 8J/tN? uROMuV_uZ[NS9#zwH#(m+¶"!#b^ I#ӭHuN{'?"x Gn7$k;v7ܧw!"(k׾x{}=)M>ݻG]C! ,go`z*\XoA0bBn vˢriNJw ޾%Biڼ9΁8 'Ѣ9}*7~L]jUR&t5ъP> [Pc`*pՎ)?y;],SPjer}իGKaLt|?|\bOjuά9ی 5 !, {go`z-xq`[ʽWΪn}ԥҟ?Y|%͘6aR'ϛ;s֜f 询 1aĉYXSLzC!, go`z[ L~%6@k{"U-xϢ.|*W2&K0̚:y̹P=\T ,`…v (~.fWSL o=zѳ_@!, go`z[ L~%6@k{"U-xDgQ>V|_L\”M:kޜ $Q{fAX Qb?]د,SPj=zѳ_@!,] H*\ȰÇ#J,دŋ3jȱǏ CIɓ(S\ɒd?0cײ͛8sɳϟ@mfУH*]ʴӧP % hԫXjʵ׏SZJٳhӪVصpʝK.϶E˷߿LÈ ǐ#O\V˘3塞ϠrM8G^ͺk_˞M{uڸs|{^^9+7dXμУKN}׫kνwËaӫ_Ͼ˟OCϿ ` F!qGfv ($h ^H(f.0(4h8<@XJ/DiH&L6PF)T˕X^/s 2(ӌ3`>(^&Yl&wfz g,:'~H衈&袌6*(>"餔Vj饘f馜v駠*jliꩨꪬ꫰s*무*0z (̘Lgށj:6>+ƮlF{>d+k覫fyʮ+k&#p3HC5!7,k]H*\ȰÇ#JHŋ3jȱǏ CI1ɓ(S\ɲ˗0cʜI͛8sɳϟ@ Jѣ8K(]ʴӧPJJիXjʵׯ`ÊKٳhӪ]۷pʝKݻx˷߿ LÈ+^̸ǀIL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx|߀.n'7G.Wngw砇.褗n騧ꬷ.n/o'7G/Wogw/o觯/o HL:'HAaHC ʢ)(ND! EBЃ- ;CЄT ]CІ?aCuCчGbA"шODb8E&>ЉMbE*vъ8F.ы 5: DC@! ,^ H*\ȰÇ!,:'`,P B:40"C^Ԙ?{8T r'/LȲJ)a!,^H*\ȰÇ!2,^ (П*\ȰÇ#Jŋ ȱǏ 9bĨq`ȓ(SLFKDHfʛx(? $3@4-_ Br᜺v}2>LLleG, Aqٺk78݈Zo)S1uV/.6=Ѽ+r #)[Z4iy =,$ AG,zDR ɐUDZ1)b FBzE' =hde)rk@$;*k<{Qb q-C/ D}Awd,kϽnSoBZMb*0^ "Ā1OvФXpMJHdUZaCU'*b $1R?NdLE+bZxKavg!$ !Ә"cCNG b-?m!`}EcDq1=ش &heK[)jKATʅȁ!T3$A@,.eEA0Dв"ĥ(JD'bb-T\xAxi)4`-Yf"iG0,`q ĩjBh'"4@pV$T,ňjN UUAw*51">QJf=QH;X洛 +,/qk6س$ Cz'H8hғ @ o@78NP%* \ji0)td-\Zw 8U 7~z@10$ @B[ d9 s' @ 7) R_藿%+.BX$6_++ث,Lǿ ,W$;H,x?>Jd%^|"#5ro)!O2`sHP̉d6+o< 7LxγcnπMBЈNF;ѐ'MJ[Ҙδ7N{Ӡ>CMRԨNWVհ^cMZָεw^{z־MbȮ5f;Ў_i[ζ}jsMG;'NvMzη~N[Gf+~%~sC53?rw񒛜'︵Am05cNi"NiO<zrz̕^l#HW]WozΟ{Y/y5Nˢ_O;ǞqMݏ=ptz(4m~fGI= /~t<-h~AZ.Q f ݏaӢ7}k? }c7M#G}=>={_/?џ~t#t?1 ~>!y/{zG|zwy7~Ih7'W|`} xhg}X{gz{.zz7}3X,rVw7|B8 4hVxz=?hyK؄z|:HׁS YH}.2Ȅ5z} `bxmo6(hQ}6Vvyh{aC +Xwygz0hghܷN}(hx>wh(8hȉ89؇؋h{9wW (؊y~WxwhHhxzzhwx8xu'7 x`ؘ'؍wyQ()jXXzxyG)iGuh-ْ8x֏Xhד IV7`N W ;wf hhو`_ HfhY*X*hG̗Nzh|L鐇Cɋ|Yh^g9 <)w"7Ni}ӈNi 8}gI{~w6)٘7`H|N:9 'y`9 |`לkxƜΙ}'ׇډ睝H|ɞy`IߙziImɌ⹈yy}É) ymjjh֢tzi(Mj2h?kAڣx?JiIjB{ ֤&(ïKڥouV*kegg^zDrcehFfƥrljsm8ʧz`f槀7Zzک*ʨq:-'ڪ::pJi mi{zڨ J#gúCupʬjn:qѪsZFZ鬨rfWK:Zzگ+:{ˮ Z P jK۱ $#[&+fq*Я38:<= Bۯ,[D˱q_PK۴7+O5;EZ\@h`agc[^e g k{ he&h6G iUK˷뮃۸hm+kKf[ gekh۳u  1P4 0  2OPhp @Ȱ+e {7˻8u_0 kP eql[me!Pgt븛eK g  n  @b@@MP c P\ 2k|µ \. 6k\ P [F{캾Kܶ-u+hv[x @0@ рp [@ qP[Rks\w [Wk-PY쮗ĚśTLNL+ŠKe[kkƁfd{ e pXP`{0 Ȃl1\Pfȃ,=\*KeaΝ-Jʟ ő\ŸOl_b<` j\ pL ff ; l]%M 5e1 6Λ,JϣLR\"K`a|l s2e̠ lp ,T m]OX!]e}im_fadr tmxQ:GEvn+h+ٛ@ٚ} hvf0hQҐ e " 9`  o-+&cۿ  dP n]ݿuKӰ =E KYl }A ηku p : )2>CKE[ZtjsD>R㡗\ENHnlONu:FupKa\ҦQ<^V~X@u`k tng&zw|6nـg8m.v u+j=ulй_zxJhg (nroڳ]&ɫ~ԁni.;(8{v뒞hX^# Α FNk@0q T~yw9gF[iN̾pNkѶ~Ɖ~ΚXwIrNj _k@p鹞7Fh繠! Y_(>\͹VdžFZjh4SVw:OvL=:hðqZSU5:Ё wbȏSJuj)j _*BNaojyn**!Q_Lh9~Yй~ ٮ#id>K^Sj.If@qЃw&7ng Pտ ׯ+hw>,O^.h\wɁ|hW^6 $~n7B%NXE5nG$Y$@4 D9PH8sa mqdL! &Ibtϊ zϢCi;pX~gvaYw_=SGp&A&\aP/ز)!_Ts˛20h3M=Sf\iQ @ U)3+W瑩ކ'wa?uQ7a侣uٵ6;Vo?Px FX3!3_V,v֊-@t%GQK6Q_{Y.XYnSfs6e9؟[Џ {-uAzg*h?:խ5{l7U>[Um&{m#[ͻll,6oµ.|gvs^Ld-Q|H|HCzWT>}UUUt[縿F v)ZZ8Qکl]tWbuSbw羚~HdWkCAjnaٝx'99ݦͨC62:S^u-с撿 {rK6Q M*3‰q^p|Xβ %Im[l.MX<4̋"`3|h&ѩ}) N% N&[HR#$ b̋Y.(SR? d83 !*:өF<4ckl7)Y1nDC烫D~0 ?^%dʁt#D gBE.!pȇAT.ǽ @H^ Ghc$b"4Q$'_k۔RQj{@E7d %icn΅=DH!4hie dAh)mI宄/TMVFjRhT"EtNSG5R#.95}QϹU􆵉1^@htQYϊִ.b-i[0H q sIMWe-E顚KsGU- abi_\Ɏ(Odo%laj3,+& {4있, ĉͯ좔ƴMqQKa'Vk{56mmg[YBMm},-:&dUlfwQ}*srkn!kHbGPXJ:^@i N#sG~a)m $xHj^qr= _>x*|Rߕy1}xc ],$,/IlGqvȄV( ąpRdLfK]Y"WchQ2=6o,_e.b@ܪ1 )GJu9'C~7G'Eq.Б3o w>;M;@P:lD(>9 ?[PQq+!e echG2#NυW (vYjF7/,#!gF̹t~i aBʘ=*&?1jCwSfB; >P<2}aXaX_JFLr+PKMXvg2UfMJW镓͛t{{P?쭣K5KS*.rm e񺴛Ul]8b3`E61Iaӓ;f5g]xNѯV\Byh4Nߚgh^o+ﴠ4 iKv˽em- لOxQs|qB^{#եD,]kqu cΪyݤWiv~E0l,Þm&J|KDΩOF} wQUĿq7b8@/gW+H#xVi1 G[  k69}>Zۍ%C!'[5-[)2z.!0 Z2"BB"%&z"+It@"L3\#[&lj @#B#S):FCGAhV(|04 K$xJ\5$5KT+Q /WS5![C\˶0Í@|QA*t'`BAS&a#6|-iA+ ('7zz6rڒsS07/A7C?DBʧ-{Dݒ)PsRY@NC2a(lP,è\$@x*B PQ)}`P"]88a0LTxʓ > Snp*Ǫ9 O:E1) +ZhtI2&wĘݫ; HD<ǻ3jI1ϣ;O:;j: ʝ!-ɗ| ;ʾcJJ@̙J=JJ#.=.Qu0i K68;{//h@KP>IC IC/࣊ې |(+˦[ K 0a#K>hD1>+#YK 1Y#ȫL0JF^t@8Mh2Q@&32s]C#5ǘǏ3!ChM4O"5:O%#G4ƅpA*B=*u5}AK͌;C3AMGG]ݍ{lcڌ֛۬M\rQL J\bȚ?$BYV-,E`|V9ӞdjSDj2 ,k;E $0$8܋kDaX"D"Z,134$4?=l8}T?*=⑊Ž ~BJXþ۱)CG:`7dNդM\;&-%WKQ Y̒\F,y &ZD=̋=] 6gfĘUl2k(fTMt7E^EȀ55LګDIFڅ<*FTj[Q2== )xR^$݄zt_@u\Qq`4\ԕe,Td*L5 RO:x| UhX ~+L SH2ߍT-Ut0ۛ/\a^]I+~{A1?H~I{?GvL.MFNOI>ecWx~P һ.vA)UX!)z7 c$`5)IMu[^cmO^f V̈́>/2P \ԄdܘYYRMف@?P?K`]fE1SpgKZΣ%[<2ETۣja }|ioVhdh P3p M@hR<x`A=UL4Ytшˬ\9x0$nipf> =Y`]s($I K0S[hХ>5U=WCZfQܰYI}0ckd ^kS̨7aȀsa1^'-Eu Ɉ\?|UpFUUUDjpը+U:^ofRV2F WJ,89H#nsc?Ij%k;le~|hqs7ve H!_L}4y$%ٳY~]RX+XrifCs_{p,fk^l^nf 2q3'q.x]sBY{lgV眥M RM6hFڇTڅ8 U ? pUwp}NW`XD @$i*;[,KdhCsi!ƈ]#Eu^%XVu|1QR4= )j)E^x-[u IwՕPjrwkZQC.sRS]>%7>)E$E=cyQN7t^WChNvP)9ބo.l}ȇww%*}.k/!nM^Se<b`pQPn;n vn|FǍpr4CjyDxF={K{Zo|ᘣmTTKIO7db'.+(YR,⏿6lcZ#/0rWOq70vm"y,@qA)d$/̗*W+}}C}};Q}?q#.H6~Ćw)Nd_M!qy)ԨRRj*֬r@ (Q@\K0CDlt׼T A"ŋwnL< canjXraAN_KF)_zFݯزgӮm`ۺ}@7Zn A L wݵ5D2ײ͐ taliҁ &-? U|GA\\ )\^ŅŜ]f Y6ɃH&TGv B}@9V}H֒=4;)GSCP?Gͨ_nx*$dmp $%Vzȕ"DueBys(A% O<eOi{Dޜg*(O٨p'BVե]_RJSe_k#JIPXasYQzMuB~(#=@eϯ,ZU@ִfv}a U%_^PD^fB3>>m20$jG=MK<ҳI㏻ҭ2Ԕ;<=;1ź=[S@00amܱY`V&gڕv}-#$%Dvjs\><4Ewѳ!=;X) ,fI[}5X5V[75;j? LnOq ܶ>u7 x\8qxA/*9 y^pB={>嘇蓋 VBԃi-?{Ni(R*4 ,yu:gsvvq gԙԓG Uᅨ|.pm3C7Dnl^nG: ItK(3$'>qvIYD]p#bqD2űYu 3."_ZAYbK2l3!R5#5dRvVPwsǯaP#$\ uB1du84rKwdt'l)F1zDE ~$X|!;i.iHzPmC\PBD+tZFDñ!lR@:HF5r t9Hѣ"M i#G'J`@d&PIKϔl,j:Z74=TĪz`R"}Q%#3s2!Iz c)MpRl _TT*{ V)6sh'}J"A|}aQ?P@č"řd~i.KZ^0oV*t]"!6R/K?FK0|`q?gmHuLt (#(=@ӺQ SByaj $h{},d!YRUSNⳬ@$>~02̃]PunkW֖z5n m-Fr=.o5JO'r YZk:˲bGU=C~)]#HʥB~[R  3Xe͋w5e&>S`o' x*ԇbQ=aq}v,$Gy (0Jfq8<’6@B緭~45( g=CNТaB4+VHiKmԲ+V4gIlcGUH>5A'gaS  epmztõM`3SduSYN=H}P9Y0n@B !q`* ,?WhJ+ZlL(h,r81Aa4klS| XV-sg'uѐbv0ƧZ ڪ|\{C:Ƈc}li}c.vfJ,f`RJVJlꎮعx=& Yk< /v3u_[Տ yΓ^kmh%_'mCTGnd?\FڲS{^vw =@ҫ'={%ը$ٍwSV/ Dͩ^|Q:.{@o&Z%`%HKVXXJcE $ DCkeP\Y[s ͆YX41JPp|YQG YY?CYBTh0pf;~HF Qu V}S Qڻm T4Ԩ:?Zs؇)1 ?HRzTU,R)]u ۻRِ$.UTDAAC/M#Ss( 0Ue0 Yi]IN]5E:`} LK‡kp2@U]m^C 䐝V1J}ѝQ^UxcheTp%UL%L a%YI-j ͆li^YY^Wݥ_N^VWZ_&D"^GacN_3T<?mccRcjy5eЗ}f~~W`&j#%zmD?hOHh&qTzXYY`Jqʏqm`%_H"+zYKVʱx`0= qeم N1\s*Ĕyl`CM"v#Ԡ=h9zƵ'5N/.νr'AQZzdRiLp4"/X9ۄD!6"r"š8FņTBp#XVfa-q"GmI[eA%ȓhMI&.&g[]~)م01~:%# <4SkGVB'5\Xf( gҪd\;#<< =~gH=VHdXP$}FVF*BEZHҍK⋾œũX-L.M.~MRYX2̠ڭL`I ۩L.Jm!M]&kFbk1(%bbu%Gje\Rg&^^kfeMf6lbd>"\U,!*fj&Cgg._TߘlSV͜+n:n^D9V̚^@-\uNmPUmrċm'z'& PmŽHE fnPl&P?g.ߌ檁cV9kYje(*h+VbYf1Nmb̅t.ĖbΩuǓ጖'"hna(ZbbfE!nV".6$6/#f+]bjbR^:E/-Q*Bї:*VDibF2/ͷ}2/zEiΊnh)4 n$12mf#*jNj8RnL AJ<ܧ.c*IKKh˱+ATMGZ%%/ɮ_md2,G?k$U++W *[*LK6LEOdzmPPFQR^+S"tFem-າ],1fI. ־JNATڰe]:u,*b2&2R.6''({rrrc2`r rWdiUx0-P˺2^iq[&Yf3lrJU  "I0'+WorT0gX s֪Y44C Os*. 㶭Y>@FPDcAb1U qt2!n'!?K4AtU)[@̭\mS޲+47mn^cR9EH u q=XoBRo#IKаHD-RH>a( !9Kc1F9;iO&_buQuK:#S7{),SC\juno%uoEm(*Z x2$Gzsb &{[{^?;5O?S|vA(v!CpC6~3#\1l9g8>;cgpǹ\X = icjʣv $[Y$3B{D1s<6DUIJ"w- sSZ=t/{q2 D^_u31ЇKmzO8b}*XKl}#͖\,\߳cxK,s^gE/^;kw濫&nT2fUk0>3xk1223;OLۣm>ffLXNжP7x8GmC9G'DTC'<3/ <׳xmO\{cGPi& 4xp? 6tbDh8Q`Ň #B"G0$iCI;t@:$wM,7l?xƮ_~lg)Mäc'>R~weMtn\sun^7ypߕyE,,0' 6P7굌P!͓sva7M WHv};S'ym:L^É7~.r)t0ySs7izƌgi;*젙:/8v@6^Z*ӭn>ht2+ 0NEry>Hd٧v(f栅ka*z\=|~yUjDj5^[e2{^ll۟ q-gy'ȅvZ1 l- r|7khS{z` Z@r/v{qeIZO7Xܸ{g:< {[?? Zj$/RU/{@]vZ5u}ѝ28 e ԠWB<+y%-GCܯ_})Bp ̑*5_fDw5˂Bz .d^ygEi\ R~b^GfXݏsZB~BF?@í@5.:-C@2fQRMvrФ@?p1fT*YFxa?TPGݑ^ Ϋt3֪X"HQN#!yKS'$˜MK<+ ¾h/QAWDԘ? 8 "rt'YEh`} 91:q,nPHI 8rP84 JP&55CŢXF?7/ i?#sg&  TbTUR?B"tZIU"E=I^3B(sxOT| iD-j[;yN@Tv`!4dS>'+4S/Hf9ۻ~ӞTUBZjj*be[[:턘!, KmGA\IB:d(q b(p#E7J )ƒ&;dIFb,ʉ6v,#ǐ!,W H*\ȰÇ#JHŋ3jȱǏ'ȁO$K$MI͛8sɳOЈ))dO(sbС6JիXj4(aׯQ˪]˶۷p;;cM߿ W*ZHN#KLmaO@Ċ{ϠCdfX}K^ͺkѴd}شVƞ8'e ".qȅKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix瑛 ~*蠄j衈&袌6裐F*餔Vj~馜v((ꪬꫬ 묘J릶Zj2ʎ?klVl>k*R+Z(vJ .t`{.2.~(*EG ܫhn"  @oT|q'jN>ؓsg<)=ʁ}4I9@<-1=(Ȃojv( Dkv} ?Y?:uS 0*?n.?PިNi٪놲~o 40,rީ/1zfI?>64?&GoHo솖On  @|P…o25ƒ3!Ur0=AWtY`7*uB %>Mnޖ' ~ⰥK x [wc>֧ #0 jg(A#X#HiJȽRi ?ղh W*RkU8n)UN)n]kZ@T'+YJ=FZv49},XBXۄ?p3bPHc8<4Dj&x%-*P uCPpK\^5$+r\"8$PעvV p>c`5J.\hk0<7>>| NY{]ϭj1 Pxdݍz~?>j7*X}-h) dT@T\W%rM`$kTU cmqZʹr`%p*kZYf8!*7cdQT7 9ע8[Dp@GM꧖zu[UtIFpv7!t06C^#8z7 O0N)†xV׼./6Q 4ζM:æ k5p4θbX#8F=+Tc5܁tă؅- CEs[ȂG,MW/>UZVsu'{g%q(||d.r uSCm,^?@sP:V ܬ?wzDP| ^A1nM:׎q4Wj@!,f H*\ȰÇ#JHŋ3jȱǏH A ȁJ `ɗ0cʜI͛8si3ɧVp y)R\ʴӧPJJcZ1|Iկ`ÊKٙd5KHKݻx󂬅,TyKÈ+^ 1F9¸˘3kv KZS@hMNxhe+-F x۸s;`b( Ikȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6*n"&Lj饘f馜v駠*ꨤjꩨꪬNZi*j+ު먹+kȶzl.ˬ>+Vk-^۪m~۪?k򚮬t`n f .ֻ*&0DJLJPo>)v<㎥3=@LO: +s0"m})K_iC@!+ D4?HZ?ðO͜LI>nó0죎| .|3mo5Zp? ;6k޹ߠ,V.霒kOo[OMngX)ʓέǹ\'o >ivz㷫ٞoR3?9?+";tRк7֧o=?!){-g{t&xpgD~wj?h~+30z,PHLb|s" g- uR-Qe4>.8*+JLFTmZo4WЈMTG%1lX){32 ^j}>J.yN7N:Q DRL*WV򕰌,gIZR̥.wI\%0JaL2f:3ό&0)M]Rļ&6nz&8lj/qS<',Y8 t' |AEQɄ| H(Ԑn(@P1SSLBЩ Wvx8q9UHUm=-e?n|^'\S 8Fa~ 9@W5N1 C?a_ܫh5,LX.K: `^v鱦_ŕ&  yi)*N7Z |_2edC ;G%4_FeNk8r?ۣ?.Ny"^.[yJ^ܳ9's>nnK*2v{„1{.`x79`N"T)~tKݓ+=\U^)lFpH&[x^ +_IJ#p@ w"8v1x`G9TB洞7NoVzv 9ƽw@юS^| KB'q-eVLe :뗲 u:osrG6CiWƇ/ olD(D 5WInP@GL1xfĂ!,u H*\ȰÇ#JHŋ3jȱǏ@ -kՒ5@-0cʜI͛8sSJE S%.{*]ʴӧPJ&1I}Hׯ`ÊK.  SPlKݻxvj͓X0 È+^x(GPr_Ƙ3k̹ZS@<iQS^ͺVZAgr]ͻb( ,۟/^μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰J&n@뮼+k&6l>+m {mm+kߞ+mr ok;oB/lSS> k<ԃ0p ,wL+# %k+? ,k]˵l! ;2& rl=S?lr Nћ#PXgR`? &`S8Ӫ631PoIr_,Q@PM?P3=ZҸƣ>N>@N6A5ȣ>밿 ێ;| wӊ7sl@@t 49<0ӸÌ^k;w0&ާM7<#O@=޿;w*4`x*^x_%oc{':|Da+l&ܑ]WȜF0O{úW nb(hFP @@(VWAW:6pq.9p|[\?F+c%>pSaԆ>Fv DV4M4R`kH"t%e~av-3[&}qHTPs.1K9x uHGZ҉"<cMoytJrWp%j%aH3{IO 2vB}.Yj6U A/ࠧC}.qø{E1xNrxZF74cUGCi0a1]ͳ8=a )P, < @ h̨AݘTgWX}T3` +v*V:Wֶ^d}k\5׎uWFqc]:X{;bXŪ౐UKZ4d/z hGKҚmRֺVmhW+ͭnC` pZ5.r\*e2ͮvr/j+Ӓq\V%㸇7@1Ө! {@y5\vu6p%LV,\زp:\&ħm/{kn?P7cs8J^8n0!v"Ngd&@(s͝!ٮdn5a Y1( 1Pc AQ b@JkԃXAiZp y#2B ?pQrl @qH0 ڡWv9ޱzTy6$W@,"?.X>vcq'epOOlVl%pVv@q@@3HY p%B gEin1ā(2!-p77G5q&/0s-GPmր iS䑏SL%@5 Pт?Nq| HnnH#er:Թ` Ē1Kcu`=̖3; |$8WVő-Js  ` FpAK2@B|t4.@r@j'U^s 2W8@dd?~K:Fo-8u: m V6e| X'JSU~ip`昽@hi&m뮴+/kޫo;p /p-? 3m<#0mW,@Krj`@Hk4m4Io;4>5\c3L;Z#лSN $&׽Z[+w@T }WwЁ5C;Ҿ0mA;; >]K>#m:#?Hks3$mX޶Cvs|x  =m@@t 5nl2:?oR?Dl9ðl;07#&ydwlv7?mK:|<}X F瑰z{ ǧz03,͙L~x%?x-"tG;kyYq?:.߶x,{,@|&?-jMeM &8g pq:\](?䭎3и6g} biЇb܄Z{?1;( \W6hBfX҅xJ2{(ki?7r[V>d76.yCAJM{Y39-ɱdc:EipyBma?ej}G1M~G%73, c>l_̘yDa|,S]JK @`4# oSPqVf8A6NΣ>&7-ZYJٌZ)e"*9;pnbƶ2zJ:2V  NWѧ@ZM(X`ڇ?R5:!6!f7{1rZeei ˚ARۮg9;[y,VhvކF D+npVesKZͮv궻 x׻M/w˫|K_粷}_w L8ZN0r`2}px/6Iqob,QC6A +`)@8g`wJp,/X(K[ia%D2_+aDbqn W ) a%n2p 3$30fv&ӹ  deB>Q $jG7\nK=o}tLzGݾk^c=,2n g Oq/.P'(4>H7:}+# 8c%Gn<??/zdiQGuShOf{R,zDu+,Wcui{͠vEpqpw\,,alv֐w Ry,!ipl, 0nl ;؃9xNmGtc7O+1W\QH^z%G.M,Dx h6psp g\]Opp'qv {Tfuxy[+ l! h rpOXަ;dh^@CpvH|VHgg`dW @8@ eQV zP ,AX\HPǰ   +qbbXhIgmTu{c_(-F-gbg҂8t,RWg Y&Icy'z)di,  *y8/9`-;y`=9c/[nP@0T0_9*)F!?, H*\ȰÇ#JHŋ3jȱǏi @H@ ɓO$͛8sɳϟ@AEQ^i% ЉI>SӫXjʵW4k(۷pʝ"lK<`E)+^̸17N)'Z2q-$'d9MpWF' bͻUUBcGZf=`УK;VTT=Y NtC+ӫ_k,PV,xW-'h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ț@(,0,4l8-'M14+PG-TW-Vg3ZuK dm]?n ]Գ<à>}߁ǭ⌷8'G>yAӁ9'g@џwJ`x̑#@9s|г\O;޻?ô;ᆵnVǎ<Pw7󵳬|#g}@ DOπ/2@sN>ؓO?0u,ȇG x#2:0ejX<Np5j ,Na+[ 3s P`v%nG:BPY㨫t͕}\U)ZM[x߆]nWe"ͨwc|V^xd˯~;:*L;'L [/7WqA,C&N`0ga1sc@2ANa&;?~,e Sq:-=D 9Z̃0HЬf/xEf>~N& d60ӑɹHG$2\n?07cs8F^8n(SYҸun:cǢ,y i*$T>?! w<##4scO(H4F2Zc8Hpz+I !yDC7A_`$7.FRm (=1 c78 XE=aP p\X +S?[b q3F zA u/ Q tc;w|#{׀ 2IS䑏SLH&@5 P#)A9P\dCŐHz߷f5?M`M5a>^ |A ̄@  E ȟg G0v   o |8c{sW^lց1V{'cD{&H2(mjpX0@}~U`# p0 p~9  ئ~f`Np s0 0x#qxPWY&#q mkЀa`J05D)xb$z=6}R{ 7`{d4t|l0}w`@}` n ; ЂїGh`Q0bp Xp_fh h >Hp D0D`ӰIXbxsL#C|@72XKVt/Og7 `u ` SnXp( q@Fv}я8`+ l0!  0d!__ `_ `ky@d P h@ 0ceЍHcI9`\M{~lF'tҐ pm#P` op P}`   eoq # 0i@p rfp1iH @n qKƎ396>Phfiy/$o׈y!&NƜt9 oؙRɝJ|% Q 2vbyc dd!:,A@V@*b0` BdM0Pŋ<pE++ c˞MoF3@SLp*HjX3cZDe-S"zA2`L9o߾rğ,Lb#\&rFA17Bj%vXV,eLbRʅ6"xT+ZL^ѢB)/.Eb<CR<${4b$8#B4Bdihlp)tix|矀*蠄j衈&袌6&: &qZ*ix.bޅب&ڦaꚱ:۬fjij+c+Y9쯩Vz"+2묫Ђ*-#`4A:k3#.KNy+?bľɻ2 /F讴/B;Sʮd1\01KN .L{03C3L>,),C>XN>(r t@[?@0јn0|rţ>꼴2u;/ 53nr$tM=7yvKT8ߌ;.}-z7Kf;8#?ü Nw<RZqg ;#d>;ǝ7ܰR{t?Oz˻QRREdaHMlNʿ}y [ˇc'AƂ] 1E, ԰6{D3#f %Y c47\ kbYxVKBesЖL@wU-+Z&\(ȇ)(+ŋ$ ;Z5=:-T&,iZJ",Z3)C+ZOrLp)QS?J]TSҩJUJr+OuITeVdYaRS+REWbauתkXںPzu]) ℯjXtmN{n1zզW҃ϓ'h '\RPUeBor&,lj5+Klk%zmi[֋ʜ{"͟h-.im&ݯJWAgUWw٪[j1qj$̂/5ڨb]WM.?fs=pICM *ddYVM +օZW1N+fM_SobX+qKnu}twb-Er|M6Wυ|SMp9 (.Vda-;9VԼd]>l?{m3 ZXf/mw5{y«jL%l-K:Δ.*/eĤ43:ɤvꦏ`,2o [QYiH?^~~G;}~lvv}V{'nTqj'9 mN{wzvytj3gs 8&g+$gΥzyp A2xSX2,+)38_6؁8XGEa=|RA/EhQq/J'B(Gx3ǒRX(x98\(VVfxF]Hl)LX2eVx.1t!GPUtXnz j&L[EThvxy,(f80''*Hułr+y舰ȊsD7{اv؄vfVU^z3I6x X4ut'owG|eQw}+Ԁ6v}׊7~ee~Yu'w}hR>vE,9[|h Hvhֶ[6} Zc8sHzssz#W'j'iy%z+a)i/Ib!Ygcy9'ƘX=9qc8ވҷG{B9R}MY}rbWf]H*w3\JGy~/fDi{7k9Pxig;rW"h%8Yr1yi Vya-~W|'$VXv] kp|ٖhH^u鏶fiI[Zy?ַl P(hBh) I`G6TiGm?3p9}or 9ɗ阛v)iɘh2ǂ ʙ bJ5*H yٚ9I|\wse))҈X١Uw(4,*%:wȜ(7Viv:E]ŏ<*icP&nYTRڝUVjFz@tj*iʒjb*k9Im w?&řh[u7ЩU ?'^㧛&DxGb49x}D>Lg\*jIJhzG'کy^j YnSYQfJ)<ʓ-6!V*魓"iG2r(d z [zϘb0}&glڨcTaә6]jU*$FfyyL9)%:z iA^ʯڧzJ|&늮&q@b*L{dz"c9 D{ڳM m˲:_:_FbfkcJCOoְ v4cJ >5Ba˷~穰v:deӪ-z[tiMkßKV;$խQ[SkUWkDF aHg__Qb *;6}/ʸ kRjKKekQv˶5RKŚ|b ʞX*!e)[˵R>ۮkfZ\&"$ ,)!w+Hkɬii ȉk$܈,Is,H| }ǧ̜^\-҈c)nmӧK@y äa%|n,uZMmˬ(ň|ȅÐ=3 >=$lP:C+DL;30 ;C 7j|nH ޜ0rb ϰ1C33<\rG[0@̎Ac>Î>fAï 5`pc=r:mÐ2˃õm:O+x#&#yk\b:l?Cv@ m;5>;C8 ëPԷ23Ǎ[ ?;Y ;k}{rNZj&:4JgzyJ%)mp'U1)p"8KVb3oۜ9)d f@#/f3H< H1خ} vo(A|d |({Cj1ˇ.di&DgEs9̙Dqdfa &E7HVl8 hbd+ّk! G;c^yl )rGk0bE8g5둏&89[@,;د/BkZҰ ~2kcw|cP+!@#ޡQ2øDn<"MEtZ>&;e’lZk9?"9~L Ǫ$tքiWM& QA(Nw=ɟ49hIT& EA(At&@C:0ɨaRzkUL5 0McӘ@=ͩL~1P*kNՉi⪪VNW U+HVt֯Jժlm+ʗGre]#5ܣ XU]kkarؗuP5`5Vb!W tgAT6 9h%@!pD>*2IPm  6-i+ZĶ@(m3[f hnJ2K T@a.YJ+=w'\-mdn³ ?;ݮȗhrЀzĦ4|\_*=q@.:[$"]A` X2L$8}0Qr&>A퍽pI,\X9|kښ74F.]n9me˼2ow"\ؼ @9Hmv#{:U3Mrs6g=Dl#4 ɺ5hZLMgg,⫎=4$g+{7qE*m,Dn{d&.^ 65^ ;H-]Q%L-W wDE;l;l;0)jvm!kwbx䞶ߺ ZҔg ,K4sA*uzn>uڦwT! |wpx~qE d{okn̐ڦݴhe[yp σ񙼺/I֛s[y?rt|ö.RU?`ǩ=αljW>[G.d ~B !-7!]Ǻ> #d'{سryr<^p`į|LJhWǵ=@`Z_.3̦YͻU2柫H=/yJiW9SE&|? ?'߄ٷ}<[y5tBg[Dw}B6WiuRwVTvW6.6_tDzv8_j'gwy&x)lcw|w.'(ix #wodxy5nfՁ7~'؄Aց{+o({]}ehrO(F7iV"N'$Uu8wrhuW\0!jHZ5gV8_!h8cHVh^Gg^VVb0~!S@ulHz[uXw@kVUf7@Pv8w6X,h`JXU02*A{\U8C'y?h>Hy[hd=u"Ƅ8u옋?񥅹ƨnag!h*7|fHed|'}`GtppHux5ׇv}f5$S2 z$;i%35"o~+=3ju$L&gWV^Y=<3v,riQk-Q2dr9uyTR[◛)W)G菱g%&yNO ,!=er$3UFiYi(ᘱ|U$=IVɚPv(i$|I%d[yXTbb *Agɜ+9Q9)$j96yvם9.b ?'h&)Yyr st:'ffyHjwFGqwGo{!xZ'v<(bWJH"j&w%]vU-w0Hlv!UȠnx{m/X>yɨy`֗"EK긣K6):$[gx\mʥc|\W}pkI1:jIi,YGyA9 suJ/9=戩Hا#$U@) x]_%:¨ 0z_!'4(L&3V8" ʊAzGE3afZ5ZT4AZz'gtT!k lo:Ƿ3UBR[aypڒZgZz+JY{h UZF矒hacvs U^tt&`ډeZUjjܥ13{\j/z.{l*xQ˴FgzʞB:ZEyZY:< ,Rj>ˏLys+>WXq[ur@l$zVZJF+7}vZxf[ 穓j ˨Yyk H#{R z*x#:u4}X3ckz JQ([N9USK[^{mK'ዃzb;P5 <r +T t;\]?Rx9ke# UD+M<{آWzkK6jSV{xuB#zV雾_Jj=ee{\gy$O jyV{#K ;{u }{p7\r& (}¿+L"$ɫlq|XX*\q̩ U9F;t1L\Y[K+X̝)i;gŽhX_Kͬ狎pȦz՚Ŭ[\|sL}\UKn,; PkL{چ ɯ?2Lё%\lm* TḺ Z Z8lػ}w{%#-D̡tż-SQQj^HKvלd .ngXhaK,n| %WrשPM2KYhTB km̅bЕlL';!q'="$ʫ]q ˞ۭQҠRی#=%+ Lڸ$RӮ}GG=Vlĺ]KkՆ=֌w۝*_dݽ6(=rmsȾz-ߣǿ=j8]_Vlo*gL) Kʬ%!.'S}uu1Z' *EGnBc٘9_s =mpa6۞ni<ۡۄ~}̪"'.qOީ8͵C껫A 䏮<_LݳU~)U>J*U\濎oc][g|iN;Χ-+ᨾp]/o!|,Nl4(2!~)?)t ފ^IWuQ^ykHmj+U6ch~n mvwaU%+u_moNOW_~1e?a]G w< &/)Zˀ=$Xd@C%NXŠ5nGAj4RH)U ,K1)IeM4q4xOA s'Q5&e%RKkBuRjUY+Ry5&W%[˱/ϖ%֭K ;wڌ@:@P/_ F Dv@ Do!^|,ٲF s,p̗@;:pesP=01T clw poݡI/1 [:ΰ߻wiw48ΰlZ4w >}>u*;暓/:C "%n%o !k@@D2Lm>LMFȜOtn `OSk6|ژt2 ݬĒő ̡03rE  9ʦKsOӦA 5>W4!2, H*\ȰÇ#JHŋ3jȱǏki@@)PXʗ0cʜI͛8si 7DBIKQY"\ʴӧPJJբ33kW`ÊKٳ0[X(j=c+ڻx˷/SNzeG\ ̱뷱ǐ#K @ifɠCMz4-eLҰc˞Mi#&:a8k Nqb0@ܸ7?NسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,ln&,G,Wlgw ,$/p('2-,1l8<\s@s(MFt1?,-T\'uZoq%;S> p<0ࣶlmqOG| vk`@8,80.8_7 /88ף;&s0ty(C kxSP? -&c.AQ@1}<`8N>ؓ50hN>p:c=_ #أ?錄 LG§~v8<A !q@ *,KMԃh(V?Ե-MC{2F6vA<,gp@;7xc؇7t`TA>HV o "q.Oo;†EHCd'q+7 v%m;x@-+@9#G:=zrD|݂I1Loh ʂPsLg*y1]5ҁ&3x\!&ljaN|꡻bW|X>/"En2&@=LiJ>̥ 5hO2zp0E((L? HԹ;47Q^8J't)$[ IY҈ iDxCm(Ҷ` H5q|0ꕯ;;g D1>#tWG}@a5 TЅu>{>sb =6?Нs Cڶcp 0.l5/&95fЅ\n;r,"HN&+N0)8㸇7@1! G@yeAsBTγ+yp %&[X>; +i421+QgsyYVq 7@pX9 +?z  X:Ұ4`򥃽|iqgD/lё~h+  HOLlSa Y1X 1Pc~BAϬc8Jpz+XI !yDC7A``%7.VRm,)=1 cЁ?D4(OyB0ٚfKmD8'6p~mG9q얯xW"n F }D0Vp 3~ b%fdPAl_l 8v 30G> CTP'Oy =w;Z0LoskP ;q̿xZ@w? qb%p y4~%_0^ PC>H\? ejS^fɷto|stcyc`v 7 +‡`W' `0ޗ ݐnj p  `x+x8WZ8 @F8GyFvtL'_10zL'{ X{  Wf| w`w|` 'o ; n`Q+1p8 `W@ +1{-p8yRhtGSm>F_zJXy-tM kRg7 ǐu O Vg'oXP  q@vv+`+ lp!  wx p)׉-g?DF|HIOnH>x2ƅ6nҐ n+` _pp P|`  {H p q + i@p qF ؔ&*GMn8bSmWilgWP`Pd10t _g NpgaGsiM, 9tidw9dgy_nP@HpcQHIM!, H*\ȰÇ#JHŋ3jȱǏQ9HN0H0cʜI͛8s&-Y@er \axҳӧPJJUj+ELfP>iqٳhӪ]6f֬Grh=)+ c˷߿;U`\D!+ǐ#K- YOb$V:(Mo)t Rj MPk#-OdŢ1ȓ+XG0pسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw , &,0,4l8<& DF'=3J7m3NG-TWmTC@k^tbmh5j= rwðG>^Vl]}#eG> ؾPf+=䱲őCG*M~&T H. cf>հdk IGPe:˜ oGa|v4qD\? v〄{cp! ?Ҩ(p ߸’/#eXڑ}`@r2?ڑ ˇ"b̛F1O^<ָ we{>H -<C,gɲ9zq@#7K2C3ϐ('v |=<6JЈ*#h~d՟>>unŝ\h@gw C0QɖD acU Qxm5,ZW ` •g@H[]nIےiy2#6e(*kKǹҜu#?j x˶mu\wYf Լ|K_z֗g5[~ӖpT@@1N  'L [ΰ7ؿGa >/V8qs>r,"{xx #;P.qa"SV8 #2lZHlcV-S8P=! 0J0LBˆRg,d^0Y҉pMvLbq F,c0H^ g H:Бăδbb8v?rlU9ѥt6?-h/ >?! w<##4s#L!H4Fu Qz c#i11hȺ,Hʱ9 Lf(xy9ޱzT#y6`W@,"?oc\y]Mܴ V+Bp%tOg[ p>c`8L.h\h -`18#Y=ĠTe?{#[`:1f`|@?׀ H2IS䑏SLM&@5 P#т?Nq| rЃ:mNr'=Q 1ԉ#Vٱ_<@ $s+8-Fr  GpG~3x j4p ': @g7 '{pp `<|:wv||)cK:h2/i%iҹ II OI}9VSvu9 oІ"aYi"P HQ 7vjb  dYjd e!, H*\ȰÇ#JHŋ3jȱǏkja@X R!J)@ -8sɳϟ@  \ax%L-(CtSJE Sׯ`ÊKV,3EH _a`ݻx RVưu[֓|uI Đ#KL2HS"!)&L9@85OPZ^ͺwe1*V$QNQ0UX܅2p) kνpZ EcnS\)io+-X `꽾Ɏ:a)^Ġ߃F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-wԽ v|߀.n'7v Wg>8wn8瞇.褗n餃ꐫ䮿y8;=/|Ox+=L>To:={_+AI@ ~#P?&7@գz?ر hqq7XqPp?мnbY 4Z.؞;| [AvXay># "EAnW7[(qG -[!U< hn>fȺ!Ro7"?Ըzc hv\MCE'<#!jo= ʺQ`L-鱙i}EB3|y-V@NX;ѷvHFQnH?̿n QKavF? ͊΢ @FS7L^ ;Mx#-)$II{s8NuK?1S#y9kim$.5vt13HPѪ^Ԫ{i'5^ )N=},+ ɩɃsxԭ\ WLE\&7я/5p"S.Fu|<%dJYǝ[fͪFnb< ڻ]7Qap^INm׾񣘢(/Q{NL>O6c`NL.\h۝[C,~0PAs=7 Զ=`ҧ-ݷ?HO~m_r5/qDƼnk8_ 6;-߼G/7 K?7ⷝAy/@w7շ}= 0ԓ=sa(m4~o`@X_>Be!Eȶ d@ :(= T@ ap{G>a|ح @,>xC[:$vGx@vCn^ǘ9~4of[ 6ʐ,q3Cya0ψY<$H-Ѐl;͒z"Dz,\ WJqmd4ct4x^m$!tx7x&#Mb<6wc{0T :Uv enb1KYq@y>t`s{u!4&M*n d Ź#r;iE3чn4'MJ[Ҙ~[7eIs̞4C=8 u65lZʣl.4 G;p!Q. Mqv۠i:乶afl0+n^USgy8˘)@X$c.0aVCN9 S /ͶoS)BWPɕp3b@Hc8FHVP͠Ezeu@֐= REH^WeQ0pf t"@|،r7DXdT~V VZpSMFj. y`0 zY ` sX0PrҐ 0se хup PP @ p XXdHP@  FbH43p ,v7>FQ7~qs>rGQVsxz6醔OrsYg iٚN& rd ovwmFɒYf LQ v)٘թfĹi)j!, H*\ȰÇ#JHŋ3jȱǏ'ȁO$˗0cʜI͛8s &O& N2;*]ʴӧPJX0(2ׯ`ÊKeZWf`LٷpʝKndzi, LNX_>˰ǐ#KXŰ&k̹gd]J^ͺ IYͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmn&l`-dmhlp-toux筷w7}-ځn''^xxxON_w9.ݣzo^?{n030_dzO=^Ï[>.ē^^'0Odx6 0 p7mh=I@v nb  T?;w.ðG>Vjmp}kG>l@l=!aК>7*Zn"r5 h@k\܄E7 ~͌Z0lY$|MI?ࡵzc D㏅a1MC7Z"ƻd-zm#(0и5Vf P#vTMpG7t]7яAkÄ7~h2ɶZ08IPzaå' (9Ɉ7VvуJrfn:0A|0'D_"3xN=g $K>aL&waLpzd.$5*w ;GZRvzҍ/H .<֔ixqô A|Ĩ~W )(6-cXVUv'ŴsQ7a?C;9LP_RHŰ;z$Q,V';BZq @(YE hOTrהfmE \);#*|"Fn1c0o~B ޣ.,[E 0`mwڸa{"zhPwMz8i[Nܯc oѣ&/n\#Q>SQx`h.$;{NgEfZǶi`nqiH;: ) n2p 3&iyMc}v{~r:`bk2pα֐;@9q'$@-1T`6hF=职̦?P}\#>P PIX&@X-[b q3f zA "? p&j^وb 8;kn6)@X)>(ٴG N:?5@:f6 ンCӿP x7l50po@ 0fрp 7 cL}&  t@pj7 .#gGy > gv~=5T:h5w跅[Ӆxp 7  c!Xk8' `#% p l:p g t @706txpn!{P}QuP^&Wk@ ^h7Z7抆wËd(]  cas  Rbxipsь: 8pc "0|hq&gI@IPM eH~V>zgv5RYH~u qx`0 x9 `0аx&w ӅTm,0 c+ l0! 0p |pPAb_ `_`cM|^P|V@ q 0e gyc _6pw7vpҐ pc sp P0`   s/q jA0  c`ci. @gq w uyF֐AcȞ)hp5F0b4W v9Mnd @W:vf* bn KQ fv$Ze&z*+d j!,  H*\ȰÇ#JHŋ3jȱǏ@ -kՒ5ʗ*Y͛8sɳϟ@9T20kA!13DK:JիXjZ&5I}H#u+Bdi]˶۷pzR/eyŦ[|LÈmRIUnZk̹*Ai,.㖆5Yװc˞Q([\ݼwM[i!+U23سkg +BI=zַ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx|߀.n'7G.Wngw褗n騧ꬷ.n O7GW;}o觿}?>>L=3 G=F~s>:|W NPFA ςDYWA .# ^h?8?ر p8`1~Pw3uؠ?p$nb,< Q4'X+~GA| H]AȈ@|ptЇ>1t#l|"A:080xy|N?, 2:4C<D6#z}[ |4&h$ZW~?"zcKcvd`?h vC{c@:y~f>~@>9?'B)S%>W)AT@@@,i>x\nT# (p>NEԭt_IHJ3u=6u|)CAÎ(tp/֚.=&m=?CӇ4G8Jn?6Ftv@P  .Es VaH>v"<!_cf$];FpwW9;b|麉yC!SM,K 0` ,V K )F>5JM1ke"\ps,С9k6Jߨǂr":ytsӷuѐ'MJ[Ҙδ7N{g ]pFMRGN D`VջQuY Zָεw^E-bإ&6}ke3ٺv6Mm\+n[-q> <ƺMz'u}vc௖8aX0`7q zCr ~?y70sSnnwcs<> k_, NT8H:Бa7n2p 3 ;أ=b'GĜiw{] 5dg`74<@qy9n&Pu Qz ci11h_-#C?ƨuQ@hnʱիUԣ&6P:d|p 9MmJ)apxg}R?ߍTa@ıT0㫭F\@M w  c Gb@ h ! q` 2TF0P V\  0I0 oP ȰZp u헅V~ZD:_a(w%K񅛐mׅl(wsP `x&tq@ q vu@ mрp sjO ׀V  Q>&  r> '0 @k`@om\؅Pwz6cnj:װqXPjX' `$9  k0j Pذn  F{wcna`J5P]׌0ImبP0ǐ6ivrh(k؍nؓs( zX jo`` v ;  QjrP0jPl &9m^ij  h `Ep DD`ӠQl3lx\q:yo&w~pXfH8 `0 I׎,O`4zq čTu j4 ` 6 ` x pp @f_fE^0V@p 0e0jnj4qouv@ :j( @~8@ f_W P Е@ p  *fV u ns Q   &1~ٞ `@C |VVRr=9?׆n'u)ؘ pz}rI;*v8  oکt: OQ vl ꌵ loo!, H*\ȰÇ#JHŋ3jȱǏkՒ5@-iX @ʗ0cʜI͛8siS$&_Ҡ"(ϣH*]ʴӧP1&(JVDʵׯ`ÊSPl2dʝKݻ v+7NÈ+^ӔXꯖ3k̹33,YU~=^ͺ띥%U,7ͻ c ( b+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx|߀.n'7G.Wngm&|.褗n騧ꬷ.nz.<o77|>}_o}:?|ow~?{S> y:ѿcX]W>9g(7 "?Ay] O7;n0Rvw:qu?`$nb+4 Q,!X+~0ѽ#ðG>PW2zn}Ct?FsHDn`":5C<76ԣ#z}[ x4e h!eZWG$7Q~ #|kDmvroa? }QtT"mL}ÆG0x$PuH=`|h <}s0L?dI$Y}X3%-U|~G08:B#&ܱet8jBC ЇF}Cu =:u3CGڏ(tDQ @Tv``*> Յ.;}b 5yՊpoGO9w䥢V#CM.S#<O>6 iPT®BHh.M%QSwO=%CӈNt+(D(\Jڴno(zmU+1?wF_,Pm9:R%dIMWWG AZ{(1ql r=}NdG K:u䔮!Nz.a运Ԯ pKρ|ȁ9@ \R!|«nqn0 hI4G ҁ}V؇qb6$ f!Q-iL:θk<7nr|AvA Ƴ:7|3K@J[ҡQ7`ӠJ8iOԖ&MVհgMZՔwPum_Nf;~{iSϮ6n{]-jm>7ӽ8 v7AmqKԐ |ce>Q@0(;ᓆx7 :⟳y`x%jOP/`p4˘)̰X$c_Iց4$ ,ԭ:?ujUw5?9S ­|*߸1}'V5dg`%4<@qy| J&PuX Qz c+i11h'1-Jʱ< 4/CP?1aMu?wpyKqu!M @ʏTa@ıT04pVp 3 b% c + Z DWwjonՀ0;q2TFw(kۗOA`|ηczD8xwv{iy atC&D{C}cnzf`C h@|9N|(7OS}\ϖ?!zc0ٗ?nm(1؏>n $hFƅ(_>SNT>|Vھx3rPG30e%>IwȀn?}3P|H?1UD#I u[)@2lNϮi N%R՘g|N&1яRRU l/T-qT=i/ok XTf௷=ٗZoub0PƊK*dU5ƣtn" fY>-J>δ-rkvfg_~ #݄=աSMTVƍuǏ7}CKOԗû $p8N $&.˙~R'>/PpYֲ>)wM_.b"1@q2HcIp zC5]l;86s /[ }|J5-^z88 XNa"HHt,i͛NN:i|'6J Edp3b0Hc8tBЁ?D4׫Uԣ&6̽P:d|p #:obE7(#x n  Wkg \ 00 c # Z DHlonՀ0;0Fǧr  @k5o$q`  p GՀ #p ǐ5@po#q[pEcxxx8O[6tgk <@ pFu0w@ nрp 8kLp D| 2'#q@ P{ p$ 0l0Do0nsHlcXx;fc78>(ux`vpX0@U@# p0 0D9  VkNp~0$Q$QZ8 xc0#Q U~X&qX$t#@xs~7c ( X$0`@` y ; GXkQ`0nfz "9$ih Kp DD`PU`mHIWyI#僈 `0 `IO0gQw CdTv%8 k+ l0}! | p စp  0Yk_ `_kWp[^W@ #q 0LQyfYzƠ|swAIzg ( @78@ fdW P P@ p g%GkHPǰv 0I"A &1Y{ݐo0w p P٧ll9^kєp/o_,P~<hX'HAUK  ~sDXacⱏz8 ֡{z |`=>T QE8D$1A^h0׫ !Cc7:!C|W$6jonpcAG1W?1|=A7s;>PtG67@drԙ|H)R(p$͏2O *e7|`RD? :+iF7}Hoҫh)׉€:o>J.F:.:洕F?Ҳϣ@ S-H:Rĕs9N*BIu?1#MyشzVU$ڎҫlVJZC"Ԯ\LwBsf:ӝ~s7@<2B/D{`hPk=֮|}p3bHc8<D#1Y8PqĠ2VC 0?n/?1F `V$߾|W1XE=aH E|扠0I Rxi`lZɕVYG Av)v#if'*qI@I0 E ;֓tHt}ƙbZ}׈hwlB `/ x}XC q@nЂIm4 ` Yi pf_fɅq P h@ ؐcPen [^@0yMy(Ym' @8@ fpaW P ހ@ p `l&f DjH 3p 0A&1 @Z P~:喠ZJtc1 &rtd>!H@zM$(!T)u(6({XQ$t#/^G.8Y:=l%4uHSc&LJ@@Hi0 a1|G1푏->QMCPG ӑw; {̣0)É $>CyԳ=*YCLRoh!^SY~BRⴅ::nyÉIuj>#vg CJT ?QQP/>xGOFU/}`*Xzrӿ"V}b|`=ePx,3z݄;QCp VSCrղ;ܤ Z㮑+na~_ZMq șv@h,_ ]N֨&J\24=|{C ogư-d աieXzND 8ܿ@ `q@, JXel1[r6ks`Nv7;aۼ:?tӝ8 P j>Ah1v"n'v}1f0B͛0?d*.ae[ !-t}%_8Nhq?1SpO}&OPh_wK+q @6W}D> ʓ,h0p0rLAѠP 0pP +-p 0 p'؁ QPPq$h`0 :Hw}A*iD&:⢃2 ("Ϭ3ТlΡ oBцJ@t,ɦ'#Pv0"`*P@ (+'ϛZ!ƥ~ D~"j<@ -?12K˟RбCtpKp#P<;L[vB}l?@*U?ɿ3>d]>lk mot(d2y;tɠv?aO覷.64|>+> ִ(*/S@OPOhWEVA YulzXF{DL Edx~Ui3* h;x=)K;t?Ճ'L [7=]څq*0U7Dݫ@)_Ja?eӳfsM6+,9|ٚl Mt`0y]cMΓSrOYb#.MV[o3aEcζԣEL:,P9RY ǏO$(L@~20!5{e)|6 linCIkEYj+dQ2kӢw x|"X)$l/ul/ИӸZ[֚i sw,KP(ӓ (*G9j8"cӎxQKGSC:xzcV)R{W9C:G:7|XPY5:g4DJ-;4+,(鐀}+|xQl@T,m6x*>i*D}G$I&zD(|HMjɂn)jz+id(Df*v6t7Ifc8Aid^S8&wrOJ[FÈ@)|j몞 01elBRD *[iy|J!6!٣ќWYgo8v GwXiqkmX}ةqHHu\r1ן [+sRh2Xh'&]r{5e{`v\g^^9k_p瑢vً/ZwI;J`;ˣ{}VADÈxu(IaTzUd@ ED2Xz:0,ڭɘi3i :XsCD㛱&i_ {ʕKj;$+ʒg[V0]#A'ԧ2[˲曩=zy.xJ(g,G.Bf g BZ'~\r4 H뷜AXoyN˗7DG^ OM!,q(YY(2kZz%#t=bRܚ08V|WX!ŷ;Hl \*˄d0;mq%Xxwշa@ Y7RFc,yp(-y)ZQr-GIN{uh40UXke*j++uwu7Fk+vk0ڸzY\?**;8xk7Wy/[d+"c#p7TR7AAil {I#{w,D7;éJ.jebHĽ`@(Ej{hͩl3z7"}3ȝLgJ̪GHӔ'(VF:L(;\S`ŀ2L4Oa4x-H(pW=b0` (]ڤܢ>4N+Nd}h:{fiL;~ ЬB(1m2޻}Hd2Zv/{S1  ѩn|'69Dswt5%|cf/}79MF=ݤcB(CbrAo?9!ӒjTMEN`աo7ܘ,=i ,I) q͙sOu׺Md;u,_ ɕ/WYZvHH2Hu> )+'r;Oւ_7?1fL :2mM "˟qƟ1qß c.QBK4@NAށP\"$ Ɲ}tqI&MK1L  I n1 pB R Ng T)K<\-)Œ)zKσ$pN1jqI <{ 鯽64@c>;iAJ= <ɓ? 4=Dvnĝ *@D3Ll;+i =,3>6$Lʯ@N?s³Ͼp:{n@< 꺌/  <]OP.A&TÆ Θ6@:+;Q{0QP&؀@sv9L_<SAC]Ҍ"nw;y++4.i`@D0{~j0<7<@74rA$ i*ˬߔ0ƎZgm;+9IC軱@j+o?#; 4s wH^v$eT-KN@=IRL*WV& RK1q{쥎Y7aꨑz1mTe∓t4IjZ̦6MYfsn (8# 11::C3np<( hr2X˔>株 恏S]ebh3th;bbƔ,Z8꒛D}ã=NFҖ0LgJSm~5:ՙ Q=> -jPNt8 *J'Vծz` XswR"e%iέc 'eZM0j 8(H40?0h  !Y6.fL?=MG ^V2@0&0ΥtvP*Q=-\2prQ͞hQoΛc67)H*z\Mit]^Y Bw`:xl8/z@ L)-Y &1r+W%,ZN:tFYFk(ʴ(mR꘭@pV`p+W@f{%]YFNru]R/A+츷K};"hN6IRa AJ|jo,ǗWC*x3K&x+t;xy9ъ& gXap슣e&N̶cCCp!S$jJWH4Z {VQmPNx=f5 ex6_7*|-4+j1*Y(,4(JWL(η~DΑTAugJMwdA{iE{ibIZĔ>> ԼeǦ0aҚ&̮}E>vCC5v?s`{L6^5F,AIw1;ַ{`ZKy;AP3m+P;X`~fǫ OR₨<GڍyJ!5[_SY G n SWJ*^iro[WSbgH]gefSEPoJa4wjKz T7&eۘtvt DOcnavqgX1(Sx7K|7[QxDO@U,瀍GEy2TGBg\1 cuz_zL 8{P{(eT!A+]g|gD:|@W[1}$f}:v76F>(~@~3Gf~iwTXVxXZFgfBfehfSO h+FhqvhHAQHB'O.wrÇibSzx4)*{D0sTĈ[8{Ad{7+vRHd|b?fHF^56(m53fMnnUu@p۵ʸ،oхva75xwvSXzhD7S8؁!.7e(;h{H'/|8b>DM.aRh;͖QtUeニ֐$I!yC"9$Y&oVdxA{4 flgoHQ/PQR>ޘ~Pn!t('r%G!y{s%f("x9:r:#fȂ.:a&"l 逿g"tCtY\|]l2}>VLǓЕw06~&tuRuw'wf) &+yh-8A=6 7).5;ə6bl0X JgU5N)jQeYY7&FF43tcq)*Ňb:^i3&@t'|Ywʩ <9ߙ깞ٞ$(p_- -g؆zlR)+ zo,-;Xiy%й S  21_3+]8+54 (\'ҏ(ukx=L7 *hKI0b%u~YD4n@ @P٥^`/8' sٟ€WJ)ٞ l>*7W{zx3 z%"ʝ%J<': ~C2i<=,aJhmàa 4gUbڪ*p7Ȋ"o/3dF @`Kj}V'DNLium9kSO|X: С4ak8,޼Ͽ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj)lQvP<i@t`*A$7&ìdD + K@ ȓ MK@^Z;;+P&j`?ӏ -bmK. [q*O?l7o-B ܫ?_Wk^iR"\?rs;8L>PP uS׬vt@$R†k\8LWny}w#CCTM9.zpø:ί.P"P1?L=yA`sOx ԏ<[;y!3@@@3;< 3> q:Kgc7Bc[־ $f)0{qw4뀰@yk羇Ѓ@ÿMj H>"!K#}=\\Zػ"nAx`k?⡏^ #"iF"x!2{<}`>C\=1\ˣ Iޜa+"FIsEt$֡{1ڙ$BVJ`:' dA<Hn-* fX6 !6l^Y h"4ym6GW1@Vl3 #l)LWb'H-vLl)`}yhYe S/u1Qk݄ t'=Qlж%}V lQ_Ha^:ΑbV"cU%s20hʃըK=STd{<<Z?T1WK,ь9&J7)`ָ$;kR>qxo;N|bLC-Qp~&2x!JJW/^D_zieqcjuPav ջ`#i"r!5J5{U[;dZC:mj?-A]a\2m ¦]ɦ!Ӟ=i{tܸ1wuDA1f" O"k2zhi}k: pugM O}Wջ{mxba赭 t[w%{U*FZ<9Ď+^E7~o?\ eT,@?hx{Pwt\%8{i{Z/.EC&g G wqg2!1JwC#1)/`}m<5倕*TnQtG\/Je"|$$/j&j~RؒVc@ڂ42 E5l$/dqB5De1m?vhQm?AdE6QVR7n R5@Pfn7;vے0=FMQovp98 @yw(#؉&%:1j׀.r;RWwW fv1z}Us7>vħ%x"tCt>%HwYKyZ6arub=1mmX`pX##assԇ6o5e*Bg~}ƈ#FʖIY,by"iw7M\6'RrEĆ#<8s=ֳs%ŌG?IYLI!UZx\_u#x)["\e?;Z/Z!=w!]ox j!yRWĐ^GJ!ywFG8z#SprrZvz "xJ /=C-:|C J01+G*!*yWw-RWK@⩥a:c+qjɊädo.{0Ӂ~䙣ƦkMpEZЈ2NkRN ivR7RPA7dٖ k-!c?}4Lߺ::c1m`Ӈ'ddaRǃlY6:څ,u'ǰqFzx7y34eSح٭ pJG[وA:Y<@1B ]qpd|iYw L+ BWRr(sы,JX5"#?ez?JlZw7č;uux]%5eX>74zZ5LC|w*]RXxť}`0@^)AgsEVG{Ȼtۼ;za;AO7}ji/H8iL)Е76:d~[9<u )Դ/tqnD*:h{E2S8l;H͚O7E 3g)Zk:26)~—):X %l OAAI-@2>NX 'AC*4J, QƩp;%y; [Yqp=sD38=Ԓ7rP$'9p sSJl+ܼ>ȐɒDKF;YH״jVb5r렅-K!^[C47Z*L"!nKF7uvFZRwh(Khxk-l*0UZyw]PʼH.*Q!KuxYx[z^pXAy\!cyfʑj}-&]B=-[ѤѧNqD؋۽B)|08A/UI-Ҙ_e"aQkILЪ|37 |.J-fn䫻YbwmzhIJ9u+3ҧbh4 " kŗ'ci9I(j2):h ث6b݅G`?7~G wXoZ|J^)+?ͩ7#:,[й֯UrxAbn;ܪ.{6 J,I&.}uؽ]<ɰɠЛ 4m` ~5ۨxgB>_%v⏫u)i|{.!2.N⣻4N\NG4ԧ.7wŏ[ۢyr+l`cF[u*9~J('?FB+%LRM>t ,L |Bby\$,D0k@sqGap 0b -HztI(rJ*J,rK.Y±K0sL2gL4TsM!,YW H*\ȰÇ#JHŋ3jxT  HR$*ɒ`- EI͛8sIX0< 7D"jOBJJիX 20#IEíjy5˶۷p1q%.^+^))'Z2cȓ+M4MY jCiVڤM@1jլ]ͻoƀiZڐ]+qpSdNbZ ȊEc#&`:91vܽ[_ϾQ't,'h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*j?jBc0 zjJɭkʫ?A~@t= cjI:!A믺ZP"PO?(l? dO>AO s=FKmqA S?t3; > :u?K@o@|ۏ>$/$@#P?1m;{@lrɛt2;> l.sȴl{+v[;w]/AT|Օ Vj 7sCƣC)+m}Mr4=0Csߣʫ |An;:&G/=N~+Txn?J>[:Cן:l@D@tpmN=H=r7- Adx A2`@WۼŎt%tH%- "\AU@pԇ>n+vv Y 79po!nȀ0~Bn ȇ%ed NbeX,l&:S>Frm4$"97Ή-LCGT`"A h@z&8~\JVdDL%/iL֑ ,z`N [X-D*8O%XfiGK T@'mwdY3?ҁ}W4!YJRe͔&\`?#X @ My֙І:}I{^Wu|oEKHV İP& X>vcIEG*H:'_Dn(gR(Ƀkqj@;ͫ^ڙxZ1s1 f 0B2C& ֆMbf41,h#UzҲ dV\1^Ic:XMl< Z$;rM]\~T:P(GIȣ MD h2hĆ٩_`o["e!S+d,lXYV)p/gLa1KCGfM l&7;D-mQ96"{}M<@ȉF,uu*=$&NOxZĒ7,RGLc(5@7-}?u}qlU-Kx&$ S ЭBȫ{̣ja_Bw6{ˁr |Vz9rJaYR0eH<5g9y,sZh~(Cv !}J>)Xpܡ ")Ob=2),{X8E.q4$ꏏ ޲Vc_+cY\ ZT._u YW'xRXq~0of}•b@6ֱly]:WCQ+-뭁FyW% |f& =3rf󩝑`/gڴh߬ BepZ )Β 6ߢmwWr'Ψ{j5Ak#HAϷM@`tV|yS ![gVrs/6zBG7)5նAo?^Wxp eGf7&b Pddƀ2=Q 2 p05V07vC:V0@ evft@S/JBr-сHGIF?5V CBJ+.ULg\+mM U>luv 5TguvCGƄ{fEdNX G4eF54_wkF6,Li^DVr+peb\S3 _'JgxfIISP r+@5fc\qu8{LV=uFL bSVSLhdYBywl\L^ow8mcE "/V/G{~*GaplH(nJxxvOgV :4{ByC7TetඑZ;(u+YuWinuW4IWeWw"ʢBw!c*I4/1C.Gה%~h&6eɊE}t+zTլ{YWL Ƕ|ĆXPԗ^XU97G 28w>W њ` a㑸Jzc #Ɖ!; x7G嚦Lǁ$[phIѩg O 7fqB/'tY0KFTAzdH_*;|gFMȠ֪๶sGy]I~!}hy/ g*ʡhkjhXKH[1U{RO1j$AC; .9|ʧ]Z; =JS[!/`mJ{lNvX MZf6$Yڻk 8;"qhdK0Ǟj5aׂ#{Q*т3kA5{2Prr xBI4ZdT^9kJM*- '* 3.Isf<gmkrG栴Q3S33ىKJ΁ă]-]׍GV7yr. VmI.ݵNk/ޝ,fҿ<, qSz9,9}.T;ӁΨs:"e>z+Pn%g:>~Na]cq K}-~&1kys(Trt + ٴ%>aKNܪ^]c0W(yb6۩lۺ5. "删3{SLܠEj֛ս3nITEmWD3ۋܻHZ"i "Ȕg8fyl Ȝ׷h~cpɔ k%|쬁a¢)qDKA j P>bG {!m|Ғ(iLx'B{ʇȠl$I(?*m.*j "&~Aj(g={lJ|~saGlJ()ASP0 ßTGw2K+LȞ}jZ&$U QqPV[ŏSC1<E6 <݉Q"O}'f'TWPDc- =p؜PY*{ٵjZމ]iㅒZX,m,>bRThy4|xMxixTU^^cꂳ^Hʊ]e\=6y)NهRѽ羊sCg Xg6hVzP'Hzjjzk/dlvGj{lS2-! $  {8a<߮'3aj;nMB0 &5ԯu04rة¼& 'C9R4\=PJqnH E&0Lc # P ||@@ЏS#B:˓V B >PLY'ҩ>aWUV*5`@?~'?Y,` ~Ce5kZ:ε-1!c/pwxc 6Y-`kpcI@C?:ʆeJH DQ~tk=Z2)ZCrA@=QEk] )@߁\G*~܂ & 0 wC.IV\3vCq|jS5=E( *| &wQmpQ`@)lSc G( r2|\/z, u#H3ю{d $;(` gC$1p7nz@8 YgB-k\gQ}iLgZӛ>ӪiPsM& <jT?) !,(W H*\ȰÇ#JHŋ3jȑ)H!*(Q(ɲ˗0cʜIfLZ2͒d %ϣH*]ʴSzR^Qʵׯ`kFEeɃ Z=c$ڷpʝ'X kPmsLk}4pIjL˘dPLrU'ĵd۸a0khK;ȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`~&fO?d 4L=3@cg?tމ'Cf>с$(eZ(A_ìS3&;3̜:' hu@h& AO`ðfN:9lm"42KԧkA a&۬=j.&l4;.[-r6jk 4-p;Wn:mOn0;/{[-O( @+AcA6i֋,{'jhh@ƻϜ4\ 91kܵЦMtHl+0&Ѓ'fy3ݭ3ē]14 αNxe@,ɪkkzJc'//^'DSAsO?pXZ;jyDa<6 $XײZB[`4O !/.|ҷAb ?ցV;'Z؎^ kH*kgA[JH qE B  "DBq 0X3Y>DTw{ 2+<g2LnOW@qEPTpBr}޼(GIʒ+*WV:t++8jLGxIkr$YQԾ(edRt<~mԥ.Kd@01+ۢvyY^'E00M1/) i}*я]j a3S.@j%_LZAtYR=b bn4)mTJf([nLz"W1푎}ԡ|mk(nꔜq(cȭ]lTqGS+TynM֣*N;:aVJFK:zӗnvEg5*טXdS^+Q.tJOJG>GLNicq:u]kAKBh )q"-dr_>7/#i?1uI9Uq k՗@N &H;ت^NJ* ¿}qЇ@t$wDK0KVLTߘEхcEwNbȑ>ǷE An9$ {,FMb+$˜VS29F6t}A:݉ Ї=(\:ԩ~3f"j *CI$@R"4E1|cҲ&=8z"վB9ęXIi5فxιs<6uaЇr U?L=]ks_ qM\fn.\GQV;m*N} f?#i2/3|OX<渿]makn>K|˞9GeW :.8 :'䷃.0$Ճix“h"- mWqd)cavv=uv,x*WAr8r厔HeXY0./[ϾÓ{/Y~&05Q@'vFWtt5MF(X1uuv8x}Ɓf'-3QB6>ceS6w!^vW^?-^7a|KF&_x(T_ dxuxAq8s('CB> vy[y3dV!vJVn(=?t`b?Ibڇ{ѸCHfѱbyca}h7e{u$dx4fh1@pȌ˱|4QH$I' &R^ vNKUB*4&PgsTxXe'KoC0QFuI5lQO]|^uޘwX|Jwm^'B>EAx(#Qy+W7U334 y2 i9 uzEgc(&hq 3oԢ6Eӑ̷s|y#|0Yרe}CYbg}Hiv Q9zdq~~\髡TheSzhiyk|+YTzo}ɀYj&oiHngTvZYh#XmR0}TMDlPxcb_ j y+Ѧ% 61'dr~d0x*Vj  n_^53ȅȢ;V}U.:m'opm®"w7`ߊd9ۇSea!rr) GR'xF$% v=X,9zzՊJg0"z+ @'[2J4zgڭȣw|s⢣ LFC>v>Gܨx?4jQ:2*V:xy_ȥD_3uO}#BB΁ I|tWwqAsujBYz &?}ʺwQDb %jӋڒW1=]dA|} *}4:4𽌛X QK^/7RѴ(fy+jy2li2c2k.diWKd{JP'#&t2 >w"-Hi?EQj2dĈ!}mKp n,jܼF<-*_)&7`(.bhdzP{2`A(Do,@ٴܫ]]!YʬavQX|̟frtnL3@p)qeZu{{', ~<+|ƌ~6Ky裛 COvw7K^s h01XZxxym"B'Aiz)VCtڏב|LW,<֑㛨廨ܨk1αړ>UǼrk(N&ӡCɿWIlKV,\,Ҹ h(κH5r0C%(274%86c?jT{PDĴƁLH4G[MM%ſU,$}/i dLa߶R)OȟovHgSdbڈ-)0?Jڔ<Ȗ.R[pdaEjա|uO{p)D}riQ)n ij`3jY|3+eKwZ u]b7mLl㝌,v?IBmޜCw7}wդm^UζH}+hyМI|S5 * = }[wxtE{4!þB{,Ң2|ͻ۟Aӱg+؝T}h~fFlln^[qE~'rR ןȪn8*xi{#}5-4U-x][lQȕ.M1H{֭- +ٲ ymDmf_-ڲ"V'K 0a8s7}1ò]:y|]آ.ЄIBa50NLuLs17}W-5a=e(d+kҎ Y9dsZØnޢM͡LPq>5$([m)+bOӬ,/L2^dBFۘ\k1t!Nώlu]R6>X,.{ǻy-W0 m{ѭveiDN{Gz=UQҾҙzAE<>ٿ@aKg-r_*"́ O5E_4M_}t b@q3O8S8؟_οCq(/&$XA .dC%NX"A71/$Ik![!ys S&M&E/jC'+B͘3Tߓ~QFthѣ>j8NjoϽ[U jUR|| }a7ꃁc˞Xn^B;2m{[e̙5o<@6zΩKkL~'P6MP1Sg^d>!P 'P7֯cV?V\+~O?cϽ pSN -9|jPmC;C4FD DJFx$gxl1~#erGiQ[|1 <2%=j Ʌs!~~h~j2zW8$)4 KK$AX+RLďDRF1GҨ wpĢOJ5#x2JU?(UD%ˌh%S0 0ϟ*X ~NN >sg֙nqß4d|t_~UӔ5_Fǀ"hX Q]L[0 =8* 6cZY1Ʉv5۬ʚ8NSS4]2]d Ɲ}t!j()`7gc) ~2l) RZm{3l֪o@Ԛlh hπ/3v6,sEu%߻oNg T)#l62^x0Ewj&eqt⩪볧<{yy e~G|O}Y -gd`G9TkwOF:ހHK@"~+߇{ 0@@ LxL&Q! 9D 6CP4ta}C 1k|TFDDx$ QSbh7#p-vqk`NDLqE8Q&uFbI͛8s3%(4bD Ť*RzάEF,W(JիXj-F?ZtbbEfz¬۷pʝ{@VBqS&)݆_0È+jW)N8YC`AS"!˲ϠCPj-XbMW ;lhTS1+ҒUVgL.2@lhZ ȊEcD'Y3q$ B{4POϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6hJ?$O>*03@ O?ZҊAs^H:= 0)<:?^K@ݖ-Al: nˊO+^jx@*܎na|꾳 @,<:2.0'<@ ԁTs?@>O\',ڳX4=n:q=0c6rZ.=GN`ܾ+gL'Sn2H{NBtk^Ay )`Y=lěÎ N=:nmOe@N xi$W;sƽt<M8j_3H"> P zHm!d /4^2V{,yի\-g8x@!lvؿt @B6 `|!<#WAl]ֿm0@!fҀ$V*}peEQa21^ ?QQGe!`6CP rn)dX$V@(R1(uXƯtYԠ&?#' 7!2`m4I͙̦6!&pS1U?4BЄ b򐆏{ysc+Z|ak7Rbǎ |zV% pK]>="H{FMaIh6`O5m=k"n/G_fY)yL%sLB 6sS!lHK#4_M!K_z#lf ~buXDZf͠BR9?EeѮK^hgMr=>NOʰ)lhdIcVv?SUa?C:^ bu =tqe5][W'|LykPdXM wL:'Zx j{ 6 rxf%(8jwɷlZ\ +OjW8 fINůDz3Umog›pI6X'-<:~!u tjs9^v6PazVVg>Dh'}+TӒT C*w';wsȈ< O}-n@#lwc#Ge {:ģ<@~\<'f#sX'&SIwY=#Oe|qH^1qsEYZvbkns. H[չ 3gd*q- h8XWBii"x Xv 8_RSy+Vr~jpjB7[r^PvF F2VPrQkÀx2l%WkȶC=9sS&0uV6eUy<!C 3(l mn3Gn-vWX7R#,hmЅzO0H5ۆ5]e?bC6Ɓ$@Vxpq73fuq!W7Wtq72r'qc /=rrsHZC<8ZCZsm|7 {r.2=iBu3u۷ybw.)337q&v(y|wvvx]o$)4E4dzwvg_U73狧S3M66dhnG}Yy%}ߓy6yha'CW)Ytt Fvb{}:c26*1F^ʳG۸{vqhxtwF4yHdѓHGy^}b;ib7t}*,ą ~斔gshpXtYvI! hxN(jNW7j8p+jO"87$8&P(XP*-pUEa2=SrQ4p?q@DX%HRKRȘ8R=Uh0wݶT/^ybX|egTZnMn1*I pu5z(ևa5m7;9W&ㅆhV/Ȕ|ٟi:jXqr:3::W$hs;=s@p<\#R.`1׌R'@8p(Z7yY`׍dG@XuSYSe>ؚ녟EhX_Y-t**R.bNɐC4pywzç,)ؑ%g`&8DCc/;ã){:+}t|e(9|)IXU6_ze2KQ2,٣qJgwSiɛk; @-zMZzتm"cqgumBR!(7#OPx钙|oڙn) I.RQQV/8C30iG8-In+%1詘;:2.GYn9͹ILrNU'H8 ݩh\%|o癜GV prxXC{?~UzX\۵MWvsVx*.+)jzs)e.È.UD? RzA] A⓸tDC A>jK(^Zޢd*x9x6XeFZ90¹-V+摂 ;=زMSQу {LBzy6|C@=B.qIcVjj8Y3@:l-*K!gjcb[u)Ţwê@ꑤ­*jaj6QJPzP26*/(07 *F;hi^԰߳liD 1iXm"x n&za19x/;m3~29 9yس^~ Vžuňp(8)E(! ɞ  YܒmT m=7:ՐsAW/[?GtƧ^`*F3 >r:F9E_3/"Jt?Գ2,8:dDz ʲKj,+h(,E/u5\=?`7kQ -g︷|~ױRhH.0.ȋ/8v](co8,5Sz)[CLu{d:u>CTsM6ۤ́L03MT =tO@ϗN|OAuQ(p>YrsYjLHkRK1ZAG4ԟU{N? u'0_uZ?dglVtZiTHE!5zQS@'ne8aFq=PA&! n䵟vy9e~ߥ@~N9&Vݔ%8MuI\[n2y2ɇQF l fi~dY`\9RksLyٟ'q*i:X =PgUe%~pw8g`sQ|0G ێovMSO|~`+%4Ǔn4|sn{ pĹ')v$p s7WsDa*;~ށqg]dj:vnugwPܾ x:v `AmGWlУh 6f#| p$Љb.A R:E?ƀ dBgmV+_}Jnx'#S(@x@8Ž1IFc0^ǵn h9C PG=D2 HC<1QarQ$M긣𰐋dd#d-#H"9G*r37td'=IH= eF ORn !,*W H*\ȰÇ#JHŋ3jQH),ɲ˗0cʜIKPhĈ\i#- JdZPѣH*]ʴ)ZPtZQTTjʵמPkIUTP<(˶۷p3Lbr߿ ~ujZ' \xaǐ#7kpXLnH̹獴dI%K0bTװ@g n Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf&@ĥ8S> 3SϙOm2L>%} &t@t`'A@jp3&sf?90s ԏs@( A@\\~*= 'H:=q)첺籣–jA AUxjW=kn; 6kF i \K[N첛 * oNܬ돶1 +|O:˫ gϝY'֬,Ưiq&(Ocn&A0n^ڰv3B5sl>hЈs[3pJu(m&eu;q_wv_Q]oΙϣEq=x.l38d@zƪ[k"ƺ]p%;3=?I=Ǎ?@\Oֵdx<g0j5tD-ٟĠG@j|Y~m%t2a0gs:MtTxoe?v0\* KHEy A%.g@|x H`${tA N?1,ţi_7,P@!O%?qOL{CũhN&7IQ](GIRwI4eA] Ї=4 kK*@U $@.wC(brb&(%\V,KcvpaRiV&%эd⯄0;ERV?nΒt5iyZ_$H4]L8:0Qdm:w24+X>FKXFz2 Ċ;< h=p,Mk?3zB]JJuT 50ѥ~l[pyю[hVgov쫁_")8|#>!*3]nثΕ&"Keuz\AKҚZZv!kRֹ=v?ݺAp3@pmPU Mjt.L{[Bu KHixc(e)?e tz_Z׌{E%ctC8xmy|d!9&R q$PۖW8α>).@l 2 ga%Aڴ)XrtL^"ꗄ20>dKYjNeaJSxzf4KRd*[d7 M]t]BJ!vc9a77$5H=d*<3X,nT%+[C;D(G?%Ŭv-[OC+壗h0/dz*ff?%ձqf!3RƬo|fyVfHJnz-i_?|֥mmYv̭47NJm#T?PY,aq}I%5)k|f]JՅ ϏhCNJUHnO^'d,S 3ykcm#@{{ɇp7i!+?PS1̩ h'-nW ݕ;U;ƀ䠗&µ|ĵݡn:t_vU;hx [в h԰@8F8? 9q_ŋl#QC|W+OH7 9:+oYdN0G2=/bsHsK2۽ n{rzoLΨsz &v,\FȒmIDsJPVy{Rgph_OgnuTiriӃvGTj1jK%&~0o'6dUq{#=Ʒok7w0%SpSQ'\"375li=E|o`FTL'KE5\b5I(=m'USzAc6Vc%nh]$Mq37Fo?hd8ohhzHmsT39prpC$] N5'k;q'Yqqe(}1r8Xrsx|,4sD6CG!\vte{-t\wv&FӉE@\wFڥFaj^ɘzER*lCwy(_zQzy'*{1~b?`Ex`a4t,ggwHrwEKFy٘yKky(&F7 &)wwHfFCH)D{c灚6h}|{294|4y8}:iH,J2c }K(s~8('Le&@fW2fx)`w&Mo'z&k,#K3>5ȀfHO'Zi"P&\ Pv_䄌P.Y|/Vg@1i3v4H%'2 ZGow)vy/R+&S%&唘w5ɦPUXG4l35qBm34$G9k4舙cQ8Ax6jnqA)ija5yW vUnZ!pq"9)#DG\Fg޶X88;ȗqh- @Г 5! ъqZ|h&ssT>E7{8JwHƸ\PwG`_Č uЈ]]7AXAsgi-v5 Fwi,w$=(B%W+5AvƥEg3xᐳwaamD'&G9ydbuX{,W){{-ٟgJzZaYd}qKw&AJD2\2L4e!%GkUPHWtNQNԡ wix }y-Ǫ?42whx-#(%XgU CkdVjj!9FJ8R*]ҮG4?%f֛%Jli 1;GpU2czIȪcU¹YfqxQQVwz[z(ĚLss2Xt GIp.7XP;T[VX;Z[| EK'HOhztzעIw\o'Q+ˣҸ@y{rE:p3%4kw6hy_f[q#IZF6yӷΈv*> o5&!I{%.6*٨,9:eK۽A9'*~ǔB~c~Ҫ'j6q5ld)ɗƬm /uzG/brT6M+f:9I2+Da/C 0(c8WF]Âqk)jyȶ7VBsUʲUQ9̸c#CoA7f789ũ8wU,63pYp:sMʿFW\.JŨ\w;y{+`g7'HA{++25ʶx}̆+{k|pZ' TT&I\r܄@ϱa }*ƼzG||ʻѼȅDJc4, =TQbE@He1R컔@ "0LL-[дS[ylÊG!NSE0I%ujO2Drip\ؘEml)e0AE~e'Q%ӹZnRd%]Tr)mľY^K(]%Ko6usԳe`\nx@ZSJp6/mxj *lRZ1|8 9=||c+ȕu-LK]ݞ֝]rl-yKsbq!ǵkQ],sktx;|˄uBj6z7؜^xwYDKEۜD;', M]Vϴl)ȱ)7⺍# ߽LP._smVg jiAi-Y;^Vj?XfN]L] U%fFxEH>7p5rt>9N@]")@#raUwf>=CߡnL'@{?Wm~g:P tNQ]]p5W$̻2%' j.u{ÜOb p%gu4REo=M0 |y\7B`W`&qjRsLh޴O>1ޕpP]P+g$(s5YA>M6\SmocX+FSSV@/mJH'@tN35.Gz<%/~09'o'Ћ>9Fy>ձ[]C>Kń:@~B.:ЌZ%# e_mo `?_jB/\R7[ȇݞIw('ozydѵ\O f  $XA7 LC%NXE5nǎo)O<ӧH& w” W4&a/Q˷J> ksn(k C3Š7km+ʛ0 :CC?AZşpX",AkM xd!:O=VqI&t2^|P.>9i3j:g8f2L *R N'O@;Ҭc;g2 PgdAW:3A)6ҟ\}ORbC2PZk]qW`V"XUvYfuְ0uBHڢ%R5dgw\T0\D` sExㅗ6y%^|uRȈ_ W_ 6"xރ>b3xc?#n</&cSVIjycyf&eqP9`U|d6^}&wV+EtdqzlS}PY n&Noʦx%~LX;yj|-9jCkAr" \X!~~d?q{rGxc᧟7(wt~>~Nw~` `m'w8g70{P x='z$`JGYCu߳[a T }~[–wG܂#$`ic Bjh[-|   s{3!ؠG)@ l\*QϹ0c$*p vCn F(1,;s8Gy@8|?Z:1!W* Lkj01.  叕Pdܔ/*O8MՠC^`-6@ɁM0s><8nCՇߣꧭa|W?+lwCNkAM:&SOCTсh!$]J pAqML]`0I@BH (p, Ďe47 _r1~)@hBQLZ[;l12]l7>V,@ `@}0(@}dLB(D' 1aUEь\z-$¦(i` [X0U,w4 u̷e_WG+?^Pf'g[FJ$DLрTXc.}&Af{6V})haJ $4=ӉW`Ie/yr*s DR%=Nj㋬ȡƁ;?&hYɨŌ猬cUӘB*8FzH -ᘤkrp.e/hwTzvw|G@@2@.sx0CAI︐47d1$r0C75YF``Br*&E7VcX{@w7Ra/FrScobviMc:HRM@?s$mIdUXbIԦʗ}M &5Do*jZؗq%Y2g4XhtÊF(;N"cn&=ꧽ؄=j}4L;)9{*I˙yNȮkg2YA)녻/Hm j13;5Un , 1sY2TA3ʚk{CdwUx;-*eC*Vqi JocC4eYr-WK rU40 ~Rq$ss DzLKt{ctcw2WY)BW'E(KZ 2S.f{kw#wΥ~ $@&%DG[~lz`nh<(brfwJ84GKz*<(r^bN̔̚]6BĖٚ-jcLFWL)MЉm(bl0d n'Yh Sm#(3ꉳz|. k*wW+k̢ЙgLo8ٜ9L'gd{Ǖ{¶LWXhqov{Ĩmc}Yʘ8<;e^^,î{㛢^mG\FR[ޛ >N-.3'1Gǧb5My"(&V'D.L䅃8s1DnN~0S>:` ^r.]U;^ #O SfƸmSb=e7n1ԻUtS3C C0sob> r1r]|gܕVMG82m 4)5K37ˇQyb.;TcVdIu~R_c{]Y{VCF*C.-BaDU͟ʹ`Gێ'ʤ &,[7ۅV0cI֦{cm,4Zu1F745^lG/8C_8Վ"n'@ԷK t1/ix1Ӻ I3xC C):cAo.03:m9.U}>`|SOD@Cݥ'1Ni7Yr8sVp.eMtœÄbN!!$x l]@bUkܡߎa1/O E͎_"m|jG1D> >2~6 .\ޞ?nx~30r #\=1h<-DEC1I~ã2%2 Gϟ?xSwpS?m:bM5V1#G8$FUdK1eΤYM9uOAWn7Eo]x0=߰ b]K:kAXiuhŤIKkRŒy_&\aDn{^Juk4XVM"Lvne#QZ r5bܹu~b2 Ϭ̞AH:wPFYyկge"[ /]ӇuP->|i -P+l/O3=;CC3ֺ'aᆩgzԊ4Ӷzlg~DF꧝'>жc(J,rK6|r/sL24L0(M8sN:E<1GDLOH0A٬PDUtQFuQH#tRJ+҃b)H4jS$tTRK5&OUTT5TWOuVZk][cuW^{%sH|Q+[$6džБ2a(!{H|[pukG!NPȞRK;b!$px:辚ˬu̔YȺ Xb-*%xc;nP㬻PM.Dxfgaa!5FY#˪6N (5yiwuG ,5\(g{o)CV{mK[\vi+? mAKrɢfpW|qwq#Ox 5\r3V;WAB=tK7TsJCtcl0ܗhtܖ灙FvgIwG *v=狜>&߁Ix^%{ٞuAYy&Fq"hF=职#8>`?Zp y#2 G<KVaXE=a /tK]! ΄x=dO  '0?`, Ab~ Ux\AqcFq;@z-bЏ)QA40 _(g?x;38d"σ aR~䃈 *rKX×ьbOHlHaFZғ6t\Q`.xVիO3T{ُ4?*$D,LEU={@c Pv++8CF+"DA!Qnem@a@ Doүc3@BqJ<е˛q,.+fC[|1C&A ,N?DA?== 3$=_짽o/70@n2$z<.r=ݭ| SF{cA2 dG _2&dJ q~toi0RfBCW|cG౏CQX:ze&{! mb®h=2Û?7 V/,LZ}n7cǷ&G;88<"}Q9RTrXa|#8B%:-񃍍{Vfcu "25&2}2#cYnr~#q6Xӥ)OJz@05uۧ@JP@h,BІTs(AOtby@lqTIWպ/r\*J8C+L?@CWos[({љ8&- >}|)O8/dg)GALcC3ؽ/R U YU =jkc^j/ʅl}MӪ_W ֬|J#>ʧ2+yܼO>V'X6fnNGFr[TV$K揸I7tX8l%&1rNm%[ l@{^,a8~Frl[XNx]25-ͯ~[<TJs+J{5]Hr`}d}Z4`*ݔi^: 4}D*la"WL *,xQT1!4&*3}s aGĚ[@ ݗI!W+?N+8D92Kl0ȰaLrS~3OMzb2B&LQJls4AT8zfGQK7842 󠍉JFa$,H/wҔ۝qČ^KmfVkC}SBS'dAJV:R.z,Lzs?fJ5З\H1Yj*3h3)Hc?T׀pH ?xz "|8әyHOﲳ4wypW'Nw 7{|E EQ068RgG~l5)P 2 ardHvvDxV^L &Hc̅q렪ݎVW-ػ0. ;nXu AʧE(qc+s5EUu͂ɏ_YóUwݖ>t<] ljt#vmaNڙ}<*{AK^uiɵdnVWy@bk( oH 9Ͼ;w{N&Oa\n8O0 !B~ =P7yosEW/IG'iP/gU@}'CԒ2ddJAAHB%%0MqrQBeYc_04&C( ayNeVDGfDNdwofhDg\/$uEf~D9K96IphplfG'g{75$~H,g8rFjwBj0rPkRg$KDIDE_IqKVl6JtD_j&hbZW$4GKI0XƁ݆r$6G$MXn% 6$|SM$|DN$O%gp4rP;gcw~x׃q؍!WX&7wnՍ..;2g.52$7L?&'tBtSZg8LhԶ@cRwv}|WU U/ H<~E[eWrWVAW,EBCS4TDA_Tww x{r=#k8ZfX>ه[rsyq}\NZDT$dxX{bEGx{3ygy;u$K8CD冔:\4ga5@gX|@f:s1KU|~Ǔ;t|;788ٙ}9& &%gQ#sd}GTR#&GefSI wh^#Ԑ)EAHCGo#HBLf{ł\Qe#4J=DC6XU(Dcf=n@fB(E`qFHW,}&3yFEZxj]}`bZS[I,$ԑkFT'tcI~kNcfu4qhf&Y90 W"mljATom̄TzFnZq nQE9$ds‹ 1봌Xpf|󒛩٦n,r:tPXl2>Z 47vsXR!R(.2W%SnK{:4-'vfcuWL3|*sqWu;8$;tdEXd\&ؗlatVlSRF4j;4OWj;;ei8X,AY%`LYG\锚7Z4I2 5 I[w٘U:`RI7%rK$Ga)zeW{*`}{ztBu%唘TBc瘵p^;I_Gx:$*Y(*-ù9-ӧ#X׳1]$J?3©;[&2c֩5YO8adȨd(z8SVePE::/wUbF;HfAHD$:gj2kVh$FCdX]UbYϥ z%jCƉݪءshF *I JcKmi0)J%fIJHJJ4 lqqyGlgzŵWGqඊMp{{@nM2{\:[^ZwO7fI/@ ;[r;!= d4۴Ǎ5[Hs߂% f\=pqgITZ?H \v6UIzcܙ$YJ:)TVa{⢒ȳ|/Ӿy6G!&\Ѩ2$-˓5j<76cKB¢AA,Eu$z&<h?AAecĈ!`{rۛ8nI$FBzDcYl@lV2[S}r>`,?t-Ff9PɃHnVбA5:o,'t2h=42%]2ot|W)s, HVW(٫B2-:M%MʥjPۥ:uyOlA)c2 P%-m;v+LT&T'n\w7Ht?:A`tb= ?IA~iԮyD+qN7M>%]IdBaf]?n?/H,GWUcmMJ YKH*%s]pAG>27n/8BnB ^:*o,cf|Kq8׸^vyu,nغ)M"fRFXF۽Q|q~ٳŠK6ۄCa~[q"B*+Xifs?q܀CcV |z-L4|L5 PdVuAvkW[ֹd&Y@BH)J Mm 57 S{qoOlvV+ L;x uN<, i $I6 srhrF skE^5]J3B?QfV O>?sX]5=Y?jl>ѻb1#c<:m;0W9>[(Ԕu ϱ)_?} 6 O& OA{kg0>3O߰3I)UdK1eΤYM9u"ž?wD‡ =y  CNM9^a :7lɃ FX1լ`Ivv`}@]7?~ +w{.fcȑ%P/O6)bzFiԩUfkرeϦ]mܹu۷ʻd/gsѥO^uٵow1فEx[w>{7*}Jnb'R%o>  TwР h@ pD *)N$Mw{&sTq,MJ~ƈK'Jw5)݊Q9p>%"'r"*x PPS#ddlyYY:Ej$]abx??4 ns4(P8TF8z ` /jB$,ɚrD]S"Dutlef 7~%?4! o-EAay3zߟ(ulړҷ~yhVQb!FP-F1cʖXDu&y](\qz؛*?CrXO?ȧD$J$WX!5]Jɭ|L UP # L"PKhTe5ĕ j Ѿ!\j$b+Ùz+'F>A_viiO;]ɶtdKB° mP'yvT,5P&h'CW2шfTP1CRnT+eiK]Rl";O;ͨ{RD+)O^f+2E=jS#1*zଞBϮHpG:z=)}1Fr}bI&Yn1ѩsM+CZ !z@9X3 U: d\A O9Tԇ&GU])uZq(z$T*& ®ónV MaIV}E[.Ya?Ҷ '[vj)Y(=7H;b|v̢[[\ ovKݕU&DY _බ-=某ʈ9fZ24#!ٕ{(yzǑƩ%/&,_-NCYA*aebXy'Nzc G6r¹%C R@Sr|e,g6]"l &Lryyl`Nlf8{l&KgqqjRتㅫ].'Vgۻp!bާli;JЯ&6nzKe]&F&(cbg6|[?MnE + K }ׯw{t&"t Jbax'4%m[>Sk {sp΢!'9ޔ\r+ EP_)\ьfT\"PI-ss3'zFn< Eg:Nl7~< %A>׼% ؇8@X&j Mu&:>w e ukψ?w`Ȃ8?&PuQonb8  ר=ġ' yA{DDSVL~"8J"p0i@"]@H:<~"40pSPCh <[,~m쇔;~JʭJʰK;9/~0/4Byh/8F+lR@R8~T2J:$O>*03@pO?zzB@tp@Ï"(zZ'׭>NKiN+v-ݲ[iln?ණۻ0ʭu Z.Nl".Ȳjukj?烏>0{ys<qR'L@iֳ=V|>:v'Vh۬YmFOhp 3ƭ= #=rO vVxe0J@@EUs:~k:kS&!iB>Pe@34O_kh#/*SoB,Pp&.|*v^a 4=A -'{Oڻ>iT^žǵ)gEa+p<(BcpRЕ5Z"H9nˀt( d Xa=^! NX!ZH2ЁZ b!ć9,?tDcTcJ!+|=x151c`)rt\,ÂMP{LmNȇ䎣} lE;3@2=N& ZLeFHU򕰌%~"O2Hd-o)Hʫe~]2.R`$T OκTv) dSODEN &Ye˔؈:XgT,pJEmˌ…1Ϟš9CKs/ˑ BO76ԡ=D).f6ʔn`2RX/TfV ,MKӨ̹]@ J$VR9͖zMԣkrl$:V`ՒֲhEW?VP6Vm!le[c8uq89 s&M C]^aB;U~cѹO<@a8n%xԜ2G Jҵ6E&񬅸pf2o[~~Hk n"îbkaֶsK |>b> ?ի:cUy5&&뛣4↰wӝ tyKW-h "oѤ8EOr ܞ/1bexL:ٕ\1A<+d|/w`:OlDYIQ 3diTCR뛌PlrZa+wXZꈌ &׹NUМֶVϒI/,uSUkSa4\E6^QRմOZl KuCI9TG⾩` g@Ew̢sFژzS4-զ5}.A2[?c7/)xw7;Eruv`+wi%=QuLNmFC<+6%Z,?z[m0+Y{S@ T +=Q˖kЕ.}a71vðJYGc2}7q[hz~zt90*AD/]0Qߋf]02bک'^'/oǷ8 32jsT2H^ ˑs3R$ԕ}an/tBvhĬ~ 6H+1D~1Wzeh&`( I5&n6شi܄vtfuf2/vNk0^CkWӥ@'"mlEnTiPkFvS0v*&rS (;ȄE1ÆRBsn$m`P2noDž8EoSS7zW&?1pI3mTPU TEUZKHǑq8XrprrsvXj~rX3sCX8sX&4}GFEI'Zu|RwZptBh~3[uq]S4}Laxvkve|wG[wwەUY!xBxBVB㍸w~GyHvA_M&'W.w|v Vzz;=N6 tEHg |[t7xB&WTGtwGw6}z;)g'Rsp7IBU.rd~gf7'P|RYVyaXZi\IWX[a)BeH̱LՁפiiic(͘0ԡjI҂O6|Ikk>؅&XdHT̆'ֆKCmvQKQb٘u!фnggn qUaN(o93rxo?us{h~4spPpU#qY<וٝ@!9pIpa1&C'Wr VFA=958!!r9c1TX#trHPub|!3 8NXp={^=T'+?Aਈ8hww5@a3s:Ҏv^EB)uF By>*3v7z8J]'?6"Zj4Za^ae))v!drŇ:Sڔ404c+Yu0|:ʦ;g'[GH/})ٞPFA)I {EwdK)'y*Tګ_YiYKـc(NJ^.'prtx!,#<s)Nj O6O4x6Ok leA.C9sb/9Rb퉚$Ijx))Ea8wBhSf0Geќ( xY7J8۝<۳>[}]cuÕJ RE̷u H{\jzD jG;I%3%xҵKKvm58Ȫ23[kf;^_c 3'3 ҷl>Bw *'+0mR)t >0Fc))pꂗ"]ϣ[tXw\ed* ,(B/aU0&Ue2@*13y₻)*ȼ9,ٮYr!'2څ*KHhtRJ';-fY 3Z?++pR 5Ezv^hP0CUB+R xs~ۥ+TB&N+Z>Ƥ2gLmrewL$²p2&G;mSqhot \%sxaKb)l0$p01DL~øUX(,'c|^4/IJs%Up]Bffٱ*lZ3+0cA;l+1ͣʅڜpY'[D,3A8Y 'mۗ<,2W{7grBP/'+pMS-ӄ'kM)˓ UuJc 9Q+.*`Ղ71j|(M52xu['O,k ܒC]WV BT@{**(Kgok GXƖ(mOxZŝJE nȷ Sչv(e{3(՞TL0b Sd yuh k͹n(3yB@lQ]}TB=eV98}UlemV=BӐȥ)"DgqħeoBțy.+mأoۯ,ˇ˞{'xԸ]8zeiI,\-_}<]vF zg3My6Z}g-hp0ѶKk)( Z*mk-7͂˃&9ͅ j2^?,%5:+c^R),)g61T\M3G$%ȧ'P!ÍB2A>1j2HR(PӒ+'Dݏ|M,TCF_*~ˋk'-QPLˊY, gs~nIJ^Vs|D=5ΤlvrJl.||.k7 ԑ -1}y:hk2,)ۢy4~|ѣ ;)q.46V.0})2K¢40ŋ֮Mj"N;ܫ*ADm4\SM&K/@,`8S]Q A\m_Mޕ@>*|{OH0LԪ૨fkرeՅsw5Qђo䅍e{A\/z4&~n #կg~ϧ_}0^{@xȣtA#pB +B 3pC;OSP1QDC[t1BI:WQE{t)țvH$'3 J;z2ʁ*2"yN#rM%t͕ 'PsH,?ydq\dS.9Wecyfkfsn)G{RrwQu6:eC ZS*hc6Wj5g|{Ƞ݄" z}it3}rх-Ѳ;-v%&u5N,z`)s 1*k, vl~i[ЅI{s~:tFG+mSڳݾJ -D|1~|ZGv˻zxj8y~M|z:PW ykzGUzxLH3|cSNd " `,Tu_R=0URBF,cAɊЂ[~uCh $"{5c $/^D&r0H  \4X!] `PǙy4"ϊC7^jsC%㌱1bw7lx`E)،xbpdŖ/(OR2%(H~MA.3I,ʛrt|K_D$ D``S1fRS0j^s.f7́,(>q% 7YLoBw8@D)d~4@gPPF*nY\8ʀ'bGIV =?L~X͇VqNTE>!-G ϡOzܠ5#|?\pի#dɚ0Ge]vP]rgƂxg`rӨB%(b}˚*E?NYu pYdҳ0)gcnsH*AGMXVja[E5YfԬtA*Rniv5 Lp>ta[׽ޭ{_ehj-*/|0Dvx]5R.eV(H nc@E?aejXmo ܂Pd%01dxGM"m?Y&u@t`'A4&`m?qci:O>f*0SgIz9@h2Z@?b*ssn{G +P:w,\V̓) g䃦4q+oAC DE=,e;2KB:-ql?wEw\6C'U=m+C=t:2=jP[Nuhas d_[ܳ=6= N?sZ+ 71Lӟ֕4<c*_u4ZOR`1]LOp+ +u 0 C b DH1jB O79%K|KV<^ M0t`<|Eaq7 AȠc^B<q+=G1NOg޻$&U=A (WRHαoL*W u퓬5zKMכH12lԽI(CmQr@sىmД&ƍ]A*nVvzTd쁿 Q Gyt5&sMp֤p׵e' Ri <iKҽPjOvne?iPB +`'\iv0X3~rt;FCmc]}W WEt|blJ<Ӣ O8&ү)'EuV5 V_U_q,%9 0ܦS_6F3q]` 9oF2{ZkaKԅduk^;. HKwnw޺Ň o_܅wF3NbρE \Qw|tΗa}nF3-٣*m,ҡi/2ЁJUxADd+6)tZ "VKP <HTW޻Ѯt6zyG̒Y|xSM 8 ;K4& 4@V9|HG r?d9r.KpL,.vm#Ĭuij{lțP~ 1;'NrFML%FgsUcu4<,M~N)7ki4 S< U{=Q.׆ԤV퐹HH74к0d:9}@v.vSP@ӳ5FmiMHRKUksbU wDJ~d[ 5!P\P6[G a[!%;nT hHմہ÷b?pn qf{eIޕAR؇;JuY~vqdӂ>j3ځ\@@4ϗtPԵT\w zBu=̅X':wa7u I;b՗f╟j~_ ci}+JMpc*MBo1WH߫[Zx:~؈!Ix(ffX_DgI G! d2_%ۜN;uSﷄd)9y0؃wuwO&ܵò4 z))u>b- U[6] /hI)Tu&ma9j 9ԎEKpL[-ÐWpA:)lĔZ'`xr˲ܵvv`üXt jWNTmQ˿l[.L@˳1lܯ[>X˕mܜ̥ͥ|B aV ͟GE Z ֜KY'EGQFx@&&.DfX7cǣǛ < <دkÈ&=~LFIّbp )rO;XIbS`ֽuJojsu,-IAtLu̚jkhs^ ň, ]2fH:O̤yMBJx EgwVJ)%˴ܼ] յyp cԬ͡-ڞ.r,`V"uDl41l- -=qJ220Oz|];V} :,. ?d4~\BM~J}ߵu_m4._\nMN q+. DUC Q׭ךf(ω O# Kp彟-k*.!MwDڍ5`{B  ug'E|B]˕ ,."52V{D޴V_Jo]dNƌ>Z&418XAKl !ܵ ;ĠBxa+9$wl(9+R Cq,8FIrBUCU m̊I渽[9Խ 9 j[Y@N#hb'ڛPaEv=T&NԬ8,lo/1NlT& ש-I~2Ow:mJpf3~_&]Mionʫ7*jkrp5)9'}k㌼[eC&pJhd9OMɨ,K@&ٺ, QfNә8aW}G }5ny Qc0hu.Q(.i;8y3I)^%KK΁ɕc~z.,}-yc0O|?k||k+Zt1.J8)3]ӗo˰G@ 8ԺR__J.;y~eXƃy*f ~/}= o?xmo?z ݻwp`>ɣG Q!I!UdK1eΤYM9uOA}z׏d>~hH{T)ӁMݧNtN~DIVHcS e[qΥ[.L쌞*+LP NǿR'qȲ%%e̙5osϼ{ 2‚ Aشk! ;,e&ko&_i$z1bU;2jo wUz'_>|7}Yj>mOx2~n"N< 4@}5^b062ǹM|aه}ln[tE0FkF;1G{G b.t H$TrI&tI(rJ*1*vlIK)*s̕.+rH L2㔓̾)MsO>aqƆGgBgǫ PAoPDSt%D }R!9H:O^{md UINFq+B" " k,؎-V,dZTZ[nTKj Wz 8yll[ 1TG:(eۍpv&/j N?̵wdg2ٟzXxMxEdo!fus137Edn Qj=He;e$,?yaf7 ;>㕨Kiv#ɝcmHt%Lᛯ{͢ocjfYr.w~1tne{XeKRq!Ǡ4J?]ԂuTCv~rV<1sH^A5{~7|33{ֲeI?,NZPI2D=$m/I MľF|Z V`d'"d =xB>jQgiQNҐ 6aNnC8M"bcۮf9kvAad! ^BpB;Ѯ+_8>0zJvv2bd6%%CN6Ƴh/QIb"gV}chF@*g88.!E;ǴE8㙉~h@fGh,I"7'll6Las#&5JA.^%)Q'f(-عk V Iƕdf׺@r!"#]F:1\,<QoIǩfsOTg;NwyOy@'>#< s٧N O2 Jя+K*&T 2zяECі&(= (90e0b =jKI&fɀM4'5dg@-1T`@DWq_F=sЧ,szU^`Q~[_ kXq4Ub7T#H@}n`Aq@-!57ҪO.HE-|\9v{ElJ;w-nbX@#G< x$)KcE?>pBIւsUF?ZUyB?LW~j-I+\5=s ݱH$5)|w&T-bT'.q*9U"0 q|;\%IBr*mX5,Cn?Λ^}ZC?c*x1sxxm,`71 ?+@nB b6$ƌA;hݧ1h3|AC?Sx \/xsFp湃3k\dYnځPUGVY[p> wĥưU2TpBL}Dհs[+8nu"55 o<_&@TF <cf8nuDŽ^E?pC:>8Lb 7sMޙӥ;Y]~!2,I8VR0 V-#J8є T#UCIɓ(S\ɲ˗0!za(TAP#LZ2@Td)ӧPJJ3}:t#*8#֢aEêhӪ]˶VD`\wi0h È+^,^qwkϦ@27NӨSd4 *e-.< [ n6ag}9fVLn8سO=bUiۨ\)_2`)*c0@]pxNP,$@b'Vhfv ($h(,0(4h8<@[KA7d+V)9IRVjUtevYN9RRm&y^NSfHmfSI饟. =")9(Aږ2F) ϧ!iO?,Ijzԩv^0N%?L+IJ)J$Bd0)Q-] ˚xz&0L F0IB4 >P+P=O{{ns=ŧ[(ݛILoAR o;ړOH4q&,9/{jO>t\1?Fj猱ԯ?S,}*Ҟrʹ@C>ms\oϯ\vnrnl DlٳO3sw*[5ڞTolqV;zO.lk;źK};ظrNYcˠ絲gÞr;{=.&%oҧ=ƙ};҄MlbJ?A;b/X"!EQ xARa1 NhƔM W1Z?'5Nݫ"0Ck^/9aHt}Tls6A e1ucVFqv󊨰^u|: n|}d*UyjU~ETSZb\"W֩5dj[V`UEr*QQռ|: ɀ   @`c!KR] f7 Ci>+@ SuzS8@j+ۈd $h ,iֿ鑸-c+ oˎt ;[v$ߕHxoZZ 򯼚p.WM\K]We{궻x# ͬy^6AiHL1"ԴQl af ؽAuA7\M*LGbK>7"ER5^@LȺ̀ab&'ص8$GӋcqʒk3_BUcd$@p2c,oaYTzۛ}IcZ{#nvp]gVɜk--gab5pH" @G@2 V@3f(2`sn PQ ֚t.#tcYVZkU15LϮvWBȆk]Y(_P Fw"^wn7fpaU۳N]ĶxiYŭ0te<"y'w^|X4a L\/sY~yL$1M}Y2޹ˋiWAq>#\i/r݂94y=s<"m7SŸsGdP/I vlw14cnݸjtEowk@ {p;[1uM*ylޞ__ثai o.Ve-  ܦtYOؔez֫ԮҼbX!BYX*oq 뎮N_>=Tm[{WW%f%`o^b[Va)wvqiuO%``pu'qHp6,'aSnWVUZ҇~Gfb)v}W~1t6Fl9fuG'tws07h"vdOdKfpXVeMu@Xe̗%$v&xd0x|{gQMf"fwx(g qOr~jhhRbVWk]fw%uiC;9 wwKvkFjrjRgx|'kYukk"gUyvȇ$mg{?nmT)xlfzXm8GUyr#Wxn,hDRQ}&3"ghHGp-S}e'wڷ!paH((#Gsexhct/n/7F7i~ %=Wqnt@h8s"yRu|%QtYe`v-XOO'׏h-Uafx 9#qtGxOpQQwh%VhV_Y"ȓهxחo2 fymY2QhѸոؗz藊QW'Z2{Y{Y))XX9jwd700)yɒrYUx%/IٍV_8j&kBs$ˆ~YXxDdv[I'JɊ HgTIk)QهS鐌w`d@0 Y#x[h-ͅ-$9dٜQ%vbɃ؛e%csPIN/ٟSȆV[yix*\^M ;9gHhjkb' vQv$aɇ~FyYhwhmءhz9x8>P{XG_khjW)ƤjȚҊs-(z\:ņb_勔iӈ~SԘzy|V|yUHpgGHgɢt9Jo-Dz~@ɉe9]ٞ"Ly"HvtNiAJZZ"V>'ّP.r,s)>MIy֊-Z T_6:EJ'rh9lW Q,Z' •[Zyh:cwozd[:"JN#uoɖڞesu !)٘z{ٲ (Jꌑ׌2ۧ!g!YwQG;Rk[Ij_S~)S7%[A Zi ,s ;:z/AHX}{lKOYsGqӪSw9[7z,d zU".zufnH C؅fG,Vud 2ZhېOjڙwxkBjkg{d[;ho+V:biMzxȉ(UjhJo zÆImzoꦭ{#̸VҨL>9+m: L/en1$l#č-;ga |]ڮN[U {iR(j1duz!rPQx^欹;⭩ʺۭ(t\rj@GϪg,6#\œ8 +$^<`\uéah*|D:%6l+:<버 6[8{̋/<L7۳) ̲ rGXK |MkX!ôiY(VzDL!kElTEeK[ p,k'i?5e:kŻai giIۀ `\<УsY<ѱV8Dƹ8k a; =~{uv A(t |ǘȈԺ[A+B= I=Ӻ*a[Sʬ9jф {\Mʙb{Ӹi֊>+}{78\ۿ [=h_Jazg#Y՝U0jYwPU̼ɖa"H<Ќ̓ڿ,,̵ ۾=92\+ǃ=ɠlHdϬJ{vx"/1މ-ƛ(bl3m!|k-_ ]5}!*:ȉ2ȹb| ݋=[kV^?J"ˍj %GT-lóm»-9L*ڊ*4lPHJHlOˍ㭙-Ս7Dԗľz 9N]!" ?"m.vX{|Yq\" ctVJMwn7Mlߎ~Y)rk`'jȿ!\xOClZ:<>!>@]}WnnQNދy+LY~".Rd,)R&Nl5 p,k#.ޭ ᱾gюp<野,I2>y̼N~C~]l_ >4?"O.Er">|*^滛~N..2퇬fR*&>.m V~XJ{ݞߞ;y }ύ">_]6+N'f}I&6O[𣏮"OtȪ$.]Rΐ-e"9_{>o )KO[ *[9N)j'B̟$R6^>)C$XA$dHpSC%F\8E5nC!vRI$Qdْ˄&ar )sJ7uԘM}~ rhQIu T)B>JjҨ,^]ZŬ_ ` 7v+˞M;Эĸ't0 \/!HtSJ][ļ"'ܐdc[ Rs\nd=z]ӑeL?ۤFtag Z oxp'_!uL{L7\H陫sW3n=<{Фۏ9dۭ3(jt?~ B3' ;P8ϟk: wTlC\Q8-6#o.sA:; rH&*,.#1K LlM܄097b:3=3;g=)C@;OuQHJl˿wTGܺtˬASKD G UH}u4U1. TrVg[M-\Q*GfMd XpOSp.\3JlX76}o\v3?x5vJ7S\ ǽ)Oh`U%6R!j6dԵ\ROw axy)e\edƘ%OYU\^>9T$eJ+$ U$Ty' Dk R34kOBh>;vyl2++NFhƘ=JZ%4` UV<~~6B"'/h nYoP_Z% |UkP[|o-O r{˕\e3zuc8GsaC>-4 wWgki~!_7 f1c=i_Ь$pBB\d+ei\ӖqlpBWzm,tRZM7~RAC/q J iķ-#VP *ėibX$aS@+1-vku)r7 cTjX| "=FW㨺7+qx<\l${=-b#HN6HYk .DP ҏU+-)Mf,Aŝ1$\Jc,)qq tFH+J#J HCu֫(\'N)PG|)&oBȶ({HC\(=$T")N#3ѢK4c*Y%htcR]ֵЃ|OqVĮ\fK7LИ&V̙empRBfuM#:IVrV6rdhdP޳j (jbm-Ib&GN mÔOCyŇΉb˫\m"0 pP$u) wS9vDvnx+b%,ļaa'+%nw[7[вW}.z \$ y .8dz/Es9ڤk#lҰzݪxě(1f^\_l/0:OMj5~&(l1Op4on`N.7aPWa[<9]q1f,1^vK9\wW:_ea)mq{ l)V!^$'cH|Ӝ)  }ly-UZ;~:A3y$eF9nyD4ff*`BkJc>0x)]Ȳ/]{-K{Ð4 `|Vΰ9%hIe$|%H[:Cmssw@#$Giv+p\CW'܎+x !,I7VQ8*\P 3jȱǏ CIɓiZ)KDA`-&TBϟ@ JTaZJxMM 9DѫXjZGr !+ȸ)ó۷pʵy4V9c{=x NK#pSVBeˆRҘӨSUL髵,Rӕ\he AӸsYX'`D^μУKNسkνËOӫ_Ͼ˟OMdǿPngHru"ti j=QIH!f2$!mPY yB&*Ds"Q'"}81_ь1ϊ͵ ɡH.giM*=n2c?\j)OOB\3T"CԳ'aG&)Bu#G}>'a?üQwr&S0Sf}Av g? Ϩ s=& eO> *j0*zlB&I<裎Гi,)An ox?m?['C8<@:߭Yh p&to3q>΋.F\^\"291b0Lo̱#?c. C oE(~O켤<3*)FCWmdt2l;Vc>St<-?nj =kG}_іZ8I6 )>޲Y&ǒ~&sǽ,}==-WM%<+ΩԨ yު]v<yĺy{_ üCAn;z/i'%ţ/.4ݸ_]Ѫ?LuwG<N c;W= aA2S`ղT;ESpY[1[s:X  Sr2eqeG?D85~M}oK0sZ$UE/J:>w~+Z 3• ʈ.L^ <|x*lJ(#Q P)юiP$4ܩG:* '92]ғ(;;BO޸eDn,嗧R9rЎ( 2&uSyS&>ACüN3-kr#6+Mo/%iivED:iwA<]cS'bMRG!5 Zy:ӟdh$MSAa MhAPS %AM:P^JK!G1h9@i@7E@N1p$Cif$VVf0m;6U*:K A̓&bHR:$RAw*[gG ]i*M*)QiCuBиն4Y) ˞pяW;K-6Btl+ ^^zXN@-.AV4dw[.|tňY򵶊i:"dtiZmh`UնE,q7[ء7ٮ06TQ]~_R-Vki;f2m].:- S`x}ˇ#,ĦӣbiB]Ldq0]\$oT9l\X 1=N;DŽzb_v=iBd0N @`U=sߌud}2W*`*5sV&5`+gٮx}s࿺WO2,@9V>'meˋFG2p,k@HB-W[|_?~kk x4B~]ZW7qe?7!n6 m.e]i" B V4J6<{ؤN^L2WM#FsWsvoNtLg9ioQ{i _x˶ e*O>i! (:"yB~hy"y.Jq?zW<3Oq+z5gG}=C/RT997pqeLk?J163VYQu.Ӊl,~y9*Dܐyw[4VאpO헿ӺmںHس5/tu ֹ<".lfvwn\V=QpS\%#漆|^+ v:%{;''sp_ozĉ(XnO#cAs5{+tE;f7?Vt%ŀ=&'3G&IFd u%eWuU~=eT@e_fHK%fg%]mfwsv]B^gnEзwhyu{~̷hzO~QT%ywYhkllij6-w!kVzF[@zSY|mwl}ao7zі{Gg&m]f gw Q|wk|Dhfn_ob艱vof}<聺}v=hUG`pvOwWqxe0br"7S6pǁGrs+qh2ǍAVCF&(*D@[Gtzt7h7u/XxJx~uuL;o?fM86cjh\!jv赊7x~sDՆ%iq{|Helgxycxzhi(.9}g_OGTX\{։PY\'?~}GHwn([8+Y~]~x_i9kow:XMyǘǔ(q#Ur䘁RIs\tss{فyR渍yRYfsdfe&(o.8\e"WlhUcgVwuwgHyWy|ؖ]Ya(o{顇g(5yk7i<>Aj8Y4jV>)AvXXFvwȎߦdY镀y z]Jsxy2nY}ɢwz]xii!(:( >hB׋p, 99I/ٌ!~-c9y<$(NWzYeڀg !Bڕ8 u5mJiʧkZJhXÏ6Řw'Hu9AY|J ;9WYmD9&"֢U(Wrʇ\"x= ZSiFj]<)I͚֡X٠K ćz lڇנlj~ɭ*|B|)扅٧"aNؒbISYG@j)Z\~4尽;ai"qu oq:Y:)yj{j){i%\-1K[35 ˚R0B9;:{e8b14X-`ZoιZjA(z]ڙo֝X>:n8뉣'ʑcfHnz=J mJ뚡j*6I۷'k$: lJXZJK(1VSKwfK^V[{:k7n;XoA'Y h_;DqAkE{mHqץ&r=+?ȫ۪h˲ s/k7+zѻ{Kfk'#kK뚨wx[G{ ` ٭vYUAZ)YQL،gL/͇e챻~ٻTDp HŤr)# l붴[Z s,6|ʮGCɪ, ̽,SmIE,O=Q-L4MoYZ\9Ve$&fxF Ԭw}z=:mܞ҅=uk#40zqkΛmYZ $qgUKܸ[jj˥'Xܹ=Km:YdfŒ ѳ\{K#̻D#ҁm +Ӽ D'Y>m}c_[KM]}| NaMWcgg] k ׯ oʹ,QX̡}|X+n][;]ݳ['|Ym#WΟᎍڔ+ޔ}KjFڈvHeh۲WۜУˉ=8n'h7U=jEn-yYKф]v} 8]Wcng=P=[8\<酑;J߄*>k@KBȪָLZqM+וΈ^J+=/=^r'MGW{ڂ+ϮNEI<%WQ!Xuh.k O䀎)v3z -T+^w{p.Ao{iƥ?=>Ҷ9'Oθ>.G/I+OSOKϗ W߬U?C[e:ɞf@=>׸Ƭ2 &_?j[l@z|񟎓Ns=,޸X/b^dNzo=96΢s~jYy%/JѮ9hg/o13Oo蝌?On൯oa/x_M$XAܴC%NXqaC -ncAEZ H)UexY>ӒZSR)F n& U 5ןՎexcj66PtS҈r!?iWrJ1@\Ɋ2xm :TX̸+bKu]A:uo$IݴM nQw ;%{m'_/ҢR`]ؿj|xK73B"P`r 礳N:$K& $ .%/LZ(c(k: Kƀ-%"ߋI +* G4<ʨ-ԾtEL2P#z*L<3ύs= A[\ACI3T !QJ!L;L?pDPOIR#U.bD>1cʪ՘•/:]}' ʋQKe$TK-::f۱cJvUP]]h4pŝ^|HtRu7$غϱM\5_k6̆4.c n>ˆ/blLE(SPӓL7f\TbaeKH^MV15ip JLWI)9%5+V=;7d͵0̿aM8X=|S;gC-̅KUiϏ=FtOG2)fD_+v۽{Y֦ Z^g3خ ec{le:[Wݝ5Jml|zr-37mTq]í ށ^[>kf)P%gCI"/Pgi8 eqtQWO6H.FcD^ gG)LB)ڕ*3C6M~"䜲%rme#"dI;"ǚ5pVR).ebm~pK#@xCIqc\g!ȍ1] %!HEry I0Rl%1@r3'JJs4e~GJ)^yt`Ex=WLlvaE L[ 7o{Yl>zvMp'LP&}^akRHWvLUl`)f螸T|Ì1 i:Ͼ4 nV2hyCFl,;ذu0* Mx3Mg!,I7VkRa@Zժ%k#JH@<բXCIɓ(S\ɲ˗0RPԂ2 B!0f$Z)X0<ɴӧPJu *OZ@$!MϘ Q$!3 N]˶۷p#VZɃO{<gy n@z>Z2 @UE(Vhfv ($h(,0(4h80&!8JB>eIF$~OyRME! YɝRO\beđD_dfcF ӛY$(کgR  噛Dj)cCOD:)iLlڒ(*QkDRhH8!Q0DO=u*CQ.*E[F 0&E ѭ/!{.yNd^>=3 >j&.0DsO d=jڰ? ? 3lO>Ó&3ȓ&D\ glRHSp;FO>R1F3KNBco+D p '>#oJO;i:vggj;<0;2,;?fg r?-4;LLu(W&LMO8j<~SOX+?\lȓ5F DxC:I3,8Qj|ij{ɛ0pˬ;ʫ̮:iCi͟Î몛m]>j;^$9.kT6F55,R dU=i}*r%;1K=j^1zZGBUyOT0H@X 0`ȷ70bPB-܃}R7C:]η[({\yҳRn>m?7}ݧOWZv_CWԓ~Rߘn1hkHm}s{oUYU3DyckǑk\l0Yn[ b٭gFTϭu3Y7D-]~W:sG. yRpc ]+d$ex7q)wҒjbZ;Fq,{M#IbXfgVEFv_cׂ dl9y7xbWMYW\f.dx-dWTW9x_qbe(n+wRY3B|^HAǗ{Pq ;&yggysp8 N{7mHwz6TՈhiV((HhRX%&rkG=uT@||}MkZRK_*l%llIOKh[5~fX~ˇ@Wsg{2qV"H(7e}Hnsr8VȊ'I" XEs(qؗ/_(p6n,hCkU&qErH87:7;%ʨa׎N7q0h"Dws9sd!9kZ%Ԉ Ix!u!v:O5cH `ZǏ^i[v]w-iYAY_gh*FȆ a&;$xZzx wyȇlIߢZcDoًFUX~{iNEYz{n9ggz {G"jfSgekLg(Xe@a5}}oZ}W֙?hy^Y w!=FR8hy}`H@P чV9wl5ϹBp ɎYch:#0Q8Y '*/ݕbF '#c\T*FGwIvbxȡ>Y_ !\xhYO֛I9W٢)ojP#xoBryo*9_fx"ɘVJRmUw5Ql QijkzNJ'"k\e#:eԧ*}gyMʚI|mUI7 9 Ԗj*c9.~)wı1ZuRʗ%Z'7,޹*opʟ:wt xt\"ɋUf'J&]aNJ+홧]ꬼjo/&q;vqiޚ"5 Ժt$պ <)G)$Z9vo'Gf-+JuTb5:f}ʩM͹ӱ/9;DJġ]֖%P Rfj&<]jjM"_:ꙏY5hdʵ z)&V;{ g;JOEQϊI˨z_9Z*4~wkr$8y_!" ˯Q͹ ($ȬVxj9ڠݺXm{r 쉻'ʠëu?Kz>_̪t& !\ۻ=:ݖv+Rl;-˺پ{_7c9!oMB'X욡XZc{!b +K W{gRpUkh/§(Zr TtK(~⶷~;7V_θ蹪ѩ "KN ŢMLEKyؾXl^NTk>`t`{\4l{&Ҭ}b-=ٿڈ:7lPöit+*^N?(c-{ކvr!^m0^wތ /.Qu Ε5 5o^"eIֳ)Q!zqnuqo*__> Zhg˼!O9E*֑xv >k\L[ yjgMbDO9?¥vq6#XA .dp`C%NXB!>ѣČ9~$qdI)!N0`P@ @̈!nyrOH К fT?F P%EK NLⲣ3MO/ uT6ըSR/4Xu^-KY'"PkEuLM XzWb"dw5fm;B&-KZ(h"@d4R٬PQ-,ˀ@kjKǍ[3 zjkMv=7ףʂllM@Kσފ3붤{1uSOI(>K[eN;6M-MT R(=;c=`%0:(1TvU/pe'H=„N("q†- ]4JӞACjU x̑FA<;&Unn רiެKެ#vr "s-M 0ZVt* 24=9vqClBaBTQFJ7}luoV5uxZ"eOi}wQ헟$'?UH$zjFfjҢ4t|?Aͬp%e) ^W]G` H+_l .ֺ)`BK3tIdh;F810!\9dwP%&6C**cl]^3݆jD Π#Y`i"ц7%>kdg"e=@xOjhéu~5k^Ahc菵r&2J MշYmrwL;ˠm$Yd>qj"on4_dXt7 Yr&54BH0u.i:ikZ,w. 1N4_5bz|:MM(zZu{zG( Νq B.9 M9 JTEQC*ϣ0I1YK4U-ݕ yk8J(MgBhDLbEE^Wعԅ,W?ŐSNKۡ 0@)4)VY\/ qЛPQDu4Jw֓%S4.k_96Jg3iM񩌭&3H2'Zl&Vv\{xI˯ɬ:VWRB{NFͺPH"rJӪ]"mեKH0\it\m{kfu\[yiv}x2;-ޑfRTuzhUSxn@ Zk o祔|=n5JQDA cˉ3 uq؝5pʦi=uaQE¤Zv] NtU*F. P38wk Q,QNscE\_q1P^nVdyl[q"'=~ҳJmMZEϘqO$')M~2hJTqsYo6;ohlmBJ̵;[*Ӝ+gr {9͢hE6vIa]I2vin5gFDN +?O^?oFaooOdIYi v?u1Np_AWMkQw8[C{lRཧ$+N*QV5tΪtf3N1_f_E6ۊ  WqU ^Jc:A,8%iLLKID>~Ehэ B͐64Z@]xQDX ."klq ;k]kg-=z1)dܴ#؋Yܥ.Ax큟YY{oSulv'r߿gN`^׷S `~dz%ng+/`Q~u:&_ߟ?S ӿ ÿ @&є k1L@0Z@Q^j>& 2&{xt6Ĉ  A6AshZ AA%L$BڀxH@OC)@  "l 1| 2l=$AK&@+7 g B 4,4D#CCC`Êr+B@L( ,<h hr V0 AxC0 "h9Hŋ@ -@ Ɠ(S\ɲ˗0cʜI&FPhɤ*R& N26 9T20xJXjʵWnve?'&ZWtpdx˷ŰY EM֒`L.  0 @ x˹Ϡ6x N YYcZ$'Z2#Pk'^mk)4 k7qf.oK1VS@5 JKVXY1Ox ~ԊLŁa,|VhJp!Ha,jBRĠ<_,:,fh8<@)DiH&L6PF)TViXf\v`fo\8eՙY!Vpz&|uwXٞ |$h_vw(w*Ӣ{5IKep,uէdjWjhfiO?PN?+FZOl",jR?XĬR[,EISEV4LQ{Яyw ӸnE^4J -J&0+\Mԯkp.ZEҩ.D,3=l= < O=ð)O>$l*GV4.){>sP?NԉtO><ÀMQ>ub}нl]v= O; +Onk< 3>R3???;6,̸A8|コ,c5E?9;[c:x+3w֬>&>b=\?&N/7kβãkΝB֬ 0bAmT0w#Oטh֩rS#, GÒЧ?ҋi+7&-bf:lX Yhb :$x$7( wkUn׋ żlYR$1bbEXqLVW񊜋'>`=CDe!U3dD`L~{M\m ٰ@+YSpaDszp:d Wb=͍҃nꨑKkc˽cPG\=r,4 ^/uYp'k-U5}r YHCF}lj- [RCL}c[cކ*<`/l/(i|+M&UUGu X*Mʙɬ,AWd 5U3U]фWu&w_T 6&aK-%cBM%eپz06΂}hUԺ*1-W`(Vpzm׮Bkq[\7)rCu\<w*.Eb%=w "5H LCQ/K @]V?饑}؞֔JA"P`!uK.'jVPUB B` D"+6* y!21H#KFF~a1q4˔v.'9&2-e#d.p yl't˫10h\䊔|^2\ O/uo{9DPvp4D%9zɰiRC3>/S2^#!?.qz#k ,i:m`HaJBHVbY.00Cڬl# D6w/]]&NkUqM{PѶކ[wf197dtfF^o8l{׾Qa:w酰E/e3"&rK7WAZ3;!Ϭ&7.vvлr>gihw_IvwkwiRYT<^5{xxv(FFhx{5\!V e~OzؐV_H{Q Xe^tԨ8X~ƙ'fI-؎ɘ~w@F~vH '^WT_0ĈgYgUi~.ebၶXHrjIht(Y5w)Xۙo1yq>wsEb:V/9g0Aۅ(1 {߉ـ C9eٜ ]jj^_t+b#ǐ21c]ѡ_t((xZ*i9$ڠ3.3ʝ&ssxz= )auews(h~P9yϙtwLZٞ™5`(V]JY"6`d{*F$꧙t5ŧQLW)~:]SRpZzpWY#{IH9V㉟F&#ǦazI7eY5ʑXHJ;:f0(G2Bɠ4)V/2⥭;עʚ]3٬Nj[ꥶʅ jevjZ)vyŇ*&kxz= hDq*?I2a ˣ+Z? cE:Y#4|+ث8jSthya(KZq6!8K6yfZh >Ko7('V|ɚ} )z˕YX!":cʵ,q`\t;✯`7XEw$˫X{+6im$檫*ҚJϺʭG؟X׸ ٮngxw*+v&n:D񦪽,+Yۺ**zڱ:겢jZaʫk.k>@Jz*GZy|[Q* g#+3Vs,!gHkJ~+HZkj̩_{.^%jYސ@a)΃.qmꫭyJegN,m-(Kqld;AG q?1pxa)$*Ij>4%~unl~Գ. &럮[ԅ\m_>OY&F ^ڞ_ddI;SöM|Ύ}t kU<lmn[<L`I_npN oy@ }Wz቎١ $pA °@C@@j$LR{fTaŎ鏨@ Ӗ" hȠSn]VڪX0/VYīG:\8`}jV,2aYϦMrW_Z!\ 8FHÐ=PB""1#zQN룱P|r+Fdht =1 slpAQ'nQm)ӄ0 M9"T >ЀtBRQ@1"3\dNp,VTs2blO,!lԪҾNn\\s+M﷌wv=HR`-ub_CvЖ%FK3U䃷E8c'w$}SwQE/guAVN ]7=qZMHlbDLTQpQ{6:M&SM4QM) ps4<,đ;qWתqDf!yn';k0_d vK>x"2E}4~p!8y̿? LvS9! I)Iw0XD:2ALv0 hC. Hf<|a|#1F>CB*h`u#a)X5Aj3ZEnE ;H!]?T(W:iQcOH>fi[ۙI?r0I"_e9E j$HG$38-j{HNd P4nRlQl3Ϥ\IdM8X0.Y2$Ң+ȼaSK FT+2A2D9Tcc8%)J3]FqB_8yrj@lc(+_@-i6qS a&'"'cࡦBrO!C+?ZesC{ψ mH)N>t2fBWJ!Lt%҃>YD^Gu*Q:P?3pFHD9eNQFtSYH0ysof&I>ҭkR+Y8WnpkmŽ}*X,eԧV2e]QXMtBd-ab]N4o5Lb,sJf0}%rCύ&g4 Cբ*_i^)Ԥ KQga)C/(Yۗݗ-'O }U)[`&^*2upq:^enK*>L`!Ejh=+#jo _ƯpZWHaDd|"\%&OEk`e]yJY#aOiɱC%&CJ9|6xME[ZdzM.g;/ -޳FrHPI,^vU|~zZQ> Mkۮ36WF$R#eV .,E]l~l¿%-IRG]ORٞ6/& vEMƈ}]նRug՝᳣ܸg7Puy.%f>R!5BHaF,JǏgCyɽr-9'T0~( m:qBt0Q@Zzi#]e0Z@A ;WC1=압z|ͩTsDPd^dvԍN@^X_l&:4~{t(Hq{I4Wg;@0 k99-<[ !,I7V9O@-ki@@)#J8T!))Iɓ(S\ɲ˗0cF^i% L4IUɴӧPJuZIR& +e`?'&]˶۷^.Ŕ"d/7e]̸ab=DW&z0}3ꔘj :d ȨS^R.VVTMC!L̺ߐ]%+mJpFУҒuu(#&`:Yf2>0B+SJ_>% ãIȧ +Rtހh& 6F(Vhfv ($h(,8&)0b6D#; XRɒ@HFRؤJK&I`=)(Q)%{ZJ%_э QId:Ǧ?j2Hoۛs*Duɟ;BcOdh?5П}ƴg=i`?H6 LBI.T*h*iҨi-+JѬRZ"-ث;ƣ>@;Nn2= Q:䃭 nr+;ѹ2 @z;LL09(<QBN>S0B.o\OȆ= ﺪ0no;Ҏl*6*(< O'A 3/]ҟ2HiǐxȮ ?)3BN?s=Muۓc'j?/Ǽm.̖q Qb.,e Y$QlF1Rj*k3c7@EHmokIVJfJḊA큌\j2d-q*v"2qO\ew]fS]eҤ!-" y%]3T%Inikvoo(.ɺ iX`zIYS@~4TAu-ZN,'ªX*,^P_4~4;eX7<]$!jke-g){pqt\'¾-p<6.Y!{np'-7V3\Ւ 4i&КAg Yl|ϴn{𔿦b@WcHKh_0YYpLZk0tZBK$yn#<Y>^`dxjű:t5[kWnuV!Dݷk̚f*m=^҂VIj]#!uݽ3MetnvpzxsY^t ~X\c=4;r9yHnr/UzoÙDs8/PY͓%8z"8_V/%7Ín{nqQjo~˘|8շ}mv`xؓN4_/i"[~"2ݗj#\?>3/<޵f/I7d[9QC#g4̣t6wi/l37xy6@0w̧4q]wZUF#ru\[,rDPCdggVp`~q6\v#ihGWvp&Spi{f(oX7  剋tkYmu\|Sa$\bxy)HX]WQ(}7ȋu'svb(hr N*i1((08@0$B)NwA8P҄&z(V|8Ux 8%68sփxGh ~hU'wwr,pqHT5HdÈm+&9x`Ԙlx\(y2|4 YnZzWf}%iؖpvxh"d46稁Ł鸕$#eg(1yYtT֏){&#"AN _ ֐XZh_gaNxkm(p('q6I]专YYmcP)>iQLXEY UIꙊ y9`9zވx UXi+p)rIxeXs—(ThAب,%旁%Y&^Gع+8:M~4N!)9Q Ii]x(g:JoX9B f E+-ɝ [][_ :m:I<ɝU 5^ZOh L`ٔA&)cU`П$w 9h^Ĩy<Ʃ*AF%%Jgw"HG6_Ip.H\I~7JS ىCɚcIIDڸEʖbʛVj{r*GDf-cegꟵHyzɹ9Y9tIɞդyjinڭ\6, zSjJ/1+ t5  w;kwZyqz;ꫫS2U9zT)(>:@<ʵJH:#۲ rY}Y" n:83F _{˕ rp|J۝2rj%ihkLY9kʱq!k*|,˷.{@ 8aٳw)K껥ʻ*HEdud@ [*"ৃA%'IZUQe*"tq}Eyqx2|6'{ 0, "DߧIHNj"\ }v (|y#Q ugz}ZM!Bsjky$+0!ȻIv) ˜F: j0+4 U,jX5f¼ ,VKJ{Č`+W|Ǻྕ~iƆ^K+ǹ}e^ ,lɣ~JE#sPkR9Ȗe ; tkU2ióʎq˸,|x]߻KZf|d|VLTlӼxX߼Z, lL[v̘vuǏU{~Lɥ]cfol i5W&AK cӑ,"~1y燋$B|]}pTJ%hZL2a-+3 NINn|J7lNZnʽݿYYc6&~*O6Q}cYLl2ݎQo/הn^º];G®G-.L( ~I9 qK'-Z .=oo?J =!mo)}!+O.l PHlgQAM6'|tǜ&]ps/+TQE_V{PO&y%X8@^/D(S䘳`! 2X(p /̐[[pDQ<kB6 ˽X4żJT0sD6T4HwT>{;qɂ 3+4F qlR=/D-ϛnAګz43S(!슜Ϻք39 J-L C=t6GA2-RJ}BR&], !,I7V)@Z=@ Z #JHb--%Jx1Ɗ CIɓ(S\ɲ˗䜂U*I>S ̄^i% PD\ʴӧP> (bJٳhR֒`VD`VÈ'j͓XBrBSNzeGD͜=+Miq XY_&ak}ߥN5?i;!sKqs0Oj(Fjd? r $= 0'>w;mDj-0spG3jK7v` whôφѲf-=A,kjR6b;Hs-ca_ԝ.R~|cs:pD~:~y>99u9 ͛pnR?dl1+ZowD?wl;΢ڧ1j`k^10I ^{?zm{!K;ؑntN"?#`aE(jPCMA0 _⑐zn˜1PZ1à Jg"bH쑐t$03pK!Eˍ]{g3-֐T= 8)MThi1aKu7\B"2aE-_dѯ~r>ը} `Ѫ>!acr/vm\>:]&_(G)Ird^.[tUv͘G*IlD%##)P7D`†I%$$rd`r:4dpǑZלD?Y rɡ(I챏zt%3H$ϓꧠHR=G#ՒF{STTA-5 HӐtL+eRndMi7yL1jֈԦ2URԪZDPuTwzU4SB՟U:%I˄ִiEj+XZ%U1Y\tWզcek_JWu0р`er$ebؒGERPPֲi#dYVv$haf5 TJT{.6!QEZ@.tkh$Qp0\Ըo;\פ*YnD] X׹ͮV[0Ectkv UyYr[]coR\|W 2 vRQ S2Ӿ7oY*Zl6_5U,#j`zbu&nqTR<5 VPRWW縰^:+[$~a.$2H{6z-Kib\*rHPe'ˀk{3W"!3]wI\c8ONx~͐r*g+Iv hD4(Cls/4̉ݒ`.-z|^tD\'+y^u][@&aFy h7;g{m.[ּ4s}pf?TWdYwwԠ-*XpNlSZ^/>'džnmx">>;fѓد|Be8 Ok[J'uaʧ=.q۟Ogcԯ>skϺ}8I?ؙ''M>?^N4p)gwwV{%wqNrx‡wpfy!*8Kqsb wyXq xw%C#7qvWg*g Sp*Tgzk怍26zeVsns($*{zU~FkQX}օٗ~}dVwS~}l؆৆fxi8Wk7n''eon\KDŽkW1d'Sxxayy"i}GzH+h/rÇqXBr<mH'G)H&W8zℴ:AxBy48IHF؊<884%@g{҈{ŇkZ(P$M1thjlxuǎivHhal8x8}F7d6 ah'A+㐬W՘rHKXoDxl(b 8xrh$ȂGA(5 iV3q-&^OXc9I)|U&Tc>H{26Hy)N`E(UiNe d_֕ZǏS'g&wI'χiׇCag9ݨ|W٘nNj84QyS)nGZĉVـșyM곒n,ȍy2˘4UىxK\VǚӂÌLɖy-b|fI㨛NؐJ|ɁIvi~uIbz9ڏuXjdy/97H|)f` 7)z:aީٞvA)@Δ/,yK:qB893=ɉbTG;zXÈ[9v8-JORx`JJ9Cn%_I*~* jy k>:irspuZuɇy u{ڎwc}mZ*ck zm|ny1ٙ8LQI[ g#j!J˩y(A٪yTlX8(WoÊB8'*~q3%'1Znƫ Hx馓*P:W~(jC v:a@NzeaE`a` z!U{Тw  !K&"/{+%. ɺ '" ptfbi@^@гGQ _U2\1s ZX!QyU`? )i!k˶#ۮ R;i|"{˷^ hnRK&5['FA+P@pKJ';p+[+kc / ŭݚZ[|gZ6e]m6uyO׶g+eGt4{Q[緅kT۰ʽWGhThyt \렛u_P(4^8n֝&s<~-#e߄&K+GMޕl$vh谋身Wb9..sF]ӛnLn^n^gG.]7]p7ma>ԶN!&N٭njN53kjXs.uޒ#qz^a^O9P.?e[ FOo)!~͎."M'A)E;^־Xhw(%>@]?TP S_%e/_>G{TO?mOd/ovbnRlRy>V4|6lg:6͇[]؃l /phx5}o(Oڎ_>/+?K(OROU2Xe!@b|t.]@(0O QK A$dC%NXE2lрM 0cō9~ȁ%OΤYM:p41HŌh2'Ý.}})ˣQN*Gx2(ԪnʺeQeELt1Lqr}x['Trݓ~-0_\ٲúm^F9fΡESt7Ofzfj/î)!,I7Vժ%kZ)Z #JHq"*1w1#CIɓ(S\ɲ˗0ւB`B9`@&?ZСE}*]ʴӧPƦW(W zٳhӪ((6VuI )Ɂ0o LaUԂ_,Uk;0V9}+_n|ϠMrc\ y]s Mmg Z+6ie 2IP#fLXəُIjΚ&)Q?PfIgbYSJfDgKRf8 JHrFDgETh}ָH8iB~Jߨ)e)I: h**E&sf?03sϫ Ov)h(";>H$-<&裏:#O &ɢ&Tm; ?nz .HK09lO=:'&:̠F³0ñ?ofc,gԲs2SΙL#MvB#Y#u?*?CÛgV Y^wsYh‡eɤȞ ގC&Jgc};bC3cu$N,ߏi^y[7n';ww{|4|'O=Ryq?i~vށ=q(y#'K q"R@o>q;x%<Zd'(%$]F #Bxa᭘%/˫D8'%j+"IJ t,⇆X7-xb1/~( B}8lp\zCx(XE+!T[h ^./QP>.o\ĬPQq={20 (6*-l.R Df5c.E>)&I>qRi07ao64Ғ9o"si'r$=]b{EgKςB@YBЃ: J QH? ]IC+꓋'*(GaQ4%"#4IQҗtMR$5)Jz$#D4`axAEy+0թ@*K5( T !XeLg-ī`}jI QjBGkkBzTT;F> @C4X v~5S2G b'ò@,d#;TCȱfZUF% vbY;ؖ( 5[;˒7½5TmK:1*tQKe xWwizWeyw-;_FuZk6$CVUc%oC"?x$ ^0~[떬+J8WRE%l7K`jT*Y[ˮ8-gA+ϸ":c=|NȞ1c`m8%֎%n!j\#Srt._X$.( `j\h}7,<|N'ztЄsDym {2XD~~sd6vɳsU:~qe_ZFᖭ;$igPMiW;b\r{Ssi9؎fn-|{n>7zxpj\n!m߃pۓޔ(-q[T^7K\oa889j,sc\6fomnQX;x-cwI}kFQ.zlg;_^tG|W?Otow]Jo:bxSw_E]e@:lmm~q|7}ɉ7y|f_ۿ??'$'wgR8zTv|&Qy6~,rOqrreGkUzw՗׷u灇u{b Xx}'}B{ȂP'|CAWt2m$|Vr&h}}GuV|fz ]i_'v+ ~N^h>Nghi$kHhmOo8ie^q%sUwoy{-؅tĵ~#z*A8~_$}uȈvjH({0B{1~{9؉]uu'u^(mT(|vwxqLhS~WvQ" 9wbx׋HxH{(lH8{wwژq؎%HK7XXWGusH۴HS8W|Il46}HG|_L'X9[hSzȐ 萗7ȑ1yʨy6)\[8,{QiIMKiHSSQ WYTYvO)U6_ L~X|hnǓ'1efؐLjuKH/^ XWj9SWc k W8$P|!xuYwyuvɌ}(HWȁm燯irgii ՕwF68)Pi|i˩)2(FIyHI%rm"՝)F8IRY%фڹ)8%LƉ 3~Iփy@Xfy:칠)ib+qkƅٞT*TM_'aiw-+ʔ/:p):`3Z"ʟ7jSre0 bJNho5R5v=J&bHH)W@`ub_&1DjWt#[]#)X9x!k::y N6X  'C*9_NZ<~ʃ #\udJvZXjy%:fgS@p(:YCQzws?oL SiS㊆ẛʆz皛@]R@I{3Mf$$4Ny%V 49kӄ" kK>{PAW P)y)u*kI,k[N!AWC[g&:7<%ZH&grxtȶz趴`گ8׉՘^Lk-( {V tM+# g}[=K+*۴E:T{% 2<j6Z8[|tP*ފ.:0 2*HfOHPA{wHk* sTj_&YqՏV KsZy˸Bc ,e: éuZ<5jŪ(сKїiw)ґB~[ Mcl+~ɂUgVJMZʴ\ҪˮZ L%KU~@`,֫|۵ݛݶ - S}M͢ѻRB"AK|ǥвY~0Է M ;-!K݂uݽiT-!}^-]=̌ـM Ѭ<!UɏT]^M=-޽KN&UWNRY·[N_M~Okm2.8"qI!m֍g ۤލvO 睰JB( YM#퍄ߝ,-`ΔpZ5n~%*.ʪ!'#>un1h$/~19#?9;ά{ڽzWk#wm # x5'•n^B#GZ]LROP_-oWY PO?d2n!,I7V@* DȰÇkja@XjRQJ- CIɓ(S\ɲ˗iPEL>¬EF,W ğe`*]ʴӧP:aUV2^UL'-kXhӪ]˶mC H3\0daX_Lߌ:%fċ?VjJѢĨCMՏxZ,LbFD(ͻoħ*p@CLnNXePrS )X4FFLO˟o2 (Ah߹.rP?g00nF(Vhfv ($h(,0(4h8 TS=H؏N"M)d[H2dM.jEԔ'Z TJK\KavԘ-9",i&Slfq40ՙҝxIv8IϢ-ڏCD ;DiC 6j>$iI"*ChB="hQSiCje$O:ԫsjbZʪ6Ь#}j*>tlCѾDl߮-IF[.C֢'n2%n>& D>㱺.f0ks0D乬P?@OC갛+ O=&oO>~9>#\H2L{qݕPO<R󲔆됰: }7H#O;r3Ч|o˟ cϰ>/?{!Ncun+'>e]C=vVQ yC <6 aW\,s0|` [F}$=_M =4c 8Ya*pCa Fr+ S$?#G@AP -" z$JTRF/ڔ>$C@Qm4K'-iR*&TP.]SL_JӚht©Mw !$OT!EQT.zjO_"UUu,ՔpE_Ij"5[:SZʽ"HgU&ZI §:5$B$j}.lgNx[F`R7slCY$-.xwRMk+>D7H";pWDQie>fn:6Ezӷ\!nbqQyΕ{w>wzz[s:KUOM>etz뗟OYC!ʿxzA7?D~Tцc{Wbm6%XmHm؀ǀ(vU~!}7vi7sC}_wꇂy+%tlp,(7F}7qZ"Gi=G{2y灹W}@w_4|X&|rS/|g'}TXiϗ|(s%ug8H:h~]u}`7`~Iu5fr8 kw7w~hSXn(w؀iXwshxxXFax!yyORth^1 zyq=hh;pHzzngCjizJjҙVUh퉜y I9Jiyxɉ鉨y#:UYw'Z/)*%*1:+Z#4yv7 ס >ږIi _թH:'a >(5Q:Ii⹟ wrdz|ɓniVb:ɐ jtm:ZQ:OzuM*etX:;IxWBڦ9!٢w+i%ŪJ( Y a'ڣkj a'ƜZZy ׹ ٬RZ{oڄqIꉭGڥ4bq~.^^} MӨG>X^| i<ь^Ʉߗ䢽Y1I+K/k,*4 6,)F3579;u~mĽE^OO܏NUhR>߄ &Z^b`.J8Rv=mYmsl,VN]7n"?qڜ0Q#"Tr>"* U-Xt 1 bs&9*; !>tPl(oI}Kɞex??) KV?rY [@5M!V&j)^FLeG_!i{x1!s8R+sT&T7_y!Tv,SBAhe/oJ1L!Q/}[/Z/!b/@E*( (&B*!,I7VQGrNPV#>@ xC0š?BPɓ(S\ɲ˗0cʜI&-YB1 c& N2TPE Z4鱦իXjʵʆJxE4(⏖J٪^˷ߓ kQlPd5PdܔA@"˹Ϡ6U`G`cBr")N8YCQ P/Eq64B#رSfat WnD%ճ_>oC9cֺy''Z,B+SN R\%.5tCH,Am$C`(,0(4h8<@)DiH&L6PF) f&TfY*a0r`(i ylɞ&)Yx雞砞 Cn衋hpLZ?gO>VUi>@j*Ij)DjAzR?2:0I ܦ+'&+ZҰ)O$mK8kIlWvgh׶k:㎗.A 3>N;=ī+:ę/ȣp*lJ\?'ÍL,h;0AA4*B+ >c><Ï?o8 4`|4bS&أ (Q3AWgXzhb7iϪ;ϰ Qjdٚ:9AǮ:B %ʣ&](O<-iAH:葺ms=mB;JzճuI 2_+`$$%D%Q~t\5J [TÚĤ@0[Y>7ͩdZ+Tg ׸*ծt j!li[ymR*1nv̚uYʕn#&e ]%qH.x$*b^ 5Q(vO )UҖRF5iEZ־1}-tF"ض ngդ>WNծV vPdun,M 6nJ 7(&j;w_QAo fR-E3:L~tx#m)h|WK'g_n3KMeNg£riA#Ӿ{i=⺺S=3୊X xC TdO\jr MmQޞ4MnH돿}%liHfQ2lbɗv-m~^H{wpuId9F á܇huWk9"Z巛jB%Moj7܍67m,61s~t=>믫izk5:wgLJ uz"S<"U8Ƚ~,jGﺲkf3=_-G ꓜfwEA{v/<1"<⁣x{HlMew\pri[VcݞQo׍.Kj|U`g9rݲ:#rw{Z{ŧ S}pJ߻J?L|+^{uV/8{ްgA?kamGw!w5w,7&umȧzErVW}}&؁ } "8\QxByX"*6k\iX~z~7\e~3(IU2({Fk7H9wl{q/(|MHuY|w\hb(XWqhXjD㥂Ad6dW(|W|w@3|%hŃׄ(A؅G8bJr&ga|+2uՈV(VXȉnX}pxц؊-񊰸HOrn-q㒁PH~@Y58u4eSezQlfaV(z(g#'Uȍh'eufHy&@}xfh}\#tXWv腓&zKŌHew%γkh{t؀#Ȏ _eh'y8Q6Y*$ZIs,1Ë$^HtO z9e=XZW)7Hȑ%<$^a ’hŖg Ő%)~1ɇ?ٓ5ٗ9lXihFysEXu\N#1x`FaTI_Q&ie W8$iE-b+ۈ _))%94wY(紜8 O#SYLa'љYIb-fXTiTYfٛyY-496ɠ34:e 8VPvyW7y(:ږ*p7:9ڑ  hTDZMyߔJZzOZN#ՙZYm9w)&ȸzu!jI-z?^ L/n2ٕusʣA*ؤȤQ:cMyA.U :x!?X%Eu@.z`+n"K=3E!Y0és rj:+詹`'ʪrЙ7(EJ'׊jY@6)*jȹX!,I7Vkja@XPX#J(@s€Z(Iɓ(S\ɲ˗0cEF,W%,]d>LAQӧPJJU*33XWBACnT]˶۷p)~ Gr8[KV3kÈ3%bYcW,&ϠOb$V:"T8oMm MTc "_qȓGX4F'3mOËO9!V, ւϿ(h& 6F(Vhfv !)mb!((b("-XҌH4H2ӏJг&AIzhR?R$}n* ՚%:ߛh #ycA%\ѠJy(%V%"yJj.?z*IB:ϋ裏:O>@*/"ϲ##Mkb?|JR?  s=D]όRTF[.K/H.lZoapg?0z;" =*O>(ӏ?Zo>KdnRs0?Y7ƻCLLw"|CM?&&Cð}&3:>]d'D:[,?d#?CyDk^Uk9n;>ͩ,s_ <.g{|?_';x 9E(jg/V<[jbs6jnߥFG7A܋h7f- _Ȫ> O{ t:-r$FͩX^lh<=!B}$Ro!!2{\kP! "Q}ck&G?P%G R+ @(6|װRrS4Q(8J_rg$;5,bV2%}a!n$,74?1o)gԉN5]Flgi3<\P>),zvӟt=+π *І:C =PDږȢ FьJ,bG)ut<>UR@/miLbZ#ʔ*c2ρjVB*7.uMRHWRe29`">$@hmP2`Lx: 3"]MjUM I^P=CW +U/Wn X,~ !"ݔRK֩@*LfV{cgi$ Q];4 *INV0Yy{ӗд?ǥZsI EwuMZf7խ Zw)OϋԸەxv[ף̭ixWQ m'Gd5keK$u6$GV!{% &_xA6ɉ]\%VΊdپ"鬉>8A`-ɏ#>=ϐd,jkn7_XbSɅ0jɫ %Z˟-l[Y?wD|$%9iO Pv8,I bB3zCeyt>LV5"V`%eV8͡JI'kHWXOm--g#8ɸC\T<dG+]{¾Ffwݓu$e1a,dlPjl UY_vlq"Vh}4[(|O=t@eI^h~M{@~*`P9/,W rk޳1C>NN9\<>}t{Ǽ>Nic\"`V.=st_ԾK?qw;z-9W̪vSc';Kɣ|җ;>k^_{ʭ~.[QyxźR׺.smإlߓa6g@o>bڃ={'$쇘su˿2Wx0HM] h  Og*hb7w|qz}7p7"zrvxzz/7{1j gy& W:gk9;ȁ={D|F|QQcW~3hxG}P.E'm'sfwmGz88%xnrwx.gx to}+|F68+zx~wh{V_W|I~ȈCTq%}qJv0(Liwko07jGcW脆slj-x𷉺؉Zׄe||Hc$g}6nW|?mtՆ lHes؂ȁuvhfqՇ׈v"qLJXi xf X׎^hnr<H$ܨ,Ŋz8cmeq((up8:< wYxe&HH/o]w'yiaхAxwevy^8g'aUP IY{vvxz{}חuGgYw9lI HckEYQiTjWU!x&閞AɅ d8sI]rII}>ɕM6h((9 H9gD[x%baՆHyX|mYu)uM|iטoy )}Ix   ayO8ϙ 9qYʑɑ5haiw4Sx[2VQ#G}IY!ٜPWXE8:xd`YBG|z vºZ󶧅}u  gZQ}ʀ p&!xM*dگ *Praa:?KJlZًZ:W๣czMɱغHsUt/0I&=ZՊv+[RJZ`*Dڞqy jyxX+e庮.E7%kFapp +%JszڰҊ B{Kdw [+om@{%K9[7b𨅑K6vvG3t+k1{Z֩udh&V1CGU\Ҵf ݊˟WkƼahm ]mKG˽n{suu+ɥ+ 뷼ˡQ|{YIۿ.ˋkẹ۹AH  ̸1QܻDڳ+kuZ*L'Kkx;t ;o[?=ܟCwGw;^K 1r!\&:+ڷb e";8|n I\oYL9*ھɁ1[Y'sIjj`*ondU@s|lNN6v7Y`gQJ~⏵ۤQnJ79~刾%%1>T7h^gk.L\[qڔ.1.T޵p!,A?V=@ c`J-0 C3jܨQ BHI8\ɲ˗0cʜI͛8s"Le2@SN9`@$YXujʵׯ`ê?Zsb"^_a`BҊEx˷Z @(2n p[k"ɠ~3k̹3ZHNw N`Tk,UkBf)1xͻO@&lآb_-F9ѢK;8,hղEb) R>j4ZL.2u!-Yol%jOKP%0@F-$R\I,1(@O @1,0(4h8<@)DiH&L6PF)TVi\Ҙ%N[v)_hXMgfzktN'Ms֩gowΔ瞀r֧Ljh_T(lN?6ٓO2Q?Dg)MjN(Lg6:jKjc$i-*꠭JndkKm 0zJrz,3 SzJN6䓏;-I:L>`I<2[? .Fs0 /BtϾh޺e#_O<M (k 6;_n£Ï".0|R>N?&` >?'4B27 4/[u_ O',5BKOG=5Ք=&c* 3B5K67:OT#,}r9'ɓgTxX~>q*NFcz3:cs&gIȩKJ;O͓܎iCyZonzkz<=o}?SOkB 1;}'5#  W!Mt\e 4LhBJwĢ.@hJB0)!åK"D UN 4J9](LuLh;RJVċSQ/zԤ SJcĨ-BjPMA[UՒȪSʀдk߄`S)0Iz+ hX:. 'cqX%AZKetYH6t(hg)zŰX&KXvӥTj][LԣJJWR*h ܪ?-:*gָ0)kS}ˑʅnFTG]HjsaDt%/+UW, `f0.Giur#]FLhaV{*-VBm:ºnXYFԶGMqE"ԤW-W_X6Sn^UXQSӫV6LPw[$Nqt$oEu$:9x[׷bu7`|7pv-An&|h$ZU6tDIKҖTfگ;t ja:-K7=d%@md$VnlfWזrIg~m`ʶW=i=;X~/LF?zH 3[FhqJ~7q+ox˸cT6RYUhw,MםY䚔RoWC#4Kӽuu`7U\ _ָfT&VtMg!`z|'_U{Cgk9rt KRnn39Kt=cQ뭦7]F/y ?qÿ*?O3z% ؤirmd?}(?x:ni7x#K w(;c<ҫŸ_|{ģCR2 HINWKSF Z%]ɟ,qegb~gT昃9Q nB'BvN?Fry'D3?Q=(=T2Uh?N$yTD{ħH?:v0>,(SFZCR鉵FJꡉd&YR0O003 D 3>N"Dj5n,ڭ?Jˢ=\ OD3ϳN / @nْjڹϻ#. N8JP?B P<vk:ó˛ˎ>v<&u^[yJC_3C^jnNh}3/?J(X߻,OSbW޷> _le!o~Ga4M}?;ek{Z_d/uk+H*Ů0S[\ǣpJȩq(!#P"Z$"Ab0Q=6BT>5,Nn"qBt)Iɾj q.$?og@ΈwK YFtՑP}tcErG2;厢 QqߥA} eDW)UԢ HJA#MJmTR"tmhE7 Ә䤶ijjSgW24ݭr2;u,o46EL ]%` \|gvN ]5\3x3T74Z/+r&Rm*[:>wJ .$X"]>x]Wz% "`#+$x z8E L|x@lg!Z;jƷ1Z=lK2cfS vmsX@Y7 *~5-nuX])0 p>9W |ٜl?ӈ@;-U75tC}GDk/L‘X|  5GM kZu+f?䯁cZR[HbOcǛ2l{ҦF7qk5'i.ѽu7mp79qO5 >!V=B4pmWΔv Yhr K7vS;s/goؒxt6 3Ȍr/:款i o"3B:td/zX~y Mv,tf6䫣w3'-f$p36 Ϫ-Ҕ'CKɚ7D9yNfaj'DYbxyVR(m9Jr؅_Ya9;jةکk%zyUO9-YTzVg|I-ʛ"xW ey* C*sw;,q Par{Ezi)I :Vj z ԨVE٩IbjM٥8ʤl6*udq*ڠX{VʩMeƊ Ďo(.z8xGut}:sኋɠQojJZ(%jzZzbح jVQ2*$J?fJ0jxitZ*:QRz{:E%;m u)KnɊS YuZhʭGCǯdq ڮhza_[Zzh .B;+Kr auK$:;Ϙ{KlƸ7'{;[x#˱۹=KpfdE+n fG w ?n9빳 kKIO+xy\^Rk˫r ћMks9ۻʶ~_诨{xۨڷJKi,* a `[{tf۵6kv$&B YѲi k S64hkuK+{[ӊb[ dkk%{隵ϻ'x j븮׾ڼ R3Imm+TDULm6ٿLIK@ZfUcv*!j vlǫ77*4۬@Ǿ*w +|l3kd2J+z vƍYĿ{󤨟ٽN Ʃ(M7=lmgKP5Ka0誣2bW=P !=.  q,@D,qyRm U$Qev@0v}2߼(.œ] a'P!6"@_fRAn'0FY=>$ r./@4^V>hΧr2͉wY]I: n}ޯ!+,I7V)@Z=@ Z #JHH%u@Ɗ CIɓ(S\ɲ˗ 圂U*I>S ̄^i% ZAɴӧPJZ&!Q3nuٳhӪ]KK4 +t,È+NK՚'BrBSNze?̚9{^L*F9" XZ_hf {M"kXba2ZkO[iOz7 +XLŢP8߂ 6F(Vhfv ($h(,0(4 m6o>>5$bE&vd%-iZM9IdHV#iT}X0yk fBjKmJfZq^YZstSy?iRf?):ճH?HIJϧ09ZҦ )HdO>*RZQfQ-)DXR?TҦ lH櫱Dώ$lEÞvK6YKKjڭDf+~ێ려OB~Z$S<+I 3003 F>Ѫ0&'N>0 ;o>p1Sl1J>D0to<>⻉0K χ>Լ<'d(?üӏ4& $ Ϥ#2ht?DTlҊ;l:Yl#7~<=l/wQ=h'&`T3|XO,O>iڳpcwCpf9TVu% `+;">ӰlA+u6pc)l^r6cm,/- h'jņCGټ5Il .MAz(Qr]~O ;?wsMgJQcqYs\-YlԓӉ6oZcvTu9ZR]%s?9] nېG(VW>>&KhNO\cN=QƱƫ+_WS:sd xPc.ԥJovgtÈv<@R&Y%1x?wɃ0ĸ}%/jeٖ\Hahyg8q$DՆcYz'hY葧xrit#n9}t@In5%ɘvhEfś9Wơ$jD{ *8z=8ezZ|[Չ(|Yxy9sz)ȤH)(|y498٤~HjEB5UY"4{فI&mS&Qi17 @Ik/?ᘹH$jhMʹֻ\fu}kܬ}Ԭ˕,}΀l,[J̜RL ܰWK4l7݋|N׭k|+o@M=- 룔Ǎ˘ٛIr Љ֩}lZҕt ]ʴ "ͪ6 ˝] eAfߩܱB,yZ U<ZKLվ=*]L\p}mՉ7=բ'-|,Z?띵t ؗͶg+%> ],k=T}1.&:ڬ4.6k(}ӱDdwk>mDm.ĺLqNt=}6d z{>_![d\u.mWíu;s>d% M* ?ޥ^ݶ ,X旼=9M׉F$ۋR%Yr.=ނ ݝ /FoO#bp+s[d\M+9[._}g$!̙N>|oZ^~dn|߾؆Ͽ(O /,o)?m~(x.Qj.!>?a/ܴULHJO>_ǼzlD^]?~SfUx'_O  $X` .dؐM@@tXEfQᦌ2nXI@. D"ɊQ@͕4u^'Ȋ@ pO@j0cφ2f8BWK*UkC_+zjYdV SZm|;Y4%(W޲~[ت` sD wƉ%1h/g-f.+)iЩ٪V\1DؙQ5PA3Otwo r폱{߽Ȼ0 #68{ˡ>t8x^/n}nݡ77>-C ̋=͢D.8ì;(,r@JPAKM(xp2 ([04P87:Q7w[hы9o-*ǝ#{R􈔱C-,&u Ȁ+J,Y+J+;3|ڜlN$Ol͙ !2,I7VaZ*\ȰÆJ `Ë3jȱǏ CIG&TBP$F9`@ƥ͛8sɳBZZrbg-00ɴӧP2d 7e e\*L:yћ,>$%D8%צFk %剙$CjaFM>ISFH{:$sꏡn"O3003 |hO>4jB裏:ʪʺf&O= g>|(;E~? $;jBqB3;TZ[H03@Φ#ChyAW? _ࠢh<7}wfr:g[Iڽ36*xkZP27yM/ڳh?$N^*&U'jyB>M=~pno+?_4=Cn2NoYym)7< =O |>Ft;3\풄Ns_v*S;I`f:4<2Y$ؐx~Urf6GD2߹U|M{?@))~j3P'tdjX= KaY?zyj Y NP!Ś08<3TH,}L,C۞0 Tb,PR&mڢǪ'MW% C9F2 xpd93)MꇜacNJ)QE*#Ro̓Һ\x;_\t(} ,xJXlt&(xN&3S"7}B#X8,[ә' #St N$ވO#FiyԎ;wISs>%tNazPME4 B+…b<:$G'RQiIYzR+ͧDyQ2(JO_S>7-*eT :jHZ&OqH:! ()O)  1 +P s'JRP CXuJ 4N& W54>d!ߤh7"0D@+]u ytT/y) @"PRLa\Zׇd @kV2{EVlac-f!\辶aC"*$:yѢ{6&#vgTv /i3 zӋ\j$HH\m2Œ@~_Eug%`x*dyWݻ)ZRA6]?Zl$1;Uֶ&tD }xzJ&^i_uS,iz,6׿:^lw/۷ey-iln96Q.QW9[o qRm|SnK;.zNjqW/}=vkth%9?۫o$ݥu=q:7O|=t|!)< QpnF:-,Ok?4gS#}x1y/=czik[e=kݜԿ!kX{D]߿>>Nroz5252YYj=?ڗk>%ij{*߄Iszw):/뢟OGxjgzy uzl'n8wh7k_ Ȁm`}&WvEtv'lw VZ" Kbb@xf~~mn}4yg[%3vNQHa7IHcOx7wzP8jX~>Մy[(qSkV9y;h_b׆gRxKp-wt{8{9ZUXw%Nhx}svf47?XUxYwPR=aL%\؈v&]NVu Z9qxKR9(j#/j!i٣É ZXsȝE]y煓9T&PIɊt:zj;\Z!rw^zuy-mj\IZv'TjNʧ wxR)H_aYK-Z멢u':Zك)]1*٨@J Y$=As:jf9va(rH ʭO+ZqpWZo}Y긒jZ ,Ǧ!q[ֺӺ!&#:Y*Zjj v&˱ 63I5頠)˪٦ g*OJ Ѫ>)9;o'.r ۱GڬIZ=*H8Zؤ犤mkbڵSqy2KxyY2`:fh "}y5٩¦7Iyg9ɫ⪹f9[ju[!GNI먚6J6+{j{+Z뎦Xފht^U$ˑ{7J8Ii{rZ;[yYKK|*K̿~{pll*Wp ,_f#^kշf[ٺ۽z+ks7ܾF"q;D|F \ <õȲ+ŭdUJL,ўiEfziLb+#Jmc,f՚ʃ+Peg{ǖ: 渊ܷz#I,{Ln\>1XkA<i=Q»aAY.f)7VV ák= ?+ĆvǺHL>ų;PŽSܼg6\|YΕQλ<̜=F}|vΞŜ 8 Kyהּ!nޮ.=Ryn(. ڎlڱD㍽:8N&N ޴R" |l":~q[乬n=#aϮ(T#}-"̺}4|W h Q%/x\ nO[ND ξnm:놹9Y1~^?ޖ6^n0밽?۹MϪJoUn ^?ͭ~]_~j_!9!PkҾ!GmEI /"ƾ֙5m?}vO4= ,E{=;k,|(3?t><ܺIZCOҫ/G>^72QS^{!wx|mPO=' 4pA$Ч&p.O09 r0 Gl<\P"C`F%¡jCh$Pq7uE"2njvdL)%2x%@r1ZL",[T谮jdK\rL9lRGtN!K(Ν^ҲN';)5Sllt1AtD7Ӌ(6@,.}1MY1 $7m+2@QFo@؄ud RMU8s=a%:S7K+kg1Yevg_ 6S{V3P >Lu+jwp^嶿| W!,A?V9a@@-PX‡#J81ȱǏ CIɓ(S iɚ)KDTPE A@ JѣWR^eg-'&jʵׯ:mHEYEM`ʝKnҥdc)N8YCÈ, N ˘3+!Y ]"VͨS*g9QEB+SJͻZp h|l1J9УKNسkνËOӫ_Ͼ˟On ?t`~BT-QA 6G!G֗Dҷa 7$:D!·bQ&gc}QD#?@>N?m=~ԣ$D3R9ҒC(CXBIr8I YardfDU^I!dr$gP^tg|ܚ%%ݩhvDv2gQFS! f?<4 > Q<XY*BR 9+I ɓLv#X>`? Ds=BtfyO k>ܺU B=#O0by'--B,%K+;ON%擽"쏛'X"jc>6;ð?C\<"d?2B,C4L:LIF$j.c~moG*R6Mwz^>6U'S%A\%vpA.T1Y {=10ڋ`ӆRudVx{KX4a|׬zc?ੑn:-p? DC"V=:CeQiLd+)I2TJ6S -O28_31DPԎdǘ43#hjf5M Us̑2rF7v'.Z;sqg|O>Q (uA*g C;]O(` \FZgH:9 X 4h*8=< &@LF`" `vd nQy65LDfZӟ0`GȪ/jv4ԯRdsEiYs /:zNPDT@@`N$4k. S>dTYfVHgJaA  hgcWf/t~j{֟ |ہ%nq*g*w m.5 ۖǡ(z6QZ(YlA1/uҘns NKZ2bZT#QjUcSժD,xU:Vyj%ikW׋J<K'N4jV[,aU᫨Xz֧~H9\?ѣd,1"j|WevmZ9y/lSH,q[ -2{ވ~7%*lyW78v}#Rg@4=)Hp,?gy]m=DѦ^C@NW4;bWi9视m t$nu#sն u_mXGyrH:9Bs5Vqѽoީx$ݑ_:28.{k>{=\ $r&ns1sԎ!Z5qW⁽2yATݗߤ7 t|}K7~+)y]WyMj;S:csXYxd^~W%f_XztxorM pڅy|bG^zܱ#׀~$'wyކzz*'#2&{w~g|v;GoQ|ijՇu0|(؃[k8YEt:<Eᗃٗ}*gmE H!hqrP ,erxo$n7~(s8 hV[g|H xl56~RxyjO!Xt&,y8A_FNznGvNJs`a}j6|сOv|||uø^X{'7}(]χ}GhgXo$w1'ฃw h؇(w&UX%ŏ#hO8X!ABaS^{  HxQ(aWu肙rnh{oHTBm[E2Y,u'vHzGXkFuCָؘ1ܘ/]$t8W$W8]8ȇkɖiI؈Hh9$GgY}ua);d؜RڠKY!5RKΦ֎xֹA:pCڝYPM[ܙ4zaQ pW9豞bZb_A"_j^rE+(`%`Z*^j-0 燦^XZ K 14"= ~p}_=Rx NM$a E'_*͞Ҥ&-M[!,I7Vk9a@@Z*\Ȱ!Á&<(k3jȱǏ CIɓkB#ƠD+[X /Qɳϟ@rt'љI}HSӧPJϣkMS`ÊKvUEkUARkβpʝ{ϳ疮߿'۳ag(^,JǐҒET;kϠCE,<٫װc˞M۸sͻ Nȓ+_μУKNؓ(iv=~W>^xcx럾_|y~`n5c6to ږO BVlt_&!n֡N!5bڈ(X։CF`Oh;6rĢA*dcEcFIF5S.*4 Ft #FMSGԤL)GϚ]V9#XCune}lW2fO:$pvh}:%O>X5Pd30=9Q&ԥ(>P?ڎ24 ÜN>*<Ы.; B*ꩼyyʚв cϵZB{M;맡nT> N?wPr&9'<|Fq"̎v 1 OB&\)<$ Փ.nl ۆ)׸rB;\˰|*,/̴]\Yd?kdf'JR:}_P? 3G33כx/n yҪ]gރC]0媖MmŎ'*^_ mɸuHl7<ݥ:N̊$cEwXs[1I|(O={W ,+{?[Ԟ.{ݭŵ3h5'٠3ɶ?D;S64UF#-~k 9\n_vɃm6ť''`kݫ4zP TR:~ɆJLe;`?ҁSjS<"l~C,"=)qJ=k0]F!םXDl#yd$m*Ud걏':]ǗHvr#v>db] !E}kV٧MC.# @y]qS,jd"ILjm76,e"%,Ҏ"i&}}a4L@eTF-gTй8jn9˙srǛ1'yP|bh!(` FŠɨF-PX*ݨHG҅QJcҹ)CҎT(!eiGPFtNiPrZ¥M T(5lh?S45(Fɉ% @B4`uU"P[J8+κfĮNZa T !oE+l ;B N4@H> +2ʐᶬkl[!ApkBۍQjZܖv >6UY/D?/tm) >&[f!-}K*dqe3My T4f{FB7غ&   F0 5ğ9q{JSuE_1~d㢄;jB p\qLmdXdE4b/7!*oh>[$@i{XHirX3?!_&mdcƯ~ѫ5AX:oy/{[j} >zˆ^kh5ELfy%3 8@cyќwҲudj o4Iuߚ,^y6oLlcg;*r?-i`F3T|i#{.wQ3;Ac8VisߵfßUҵX8+c9olͤ{e@!Le[{`iERxF2yH$;\Ӽ'|91ln{'NqeeQ7s筣}ɮށe&qjenu'YU{+|zݛl۽ޢ3==>l?f{j ;neioݞ s`XtuA_l/Cr2~7Yk5h}y !pn^/R񰶶4\?0$3Gm+$ MOZ>{=x!|y'(UtfZ}N_y\gjh~ avV*Evv  (wvqcwgm%|Ub~8w6R@,B(`6zac7_ק<~@nց6pG0|Tׅ:N|gUtUq8vd}"Χ!{!gIeq UOq/D}"OXiarfgx|[fsTH3WG ZVwVrǀL^dauPR\ƸzhȇTi'ET(vAd_Qv&Vfw5LQ!2Xw@px_͘GZxъw(bXXgwhwel8F!a'Չuy݁uUa2H^if{sir%{Հ7;1}{ʗo:ioj{ׄ'ы8Yy8cvhs自TFi I%w XX_)/~sUedyA_+rA>G(H?xY^6 QUvwg9>6Hq!Zbu yY0iy#ؗjݘh8޸ ic)(}wa/Hh8@P#8\~hI`qm8Y6 )`9!ؙ _eY5‘՚m9.Y隘E~ꦌiT3KPRٓh$R< O@ H9E -"0 p Gp㹕ѕ`Ia*h؉sVXof*ushA`$YQѐ8lHiQI9"v,:١c)ٙȄ)g׎E٥b^Ѹoӛ YnF*(֙89nݩgl! oe,I. sIalZu<* Ѩ LxMcږx|DŪže^  Qaיf2: _b*«CXz:@9 BXT0h読I0 "Y#i 9ZPpPל*KMl&{AfîRjmZ^YivVs³Je( caS[W4Z|nڠ?;|_|GzIyc;NYbz\)*X;YɰzT.1Z^[X犳>ql:ʗH;ACRJ%[}z1{vB갵km+EHሲP^ۦŋpZ#;v'K{+z;KѺ<ۮu*l Oa|jIm+5F X"ɴʖjnQ{*Yx'Ѩ@iKpˠm zg !̻([^#_/Z)Z/ X8=̭ܣKBJIL% xػJS uU:D#ٰq^;vɍyċd+ǵ[!$KjlŴH<ٹ ̜E**KL˶ēʑ޹ yx,:$4!Ъcz _nRU, l ܆7Mܿ;<s6$q>ܴ'\$<.Q|@  9,ZEXf)` XΟq΃\Pi?}j}K]D|h Wx_}k-e} Nc>~)ͼ |j;֏<>e&`_}._=-rޫ6~~!-Hgy.ЮJ }Q֬iWbӞs ]XcnߧF}Z>bgC>whҖZl~e d.w셎` b&pΡq.^JoNn>eqXh vB~L_upbd1>>i*#NB,W/rK|dEj/VBtp&=RD^qlYum.\/5iȯo.UH86_}fo!//}C￲$P2@ThA00?ۣ 7˰1# DLJk1P5FPtCz *SpJHIT( [ R@'ȳdI,,5;鴐$|ҥ3=&!/C}l) [M ѭ@+7l"D@TG(-D }ӾBuTQ4Xb4k,9Q-ZU{y[pVM}uU؆opnq]vfIˢpow=M?,|dIJ)^wvo}Y=C.~uЂO?nLɟU罏_TqTӍXhKT({w _wGtdqYQͩ^7e0\p^jX%ŇB~ADo3C1|k߹0E ` rC+lcN66UPr"w=RC^Ei:Qf];%*AJXr/!,B>Vk 寠S-)0ˠÇ#J''jȱǏ CIɓ(f,HF,W 3sɳϟ@! t' r3ӧPJq/.YatiS`ÊK֡ՂDCVW+ʝKȳ0*L೨`pLrOCi)x"+Aib*˭ӨSĜq4Pvcոsͻ Nȓ+_μУKNسkνË ǃ=o2}]$ٟ>|yA'c葀`O y桷T ~ UjT!aN҆uhwN萉82vD<&?>t_?HDd/ d!oCCLi?mϕ5NCCh0Y&P:oQhɓ`D:Rs*ɦlS3LGeI!.y0蓏AsϣY03yjΣ)<mj[ri6Y8**lg>NW3-;-qM{6DՖ6S+%|c35 <Әh:ٙr75HZ!솫ʡ跥΋9c?j:S"ƓV4MJhP());.N:1%j:Ji)OY(@NKO1LRdP3wL2~lI /iMqLgMu=|'4ݩ"xRg=)O%S0Kg> :7JM|6-Q6d.iTˉy xDL6)M]j*i=7EԤ@CP4DeO O)F[QK:<=)T ( |5@i*9Ak%9JU)s@H T]l`Ȋ}5_R M'ΔS"5W 5Vl6;ق*wSV9JmAVz L' -jR@h)(61RUQ+]ʅ=R̬fbV^_nwӈֶ}R thd.jӕ׻̀[T*0G9ѲH eX}(G=T,&qCa0=)uӫ^T,ULk!Ap` Pdkۦ`IUjJU9@XVjU蝮ʞ6inn{WB7m+C$4ȱc򍝋޶$.NK*`N"iN?v}4l&ڨongQ$UgT Vj'VYkMj9)pZ֬A=i6eUڢj2juuI;ύ}vɍݜfw-3rmK= r{\ۦ7vj>vP 2y$A<'3U^\(0W<W4 e_]Q_T'zsU eA}[qfLwG)q/ qmkdv@HrNpF5oA<𬦕m7lKV|V/& ?ϵy/v(Kż㝢m#ܥm/|S><@Z{U3\DZw싶pM/{NzF<VT俻בژ59irw@?Ch+GtEGst"t"fsC)I瀤/s LwtxTt_Ca7&u*urȶJFu'SDYGw9u3S]җ}FfS}l|evufUietU2gh$|n:8V}gFxax9Bk[25lyBVWpXpv gWg[}hW~WI${kvVX{cL8vq:Th̆AmSͶT̑T^fW`!{džm}g~iqfn_n{hge*Ã'qh^7p{{&Mvgw9gq':q'rqg:Wsbhtǀ( !OցHhs.vItI=_%c7TxP_Odgh J3 8qjTǸuI33LE$)rhoy{~x܆VD xը7qh$JFCbZM9 dtXiEIEx٨nLjȈ(lc{ jq>XWbiXXYu_6XU<9z#RmI^HhI}D9(كYBu^В!}I1&WITuɐP6ȎBF) ɕtIَřYɹ&_86uF5D h0)@XPxyfQa~AKv;GI&IHӅW5{}V晉9gvlJa%Wvl՗$ Ŗ܇nyzXÈ&0zI*)gTQAHz.zln/פWh@9q$x9pw4jj:pH-x o$W(ȣI٨9wYsiʩjJs'x?&x}()i٪i?#i1JPTe頹1HqJj!YĦ9%ZG9Uk.%(S)kXʡmCXz# @BꔆR㳗ky٫י**PfR99::=XYuym7`:'; ,)*[yj|:Bbs9ڏ: L멤sIMOQCWZ R+T~yy:<ق4x9+JJlJ`RD9)Ȭr;8 k $fN|+Zǔ#p![#Z OѮqK򺷨4qUwV/ꯪ"[j EFڦ8G ;{+vU\_ŋZi1MSn ~@t;4Yaʹ8+맱q #x3ˊU+ʜ9]{ax4H+kjtq;&VYʒʫ3TzJʸbڱ*:<8ZFˆ=J庰~ٺB< U;ъjs9 żv[>ZĜ{z\I d|zz E|&8PRjTjxi컼|o[x*@[B;ʭK,7| \INe{L̼d"vLɖlkg(\ 'pVLYZ, uS(hcf rkWf5n+w19Uej'd2 k۴NU+Ca'"ߴ{.7սaw_5>N+>rZG;g K\uIˀmтTN <[g>i maKq=iu=m^on[18.f31@mͫ_N~țG&ۈ 1RH_sJm! ݣ.ݦnؽg{(.gq&޿T­(fOzwd9vnAqn9Ht!^$>K@El]'*No3)Wq?n!#L>?O++[o(*V~+F>e.5_k=T3E`aloO #oSM .dC%"`! p`Gd0PFFK-R %) fП:;~YeBieŅnvhI)D% J%A^%[BiAU τK @@֤@%ͻAJ@"0аA&/iu2Lw_;P$@.Ro৅t!u_oz2]I-+bU^^i*h8s͗ r5>_ pRɡ S=(ob[J; .@9 q ʦS!V<.*!1 ȥ1<  ;P@D-@(*%JˌL5t38Qν$Nf 6[BhՆ,`ɖuv 6+-Ȳ E69}^_%[&ٖN?0F\ BOwbq0yɬ,[D}a@Yoғ &"zT4//xVTL12]? 3-EJِʢ*"L2xvpHA6dKZ_>`jc4DG4AO&. '_ÝfG<lk*nKX%DA<Rv) ;+A&kJ.b _1z&HW"$\-@`6C@+򍊇O=mr_L8'NoSx2:9&> <eLmrT5xCTwF4 ,a ƂE^vٔ'@W"6$, ’5ro%+cXT(Yz,K 7r;1#SQ'|EjƩj"-ͮ`*E5勫|:2Ƭh1@ f:}Ei%pď3"HH(B{cP`WTU$crRn>BF m+ΔʪY,CBo/n eR* EgɰoN4M.Ϋ'Oɨ 'v16e޵xY]K]s1oě>Uzu~&p}l, O'}E8 [!S$iW*H8PRJ\*TBG "SUٳPilĆ't pJXU"6cAh)vBsWO׾&hZ. RׂxeL/\!"j'  +H "֐!}6/ \m,z> 6VI^qx}kgcNz!搆g%ZmrY Ŷ/zSx). ](~7ic.v=*foט/ҷ9#:/*3r |oN$y1]bcZoeyC d'wddB&{. H ˀfvJB Y| F7K j' xInd!q 9sŞ/C'q3@-|~=D`k'K 2Rub@~l#߄'Ku l)9[17|Qrs>$I~Rt!}^(so'z?5%3o3!!,I7V@**\pajOX 3jȱǏ CIɓ(7Ҡ"eĔ DHF,Wɳϟ@ UH ‡=&d`CJJՅ44Qf&LdaճhӪ]ͨSbIՔ;d˷_2kA7,LbǐBD0Oz@ϠCU,7 'b!#c0@'Y#up+_μУKNسkνËOӫ_Ͼ˟|m(?Pw&X})8UA"IZGaHFա_YG#^'zbU%~bG/TZ3rtT1Z;FAcwCjTdJKZdFMu$wO6e&j֕m"fPUP?h8&JSf? avVxfTY'^"4 Jcm4h)C`<$i B.drYR 6(A3 =3LBsϬ O>ڊ;9:&Knjm^# SϷϺVa:uJr+ J(>="ZͱN欸(*'Bm /--2OS۬sT53-.Xi_< b rl_Β*nҩ(*0c BV_~fȕ\(Mtzc^7O{~.o׆r߳&& %9LP= 吒z虗ʛy:f|N5)ؒ*c~nɭ\ط7%]Bt> T'nrqB ( a wZ Gm"\!D [HD!#` I$JCQ0zj#A(ZaQzdS 4PhTC%PN2ҏ:s; ml A)Mszf"])?cNZPLS;NVz v|4PULWNVr;U5-LZ֞̕EiEQӽ.5M}P)r5 I awrWu:d]׿\V: a5`A!5-T0[*$$@!ofE@X-Ro["2u am.ziG6QnsjD:׽dn5PWG-""! /CnϵہTR@@00"Eq`4@xa*O|c',bQb]8@E>2  [Wxy_L?AZ._B ! )󙗌җ(n˛ֹwj+DΔK1Oݽ2a(AB%M+! !})hG:(@`\^aHr3 zF0ol^9P48 ; 9‘ -\uzY›C +d;;{jmo{0xO΍V~'qw;ZV| ڶ//C/7.\so8(EƮ?Rz#qq"GS/yKIͦAƉ^xT^wxX.:O(qhٳn47E>I[%ءO*ܤಗ\_|Sьc==zt}@~̾xC*mӡr3n.j<%8Cd& FZ1b zq+%J+L,^*c[D%'_){{=أ@ߩGh-6ѷ@ojG.&즶G쪴~{^[OlZ" \r , b6ۺ;#AazV_Ȩk;m?s۩uƹ³8D4̷ {h[>/Ekŷ]׸7̄^nX;8T 붠&lܯǛ뮧żk<뺖컘,[W<\ț ʬ 뼌 LɎQJ>x<ȇbz~q2̐LR@1 魫<ԬxS9?+y)tw˃ $ ܵgjgQ'U{(W5y}_8-jd0v٢l=;QW?{c*l 1pf p)])쪳n@,(W6܁M}t-4*}iڲ( fi \ a}ܰ-ч-ǬgAD Z}Mߩ ƦV\fH; -LRZy$ǥjZ\>m}B=F]_#͟L^-l 8]iZ=eIBh<.ҥK! *e.ӳ= kQ=̭(#R(>Ty2ۍ_цL},LpF˒sЗ.undlܕYwH}2\ä߲"b` V3LRrke x,M䎑~~W8ظٰsjɊ&,쿌jNZQ.cnnPNC[Ԍ-ﱼi]"txm [.4!_ ƺy*^KI6.ғEņ虫i j YN'銗m=EAf lm5?^G@XƺB }^ܜ hHa__|j<ͬotߪ̊(E־ (m*nn>mQ\7N?I?<j{9L.ID Wls $/f+#oa7.??ٯ| 6#XP? Tذ!C%NbEp1M xqɏXȇ)eΤI0!XIQ$ L b idPGeġR~L;dbը[fUpi*a+-]'My/ń$YWYlnܯ%xg[ysCFx-\ )-˚ d6֯%&k*žO9_Cn?E˻4~=O[^Sz_-3|ꯉc}O?O ALнJ#\P9 mӏ;\n:#7DR4D^3; wk6xrH kH?T'm* K;S6dL @b(k5*Ol,60m"4o6*T&8Sӥ( s3C+[<~ڬQM)ɜbTB̬*='+8Y3)5P+:U,UUKv;Zz3+S  Ucoe;SgT DچG8nB!t׹d*eW<xMM/%tBvcuu#&Ƙfb8׾dQ\bAd7SV9Kn㙹bƍ1{{tK2}h+r=xɧ1]IY7.*ʲXR.<3MάJЎn^fŪ\ZUGhSt֖ZLm:R)'lҀf qD]<g վA꫰|3医N׋UlKUK3\MvgL_K8?=-PځfnE77~ Av^-|:}ٯ4/$qȝ<=׭\h͂6$ p9&qosXP* !0  X8C,2BόFGK]uijPc5'N _f%o+1m S2a/T[V5^o{ܬXD-Zĕ(!ᰊa zG0x꣛792Nykڑӵ|e)a;6&nvh 6ܙ$waH2xwi5-yP޶7=,(R$;E&*]Ub'1t*E}ZGLZ  ÄLPC;d !:A7Ae%%4]& ;@yY٢|.Q ydsaktZ5wίUM["1D^DR-,Bҏ[,D24Ict$uЖB!:8P#y3JSSr{Se: Qhb7gM,i~aiwt)x:ʰRbUڳVvүq_rfZ5 m%ϚF/ZƊ<4|M )y5L@ljؙlP{3h[t9J\ϰ=ȅlu\G2倸G]fy{RaW[˾f.HzTVJ Y셙Jqj*IW]c[)bQ xk_%-_M*uUoD b YTM[V?7EZ:뭘ug7LմvOyj_8&_;rD]dbFVEDc:fСg\H&(m+y0V myM)[)mpʖn =tm{ \F6Y{&bJewgDkOxsXd/{VA)8Kwwo1M:$ZFN,Eqpһfmsˀ e\w֌m\K?ź~19Ix©ElR5\n1y12Lo#68g}1QLZu,sco^߉.U튚Iggg(3Sn]`Ua@=^z RfB$ͤ|Lwn͢~h(VQ^SDa)kJR=;,,LVro/z[>>t0?藱+ě4~a@T @ p (|© +C"t `2C(f$,3t Pc@ţô = ۄ=Լ0ýAQií+<:A yC@ C; 2/,;SNDREQND!,I8Vժ%kZj@@#JHb,LAXǏ CIɓ(S\q  za(T,=229 JѣEk&fBgDJPNL ʵׯ`'VD`RVBqSAػx Zfp+=:d #K\Ҕf`\C%KӐXZTε>s۸`HɅV~^μ݀֊#[y$ѹËOӫ_Ͼ˟OϿ(h d _ `AMWDYziHJšP!5"^%~hR_^*D#W2tV9~cxT) i] DJIMVQ.PAMY9iy@#E ^?l8&pGl?p @9I=S! ӏoXEɉX:?L)Jf)XwhEv䨦 JJJ0FUyB00땎NhO>Q<DC0FN>c+3&3DJK+ݚFtu?vi?zQZ0^ /'&ԯ#m= oɿ Hn'> ϲ'-OPpÎĸ> -;ɦ,c3Ù.,q&|W+BlDF^k䮈iacIJ;p%2gG=&4 jFlnW$:)=s |2EitܴH)y,̛+!A{Jl4N3RD"8dJ(81}G\Y(Sڼ%($JQ$tE0LsӒy4IchԏNL %ApzcIJ$AFH, "BWRBJH#ukغȮ1k׵^;WѵCMb3XRO]lRK"ʢHle5{YV-< Gˆi%miERHEm[e[Wo2hm[0ݶyiϞDP (`!#t @D݈d5&D5oY3TPyŏD]y) *BWȤމ.+0CR%@@Br)D~D'x/G,O%C,D^3k> ! ҫ jycyG&NxHo @WQ;n(o {?47֌k|C#GyM xy>z{$}Դa ÿ^)?[(CWt->mi7='qO*_e]Z]d^5a iVpnuNjqN%O$ű_ϒ? D}Р?GGhV/G7 %FϝPy_y{R[9%kʇzs=g6OE!5G9^\:pBGe@]1^#6^5b hb Gyw__E.~`Tv`1e6f6f#鷂*v7vLT''hJvҖ5p}f`Y8uZ6՗׷|wK(b熛ddbwiW e@|"zw' xJD~聗g^u@gRHVgiu^}gw`DljjgzW{i7kfwjkyickFTǶ}7wJ!i=etvҘmuhy}IlXW08gm׆[Xf|XwvuOvw$qn„0HoRo o o^hCpG*QwՀW"q(ҁ3)s92P⓿t; h#hEsĥ-Q ~IdT)V9,YhV'!uׄY)dvYtc`I~i91dCcEֆRbl w츗'whHmmxLvzUyeS鉐Wf7m3zy9R{Wzy\Xih9fcYF ٍx'$tfg}}}}U9w %i旐攍 7bi(ѕWȕXi@9s&(9Bi h[CH)qG6 [Yq8&DY )/\P]48oͩkؕу5:^y@yIQbה4y4&akN+nٝ^I)Ip+5WwZ8c=:W,QgFɆdֈheX6n(ccV~Qxɜkfnpm(Ghg~fpn׋]ʂyÈQlf*j畨xZɇR 0k$}h)걍9҉'uڌlf]yywpvQnpoő2o`g{칠H-ɠ!QKYګ1“J %ڟI:-YE5>Oz')+tJX* b uV e|oieߖ[Jv'uHj%ZOyZ:_\ꬆ9f7b甔 {xL{ |HHM[&2h٧J+s9j_ˮT{g궩l˲Yz<&񳡸 ;mʅ$J1}Ъ6·'g&ڐ9ft,~p `!sIVۺ%('!{Iyדˢ˰+ 77ء]]z^>^{o[|S+$'$۔4{^fӛ(cJ;&a( Atk`NJfِgRj^ȹٸ뷃%gbJv)ʌ9j˵YiHgZ4.Pz]J+zdò隖&Kkq*쥥ڛw yƸJM֥ʖ<Klʊ~K\y L[ʭZ #ߪF y",{ZKZ ۻ˯Lʠܠʇ (hBs<'ly<%ZɟWe.y̩l.)eC Q,3{^p\"qơ*{LiX\̟^ZT$,b ,a]+ ܿ?+Pzp;ro{ ($Ԍzm|F㬗|}L(qH:Pֽhӛ8KlEb#˥"2բ,j|+ɛԸ֯u"!*4ڼ+wۑ,@\LhDmx8_ aDڊ:{kXl߭ #6q}M%-ll,5ۘTG.3|\54|oФс]a*ݳuɛz >m-u>#ߡёkiMK>n>6f.׬LFfINCn" ?nYQ嫎uw >k4>Ow.tn ^;m>>o.Onn(^zm"^š.8SuyH?sJ/Y&o]2;5 bNR,VΜ aM>Cf?6hM?XOvOVO⊑N.? rZm\]R N=?﮼_>.QN qm; r_^?Ò|//Ot$!#%oc+91_5|mXOφB_>t7O_vL?˿_m$8@A  4pSÅ#NLxP 5nÏ5xQB '7Zҟˉ$K"4b,gd(Sϝk ZhK0)ʜK!*]t' ؤK?ĪXA* źvJ +6? rƸ%.qMYd +g煘V(fҩI~l(kǮ;V];2²w;3o) $pogBw,9gp 28LK. Bär2 S,/>Đ+ŤB$jM6˧ϰA*ƄQ͊5E*tI+/@MRKO{W;fDUõCZ{]-|5IE68eG;Y3c-֒eZld6[rrԒ \C}OFUH]PerQˊ*TXE(LA(8WO| qCwIb.^s}8tW3#sT3"k%:`ckxB ^o<2I4 ޗfNu&YYen7^E0N ![i[YfaV[ݼb?n)rmC=׶Sv^}7 ݹ%)p=B7.7S-;T<$XX߈?Toflm^|,YmnZnHlyoq.(~wv(hex]3M}2gQR24MMhH[Ț@ *j~Yyk:8xt%@P[w $ m@̇a1$\ > 2(#ֵ'-12vINjckQ{U[F7~9CޱWT%NS=zђA4 v{#Hؖx!qy`l0A) )C,' 0dc )i2GE "5|?De&%3/ LIID` Aer'R&YDNVQ3G0Z%5bLmMT?KeQas +ҥSK3mFo^H#7E.!SZ=oZsKaJS6UNKR@}'Q*LMLhF) y8ȱ+ǛIC{8ܹV[NIB6ԅԄkzԌV#mJyLB) IN1t bK4/8=lZ k^$G|J=eɃ"VUl ѓQ6>3L?\Z9U?R;&bYf?qY:?'vɠѠeF) #=@$0B:0Nq)jꩨFQ٨?*җ[JkRrsֹkNg?{ylJ=khN(fꤕRki~;k覻`KfYkY/ g~" h̒+N{zmZrk .VlgqW 를z{sir(I,,Lpp.lBLmH'MnLr`R'첾t;;p6ο- +<+p-Llm?7X,:˦u8:3Nvۮvs/ݮ{S3ϲCzS˚kG}\GI`+ǪE.h GHbx?ҖkG`(tmi"7DW#Ç-T?Y{![ SDIʓ@ZXbZBX4a ,"ɆFD#4Ѝk(vҢ>CBqjG"d#*Jz R&%Nz̐ 2Ttd$CNE| a0K2Qu&^\(_WAR*!JVZʕ%#e4[ZZ"/nz00:<#3EbKe&.ɕ]̧>ٔq3hLfU, Zyjͪg=IъZtٳsAE΄M/8T*Dz.Bĩ傪?,8"*bUj\Ѱ# ( !,I8VQ8*\p)jHŋ3jȱǏ CHKIY"HYYI͛8sܩR^TϣH*]ʴOGrLI'jʵׄOc35gK&L9@۷p?>3Z \x!߿>ŮΧ̸c5/*We |z̹g7Ry n~^ͺװc˞M۸sͻ Nȓ+_μУKN4vۻcYx>{-O?p{bz_Ch`S2T &dO?ܔB "Ʌ6[ԳP?#uPx0ܧ0#FbD003whaُ;IrO3L>L"4=hх8>$eB?~AOC=eO3ta?υؓd< 3>lv߁%4j AZeBz);3}ٌ埄 9_ZhfZ^?P劣"룜泉>z=$)엸kHl? :kdB;&`k?t&=+:Ce}Hl ʐ~OJΤ:/g[nA303{im&B53BUd>U҉$7=?Jq>KO|L-COjbpP;-ުӷBjcЋxT߄ ~j nN'8vhBY7$9WN{9tn:7:E:.{벻N{{|Էpƻ|=.ϼ?`H}^k`}vyzE=D`9ۺ^ƒvE@T= @pGM1>F(Ʃip:;`F(.rNH}ˆA]ؘp#! )6ċ(K!c.E󓟭px \``!(C'/t"—1|Sb`@9vvX=q:~og4fQIy8cOHc?22'kqH̨ A,J BDl%Mƈ/l.]Hl20b6ĊX_Kf3!S6њ#8q:us|WYUp\!Eyfج R$L4+ K8 B\1M|' ?ql_CPn % V= a}@q\&#c:ŞИ DfE<Ԅ53m)XF|Qg&?F|SHq'Xw#ֱ榬f ZZu6n}kK}4.}6a?әܢNz1ԣ} G*WfP[\Jٷ6l[8;XsHDS[TBXpv-^iۚĵ-p;#TN<2DxlJrk(TτuWDbw2Q (h>4BVYegExTR*\)~%J3qě4#]&,|Jf]uxZp(.uڐb/]WҸ˽q[sc1'!kZuoWӆ7/Ǝy`Vɠ۰q-Sby+-8 Y2-p?fx38+yZ."bxy3]vӫFFVE3ǎ~t#-i"SҭilRw-NdGE}k؍n"{.p/<8—be"igϮ./][ ۹ޣ͵m`|5IR3[AqO˗3TfBM^nGHmp|)ts[ ԣSݕp*\띖.QtW{CީZE'Rsn$cyߓo]j]3˺\ᬻ'͆v̷;28mnwcE7h݂;Mt3zmù?܃8?~GN/="tޅ.՗Nn=`e /z\̏3yWv!3w>뿟x]wmFq}h|׀ĀI8R[eSvw}vҧs w ٷe}|~$~G~.h~~H`u7g!zl%ٖzPV~1@WHم{8,!^o_؅d|fwU$0T}cx8)(h$IHs~X)E7MdkfifyY>yȂU(%~`GjX(p`x)3u(J\؊=|cps Wtȃ wk&{Ĉf%4'H7h駃ViGTmˆ|8VH؂9~zH9YTctxb؍8BxcXc؏eVȋ8OhE(T1x3hr{؈Is萒h" g$NI+IXؐ1):t w蓨(gHdhTGmȇh[GؑiZ \!Y᧍Bxcf䈖18%G؎fk^([HhOǗȔoljQDhq6I%9)rxIlYugjYs/I9Y9xyszvٗ؇0X9; ƘH hʇǧǜL׋&Xsi諾+w6؉|ӸlyL& (i#,ɝ.YIAMY։IH ȏ Z뙠{hЩٔr9l9ye9Lؕ)%e)袦՚HwgBUMء0I9>@uOuSBjSUWʄ=F^: h\p#cJaFAHe3=TozIAX)cZJyjsJp! ť5%DwxuJDp!РApکJevtJ!f* A%aʫ$šڪ :sꪜjC{ʦ&W$Hbzh3kJg!p[V !,I8Vkja@X)@Z #J(Q $O$ɓ(S\ɲ˗0cʜIZ$hrIB9`@&&(4b2&Ť*R"& NXjʵׯ/WI ^a`2ӍR IZ(߿ fE'+ c"vIБT۷"LTxe5H<ϠC4%"R Bn#`ꄓ5Er" )Xb@[+ʑYײ' bνhUcƝ]~O_Z ȊEcVZ>D,nb =? f߅f(@*8_LpfZyldR$$8<@)DiH&L6PF)TViXf\v`)昁`&I]9߹6I0* (w(E)5'2zfꏤyj&yLfuz$1 EҔ?֚Z 'D3 3?3>0箳>ϝZJD mD h?ƣ>Dd? ϲ,"+, Οh:l=:  0@K49 t< ϱ@ 4V2,3Nϊ&D[إM/ü۶PTC7;;3s-r<Ii[7HDx<|O5c7U,k q?O:#.<RHcn$JL(5ENvǓ^$WWM+ne"7dc[v%d%z5v$ЌɕgFsdo@##wp&L>;߉)rΏDWO)S>qT1' xZ%C HS/ؑ1rn 2M‘@EOb.f/D0&ǐ$@L)2N///K1IL!Ȥ2T [:miSqL*ӟ0m,#A"%8$SJbshM9ӏ~*&ԴӉ@k_6 ͎JoINeؓSb"EDzs;'و&$$r@Y>nԌks46G ?o+ !!Yq\2ܙљnt,M*t ]huS>6Ja3{JVds!ݿ4guu*V2]_qǩK&)!> 0h~!^ӯmW]sX,ms`HWámTq,becقA6;\,6pM'a |f jJRY~)rHXs}gSw"=o6abҿGsRR1^\WfdHZ[ Xj^31b\ -cZϋ,X0*JHk֮V͟δdeX{S,5J*;DT="ڽm_eϐݶ Mco4wm&Wy.]F2n}3x~3"w-n̚U iJ: 7qJ@;龴7}oO5r~at/'ƷٮD;YÃ+-ewpGPq7Je h[tyGKgyKiր'jwFpW Xl1G&v^esylir%~vƃ['Eg@ƄMt7o5(dG|Ve̷ev{4R%o(u&yg>~'kgUxsqOU_q8M_ysUv%x^W%87WgXr{G+kazgXǀmdQhFb{?s\~u||y8<=WG#XO̘xnȀTne~h`dӥ&GNXMh8U72qXHCFx}_ʘH  hhaYt~ȏ5-xdjh!)rwؐ)+88ȍe46/5m̈}Q8Y>YD&6 0Y9&n懍sa[8l䅨6t'Ifg{jlX$H+QT9x|(_~htXF7?^珊HsVvjnIzǍxFVHpfg$KhX9ɕ+Qil4Y3X|d;,Yt=)o98ٓY)Q'H ,quegLyrNzfqFhHw ʙ]YiǙch8EjǖXKx|WydEycWmU3!Ɛi'ZَYW8{ sfs^{uYٚ%y51Uy6iU)Kك6Y(J'Ya}Ue9e؅Ź9If8fv9矇 ֩^ډjYiYhk999vyvlֈOjɗ5YjcyP7X9S ,866g=tڋzD/٢ 9X&ZZ:n2:W4!8JQ*%r9CZEꪯX&٤`)՝yؖ|] scz[2ѦYIʠ'!WYxH XƮvh@ʨ: @ȩ: $ ׈P3 ůfǪz}y͉Й⚧(کFeyIUjKZ iie qڧ!ۭruպh:Zv*x zNy~*ܺEiD~ mY`ʱnk+pI k$Y6jwGS{#DʆrY縿rx_t&`Xj'+>@;=;VfHpizb[Vozp\^`\j{d{q{Zu[p[6x~m{A{wrpYYĩ˶]ף+J(]ǫٵ2p(/;93kxYjH*RK۹$W Jr\>`zɻ?)˹׼[f:ɽ} ;ZYL|uZ ۾w<] T10\ܘ.KjRjWʬ-Ԫ8|JCk[p\#,9Q -F Xx:̼*rlSla:`**NOC} ˫\DW<VYlIڻuƷ*&+V̙kg\Hex su|y,{9LȦkU W| {l4ȋk4Β5Z|I܄-iʯ+jm=MmݱȒ]2^T xaȂ+(*iB3FҀq,!4m0U2*RD FM2)m]*#*e\q՛՛*!ZSћ]2;1(gi` 1[=ձ~C)apVUM-9{p؋QpM<-?;/3f*T.])~=-4 !M^ h!,I8VRZkՒ5‚#J(Q S+(Iɓ(S\ɲ˗0cEA,S $CASJE ӧPJ UTI}HSZnJ| ճhӪ]VUT <(((6]c~ bjKÈgR`˔ W#̽b RIĠC@D@10Ҹs N\W|5~bХFLORdkiO_^.A6P8+ҔaIV%i_n9b*)bHfJhf)=; ?z©' 9LSD| (ѡ3B`"Z0da`~>aϟ`"E@Lȡvn ԐYZ*zG?>Iǀ$MգNh(DK ]( qXݐa >рs*atd" D(Q]DbaP0щHcDOAt]\@t_w7>6{*D$H@ ## X2K(7@60Q7"$"X XTM,D, <1d1?*p EzU[k>nKTlTוmW,{pɈc>ù7}?2nwͫU=g7ǺF{vO'O7>־bŸ6yM;~_x%[GRD~mE7Q9U|yummTwn xuҗz%n|ᧁ noѷu5m w}_n|GL{q18si~wvqG|/{A!{c\,gXuZ0m(LfƗ_?2W6{ළ;tE7S}%uEihX}v/KbgLf7whPP]7yy(8b(CxwRx`H`8HQ7SxcR~fׁ~kv-X@h}}v{7|x÷e}W=h{cRX|G]LkgaXzB׌,|h3k}hu(H|8uzWvz~((`Sx_yT wD Ɉ_ (m怉uABXRhnwt/8c p}8#"X$=pChWR6qJ\(r@`xdEXnj'7шB'BOx͇Uu蓄eՃxeft\֋w()#6i[r8~tXkɏ'i.hyOgO wtFaPixp e ``Y`IWI`99s'5ul}z# %9xjm *$ n76.XDR}8}9}ӨV^Hĩɚ5IrٚǝfwIIIQȞ﹐&GfZyBC6Nt)!8zXi! y\8ՃI_(; kB6e)))N(qhGtp

rPJ癠 ~?ٟv |x֟קiaV ڨlb\HvUmsm'fjXuKPc>ߵVX#uAdlDlɡ̅:Z WpqSe 얢EZ5IٓI*$ gff.E]TIHfr+ \Zp+wFJFhjmPʡRjZk(GNbhThz_Z,u6W)7GhZj:^ndzoWju$:PRky*;G闢{znJ"uM Q/&J"E4VgIF`zjӚM;hnZNWK-G;1JJe`e㕬:Gekm68J{!$Z{`gMԭoBNk]{@Mj# Zg @'%Wmچ %WZj#t6Vu\۶k E+5KXy9pVԱPLhW2K1 %ԋVl8k+سFlAKXCKJ&ֆ F;SOkZ4S+*9G˒]šzj`+SXQ+ʓ-ڛcopqkuAEb ̛KLr:|;GF[XZ-YzsG-RZK[NfԪue8:7hF,]`ڝۣ I,GK*l: ^ġKļ uʲ}$[xxLvx{k,=IL\'V%l}q %]&/_:F_ܜ/Kތg|q8J:R,TLNc8K\&QİbLn_{ m~Ʒ ݼ%\glђڍ =կ=Kcm'FҔ{0ة^ &Ӥjc@iC}/46o#VP͢SjF*$*¨rnjDU VCwVsos)t;OQZ)NTKAU~;{`CXV<*ŠYMXZߟ{FZl&z֓2<)g& j׮[bZS. ϩNjmilUv٦8n<p|j J.C>Eޞ]쵍>}Ƹ=ҺܝͳXNꎩǽ-a۽8 m|nޡpneN=&>N}{Nޥ+mՕ VA}&d̔ UQrN O-[ j'|ZeSꮽsP<O;n"O?*j< 3>c?*?C?ڋUN0nn+-Lg|n)n㌇?J =:.'.ϙ?#m̵:? rzv&;?%J3+kr;1j6ÔZK)(=سt\*74I2( (, _dv܋AN=O.;>ϯVk;'k><'s؄K*t캺kt? 伩{nO?V\>պcO3xr_veK|ys|^|5d_{i?US@pL*`T@#)* l JPGt//E٠GHM0&",NE,| _hd4$ [h,Aĕq*JD)1%Ll"u$,2YA4`$.VÆFJmiIxh qwI_w*6Np "I& 1@"Ei"A& S%Rz(`/%YSĒȤKҐ[fDKF^g*-">I#e'qdO90/H ! rIg~OkYd51U!?!*+SKTcNS$t"lfs,Irֲ`?Ϲ΃d@p@ Jj @`Жѡdf/%#t9z) c*Ҵ:)NӝN.I%5|4$T/Pzss\k`^ĪU;տέtylz%Mv2k׶7Tt'jU}E=ѹTL=/z_g1흭K!O20YĞ2B V5aN@E.H!l5&%%PR+ui~V jT5i!_Crv(q iN81uQ *EÒʕ&0W_.--ճ<#.hZLu{Wt9%oz"iclo2U'7<^So|1yc~؋!|[huzyzG~zdgx>rVfG{O'W9V{w׀5|cEQ||R!u)eO~eyw'~@Xw7 x}FRD!Lh{-E{Qd·Cwwx)xW24xawh!ei(y rk(mH%ql-R WNqPcUpx@DǃwEq8zH؉lj8N8XtӶuxg@outx׈H~VrGeE,upVz]h{wsx{H$8\䔇#B|H1xv0QH~ƂWx6X]8Hx؉KXxvOHXz8|X~O;ȋ |87Ć8)yx/i2z%kgXX!;D~'BŅ>i|~hՃm .\ bdYNJ'xSْ3x5ZȑTItOs 'wzuZ}5׌}x6qhsXn YSxx=YHO+ȗbd8TYД󷔺h&5hqɋVvXYfyzg:6myz%ę7@`m"F$JTmٔsbhxw%r7neZW뵛D6o6E8p hp|[fQ \uҝ2qfuW F%IrrTڍJFO[6=>!ߘ{~Ƣ6V"X\! G$]nwAtB:B^gL%kyDBknjR؛ɐvhlZbmrJҜxU#fQ]1t^vkⶊ_Mo/?vrE**I%D 1VᶏʡZƥ @ 9Y:ɞjJxIjz\v=u+s %I{)UTJs$8ڣ_ΚMКd9ݵ>i\b:*{re^L!^hYU/u &ɹ $װu p~giEҙm a}cjgXygyWjX*eǩ;iQr5*OU,`ٝ jz^:i*8fkfme9Tj&J*Mtl:V5r o~K:݈UI cwsRj鎈jXnƯ_[;dj[j%;K+n:"akTkeZHtt@Z_Y[g:f9dћHGpMJUX>栴ٟ*q]z r;+hȺzL@g t帞x::pS+yrʸcK̾]Zka糳Zh n{*y:̰9Rh%xz¶MT[{u.%[i΋jk۳_~g\N56[YF[Ku4 eo 25;Ǽ_{W!囸 nmW =gOMrC} .^ir'NCwbp2$Np5UJJGT?^gCN侬JnüT@f( 澉-Ākh檛TjFp'@o\?ۦ; P'@`78O <\|+'pZKIP!͓~%^7xFYNAΕ}l|.@QRuPzxיʁkq` `'. 7ާ핾W6Axv2uR D޶5^ejE7ݞyF EB!|Ε|?~.@h桾Z"v:!,I7V9O@-ki@@)#J8Q BHG(Iɓ(S\ɲ˗0c"F0xJ*圂U*Td)ʴӧPJ}ZI+ L8Z:ٳhӪXUt]@  DYKÈz VLhK՚'uJ5CMZe۷YhS5UXҸsN|+-knv ڵͼsd]] XNLJ8U,7?_Ͼ=J8W+tܕ +;ӎD03LDO0j<IoL3L*0F6j+D۾;j(< $< ϛඛ#?&Z϶һ%U{j9)ç:.]Nf<8@jS/ᳲ@Pk9\i˃k, 219=ޙ(<:+) h9DN3znM;=H3mD[$=NT{J*sl0?HJD46!( 2 7 %毄& Sc.|b(CBѰh!Ťf(bU*1h?@G$8]g+"*#$IK4RAQ$H&Ё#eQDC@#xF46TRyԁ8u h)!qMHA(bx<Ԟ˜#2"t IѓD!ErD+*a!,{$Yި.s9]2FebH|0%D"zR&\eVh$hjZB|$e r7yvչ h\3˔E'!IH|c,7MQ(EIOF tbQӢ!H)ґ(&EcIS"C.}ZN>CbSRUL6Ӡ)НM]tAЏuԨMţ8*O-MF!:=,jVDv'ZNJKdS౧(I&:M~Z=%MijΒQL̕2C}=+ EK,f24v9X7{B4TfNXI6M6jRjUE*DQ>ʸ`7}[ڸ&e]06n!|e-]\z6m;˲77}V5+_Mѷ/~CD D ]N%$ L"@G`!Y aA ^hH#8x*NˇC(@4:f1!^Mvxo[$e"i2% |dLe(T &Le~,^lDmF{=۵~/=A0=4Th8v .%-@D.,' 4eRfH٠#Q7pt1è;FnSob3hcQ%ec (O#'wuK3lOg9"=0ݑ24+y7> @q{V2 +7a _x"FkoȪM \K\lv=\d8Cn0Hl8b;9綒h)z3[.yͲ勺VdzOA,pJi Spvӷ5sl;yuu+Yts=3wrMFȖlgK^^u7ʅwc^$by;{>dt v o;DOG|롷;qۻﵞ5oz7V}=_Yv)_V=q/?֌g<>Qvugf}8Ag{ E {*|6|giwz||pw6wȗ|҇qԧwI7ub4}ucr+G~,xYyGswj;{?y Y[1XH(ƍBՈ5\(u@P\!c%TF򥊬sPyT\hgIXI{9R^9N~X&鍪x F>ə Iy*.NW՘,yV阁I7[HEP$)AG7Jنby㉚{9fyYxPL䦑ِB\DɖtcY_{O^\pՉXHI{%ILIyu5ڐ7u9;Gd(i+Zmy*YSCFp٤,)9ԥ7Szݙ^iojl 3Z{Y?uvs=] sٔI[ze;thZ"J QTE蟙[Z]B2ꤻ5\婦*ڥlz`*:y^.Z٧2쉦ڡA'f4Њ!e;'0hoغڭzHE `֭':& $UK6)LONXTTWfI&K٥J[ϙ#YҙL$I%TôIQ?r'Ev9^JTKe} <Θ-3=Ht=HN>B( 3>hBlNBCk?z觼JJܙlϯ$Ï?<: 9c).9kByOOΙPk->-Kfzba~<) 03qCIJkly?Ko ꜭFD|JTqͽqҋf p(w i #p⾫>@}4ou=S= #?0jK'.{0'$D<'N麛q` ngsmh>0n=03jDJv,Qף)ϕ_>8Ȏ.O>-#Lt& /`'1%I;_&ٳO=W&q;UAO~/hLHzLw@o!jKI%`.ؒ jpCd?d$ UVh)i 'Cpр\0u'! $(l8D B8A1Z*bfJl^  5F]<Y6N bEh qB@h%$B#qt=1bTjGI%IaRs'IPh4e29pTxVo*kH2<x) &1 iL 3+KRBS/yIӖf* 짗dFSE|PNyF=M# *3ON =8b(qņљhqVdF ѢjiFE 7Ʊj(DYZ|)BiZ@2'|NyJ3(Q OC-|:sZ.JX̒!ah͜jE7=H*5k-+Iҙ0s* ׿V#NjnMjU{ضuNl[̙@ fю4 MiS[ղv6}hb+ۨUs`3U*6* A7S),Jh]obӊjGaTgr\F.[fN*]N*xr#8io]z+6t4/Z֧ů~[$)%%z]V(ކ-" N 3$rx*IWUh5]kPWÆ&;n~[G+7aC/񬎇u'㌣9Gvf̒ٲJ3E& }h]32}ґ9^Keܭ*Mzzc3ޗXR]zH[՜ 7e^4LlΖ3iW֞L1Bڸ6l(c^w :so 쾩{fmW;ssoϛuf9-26l8B.@\P:9ʭϚƸn/:.?-Ϲ֯]eesH>tUuo&0co;Z꩎/f3l'ש沮B۬cin}m{nm۸7n\tܹz^f#^p)r{Lp7NWs?챆)~Ngozn@~otEC"`ľR#| S@(~Ѧx%$󗛁KĐWKSO_eu/ \WcEh_1dZ} xePGAG97ZWϧhcU{F||{}'悛F"| pVmy}t[q7 VH(F877$EOX+W m%WHmݷFRxm%z'88|mX|Ҷ/rȆvkǃ>h,d8mGuƄJUxzwhH7LXxKhfH|}HrhF7芭kȊQr養IvU^x]1Q8ǃ^%Ũ~0qRu{іRh\Gy4L.!lXR([]xZe,6sՎY@Px}؄ąQ$HZ`P?X atXi{iu^ YbmiX&.ըxM.؏e 'cx]Z'OȍHHPGwc%GhHA :iX؇HTidYv ɇi8v)C4\9gw gyif{e}ie\pqSj؋t\y+?@И[p9}Qd1idCEEiZX#ɈAdy(BG]U9QUq!xȏYz%u{r9)9aYdcIcݹb)bZNj*QyĘْ] ٜWwW9W,NKiYyjYYà Z[iY*y^#e!#Wz xq'W)ZTYנ5xz |)फ़cF*}8oING/*V7*qoVjG P ^UFC)ZV8X,r:XXZpxfzڥl:Vfs9b6Z{I Mƣ_yL\aꠂ2YH!*,?ZfV`2*g&&Yʳ;_?vJ1"e zm*:(<b"ګ֩=aꚩ:!,hV%kZiX@#JX"‡ XK HM"S- (0K`,L!I͛8sɳϟ@F4ZzQŦk=VP| X0<Ȥ*R]˶۷pʥHCiXiߺw/:8gE |-e*:11˘3kH(6k`@@ a+]"00/_YaPdܔAȓsVoF3@ j̝o<DW&zhJq7u˟O)g巑omT $ LJ :[EgwC ?r(Xˁ ^EVdrY\,eBO=& t$B(,0YbJZ<):Q,F@Frdh`:&rР?/)E_dj衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j+mb뮼D*FZ,D&,>Ԯ@V)=㮱kO?/f4̾NO=lSj0f/S0N'L#P?>O? ;b{D <003LOO= DC~? ů@س4Ig >O;g3/9kSKl5IoBuD>yKw6{ ֔ޖ^1ՓKNy藏v wygm<#?xzD#>3'Z.<$oj*]ԓM.PţOW[vg~cvGv/yF=A -8a=$q x ,YA> "]ORxG[Z9iLuBJ,()ZBU-z8]31q.e<FGps9ڑ&u='y)H;r<$"ETLR4:`@dH8 HȤ?LJUV$=RX@&o-]@')ZR @(@&L9su}4* Z ֗mR?2`bJla,cev|7)oJi)ӟz։\-倄.t E>Id;@>+Q0#I^xIQ*Qq"ӥ'e 4|AXʄ"25ݨ&a:њԦi:BB㽒)xQ'3Tdv5wl*pjs@`NZJU** @M4FZUXL  wʊʷN3 s\pB,m<ɬJ)KNjŢ$%2OR~Gۛ ۲%lLٜ5Ef3).kҶX89.?y|(V9\qSԗr(2 J:-;>4s3Ujբ*Uy&-k^CHMy%;=YD8ʯv;fVGrEWdVTsن 8nepI׹2DvūN9 (q{řz4%qӽu[Y~wfT\iLjvN6\oi5|ߗc*83AG՛P/pZ" ##1sFz'ˁ _EZQ筻R;ڿ0;.qQK9Tc{Gvz-K Њ7ؽfӎ44g&a,PSƫ1 R=N\L<_4Vg*WXҤ汅e3ܞNVS{Bul)28*xr|X.؁(wp(V|s p'dpB^'eu{de w[tuc2zsdzfr8W(|&]UrOFɧrրs4s5]Utԅ?s6kJ({"r~GpwlrXg=Ƃ rtƁX-"xh)؈FrftUvWWxJN6Nxǀ_(7GWr0IWT^&Ixi"wy:d]t~swhEH\ghorOh5H&M؂Qx{LIB{ZX||͗(}3i4>c6c}cQXh●ҨN%R~t}LdT~x(ƆzȤll@lv(mE` <2$y!yb*isؒ’0^)96A,[7vxZ7hp4cU g[;p)t/9l[q.I{ro&G.YLדjȄSsżi.shH!XHW?(jv8ZaFx(|(Q9h\+2YH*\v5Tqww4Cfe7YK8HpJyfXyGm}SHUIOzϸz(hWbҕ?vƍS%H)+vˉ֎:L"{(tI깏 ٙPm䗛kl~k_T3Zijq mWw< 0z0yܒ:JX<ڣ@ *4:Q6:&& GCBwGŸf\oI`ZHho* i!lɅn):TNɗ~*!lD(X:Yɘ;ه@i8Z*Hکen:^WZ): J(MZ[Yŷ HZT" e#Mt܇Rt,zh> r|o9RקcB{q{z[j>rT@8 iʭQVqF* rU ( X>d+)Zq[rѱ  kj( #Q:-/K yKwvbqڬ)W\y't \hgSH(sI+#jjOkJ.=FL #ZثzG;+WgeKGr˧S[DJx+w2~ %몒5k(-13H6;y8y[CGgɩaRw ~׷rٴG(J%ɦZ([˹RJwlr1RgFm똢+IK[;՛aؼk[w'˛;X٫9{ںg(+aV[嶚&kG#;j ۥ˳ \k-\#ljKkpڿ[614G|G:6*@:X[kX [l/,yhȗ+Ĵ*Y)(z0V%#T\ܖaLcLmL_;sklG>!̨#J\k`Hk@,?i ɑÒ\,ɗ ə[+ ql`HM OI‘,ʏ:˹IL>?[Pۦ:Le\ghAk4ơ˽| +ƒǿ,;j˶(Z\C|Û β\;I&{ϻM:G\ʂ=.>.cO?r.Scmsrp ~)t< ̵M P2ԡ;:JdRlld։Uh\H 28 s*U+Rҵnm`])b?17qq+(;1PG<">c=t٣s^*y>,Y{1`e%hACi9mi^0zvsC =QZV~ˠi>`?:׏wCSf=A zZƄTw9h_ р eHJ7!a2P#2 RޕpVΎQlxgNe1SNJA.zc}[(:Gcqf]GOʉ>A"{`T)9-s =şu*֑w+vwqʅ(pܡMrbsNHsDϽs?ks;.84 Ыw2P vW{[clW>kpV[0xlYz ;G6`ꜻ馥'7YOp[aL Bn8Z-G#ڻ?y鷁NlB?ҁ6eO]kv+dܦmi% G.l7܄PRI.n#ߞ0 5@Lwo472Z5۬&B^-'vE4iMWMo $|n{ f8.ϡcn+zEhT7R<LlMl0Q#-IxL {7sTyUI Շ}?o=Ċck|OI֧iB'Y^W?Mr<ҷ[wGQ+kqeYKGBZsx炈mnQضdI=^@toxwg4E}Ck } z9}MC݆+7`_J_Dr L ]ð]l6;G]Xj$`3|̗?]A{4 F$*6adaFUCWV(bp*fO85fkfR3|B7sXtn4ЇidLqebUEpIF~y؈> Aq<Q!f8x]tugq>xh~8ChfRhC8D7hG:ֲ~u8Kt$];xO6k#<ăjoaͳ NASvCi*VUA:q݃DTfUAP8A=`:gmL?1?8!eSrWs{p~]1&^b_^`'g(Uz,uzVM\z\9UwxWUu?]k>*ZtctVK7ZUɖ%+lO3} VP)}<'[Y ESUW#wgG[_[̷cxcAy3Z'~yTsLVz$V뽐;*cIfF^cq͋%x:3jJ7 ",o T`?KE?c5F):ÅrBfXJیG˳$INr4YxO@|q5UKKH8_i{{?>g5cVPn EK^9uHgJdo9vu{vwہfNvcvkM`9sdT$5kұGetj[1EDIQxKKQ_+ɷzĴ)z*V)՗GU-E&)V?xhT 9?ETQbfKgI)sE@:#FeZvkWlir@]cG VDiL:XZTk5 ClZCԝV$=G^7]i,g@U _&Jܳ3D8SC6K 6/@<|;BŘiHRr0sҥ6عD$r>7md *֍6oG焿&5r+vĘrvd>mOiNC7S+)o_y2]w_g7{qZJ;x|p3ʕ[ׁוNˁfSm+u%Jvc oٙZJT+X9{=~7#ڻEɽ!*{~r^JP2Rnj2m:3Vbdwdad?3 ?xϠџ/C׿b8ȠʩIh9Qnͥs-^6mWP Aa~oEVG!E$YI)"@!@ G@lLA Om \`phAANZhυs߻|z5a~i38 _a a KX1Cb /!Vj-J,O>umѢü{=7o۸m/vah{EVnMi//zDo;".4. j t4kpѧsEctȹͩ +F'"0hnR#Ҥ‡P\ȼhqL "Ol/!P/3(~ k8bˌ|H>#4$} wrRJ+5Ɨ:P&@4Лt\IڤS2RZ<̫r6/ܤEaH-L X^ 輕R \ =S oL4ӴH zvh!M˳Z㕷RLc!  `(8 Ibbի|筵JR\.M+ 5/Z:x BKς/B-;yقƔ!} 1QtKK=p%6h%#R 2 aծR$uj#i ֢ZvVtJVr=B'y'ϲ˧!٫~ҁ(K{!'ZPĿ\Euvh;kCG ӥ/*&M7@ԥ ' 8jՔOw(J*1ʠɸ@дʭ+zYmk ~}#+!w1?K- MEz +wcu|!@:+8 +sd!hHAP+da B(Cif9P;a}(n&"=/qAZO(qב~xE,fQ[bE0Qc$cxF4YYP\7Qsիj"uB&ȣ1Vc /R )1b|) b@$F> F\J* q_shC䎪ʣGx64D SyK)9IAd'y^˗+/Tr @U!jњXzx&kiO-Ur MV&q"%V Bр,aOPШEI|; B$HGi;EAl7)^]+◿揨9`OSuQ:,V@-Ѩ,Y5Q dRY!c+!Z?0{UZs#=_{tr%ќfܶm4} Mĸg$[2r`HInnՎ |"}W&ZvxCDY%vޗ,uYK]Dv/QoLT$ڂa}KVMSi?7aezk,, S~#u%&qwЀ ShJm:f_A#H:YCJ5f3 j }hD/tnBhHGZ+/*R6c'iPZԣ&uM}jTZ22iFjճ5D74fYc[.(1ȈEr$#YO2lN(gLj=P$MaO"&6ę9fOyI(9I/ R ȵ9N+YWѢWXtRDz'yCY;2RK4hf"y>Ɯ*gTrȆFO PY=Mw%u0qt$dC*cTH? O49C<&  xe\t C&.JGeP{`RjHE 3PÒ %>Q1k#VLXf3bC!xEX|'zb m_>tz/aLB ՠj 9JXB%my`-\f!iEe͵DES,湅30~&ᓘb-Bb{ *$́}ҦR8NMXf m^ӰߕO!6zEpouNo-N'Ϙ(`~[Z४Pb.ȑ*)YE*M+~x{LSޣ9PIIq- !ل"ڛn$*,Qx::-ل%Qt?q8v-'S㑙Q+7Ι.<B?spA=-$He!<>GiUT-*?wA)yʚaaWt?e?7 W6Xs%eT[.}"`BT$CrmZf^aټFg]esR V?*%IV|1s^v2&ĪuCל6whfsm1ihc`QfWg-~UX>U V!ﭜֹ~i;z6 xW+xfNOy YKjrO7Fy,]3yyyyW}5-z%ɢZ툤_zɕ@Z'1zRl۫GZ}Rxɦzl&K`[.loϫ&[v-J\nXL[ EPaF|tӼߍۢNT^1/M:s_:W}ogNټt_3|FQ %́/I{+k*yw!A_ D- ap@ 7lu?Sx1턷dKEjNA0ؔH'Ʊ.{TMy閣ϓ.ѡ *ה띸? rY@$ }8d/=dK5wi<״1Ab&f!u5G<cHO?wZ>9z,>IK˚rNȚB% lrP&v}_MnҼDeSIWU%E":NDWY:Zf4eTPuB?dn;Am-o3l8s!oS&kN%a)cZr! Q"GdRx$i |:cJi%2iQzZo8gBzrh| b̻\Sc񔇏]!*XP,3;$Ht+bQ!)$fI`l6*K I(D !3A%B-Q:Af/bR$d$`qe>u&թ3uhnڠ6=szXmқ1LhsR.5NNt"J&a|Գ2XA!jIԥ Wդ8H$*SխGiճ> Sj\J"zUU*׹ҵv+^׽ABu%NF4g1Z+H#ћt~ w$:C8gle&//KI46l5u6mxs RuŒN i(-yF"Ȝ(EяF1ciF ]EjaH&Erpt>.@⿚iJR2Iť3 dΩN9-= P/Hxƍ.pڼFj;S'd;su+m0WZ Wlq;/?PgZ_PL/-lr_d0ܙg+R2 Bf\(K O{?!-qoQE {4,hegt5)j>>i-_o FYcxApIN ZQD [Db>H|uX`+>HKLJIJ`nvND_PaDّ)9YI5LQa61`lP)`6EPNM!J5P!aع`P\\qH PPDDP gEmMUAaFAUU`jK[Zr U@C=4LP\ "8OH"S#v!l$eğp|*y"iVTĒx;$8 AhGH,ʍ,B!M[Ĥʥ3mxfDg?0F3[(ăX\9}!:u'<-c(=HB&NGU 'mЄ\?C֔HS^!D>AN@I# lҵŔMؔe$OOJa= RMBaFxER¤TSʓ\UQ-G4C} T^y8XY}Vޭ KՈX=qVܝX%^^%__ Yp_&9@a5 AVVjA9fk¤efΤlX&`j%czA!21iM}ؘ`^a^_ Yf0~̄?ٓ^Hx hS \NA K:` }b}g؎Ai% ֟͠]gC,zKiJ<.^ ]6]VRuzNҝ"م@OA //&./6>/FN/oPV/fjnv? ni6a)K򖓺%Jƥxћ)^N(ɆlVR[.Lo.⑬nfRMg aPq;.vp}zZmg9&pXn"1X@ 0&*2pI1qn`bJ1%Vh1ms-mUm5qK$ԁHq±Eq22rl+!S"cJ#w loB &<2hrprNŎA(D|J%.la2x*o-s-. DHUEh]%srr3rYXs+/s0Ws\֙ӃXhn6\ĕCN"2nBTDp%_45w c`?neC Z@@.ԢBNt X!` MB\PAp'L CR (RQ 9)b׮ٯkơh &ǹ@N@2΁`~яM?8h2p#>6FE ~  G*-8Nˀ<5/ 3e)ȶkˀ?Jpۄ&'E?n~|Dr tv'Fa~ϕvx"f:\I|xe:%,Dwcǔ{\F@౏a c갵j77]kY  ^`uLaC`[,wɡ8/(|ԙŘn}φw]㬖geZ^\&l{+ @QpxMܾx qZܤָǓk|{.t@Cͫen{cG~igHmw{EvzB(uBo})U:7AZNZ!k#θְdMKa?⡏QCp:~tϸwXmI=Oj oR?}Xz ~P; Ͻݏիt2H)> O2By>EH/w\Wq:8eG.Xq5h{KHwj߷8$X&x″z(8`mfϷPGi`l2/xqvZ JteO9uegF'1hnQpy͆6 @CtE(&gAW96 P~5Pwqv%iiiW]8 ЅyO4w|{5  p6G?i7qhu.-gt83@r7ez mv_Wp@i%pcpG̦Z7x xipPCy`'qH{o؀vHkPH~ꈇ>5 0h5oZpiq 2wsHwG{d =8 fIwzLg!kuPPsaTgP~vK47b7p?{q 9eKfPm7 _X5jG},-Mrܧ0T W9#7DDxkGۆiWvjmVm(< tw(&Zso\iu@P7rVyxy(sxypc)mV9Vl^vtgܧF&x6i@@YrAZS)H{h|Psh 9 peG虄K؄OjHh &2х_faȣVVZDZ)Es("yLцf QoiǷ 7xmCXOƈ6yfKv{|ɣ:|duciƌ47y򰞽oƊȤ~iGV׋2ɥ8vuɸ·pKhhn۸ ݨs )Ysmn9 鰍b}oXY٧fypj4ftF(g8g ym:G y؏B`v18g.'GjZ~$>m =9R.gfhfG˨xsf> ׸l/YۘsI6pjMƝq&9TiXi%[keD60ofL֯j)B;g8y5:tivxctI+q6yMdP .:KFc_;IgژتyF)H۬yc@۷Ӈi8 )Y&f9돃iyWGz`;knireVk@P{h ؙ<; hH=5v<*5|]1plޚi'}Zs .왞 I,x!Ȕ'fJXSp93 עˠ7«6_8~<ڡBfnHiڳ$|8:<,d.-7oiJĕQ,OKW(_<5KRk@%aX H^v[ NhJ>Ŧoö)ׇ5%wzh|^=ƙiX[qڔr;dnMz*ԪFXSyh8h[n5[L5lqC9nxXHҸ籥7_ PgY8M # $8'<׬k h=ZVՕ~~ ij)g )$ &)ʡ651本5iR :nϙ*F뤯n(Jd+^^^k] uw`xPXZâKImZtvΊxÐ&wܔ:{ḤowVӵBMr:;y'Jـ3g9c(6e ФƫxHr+С,ZNֺWytsJd K Y| Y<8y-q8xک&jeYpP,Jʑ{Wqfe5ʺjѦج=+HgfmȌXü ύmmZT~ܮާ;w4@ $HΦcmfg2lR̳ S/]&]}Ge*˲~46=Σ.8Zy'] P>vzy;\f͵ZK\*]Kb~NMHt9OVR3*p.湦z\-^k_>%isHmt[9Y8yi،0m_>kh ǻyyyr'H_t5{hhəcڦ WۃܫR+㩱b53tKΣk+ݞBwY|@-ܒ-9b* m?_ Q 1(Sjo8hKܣgȉς+M*[˄~sVr"e& 1j\]iy+n;0ȃH7‘tبna6cwPBF<bE+J8Cr1I)UdK1eΤbƐLa =kM D @ngt@&NZe~7? qX֊ ;a… SY&r޽~`^d'$cٕ"7~:r˖ZgС9z2? s20haӣ K|`bɏc̪^? 'U!zSy:hfR׬bSN3 `*$,ꨠ@bw *3+>.+*0H}ҹ(0gHNzDݬӏ)|O rʚ$2$  !Lb#t-;6yxj-Čk.G тzT3;t%ɚϽMN;m4L#3+:tLOxLǟ!;ЁY :m\(E$g&jK+ڒV1(Ւ+2 -mR$_5\%\ Я1Z 0p Ќ[t5,h}ܹ-a1ȥɧ2xyRg7R̼cV&,}X}vv]V܅~s&f_3@ PZ=hiҠwM5Y7zl6l>Bp?Yln5T˞}ꡓE)n/2?4|r+r3|s;sC}t5}zJwucoM9lizxxo;+ZgSR%eW^o_*KzwYD@姢Q|l{,5[o5zd%I =RY"װ! DRu:rR+X'{DLDǑ}W&9;O"o]`E `R: ኟYP+8ZD,! T\"aV<5 1a!?D9h7AbSX1\GlJS CNY M2HW̚vl@9iy49^Hُu |Tq>C*mzitA"5t6(dR1V]EQ'OyI0Ax#tqڱRqx"09L`KZ⒗&% >Sn.i@86]Ѫ37.bT =sD'K0WiP1Qԅҁԇ|Xle΂-@C"w=>3ssv  z"OHϪXme_ Ksǃtl\Av./?uL?Kõև;$uq+hcUmFy6מ0r5AfSNBMɀB0p/ɗt6k=r:)sfpÈG/ҧoKd}6ss}c.SRu YjUȀҰV.;DͶϳR9X/;m +#G(ޱud_K[9fw(ղnILB=lŤ)6P8i'!-)p^ BO#un TF7_ɒ@)Ex:UZͭVXIxշ_AUЏ,vV)mctu}B=/wީ]+/2)4&cragF$; N\8٤C_} 38˝{\ Tt s ;5<'0A3+1#>鱸! ˟! à 70){ Ȳ 0 ao93K͚5 9r'Pڄa{ȡ!Ʃ2yBtI2@- (&z"|!3l*5"62I%04L2HÔ4\4+5C^Բm#l =#?ҊTA:5KLER |y$OD[02 0)/6$Q g۔ňXƷ6^iz\=:kGht4 )9:ܕ;L3"J,={7sF@IAЁF? N.%+;HKE\4` z/] x;܌48:Ad)mztk=s3mgLdT7C "_K 9F)L$GN"s蘎,; 7M4VҪ;[X9IqCKs%K,CdRHp{ȷyfg7Hr&oɠ\鸼ds¼WՠD!U92 ٝ9䨊VqYku3{Xa0 9^q9֊5VWXɩ):Rc˱{ G8Z˖&KKLʏǺG)(EI2ZNKɏ[CWEe+0ż@E7Eº$飒S{ݭ(`ώ R Ϸ YK\h^aO m; $/^A_^}___3A$_%DQ10kц_NԍA=@;RHR!pRԋ[Mv`N4-<‚$2AC1[Q@@cSCS9%ߔ^S8=>V2HlĊHNf #`TxKɝlISa=)UX]L-»m4x%Wy*a8ƁH$'bUV@F|]mn42L&"0ENǼXGeVYVA9!djå9*ˊ0u%weOTH&) 8ȓl:SDhyV6)`6>T #Udd!>atH3)4i%N?q0] SӉR  N2jU9]7] !VNr>ܸ&!@ ֺqD0$z9Ԉ Q)2EMUZmʼnfQʹ_n]49ㄝix}K޵aQ0֎h~qW<چ~hSGjmuٶns\%rjZ#vm5cf;{%ih&ө>訕pFtx_wګOImp~qVyyyy nZy_㎉f}nVu(n omQR R "F*~aXmoo`oІg +eas- :S~2?=5e,9ܠ\{va {@zv!4-\FԡġdhqND2EKE pcO4 RqI ^%HՅAf:dctd$/cFBzѷ%FN>N e#&Y/%hUL3gY"-e\h[}Ԥ_{sWg:B„ 2l!Ĉ'R|aC/MBLQaa"5fBw/%OdI m"yx CدH?qɮO{FkW&='aW+ذbǒ-k,ڴ_yIgH .P vծuBD0b@{(cOT eMI2`0(CKOMONW5uVM#|‡/n8YN? ϑ ]tuPN0N-16I,^Gvv /dxøđg5 KJy!zء}]g45Rv%] ݇5;NM scK 6L>>c>$=4FӏУBOiK@**&D:쳾Z{-j-z-;.{.kY*;/D(!-4̝'R<*?:p {`r)@Mځ!t; 'X7-dL5ߒ>2hO7սΚl/[+*'"?`& 1s>]d%ȾL)E@ L1/"{r™OՍ)DX'[˂\re 21eq2W}]/3vcOf k2' +@'B'3|ct<ԣ|9#CD~P"Èccu%MI=$~1NR4E(BL"mIBӏz(5-U e}$8H|,JP e!JQdT-3a̘$C}uS:% &0ͱ`MAr-{AJv-3j1qtbݥB0ϋ hfnj g:Z2ql))2v)+O T!* #"H@EZA6G;Q2p# 4J)q$VRrŴ&SɦAz-N{v60 vn2KVHsǧJ7-yɜnjN@ &.KX@geؾ.S83S'8KtzϝNNk|a#-K*4. ݘ2)D5_)yxaߤ۷IFMa~ϞVA5qRdtWjF9y~7L$MZYa#7wc*zn~:B-'C5y+(ԎwWpK\GGxΏ<5=dK6BFHv]y769А 5# N]S7!"CLvΎywv6]LK|>)?t9mY^Í-Oxыdr@d1@=QFe?&<WhB@SFhaو$z[=l!xyX7ɌGQ`~ SFLBx%Z7 6H#RQ&eZx1))Men^+qZSU/Ep0S8S SP 1M1@ Y)DubIb%"* fuGʿ,œF$SYqD(,!.R/"11#2&2.#3MN54ޓUDɥܒ`LDM3JD4N#X c\:zH5R <6]xW%8B0S#s$%Qk}>WIDdjiQ1[\.H=UBU??rq֋ș N~P^MC?puMڿ0N`_K\6=D_.&fffn&gvg~&h椄&i&g*S H`h&l AkƦmM&aYDmEV>dC_qL\XC0?tcVH63Ċ=PWcoKP^8CtZ*yy.Dz^'uEDnŒIU Zei;HU YCc{KNO2DNNăJgOc֣p&{XL͇EDF`%G(fAēSV`l!輈QĄn]$f ${^ Lm~|GڋC.i->)X)%ڰdihuJ%]mXbv#~(c#_V)BbX ҚMʟʝ+nJQLʢʠ6 0vñY4hp m**fꨲ&ƪ**檮*v*R+h&.+6[*F+Rki"k.ef.B ̠8Tbe7+괶+`#Skmf8p n.4J«#`knk淖f ~lL%;HT0"Ȏh,hѬbbrSH$Ϡl,Nl˚lVHH0C2C%$VՊe Z4;nf +JK,`znGAJP夽%bQZNgkbf] ;HF ,q-lP̢-S^$M[eeևmme`^_沔 fW QxV/­ɲ2&ξl@JAd&kn*B…~Ү\Fq_^+%*&"/neDZmFJ .K0ꎄ[)%ҚeH0;+e1kί]kN jt`*暭!3 co?+-0NGr1¶iDb&hb.D g1s,I H,2R2-ⲳڪ@.-0.Kr11/+/2S b0OSg&b3 t7t7{s8c9S@!B,^ o*\!A #JHŋ%>=I$FCDie.cR$H*?NySNs63BGʲ(SLg>tI? Qkׅ<2uSVdU;`Y @vй`u.[sanmK|d˷n? }Xٗm:1eL 깴Nz'ktT^Jnǫ=L7lռ;F3lʮ2iqޗkK83m؍n-0悗[2+|nc:a͝OϿC^j!, c /3逡 DB *  vhD (T(ȑ!8,c -i0 PA  $aDŽy@ƀ!(,l(0 !,"c ` C:da‰  !,*`  #8`A!4`BBLHB  !,2c)X0?U@H"@0B $' 2` !,:c"e@` ? )c>C()hA ja=B 0,AX6y@|)\a MC !M}gCv?~MψfX@ &a=L0Pv f8k|} X>*6y1lu\#Ö2 tb3)6%͓mD2cC_pEN@ Bi%}x:]Ηs\&6Y0>&;e2s16'JNRkߢ?R~{eGqbR!a<\crh{ۑ:ql͙a?KV-[?͎&DJg;i9J2lH_ڷ# h@%JQ|c MԇEec5*6ѣXH1)RmO4JϙRjq\dX]w*Sm]?z2;MP:z!_)Ak@:QF+2kf[чOg,N@@Vmvo};>6< 7g{?(ã0걏 d,E71{lds{ݜhMϼ0eb ROlcmkОibo6;bˣ=;8unpQ7Ϭ "ƷA܇a'[=}032:!5~ȍgc#96Ȏ *&4O9FdpsasGXA\0$gAQ?lfd BGUڶv \#?S -F`!lG86ڑ$1ȁђ{V{_J~oh˂ę EA#"c\g̡ui  -1WfA=Mk"Kl?dV{!S \FOULV[Ҏ=y]k#ۻt\byYsX44+:ݑ;D>no@| >8q 3ݩ2[*lh s}#=vk;ɗ%WNu4Ul7"#׵NhXyΠ"3i}|~WYH{֪ ?@(uy-%kS8;peoy]?o jDe~js& sۛ=?xU>Bl}ծ|P=C-2#$33UrztKA[¿og `Op 1iWihiiijQ~+Ezsw{7nd>MvjshKo4q'==j-O'%ky?8makvPo&k%Gq44VxP'uM^NcllneMB&y@<.n(04?_H ak͇to>OG(5#~3S1GAjn=nTfi|Efֈvp6|(<('rm|hoTC(x7S4-Plt:GgFwJ5Bd5Vdڳ/ w$y#Y(y'm^Vvc04Y6y8(kw$Axe\wvg?idlnWZSI3L9W?wy{HwDGuR 3{^6{'kdobeuKm{@cG|{ {e7ostTsPmwjމt46K@82i{^^YrdԵDtdsi>*FFg({UP2b[H{uOh`7j6˧zxtlv4x+SA8|lL? Ik$tX lϬĊ$|j\Ŗe褧7WTrCù'3^kj6DKOpw D얺 Ҽbzy0OKUKHF 4k!]B3Ҵa$3(ic@Ҋ:)=4]63;kcz $ܖlJ+Ӈp}gU` zQ~Lį1AlO<D'iW̰Y\¹t- J+DZBrCi\k{,_d?k6O٢]Mײ/Kk4Zk<{{ijr\-d^$y溧Q2wmpr>ӋAKKI%˓d[U4MB>!2.Zy!YR>Y=Ke=Wr@ d̤1<&\ނA[\)֡f꧎[JnMxęN܉iSu#I]& 6L_ďa 3Xț ҠL6W|S'O+p?;x5|.ʲa*O`vM_Ν)o_&\ذP@ %xaIYe5o漙~bREs0$QCoػ~Akv)-_ױW:R!S^8l[\?{,B- >'2?߮4>t:ϧ_>ƋE|`&Ȳ ` t?4xCH*(ܯb#m# -. bG<(B ʞ}PZPēriP jŨtI(|A*sl--; rL2qg$@ 0zBPJ ƶ&;hi%D3""r%>)=<~rjI~ ҢAE:SC#SPQR$  U *3qj8=;5Z}%rҟJ"YU.uTzD)jKςVtӵԂ}T, @]| 'ДSM63à`ʐ h*2&b܊Chj~\=n l2̡u%:$;wcz=aI|xm4B $YF)jzŤ]P6](i;$ - !-zK#]i*)|%'[ {BhkY)}(!Ę?LO(T- *thI1,W/}-?=<25Lec(4s& ?$O_X/FWcQ zDwgaYdz Ae^Ga?ܙTzPbh |`J DkXհ˼{c+TBҍhѸщP q\zUdNsVUUc%kYzxqa钷Z@?#4#9 0qq<L $$+@l8H4)K0 ,-.k]z!0YT@3l۽5;4S59c3r173.3Cp4f2 y#e9Or6?C"*l; P/Q R?T;!V[jYS5_6 \$b+c+d`é+8pBO>Nk=l®F63{rѧ3.JĿ77ʷ~ෆ7QĐʴgl q٨ )#j•8:A'q D4ãq8B8js,B9Fݢ:Uº9KC #1 !ےFʨ4ѩmٺ !/T!q3[;ϡG\IlI|ɹx+ IIII$!z;# J\yTġFI-|{wDk3,QzJ!ʣhT :xJOa3$,xC 84+sGP"2/ ڏ?j?!Oۿ/HL̽@!K߹_@ʬ L%{7 {A$V,t8#A0:S tA;AA AҤmM5☉8L(ґ1=x̢1OA ҙDћ#LL鹇[LyY 0mIID0ȐTȑ3 Im7r4HTNTOC껜 QUS=UTMUU]UT,JȬdUZ|WEPtՒP U3UqSÂ)I`Vى ʿHK#0'R/!$:!pVV78DNL1YM`S|* ;=?]}ݳW^&2 Ew ygb! rcDa①CщX E&?"~]eZax %FUޖ]656P[ 8F'OlFi8 8HPCcP-5i]pĔ\s{X٢dEERUҠeRxdd f֌ֳ&k]m>2̶,^8^T^*ɮ݄͇;"Ȧ;z^fL "%_s ͌=<ÖUwp' , ҰcN vЇU*͒nN.` 4.8 g nnB Fl:N k'N/.Mbfk*+"Ko_1OSbsb13>O؉}΋I؃>Pj7ccr!rPBL1iic6CFǬPgdbQbdlPg.eekSXCL9 W&bO_qSY}e\.ܬeLrYfR~/[je|fS .8.syF[g$qfruzpg^Ɂڅ)lhkG,驠)+k߅3CW*?yvDՓɝȁTijdOve_v=ꂋgאijgvlvmvnY3ngL_$6I-Èwܸ\PU{& sL"bwx `sMx}ʀ?lb"r%VbCm`~_/x7%I7~Ȗ !n cU..$Ty8Ʀri2|? !aY7 hBhw1pw-p_.z{㰪~ A< A.VnOkuFT ?G=;JF}_bپ~{w23gEEe^@sa";fd D e:Wt9Ƅ:#f%jq S[ =8"S]! SRҭHëts|K؂b.V|֣a*2f@293h7>}˗ϝچ&.a k~ÆwwaP+|>IfOa˛+=qÃ߱?4( .O^BnV~O=57AĎ>z? WPTmGpp6Y`o[)BI5W?8݉)އ=}O3Wè0( :gmUeLCRL>9pU(c^>w[iy"b*vOy݇.Q\SBܒ:zhryiK&bK8]zfamMBI $s}(']OuUcI}5t%ZwcZB,ZR&ݖdT Ion+d6A>:l"J$Ϛk]:\E0ŅI5}ԕ;,؜;9fkF08! bړڽS4>@s̓Z1Q[<%^wDD>qJ\t vwdfYtdʹe]_Գ=5F00^wāg7]ӬB3=ćxFsOW{.`A9{OЪ:_q~;bZ{pҢm+}>??ן??~ x@w| #J >p 4C->p|)! c(Cyp6^ oؾ~4z(T!B$N!8? @(( SXE)Fh!>s#(rqSq|@/5dg t4<@qyp Ө7 51thF=职ǐ`(i8F>j0ϩQT?`Neu|b^:0pW5]2MU;$; |pAI)-I$86h2(+cݠ5) pN04te!, _,я7=oCUq >>qrV\#t O{9!=NN0ǔQ F#~W{Uw~C?6@1p~80U\)5a2׷Y,&iV2%zdrV < ^WBC? '#R؁8]H (O54z@u|/]hЏ[DpA&]lpo+~ՉKNs_`\0G>Fqj 'NqeHvcx 9Rn,@7^l7h6Ѝ~ "pi;ߙB׺浯3PlУh 6Bw~( A1]e.HGx/y}j{>7|wOsC9AW,@ !xnx xG~//ȼѓaeD`8y y2!& zK֞Mgn ltW-Sh}#G?hzP7󣎐?U&#˭ptǢpF7f{q R@?P <؃r%VA9_m=;4. D7^^ęP͗DUAd$DBB$_Ud`Q_ԞV@?MV>d.i_ Wyޞ` DՠJ]A!SA?BB?eV9(TrOHCԡAm ¡\QAVA@a*.*?(@+".`$*$a? -͞ߞ%B|!,B4bAh V#8!$":FFC$i`&;Чsͻ_Ln~IgRջ!FLOk9{_ЈO.ݸ֍~]Ͽ(h& 6F(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜2N?CC&ZЩJQJ*ڑ받 O= 4L? nҏ<ZÏk> N?RK-A*= l; >NÏ+i#?Vk.sj?ı@*K+b,Ɛlϻ+/A(,,̂:3*.Ύ1! ;2<#T& ;"T/N"|<B|3٦ۏcmģ#в5m'Z,>ro2=꯭ckt=[> ӵޑn\yƺ/o7yBT4C&73q E/_Oy/i,0`NL<0Ç܆6t$Ü~V0nc k}L[@:\\Aվ`/Ö48;Vsƭ=ǩ,mqs E,[ |Y}LbJ# Lp VʗkliGFw@+#E.{2NU:صXEc u5 5-b|6fd^RHO|&0MВ.;#wd d-]8R$By%5M͎.ã|rGoCTQW0a9Fw0Y\ejEr)B6m p[ V̑*wpkz# i{l?f}lYՕ,BsV> ̗b:յ]45_UF%rvַuKm 9P55H'< |ä딥L6\X$"l|@@X aū T<>JK2Gl$&Y3oDôZ.䡵rm@%Hakfcv]樵ܲͅ@.Y-'_br5oI(&m tV}QsnR k:g-wfnmŪg4OÞ@ Şmjp5?]]tkg7x4F[n hl"lFѲ(\і6B&SXB`H7r7bslho3Cg9g\IFXcojnQAlhvUmR9&a@Ȑ&dR3rW t_9fFrq@ q)I@0@ \Il@*B5Y@PA@P!shM9KsSG;}]8jDh9XqEC)paGyӖA(7>YG1i6;U[d9#)5#+ t)AY[u* ,-{-EyEฎi36)q9GM%U,\O1HIgkW[ZFxg6i*@GB,E}&c0iyHmȇ gɝJ8@ 5h\t-#lU~Z!h֟n  b H9*KXp1e&pf9Bdr@Bʖ@2ɔ:GxaL$QZU$W:3[Zfztb6/'TQ}dVp:Iu =]<(TZ 2Pxl<^Yy)cI^}<`TrZTUʩ]:5[բ RM@PtaOG.txAY4ssuHIɫ:zQW'2stTӬz u6W"Na043C651xFx䌚*DLî3x70ZAh䬩xYwHTha&E()ު@ѡ+MiKŚߘjy Qy?^g'$)E+Keg}c=wVzJDp]$HÛNQIBdKQ8%46FdHH/kS|Y[{\ka:|ĵ&RU`A}ҷ4:wjSD}] m4 wKL7l3j˅K|{W)r{6I`4SKڷ7SNLKSG+m;nN8Q32NaIf+6wԔlk6\(B#LZ09 Ga 1.تUЏ^u*;-)T%5łd˘β@qXD?jJBI(#hl_r \fVljVyЙ*,2L5\P'3ťO;IZX%hh[=Mx.JX֯ð0bĘYvfL8U\6Is2(A+I֩n(}\;{M9VǙ7fK*EȮvjoxأȖȡ7HSQsisɬ 6~Lp?]~X̍va .v)a뼴Ԩi<Â|GnS9 J9?6CuBܣ9pdKȄ<΅ld<̽&"YQq-\76Ck8s8+ :EݚJq<,g-%*LJ:jg E WTzAD'AZWKySu*Bk$<46DҶj$Z@c\nPLH[3D'3w`Y5w +iՆ7¢IEz'5x{LXk3GT0z˳5G@ԉ6x=Ls|1 ʂmmSHյK7[[_嶾|-բI@+M˝PGS0 _Kڰ~{{ᗹ0HMOB3=LC[[8Evb٣T۵;6ky6NG˼N&x@\,,5CK䕁f1,@ 1Ϳ(8;&=$.̪z6-^02>4^6^)}F".:^$hDj@2K9RqA xLR>T^V~aaEé$9Ȍr֚ Ш=ng t^13&B>ݰb lp,D:]t0Wp0ے{?WJ6iYmLz a ըGw&鍨,_GqG+b OF ^aIƕUkOћƝ,ana݌V8ܳI,L?_ξ]?H86ƋRO|6M=FAo ㍫{8/&Cs[a̳yI@Ţ7PdaWs=ľͿ/ŮΣ`刟#2 S'_X4)薿*rZoÀN\ƧP1}raT{,Ig>{'m[\MJ4/;(ƍoZtlX5NOO=9K}|LPBC5P`gÆvTʟMEt,W`y+oxrdpV@*VLJ6YV6NG.*4"dW Ȋ#3ZD>hw+*\L _a;ocKkYDqTäI H5j-`]003R!vߓ+7`kfmX= av RGܔf=2%[M7,;V\-]~ܦ[R#+CV)#6.",*")裤+G}S3(#ԌҰhԛn]c^mQ) jm={tw#blPY, 7F}ʤ$ ,Gɧ#]W,+}Fc+11֌J{|7|J0o>tH \Po/P$ NP(!<)`t.-xD0O1AD@EVTI K4R7ibQ z<,SQBC %#T1`I8‘H[Pvlꈻ bؓ@n#KǸ"| P[F6j,VA"i{M8nj nb@qHjɣi6)D&d}d%SFdq:,FG[s$'j%Fu"j)/ mkTHQI``i$t)BLmCtdjr/X9LIS>y$"6(5) 9vAjڙ$F$bߊVTRGrj2yUd╎UFznZ"xmYuφkTCxMϬуKg<ӛpGa~\ε{r$ַ45xH|HHTȋ\HHlJ I PE4À Ie }\>4/~ɚ|4ʢ䋛Iɞ ?Sʘ |JT3~Yx8ZPtJsxUj0@kz@8(_OX` ˲3=#mtk:h[?ႻmO>[ދ0dO>C<>0n+/0 n(O;r,P?쬬*;lK2Ȳ2- ԱC{* #?>溜?4Ծ#tAŃ5PW󼬺OlojCvgM:.9 q.sʧ6h w;O:|D~-+C: l?~#Zq#$6#зzSs{?[8˞;MM|ʥl?L<Ч?=nX^ =I ]z&3mlB-l9s>l^,&, {:p0uGc'!$Bﶲ2N'H|H*Z1Lȩ-T"8daVF.I2#W1!adأMHZÖ})[z&yKV"IG"L6,?FlbG6ZJ|lƐ汤dOFj,h,_[^Ӟ5P Z& 7Trvcʼխ}camBxۙ~.yN^FُSbsϬkٌ76o&4{|T_8qFK?Q3zÝ_bha>6L=n"aJgK,^"};Z ʐ66Zη-nie% N9([XrNxTyV5,BZ%Vm%"惐%hG֌798Q/1{x>Qʝ!~LtL[+u6{U=Kr%N!睚x{R9w;ogM:mllkdFWP[ڗgOMRdPI͖UJa#Ͻ|VsMWiɾptX[pnl 5󥯠 ֹVMfq k-oNc,U(5c_i~~pCu֒փ=&adFfqt)c7b}.* u$~eTTsx9IT@{*]7VcV_u7Jcdm%|~[dX{^%`X2ydj8"9z+!GiVzfȆaurTg`@(Q@xu~x@HxX@PM@PgTGv}h< 'F'Z`xd[}؉H8H<CJJ8C>KWj@*OZŋՋ'vX]& x (T 3E&BG8]mw]؎)88MgO~Dc#I@^pLot~>(X2He珲6WE60U-)iF|1i3H6(PG6 e5<,>rcUt:=|s/Q,FaiXxxUdY@n9ѳPvQZG\hM@@􈙚@hAytO #NQx{pbx)z[d0zIX~z͉Frc֜ ln$]9Aל[Y)zuy7E`hHhDdeDgq|1Yuhml06iAɷ,f*4Ih isIOJ';l9/WI3JAbbrIl0L\1A\@ElvɅ}CTJNwl7=K 1[J}O ]v,ϖ95P7Yeeor(d7G1^n\DJ{Eʧ#^]r"R n}^53-`:*:?iJ(O$8zCVㄾr\PspPOBn'y8|,Cz8b32O'Iw\?ipȦjx2"#!d8SLpaK 5Fl3ĵGԵr;ʿDK/ jldʤ eF23^pHG\nփ4kHme<v6*Pj4<~X*؍lcb#4ôR|O*9,p:|[v,g!Tm(ͱGQ<[{ ^*sla54֪9Hi m)2'Dhi Z n }|CP ̃tחUE2/jBúk?r`-Rª~B[B8 o!+tMfwpE~ZY/&vcW؀،؎ؐ22ͮ)0"C#Zٙ"sM#"뤥=#% ڮڰ۲=`+d||xL ۡkU)igu)\ťFkǷY6 VyܾǚF=ge]٨F *V"͂:/z.ᇢh80PsVtǣ[˛NIù\f`º4H^Bfcuμlkhkх\YlRU3/ûc{utAEDnD<P3ynr3gYB X,s5NC_n+&yF^Oƾ!71k+7+aStwm<0^.>Z5adnSZ JN*6&(lUdGq8cQ8l3rB5P<>N*¢T+("9ZA}ըFRh]yT1ž$>wJibm̵L(4bp>ļVn}( N$?>^E^EƝk*>ZfNqd\7Qi iG4 c|[O q|N|:\Z0\~K;!Xum%6a (C**\[Xr3ehI;^Z?4jx38fO-ӗ}/ Q՗aa̐l6a(+L@-=:_L{SCv@\D||)(Xjoz/ҖAy ~S&X]/sݧ.L/  J `2V<12.sz-2yR!^˷D0"SLDM3ar97la6m:o߰ax>z :(qŌ>LoÈG4Xѥ<,80a;Q%a$ZQI.eSQNZ*Ņ7)fM1mj1ubj(}Yʥϭ\&R˶H?d |.Svj1A@MgСE&]ixvϵ\~1l`)9ovԲXa5,[EI#S`3CWۏ2jկg߾걲f]MПy*TՁ'N\suW^{W`vXb5XdU6W9*ZiMКvDm[pw\r5\tUw]vvN Iܵ^|хyS/x`~Q+0va qU&2OWEb2HJqdçwxfkϐN#0Rȫڡ]qvBh!xjӹP-"k,-ahȣ6㤛K0:Z3kvwSӍlT>~Z+|n9w\oǹfkYoqK_6)R+ BR,4.kȳܟ_RtFE> 1O]nWQRQg~{{|٥Vj۶|w}~C[ة ]5mWjo^\ %W?NK+ȓ(9)$6X+L`rБt GAӠ3*`6VEPpґ|,:?Vf(d.8J9]({rs>+d#!Ρ([Do+ c Їߠ&6 "B\B`?}=&?vhj>Ph'5AFr2HGGc%i-{9c)1E$6(j\,  ,KLZ_&h ȴ`'IeQޫ?5D,o.'d\ffL9ʥ; Ќd9 0/,T&'igR\1I )GP ;p.ĕ$";^"5be,'2OeVH E/@n^ $qB* tɏ`, ,\ r&*.j@GJEӠ%d9̂D[Le5@ԘC!dH'(ghڄt*s,|}bю A0Ә҄XYŒlg=YІjݢ*n)mk]ZVMAՒHG1!m}k"*RO[uiY/&UQ.s p.weA`P)e/ԇ7UdI9 k^)Qj zV$I)BW RP{` ձ8c]&róHjD.Wrj#26S*;4iI"3SbD(Q¿#&O2ƗOA?knE2z~%ZWc,c7ݜMOc*/Y;Ro{&S$b Gs'{..[)̶ 2I--^*4A28dδPG"yEMZA3iIyh|dLpI(PQފ!JLfi, Qk(T(kaɺ]I fA4Mez:^QEgb}nowfvXe i2:wo5krH{7V(nnqr4_qΐF 4#Pd* /jr\<|| ^ׅnDV?"KBNJV_?с]qZdRmBԄʓH;DOOѳГU䢜;zuW :D;(ho4Vk6rC,07/*:,?\! A74+AL}<2-AA""{.*{=t* BM+BAXB&-"9[ 1K#0 /"J B()-1#="0` @ +#C yy C *>'3A˥ ʻ:a +#1 )_;';JAML 3%'4Ƙ2@6Y-3/g5 Jˍ;c<Ÿ$PDۄE*>Y3Fˈ5K)4P>jDp)ś *B !d*] ?^w.g6ieGpjH$YL@ZlIPC6Dz\ɚ;IɪP,J4JDʞlJP7Jt9~^1׀psoet (JЇL˥K8/8J^1/~KP}1DˁLl˷t˸˧K˼ˁ_1¬\P 4̥ˤLp,'&׈JiHzp88yhJkwxioX J,M`z# u@YJUx dNSsxUj0Xq@`'x`tO4tρ(wpm4 ZV&~_~$e1T t Tp}.rTJ(~2" jOd(x~p.npL,-LʔR*R<~0PXp}@[Yi臲DO|R16~=͇S?@ԁЂ~8cȇQtK1P|e_~h$$8#X\$O3OPTR̃(ρUYa8| R@t8?iVbE gl~ rt-uvS~7Nk8֢ȁhpnXN,X8X |$]~x%pO4d]V|WV2Sku{~ptUYأxQY7-K} IiP-R0Ux(HY54Pyf(U8KWXH~"["p~U\`V[[u-NYoW~ 6 HۺuW2WRܲЅ5~0x݇]`~R8`Q 0pS`܋m[(lR@R~x1پI/~0/V^`^^mL\:n-\JCFNd !j,(QW H*\ȰÇ#JHŋ3jȑ0<Ÿ#:v 0XK HX 9sѣH*]ʴӧA#r! \axT.; 7D'AKݻx k10#Iɾҳ@gh:F\ԇ4q`ܓϠC}QZ_0fi (#.ZPl2ӈ=ȓ+ a-S"`Q P^ Z^Ͼ}',Lbb @=h8 zq( UhUA`@jdk b@)1$J8Y8"_uDO ##R*Qma,@h瘓PJIdifp(A4Z1 \P @qٓi@{袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,3A|;V=tC<M?0$CLӼ StAOBWB\vAV J[囼<DtΌk03@39]~=Üw[Q 3&w|Gy,8 V[ 톑 ~Vߊ4 d{^u-t5£hGrt?;Ή{G^AkI"Ea{a3Qφ4ZٶznF5^h9?MgDkٮ8c^.\F~C;zc vHD"1z\_+Wx@$d!Ww4)lL_~I'nPv}pmҍy Ai#`Glrf[6ϑ'Aܡ?hqTy9xwfs~8+UhjS'9|jճ*RU;XܑQr'яer (%ئHRqrxmF=Ah* aE=wd:A=qQY͍o@X-UuhHY%"Odv"n}+C^8q/UY־ZF>:#n GHR#$B $CD(ؼX֢Ų$Zv1Et+VA8*Am78H9E6wUrssRgT@/}^`=N[C!]n{Izwmn}(όtX)׿u>op׻2\Op.?OkbڏQr_;?UibUשe>gg"ÞtC!IoxCZƯSTӿ9@u愷"IMZܥsRzwn|'qhkM< p==ūtGR]ċ }KѾر);w59W-_ϔ߉dB}l~7\hgPx8x\ekKÀ 8,({ݧ8#ڃ``O(xuEkTD3<'a^:ca` a3aCœaٳa&*US46"v>$vYuQ'?3TdgTbdNwA'cvfwcVc'f+fO*phGStvևMgADWj5XDhN%o r`jnF :st;3v&:wF4Vͤl (o6r{Eto*=tJdE'WZ}$XK.'3Vhr6GFZV47(*ee:GF<7@Fd;]~R@a'sOHaTΦt5geIUv|yG|vwvՉ)Qu>7 :xE_gN1U^$U7g5{xz7UzX%ʷ22249Z6y&VA~WCIȓHJҁYrE9%Ȕ巓QZ\$N[UiY[wŕvCh!(8`M%KP]#VkETW:D9P%Ga(|9{-Pѓ;UT=gAx]GeJ_n=6~CstmzmScV@TMFAc?=2%46y9[VWd~q.V;S¥dIe6B`v)f,g HIJu6}7<&18@uH?釬y@%8(~f9slET0eIuY8<[smu#_)4g+ZsfnyGlRckwL8o *(O8L9}DS]類pcSAy&j)lEgt:r%"鍞tQsn䝫MAGNdVIaPu846Hc4ty{9s'ݘEh\0/WuW6Q wCZG;H{"5z_x~y Oy:EYQu5yàPisJI/ōz'#VYN 6p2Q~zWFiWBڭդ}clו!5Zgʋ6fp|f[SI[% Hy~*ڮn)"85|J9=&`93I7FȃIؒLJN9mSbl):mAI3ycg?9CWДcz(cZo `{|Y0Wf]VvzsTudlfؚC@HƮPjN4qPLFԟԆ}DhN$v +:; \&FW9砉 j*zB7GIZZ94phȴ^+ۥTrߵ A%rJ׽FG44#7;JETԼo㹠;Ƽj4?4Zzl'Jۈ[*k'okC7Eׅj_lZDW3$P ̏ySA7hgeu+u:Ww]*s>ApGFJvx  '1̩u{m;. xfZe\?z.zIj|L+ޫ^{㪹,yܒ*a jɒ0l6jAvE9:ϫۊ[Dyɨʪ/rye1⛁#)@9@q*\z x˸5@3@P 0Μp; ])m=Wc9K8?<͕b;bU5s@@&#&yWӪcwITLN=>|4 <=m)roݷ֌ْ=٫tL [J}y$>jxJ  2 17 Bڰdکٟ]ٱ5Ml0̏b܃g|,_#jVTʸ ݷД4݌cc5@b_VBe4HH6 L)$i9;@AQy.Ty|~2Nݷ c?3Ѝ ~GmnY8R臭-׻'(NyUNH#21^_<=al޽pZ~H< >(KЇGpLӿj wyشA .dC%3xpx(qS W|;oX~,"y͊6s3y3IJT'ϝ.eSQNZU.܊Hjpfeۖ޾|^Hsw_'S~dy{2 {7!Πe9-cgСE&]"8Z5hHA6֪W꾎'^qɕ/gpa5O^uٵO^H>yկg{ϧ_}F/M'DK0ʒ *p? +A⧞61P*cD"pŸL$/Q  o$џ tC3\(IP )%t*; Kͫ a'wѧ2G$/L{҉2Tz Zҟ"M'R2$ P84/@(PDjKV5r`L ȉ q :jŐwZ)Dy")Њ}15QGEN= ߩYfe !_9a۠wF2R)G 鯄̪!`b>J0z>:kOz ?]"'ܚQߪi"H{K%_5hd@0挷ĭ=d˦M(1jNjx R\T鸄S$ej?71B/F r Rt } '5HA ~ lل ԉf _<ШaਐjP7#c迳bl0*ӑ5HQA|x$HsA!pР9yji x}+=Ap #(AȽ R8Z6)qҊܒY!- 2ܜ(;BaBŐ: ?ŻF: KAhHFpG˿ l;ğġ4\Ei$̟ƝݧY9J `[(&a!朡~50M LːYM͕AUUي]kD\':TNkLʕ)k:ʛ͕զ Ƈ*@Xm)UR@v,/u`b!cź"΅E:%\'֊؝8=Fq Ǚqc| 1tוZ\;9iܚ^U*38>+2eT^pYZ٬pҐeY"Ve\e]eSCcHHeb]NZ=6y1e,| >QIVi9}yӖ7lfga*@DdpmB{iVȄg}[oR{ޘzgJTud`cKT d .sI(¥c[>"2\pB>hK))b^UfyP $sPV aUσЖ{++X$-֭1%۳1f/-'vX r:B묃 32u@ T^-P )DXk+%C..QʦŤF8EM%j]1ՈHȞ U Wקg3` }k]!_ 0JXxX9oo^3`No^onoavr(fI-u ev Ih%ounqnB3gO v^hAt`R؄@!D܊`7NKHL٬T^,W+ojӊ"ɝ`HyP%(\&V`ƌ ^)A' ܗ)|p8/kMhE>K#RO>J.DRNCV>t_ECEU bkֈk+|p1=5>W~% DF *jx>9aUBIJO_O^lxQ@lYQ&2 l͚-w'РB-j(ҤJ2mN \R*֬$7 Nw0'×0}gj&YsGoaO4eLӰ`/2n1Ȓ'S P3ТG.m4ԪWn5زgv-8ۃk7‡/n8ʗ3o9tѻOO7ڷs?wynI]+͐!5]?5[OBS`_3GzN6Fs@wǿ */G=\| @QP  =^.0,aD T [<n3 7/rC` %x&q}(??P\p!HC#0 |{G|!?;vF 6:HhBА{|XAH~0%t!g>NJ0N6<%*TɡVLIҕ4[-C[G !,Q7o0S<0TF9#I&3 )H-OƄrcĉ&cCQ!7,h H*\ȰÇ#JHŋ3jȱǏ CПɓ'I\ɲ˗0cʜIM(s tB *pw`1E>@ VI<*իXm|NTJ+v ^M "c̘x( $@T*^̸ĭ]_| Kr,сg|+8"\*3 /myӊ|d|B:/;Zd' '@<w-T!@2hv{DuwD5|- ,@XB%h`18F pC $@`qL+FX 4h@/jȡ J$ ӂ峂)`^D^ܓPFp^e4@?T!P,C B,@Yʬc^)Zre?bi?3ڥ@<|a389@HE"Zꧼnj?DP) 35BtC SRvQ)`7h?H`O4C/I@;c n9B)+PЏy* P2DA png#{3q 8hMEr8a@${l̲@/K ?mh'=p$D2܂\$nq.3u `0' #@8Mg?1h#B*1utۍ<3s}w ptNjιM_w t1< @g43BG@NzCoܥPF8{z=gK5X@DO=Ȳq D)bU9AEfdWi"f<0!0)6u n0!3x߁GHʸ!*N.P!R ! bBP`a?\X2$42 h01"+3PG*g}W2@61+L-b n(E?j%N9 \? '7Q $FCq6$%- -v񋑜d%/*OzUa3ɘCx ,*XO @/phJPjr4%*UJA(_<  3A":8`>+zUb\Ć, H*LP(04`# E+`7`A@LY)> H9@d(ytJ= HNp(9-#JRB $10JғT,5Kc:S4 a"P Q"8 nhI"3.x8@op,Vr Lcf0׆U!^@bH><5d=H`JZv$;_W'|ef!kg\p2r+|HCF;Vͭnw;:-"+]\ୡepAH~tZnezZ# w/qK׾뽯~_淿ۜN;'L [ΰ7{ GLaNqP\^{Z+g|X}1w{Prt"EE2pdVI L6ge8NeTY_nL}C.&cmf1gg3m|宕Yx^Isgoȟg}9#&HDdh (MWќ"ch$>W邬ֽȭRSuB]*x@nR=is3v)GΆ\=A㶥H'aw*ģi:Y 0={ 9wmrS{oD8@1o 97t7\f:  @O;q iHQ6ă*ԤH)PȔD-Q|gZ_z t@ Kan(F9*钒,e, kTRW p|aBnt+]F@pAQ"T[g:AL_}j V!; ,ywS+0CbG]y$v5a„Og}?ƐO?%)~O{Di@N&T,aYGOOdT0hUQ9UyDT&tVj4\5Gzї\AvyQ(%xP* x񘑹'6kI)i1q 84A9 ٙ{HgZh^f™ke&ab65-ũVI^ֹٜYg\cYkѹ5Fby虞깞ٞٞIk9 9:Zz"Vy™/1 :dZ:Y8vvʙb 9AV/v(Z*$13ʘ.9_vY!ɆBZhB1lOFQ : Q EfHJz~a1kcVi* Ep@xw"Q*BIcjljhjtJp^vJ *Xq' _ŕRBwr0r#5&To' rlWpm`sgq Nr-pm n wpF.7$K$ !N2&L @w`bSM* :X UjpC$ 7rw*bŨ[FI{wvSzyW&euJuGyb7! s-ٲ-WzOwv ڲ P biaj OMQ2-S4 ~*5 BP~1W(}AgZm!rWs|Kvq~+X70 ىVHV p EPR˹kӄX@e$:hȂ}Zȅ_[SXU8lqY[c 1{8ɫ\%b3sк)%Э{ m =yC|fmͯZ}he>ʤQ!1.V .KL Z̘ܡ.KJe*n,;E:6MI1 _ N}[WR֊z,KK-mMՌ:A1Jz …z̽خj#Rƻګz:V7ʊsj nJa}r#:J ڰ}nqپoJZ Izpu2Y)}G, [L[[wwToyNL7=s7yi] ׳ز߰=,;>lfw.:K*+w?C;kMWAN &n !2<#4[k^bK+ ˶綆U0WUB嵰]AFn;۵1L~W~7S^9}H˸i-~X񹙻)p-~ -T ;\5 3Q(7MkQ>x8T퀭-CBހ>_L+&H&k!~m^<(p웾C?H b[|Z|+;]QlȊ!þM h\uZL5O`пҏkυ ]Iܯ2 ҸI $XA .dذ@%NE/4j,G!E$YI)UZnλQ90޾8Xp^yK6kZܜٳşM*/AҦ.x愸g^9 kز#_JY/;Zd77M.5 ̡j)k1JΡK'諆 :ySŃ@,`p0Q ָ6 2A>o@@/;hrh3ܰÁ9yL`e26G-ǐt9 WfG h1""Dr6-V*/a zQf;,&#h2n'Zs~!2:*TOa}xeFnd s'~<Uԁ0"y cj Yr׉vu VIVtqbMXdeVjhTysf)F%(٧ˮ E51@ȉ/*ہMT߁!~TYQ7! 6v (ą8Ą^~ ;( `Ye%Hf^J)BZ hfp֙gZff u'MuCe gX0޺$wSSzo3R ry5E 뙺ꁚJ~ ?iDpl{&Hh\$ ehٟ97ԍf@|pL0e $NHuh ~7 ]eixYMv~kHq5<բƀB?ofg!IYjֿP@B37ceR 0-:L pw7aV`?iXڶN .V*8DM :E?ġݱk`8+LF  XF?=5эV`jSL cCw~Dr$/h g N!u0`|3(!A94H+cItT@=7st%,e9oHxBzL}o]ќf54`# E?2~h2^dĈh81c> 2iX eHЏ<68( θF?e T%iIbRPT4*őE"؍t D9TshZ괧" jNR$,agNiS*CZU-*FU/$]ʚ.QIg;*nXMr֥+z5de%rY B؟ȵ*e]Z0lYLZVZŰuc+hp=.$Pyn< 88NrԧD}wg A* Wnz%ȄF9B IpW<~A⍐+NT$h @.hE-zB^ DX"ɈF6:-ѝTEe@ )I~pKTNMpt;iO^|5ĹÈZnHL BLl'Mo(U/2#8ApQ{@ 0:X)z2T* VpK=Ed! ЋJV<\IxkqAUW~_= ͌m,ђF. +\b!2TVݏQ(.AP8;tngf&_Y*--nPZ?aMkf5q-mkôxȭp5ic ``݃~!@ pF&W56DJvpYsK\gсYcnZ~ 42֮[F黣RB˾Fz@v!@ %}>MK?UFkYW?^R)@2p%E`@ ,X~@oW V>~ +@P@SYkBor:t$ג2A@zR׬xF!)A$IZDUCK\M}Z(A=f[îMe} ›+d -d/$e+(|[=_Q\*\ͤTčdc\w4\YEJܦ Cu(ǝԼˌO:\uWEiɘp0~%Xy({ {]]u^ZтUl] ]Ɓ=28tPzH0فxUZFy-yT$ߪ Oz.@_^V5hX7:Y5`` { .ʅ)2^mP=OA!E*E PSx P|e V̌kLCXt;MqYNaꍉv] "jЂY1 c]TYO'NLbM&.n/0]p%|y@&Ђ~ 7.F?9 Rܱ:Ӕ`;96 T)d>Hd F>EojZ8/҉~崅 [ P ԃ8[= =jWS# %RVmeֵe0ׁ056s{$}6x0LSvv8aa:=ׄ@@dKقp{YYqg2Z= { f v"Xxogh%敧\)h%gY-݁:5˜imf[ CNꐠi jbiꦞDifꨨjrj@ej/j'C vf$k*؅ݔ݂xO]fMXks^pli9pgC:mhhZ_\jop.7~ _(SpvC6 \. 'i38 Ng^ɀJi>faT!)2ÌaHт&"+ȘZ ' &Rpg0$hh⡆-F4MbWNtIWk7 HVNdFo.^pl@1yZh8oѠ㡾cQL{c37z7jz8'mc1x>F_d&R1R8%S:~ S'8qН w2x5 dV]妒ghf%7jV=n۔'e` 3W tFgvHG9Xvx`tlp_x6H}~gw-x(ߗ^{~@`?fRx}F_G fD8vJAx()v`( `c2i@Nvtabj2lur",tObzWdvPۚ5yw{WwN JۀT'z xm|jɁ3O6n fk_xw_x(W8XzSx<,ywFaWTɅkEمx4"/  (~e6yuy}M7klc1 thokԍ~xoF}-8mHqH_{4"I~pDs!'0{p!/ xb` IWf'ԆD̷ʂy-A}nȏ || tR ]ib%oBoΐ]s}{~o}vO*:}yLtXhz@Wnkф0Q#H@^~($lÄm8̡*) ~ܘ@aĔ*Wl%̘2gҬi&Μ,3)gT?*4!9ʊЯ?f ]9`&ϥbmbڏk?F_e0lq޲zTB gT?wʩ5!a+^엱ݼF x,̚7s,5F$ұ6`j1xp 1ALv?iնuېQ&!0૲6~LJhe9~h5F`\D#.nh~ѧWO];= `= h <%r9-x`HaBc;=x Pp"c∶Oq/ l$ -OB#PP RRO$p+$c# Y)&mfo}/:OrEg?z'rZ/-dώߐu) k؟uQJV@ hA DyBa_oTVXB~ iG's еLw)[B&hXD7 QCno$ I(<b F*V@~P =Q@P BaHH,rJ-%$ FH<@9"!~ЊXbBpzCx i W股 ]E.t ]QÒ#~B62E$Wr]@!sxK@4ҌR _CFWR| 8sts`yǞ+Gб|(jQ٘ ɚf mŸx?8~%O g A@0&2/"!  (Y\6~ HA"Lc^) ldSp X>Ht,HF#咒 )ڏd8(:Ƅ01q("S|PQj`ˀ;Iw&5) 3TaԊkn Δ(9΁tIqF}W{5w? P m`nw۳hur$zCBR6cFkicf"St Y؏ $Сx^ϼ׈@4|pFvF͘-Dltc:!5Hc0}`<]F\g[Kmﱏ dVJU#2Ld?6ʢ A9!2,ٔUXLp9bD$B[")"!B"*BL!"-nYbЙlb+"XfZDT 06c%F aD4jZ e86(DCʩ*J9:jگMN#8 [?Z@=C !cBO,ϿKB (BB@ϗ[yýy[Ca:1NũIùyI Y D3-C:V8A< H$ўuObIYMGJҤU?PşB*W]?]BeYUQ±O$])ePT  XZ"2Z"<^K$D9@C.<_E%̌f%&eeol2$ATc6>܀| >:5'_`ua/ЀHD>V<X!l!{.ងJTb؄ >4P ^J}$Fɖ1)ɢƙ(e)#XBʛRbNg8&S"b.G. ̕Jbb*h֞=ꢂYĦD~3b,:P5nō5RZ&8dj%籔㧊*D.<ΩD́=kC$+ IAVH*v%DO.@ (D@lO$!G[E`YH"fbRf-=DpMN] eNO\UړP ʡvkChA<:C-QN\A,q4ekk2c&NíUD#)meBxaJ^߽]A-.@?xڙ*e\bE`~],2WR3`*yt&59mS.2gfBtmӵJBd?@dh[vٺE'PC YrZfK .QMmUW`_DܗKH.Zn3 Rds.vjw閊,FέC*.' _`dJhGV`?oKojg30cAV_% (o^/:Є`DH<7.Í(p "'- vD~W X}կg/4C?xWA[p*p!aS< 8Y6D-LqfCt\ 1F*d蜯i"6p1na'O1M[bL)ؤFk!/1#OYVdGdYwKhY;Q5y_V?\`D6'h} ~bfNChDSO7:6/<HD C^{0es} ;{aW!%(& LF W:hhDӨuz&_IpC|uLPqD;P8;0A4ˋd*= US2$;l$k;Xo%%i&~ q,3Sʳq<Ǔq *+0Ϳb$> `F(|缤i[)X-wBP2rgƨy6[4S|H}hsc}s׏E=ү=3'mRaMk{ hxO+DC>d[@+H봮L[D~E۽}oKcfFKJ}(5Ͽ%SK\D` >QɒPjoTQ[u>~'Zy5|Oթ'J8~ޯe=d6nfonQ%)%q7mӹRh j%kk'/DdN^.w6׊U?^4lbˆ)`~ЃxF Eܘ@E Ι*G$JI6!#ZĨ/ B3\TgV[vlXcɖ5Yk -شlw B,DW:npÇk⭽pHp&LADr j`ѥӉ(/g ׄ@QՊ-W+vzt!V~lrK1xq ^c^|J~1Q"BmQW 2Ê~`.&#Ȁ(Ĩ[Yti(@!`C‰xQ!~Vbν}H }e{lH$d1v`ǝ$@@4򱳆 B6LX:PA#$(%(@~ΉҐ9Tҩ аg3\u]e!0aɼ-x@ v]Xz88"Z(}eKZj]>7c[Mv wٍW^e+p){\nP^-ފޅu0ʷ}헯 ᢫d=XM޶ᓯKaK!qUufpNx#{.oFci]khE$*Q魵ka,h"lvjj븧 _80{  >'O}ȵWгj[u.YYP׹K,v] vAoӦh~KEvDt_/FOVg2DrN qB B+h ‰ >QO8{0@[e#"3A ҏ%6ɂ!(l"Npql)Rъ9a0`nc/:#dQBjAaR|@]pDJ8 q|d$'B1x ˶"@?8 L{ h%OR̲yf'_@/}2]5@f!2b-MҐcsZ!%L:2 !7Mٱl#eDpr$9<0a^%D i`$ pP," mCa"2,hF7ћĠd"%VΈPڱ xC7iy'gfM?4|f!MD3z@*&5l$r~\jD~l&ь D@Y!LEHSٴmi޼ӡF$4GaXP>;ti'@*PT!9E0:~C\ m! QC ,D0sTZ"ִ֒U0Hmoz|E_&%Yױf.%HJV:D wlN M_d7WJiNSԧ?jP9U ! eP-DEPZ L4`# n8U\Tn05  KJ!b, +ed-Y`"P V1:9NuZM*C\1B]J*D iVs,=eu ]hc-YȢg>CY M8{fJ\hG?:i&!FKә]"DP[ԕ-gB"sfmjeI=Bno˯Hq y9TfΖ2i:vn=:Qd׼~k7rߔ.熈;."o2׼bv|\*z^?me ok o5h k×(`b2~$ؠ F"P>9 qPp@{7 Xh6, da,ȪA=G?%o*B$b?x`D$raD(EX+f+x4jI=4ҡ۱*] { hF4d7!o vDG/2CO e .t$$% |@0(EIt~ҩ,[v;"D;Wb14"md{$1ez%o Dx_3o%7%OʷNV `Nv~bC= r|/Op#V*z,Z +aNJw'On5O0J8ʣBJI5L& "V]Jo-]i""c/.H.ߔ53<@+ "JL b @PT6| A54+ oˮ"B 'Z !E!J&ڮM.E@H+mM?L`&&Raf2g:=X2':&`М)R1M*riB(c+W&+reR&)-i,Of-U&pRaR$"r---_,,۶ "!`ۺ02GMosP EP2a,2SG؍:HVj6`X1UF/"'{ 6."~h @`Bc*tszZN44}D:"Qbn3h1+ DGtԈ"&GP310-] " &j0`RM\Z8k"ógGsD/EjEݣEE4OB AU.L?p3 ЫM9LF&b^c #N߰JJ#K)4'Pa <ʹ"11B%q"h ?5rѸAaRi˶`OUtq;.Gw` AaYJiXe}$fgfqza\w6sNHRYO-4+=iwgx9gjV"XylG77?B7OR. & 9]""d"o}ٔW=)Br.w=nYYhYs?7t#.rtfu#T#šeuiO+rL-)if:]x#B fG2WHw+xmLHKɥk}E|р|W$~J?){+Úwj+Hz" Ӻ{ ,9 X$+gڇ"7k+HK'1,1fkGOT_8sSx[ ԋypYWy+(ŤX)-Mfzm E㉣xȌ &[e7bxљh[^ۣ_'yٹ37=f"۱cUW ۔;[eX + j}Iw "ې0I!ƺ2C|"hvu+]z;K\l"bhj= w~!Bh.Ɓ%'b n`FܽM\ S71j&Z %V@Ƒ # @ S HN" 929CM \TlZ ZI|Q\EEo ηZ<"5bh` @AGb`\O  "?#I_݇=34r<"-HЇ 7d!bj(a0`"Fn#ڧu (< T:(IS2]O)\dO9$|p@ a ^( !E,y.A9'; z@7@zICCKyz/9t@%hG!NA "బᮈ!y非I C"p˞P}~#bJT~]$\^FEQ%|1Tq+"Sj P~QFO)'M)?$R=?d*}~cW~Tq`t&" Y MlSZ}/ '+R%:%Y]vk˴o>rL ]96 =N!-!]gBe"~ /„:|1ĉ+Z1ƍ;z2ȑ$K"\P X&z4WVyٵ~(D i=4ҥL:}hч8ZXUbV.81TW˚=6ڵl!<,^ H*\ȰÇ!<,^H*\ȰÇ!;,^ H*\ȰÇ!<,^H*\ȰÇ!<,^ H*\ȰÇ!<,^H*\ȰÇ!<,^ H*\ȰÇ!,^H*\ȰÇ;pspg-2.6.6/screenshots/vc-mc.png000066400000000000000000004624221360716715600165770ustar00rootroot00000000000000PNG  IHDR.7Q{sBIT|dtEXtSoftwaregnome-screenshot>.tEXtCreation TimeSo24.srpna2019,19:23:56CEST豧 IDATxw|ޥ':&MTQPDl(]DQ?{wb{ I!$wr߇/۝4@lAÃk[>0) ibGΞ=nvh m۶㢅N }<#LviVHeVs<#H ٺu ڶiӦ˾<V1H@`Vٶmj;\N};:ydNW*[Fl 񖾨-v۶;fDGز_e] Ŀ+{)8ՠ/M4Mr:V~4 _;Tn8iFv3?7^GCNv& DV Fr1bcX}|J\""""""5}Qo2p8>Fޝfi-i-'Vm;a;=;b0 vlـ?~Q)+BDDDDD󖾨YY(P&o͖S49lAM8__? K-}Qo0M0MIF`PPW@>iݞ44T#񞾨YviOD5M _Ra'✈M}ʼ/zYN(xIF """"""[ixj\""""""rv/-qV>tՃ6:/*͋geV*0DDDDDDD_ \8sQi.qk%/T>g\ݳ'=--x7yXl??:T6|k_.#f.ћ7-W3˗w;syñ,WF;vr>v)QVz|#] n,틞X|[wهDw)tKU7NsZQzuRxټu;T;"%Y|%9Sd{,Yy˕H<OU7o| ]˷%s?xL1:>va ͘ O}Pڿf۶FcVEƖK&#:CH"βz*Ň\;R)>sdӦl۾{uK[Zs`1?o+IaqKψ3$GY<#-]?̢}imԺ=|3cݸy;C/%xVGgy>w=0n5,OøS l[c}\a-/k[o_%̰ N$-?1#?-ALjua3=F\|$v57ݽ-{lnC+[L"ۨq \K\s~ƒHC~7İ6HU(2IYN'IW:ge_@5p?qEӾ $von5)&X,$fҡe s">x:{znONn۸i5u [q?,i}37S7rI {G1khY>ѸK'8'~bEVZJFẖdT=mG6NbOKnIБTۜGk62kܽ5W~Yr$G#(wEsⶣl'csȚ N[h޾5A,V?V["9kW7_4w umLZ"_'L[oȿtx]vpK{g'Ũ"ۯ+fR#k;`lOʸ՝-)w+%oAn}f|4j؀bMDݺ|0-?Q+={i|?g^}3~٣āj CDj=ԽVF/>k:]c^OܼmlNlZMXn7$a\&Wп,l:жs71w༆Al[8ַ gHZnc{ 40Cj8w3vD|r:;-fKAˊnyv;c;7ПF^M3K32~&۩fc:αW6&9/$UoD#iWyca௙8C]n!gt>_aq9Nw$w{P09:m&$/ Cu>ҵ|eտ,Kݣ? #"g%'ͺ;vQuҰ=&>)G=9NSe?VUZ/п7b~iymvii)gחd|z~r7ȜyYx Ͼ2#nF }0~-bX抡RDDR^oR 0nBP*Naҭ9DjZ&&d瀥NWg[67%;4M,&aw$τd>:ΜhlLSrcl8$$ȀTR YBf[ 3'lL#,!`c[ZH 6s$:Iz<&-73[Z^E.)j RĢ9 LoϏB-lOnѫ#0پ=F?ϝYdr "pp$>J! )$]I gt, Bzr0,俐Hóc~b-'.fp~܂Nų/K$<,T+ԩ]7^~{-aWbp8xex:aaa%XDD4ݖH&68o jU?Gxw}V2B9wb3e-k{>3,,L{3:Ȏmn&w8zeի9ԩ%;6`Bjr"[֯"vwofdg[c8?8%cu?ƅ7u.}03hl 7,|sr )! bHzr]0}lm#CZ8O aDE`;=a):ߑ U 0㉎NqN!vZ U'[斉ÞwkXDD*Jqg X@^}N;--w ^yݓ&}QQ&bW*oq8tڙo˗q1jO^ *^zuCcཷS3?4'y7?x!""U᤭ôD?~L[7?iNnwFpu f,:FڝSk,- ,5iܬuݓ.\gԆ3<^҂?7+f=/Ő5hT/#c_Rg38^ZvjgڰKȴSe9b{|փ1Oׯ1l9`ЮkɇVif &<Ƈ[ѪO'ݒg&-G~`yX^DDSh w!N(pV}j=wl}fϸ(=iϧϨG`f)FpPs$~/ʽ-P93V yi ZiEgַL?R!f|62-DDʐ;}5tnG$8S>mj)Y8}E)OO1M ?~;$#=u &""UG;tA\ +0 MD |*:6OaTy}igI閴}\$=#=+ֲ Zq\}NYD/T|JG\x-l.V"[NڻsAxڋHU-}Q+l}fo񨑚<|$"""""RyS_[D|Μ$=hKAEDDDDDy[_[x'(DDDDDDdRb"˓bꈈTy8+i``&V&&\a#H X}}10$w$ֆH5}Q8+Yصmi$M$~#BbZ%(NZJ2qVYQTE8+B.NCn41MGeX# 8??VwVJ꼥/-qV&gQ/9aKo7 +6BZpx=1h{4.kAx=h6)p.v;Wc¿_AlwxbK^i-Zws W\hzqw AL|+A Wl.g| ۿ^8?0 z :EK3] w9p܁ 3^} z}AKN,cGՂa0YeÚ)p8BH_Έ qka i&BVN_S;k!2ؽIZ / Ins? tw# &> )7]!<x=0L %Ne̐_QL] nQi0m1\ VU)Tp#ٱ3h Pạ>v'B9`bqUՏq@b4nP :6 @9\m gWf_d.aWx6a~ i.gowׯHE&$; |sYp#мdSN!ɂ^O 3>c^ܙodoD< Ͱ&HvZ=;9TvK6l]'%ޅN_%LQ4p0*LJA니T1i :4v矾KA.0b5|)m/4'Oudܽ +\ @u|)LxŜjo!RX ~oWCdPn>6?/o|367ݣAa=sLe%̯w.ʞ,ZBX=s ɿ,+ $8 |+c.+݋^бwO7Oy> @F6 JccZ:3p_8 nwsƂ#B㒏~ IAд1 C0C8 &n|_ p8p\bE=")&vW|EEt hNAW|njxEo Zp4/kȅzVH _Y IDATGWȆ ),X`STx]81&p؁E6'LA5 #o(noڧ㓋+\ql]qpۭ > ϱb: n ^cH?EY0z dIsp8N<| yNojc(<= zOH= i? 0Gh: ,aq!fNB[C(XzYggre?<OÎ"2+:~KChQ_Aj_ Z| '}=lmݫΦ)$)tlh w^ AfI,uVbfl*:ӹ~jgqOE_ӄu?@t[s{$oϷÊŐnϽsP6g! ~  cF> Rs7$y1-g@ؾlHpA >SWÉ agؓ[` YSG1_ !i#; ɧb80 mދ/ """"U%=|BV~ :?+<'^Ck+$wäJǽ+Qvɿ1;ahە]_5gkXD0->#@B! k6 qP +^ٯܜ4^*JZqhXZ- Pq8iNۧ9?M#L;B`d&̈́D -SP-^ |9oVzwWGϡ@pUPU>p_=I6VXfkF·LJC@S|149.0hS~bn˽'iy?Kɽ| jrh~`wߞZՔ\\stLMи- 6R$,pD_(**0;paԂsz%(81p1J&UtNS* /S).DDDDDDDciBDDDDDDD<.DDDDDDDciBDDDDDDD<.DDDDDDDciBDDDDDDD<.DDDDDDDcIHGD$B./0DDruTgGWTlҙV=crax!ֿi?*""""""""K"""""""4p!"""""""K"""""""4p!"""""""K"""""""4p!"""""""K"""""""4p!"""""""K"""""""4p!"""""""KbzT⦐SoϩD*_kuRPP)F#<\NeL/UlYc BҰ?ڴo1ڗ˴}3~xF //A/%yxefeRz Q#gpME#Rhܬ_K]Ψ^m\9ZTj]]Ӥ>ql`V_ʖ>wMd1*Xn//X%ufӗ7oHg &̰Vt%fbs?3}\._3o[B+tLesv05ЬD)FL߸^x%[2$4oL]3ٻg% %nsyF}-q߼{nLBZYu:qX6]l&"voM#~z2>>2V/m>{fw,VL^ϝ]ϋќ9DOeׂet&qSٻa!{+e~ vI7f*qqSۿv;+bpHx{?/oV*i|9(5Ft}_;i:>W Ld#xV]7e2j%dY꽅K-_jBi.'vG65qIA-R XЖk_N|_p/8L;G:s?<s@{'R*eՌHhGl9i=5ך w1"G=I1?s!-6l!3_Pcno?V77%n9o8zRiw&g}[S>]Wo;7y8-]~ ~o)/kLi)o{ɿO^L&6Ua;Yv8;W|=Cu:`A.oWDĶ\1{0eaN^1^5Xp)3.⮄D>ﶏn^H I%H[9 `}_w|}ǒ=Oe|^.YW݈Ytu1rلa6쩙QAE+RXP"^k'/Miа22I'N\/H5xƌ[4ӗb~ ~_[IL%ּS b4iI`Biގoٽ; { ]&a5R|"e2_Gz^ _D Q 0eK/+&㯝>sHVwapC7ⳤsǸ~;o.$48~R#X~gHf}ZNwFu\xS<{~jDɋ2NʿxflMGJ_=ћvrMRw򇍫1?cecD pЮSք|FA77+rʉN➞<N͗Ri[4|ٸC289ך ̦ILR q==ٝHaWI_vu2*x܌cԍa԰ۜ5~&n}y܇LLOQ~l_n_ A\q01hg'R*e>\;{XO#-7{Zpv|s;"8j0P!A .9J7G,Gxm c{R( l-S Mφ{>]4ȬɿT`9=?(!_ ;poJ.9. vXq<)b gWAgq%ݟ ?[1nG߶}G2$@sI߶9+nOK~L Yv >]aʈ>_zPB#rP  D-0v?ٔ-Giâ} 3eGN 9!"OrQ&X(p|02xJ}yZYQ桗2s[黌EsA$A g3<}[ _N__7;-.}j1~Od.~Ț~7?ZمEDHK&AMX,m'≼}s˛{dWc |OG7r:;0Sս ٫:>zdドݣ^*J)կmw(;.6 Na79ۓY8ɧ+yq tF~&FP :?^_Fʚ\wmWUc4D1J=yKaJ$bE?Am"?SYϲ}jz(I`xy=}[/&]SWvS緼㫫u~S4p!Wzst^7{gi&)0`mMQX.zf>p>y1_M޹}q_6eEvi'≼|b?o1bYeauM+xn,^)0lLL⋛ԍ˞ f:8-s7pQ)R:k5ɧ¸63Q$nh_-T2g_c޼rlM'z2nmcm{TeT nʦ/V7\Y]h5(犕zsk\:/3oCBr t еl|{`n?sq{s_:P@ϲ}l!|~Wwf6d]ƿo؃oc:͝݋' F8~u~Sli65=bd$>Bt-&K3 ?K31]'\[~gK_)M:Ϫ\glU. /C)75fݺcN+t9oO """&CT-|rINI*t|O"""R8>[9an|bT""".DDě9«㨬q!E/[*I3"""""""4p!"""""""K"""""""4p!"""""""K"""""""4p!"""""""K"""""""4p!"""""""0=цa'MpDDDDDDD1%a9+f:lX˶Bv tg}v:&d‚Тũ A\INqeؾBV{U=eCT&a֟tk%p%`@`3+\_u4n`it;F鉈 G@SW98 87"z$< wBbk)C~а&WE6f1u˓G P? | >oc81w:v~VZ5-3е)da1ҳf ܎vMܼU+&㯝>sHVwapCMcI7Ȋ˜-tnq?pI Syڳi2v;JӒYR`IqRw\Hip@>G4KDDIx=U #xkOy`6h^1avMC.@ j5M7-NYk~DM3._ !{)&ɀn\6SaJZ]wAԌJ_eOBN5Bճj m{5 [%V+7Unsmn?RO|^ӷ. ;FPgS4ƍ S?|p8IB@lglxaĸ̙YnjA} CH&jY>i?= =Bp>pq[_π; =6 ;Cjn$98|X+ĤBF+=o<~I*ͭD垙$L[z1V<8x [GzW̴o'ɐ%&8'?نNZ:>WgҶm,"".5<1|sb/k#QzEչ3so  (:썅-N}<}IJO܍ݝAwBH \" xK10SxYxk *ߪ _8patw`pǫ{{ &'+ ~7;:ͪbs˛{dWc ˲eGC\%wCP,¬%:f;?{EAdQqKq7?-+ril5?}4?fZfnJnjo(&,v`i\}?33̙Ù3gΜQNgʛ)xvwݾW}=V/lDdBb,Pvŷ`kB!_d^ a]R3< qzP!zu@N IDATm\CLH7řNM GA!hG:" yz=з9lZ:cE };Pȟտp|7 .CW8c݂S`8 DdWMΩj=;py{ ܨ6Y%NŜ'WRm8zК15[K=Dw?ۂcfRS>:+nyŒk 𹎬wMzN{֝Wp[N}%~<{S-tw=ٽ '_gKpKAgJk{~OA%MGJG\d˂]G!t4pDߗ}-BOt̃I=x~SNX~D1Je?y枿 +8CͩV7XWR $g c߂16- ;w9<:Yۢj/EUcd ׯ{؋& v}@Fll&m;9j غf3z~C[B_I{$j[?9{p&Hv_U;&>{AF\mE>-÷vKfJpD{3tjS!B!BT*9)oD|J!vğweuh/FjQiMKRB!Ba:`ǧ]WPȉb ^UB!B!̃!B!BZK:.B!BQkIDžB!B!j-B!B!DeZ-B!Bj4&|Z! ~LH2ng*&;H8 {FGb K鄙J˯lX.x&bܙ7 b"BQTȈ}G17yx; z+ι_M/ҩ0n:DI!&I__=lYqm`gpit„̻ S;U.M>f8EBzO12Bu# 2n1|ϵm왒+YN̎(Zďavmu qU .cfKոYk1]N\w~呐Buj=G.ƤpQ:Fߗ_ Bpd#$Z;6KOh\[[̟_s_}Olp0H3kLW] >a^9ɒiTZNb?<ݦ&W]9n) j; Ěw7+O%wTHr9fUeIB!FWH'Zy:p݋g@qBȕt>"a⧥2.jٗ_3gS94ڒZFVT=.Ӽ#;2j(cs :J Bd/4%,3yVL-)|x)iՍ/[B@@ HⵊR Я|x^*akѴ`c ˗DAc_0^~͝ *P0,\ (ٌF?6g(nc`c^՝'Fa񻏆]1s+¹BxD8YƦ/ϝOixaQ$}=KSeQ?L{B!DMЀ+dfB-yR>h9AC@>!'{* osزTȹ[og)0kLW}%>#젫-x|rW8ȚgMfkv\8sZl\z1}uV%sY_~ݓ=A?Mv癜{vVh(Zs'Ȯ'O!}RkL` .v0{)t 8_Ix^M@-#dq_<ԃA=.G(F__zxPdT F2+LW]Džr@+FLlsXrx~z̜Vk6Wg3M^_܈t[yDyݒ.=OPb˾ٷ! T8* @^r#WT3`fXM'S~={ 鄈˯3_oB(w8aO b3ƽb:yOY?J%}B!B!) ysp SވdB슭?^lԢҚέRɓ8׃eBM!B! ʧw]A!'‹9/xUIt+^iB!BQUPB!B!t\!B!֒ !B!BZq!B!BZ˴:.;{}%B!B!9*iMZ=㻵$BoJ8K`+ 3y3j:X(Ju&la[fω_'y 6_ݖWqp[TJ }%<ԕMU\G.u C@?Pw(^)1᭙d0>ܲ z |e Ufh$ */6AZmkVˠ8?aA 0|b8BN#`x ; .;4Ph*D__sgbߤhq/o˳Ҹq70ȇzoaN+}^m4-9H04gwt1`hoH~ !Rw_*A/CD9Pݮ]Y)P!#;eWnk?gٲ;w{QKt*Q-`R5kR%ۼW[@\|2\Z5A =`8x} B[ҠSaX/@fm!# @j[x_˼˯0_53ancɮ]$#*tI[0b"㶑QC\Kƞ)9|(숢uKFjjjWC>90Rwm~2-oA! imMuGkܰ؄pbvptXbdĉOv僽~mʗtt_zbOJ$|-EBA+8^$-9\!ۙ%6cT"-*dsw=qH !8Bر T]oBp?pP*7j=G.ƫp;{͂]Vw{Qг M֖i-W?Ff03:,UAa ay(T(G_yǃcOB΂{ 翇gip" 뗅{5w&x.Yl?}m0dX*-'}Ϧ nBc|Wᡏ+}ꢦ5!!| 4 <|:9P 0xxT :?l;lbXGhڗ .rUJTz< 0QE5&{) BluinMvx1~aׁl^MoZ6V^D|91KN6&lJ>>GxКHZ!jRz!T+ K&è=X7W;!fYvUVФ$@`+=53-N.h&ːꠀg#HO^nз۶vD ?Pvz̽;iâi͸ lgK(@YS}1eSp&>e'&3<57 /kiJpk_׆,;5ՀbiRՒ_hMuY=:ͿrGt$!m8 cBCU*7WæpX毄`1_hKe kL:ު^XE\ :qQ \z l9UL#' ~c[s^pJr/fMΩfMFI ;3.A?s3marD(Ё Sj\50FV\:DB/~ԃ~1 QOG>/i7,~vOqs2YЁ/Δs8O͉˱FI1N6w#| hFS?גxlmF$v-PxeسBjDȋ=e\+"xpۋN-<8E3C!J7_kȅ|gi鲌`@{bo<aAͲ@7O0k9hCQ0g<^ 7ʮQ 0Ev/Pb̙bUmZkmIH-}$UK4?cά}KfKm>4GcÕ&W9FϟyW^ޒE#bSoMҟ&=w).Хpֻodq~-_]燧b] E:ٛZW'/нS/ΙDNdpbpp8._n&-k!a2x{|R<5ƅU n/R Я|x^p#:s_SX,& JEibؕ\\|ЉW?J2a*Hnl ضtZ;#젫-x|rW8ȚgMfkv\8sZl\z1}uV%sYoE=s8Dlb\lzS^yĞu>}DoуL}%Z%3% OctنLQ(`bx.V {GϳtN+8͘}H,K╯zſphi7^\oS!RF({(#k;bN_π#g:FĘWvz<¥~0Fe;W^ {5g?9tk= -m2t{/!9W9GfIWӜoΙa~0ozUcYAl 4߫prNn',i_Lg 5\ж[ 7swP#8'ZE4͢ _g|DM)~v ̝Cv88}A{&p&[-_ǽW4K?E΄-lˬ9B$AՆ<7nJ)2i0 78۝8 WB81<8= %FJhݓ0'8sYr{H>=;_15*J[p%,{p6CAq< ZStK}~7_><$ <:v`[ `^(Yi dGW_` }^˵^vSiu_&5x@\s >[f4|܍` [Gӳfqݫ9;74%Rn0NIS`c<4*Ь-dWaHm p|ꯪI& {wdlKv"!=P:KJZ6LɩSVipbvDѺ%~L#55 +[!Q|B6?7´q6R̦HW5fnKlB8q1;8 w,A12?UĂ'^{r y6}:t/=J1'%~G>ɖ"U ѕM{J+,F(a8`vfɻH 1\]OnKo6wPzL[.W+ ));􈟙ڵO/}0O^*v^Xk1]N\w~1p..J=@Gw2rg F#t  O5v+pQ -G6BB!cƵeTH75#pcWW7|#O~`m3cc;hШ=BfvMIݢ<P#ϯ496DH+ p,8p{z '~ oQ`Uuf3\oyD&KVPi98{6epwz|p}Heo]iMyu|H=߂>M1NlbB>9;^<4m;9Oǩ?/Q<僂ˬs~3O0&#~!?L'.djQ^i lm"b®ټ,e79r W=ˉX^r"Y6eT9ǃ^zGXzLMSwJ~LGx<,PJx7 64h qdZ?|+/TklϑGN^%tbc.Lu!NJ酰(DiRv,\9+hR p0 HsJ^$W]_5 Z= o +N.h&sK]CU8p7QI!+o8tmg=~Jd0 ]Z, ( %6[ˉɄ406)%BQ2aѴf\C3_%sd\U@jx ﬩OoB~)8D. IDATfSd6{BJ=g?:hJpk_׆,;5ՀbiRՒ_hMuY=:ͿrGtth^''ؚ_{(Ɍ܆ESs&KA·+Mt&O,f@g(Zrni{Qz݃Z7uy)^jJG@[p c*?hK,e kR:~2U;oz`Ep_K+0JG\tq L +"`h\KzLK-ʗ3`$􄹟0/q䩊1geG&[]L*~صCoa: OEG;ؽ~Wp(\yW$f;7"a⧥2ísa=+HOȨdo<aAͲ@7O0k9hCQ0g<^ 7ʮQ 0Ev/23S94ڒZzUK4?cά}#O%6 sVhᣱU@ϫO<ܿ+Loɢ[ѩ^ O̻ bY728wȖ]XvBs"ZnV*vw*9\Щ4Y>NR6G#ûݫemaM]]-)|x)iՍ/\KՄs >ے˼;N #[a2x{|R<5ƅ?+_dW*4E^&8q _¬p>~ՃE҃),,& ! #ApPa88vUxHԃnpDivdUZq?Em;4"b&YUὡJa"ϝOixaQ$}=KϺE,}ȏU(bÿ'bK/L!Ds N; 632\ 샖C 40tD+(2@lYϻO̷=Ԃ6-[Kg'ι[oJrN¢o >݄#}kg L} L{">˷T{۵=4Ʉɥ|J ȐO UUK|F.oAWO[Fepl;5Ϛ|-pڝ/ <ٸk5Ջ3bvW,ؐȚx+&veY6GI$bs(_gӛ$ͳ%;ezfCL (R.ѝ϶Θ+I}6_ 6`FC[v`wBfσz*\ ˏP;_f@>(5x&;t:zɫ@q3 n䶁1t{/!9W9GfIWӜoΙa~0ozUcYAl 4߫prNn/&3߆j h-9ûv(}zӇwfB!B!ھ*rBw\”7"Y>bkϻ:[#s%)AwvO!B!0i|zr"WD'B!B !B!֒ !B!BZq!B!BZK:.B!BQkVDžbgDtB!B!{>ZE4͢ _g|DM)~v ̝Cv88}A{&p&[-_ǽW4K?E΄-lˬ9B$AՆ<7^!)0t 5N|kBᵝ}ޚ I-7@pW@oN-ّк'@OO힄Q=Q&Ȓ7Jp6CAq< ZR lah p: VPwj4:Ȏ˅!4 ?k!]oEfbI 8\_2gqn{$`:œW>ٽ:3zh A[r EK ` h,sŧc0f).F+kwWn TȈ}G/C0YxgfY1[!a  &3DO !/, CT bb TI6Ö AxjM'nCC61^l4=aT46)?PY[„9^Wv2bn3jҥg,ǒ]HH#z)FT蒶aĒDm#p#﹖=Sr~Q"#‰Ev190R3Ԯl,F}r afdZ܃C@ >?ыHM3"^!טa/ 3<߱T {5(ڔ/%( H'[TDW6q(HZd1rD ǹ\C3KmǨDZh^!)5vl<tۭMgw,rpJW x ap<먄Qг M֖i-W?Ff03:| COa ay(T(G_yǹcOB΂{ 翇gip" 뗅Q`Uuf3\oyD&KVPi98{6epwz|p}Heo]iMyu|H=߂>M1NlbB>9;^<4m;9Oǩ?/Q<僂ˬs~3O0&#~!?L'.djQ^i lm]Z[dӵ?^a_u`?Eַۣ͡18_NͲ 4b{!w^ O!Iمp3`kᕩlxqY|B2  S_ L4iI)8ƅ GeOD=Sz#,K!<7TڸNF7/II!+o8a'<a3 ]Z, ( %6[ˉɄ406)%BZMi'mX4s3|0WP;kꓢ/ۿߢq ħdY9lP=R`χe-?M .sxm^Ԑ`e'fuP, XZu4} )PUVB;SsT"<2؂k V<\=aap6fc ;@P|>v믁_MRCƋt }5`)fV`Q/AuNF\T0@[N/gH s?a*_[s^pu)_695%%w2ZNhϸxFiU֣Bb*ROt$NM«p 4xHBYq1 v:^bQ$ҫG9?X4ߜ^GvOqs3YЁ/Δs8O͉˱FI1N6w#| hFS?ג@dk:B;2%` o~ {ցXW7y'+~x|@de P?n ҳ1thπ +O篵XB3LtYvq=7 fR'4(3f/e("X€mw['EfWhsh%!9+r iZڑYoT 5Y뱹>\fKm>4GcÕ&W9FϟyW^ޒE#bSoMҟ&=w).Хpػodq~-_]燧b] ENZW'/нS/ΙDΈBܕ:l^oςVB'&@޸ps*KƷ3m&>5Nq)W.%oeX"AnPNgʛ)x#젫-x|rW8ȚgMfkv\8sZl\z1}uV%sYoE=s8Dlb\lzS^yĞu>}VoуL}%Z%3% OctنLQ(`bx.V {GϳtN+8͘}H,K╯zſphi7^\oSЪB܁v0r4x8@uسE^)5x&;t:zɯ$< v0l u|_6̸AIxƾcl />[aTdO v#2(Fo_zxPdT a4Ui Ls%n<4τoBȁ=@0QDWNk(u^Ou_&)&_M>⁌t!Lv]s uf9҇nUe!0\ "H,*s93L^ϿvL>}:>a?q{NΩmE>-÷vKfJpD{3tj23 !B!U}U9)oD|J!vğweuh/FjQiMKRi_!B!`ǧ]WPȉb ^UB!B!̃ B!BZK:.B!BQkIDžB!B!j-B!B!DeZ] ~qpy;Cmaay?;B!BaϡVMh߭%zS_ű]sЯ]l_О+VqGOGQ3a 2N䨀:#o@궼:ύ#7wg=l&&Kqcyp;X{J @'aTOpT!| "/} zvbxk&$*PWW͇ނ-awa i֚ҧ[*!('axg!0|b8BN#`x ; .;4Ph*D_tqᢎ3ˤhq'9~l^ƕ=A>{sz_{gto nɁ-E*i?ϵ~_OƇ/u`ى⨵ !-2Oa| 啅Jy |aT7Zk0BF ; w5r[w5\?soEl"bԃVT-],]*JiU=mBV_VDbW{XBDId$d]  +w̜3g枙ΙsaBHl /^QX1K){;}F<~P /@, oZ1COÔi^_%h7a\h o83]x[U3R3iOd$griFU I0rA.&ނ^2;ʠºpwѲM,JFI[cŇ8JFdҙDŽ[/˹R 1k>IೌkAfes|ϊBDџ_KNņ 1pJ *JeG6$M5RæO|8W(Ϸc٧ qBSe5wn7lSFؿR|~#kr!#Ljؤz7xm~BI:}0Q} 1a''@LJT‰YzzΟ&nM:I6;àH5%TuP%t [ Y r ݠze8E1w\<.[p~΂߱h1 Ðp  mAূ%.mA-Ci:d)7x2 BDřv.<ތb)1}{ޛ7"sY&%L'̓hOwO}eCUL^nh/27\]Ձb@*#h1>vm-аuB#dAlK,4gHgp%Y3*LYnAO޾؞l:/E M$.0'%0q>xZ~c*y#kuI~i- 3Uٰo6w%) yK~g?gIx*I3'CT31u~aFxGsX2^ @6'ݶD;khg6ÕsC$N{@{tR LtWѕ]Cyzxj4KZY:一[),xhWӸ]AU8~PHYz;d+O /˙ۀo7޾LOF~eZ[ :z6 w=~ LBDi3/DZH.iL~΂%3S|;V&wTCe@j?O O_57⬰ ū|fc1BAOB.UۈL2pS5?⍭x~P+SX.oHzLe%eZ<Ȧkb, J2ʪ)Gw`~+ c+xġ,քy\{~ h4UYL\ƺ˖@6r?Ba9ǕAˆQYt JuX>\"SUw1+Ex),rP'v8O{X[= +_t̉[AOߕ,|NU_c%m?Nkm8uʹOe-K_6sX j,_ɳ,U[ЧW׼3_UXO:f,]Q%:A]gWk !MWt>T>vŷP{D._=DF:>z |foGYL< X,>zWC$plZ]d3&CBt#ž[}=:ݹSLUcۯ7i7$'HV%@Oɰo°1X{Ҝjp6ޖ?3pnT wɟ૒,yi^N}zUE).NPXd,=n:7^YĈObR%(ͲiK k[թ1cYx/=MdsthAv<폹'G=(1sF׸LƓL 7SG3'\Vg"gPʒr3uy^tˏY8Va6gk8+q ϩ45o CaPTtd(l` iPD._<=VtadЫ l 1N\.AJ N!)nBIaHOo1c oCz4Rнۂ{.d~q2t3 $<ɐ:]xaUsJ pN$.hЩ..qb+țoNnk\8M O͵шfjI\Ki/g}`?/簕Mn] k=~Z*~?-V,8~Ȝs0OT6ř/5儶:WQpL‚ƛw2BF!>#cODn'   wS3 %7wA s_iT#   P7wAAAAxd    ,AAA%    <+p!XZ^v   PZJ3]Ԛ@jluysWes{K3F=B>}~Fk@#"6M5u5z2x꫟n ־r f *`"hQjC3 p7\0P@`t7! yrՋ U?|Up2H`HKv*O1x ΄º}PrRB0(?Նd&0|8+.6@_c$h9fu/߄(F!2˨:(ʰ{ i>ם /ng>ٳ.=vO8TbQVw>cOFB^>~ -{c, A{6fMi r8iS~]U1!;!]e0%xoVyТŸ^z K!pL-F5oX>&qMaJ]>LU|?v`BHl /^ xPSC!7 fNճ0i,=a,SRx? pxM42Z}~n#`Xxxr)o'lnBt4*  VoAkaV`r݃ºpwѲM,JFI[cŇ8JFdҙDŽ[/˹R 1k>IೌkoNes|ϊBDџ_KNņ 1pJ *JeG6$M5RæO|8W(Ϸc٧ qBS%H<׹>|m ʒx ̠\Y `-Un ";xUniyCZuU=PЭ+Dld5%s+w#w]_]2-a}BUc{!TB󠖡4DOES S !6 od8DA3!2~(PGaUsR3b\!&۽7oDlM>JfO[7u ʆ{r/ o}p@p1 6hغ!M oO33z⋒ˬ{CAHf 'o _lOZ\& I>m-=K`DV_U@FD09X[g (@!|~ގ43A0p"+]@{:@eMxu8+PH T 0wHM0!W \zj$ToY:一[),xhWӨ^@V&<%@xip^=e9sÚBJGc^{}.#ljTwQ ~3A`Bo"ۦǯu!I((Mufh^3,X211ϷcLorG1Q$Us# ۀ\wLn9x ,$$B|}Fg/__)4/olXux+@2c*+).D6]cVP1W݀sټ=l4xteIxk1' \S pP A%U^\= [a2X`0(=쌪R w") ]KTe 0w(X_0R I9`jzqQ B_l;]1M .W7- !<"`/BfRi]`5:ۢN1֞7hoDlׄx$ƴr`Ԛ^ZښJRlHSi\5"A.fĞ%TReK1_uO|2yjI߈%s9j{,c%_fX8̇MSvR;V5)DO&$q]Sߍ/ M:kVˏce3nMeJ |8ܸ {7x(^%ބW`Fx-X I#Bl,a8 H`B:_`Rv0ô`aM  _UjC%4? W> s'œp^sG*| mAވmj1_PzDbOkW">8Ë6ȏINY\_YLlT4{^ ]ż mIՖh'KyO啘Տ1Aϲr[ͽfös> +b*ZN](fZf<2[NХzitb.Ӥ98g>/_C4悱 {/r xn48&Czu,|*_SH9&z?PZHLs0InWDF50ll: asAV0cZ *K7}mhWug-[-h)͆4%|P&-K`ßp#ۯ"nH O둬3/->gp:O-xktiړ݋Lo˟Ι jE,JS71|U2e>/Ki[J( gM+y^PY68mI^q{w˿:uc5}l O%^$m+mgFMi̝=9ؼ>O']Ap3r8ƍt==$2w 7A/2AQ5g-`*x?6 pv\jP%"CAo <.x+u~Ы l 1X.A} oCz4Rн'ۂ{.d9:{ dC.&Y7a6_oA:ۯq!+I.ý; t)Coĉ #o9JYr36%#cODnF:@SUr R=a`q=7 VFRT+A ޟ<=:>=a 7 a8 gA3e  F%r\u`l$ tʽM`XIeiFnC|nN s^P93fFgU B]p`TgD=\kئ˕aDPig݊An| >q¤e@Ue ;ӻ5?D K5桭ǂ=#:i9hNqAAAQ`%P;@ ޹ij,I:Ⱥ D%Z>mq_AAAU5[M|s$ 1F5    uxAAAAG\    AAAAY"p!   #˸a(}~y놗r_珑/AAA{0?ZC/A͈S26m7/>mJ)a¶L]eG\1sK|Y=}f5kK (<)>uقZ|'rg\G5z|jM}n58Sh\ FOcE+l8j UP@`t7! y$`G$k,tk>e,HWq_~|5W!Up2H`HK OdH@5Ó|QyˆTep&탒Ǘ:@86$[7áXp0cL;w@tB f VKxЌ2 29|^ɕ;^{?*|V]ϳg]Q3{ҟq0]I Ōlm}Ǟdۅ󂢄_t;:x?C0hׄėcE?;ȏ/p zmS`D,Ø6U Uj4^a{ɐC!j=%ࠃm !,xbW@xFbp.a8zQSC!7 fNճ0i,=a,SRxnqkބIs!5ѧQT7K- ckj\b&ò,۽P.8(J!iF.;0[k~ZF{T\RXN8ZP22BH:`yCHC؂4Z\_:3?02svEz9Wʣ5fmGBr8;9|q 74,|./YQ(Ӄkԩذ2NI!|uXE,QֽֆIFj %v,!Sh!:盯!CY/aЛԯΕwn7lSFؿRU?5LVQVFz7xm~BI:}0Q} 1a''@LJT‰YzzΟ&nM:@Z$@ "RBЭ+Dld5%s+wD?&ATD!poi9 %b,$P5!1<;8B .mOkK/:]΃Zt8 >>S S !6 od8DA3!2WZZAaaw u_5W,e>#ob/{Fd.$i6$y0U })_⩯lə2^doJOիŀTFc|ڈ[ a49GȂ,l˿ٖ>Xhΐы/J.fU q"݂@ }{3|=j%ru_H$\274&&.=\˛UYO\LcmIh)TvdȥYu^ٰo6w%) yK~g?gIx*I3'CT31u~aFxGsX2^ @6'ݶD;khg6ÕsC$N{@{tR LtWѕ]Cyzxj4KZY:一[),xhWn$/*?y? C$psLnΝzᕧz@m k +v ̛9 p2}[%<,F~eZ[ :z6 w=~ LBDi3/D$19 hLL!X=ӛQq q|>2<}܈6 im4{7 < P;Wn#3ė/[5?⍭x~P+SX.oHzLe%eZ<Ȧkb, J2J~.g\ΗY, O{-65D,oEa9lr%ٻoӘ8Ԃ%Ӛp6OBk/v*X7ݟcȦ[ǾWrp IDATr5"2}Gvi*m8S%7TCkPIU &) ]KTe 0Z'vp( ]N I)\05G1atX GBGw vb.]n0["Cx,Sg/BfRv$l `(#mcUks7hoDlׄx$ƴr`Ԛ^ZښiT@|wHgm7(bYsW]ko'Z7b|&/u,Ćp&X;]HJC ̸)ւF@qj5+^DZKG7V2M?)3\bL9t+iw^RP}1}7)Yszfin&a20|7.ލ9j $Bl,a8 H`Bu_~s5e[I!o ӲwcaxV1 ȚDd Я %Awah;,(*;BWCgha؛P+i#t}Ec81_PzDbOf7/E}p56lՑoZADu*2Ux;i " (ytГޫ-OF+1'jomc &e ķl{_c%m?}DVTj6P3ʹHg+ݰr*.|Kæc.~p[&͙9yoQ7Y^ Yuo>[Os jƗtW%޹r xn48&Cz=h!1}`I$]t-Q˨WN*<-??ī0O|4l~_ k?g/+1N-ݕJ7}mxC {BeܾlAotcTN0;ȴz$|Kiنo@ɰo°1X{x[tdP;-`T wɟ૒,yi^N}zUE).NPXd,=n:7^YĈObR%(ͲiK k[թ1cYx/"ٜm+]i;3nzOcɑ@oy?jJk̜5n4N'q o-忋]qu'd.>TF ׸ՙș+" {ݤ~}݊cgjsf'-g PZ@[6@8ELAl[+ H2U3aŊOF[+Aj1hx, &F~tXÌ![|{\ jމ[܎m= K8:{ d~vS v0tGUAF~\ YIRv!IM:ե|%NltwWy-VR|͒ gY=)i g4⽙9ڰq)RYdF.ϋ"9leS[0CWCZ{}σ"u(g_OC': 2g#LӠ2աMqfKM9NU*%1tLQHmĈfS&؜g],~ʓzR^+?04KIμ;Cc$KGڀU/wZPs;5+w("S5\pe5"ṛ3( /?{wBAu}ےc!,wW&QO6g>ßW]eתKkD:JKg5\A{AX\5Ӆ*`|'C.XxH-x` 0g9hL(zW ?$;xz*tm|TY2gcf)8M~fj a8 gA3e  Fƭr\210,wfxDx[%rB$r>֢(f=tYڟ[$)agW!TY{=Yտ,"Pw+Qrmre!>me}ڙ3yb8o_eEWMi[F[ \Uкs:KhNd_cz,ٓ>L9Q/    ̓y@̻5L{"+,3'#w'k@Rv   LBo7=]g(nWHv    AAAAY"p!   #K.AAAAxd    , \H2VW臝    1Pk%7ع:_+*K|ԡ:dl$3o^<}ڔ`SbÎmʎ|07#oM\]>E[tA$;<z\†㠩fN^BvSςT}M;w@W_AWQB0(?յ h62[!O~3Uu~a*8r$[ 0%H`B㷮3o\ 2$q7!DCV2/i>;+_w&wKdd~܋O3RKg<^ro+*]A# zmab(u3aVG\U.uȐ5@}&,Kz7?A1z`!!ԮF5or:H*L @_Bwݮ_l[`t`B ϸ> P_ͼ(fҾ=,ȲݻI ҁӌ\vadƵ0N+PºpwѲM,JFI[cŇ8JFdҙDŽ[/˹R 1k>IೌkAfUocFl>hW[>(KtT\$ldY *]A`gɠ@@N7rDE@D VPwqTzkgc{WH)[WjK`V {u~up TaHG8rѼnW׏ߺKψq o޼˲5 (dM>n lDC@~J׽x+*ș2^doJOիŀTFc|ڈ[ a49GȂ,l/,-} 8М!գ_\fܫ2]gE26>Axfb{J_%7Hd^gWUK >}GnF&-n.PU pGD(W (@{:@eMxu8VC< N6Ы'?xA0wHM0!W \^G]߲tqRYTƠuRwQ ~3A`Bo"ۦǯu!I((Mufh^3,X211ϷcLorG1Q$Us# ۀ\wLn9x ,$$ù*uqI&|~P"1O2-ogװV p'rN~A~0~<4Tuz]p$l `(#E!2k6FNR(ՂccS )jS_0R I9`jzqa[b7hoDlx4/xƴr`bCZښie5\ טo;ͬha+QfR+}գٛljsZr_fXѷ^&ّ^$'֕96zHM. ܑv/3p|#@\:(%Pp6mN]'2|EadRs'} z1o]g2톤*1qCp dҊFwaؘV=i~߽ȴɠvN)Ap_Y *2%чW%P_bڻze#>9ϋJ14ˆ-)+n{nDu!,~ӷDtS4Z?BNiNAΩ45o CaPTǙd c@'Jà($VF.T5tfۂ{.di$Of +PApq?\#=jU]_jB KЫ9TcP׏ߺ$)$M R'6++)fɅ3ά۔nrF#ޛê ;'r-_ܞIfN(/V6%:?t5䯵HgCAX[OV"ظ>{:/ }=PO]2B1R-8vJ}䯂'dOOζ`B5W0/rB$r>֢(f=tYڟ[$)agfȀ11k06'?EAn"?#_6c]޿m] #$ڇ~,O;s&V "8tIWٳ͝x ;[D!0K3 |zU@WrQ  tbw-;{CW{$to%48g,3AMZ߽ÒW!/e,(NgaP+LWT kAEPCCa"*l1o^ UF 6`yq1o(i A٢6M-<(jg=?uy/2+NtWbB\GBX6]aTY#A-~ 4!I~aB0.. ;u_kF|U\ \nH8`\s&BtxӔ8+\8/1,NԌW]+MvlcxmJbz(gvaD@EE9FF:_I&e$VD9VmO[r(&bm4<3'CIMF؜d]}@ Sǁ0RS.ӧ*/2mÉ́cC`Q/;emCv#]svv÷;tTP\d[b#*\iR7Sw ))]`׻9BzLz;xW$.=#ѣc(ǤD|f|> J[p^Q|B=DQ _Ei#{rQ-t Bؼ\C|eu!kj>DF@D4XXS{~LA\w!~/!}Z0AطtV/B[wh@VZq'j+3\,mGcloY,:-Jˇiд3;#<uB`%D3zy?xv$PJ=T'hЦ#gtJ;`[\w`P'gzLynbFK:w!HZ+& qgJFKxe!ػw;%WP^y9 ,ϴL޽MRI<^ 6?ѩc -ݏhϻ187'^u~+ң/~d,,@"vD ć4gւ@y!GE*T^9ȜvXOr=Y0 DzY.|6L_ŠɁP@vRŹk4?M70w?QWp_.'htV=+m %%hjEu^4(rtͿW@#Se:柵ݏoLӂuq!D3E`5 |.h(P+P.nK-|=8¶;}݇l6e`?o~),a,cX_,g!#}`~w%.ria[d7;Ƒy{t %<" VolH8gL㝏ƚM WˇyOٙX>02㏱tIb[ņ2uxWD>[*Am6W&%+m/ExɆ{'U OŸlgp/CB,LY!\!PrqzO@v?xs'Zf_#DAHBiabih&o Q%<~<OɛE;~]3_ATJ#]#gΟ 0et"kte|sOJN=([1ZPS|DS6gڟyy7t6Jg[)x^Yzm>?8sR8݁Gl3jVWF윻Et~{3s\ORγpMCaE<|SW~yU3&zPMR'c.ru0E;hxi)z{vqK IDATֺElȿ9:Y-%?)zn-M' +X.nC|ځS;tUO_:xt*,Yr߇CLO[jAFÆ3Am%‚!!d* CT~]3_y#.T- yؾ^ g75cDW8ړ[ȞmEV<O5!oOd٪MR,TO_ʄ:ˬHBNI$*%gx׻>|p fW|9ai`́=VL~otX'3fWrxjv2U1N 1)(54Dښk73ZE1!Ûg{W4.EW5=KGw翑>#'!qCL]y.پo5^r`ǗؿrdxR݋`L yز {p$_0b$xڃ./ re0j68pz ,W+@Ṗ%{ABD~M=@2xg,(Dr%:!-Oˆ>/CTK5{1j9Eӻkaw0Mvn~<&C,rv :369f/FGYD!j;Y{w$~Ŀ럵9Y 3$Cv_U;$=}5MDg\(ʮZЬi ^pA[H.)<؞_?E 341wdN^z7`5nuoB!Bq+UpVTgBaN䪠i1w ҩ mg|08b .ϛoq4_!j$A͇?ê`yuC'{{/w9c-;7oZfo?"7=  tbwUQ]kk8?A@ lm#)b^پi 4zȉナEb&0l;oWAb5_f5x@\}v9:=w!Q?fvvm+҉?~ߜ)Zl8F 6`Nܤ QG<Ћmi޺'DZleL !Ľ@W]L 0ٶrsBF,<%~&-~Mk8^œa &TvB|k%|*^a5 Ya0u < Ú]^/&ÄI^Zpx_0n&\o}Q[U90n6g֭$rfFII[ݜ#hF/\L crG+‰C-9PR1жtl&l#lN2A> )_@trl)zEA\b89rQt(tNڙOvؑgTөSi(%Dl ŪBa+_Iٲ!kw;P,W"rN%60a'6)G!nCq9 U_6BPW/7j>DF@DO+l0ޤׄ5-t Bؼ\CzdZQkH `HV1 zu!*` (R8vEăC=(H"#޽OH(4BANo}QaUy0|T;^;Ţ4|:M;}#?ß9P]j/ &_RO4xz>oGB y߳!O|m:q6Iǩm럋 8>,_ϼ)ma^hIg`>°.diQ+RD!_ȡs;[~e?غ{!Kӳ'qȟ,NzٌUBŴ#T$ ׻t]^y-`cVM{p%~WR ? yHsOqj{|KR ab>p!rŝSJzndt7  ߳raH3}mTf2lג_b,09׏ 0&+sg\hQ9,Ҙ<08|Y#b ye]R %4jZ;-]1YiV8=S}/e!qW#6*'gєOK4:\snSXU D7~ث݈H"v0˂T[ZPsH<6ـk F)6pևE0k(ߕ_4X!,uPKIݵZ_p4$de0eEp}5ȵ vY_ OsE =f ia;̱fd\gbyE!2u='0h= ,'-u$"zָ_dʊ=ӞKBқ?FY4"S98϶W=*]Ots_'ʓɌd͸,oǥl@DP*U0juoL} ~H«nxBQ-a"8Z|^x\(P+P^ prÚ` *rEFw_Ő[}]<(p_NJfoХpʶ@7}$Lcú9\ʜO¤a$H3|_LUiQ.M6$GNQ>~VϪuS-Ple!͆4W;lC۾v)΀MP4E cW%&.TJ#]#gΟ Nщ5?ӕ!#[!;Eui ho:u+Y j7_hj8Vb< /O6Jg[)x^Yzm>?8sR8݁Gl3j/VW$6ݢc:ؙGniZa'F7bߛm'/GN^`ħo:-;'3Brk MLwh /=a_Lq'@F`!69~ ; v%rj{|л lhznn4l8U@D} g/S \uJ?smY^bz8s㡋/Q@z12_pfU2U- yؾ^ g75cDW8ړ[ȞmEV<OX簾6,[Q% XP]qIȩ8D OSz|ۇnl"j/>,M9NJcrK$w<ߌ_NXMWkk8kƬ oޞm% Y oB;K6ŗ}I2Vlgn/#X餰=!]XsٕZfDyڜr&0b$xڃ./ Ww t}k X-z~*DS [;X!f7tYǯalpTX!WHyw~m=@2xg,(DtV3X)h n:|'q O= = zykra0yaz.#JḼRT5]5k`ذ;q;ua?^!9L;{y*`ovbD/|TE6WYwGwI+ٚY0C?nwUCѣWs!tOqr4kZBW>~5\ҦK 4mQ8 MoyӫO_!B!*1qqE_Ǥ7OtR%V$peŰlm q(t`vL\Lzmg8z)Nu&t^D J,^È~x):|>s(Glٳ͝x 'B8?pgXut,@ۡLwpP!v7,_ٲ7$wEOB_Ls2Ԕ;9,y]΂xtuKf$\.<4?,5M#4m6%p4V+ۗ:> ;F91ݷpTl v`™*H/=[-gfY 8|-sxuz?BP~<;~mgV9'~hٿ9S_p$l(IޣyCӼuO>ȏcwR3,9|w{nBqz `X4lȶ啋r50miČI ܤfWȕp冄6̅0KU8SKVǓ x, fc!j-<<`xy56I^0 M `]1گt5*и dq3! Goiq;htDF@DM5%Gtt!~/!}Z0AطbOmAv`Y9kIj΃ 'HVC=(H"#޽OH(4BA约rٿrfU^9 ǎ~g8*c/A|gwׅ xƗOۑ@)!x~lS-Allrsq*b:>Oo>)<3/`;tv3Z?0l EZԊ46Q;c"l-: `],9COOcys2Cϟ!dL:e3zT!뿫ӫap`a~eGng1Ncph~@# x|~ޭ׈9q s3~ v`JѿgjՊзQCu>¤)d !DURL;² ׻t]^:]Υ@` 2IVM ߭GAJR ab>p!U^}}~pj< =sGz@iw w>ٿnfUfecAgι~nL76yp'._;[O@yP,Ҙ<08|Y#b ye]R %4jZ;-]1YiV8=S}/e!qW#6_hʧᖦ4:\snSXU D7~ث݈H"v0˂};2gy%VƓD\,@qOf`kLj±l} ?8_4mҙ8ٟjhy`O$j'Ňf9NՖ_3%+Zj.I@=p ѣ=(嗋S!zpm ` XʁqW- _0:`Q gOCB&X40q2,OCjzc\A_ l8r3C9a֗0H\wofσ/CFwj7s쿪e+2t::-7wL,O֔^ l]+zg!EĦ^̐@zEи_OOQǜT(c[zWg+:@zv6dx2OUFtsu7F rmf\{3m)[f@zMXN)`z_7lA&#?~P)q[ %%ڡZPT+@O"GN'ߢy hR@5[xl0s9XuZ6<TQuX 7߅gajh4 R!_m(`_y!۵Ŀj}|3"ϛ_ʴ<(p_>? sYȈe@".*] 9B?sW-z - =cὅpt? ^+W2pj5s쿪,qmK RM'1'ݣlB܆!B@HDH6T\܆S 2}d^|#Zf_#DAHBiabih&o Q%<~<OɛE*] L·e.*>7aȂm@E~/~> @Ao_8D$p10rV@׮*$Zf_ <:,!'-ԇM`Fsa鶒?am70F~f.Q_B8W=:q۵xgAzύ.PG D(= [-fW卸P$d1cf:{)Ԍ=J\jOn #{YZ .r;g6#}+:+." 9u'Ւi_—o-mC\;_-Z5X1}Laci@ΜqP_i] BjmM㵛gQՐ۳D!+w8M[XhpF/IF@Ԋeb<'ģ+vcRPk.2cPK4ӌ;Cs^ho$?S|g8z)Nu&t^DZ)/5 _^aUSн=;喝7A-74OCF`SGCa(@ۡLwpP!v7,_ٲo7$wG]΂x~7foÆA;_S^v?Bǧax'!'_數p.Yњ_\&i~gE8ku#*z^eW*.䅯ء.tBye~Ìj u;|OFF0W O!z ba|(vSad,P!#v;/a̢$k` Qz˜wayXq4I|:7&a`q~IR9_l adP`\{ƙ?px(n0to2n?W`Uٓ|  wיf3rz0n6g֭$rfFYd\^SadèalKy#QnUJjj( h[:}6ÉPR6'fvWb”q :_9Q" .19ƨ: [%;f?4dza%ť+@EOfM7^C]BIq`RJ '$q>kCPTyBQ[)96A FJ@͇m /1N@ )+ K/j{7XE}UOn5$0X+`=Wϳs‰_`c$ ǀsk'p+rIVt$ػ۳bW5KQy?Gxp_ |!>`4|H0PnFOMV9s1u?/b ?S.AO,^@#= R7g`ukĒ$VǯX !ߡ‘$xlԳ=ۃR~ymp`PSMu}5oE ZX!,uPK?U9ժ5:`Q gOCB&X^F\T"0{|6¾n?WdeȀ=;~Lnw*kzي NF@}&'Zp,#[cyĆֳ"{bS}fHr ^-oEo0tZ:)U?FY4"S98϶W곅J~kC+mՎ>A /Τj<{3b?(%w$i~;ձ=?NeZF rmf\{e{ "(^B[2Ep.X ɹPVȏR!䞇5pE. K\u ` /_BA\rUkeyP 㿀1 ?)>pQa0e5 ҺÌpePm_ zG0f<+c$k3s쿪,qmK -?;ƑyE{ճjă|pgT4[dH!ͦ2Ϭx㫱@S~0Ҹg T@ŵb~eՊ K=i75^FPKl˔B܎[KhdCSx? d8:7K0x6v0 B0"vBh8NKd}%Z=J}6l4=176P+ύ.PG D0VK-sEУ)ӵxgA<ݿ3^jIctR8'z.՞4Fl+ \QwlFxrz75!oOd٪MR,TO_ʄ:ˬHBNI$*%gx׻>|p fW|9ai`́=VL~otX'3fWrڝWg{п[,8֌8Tᚙ a#º,"U¤}8R9[wǪ\wU $C_U['?q#]׻׍˯*ʽ:NҰA!99xpYG^ϖ>Fi4=桫Μ]ymZ̬MMB!B!DeUwar"&{. TMV̖ZTʡ#)JE5 !B!U. ,ҏA!+ƒ{KvB!B!!B!BTZB!B!D% !B!BTZB!B!DeZ EF >1va++pۖ,D!B!Dh^ZN4FϘЛVNm.hzAЪƌ61Eta=,W]=:@zbd|kS|і9t>ןGGGAA4ßR^NU[t!+ƌB,>э1]B-N`B^X 2 hH?ZO!? %fxRWͅ߇`ɛ7 Wa28p{п)ƻ[*Du;!6' q] a`h6*Y)!OZtq3|M/ \8<_)׈O]h%3cV$󏅶PsБK{^"q=<^(iO!ֽz;Qع2_¨h<𜯖+|˩;BB.oB(> j¨i0<ZZ. oxWS ^^aB C_I!Sw&?BjHp-ࠇs!̙j,|3B>݌0Մ' ϹI5_﷢@UȋɦP[ P'Do]J}™h"W\YXiLV_]`Ō*eDZ}nНIע%R Xh8wgJ'tPM, ]Գ,4J^ WO9$FfY&-Lc{<]+۱g/:ʧJfXjӞ1 (>S(E5f~ 7'7qO&~n%&iȒs92:|g˅v3PA̟Z3`t`4o҇Fҿ (\cj'. lϵHۤUaғ-oȋ=n!n'[NﯶZ5@L`#fWFw{>KPjr2qSS+n ,^;;]یaIfB`"r!`bUac\,H+*h9^{N2Y O,nyts>ގ5W 4.L,8wž(sBk ™;#*7>D:bw{0FcV,A* oNSfXMcog:µuh#,OZ+eɫmy_I>βiLP̰⇱X~¸mKXl,]k'&يd4]4M4 hry{a:J+%bA&_Dk?jڂ?_o:3ˋ4 ݝs Wnt+Jtዑ.|Q}x{sPt7ҡ(q>pWBʝyZq)ӖSi<$}>Š*0B' .ϵq/[\?y8/B_œX&]8qw'Cqe򡭕qH.o Qfx :/x˛EYAoaPW>*f9{2;SLϊyi_PQq _%t(sZPpc?bɫq^æ h pul b¤ɗp|zW`@AYm׽/RsVdpP262p'8_d6RsT>E˟EuD[gPM.y\P-ؼԍ"nEGqQ>Xq Ck3U0mt*7:S0o知q9eгs΍Yf,}˒O&6f޸|z׽%+xMz 9eLBnhl@cpU'_L~54Xg#-ԂnaYg`yXI֟0f_A{"ӻ\0*^  `|; h`@b/<&ۯqjMm+\ڐ]W\Z7l&cZrS9}܅3Xk5Ƀ]aٚTIWful5wqV8gOb؄>9{uivf[˼8YqDoɡ}LS|2ףwaΫ 9+K oH瓯O֘q6!}]Y13ۻ%a?l'=?_' XZg ҃yS,޺6 Wd?] ,ՖhBWN<t}-G?+Y$t+?XjȻjǮrp?dV`ՕI`Ho.}y嬼LZQQv@",c(U>WFΆ*KU{CP;JŠO ,I_:ePىn3e4 IDATfCr&`^m/C<05 B _!q+.VC dC0x8 s-~5D)LRT5:AQSru0x,E;鰠/mKL&cf2>`U3?aDXW^E*xWپG/gXʕa}tj3n ~|z9q+jK]Kem_{=[~MB:sve̬M+q+{B!B{9o>ELz,K'c]hA쩚ܙ-g4CGR;Z_'B!BK. ,ҏA!+ƒ{KvB!B!!B!BTZB!B!D% !B!BTZB!B!DeZ EF B!B!G:rw5zƴoDޔWkǬYQh][d22՛t>ןGGGAA4ßRAqJ uvy xeи^.Zu|lV_!H]}@́a!(*czeBS+)COZb/n7!/A O*Are[`h1u;MUQׯ*_.b7qPZھC2#@0|6늧W3oR48<Ɔ<7?Li ^T?nl:b§u۵M4b%-wk|=w,׾?shNU~y.49o¹% d(CZ+ woIe^򀋷x0_>2vNaюĥq~1I[dҢ &-_IM &tR?)!j[$M[ H=B?yl36oHID\_%~CgIJͥDR~q!DmP F6^%*g eCA!篺g5n>I5_﷢@UȋɦPIZu`^;o)5މ:rM8wޟcG߷p23k!x;m.~mzRz)Ps < «tk΀vC7Pp DNiH :B5mNPV2z\,h0)CjWr!90puOW U}Lp_ ͮ1ӝhE4>ZF{]4 v~ηxk;J{BMkMEҩt7޸y%0P wnؤ7eKl}/' =yv˼ qcAHkO 3x#iZԲ4yW>oal2oig3ػ%VV_S5II= $b<%Nr!N񁻴*,[S`Ͼl~pwd=MjP$\>0:!Jk$JW\qزBv]H'ݥ}Milݺ¡=+v)BSooUgۿO~ӄ_#Y{7G[&PolvPŽY<ո|Z55,?giޤMPN\ k6طIǫxä'[`.{^RCOR!kրB4E8:er6žmX1xjZ-BN1nj*vEmŋbtag"wqPX<<jXAM_5 jقRzzUpl Ջ` mӆ]u=5#/ Ek2^ ̋PU$V|u@50+ WNz\T4w: !n6;`[Xخogۿǫ,H+*h9^{N2Y O,nyU:}1j@*h\RY\q=Q :b>uGzDۇYGnh̪fxHš~P܁>D\`Ff?m=e,_bcZ>1mYj[gzcoZ,**1B;`" ~.@Zjҫh.p֭oj8[;Z);k9`ٲZ_ [0ˆ\8-m+X9Ȃx(wm_.4.t3 !Cq[ř3Z+v&&9CyȎ5Cc-SP`_>يd4]4M4 hry{a:J+%bA&_Dk?jڂ?2g~ҁ%gJ:;<]t(' eϨ(х/FEgwiS^!\şk= 5 Q_FUí7Tm`hsH|\%wA%G|EU_ƕʇViQP.ѽW:oOaj46P|>nc@|XYߪۯrҪ+ >pڏ xgXoG,.ʞ\JX;5 70xX(֙:+>lWg*֞)L| kaȧxm q5-5+ԍC3lY#{xjnAOw(:ڌ:Rz].YTjw y+R/rʘ$Sas0` d1'66~0uD|AoymT h__8VCׯR Շ[>f[;zRvUͅ|4T+V%IBHcކFQWa8XVu&˯Dž%6-BpakCLt-^qkh=jMqhHHbZ75Ƀ]aٚTIWful5wqV8gOb؄>9{uivf[˼8YqDoɡ}LS|2ףwaΫ 9+K&g`iIkQFY۝b,Q'#EPxqe(s7{ Ԧ 2 Ofp| 'bk6LFBR7[( 8镝ށWh /~agC0x8 s" >y"tzc_210jtYu`X&waA/^t.fL>8d|ªf&È7!DU0)}%_*W_+IP=W։Ǐg܈Avur%ܫY. 㞃w- y4ol3k6 =Ocڕ'*ЦDp؄/B!BTVY|&)bһgY:)B bOdl9E)>TQ.B!BQYO`.Xx"l)>hK-vcZBa7G7šCPTtQ : Q{a&Ṛ̏!P[tj>tH0I_5~|6%o޼B0\P/CnTPo`H;>uyXy'X X _Zh y4:Ȍo[M+\-l&~TC!y&o~oƳ~3:ll:b§u۵M4b%-wk|=w,׾?shG;BB.oBx>&0EyyiT} oX<F aB0BZ>wI~2WՐx[ABL3|&[!I_˅0|3ÎDZO-<3҃ah%XޜFWL `Cθm x.~㵔[x7ykQ˒W_!L[Z,/;!py4J^ WO9$FeyHoǂT+K(I͛ c O{>ǀ\><O |PÓy5rvg0V1sO}?t4jA䖄=wO:a:/82iW")a^b9U]ZjP$\>0:!ܤ+yœXOBjxf$Ժ-\qزBv]-'.Ás^wGU̍ǹA?,8AphJ|pp {']<&~%&iȒs92:|g˅v3PA̟Z3`t`4o҇Fҿ (\cj'. lϵHۤUaғ-oȋ=n!n'[NW})ƚ5sMNY3;ܵxodƳze e(Vi]u_`X<uؕ2g مwqYxȘ̟T tG~ thZ0q|!+q0M՜}"npō)k S[)XjB + FA-[RJOh] tPyyj\Π+2U 'tw7fp^j`{\\wf5L"KP^8ǎSݜO}grf`ñ ;A/7E ~U5 Ҋp7Zn(zހ oV'{[nD%ݜ#FMHK*:Kk5Ν'\ZuCgH8x?Yu<Tqp_>3wGv3ac[qO>˗X֨OLj)gz[e,؛J  oC3#Z>=9xojjKuydy8\C jiRMBT<X] W-C/rt`g ;Rl!1 ]HW,+`C>LoeZ؂Y6:ii[A^3KHEyw@אp}Rx?|4Ne/kN0r |)Iۯ \h=bggYs9|pWX3?>2| z,o铭HJH0NKcɮˀ&WӚt_nM`Qr!oMLtF,]-o/cqp?^!XrD=+m P ŎǬ6hny^n:a˪~cŋT 6/uz@f\ag0P%:JMnr?sZY qn=Rp7W´ѩL¼%^nƭnA97"g՚E-K>ؘioxQ^ۙBk}Stq*F}4vЯ/ WxRˤWN%Kn}682߂O J-V6o1u6n팷 6lB^qHOoLq]5Mͅ|47ιk:R)av!*,'A I_BGwW!&n4Ll sZs g4$$l= $ޛvek2R1'5_֚ձY=jND`|f_wImEt /gš%Y0L-\.ޅ96䰮,Rpd%ocFCCbgBzS ڱ뻦24ue}xl_v=}9z!(]`pp+#˘.JU 0qGD!(x `biׯGC2x (Dh= ِ XA`hy.g!V53Fu祿YD!nIp/rΏUzX\&HڇAN<~=..O}tH0=i]PKFV0%h Vp<V<8oi颂i  T 7Ak _MAy{2ևبp~?g ~@0|6}S?dbIu89z\#~?ƧKw?ʊtc|Π4jօOsY6ȓõYўXY! &c` [wn TH݇H?`ԫjZxfô0Kz7,riy7aD6 &v8s!|-]'CZ6Iwl[KpQo⡘ZU>2vNaюĥq~1I[dҢ &-_IM &tRRƳ2"m4mqHJ ")`ؼ} ")v'sihs} * &)7Nl:K7yJe]DDžC'ٺߗjήO1g-Yz Qnl>hk(-5yʉl@_qwkپރ{ȯQ2!l;m.~mzRz)Ps < «tk]C7Pp DOoibiSGqM jW3J澿^8#KAvp= @T8+l <&HppNWTY$C0dlvwu4E+4/ҧYSLu3_Q jr]^k0/N5k޸ͫ-RHt&ݼ-[d˜x>YXiLV_]`Ō*eDZ}nНIע%R Xh8wgJ'teJ> %SW#Q#c=BQ6@8ˉ:ҫ+oM?=fVR1Euj@%@{FtU~ /Wp/-!$ jׅˉzr/N ;h 6%Wv)BSqawj3wK-4H3Eі0<].D($tO5.VMqMd KOǙl0d:|7C#_S.1sx6Z m*0طKŞpǓ-W[K`ϿSӌUg2yC Ň/7?!xjB + FA-[RJO .M!zYm`˼6JKKт(AzEPs0yhU~:s{̫A'=.ʑYc '$oo9v|'qQpj3Š^ '{Zx w<|bx8\>cjp˷%#ux;b|<\5.L]7c+)4W(a]י;cVu}l:uڕ4uSӖD=@GW,K&kx~?:ǽXBa c~ ,Uː^DCaYaZ|o#cp@0;ȶ|ȖmЪ|Z؂Y6:0iK[J}\4L'ɝ`(5`@Y) r|L^gV%/3"s.;: mNJ[Bm}VxBS'/%/\^uNYzNvނM,u:2\:߬?%+_o:1" ܙLfPkG~bEǙg]BQf+>^ܡf$˖^ը `L .w~tQAts |nN<*U~W6*洨H- P[P[ m% ,>G}[fW9.TZ)GM&g4NQq "EK2}[{BX;5 70xX(֙:+>lWg*֞)L| kaȧxm q5-}+(5.1gI,J.a/w"^_zYY< + BՉ/%s!k}S'b#&'+u!)> ;p2JKHШ/ـQ}xU~ZЭ>lb1 l>@WC{/b8H3@v6]7C J>T[gW<jMm+\ڐ]W\Z7l&cZrS9}܅3XMMiWXf+#sRkkY[pNٓ?{E>p;iBJNb6KA],`" ^BoiHeIH$9sfr̙3gUk"V3mOsW|ݛo&ypwZˁJkvm˔w2%Pڈ!ɝO6㠡"闓Lw%w?cũ2ݓ,(/^TOsp g=xsXsEϣ˶1 ltVؖ؍!!$W!.aht}&l[+6Y|? φ-`hv&s~=- A6 1߯y0U8-'nIE sӳ 729j_Wc!g 1? :Ww j.l? #< = ,Qt{KfiqɊrQم+V)&J:Crxuq\Œ6~ɘa,"-׿¢=R~Kʿx0,ۭUrX>a뮻ރ^F\UJǯBZwMoG}`m1\a޽yx͞*$!B!Ď(rz&rœ/%d} SZTZޥJU0 !B!5Ut\׃|qr#3ƕB!B!jsŊDL!DՓ&HU/)J3lذ\e5rǰG~ݪ B!B!B!B!5t\!B!Ʋ {+c5fӯzZxօndYbnaxUi9B!BQݙC$6t12~Gs"TJm|\@R ^hHbq|lu`e|?㘡4lų͢uN:oged*qdw;yVTC !ĝw)?0^9EX}nm=y18zlBáW?[WYѓI_nSܘʹw_c(n> 胭DDs/>6vˡK;2p" B_E_p?%!|9$CP pV4gA-$#QF9ed] ]O_0=+g[`~]o hZ:淁a #CtEO vJ[!%45?ah{#按{<5;}\}UB94ݠcwKfĴx|M;C8I?fqvTP(aF@qyJkvs(BuEq@wh- +r04Oo[_XWEF4C}oW bUHׄds=$zfe?A-ظ%_D mU3miutF*ݛfLq;lɈOviW {BZ{N}gBq I$v?¢–J&m@?ƵT'|%)w|:J/a:mnֵJ`T=ǛA Gr&Zwّ}ZgMzmJjKXx[6tC 2y'Bq# (es xx0S~JR!a`zx`}Z )u7NʫoP*'lOriT@9c3vZpfzscV26Av,o_SG[&yND2ln948zmo_Y,i̯VMvӏ.)L{ޝ8Bq;[rriWXއVbFv;ф(.|}ҏ,h57:ϧ^R]R|s,|Kk֬"[%/6r[lag يr n7CC[p[/.y(l#ٓD\sohǼ+J\˕Nm:JXv"} `͉@;%tԋZɔaimXW"=!Ds Ӱ& z, #*ʋ3*3!!mdOt*RUDGPmvK0):6KvhŘ4M;E[v)3i.\T0i ,##- mQN_q[,W䜪ޖ &@s mˠD\ᕓVWɑآ+ˌNēLc;4vx)Bl8}əXEDkKd |cE(9ߚk[ao{ؕ{\)*/tLN:LF:oz&4JLWjS5j(fH9m~v̔]>رP xAz${ub^,jK@Ɲ d%Bk$[|givʕ6:􀾰9Dhh jpS-ڋ4Q-y^Gޑ=ſ/hJ  nB3|˰D]MBM굆Z+Ƭ,AGyYl44l!w'HW-._#kWp)7D(>@q~]Zh: }5I<޽ ЋאF\, k:!xD8*"6 0=HYW6 *] hgcBatxRY]&6IV;ЍG,[)599P{b\P EJ>[%UQ9<2dV)@1g*LJV$O-(.rE{И_o.'(6|.*|cT$jC7|ZHEaj</>iM/\8 ϶=E 9l rϙs4L;{< c.UG  f́W0.nJi}šBn>dʝ _,|8[Ghr2KoysAZv!d\4f'4@:NFt*Ew;PڴǾX#0H6)L ]p? rZ ?m_}Zx&Μkp.p0ٓneKAKA=: +V:jQc^?ɒ.yk.4CXoCn g8D38Ӝʗ'f[鈻WhP ;\eJLqԣ13`3I|UJcũf 9I@yqc}{s Bߜ&=v7hV@,AmXpW"ǻQxPJB#|?0R:A`SCo|,S+ ςs9?n!n?YWT5.YYyQم+)3gŪ=qŒ,:FdLfovrBv(r|o_\Æ +YyͲ_re5F*j[=)ǎe_X=8h+qąو)c |l5W i]/;e{cv{w΋P3XFp翦O!B!;3mѝ~397ْ]edm_d*. !B!7R9=_|/nBnvcfn\) !B!v0w\\B$C߻#W+W0=_5"Cv˓\z2B!B!j,B!B!D%B!B!,BQw0V_;}!B!3_ZI4Mb]aU$2sf,T9mą:=c8z(Ns!ּ_gr l-ѨS85/r㼩R@!: <8z?}5}ޘɦǭ;7ZfϮF@#FBЕ0X KOMaph *ojJh3 N*WA?6*֗"\{π >3vw"ssxr%8~}% qˢh\JpƊo o] H _꼱=\dt§c +UKZMOxva=Yrq![)h`?F)mw*dŽP:(y,^i YaXxc=Ûn@֐^ &̀b? *? x< !ja TG._#` pzlHn~@ko0y1De޸eiWKS[YL< l!1=GXK6 vq*~=E`ʅl[͵IJ neFZZi xоtla%le9 *Lj/֓NǽL .0}v7t=Jk IDATӿ)3su:w.0&Q>ݣXU(LϪmdy[e3js"O‚XͤB!nHq.i=`?~ਔj>Q׿*/nyp|F ֜"Sag6U8+ BR6*ZE¦U5&H?S@{ݠv !씹$Cu3,listQ_^<łqkTOḷhغ#k`tKlӻaTO?̘`Зs](ҢV$[)$B\^ʡK[{~e?زk'riؑ? tro'fa}ڙ&9Z !Dm/jKIۨ]^9mSxq <7ntmQ] :A@xlE~Q lQ=HN06gxʃW˷$2=. Χ?xU0z<wpD]Z}̯Vv)60:+'%2v-*VS?L"@8~gy4xA^PIgkx|F':c@qړg\^үHٸtb6 s^3DebON` !/a_#f*oor`7u? z65=KHzBqSnS<;v f3yZ  2D| ag ]}FES"dꩰ4AqpQnNn_m/_i k֚g/΍51Ч|mP%WC[Ah (4wzOgW*jImpfc3N(q?{y=ٳl*Rpc|=R*Viy}Z&K~ӊ5SX`Cn g8Df۞ |7L,q|ėvm˔w2%Pڈ!ɝO6㠡"闓qs[E7;;;ƌhޞ% Yax$ 7nf#>yΗ$SE߇0Q7Վ ;4BQFOGg¶>Nn`\ᝅ`0`A9lr`g]0aȶ0z*Y$|W͍m'ay^G\=QT0<= pz3,/U+^  9K@Iչ3vwoPϼc ?\ ,RT5.YQ4*p >>ES[6 #W]gU?;]qa7;7]?,E6WX9GʯzIW66v㯪R˾:lu{p˿W*ʍNX,||h8-uT6qd(!C}:ݛЩMKYDpЂ/B!BTU"W)rz&rœ/%d} SZTZޥJU0 !B!5Ut\׃|qr#3ƕB!B!jyA!B!5t\!B!ƒ !B!BXq!B!B˲:.{ceӿ;eËѷV|B!BZ|j%4aOFwmNђWqj̙kSSer+o8ͅZU+>G.ROвּ4ˍ[GEGvou'7 Յ).j>trh0x8 ^r3o}ޘeVwK9,z"\{π >tKb+$\.3 Ftm5]D#FBЕ0X K/Ǧ0|8b?AS?w  ;s쾊j`aE иROq99~ޕʕϡI.K'|Z/<<9RDY>os/uCt۳]qz !UMal۔ˋr5)0unZXĂI&2ba(N(_—C5FX3[/"ؐVYHWaW0clIhᾡ?C0Yi\&!cLi~W_7'1katZ VUN4Lؾij`ÈyQems`דQ &\H[϶ɹ\+I,@hZ9o)apKq汹9FZVN_ԯr j=i8}ˤWn'.q88OwУT0;3gX>@I!OoasPJjiu=:U¤hHU6FY?'L9.,!%Ѭ"\^޴μOik)^w ))=`]D&=wt_n+u.;K#>YlU='doF6qkXz~( vQSG0-D/M!]azWp~\ !Q)?.ʡa/Xj!lZ=aMmMoau:.= ?А{d{<5;}`xh q5ˋX4-J˛BiЅyPԉ޺PyTP%d3z7 <};PJ<h ڦ'X;; ?-xxz3,qsJLP2|+EZԊ45U`CyeNV/ v{].-;S,O;$@ Ԩ7No6AC}ghXo~P<0woah@kN\l._Lzm??:13gx|5jKkm1ǮC4reTO2e*) aQbIۨ]^\ܜ 4ɩ4Ɔ,sOJ^Pj6|{\+IL* aC,4)\xW{{" xy@9~[['4 > p:[jZylapgmc7&ٴTQLeWބKg` R!Nu(aFʿjY|f_`n#XA L¼,c#9^=FqȈ%CLAP9 09߿\@8-^XUY'Zi:+"c|Fubi­}Zֈ5=s: +3gQ>;Ξ4Az o.zsZN-ڟFAݙu:VFҹ̫7Jǥ[kdYU78q$憫;Ubۗ8st.:^)SuýLmɶ/[:RsjhӢ+_k-N089 g`TaFqw1fE[RHbX\܄S!"?x!_,|Mpx?%¿K/[ŽtV杉-Yl44η(P?.`X82!!@q:_ 69l_xo$ڹPr=3_Y&>bcxdt+9d-~S'Xgt?ǐ|{b\53$t*}OΌgVW@Si{t&_{g'yc1 ;q=y&U5(K(oc05#MT[,x@1r,5bkR&V~S{^wiS3ٳԋ[-χf:^*:t]yeΐUl̿<ǦU4_I-Y?y)znS<;v M4AqpQ'_,|5,ZtG34>MaZĹQ&t2V{ I S̳Gܯ%0A0e\SlPtpO/0%BepYYh{UDՒ6Kf Q $`zgْU=zF36Tl֘קe䧍$Ow*BT9R\& 1|a Yk3jBuxp 5~: k:<=ڃ 1M[wo^]oF6>+cal;^{Qh >y U 'bw׫ [RG/_EX}n JugLTHm?kr9<9 ZzY?r ./nN25x@RK5V8}^xg?J@RQz)zD.`bfy)䩯sD{:=@p~ws/_dt§c +UKT /L׉a`I(R8vF;<a/Xj!lZ=ܙTM?j{x)kwnPa!j;e(ɀ'P_cA;-9x:ר//b8*'#/o a@}CS'QyTP%d3z7 <};PJ<h ڦ'X;;Җ.v;[pDžgX:<~3&#.e\W2IVi jc{uOQÙyO, hP/L OEs+*.m-*`ˮ^C/Oj!M)6 IDAT ZbJnk6{sC++%N6vAQ6Ш$B` ڳp <{j$W˷$2=. ΧPn^T~Z: Bd o S` ϕ?-> h+z;vpBlGvwKS))LfǼMS _O#kT4Wxoy]R%q),|K1)G\NCNFVq V|ꖟMFma.;?2 p"^gX WN Z7q) aQN˗W@!Fj.M@=gSʏ |^ !0m^g]0@kY ;[Xßm-hboA` XK5*3!!md֟N$?-8pW*UvZllbԢbݪ[VܠZB<-J1ɉx5l79' vV(7`_sԧ7_:@x: KH~|ȜffZAlKܨl{"vFG=ّ Oq=TyrO9:О9p#g?$,,Bb- X=xMx83BZx-B= +~w9 xe(-J=xذFS!N<%9cV&~c;C~9R{ҙ~  BSqK>Wٷh}riձ5|]yy'N4%gEm]ӛ`<.?w ټL(_^ =~M߯bbK@ƭ d%B'gHb[ӯ`qŚ2Y7nT+$5/ܘYr)|;3n7G"y͕j-y( ҿbXQtU :̅-)W@;@g0̓yu  Ay^\ygcμ,6 KP_Kgdh2g[G\8v&FόVg[8]I_Z1n<2QdXgt?ǐnŸhAMkgIT:7*>L~-Ͽ^ψODbl(NwQ{LkQ)Q!taѫz^~m)8d0ѤW*T@~?b;׃K-k{vZLy95S:/f܂wxv0^g*t<gMdŒ,"b ڪco)U?ciZZCubE"$IȾe~hE6!W+W9gΜ{f;g悵Z, 'ax B/ܼ|; Fq`yRQ!b4 @BVMF U^J6m6/76-g~- Gv_?h (аS[F\Z3x/|;.lk€ _4ڱ96dh)jلTz75͛fj6F(\Mü۲>::;S8D=OSzW>{ۇ e\ǡY-0y&갳6OvgKM87'r pE!1tgQmؕx_P=VnmBidbĹe,$HQJV܅O#n><Ųm;Xp/_#B!}; ˄UA5ÌeWS!ly !`ks?Â@`æ@ck;a^Q`p|uքs gv2wɯ@ѐ  <1:: 3U[řv0n (݁[EUSX h gf[ Aͭ'qсL2aؚ} FǹBTw "+wXO_+IPWն'Nd r=+*NXФQ ^pE[C/xG̲G xy1桯nd~Up4-B!B!DUUi/I;o1XVL*¾ĆĨڬԅͱZTƥ=)Je !B!UU.,ڏ%A!7ڛxWHvB!B!!B!BTYB!B!D% !B!BTYB!B!DeY Ep } lݯۚdD!B!Dwo~h'lmUZ&1{v=ZTĶʅ4[ -qQ9#AW^ňEkyVkё2yw9s8ͅObx͑M.B@-|8#l8:3E94r <TVol9Rݟm ޙ)23<(߯Up(sLwTī?"T^ =@wm P5/ݔ4:QW[xw,jƥx/o/sӎ&i?jΥ-OѺuvt G_y)Gy2 y?=tpx$]kӉiϗeǣfekmX~qT@Cd6&A0eyyy\}5X6F ,ĂIM*dCPr~U\)8`Hh?^3!,t8 ބ+a`8ؙ~?6BF}4BzLb@~cK Q1RSݻX:2;w}X&$dː?0~jV'Uu %I^3߉pS>o&a[>ŎbU06oD[L۔]w`?s:-_R:C|z(^eVEtt1HΑOӣލM1}#fj*z:~s_\!*aVWA =Q)?]C  Bؾ\;C=93|Rs ~sút|sD֐=Vп=8F@qgCKwhAVq7c@po`DI97V/>h:ϩ*Yjs<"c_qu4Pi:zЧE/5W 5^<w>ܼՄni<R(%Zx #ӎ2<#o8QE5')qC64G1b_+C#ٙEkL K(kQ.de ʡC+{2v>Bݎ={~7}$m/9ݺ`};7_ xjAޭˀ<֔Zg[Ĕ.=xf iՆзZ ö9?ʤ)dV/)aQbɐ[ĭtqg5~-H^낧 %|RA_5\:H+U AX+t / ك~3 T9_ W3h? !jiSI? eJW}#۝|wvΥux2a-4 &9.Os Wz7.JmTs8gW̺lsTy/[ I||rv(Y5b^MktpN*q[.tf!T\IO ,['pue̜ ms}Y W&ӎ{+y䟋(`ˢI 9rߣyvLPɍ9jͩeH/O,j''eGY8Z%Sng !* ǓɾPjȑPŝ)Zb=nZ%gHe/ '< zXÅ3 5;o1adX }@=~9 88C |:v1஘vAz,fqSnCNrt{FFJdXZ|?bzYH\ N$)x{WA~ˣgN:gPbǾ!昏G\:Dzxhf3֝ȗTt<@V!'qް#"#_jgf'X5ßKu{Vd۱f\V44;fHZ IZg %%G-F6+zE59z%5 u-w;xlep 'D52TQs) 7ޅ [ b׃=ZJmp,*,@rY|f`ڣiVyPel[Ǜ߅"z2b`G&<+.:o՝ `؝h}AN+0Y FxoW.4ڱ+T jr&/^EĻ[Zƀjpَv)iil}0ja:o(_=ʮĆȍDpߟ&yKsfN1l2-;H9ԃ.՝Ga\ci8qt1O5գ,sޛ&hfC5깪<츔/"oUi6}"f cvBeLY!< `^=$\i]x]'_,~p4ƔN*l=O Ǵ1qE4O9@ x2gE:n#$@z$Rϼއg4P-E=U@ 6ijDqa@H82 ~h;9bs8gκ_o= `_-iYc>&NE6WQ4o:޺獭3Qخӝ8|ܞhӞ,7o̠NXc?k_ F6oH }'Wر< $Vw̅oPOGeBRztQ&5U8VD #RA5ÌeWS!"A_UXP\F$t<C-cܹxۯ3;s`;0QK4Ƨ(ʱe'~ tk0n.:-͐`Û[O23eð5эse!E#wIW:W:WzmSO-{oW;.TEW hҨ||h-䡎x#[f٣Gs<<d~n|pj7 p.U/B!Bq;rΛVވeŤ"KlHA]E9m\ߓTѪ]^>!B!v*&pagI~, |ŻBB!B!D !B!ʒB!B!, \!B!ʒB!B!, \(*WB!BQܛC  ``lǦD,)I̞G8:mA+&r!G-]^ňEkyVkё2pr-@Oq 6Uݟm ޙ)Fӭ5oZf/n?C/ؕPX UL-IaFV_Tk߯@qr &RoWn87Bs]c[`ߏ奛2`Z'7 "j e.\JpQuOO;Q_`fLEB^^y't`W |.l/,};QGص6_h3y2PKMQ %68!R:i 6 Ê`u$C8أwnE襷hF ߅AamˋJ^y!Y^V0(Q@Bg?DdM)BG2kÈ~-ϰ75PϾtl_Pwu~*MnA1SVPVҷprc,Q*ӾM|R q9rmu(fG:g G3*=z~ Ժn,ԕ*$y|'JMLڇm;Ul w egyqMz!(aVWA =Q)?1pAx;@^mNb  l"/hK  Bؾ\;C=y,w~T5$lUoTk(@h)Q@oN8/?sqa<^ޝ t{?pFTN8‡^ xnY~s3'3?/7ljЎ'Q ^ Su^ [n;*bt㢾!kZK*L;tހ?SiY5M+/)qCM6Eµ(2͢ȡC+{.eSnUDAL=~А}i=RLOOQoe'F%1BNRL|:?rNΖ~ߝv`5 %6[ Pҏ>宖ԯ/A>uS!.U-U '\9ezL.~~-tm8~HP0p UW}sU`% ~:gAg˞mJF#n; )x94C jLY3tJ+ 1?B5i:iaxWT\:@MGԎ03|W>yAfZ^i"'ێ5ڰ׮;cv itNd =4 B cKD-x]xp[HͅՌj ?õBȽ} th o bES!_N"9cV&,C~:Rs⾫g!?"7¹T~R F< aC+Z\jؕf>W3yz/0=_&:" 6lM0\]@i~>~[v_4Zwj{t?W+!rc c62:&dkޒǥS dN,Gץw>,;f?ޑNTS= NU}RiMaS_gG~B !!s'vKnT0|Cա1L Ի_^T=$\i]x]9$^V>+vviq^3 \X~-RM=P˼,\5/n04Y tq!|l8{϶l8BMdZQr6;?a:C82 ~h;9bs'-8gκ_oHŸhAMϒ07Fv*}/͎lT}ә%{zp@a OZM=h{>25/댿Sxvjʡ4^h-uFJؿL)0M h]`+$:4)!3pˋJBh; =pTս~:н!llz_n l:ϡZ~- Gv_?h (аS姧`Tw A Č< N/ ۚ0`GiW8'vl%{ YZ s;g6!,ռMMڰ5W0嶬OANΎ$$Ϊ5!AyӔޕ;HcG|;+WqhVi`ˡ6LqɁ: ݙRɿ;\fQH lmiv٪h0fy3iv87̜E)JêičݣښXme~$-+!wt33Sx1W{ zj*D ;a0lpgXSO)N'kWGw"ٹi yyQnC;haaobt"vߣ7A}%-7u,*nOD1'Ȗؿ̺{ ˏ#*(uh ¤`?,=///]˻/&\xX0I8snu/_"CشZrK+]N%C7aJ9Nvߏ~`?6άƾ?,Щx00nTL0n.L`Ν$r~q 2d&l%IedF[aoj(ii%}<ދ>vzه"y?ҢЭxz>_;B ^ 7=Mڱ)6Oǹv_3{ O|Txg^wPydQg!gBW244n#4JQ ע\ʢ`CVe},?OW2 ֬LݜPXܳiwoJح a'ZsZ McMU@`[Ĕ.=xf iՆзZ ö9?ʤ)dV/)aQbɐ[ĭtqg5~-H^낧 %|RA_5\:H+U AX+t / ك~3 T9_ W3h? !jiSI? eJW}#۝|wvΥux2a-4 &9.Os Wz7.JmTs8gW̺lsTy/[ I||rv(Y5b^5jFNe0~UttqRW\I<79ɬ_i;1fJ?08Wb$?+PS;Er2[A7!.Gҙ8s0C՚St^YLO&Oœˎfq QodKBT.5'Ó}##)始;SzJ4`]ϐRW_@^OxϿ@ * g 1kQoqqCz8VEC!POz-jN(9΃0~ +f`# Y\i/Tېl^q<֢O쵞x94C j Uи_yY+/}9Gk=,ٌu*%*.bf}nGOxj?-L/Tɶc͸6>iIv$"1nhĒz=ՀxCeEJJ~?V(zS&gRoVnϕ\}Yh2F3ZՐ !*v.Aƻp #@5#]ܑZ zp]W@ EWş}HW.CL{'6`.0aiZ6u]A/ª #V}o³2ꢪ[݉IgwNb #nvUZBKCLՐ}&g ^9ah{LuEm f l;bƖWMn<`bգJlȘLtN 'Yi⚷;ofqæ/32cnFRp;~HNʼncyd zUTIS61@N]=Cemk6d_ x͎K92Q/vafN')\`P?~mݼC! C&,uIj0/]܁.Au4..B_\]F8EIcJ'A'„Ycژ"hgg'kv_ Qv<3"UE_RM=P)s}h^z`h` ó C"pm*Jɴv580lvu $Ct?`xvX R}3g/ӷ[Դ,1 sidx~+ h yy@7Io]k(^lWN>nOQssͷߜqy$; 1^dAK*;峷zT6hzzA<>+SC{?woJFUzɷGn:^*v>L}S仳pW˴׭ܲ%YX/[ޟ،/3n4t6^BTMBc8AI_+Eׯ ˗7YӛυZP@i}1ҝ844tb~&8@v _N.($N4~;lU4 ܴ tF^f΢H݌a]4Q mSNQ,۶ ׎2U?#+F?Mёyړe&~Չsx?|kl5^sbg9  _7OcZc^ ;V痞B ػaL_ [ϙ.ʕքs gvq{DoPx1W{ zj*D?@ѐ  <1:ވ䶀qAg`he;xpf?y`|B~|2Jw`yFQE9VテAb-EŽCrxsI\ft`!ӣvsf#qn,"]¢{/ ݟ?VWʰ@?TowUmٿ BBr~O |DžrUM W<7pd,{hc֍NVfVB!B!n^y"wcT} QY; c4K{Rʠ?Z_'B!BN.,ڏ%A!7ڛxWHvB!B!!B!BTYB!B!D% !B!BTYB!B!DeY Ep }B!B!{sD|Gc-Bqt[!_Uf3GtKCdD@_Hwۜ E*_}PzUp-BcM'K%p( :??@R}#vzr`;~?{x*`Tkw|58/?sqa<^ޝ t{?pFTN8‡^ xnY~s3'3?/7ljЎ'Q ^ Su^ [n;*bt㢾!kZK*L;tހ?SiY5M+/s)F y̢n HMڝgUH! 9!-BoIZ fʇ)qCM6rB;QL|:?rNΖ~ߝv`5 %6[=+-@?8=C[?(N{S _ _}Q=9낧C][r 2=6VO@gr\VmսZh? aUx6\إh $Yaٲg?G[ҫ>N|Bq;;OҺYŜ)Lhˢ) c 5k•|ލK|qYȺlsTy/[ I||b{]9}JQHiEyo?}eU5a2?*N:|:^`D|]8"58qVf]B ǓɾPjȑPӫ+G`c_ ?`:ln1#SNЀ#<1J§`gդ'E ZX@c?Aok5.LFվZf]; GX U|Tb,TnCNrt{f<ǰyb|h= ,r$.id'"=L5Wv?{7gڋ9+/#]Ƒx!}[dC4w[V=@{װŔ>ɅKZ2x2=o08vy :6'6/TqtoXjі8!_s)o /P IDAT} P^ CaVoasޝEUapaUADP,SYZڵmq5-w^ff(T\PC@A@YrKQ@.s̜s t)$y^W χPjK̓q! !l5>`.0n瀝#&\~-WJ4 I4V9>4K5gT^>ӎ2DĚ6T 5ٖbwS6 ܁$kjؕh xsA:BNjx+%r}02㎱ǓĵhQ(8W14ʱ[\*@Ÿ };wӲ}FA'&'T\:FL6 ȒhBsfB)޳P,$W^Ө `C L Ž AIf5$@B C!K::]rIܻ_B[Xn. KPӷ_KgD[hd3?j9Øs㾍l8BusfNEOq hp< bI)x9zm>?>E*P#47\|MQ0gq<\N)SYsg(?Tydia=FOMTœ\.h6JaE=,F!( hlSx fWg3 }Z  쇭C L Q!Mp( |î8{GS@8A.Ijz|zе1lh_n4l8 ]P-AM~-WiafٿA%X0j&-"g\Z3x6{)ڔ~<6|?xdfgْU='|zS$wSSLpŚ?eu :I$!1qV K\YvCY:#f/fNJ8ǖeru)%ܙJSӾ~gͺ,f|;3NJM'Y*>wfPjGm;65/ :l9\`^H4h6ةh0d5``ք6B!@{w<<A ;X3˫::!A5 &ʳa0b/~.{4- 6zW<;@a0;OK!C~Y{`n-> jpj;, I/f1ɯUHYtDŽj[ř1ZݾUORqZ0.j0fwd[LAac|ОlP]a]0 $EoH,[?krx2 $n׿>|hDH[.W_(8aU@&{WOC uH[#G6ʹGiőirsΣstcUֶVm8hB!B!s3Bw&3N,ľؖun@g6hQiAk+$²/B!BTU0س>, Q j iN!B!5\ B!B*KB!B!$q!B!B*KB!B!,+q;>N?lEi?ٻ*O%B!B!j8 it-kJݡQ~6gQ<[s`UsƾMXn/5)E4|$?vx oWzg>´)@ũY>$gZ][x \QﮟK s'7|BX$ .CO,&hՋr'pR!7XK]_N} -P]fkGK2{gxзƳ[*ax0hX[M&XCᝎYrFxw,jƥxWDCx-K|s4ƌlYW;to;ػ / Vт5q7[q@p)BcɈ 8poSVC^2Ω*n0pxFwů~7ވbx*Sjw|PNJKꉦt<ۖ@)&x~>lKAP[66>9i8s9}>gî|v +c; hg1(\:BFPnu O2N8]-RI<^_pݪ6ͧB 6; yn~_@OnF|l~h9)UNL?/+T[B'=LxX)dV)/g埃e?L;u ){`О n)S+ĿrUjxz8Ի82=6.-qғǻZ p:l5|d2t̀ W3h7jL 쟖_sz;vG0Pq܉W(Jrg\i^1QdƽhǼ)C ˧58uU@!}K MJi1>M s,|>YlqnK/e>lȻC(?{`̋8jF=`씋4pӰ-Lǵ[x1VM|uזּ@^-֓~Y~vؘ̛c %Y/Z6OƄq|79 _{Q3=<=Er~'&bSBT.5Ptrqg86@_C/j@_,?*7un"8s 3 %pf,z5L ˢ ^K`o Gxv?0v+fa#,R 8Y\i7T/ےShVߑq8"f̻E!ʡ4B@Hg!Լrq%vCįI+EPx>UR!dD7Wmueb-@  ~d΢_7(\;᫚Wف Z0f>ko#1[NRiPrIn PFu-rGmCf:%q~ޭKP{"\gO}&:>W>֧+) 4O' Ca@Qؓgp]7Eœp:^NidmΕvkP!v X{\ϓ!=B[7PO*?s=\{Ǣٸ*_#)p(1V5Lcȋ\L%^CW/ZMW3g6-cY3&4gk~~r:SQ܂NM^g3Y.@Ь7: pIvO_,:xv*,Yr;3Ο ZPAưa}Ѱ4tmg<={歂lЕd5 |·_ < (8㹦Ӷ7Ͳ#߃K`lLZ@EθP$fmR8)&xm dϲ%@KE{NuglI6o ڀflV+\ۯ7%qQh\qQ*qO)CAېVXMn|anվR!#v#P.Aox> 9GA?O_N&>#*D$כ Hs&_}[ރ<Ɏ x< EPz?T#ZxdmQzi0<|c\6 {¿NR}\ A&+*AS]a,;8_08!2ho$l&p\LΉf$eUR^Do&5m}M+n l>~^]Cg7~=*ăJB6tgߝx㻨-mESJjj(cofwdg;7_>~2+~djiQ^r 1PR<'e\nd3u#9E!|)#J˼|7i$1<0U97[N- vE uR!, P.@ up+m=voXI펟#* pK¾ )k}ƣ^A!@Y9j$K)~N@ E)k&K!cLVg\Mmyٷ9.ۯ7+[cY,\@ٸC|Ր^-nҞju` sm ٕ3T浯 `_szӲgs~0rR8ҹ;~O1b_&KWWcBC"}I=є.y<}R`Nh h$3ڱy4UmO0mv">@)&x~>lKAP[66>9i8+@4Y )yn~_@OnF|l=7UjD|U[B'=LxX)d !=_R  y2I+Wu ߮CʊS `" !=~{ | 8D/Hri d> ޛ Aޢsdgop.+ۯw+0eWAkEގ_p2 !ÆSǜV(/^l__[tNSkns]8hc^wl"(_zŊBBl< Kt9'$x\+ZJo}⫐ӏ/LiN-6rsP!0A-pyPc!UM$㛹;OT#XA [`|-c+9x/! >_f]T$@x~ Ir~Y /Ei9;˖?kcۯ(KUZBKcTdvl-N<(CN܎oͬLSiM-GX?^\[TipIGJ#{#ocf@-Pd[M sگLt\e$_WcǮt IDAT7\%ޮ*Y 7/*Wd35:&B\R _~|#\_DCYpTK]caLhhL\!xjuG:/ɓE*C L ŽO ! Z{ȵjw8*·_Qn+(XusfNEOqp(1V5LcȋTdoF|mZƲ ;fLhp8Wd΅Bܑ ỡYot 1B+ĿrYt|5TXڿw?ԃaFW!76팗y 1x|%xH =¨aXZ gn*TP]p)[M|?;ItG2_35`r{;NÕKNZ܂Cj~S/ ajޞɲ5[Xs\=>ǣN4=3s6'Y&*$^{aY:- ID̓,o_~ݾd3iivT0Wl_v߻sK !,G \EPROzU_[ ςZ*KxRPT 9?W*y$,wGNesj Yp!A`p/C=[:m1U̓x :. X2T vCa; 7kFۯ0ֿIr/] E- ZyaV9| 39 ]+»ayO-SQ /oB¢-߃%`kgM__adPWG; t<+JvU6)&+zҵWxC 9i=J(k+T"B!BT8TQa NnBT#t}:bxH2_.L@NBo|=d˗!/_}7%_;B0\38-0=S!~7 ċԆ_@R|` hb8 +m_&XǸ`[-~"o5$qaaL7>ͭT R!;2`>rpN`|0|q !C)l:ɠ&W_9Oc9-B1zh,ՈYaj0r 8 GÞSԁG4wRDo!z~::|)ԑKMN͇p{(wNA:8[ض\;\Z$vuoXpuȥga_5`~Q/ Vт5B 'P5 Vmz¥1&+3 ()o*o5*[cY,\@ٸC|Ր^-nҞju`҉RSuڜmóaW>rӱ/+}"/;3|fyz?D^fN6F ANGSh9)UNL?/+k(ub~xz>g.||;_LC?݌:\r2?ՖI(3:{4/2q'2sC!@:`d0h7O_C|lv5<=TVU8n]-t_8 O xy@k N&Ca Or67&G?{꿨Z,pU-; X+Jv ` 5H ppgA~sQcG{ٺL?0gBT{\mlDl8 'ڲ?N0yE&}C 9gPl_-UT@˛W*_LbEMvy)ǵku]uǻoNӏ/LiN-6rsP!wA~ 8C<(u=w!ĿrY||3Bx[ʴu<(pq el;42ag6ˬo/!mW +Rz] AN3lx [ 1JcJK\h}rij<Ύũ|eމ5mi xsA:BNjx}Ŷo#%Ǒ=Ň?edK%]UHkż4s^X 3tU-B!HH@;d|I^-*ĿrYt| gQe/Bv Mq3!q0qVg\&.! A'O 0e$ ;? i$h J"N(̢'߅%*(Zus+@`^;l<k.Я?*z`*# Uq%1#wn™M7l dϲ%@KE{NuglI6qWݐo'iHwYˁ)_XDȐعv\rbr*{08tD[+$='=YĿhfl4c*Ryt/;(q >X%%T/0QPe큹`,©4'EC~uGB2xw4(.l,vj Yp!A`p/C=[:m1U̓x :. X2T vCa; 7G}_')׿v- ph ;{2h-Y0~1\>h{#0t B=YD! "|$~Ŀ59MCv_UM>z4j"$t-|ϫ+TeW hڤ||iH^)tkȦ(m84MnybN.|t|ͬDq/?!B!AXBw&3N,ľؖun@g6hQiAk|ID_^UB!B!ăR1 = Â.Հ6B!BQ35B!B!$q!B!B*KB!B!$q!B!B*KwI3[n@{+Kם*GkB!B!DUrZ.9'̝+T _!čGtj ;d0\V/˝I`zȖ/C_.&?%j|.oK^v`?.g@q'}[`DCx4C-tz BP b'/;~K|s4׆S.= 3`m{jxar<djHx7i [0OD{\~mN߶ٰ+]9Êؗ>×S>Og~Q"v3vȳ/=Cm8NO߅ܔjQ<7w?/'O7#N6~Mѭj|z/iјӾYĔ2Y @%tÄ8ʌze LIBql~HJ^02xT'\!j6|n*+NL*`Kx7dnBn:/'j< 5 '0xoL'^{lEf ̧hU?ZQc~D] MlƢFg9ؗ7fBa!J !!%?xĿrYt| gQe/Bv Mq3!q0qVg\&.! A'O 0e$ ;?Ii$h Juẉw/7 UD}!$Ο 'È%^H-YybMnT}Ҙ8) 꽚Z?3n9T^$Yn:a83- /k]4wV 3wWut5se2o1cBs's.B ỡYot 1|T>j٩dɵ376jA]ÆBn4l8 ]/+= VAb`J>~zQ9”BT¡0 4?xC{V@C>H(5~QYf\Z3x6{)ڔ~<pOlL,[ \QwOoʖdɁWݐo'iHwYˁ4@!t\G\?$$8Ϊ5Q!AzӼgpd鈶4W$Iz2Oz bWDȐعv\rbrl4c*Ryt/;P(X=|JJ^`9T8 DoĿLy= tKბ8Ss}f)~ty qla$qV5挅= 3u0fyqh @l`73@nGV }QYZjlnr틫WàAw&Q;C2b^U6c7N|߸vQ6CbXDw:ϬؓEWX9#^3[}u97տ.IPWՇͺ2=L+q vVROg5i s2=;q=Jq7ycvL;VfVNr ӯ !B!N3(/^oK‰Fԍ QZT޹Me_rjӯ !B!<{?,oBɦ|zSd'B!BAQB!B!D%B!B!dB!B!5 \!B!ƒ 3S_bo'Y-;VA7CZ86oaŠ"nt݊!X<+B!BjWcԵG?x .L@᥮Bn~dI#oH+_[Ï@x+X=em)><2o ;au($\<<0h.^ A!" |o6P1cX.W>\ c 4 ?UO5_2paN"ݯgwbR PWi8+UzӵeQk 'TH.մ &yA0mOՓWvW RXuAMo46cBh ݪ.`IP=`tVDw #aPƒP\=X`(1}*M IDATcLXXZe4 e8lι:klDz ſs)e;T`PV?IeMnغ(z֏Ho%9nX~t#Gx)Y4g'΅ʦIp/_ :6Ϻ&RRBHI8ȳ))JK[6xb@q?ϊMvg#)ǦH:{3z>[Oک#oI\Foh|O5Cel7RI=N7Ilj G™MYmB\V=œ^eW)9=/z @ Ndʭ&BzjӠZDsufժ'rߜ#2ttK|$)k^ vnт௃IR !PBQ2: ~~eI}r0D+Wf{;@nm:*6_C@,2_ټZ.a#{ۤ'odX* fmWNWo{NTd6_vZӿx4,$Ŷu7cחYQ%zRP gGS^|;E$fR|zկ > 7CMRyC K_-{2h ZT@،&|H9qݛ=ъ؆\kV91[/|},YPm ibfs.A 7 !ݳ& !1ˆ ^!SɫĿjՆY*x5h|6}2dglXc%qݗwr`pCtԋe!40S\}l[[aGF?p9]['hwSp~qT+7Ԏ{l^&._%WwSS k.o̬SN ,ޑf>Ρb2Ny>ZM+9'ti(Dآ6 6YLXG- )Mۖ^D\9!j/b-i2D؞W2z ™m$BwH+TW@> 3<5:7nvj bp1A`HwNkpmʺ,0g,D@a0;ȋEK ]`~4wW; ^ݍ^\8VAn ,RT56QQ_0hgPunMp7kѝ3+d*cBqq+,ʑU/Ϻޛ_a}CIGf]x}ϕ͸ƅrU|k'3Ҵ98I8K J1{wn_~'9P+/B!T)tcBbƿŒmI8ш!JJ;'E%|՝eYzB!BT \̿ 9'M͒ٙ,B!B!B!B!D%B!B!dB!B!5 \!B!ƒZFi|ɿBBTGdݣGiq+pbL"B!B!,޽ӊ*g1<x{㪳^#{BȉB !Rsе=!P {^ N*A7$b-U ,2ƃR{xuJ؝:.}^|XZD /vޠX|귂W@w( o_,_Xk3RPx z΃>~Em)zq'(!Ape֛O0BZHY \M0k"W86T=%8kG|U8 ]np(_A\W=+!&v*r;R/~'!$ gj7=k*=ح\{'͜F=_l'zY2 V! jӠZDsufժ'rߜ#2t|K|$)k^ vnт௃IR !PBQ2: ~~eI}r0D+Wf[;@nVP ^y \ yr|fkou(bs/<ѷm^-;S\=_;Q={vǧhփ/ YIemKn Z̯/ߣ+J 4 ^wdCH6N t7Lk3?'ךAӚj5xOر <<ç#f)Nǘg|vAgѭ?{3 $)3J1O gJCoV6?Om'D2ȉIzO`ɲx|4jKȄ}OcP4sa$2BcMBb2A]CW=ժ UUkmdp"ذ6ǀW3HK>r`pCtԋoրJ^Oar-:moMi4 vKab?Zv|V۱+_=DPFlBQO`GRHU H.ݲ!ƻ&BGL]^wls=Z$>~A$֣"{ 3}_  !K?=h|I-ĿjYt| p( TY%0:LfBGqhj}((zʃth֕1g\݌k\(]羖z\ eo6P1!j9 kdS3\S*!8*bh]ljY} dI+_;UrÀC) 쉠&7_i`Gy mA1v!4nTZD O M0$0b +@ |/!< P|sԑg ( A(~@`iyn3*,X};RC8Cm&*nk0ΥMSAYGd&}7cQ&Z?z3#} J`э=FP#㙧8fҜ=8BJB(f'q߄r0zFRRBHI@vQ0?)wB‘pvcha*}x:#TJ0'1SILoUH{z q[9OzG)9=/z @ Ndʭ&BN̓qw]C ]5pغ\ܬZ$V_[sV€\wq9ؗ;t͡ð7ثQa 4Zpu]]5]J!X U(J]'Ϗ[nC[w_;@nm: t!$8XO'j%j lW,m6/K6[2Y,?-J1³}ղ?۞A<r՚ƣY,g'iؗm}, 1hm3~2({'hN8;rCJ1O gJCoV6Ǧ~ShsVv޽ϔ xk*"XĤn'edY<>@%dD>ʧ݊{(yϹ0~2b+u 4iF\tJ^$U6W͂WA!<`B^ -뾼{3>=@;^6okFt`ޚ>7uF $5 >&.:Y`e-; h+J/H" s s#6O(.T IDATэrxuE,60mUKx,hwħ,#}9@=11wRsN!ۙ'9$>+U(rv߂cY %.'죝{gtdNrw|s@Tƍѳbb D.',A] &iHX>/ڱ1C[!D]h3ϋJQsbk^ѩM$UB zz|"? `m/^&ғw0x^syzi`i}IzºͰj^`` Gxj0Y=FnֳָP% C[3"gh)mo*fEnÙcVۗ`KE+Z< IOy'D_3ëg߯rR ()ĶkOxqg\M?s/?gӚvmdqP!"+'{ 8BnE]&Zߌ=筿:U.;ØҷkaK_ӰKH eօ99 kHgbaGl`[ P,.A"tTVS98b,gELn!AS%2a%T]@ϧ:{{=r+3..k 4GcDž_pٖ,\o*eَ|7)Z}ug{/֣"{ K>@+u] %C՗t~y_IE"|6|.J21W ^xjw ?HFyVΟ5vU ef Mnl#W lطTi<PykN7!5my. ږm+ZwW*ީGK4a<U+9ҿ=9~=ɨ)xZ蚥2y%lLи2߼1h7@ 9aY񰱧s殄,cg ɸzo^[`h8BoAfcJ}6:yZg0rA\)PyphȜf~VUKBz.SwlB0ν ~MdͰ%3_K%{NuOcs} kO8CGq7[PmϏI}՚a,bL#Kwٿs(S,)Wzf2-wᕜ|c 4\v"lQl,&,#^&mKg/n%! X=|JJob{^uWsk3 gwH+TW@> 3<5:7nvj bp1A`HwNkpmʺ,0g,D.N{,ؾ n`gW{f`0`H`a_&*떠\ T4Jy} Xe3v1?'ke3t.Et̊=Yʘ*B#w "Ƿr$~Kofo.`X i;=PѣYW C6rgsw3.Ωnt*Z÷4mwNgsG6NGp#;1zޝi|ۗߪITc;!B!TSESƄŌ7% ےp+ucC6wnsOr7JUo;!B!g`ǟemwP9ٔO^ojdB!BQ!B!BX2p!B!BK.B!BQcB!B!j,aƗ[(!$DzD=zeű1~ +qV dYDB!BT9(s')Z=:+JX5#{BȉB!jz<]ۃ>x .L@᥮Bn~dI#~oH+_[Ï@x+X=em)><2o ;au($\<<0h.^ A!" |o6P1cX.W>\ .j9 kd&~=縓\ ېZX݅Y WfZtj )*bh]ljY} dI+_;UrÀC) 쉠&7_i`Gy mA1v!4nTZD O M0$0b +ԑg ( A(.s}0b" SEfiyn3*,X};RC8Cm&*nk0ΥMSAYGd&}7cQ&Z?z3#} J`э=FP#BS\IgtF/sI;u>˶;fҜ=8BJB(f'qõe,EĔfqЭ0>뢧HI !% ڛhsu1&). >׌l7RI=N7Ilj G™MXmB\V=œ^eWfNKPB/,rO̓qw]C ]5pغ\ܬZ$V_[sV€\wn9ؗ;t͡ð7ثQa 4Zpu]]5]J!X U(J]'ϯ0)С\(`>lm{ͺ}'vQY`ebiy\FIO:ɂeiTZ96) ≯*4/]i<˂x}}vp1ˬ(xgiWFL o`mfw6 4 ^wdCH6N~TFOet}8~}|'P4xOر <<ç#f)59>N&-kYt+; g5Rs™Л}{ @  rbR^2X, 2"zn=ͼ\?Ƀ !gMBb2A]CW=ժ UUkmdp"ذ6ǀW3HK>r`pCtԋoրJ^Oar-:moMiպE-fS&ߣ(-cWz &%&̍~ʎeAXV- L~lvQ{YbUek\ْ^\L@ˡ3gC6q^v ṟX+KEQEro|eG6n.(Бw"NM;W>DFVT+sK(WXQhS-ëgnNM|]z/\g\M?s/?gӚvmdqP!0A-pйPc!oUN_,>{`M![_ʴu\w1󍯥o;| a闐:ʬ srw@אgrK0t|D/@'H͆X[X+<REeWhshq.ؙ̊ǙB勗Ke,Kh)y{فOuZ1zVxcSzQE]>׬3iƎ iBZ.#:o oEe[ ru u$g;݀hٲ՟֝.TZV,,gyBRqw%x^˷:e5(<o {aRjfL5+D-@@#)!&` Mn,SN@U݅DSE-b^*AC6C?u3s-ԅC۲\} @;җW>Liyy:>W?W?֥)PZ߸Ì+Tl2ycjuwR0KM`835%Ok]T&ĕynYQ4~*dѫ[ޕ)I6mYk7}qʜ !( ;U?p<veiBĿjYt|5dXƕ̈́-(G XT9 B=0w%$d;I#}hFEFϳ @ D^;l,tk0` 샸RE-gnQ$2uV:y*o*pWZnD [2_Q7>6'f4o3tw㻥>~{mϏI}՚q);[{xϭ 'Be97GMbpd4q%qʃ?7%wrhz^9;NCe'!Oȶb’8R>o)`H oض,'J%R;J ` .B()&CDy]/s̩̀z*K"ʽ((H_ ڇ_HPqйrNmS 4.f:h pzI` 㠷1j. %{f`0`HW,ؾ n`ge>5]z~)(\0hgPuX*Q'>o\@(w1,;gV"wT:5¢_Ὡu9HڇN>th֕1g\݌s(]羖zyYc&WI|B!BP2_!B!5 \!B!ƒ !B!BX2p!B!BK.,/[X1^jB8Yax#N+)wB!Bq{8Ta6ˎ u#' BFqAেއDCŷ 4yx+8_YOސWW͇?V_W{RJ}xe-bwPHJxyxaVc]j78yNGC`E8äo ޜ6G,⫻\XC/j9 kd¨z~whUBs*bh]ljY} dI+_;UrÀC) 쉠&7_i`Gy mA1v!4nTZD O M0$0b g㢪 ۰( "hYZKmc.ffYY=j.ҧLEq75}C1dA@a?fA_/_/s|ϝs=e^_~g9=+t9A^3oߌEfme3nV捊eޖ-$rv^SeEd Wa()69njIYd}7c#U'>x3a'xw&c2.$Gדz!MTʧDz y3~^&%5,Kwٻ9JJV6Jӵe,Uo#)W/ja5Я\vJ}CSdR֐]sh-D-IFqFBGhnAfvMդn)ЯaI(T(vF@@|>Foz::Any[/0+,W,m6ϼo֛ч2$-J ̻:Ӻ+?6_Cx+JM 8ళܢx^]jFʂ$9Iv Cv=!Ws Ja٭rM8{aܿ-6ؚ;S0O?լ'aG)x/h[bcgT\Yt;so_x|5@),qaZ><¨,ZP r7}abܧܘ<͋ sC!4k 4Ƅ<\p/IW]?G_7!`|u?RI=??xVQR/p  AbՏuN` FOރW'/0+,8eeCi;I40xW.=S(J`˩igΔBZXhDrօ\raL[ɪp:w3gU\*YQʎG®ɍ\[RQALb̙֒ӹ`vdbP4yx<uዝ:Ts_E3&7Gc;0gr+e)d5Xifp"WoWzץ2ieSؗjˉl>Oq5Ëw!M䔎ϐ-š)ZE%Ф%m15`[K%eUaz{|";`k/^0 |jʹ=}4iZ?x 6󴃰: ṼYK 3L_]Ue{ҋih9)~cGkNy3Cc~d5E$!v9֐h[c ۪Rחu.LwTZ NY9bD{ zdMOa$ͦ_ Z`C]!f_8_|߯mW]?s?k40ɮdqP!rj䕀#l{ 8B.mW/onXUo>rK` 0g0AiX9N!rׅ%9!+HŹy78usZ^ l)yX <0W@dEeWͧh}shՑbfE5Ln!!oJy,7sٙޏwem{r0|).k4O4`ORj!+DMo=YP t$g;iݺ?mRi7e~i3Ȼzڕ@l2\H!^V_ x5?Upi*D^-: |oC`fq ic\r sgM]U k^TbQXaeJÀ͈Obq_t7ۨXՁמ!#:`%N@7ST+*=SoyLy:1>V)Pڀe_{ÌO *n,tfT&`&NVE"c.bgrO0y<f/Hzy[ݦQ}z]ǮCF;vLs!VM$ IDATv 9;tO_:x|:,\xό!ƕ΄ -(MW+XT9 kB{9!>˸BAqH_j4Z8BHM 3/0r"t[0xR: /=*jOm 'yU\/^޼OגёSG=6%8w39?fTX>S:~>9Κ4TmX̀w쟲3}p;oxRXmβf_!3Fuſs(S^91O%˟}MBa! < ؂#7JJo"=+Pe O g6âp|HTW@1 +<> rϥt? ـ:=;߼^<{1 l}3UͅS2s]͂-a_~ëQ_})(]ʕ0th%r3nVۏao M67|߸vI6#ddxO4"Tt+oHjVޛ_a*GA ]-8RM>mZÿ4mwuKwKgpDmgi}BIfG,qYf6#8PB!B!nWU:LP#Y4G='lhEjQiO'w(5P֯/B!B.L\' r"-rJ3Y>!B!BFB!B!j-B!B!D%B!B!dB!B!VpLfI|())\/6 qY6z{B!B!ܙסִ|oFyR a `S%gvo 'P!DMQSн7!`~zmWK_9kߠ@g ѻՐU}Al;w35\_Þ8PC?pnC~?!Ԙn5 á'_G VՏJP3U.B;EhQ -ڮ9A^3nub?|1)oL 6A  0=T/6 ="-]Qq+OM~/!;̚ j<|%Oxtᬟ-0x$(D mՌTmg@i xAq- ˲2h}+F2oRC9}"2v酫0Ŕ l+Y<;{7'BIʆYIq2oZOJq5ЯJi4?HbJ(wK*mw qfst<77_!j35CiFzmW9:AnV9?b_ |4@)~ kOB Eɰ3a}I~?{|K`o> y еAž}scmT8;;ȿQΌ[4NVaI(c5 /K3/}l/fL-!@ vA>n!ʏ Wʅ*'d>>j߃sWֵ:Y44Q s˫?^zRTz^evЬ1$&CpnuUBoOH<<Ig!V, ` ӟ{@т(*&-!lA[p{h`;\z#*Ƿ";`k‚l_uUZQaCyU[ӨrhSSfDl9pKl\֫BgSs!V-g낶?o{N/ڊ_B R޳!+~/{!pr_>ׂZy%{΅{õ x}0.D{GT}D;M.„o`} Θ~\L~^ ûm_+1@A>yyp|5D`;YCQ o:RSvYQ 8[HG~~/K-t{\M4Ok`(Pgk $Ү]qLsto BeR!Dݢ*j &CPt]xdzSL–;\צхW?Ea#4|oeo&Bs+,8qi9q38e3XW& 6*VuggȈ,=Xٻ_Mi71a9ZTl^$_XvWQ!>ގ63SqjќC6`מt|0cG&K'▷"|b{U !FN`[  'и!r\*C?f_)jkA 9aYuk Z_p"U+,:TUK|z.nDWom<ɳ ~ d}jOf:w!,Ɍޭp?ngM D f^7^a#LВx \ӇOYٙS\7`X!ʶ-Ѭ+skBr'wqRލ6i';Ҵ--Y?sGs% ճ'0->Os`c2i!B!BX'.*PL~=E q ˆ`]trm_,W8Ç )vw[yW!B!L\' r"ͫ)~B!B!D{B!BQąB!B!j-B!B!D%B!B!ąTZ~LW=JUizn%.9U-v:dć˅b/{IJ>n#ˆQѡ-ZvSjkB!PM˳\nm(|z3;ӑ|IqPRE|oFyR a `S%gvo 'zH|}gtzxMH4.L@ǧB.n5dI'xgHW͇ނ}ma? Ű's0=ƫ/*쀕[!"({A[uCt0 := eۡa[xa8px=۸}uPx~-㬬[z\{JS镡Njx=I.H-Hqnr[q3UwUsj aTHHj>^/9M!'"_D&JafM5ށ''ADҎC#_QCuC`#@1o,Ҹ};vσ1euNP̃[/mjQY[eGE4۾ybe yT>avUbM1cRV90ia Hz9E)GR())IG{,Nw:`ZN_òyĤdcKmSHsz#18)_ |Q1~=pRsg~m77)eEk_uֿt.ũ5Fejb8+`1΄5H˸x]Oc41c|įS}@(g[ZLcyD<8AZBP `jp>uaI_e~J|sTܙc-M01pP@ {G5<5:zF wC2k&uK)~ kOB Eɰ3ʚI4N6aIY B_aVYXly)c{߬7e2oI Zw tuW~mzW.Ԇc@;1xq, G@Ђۇ)'гYׅ5ӯI:3sB~ؕ (<1{o7ep`?mKL|t:L gy z?F`ђ840ƣz8[vo|&g&0O?c#7LEYj6|sۗ=3_3U̯.[˽8{MTzNGG1bSnLĘ !4k 4Ƅ<\p/IW]?G_7!`|u?RI=??xVQR/`|X~p* w>@]tN` FOރWmY: / Χhu0GPZ/9tw! ޕKvb=r*{ڙЄBZXhDrօ\raL,X5])9̙܊cY %ngH]*&Y65} xYddLԯon{>¬NJ/s7a8OV눎֑Ӈ9Ho/Qyfx1uBc?ҹґrz)ZE%Ф%m15`[K%eUaz{qӪ%A[;0\ 4GaSKG=V裁G>Ѐ3<> __|xeAX+%?f/.k쿪m =4jh15ѡ1N2L"O;kHޱGK~.LwTZ<| p&5->+7k`r2EwE9] T zՓE-ЮqW (^\YSLkG0;YTQ"+G:Jp.Y$~W/onXUo>rK` 0g0AiX9N!rׅ%9!+H߹e|c)l7~t|5D-`H͆SyX <0W@jJckq0Հ3y}]yoff|I)l,bcoj(/š S1\'>n*޼ᒎlg)*7U>S/C)h40{[UwQK9'$@ή,IcOݸ 8ޖ-1܏I,!Mz._[TP8&}TY%0>&̀DBq(iw($𔿼YB`8<\{k~W]UnsQXaeQJÀ͈Obq_t7ۨXՁמ!#:&MT}S<%J_ݐ<.0S ^`&NVE"c.rbvjxyN$iEy2Q36Ѧ{v*NMhW/uL|}]fG`bf-qubh>Ԏ!^%B]*! 4.@ ~ea«f 17w&iAi ZuBiX{zkΓs,,o$ꑾagNA0m* kp'SC^]=@bxk,($VJ:5~.d: |za4I׮\=N@aQoHȋ ]`~:yv_}5j:/EUcpk?\D.|s1l-nafcו5fҝ IYD!JªHVįfI-lὩ9VHK:z4Ě݂k\(ͮӦ< π:'( cA__g9=Iz/<*g˼-[HH # 9 P;S6mr*΁LvOo %u=VGҫOT<ϱ,"MQx?BII %% O:NPcpݼp/֒v7̫ &5#xõoBzL>Noۈoųws2!lDDm77晲5[JL"/kNg]JYCj^v-8I10NMPB϶$<8AZBP `jp>uFn IDATaI_e~J|sTܙ.M01pP@ {G5<5:zF wC2k&uK)~ kOB Eɰ3ʚI4NVaIY B`Dkw^rfKl f}(yKbpϼ[0C>cl;Gr6rpَA]E/>/ci8>gH9ن/.7~%Mҙmǀ:kǮl@)x/h[bcws7aJ8C\֣0jo17%|x/RG^{p|ºV'X7+ P>y6Gn 2Y~LߜE3eph>oόWcNGG1bSnLEܹ!4k 4Ƅ<\p/IW]?G_7!`|u?RI=??xVQR/`|\[~p* w>@]tN` FOރW1έDK>.j/+,8eeCi;I40xW.=S(J`˩igB iaA|ɥz|[r9ʉ3``<2veOnڒ@ Gc;0gr+e)d5WצХ2ieSؗjˉl>OĄ3%swŠ&G&o!{>¬NJ/sL /NhLX:7S:>CnBLۋV]/-@|ځKW8 Z:rn@ =Ra-0X1f-0!o< eWq^'F C7&w<#:4I^q)_DiǙc U;hɱkq#օnJ띇Oa$Sgf~}Ukҍߐn`U^{~҃:5ExCnPqMedn(}ItCN%({ZcH◃{;o[]TȕΡb2Ny1< q?mYꠡ gߟ]Wp?ngM D f^X&_ͪ?,,% ^:͋g@"ozBI_[psCI 8Mtj0)4PfX.?z|1[cAq'AWtp!A`xg#A-Ovư0{"(0Sނ A d0t D/ը @fnR kUITͮpJ:hc+ǰշ&^W>o\@$Kw22'ff!* "[5%񷰕7>`X!ʶ-Ѭ+skBr'w q7jOzo!M[]ݒҙ3Q:GpdYZ8QҀY={ѱ}M`kB!B!Dymqz0e@1_dBğl²=XE=\ߑF%j5}|!B!<08OM(D4烗[pB!B!!B!BZ2q!B!BZK&.B!BQkąB!B!j5q8:_)SfIJ>n#ˆq|\σKeW-YJJ:.Fnz*˿#k{ mTYw3Z+B!5μѴVR!=v 50 jCZL_E&u#*_n7L8/!Z,9 -5Q q+neʥg˼-[HH # fJ>avUbM1cRV90ia HzySs,#zS;ᏤPRRBI?ȓX68A7t/:B6IYGv~w%{ۀDlJB:ve?ϊL ۋ{ b^)9ؘMɯU534̫ &5#xكjndR֐]˦*>8vwl"9v/BYzt=GČJߊW)baFnm!jI2kDp?}끉tQ-tWAB!i5u˨.WYߜ#<w:\i͇!0^س Oт욪rcobiy\ތ>ɼ%1hTN8g-!]1£_`]98lǠ.Oբı4B ^lB~lCfꏗ_N&Ic@pcW6P>4Gn5RC9'GY$3]><ąi=fhI~hrWMG)x/h[bcWAq6|sۗ=3_?W=[3odnQaU!ȭ/e;M.„oo~?a:]՟JmBC+)VVTQ/vCit's}я]ZȾr-I"jU-ERt-<=R^ t$g;Gx_4CY-ߞ,Kz75T|k_vN0x[淌cp??L !Mz.Cb-aTHU¡0B*0a0V&DGO[5D&7"Uʬ-8 V4PI,XJUx2Kڛ?(@7S% ;EjONO%rwY_e/uL|}]fG`bM#r˗^I/ocleѧGef_!>ގ63SqjCE ^r0qomk11fn3_SL׌Ţ|8_C/\!Hv 9;t1O_:x|:,\xό!ƕ΄ -(MW+XT9 kB{rÜeM[;#׿@\e篨2+lqjOm 'yU\/^޼OגёSG=6%^y|LWߝ,&d*H[JҾҪPV)ڒJVKoM)%-mJX%{Dv?bIJ%$17|!s3dfy9gY46+p߂-S > .5V̸Ĭ7ZL/\+B1qGS91}F<\kא[zoG}ߚ3TO^Kd,H4"Br |ޜÉـ?بp</=Q2%PCZEo_Kw@nC_Igx  X@a@T~EQ[U=( m! ^^(tFځM!1 Z3w}BTt+oH) y:吼?TnUmWDD-[y\=nPQjNYLIe ?slj(;O5fw”C2~L[%_y(B!,朅d:3lF͒љXfUL#˽bs *x$TD9wRO!B!R.,Yй7 .LR*O'B!Bj}}}xx%]0&)[mhG$?O$?&6O}=.dqB!B!4K B!B!,)\!B!Bp!B!B<;w$O>5nd?*b.v WI IY%7qOK(ƎKz( Tu3_q(<38jn`->kI %%-yVzK8}h;?A>4O&[R RHIAN9J5ԕ޳C#YJܢޙ?dvqʭ;S?ȃuYax+"ǧ&56e1qĝ:Zon& 6r"ЬT}0i3=B?"/M|}exf5;sҺNM{~G/)<Ճy^]?s_n2ISMǿysC`gC~8   {~zI6XuΎ]8<3nk9 ؑg[+Cu-8o'$t^܆ܝƏ?çi,}n@AiG l'og^W[nᏰAknLK) OMi:{-P:-#x;&j|5b`I )5UC``8X`I_`o7AT@2ntѰ^..IG_KS,nL:F<\kKsy,hAgD.h;;t.Bq e`Ag}=85zpsՉHT4"+q@?kզ] tz'}[N턕Cޡ)H_;~Ū>I\1mðXlPD9gwmh-eA&-# 4Yƭ^Ͷ#9 .[j_xS?79C Cؖ <$K L о%\}*35,Kj?ё-jL'ä ULtXg@´HDVO`yqd;`3;'B.UY໔Xh4oo:_zV奒te#徳$^?Mȴoݓ.UeRaB]ݷ2P;tu^CٱuݟeJ8vۿEba$1>m.cY_ebI.0 m*u)W |> F̿^zKLU *#Pӯ퀣EV\w!5kـ%B,Kd.g`Ǧo:o)mRI?^4?!cTOvLqfS-zrI r8mP]SjU8٩k"!v(o:G6+G?xj   tAD|!)v=L띟[;3ukIQofCJrx[V$7Ƴ57B7=zQ9kCH WUpY|2wIDAT磴 rdyO)zm`=/3'\vjfW g,P M8rk (K.쁛 .7ou<'Uڠ-Iؔj}ͪWLE֬)0 b4ņ#ߦվ#Azi冉 n.ğOljJyWsjwFf98ڹm&8Ţ1N|;o+ siUCWS{H9 NK{z3T.YUygY}@{&Uf' j={Ox2V_<~`^V ׏ IIըx3.{-?.PŞ)aR5>Em0ws2υsޛ9,Vw!j@Ш{’i:JpNIQyį+iea__/*0h,|0v^_Zkyj M$Q dfY /WT5ԫUg E*K~ʖG$?&6O&6ɏI~BXA[@)i(ujVED$ݮA>ɘBǸ7OFwxTD!B!D%@0?Liz5tǽ~}z=z= ݽ19B!BJ <FhҸM:)q!B!BRT5B!B!DPp?ϬHVM9IENDB`pspg-2.6.6/screenshots/vc-tao.png000066400000000000000000005151011360716715600167540ustar00rootroot00000000000000PNG  IHDR.7Q{sBIT|dtEXtSoftwaregnome-screenshot>.tEXtCreation TimeSo24.srpna2019,19:25:36CEST{i IDATxw|E^.=zб<`AEQXP EE(AzPB % }H)rI1w3ۙ5Ҁ T7;{o/O/b..Vad4>W( ,]z:95_>bDGEaafn^abÃ|^DFo @jժ5شqQW;fɣ~7o&$4 B4mܘMbE(Pg8$""""""[c)q&)θH&o߱_իW΂KXw&Kdł%α躿3\xѡ *K#Ѻe; .8L|R~8up68c <+6lc1(Ps8#Ōxgl%؛D7+' w/Bi2To֑n+P0/e«s9Z?4'nVRwx6@Y銈HvH__t u8P|8-2pœ4vO[ǡ2m _&wS~ƅ< yӦ?y"qqv;U`$56yz~X.""=8~>"hӤ9.s;?>?tf.eq3_>Y*ahFͲK?I8\e.x>]am~2j>>Ğogʦ!}*Һi{k\LS%;zq۷OϠ{u!YŘK)}xY֠*AhXD&wo_{&BзGe.]*@ W)fa9[{Wl(GîT=K5Ʒ50}|WgSѫ1={@5Xү#qJZƚcmcEv22^mސv%«h^[=@&̟ݠ;vͯ-ʙ\X;UnnV4YͶݗxzM̋8g/Lc?Ob3}zqˢĺgGx30 m#*~=Mz3-uq 䜽 6~>r+<1ٮTD5Nfj/XNL 4jYW0o>&t㝉-X2Ӽ̖Yyw+]a{]W;x`JҦ7F /x5ϻÚP0d^p3/0uAgoM7р{!o ayrˆ'jKz;XwUmv%W'~5)㱄QƔع22NHʨ^KVȰ؜_}8[W^=_Z0!{VuqoѿO&i3Űtܡޖ0e<1^r W,gGCr5 /bbRg=^փv*<ԄrBX=9V_Ê)f\+WN>{p WB$fx fl,1D!,)i@ [r3XSH`^ :=-ÍqB秞O6zSty \[4y1uˢy?f1J5]+ `s@f(?3o$` ̐$M}_J뙄b3Sd% /$/Pɘ)엓m^LQ""NoIlUdǞq~J::!a>~AN?8v857ǼO! /C*RXQ}k_{g_7Wb`y{DM|B ?bl_'{EbhAS>I>yy)% +4n^faêK썫H&,TF'2Md61C9GR֭[O+aNk .)!-%bZm@Gwf|K6rHϛrKz|KS2* +1-y֐b8jUߚr u<˘nlOR&H}XY# ȏa#(2>ckA'0.`@:bMNjV/-֜TŴ%"]:k7kqW^SQƑS=iAL๑/rqޚ4eh~VNۯ7q.P-5{.9eyD-UDD$oUr~WL)w‍"֌rϾ-1)aP^3y|o˂1{Ѭh(7&f|ٞQ> 5l;MV4Uw>u_2h >Qn~}EVxT-)⺷|ʶ?)+C)WEcb3pҊٟrG1_8ۙ{@~Z^lKߝo%B-\5-YtSk17",oN1>T"緳z{i*}[[LShaƷM,\M $"L2w@ d[EZwr~_ijxx̸>2p"f7cFj?$..f|#Q|' ,/խ+YSw=UMC߲lO9R kQL5 Z iѐ oûG(:KVAP;U5Kf-곍p?,`ԛ̼$”)鍻˕p /!~ISߑҲQ,*[~۵(%ktdxxgI OfBlo! %o.";lѡڵ[=OX}[ ߻|4K"][ӽF2NHr*-xvy>ͿtJv?ѴUM*گ|Y,y7?_?B{s8E$'q/N.}ŕ>Бu+M|a2+ ibccxv[C 1|'q:Xg9znn~2n22 £4dG'?OСu܇WX,,^*"/Ց?z+|h%f;'ٿvNըT d  *^af^et{y'UqDZMoHzf #pKeyqLz.H:E;3/سpq4gN4M<=t >44KQDDr_y,ϼ?֊ +u+R5yV}YJ5h&ߑ_b/'7n$UM""ȑDtuR> 3/ b&n|׀IDU׽56SRzd@s-FNtX0.D] ߢX;6gaRTJ3$t>R]ό"<"#OU9]zED2PzW/9#.薎g6KV+XZvv]xi/""""""yYN9"gN"N5RDDDDDD)q"'I&'dPrZ_4ę;X+gQ̱H9s/ql9%$6}-{Ib7I TNkj?¬%LvfѴf ͋wq@ˬ5bm썏DrRJ¿tzq'g0V4S0\͠{k0=9x9НxoGZ4EworN\y_'Z7G9w7W f'_s6띾' Vݗ5Mt1=S6[ߤUx] 6m/Mcڴi)_K)3{ըnPſLb q&63$t;s7~<`Kg?DlyLJ Ҹ8ӛX艻AY^{/][ú̞u(gֲ5Lyf#J`Xb25>5Kc>U±ZƢ,N~R;x׏U_b,}ZT376Z[!37?7{NI['m܃3]sZ<}BWdE$`^diQHM@ˑ1X_DDD$?ӻ zR= 01;ޣ Mt\6/ '>^o\ PѢ񛡬| %3MJfxnJVe3슽@f𸵐B&ڔ%p_?s;kU~6-xVNWٱ _x ;uSN` TKy/ IZ?DNX3|!4喖#NcNLZF)ǗDM}KvvpirI _R"#Nt'G|:^`=;Jذw&ʫ# _<τs]zfAϲy\Z5G^J~V|3qaOŋY4IDDDIO}C:.tY>l1?vX2eh.y t4cQ~xS's|ן۷1ܧ s'Xկȧ_灷Hw)]],_< ~γwڃǜطob3p>2.rR݊UBO/䵩<5Q%2ӕ:7'>D 2^_o# (]=A]OH<Xܹ}ߤ~~7O0 >ߏd"XOwL: OOgXc~Z㹟8sSZ'Zʕ+4<+W\-S 9~kkR^?ݠqP JyK?I:=KWT4 װm qOώXOdعETYo[eӷOIq}(؈YS`x~$A+;bӺ5QF4yp*-ahNLܚȄa.^e[P%zR? _<ݿg~'euox$Ekԧ'_?o^eнpK6[v)#`S73Cٺp[ 9~jϴۿ=X]>#fFbٽ|1{B0#\86X͛f/9e |5Ĭ$voexsx&cmD\ = &^V$:>k# ~. v'b[  \mӬK8񿰎\N%z쁙m1F>1{EDDD<|7̫ vq."ckxKtY2S߰q$G奆~ᵁlM SWPj;rq<(½}ڰg{y6+5] ;*ʩ埮 Y['D`^=̢qQ.&a[:OZI=ٸ;wۗZQU<7oV,֬P gKY ջg&)O|}jc'btR?M.={[]+P"8g~ .ŋ lyRp ?ܒ ʴ'}nmBwϊGh##ӾTjgc{ ;Ʌ8 UutόWixtY/ܫ:tckh/jĄWr~Ӣ|2uկ%~8VԾOVJJRO$6(cl慁,@aw0y\&D^Ƭ?D]gZ1+:û+OkW~_Gۡ-uX#I-Ƽ勼 :}=sx79Y<\{ލY <1gFֶ:V%vhP@̬DV?0h?)g*t̖w7|؈ O={^!ɴiGb\fI$p$l'獁KG?;7XҡYDDDDDD$ z>뿎N{D^3+!rqͦDWY'Nv]K.Kr.c={vÁ!x=Ή(b;mDy: >9GoϠ EDDDDLS3Z$_X.RWJ:dwdc'̋{ #,hl鿓O;'5LcrR>Gt-BjyG?_)$"""""""9Rg\XJ3`~$A9UDDDDDDD$UVCDDDDH߾};h-᥅aLnsg[9RKhy|",_慿گuk֢N&$=؂QfTזԬ\GQN1xQ]14z@Uˆ%Tl3~s?2i=u{>PkDD+l&w3́2B~ӬfZm ޖu3~s??[ o{*>UċL3~\ Q`M?Ƅ=]=heޛ>M>(XJ۟t+7erAN|_.\?QڴzнrB-3\7ڴ̤ѱ<ڟ\6h5n ]E:cMWR:Lza&.a_2`H}y23UgQ̑ F~EBxA zq:ۊ?ʨj[R0.SK1.;ק2ۊ65/y{ȼOyťloX' 8_JP~(/dE*\:I@vA~!ZNZ}1FEt~4p!Y ػ.^)^Η'g\ѷӤ  _s9MG~sV]̱C0(vsԳ0]wlxŽRnjT KQRi+3(>̔{/ J,c'g)Ӳ&Fc߿.%h=tv/ci{ُ2oT|i:Z0kSO8,×.ڱ{΢*Bg)./?OXRo>BU/ 5x'Sf\Rx߁FEB X7g]ʼn~e_S>rax7SKSQ&f VhRΉ/ե, D]]+WG?,{ްKS% %}Y$wx|̍N$ێwMc?f*է6=:׺')쫿w]?'_B7NϸZ6Zft,J|R bMFs6<ŵ {h .@ZթkNd'F8P2&>Lk/˔m݃/WI}jxeB/ǟ'FbI;힠ۛ݁'x̟,:=^/앏owg;wXF.~(o,d:~CrrEێuG()U:ç,Q'ρ3TO s6 8g7\=v+wŷx4.obs\k-[;qq7.1X 㚖پ,LJ;9gl<> K7-6\*飅ӔO6_;|r"Ŵu~4p!R% 쵼\3&ivd'I˧,y,ߗ9kuF'|rR eCgfxITڂsVv%\RRRϳ%̆ong3~ wܣJV9d1[fR[Hxs)Q8vO r^6EԚW ĥ`O}4n5VLܪRۀ.F3sHO3*WKoK\*rmgRx|鎏wx|nx$Ij|\Nc,wv΄Poh߶8H%d<*"ϳ=p㛗c!}MlYmC݃{(rL"d8َp[|=h܋WAxY,Υ qyoCOйz|.<2.v;϶^$-|3[vFKկB *_ï;`b'|0aiO3=ٞ7B3J<31cBD/9p! lG㸫_7jğ8/Cj%݌Z oqЍ,T4^ֽ;r6_6!8|iڴ('#i،Rq‘+pٿJ.;?S;Xtk|6ƚDi_Ox2͡e qߞ. M80gC U>ͻoG.2ѕ 4Հ{`kxri&bzsa| jiEѫׇ?CDQ߿\JаyQLzvPN#i#ipE"1T0s < Pp$> ]?`JўUkҴxvA״_vɘ5|{0jАjСVq(܉mvh_z9?Q&cT<֨:՛c!aw?E8=_G{c'n7c_&O:R0, o S>fK 8T8rF9[*ENCp;}ɿK.;?S;Xt~5j_݅GݜɿooJ4qI]R^Or|Og& <V/ .{HoO-<_>Ѥ*o{mϓXz}eqSS}.]dɒ GZgh^ݿs_7Ov} beI.wθEDD$Y&^-"ɛ~UT""yVIZ oXFWQsN_DDЌ ,~< 8r+Wg.Hޤm4t/"""""""NK"""""""4p!"""""""NK"""""""4p!"""""""NK"""""""4p!"""""""NK""""""" <V/ .̮xDDDDDDD$0;®A,Y,?/""igFcض ][3rĽZD/P܊R]74#G*v7fXj~(-u~`LWWmEs˲"9|n;I8(AzvLd8_Gu+W,>$(O3#\+WԾ2Q_sZ~ZCp-PSÒ/bp|%yO:):vi !L#[2샖NOZ4uʙ}onӟ*,E׊Itd c580 ۸5y楧(aauyT.]=ԋOP~5_1Mq#Q\oc)S/]{`OVX{/M&(OG0;1Ծ2U_ \'sҨ`P34pLn凹+۟5t >#QCPsfLL|` FQ][RrewŏEX&0 F=H:թXP@慿گuk֢N& ~d`z | ~0 o I&5 \}&.8'%mGѽFg/ϠCGWLd= P:-0 +#""Kպ[h}h\JҮh_7xW3FEF?Y&W.Q xQji".Nb۶(ӂRn͕ p΍qYbn=r)G˖l\;'Lȣ\B-R3WJkFg6IX WJԮrcDJw3+Gvegէ/ƞ{P"ˁoƝَpN ~wE2gh|orQtqg.2{E(H08Ѡh &QD￑P IDAT ڜQB-GLzٿ)ڭ*;:%b9Zc \=-QE/$F)tl9F+n%_?ApZɘ0}e[3?U6YgoM o 4c$t6,YϕARA-m~۽@GG6i^=wU=®-*Qۖ菝vL^tyz6FP9+mwdGǗ QM/MgX˒~myɶ<.&/e5'|fPV:i}Mɷgȵ_xK*4hżd~7Ц!gfnf&d GOG1jjcsh/kL 1WNxҟԾR_33tuߓcELR]}(BndMDDri^ qLe;J-8'h5gg3o_cLpO5x.T=+;8 AES42]VV.Sfi撹a[jj{ (ew~ &(W^p̜s眙333YtAA}^-!7mGR0|@W+ !xکɊ}iZ}۵?9M1;X^O|[WZtl )VƸY g9wP?WfK3CdoR>?w8 P,1ӡ;ag1h97-o2k]uqĥ+RB ϡ?@*}^mXϳ٬=L սiT mۦi-㙨ȽL0|ŀwtWucRW=ɏ&p %Ɋs\WB!?oW땡jq6-ψa'nwP,qןTHjd+Utjl4hN̞ceyq8I Y9=U-zHLgUR3ɴw)&cH̟;`kߠm@qa61+J81qg/3zjІ!_w_LW\GS/٨ErUh3]jU!9])>LfG }pe9oxg;+!eŇQUP3֥evnZ֔,4eP-vb݅]tv~72*Yi_e*_O ?bS>X7MS(n JmUOZ Cp-9oUT5&!=/7nH޽KC"Kqhvs+ #Yt^ƴƕQ0K9q]Xt_ !`+x 8{͛Pi~wߕ+W><~}7arģGo 6ozztrRUDE_xgbRL:Gl.؁;_kCنOV !B!m`m edroEcۄƿX"B!BQ: 3(ŴJ%;!B!BT -B!B!B!B!D9& !B!B[B!B!De\ ܜ< OB!B!x,PK7ͼoRIF!@͉#lw(Q׶_ISL㻏6q/ *>{MYO!;ױ%#x%[5|+%˸IUlFVHO%]5{B4Q,Y,.E LԜsM>|m{ $]Ə p uRa\pu#vt\goAeN4댨LGAɯ3` 0BXڗq،KLDt bLي//vhݭiβaJ7vx}ab^^^D/烏>Ƴ-?mʾmLoEKV_8PA V!O 4tg4tqK=K/'ppp1SP,x3d>FV]*Ԝ',"GQԤU++6&^cWȟTix_ڤ}7v6%2e2bzcƥp/",/c7>wׇؗaG e&5"(N.% `>Vnʍ>Ewp?WCo//3s>6IW_N+N!(W4:A8I|(H&)]͚p-iqO">]2cL.ē\ H2nR)ƃxn;tc֑xr+.Bbvp;jY)yN/'z kU7;{շ7ʧ=f&?b uY"B!Dq {zk"Sz fy%r.1SC! eH15T'_oU瓯bZF\H2nR1Ńk3H0Zt??;ߤhJ9楖M5Ng>6G|x3)n?J)"B< \9Vyf9h4&KWAPSC1J鑩YdmLg($m,˸IUlXeV,}Y]pw44T㏷Uv}:? p++ dVAm Yu!e:OSg[<đ#Gn}dHrZsB!Dy{gbo3/*L^|Nn8KE=b/yBEo/ƑXNZ*i_Mb3/ųoBԜӬ+݇^9>]_ϫ >t榵+ۏgb J27; 5_ޯxSmKϪ-cb'&U^aj?G !FM#U*QNߢV1)Uiܝ={Q1d˞x6JRQNBؾX|uZAcGuwr:ԺTI2nR*XS>q8I Y9=U-zHLgUR3ɴw)YXGqa61+J81qg>rCډa3鵣!Z=D,ɜ3Ų'#Ӭ]B!5L!sij~4Zozџ@[J!K*=+믌)Tn5ɒ߬Y1Ǘ|B!B!([-4.ˤjߊ7 /?g&Ofi>J)B!B<%J'pqcԶxFwWd7p[>!B!BG24A!B!.B!BQnIB!B!.B!BQnWB- 7'CE_!B!`PK7ͼoRĘW:ٳ2-knG\[4z/bfbXg1e?l@Ğ'3c )h,>{5=NkKߐpK7+_.O/5#=!?v>ґ}\fY\zy;(k[/)yzLpj;I/)E3dpz:'-5vo;ێ?ă(6^<ߣA 㙿oo"+X;+AتĄ滐PX/i_eH%!mӉikӋ-ܰ~ )ܺmǓQZlj-q3+?'!;x\2;Ы38، Cz*;DO~y ~} %f5c{ >39a314leAsG mP/2X,*C1uCQI3YNx?B5?\MD1ڴlXkR\.I(լGsm"6]%/Wy?  :(C.DŽ|s8Ά |)C0.J jt8{ *xw n]_gD?d<:M~I/VҾʔ>;#<yU+XpBZ@%=l!:G΄|ŏ{=K$ZaHv,_]Eꯂ3/2Y-)+3g+hy u;ˆ)hZߏڎv9GQYzy={>>>϶dfݴ޴^/™K ;gؗիs MեWmhPhmVKC-acŠL vZ`Zg~z}z&N+ n-fX!So)].<5e'Έ)R[B3jiդuX*`jW.mqSŧ 4tg࠸t]kiu~Q >3g?Cc$?gեBIx~"ȿ{7IVVmMNE=Ǯ?Ҫ9.8LW2q!LQ0ވ^:ϧSU3pI534u%'%B»]O\zL*_b3/ݪ>b d#~LX=q7?#'i P8(߾DFDEɅtTvMǜ˽H"Csʻnˉ=4V;AԩL\B);p𳉬_|l-2\"ZףY>Yg}cf0zvJ{RaP ?\fp u>TL. ː7j!xTm' VήX%%uť?Tt˯nO$)Y:GRLR= ݻ51TwZ]5:jDE3|eL:\'+.axKMJC5}F;u!%;eP*iQ4߮ Ǝ*TR21%ZW 1en6c J!(%Zڟm{~q!؂ tE?+.`ވucY{.,yJ:x Klt. 553k*uYSbkP:`IV.]ٓɊkNd#G_^5|x\!x>M>8^%յ&&%Kp2/Jꗉ5%/>d'~KSA\uLgQq$ӡ֥JcPnM,&5g5 \h_@[6AxҦ":8Ut_f_oBԜӬ+݇^9>]_ϫ >t榵+ۏgb J2zP3[gn$Fa\50|ŀwt#J?gH2y*WQXk47cʿx*ao䯴{&Է3Yqж|$8֬;m*q@14ki9+NjD\5F}^7޻HB!BR">SȎh:?lZ3)PAObݰ!%8y#RҠ;1{bȎ=lͫWonX+hlѵZNZ*i_eL%7v'߮<+Civ  G,c8|*E) Ir؛?}j^GW7*:#һUD}4s7pB&rN{(Zz^Ϫ+| f[iRũ3gڰƬT+şѷ=>^Cw=ҕ*u~+43_f g9S+ CJđ-?w󣯡+(-A#Ӓ_L&g'SΞCDWAK,; m:|ʺWLQ}7 ~_4e2S_ő#V0g5b%B-Dw5BG[Փ\K[NO|d4|5s?7=OEmҲ~;7-fkJyJj2^$/n~Q*7ulbT³5(`b5-a)hR-꭯9rE̷󩤤 9AE[H*clZRV|HhUŪ1ꍏvb݅<~}7arģGo 6ozztrRUDE_xgbRL:Gl.؁;_kCنOyB!Beڢ McᢹLZLց|#},PxKQʂiq_!B!(J'pqcԶxFwWd'B!BU!B!BB!B!($p!B!BrKB!B!(+pc3 n[m)I!B!yj)1>òMS*YV3{2@emM9cܘFOELLq,쇍df?5 _goݡ'5imҒN}f5Ui٦ 66(O.FO͈fOOFt$}:׷A.aul O$4Fv^L$@PxogۛH Ǝ}FJj:1./2lg,9Ɉ_G%'!;x\2;Ы3?JClЙ9צ=Zaqc5prFOFj,=ͬhG͉#lw(Q׶_ɸ.kGadQ5MCz*O#DO~y ~=u#kp9INLz[9~4׾Nf @!ȤcϱSߗ4;0!KߑJꞙ̊tvJVLSZXN9mBq5?\MS_x=hA%:+.]@è7L5,M~G/Ap#o&u}Nhxƿ-QŸQ9*xGi?j.k=)3f8D?RdXIIkLln8Wp} $3t;x^4^,y(լG։9yg0MQ;W<}0ꮓS/gt@{/"ԗtzٖ{}Ӭ֛> wC8ss dG̗ҶY>^zu.ɷE nCzlFoXj  V,gR;+:7v,l_ɟ1抂[K>Q)< 2 km}FNu!m);ywF/MDY} {&:U`y ,̇]hW3O< hE֯2w*ۃٿp45~&{/XHdъF|B2fX\MZvҶ8EZ|(:bXlg<|zd4Ԝ',"yjeEئTs *bD 5;и}V~+y_{5,|W˜, \g B[o;h#|KM)+9)E% 4tQ[ǰqU,x|x)x3.yd9<|$?c_%ۗqֈ(:Ζʮis9Iox=^yw͡z9gеƪ}':IQ(Eq~6oѓ??mJIXKDP˳zQFrdMi٩+__IOug9}~^zS|7ly{&eH ?LaY_ig"t/}͞GX1y3(.sZ]Mj]K'b F?dŁ&d,tǾd|8E !DYRU (`URBQ]\xdq^@լ = גH.xt˖W$.u,c:B<]q1@5![HoٛUpcIۏj ;3ƍM܌lĉPӹPzQ+쎭ggHN"`*4JG܋nxn;tc֑xr+.Bbvp;jY)yNB70z+Zk3h͖P5m&TIp4Tqt #| ')V/עTw'Ig~\*H 3 nˆ1ˉ3ZP@bY'8x": K,y/s4\ɼ~7ZkwͪҸ狸ǝ!p(*`j }:׻c ϞD3{Pl1\tT}571~f>ɋB1ڋ.oYt cƃ䒫.L1(f摖˹t ZL +s˖bjO='_( U2nbGγiY J~ GpYLcGyES8PCk57Mjkp$/fcҌ`O;S'#2+fa "~"~~vI+Yєs̋]NI/_ ƒڷݘg扇d8`H}d[Q@,7 R{5˗"2ѺߚKJs6ODŽc{c`J S+Ezkp#[owzugnF;]cGTrdӍzWdUˡ-Xʄ6>JG܋1e'ޅ6&B:x[DZ)5w_֊bay]{VGgswE4\8QI?1=@ek{[ԗu3*ݭO4Wd3S(CDQT!vZ<}&AoMK:SfaYV-?o {:|0{+U?LoWigArV@ ~\%#[:0G_CWP[0-~F%ɿLN!=4b Xvژ)uu͙P+,?n fidP+#-F`~jv C.$q<矍|oL`ALto8)U< 1f-6 &-魟A4~kb|d,FuSWhzbkiK.PecȤЯAiކ)O#Qi9vLAkm),Uo}́k-b̞O%%_́ŴkoZ6g%lI>8cd׻N"6-I\ )+>$@b՘oG[NC;BLMFv"5M(~g AKNW3zZJ%>݌PT5&!=/7nH޽KC"Kqhvs+ #Yt^ƴƕQ0K9q]Xt_/"BQ˱;w6/D=:5\quS ,O7*,/B!B!eڢ McᢹLZLց|#},PxKQʂi`.y/B!Bq?и1j[<;M^L[ЫTB!B!D /B!B!D% !B!B[B!B!D% !B!B[P PQB!B!*:Rb8 }e3o51UNfe=yLڴsV1>s;֣YL'XkJ52hM5M BqOjF4{B~"|6#йN͉#lw(Q׶_IS+xg)0љv^tAS@fi\աu%M7:5v\gul O$4Fv^QlxG3;DW4v3W"?^ҾʐJClЙ9צ=ZaqcR8u#ێ'jx}ZfV4NB;v'2Je<wWg7)ȶ_c9Jjf|DO~y ~} %f5c{ >39a314leAsG mP/2X,*C1u0)v~!珫17@v Kb:}|-PK/ hRæ0o4ne$:~*y Xy@eАop_/eyW7aOApT=DܺΈZy$(t::_#t})}wFR9x(W4JzB5u$9 z0 5Iصo;kX*2=JO7~KLDt bLي//vhݭiβaJ7vx}ab^^^D/烏>Ƴ-4٧Y77-|Kp&Ȏ/'m|i\Bou)lpԣ~`3UPKib9ݱ(XyĀ֙ީl_ɟ1抂[K>@)oȠa[+hl3rJ. ᬾ !'54jҺM ,0G8)rӍbo@x:3P\.W}4_©B_Ԯob >3g?Cc$?gեBIx~"ȿ{7IVVmMNE=Ǯ?Ҫ9.񨿴I*[&δ:v) fKGtJVz.5fƚھ䤤_(Vxk4X8R9YE|T3v6%2e2bzcƥp/",/c7>wׅؗaG e&5"(N.%kZ?\F:{Wws^Ntj N`jJQܡMd[r$Ǐc`oQt54*ɚ<7ӆѳSWߓ םZy64cSOQD`~!Pn;)Wrv*)..%/w~_~u{"I)(K`O+_^!VޓWLR= ݻ51TwZ]5:jDE3|eL:\'+.!2'RӹPzQ+쎭ggHN"`*4J5PB\F&n>SRܸwR#' #Vv]4MvԲR0wm18_*9bfFz_k [ْ ڿԾpҤ{ʞ58y=*doaӞ$%:ZJd i,яbb;_eɷ37as&amC1f9qP (T,4!DO\Dga>Vg޷yaՇܴ?^W~eLT ^I&]cwFuK`̍T3+Fѵ46TrpnEϳ٬=L սiT˿x*ao䯴{&Է3Yqж|$8֬;m*q@14ki9k+犛_!}z@vܯߗEX(fgI v| q/ɁbC@K_. :B V}|*sJU4w'f^bsT 1<͟y5V< ab k=!rARPR%ەgze(m|bሓe O\:k; IDAT!Q\T{SPpB[KȡꆝRS )԰fnFNRdViOgêo"" ྋJfnS+rrKeZdhiK喚ڗL=T@C…;? y=s=̜ϜQ߳=}p[3#\ShXR7sfW`ˤOSɖo"q{ lIJY:w3oÈ93Ti!oüWӠKdi=:~6 >!LZ[n J 9 l/fK,Մ eΊ%php%0Qi:rK{ϻfB%5KȝʹtX,S9i1;dCN)Z _9ƨ:@]ӌg[ՠYh`w|*2Ti؏UΝf̽]l Y`҈8`` SPC_GW -`!Y`c2sYk`/9r,yK)$sVO.%oeU.c~,_7 ] yLQ:el rgv֎EuՉbΕ콛Bf{aT̕_&_˕WQՈ$[G}vzUcXŗc_<";}g4c XG;E4x(Q}_5hР޽;;wJd_,'w&W=o[[ǜ9 s\{~/*r%"k\F=#7ί2䄓?[t^~!B!z9L[DXqdQɻ9n) 3RR !B!U.4Ό.`Y'Ӗ,B!BQ:ȣB!BQlIB!B!Ŗ.B!BQlIB!B!V \:23ї_5U1q<c0.]W"+B!BQ꽜סUƢRà$寒zq#UďX06Ver;s}M:L~^X*@N,>繧s햔)[fZajs|L!J,59C?|# T_ȇ>+$4Ԩ+}ڸ?2"%BKw^zq;~ ƆڽG+VjA:KڅUOYyƍy̾}GbkX 8G%I1hjՓM1㹰{;{šaY=z78niR%jƅ>)p B擟q_.^恤,IC13{7\h%|^x '@/8\s&-Ÿ>b1j"K0udS2$6wY~"zb |wGM W^,>_^N$-FV0+<0c:F%.vicϧ\ŦPg w0rl(~xgfj컦[@%)xq ߝ@;|VGگ+yCW1h;:59WߕFjon^t[i[Ӥ.u{ :{yG [&2[5}~ WX2M7YԻVIi=`&0g2b⺵LsB`ޗ-S9uǒ[8S&4`܌.b }ے?o UmFw@ɉ wwsW0]ʮ~?zU:&Y{rSݝ-`4/osl7C: i5#}7.dprvsO{B!52gWeJ)`hSέs񷋤|on[_SgZEʩ#Gs.bzr7L8HVE͸Ɓ)ۼ %(r]]4hnŜmz-& vԬbBJRZ J6+ ]KԍUIMJԱ2XPӉGگt+CVs"ؾ!OqQ>{ k!,`!~{Mb0NfiYp'ߜ%*:\?`^zͧy.cF&|DnAljO'v:?e:ؚ$kUmPN]L VMN] krf3^:q!d{SF|>?nGwwk29|m/9t4;İhw%DO{}Xr3?K{1 Y\Z61goayߙaؽډ§|zAa࿚riXUӁ|>{>Gگt*CŃk;lILFmKbrc6b`g>W}9⬨^Ӌ:㌴O<'l&F֮%SeoLU!>R%B/2qXjܟؠ >YM4_҆F '31+I(!y bjNK&-S7ܟ2/R/( mĎGbM+WImY38V*(z;1ݞ|7M;46mKϤcfF ߧ&nly8+٤JZVfI\6Ů=)p?IM<ŶYj=нuEN֯Yqwڻwߢqm?xu{XÙܿ,HN 9eƨGگt*C+'*rq74MuX3u*=_ &ZOY ψ N(VfsZ>.cⱕçDm ҩyz Y)E$Ռ|$hcIw Ky|иKc/긇qtڃԐ{Ԧa>_4ea'&uh:`'9}ßZ~qyg:>z>Fb`kF H*`Pt T3,3WYe/Zh"o:R1i8ܺNL1j gOK0k,f/)!l){[rfPQS1KGz;Ňթhc׿ cޚ#Y7bs7K|/Hd]k:ߟKrg^G}!DM|DzҮ#4lY3)ąCLWѧE5j(BREKCH ({3gv0ooz vξL >li&ū{|7Mn>ӏ1S}@V  >{%= ٱt@CaǛoS߰ Iԁ 9Ы˚Xb^MPX2g _:~ S_Ş#ױG)|Ӹ2lrb4l<1_w\w_lbtkx!fe9M*"&^Qox\5!DQQ޽IMůQE> dpv|>|(m_bAq eFؘ\֚?0KuKF2tR(IUǓ%oeȧXTY(\޻)daWFuy$ɺĎ$~|t9*( 2FU8#{14ȝ!iX;*Hr%o|PT5":)n߾^z|-Vv+ϭeEߙ$Xô(_allof!( {+Ji#r 4豿wΝ;xQOҼ|}l~󶿵u|̙3Ib;wwB>-'W"Hi޾9r**Y@JN89=S_(O7./B!B!eڴnNdL^G3`v:x0/(En.q/B!B483zOeL[ֳPB!B!DPL*B!B! !B!BcB!B!D% !B!B[%+pHD_ZB!B!J:BXt]jUR/nd޼5p JLqV0s:"S0I s KȉS<{}.ݒy'|>}6ģXW"IրB i(fMڶҋ;5: V;*j ;][Odr;G4|^Mvp5VCWjoݤ#kawfaZb⟧&TioQy\I[4E/.A(TIT*ZLa@>hx2M#ڮ/eԞx ^7eje_6r7<:k\>hsY7>hŕSbr[`"˱X p$}QPI F`0+_aWwDfs9Cnz/}k7[>2~_?F+EJ[8eǰ/ߣ9>pe2Ϳ+j{Q;'<<|Vʘ&ukҊ:>5]1`DLF^L\~.Xh2e !55+RqʧLhZEԹ]^q "[%8 ڌ-\av^aK'>TPZ"B7i9{2-[ULCtn]]$]?$P*Y.u2_6CS4}QYx}_s;7 R/ 3-"YgՅBM\1/Œ6oP q(qSyQaU h5l(`(WO#w-Q7*Iɘ:V z:{~SM^DΓULHIJѮ]]4h냹ēKn5'"d.峺'🰆3^|wBO'v^ wׅb߇3|{IFXXa P80? n[EkGLK469O}L6Ȅȍ;8$6N38wW[ܫi~MChVv(.Tg G. xkGcjrf3^:q!d{SF:@GjPlzP9de B*zGN0KSfdu_/VP(񺿳DNëT,Q=K0]8Tyx#nݽXj$g䀓m,ѷ2ap3 N8>.R`W*oLP96gb >@Fn[zti\δlPM|.i9З(%p-x1լ00Խ@6Sկ ULZg/gJȘiAc#%U@|7ڧ>5IDGڭ2gB!q&4KOB)nʜLjcdBj{1*cr]NGbq:19qZS3Ls2ԃbۂ6 X+7S9w7D쀄 wj8FWIԒp-mOAm6{.F1w.n૽<yIuhQ(VWԜ1Ɔ$Dr-& lKE-Z!jY9&عzPݵFYYdi0,3.L*ɧwoI`)WU5<qPi1fbG|U^D{<}-ݬ<2ۢT)oŃk;lILFmKbf% 1 2b 2/aDL*jϐø\l"łƎo @0dcMMM\%O{o:t\?Zϝaht~h)F- A[`.ԬTr2KI(vH!xd\Ϻ:^Gq{XÙܿ,HN 9e(CnL]B8A[f!Lha)oTS4PLUE)o.rr-ǑVBjT΁l6t |`EĖe`}qуS:N(V^{9F4~t%髶P IDAT2E]&2?1yBGCg_0*I'>qif#< zR]ִy(u8y:sgi$×y-h؊)_bJ' }B =xm$85`ND \C]|o OqGfu*[tDt O>ʹZunSLZ*_/AnMx#٩W8вU՚KUz]V0qǯE5v]$&r3#KYaM D*҈j%p-xsq>152NtU,NbWYQsgnX;\ *z2đ}7Fw&`v"*j6[͝R^}"qwXZ*GXt97>OǑIԯ] ͣύxzSI ~2Ɋg 96ln*ƅr'ɹ-9EA]\eqOr}o/K~:B%?J]GRi)رv7nS!'9?]^=\FM$1eKƛX-riBġD" ܚzp5VG" ݻT#ȉpt_EL%#r?_h S{*Ep]r;MBhTԴ?]V3c9}*89chk1aNIlU7{KA ~ oƅbA%pvϩXʯMaU߳=}p[3#\ShXC؛9ysx֫eseRdK78=6$,^㻙mr7aĜ~\b7ha+A i̎ 4ZCg? x?L~\I-7gV^M_֜V 6%ejtu^gŒ8k48SZm(4=$_;ܩ3OԹCר4V ! P޽IMůQҋ;53J6dŜch5xvU Վfvǧ)CZܷ~}2IfXZ 28u ;>K epk>u 61łf0,1W5aOW Zd輥Q9'iҿT%vu%AUA1o0Ba,>A NQN:Q۹wS {6"oP_EU#lիWעae_N.܊PVIҌ5Lk`m6F{8VoBD}1R/נA{ܹ*Ϳߓ~4/l%_omsL҃]r]:?/}O /gɕRbqnr~ܨJ;ʨgвNNOTnӍKxB!BeڴnNdL^G3`v:x0/(En.B!BQ\NB=Q~ 5z2mYBN!B!<%K!B!Ŗ.B!BQlIB!B!Ŗ.B!BQl##=}i%ȉ\CZn[;u5/!B!yj!XEi,:.5 JR*72o_IYULCjc_&c+9gA)פÄ煥r)z{Jy>OnIГQ>>BQwu9luj%J !D&s(oӶ7j> K'syvĐuOG?Q_bΫ[6nY{9cя^PH^uJM""h#_ArIpj)+ϸ1rV?<Tңٷ1PqmОkad:ɞ=q9&^zҽ3_}<vogϹ8T##,+Gf8~>ѝ[{.PD&s,aWRƇuܥOJ I5.yB擟q_Z8Dld\( &]ڠ EN O&-FVO."Zq㔷?|V ~yNOQ3MˡWAʾډ-merb9?ka^dӗ߲?=*IaQs% ?ʔh -&0kO:)S&} +~-=NNl >\&*ҨUmsËngiRVzq <d-v-z}?+@ZO,ԇ֍}p {8w!Suz 6MD-`duk炅Fܽ/[r*oPSػb+|ʄ1QLW/u[2=m(Pf= tIػz D;;yTù+c|aeW?= i{,=$jNlOwwj|<:be1o\ujG3~o\]O "EԟJ !D]ʴlU 3 mjҹuy.vt5tMBBm닣bLH9usVWrI05=sK֓ۼAe77'xA*j5NMp,GO]]4hnŜmz-& vԬbBJR n,8jPZWXQ0PFZn$կJjR2)oƂN'_}Z,,euTLJۭD}C$~ܥ|VCXxfًAwd 0f)}>CWKava95vO9JUtT+hOcÑ]dL(ܸNbt~>ssqu5ͽoK'4TqˋferBeZxFjpzt€Vp46^{7A1 !ݛ*7z=zU,^>|+(c.FLN$@K]81,]tI5^և\R^#| fj¹3GXw&OXOPhhx]KE{v Swav=(*zG0KϦ#6 :"odS K\~W-ċ/ZF8}.ۡ7cI|p>pIzѴ8zti\δl\,֖xjw[I7VB|Z,'s6#̨l |-B׽&%p|(1լ00Խ@6Sկ ULZg/gJȘiAc#%U@|7ڧ>5IDGڭ2gB!q&4KOB)nʜLjcdBj{1*cr]NGbq:19qZS3Ls2ԃbۂ6 X+7S9w77p4y{ot¸ zg_èYCZT3$3`dbȱ#\;}Ԙτ;p$j!(b;5#$fjI̶'HH C?]<^10ĘH$32PM_/Z!jY9&عzPݵFYYdi0,g*gv/î],oݫh`/(|*ɧwoI`)WU5<qPi1>}lk+t4`vq_퍤pDqVLJ"+v%ڗ+xգr^v;>5]I9|LdQ̏iLJ҉y}qگG6ԩqa)5m߿؋:a<4RCNK4rlŔ/Z1%Ub|> !MrXD*#V4[_<鸼3:>ڏudX{^@%/IpjA3:R6ף2WMe/Zh"o:R̈́rfZ:B)S,73bt?EZJߤItt}`d_jH\[-V|x^l#~CbXWŷWk.;KxV==v};Q].%p|(]sq>152NtU,NbWYQsgnX;\ *z2đ}7Fw&`v"*j6[͝R^}"qwXZ*GXt97>OǑIԯ] 汷c<-$LQoXdŎZs j gpq7ZS@BAu9Rϖ٠.TdqOr}o/K~:;4.Q +"V9g_ƃ[[3v1~BPlK|/Hd]k:ߟKrg^G}!DM|DzҮ#4lY3)ąCLWѧE5j(BREKCHO%[y1$)el#cT_:PŧCA^ b`Ofv,]8t:f7,H`3uBNjm1>+:*hl'2Vi-)xW+:+ YjsGu,Q>7"f| s Pn]_'B!Bܜ < #;*y7gt0EaAQ3^JQa]^>!B!i 'pqf(F?u=gd'B!BA^T$B!BbKB!B!($p!B!BbKB!B!(JVBՑ/B!B2/uDc0(Y +ٺ0!c8|u^ȼyk8|&)fUi3# aT 񘴇`Xt!MMPHC1ǧmo:ն}/Sӯ|0Ka0josxoE00bLn爦Gυs.J-ѻ/ 'syvĐuOKw^zq;~ ƆڽG+VjA:/Mگt+a_R'%sG:/lrOB擟q_Z8Dld\( *I)X0./F.Uۃ+axm+Wh=MQK_)6k(?/=oJfC5)|>8FOa:WîLiX¦}Dzbzzwv5k2ޯA O&-FVO."Zq㔷?|V)+d+J^N1h;:5\p̫lJ^T 7/-#'ի2I]ZA%tؓLeLESƃMy}hVH~8W @#؄ f΍y;fKM,iomAcC)[-oBɦ#ُҚ$ba^cG G6~ ڰ -|@ܺ,Ĩ&w?j E?rvOmD׏t!FSs;z.v!IWsO)WiB 9aqj9m"#'+hrt_M..FrS1(!16Idt*`)&&dd慧[ tdhtҿU* IDAT_f_``{]2@GD// ;.gnf[fwiͥ^$ ,8 d`>*aJJ4k8Oyzχ>)tSzAE'6`nB!rhmx FFN8^"eyK/rr&2)>'|tdzljȟIiLZTKėv)7?eu Ol=)stueܤ6#l|t:z2g'[(ѱ#u !x,nF&:%0zikަv/yJ)'XWST!;9]ĪfM\p`;R"?Au,qX)3^6{Qi*H~}zUeK~P7 6mRXW]PE"NWҿ_f e#֏?ʽ!3R\ס|qV; nxW ׄwhꔷRS1_-Bb83jt.kOOW8z$8[}oK]<ie(ۈ>ߦw_ uV[331q dw3K`DyIȵd-mcb}^q=fqXo>~,gbPAcׅ%?Q7K7H:R9,9@nB!lt%ܩcuyK/4 ;o@ݻݩatJ4Î r6w4(_+,./(O˾-2>ߕ6gK(WHZlkլj)ýaU1ŊCgң 謰T41YYY>[m>slg)I&Sҿ_f|jdLR[;}-Xsxy-Y2K_Y15+leט,"E3Q}>R/VϞ=]vlܸ%xҼx}7iYfcIc7o|UDE}Rx9oG&wK7R}` 4 ,zl&eqv~_F|z?(/B!BV/SF|*yg1z^<:4{:Zx0/(q_!B!('pqah=qJ?Cd'B!BAޖ)B!BBKB!B!($p!B!BBKB!B!(+pfvCQȎZBת5!'6/µbg%B!B!:|bNR}*i+5}5;p|0{>ۧV0}BEa,/mG1%Fme!=4=iШn((ް˩(6Dj\9c5Ē e봡s(`REvY mL`iioa&7&.ܨz.l0+vpO?*i1al~[+jNU  ߨ I $ƙ2A2_)3t)^sA\̬oNJZ4|{o|ѻ}PF]w㉨y?7m%@;='Uf`FbQByoSINMOhsɂ>9ɫ".˝X dX45׃9$߿DM9ITJ:ߙuӼnuUMכּ_5;. S7n !QQSrR9B*n\SO.ra‘#zj4TA1wᵦUI8sVgÉ#m^[ - [h~xz8ƣ'PSϰiMj5cbgmF7Uʛtn7/6#lۭfGnymę!_BT6@6 ci͛Oi&S; GcQl9ssqZWAs$`D?jΫ TlByK3Ƽ_g3%g&ltbҠהح7U@dӑGiM1Qװu/G#\Pс#Yqwpm؅Rgc ndfbT뻟iqk5 eX9'Ŷ ISz|FbeZZz<@w?;3dF_bbWN<Iy >}4uX3`y-_)ьw1|F*6 VC4]!܍ ݘuqMYKlcG_3*`zSUlŃdtbty$EzF,BlktϽ{+=3v@[z~MAwQ-0sȎ᪹;OiMLb4aÕiؕh6㛌DBݝ̭{X g귨ϕz̕E|S{䢰CfퟏLNl^_YigY9} dp8Gh;-gٷyfgܤD *үǓ c[auDU󬚾TRC" X[*1{7g;qٗY7c:sGRU+F1SI n2FTz4ό3MW!~f;R]{zAӸ}c,|7q*|~2-`٘!MY:3BrXd%wA"7^ȸcuxe /0zY܌8MtJ6` >M_,.J)AzDCT!5_w_ƽ^UɌ'_»M4֕iTH(S@>:wM՜r6~ZlZcWRTA;_6#lqXQ>Ym3Nܛ2)~i%aw@zMxNy (;1uJ#"D-?|A4t%?GHRS8IN&ڕVmj}| ZGj5p`ά̉>3@F.x?KFMdי\KҶJ0&f-u;c\B}&4v]Xr3|~mɸLtT#uޚ1~^4n7w&O*vصn-`NVz*3bD`q)=ڕ֠)=9a"5B5 3lYJS.r`[nfWH Э (. ΤGeYag2incN|·LS| 9S8+L~EުKAho\ȶ)d`c& z$Cf|jdLR[;}-Xsxy-Y2K_Y15+leט,"E3Q}>R/VϞ=]vlܸ KxҼx}7iYfcIc7o|UDE}Rx9oG&wK7R}` 4 ,zl&eqv~_F|z?(O!B!xiF|*yg1z^<:4{:Zx0/(F.a/B!B$и0hk4u!_B!B!D /*B!B!D% !B!BZB!B!D% !B!BZP3IO/B!B1/upy2{TS*O`%9y 4 3{WFL63iRBR0sBӘԵ2 싅ٱ#ٳ2d]f,p|2U !+IM`M]NEpķi'ZU?@^ةiʑ3縬 1({z扥|n<͜eF^Fϐ|$Tl([ x2C5 ПxMt[QdW%:2Ae…OMhyuq5BHj"3enb…l0C'os_vB1Ǯ\ngMW̯7{x g YO15~/x1CXȦݾ$=7"''jq Àllb7Z3-ۮҿ Tvvcؗ<ìvK} 7G4oNs'4j:g XO;[l^ G/f|o6 flzxPXD,skǶNTpwʴw\V^[z5q>᧾ue/2wI=W|i@j/|=3C÷g`HQoQݷ jԥq,?JWK芕Fң =R8AMM`5~ /`Ҁݸ&Ql+Ѹ]Gzn^4UIk !DQr4*&vUhݸ$"M=(^x-]A}U?f‘#zj4TA1wᵦUI8YuPb8v3qd{^Zy dz|_;+I(9qL}1IN/Ccos5(o".j(~7Ο'w$} qYy\ u|_.:Kz#3)TC' esKӹ;Y׋zd%ST&Q{V22RN8܊#^lZWAs$`D?jΫ TlByK3Ƽ_g3%g&ltbҠהح7U@dӑGiM1Qװu/G#\Pс#Yqwpm؅RG[7كG$&X?Υ RL\_[}'NO 5o3LBP<\ 񎞄a]wt_} U$uzd@zXZwۢ.rSLM$2u:L YdI?75l3ܼt+.# "0B׋|t3W2'+hrt_M..ކ?y/F+j9jdoŃ[u$&5x>6 VCf'/]!܍ F ;nZb s?6xVLLԻNZbC/%S6'O~$EzF,B%ݏ5VsgӫJN4~o[qsȥh!La2փtl#IB N=,[[Z}rK)X>hYNӺ]+r):K,ÿׇԄPLcf&5$v~@qhuz :iֈIzQT/`LH{]Qǐͫ\Ȟ5)vwkіېA7Ûū+Vv.f;4胧 v~>)?,l+fѣ, u,cz4?`zh#N0Dx6r #/Ж7hׄqϟxşM}RytSz7+ \ ZC}`^fk~OBQimx FFN8^"eyK/rr&29/$ IDAT5.E?s']Cf QWtpLg^ѓ2W/[HZ+_/@NQ9s< ?hm;6q"1%NAgAkIgxLNl^_YigY9} dp8Gh;-gٷyfgܤD *үǓ c[auDU󬚾TRC" X[*1{7g;qٗY7c:sGRU+FHIN%)S G7Qw*ۘ_׸,PS8` 붥Q Om<5_p'gRBql@}{X)զ`}N\M!SHvr5qӁMѮN)AzDCT!5_w_ƽ^U»M4֕iTH(SBV_=Rܑ rf~kJaoji6-̱+9oNG_gܿ/^qF_T(k~Pwٔ ͈봒Ytpûj &CSuҝ:%jşQ sY{УG$)ũ~$'_OqL+CyF6>J#80gVDBK #I^%q=fqXo>~,gbPAcׅ%?]Y2:c\Bo1h5C^gRhd$r-YK*0c߷ǤQ}tN=hBQYoa \OFW=X^NMx> Ikf4:Oڽ۝OODj1X-7osGSr~#?`[nfWH Э<+O+ I&Redefo9ṟ@s($qnW,:LQ[H*`gXx2t٨*(=#^ےm?/]YhsfیrZʓգپq!n00Kg|ۯ1II.n::vbYY/™eI0- 7ϳbXkVʮ1YD!g "|^={>wvظqK*ͫ yyd6n~E۳cǒ 6n˵ j}xrߜL %"nrhXL:ؿrdQ_!B!(^LxU"bxuiHu2Ga"_HQ I .B!BQXOB  z ֕:0~n|N!B!EC!}KB!B!.B!BQIB!B!.B!BQhWB$= Uk2xCI J;e 'ΟЪ1^Xג^mbϒquLЂpf޷NEUJ4dןӿ?sy/P)ݙw?q꓾}!sf.ra n~^WG$84XxH?7GsH4O2pOsރɸQI;-Hs?j:g )pD+έ7e8#7e*Ek/f]@%)l-};&?ffӞykߊ8gjeaƆ3}C|=᧾ue/2wI=W|i@j/|=3C÷gYEFTBui}"ˏ'1Uf`FbQByoǒk( _3EܥAazwm%@;#(`kQJZ{Q1-ّ,*Rʍ!yh,lȌhxkyQsHcSSN<9=<6$yY80o0VZ4 {κWlZBIQ9y̞ctI53VgBئ)+>3s{1`gEn;‰c{WF!(4?>3FkmΌi(!37IU1Ow ׆]hm/{uY=QM~LbB8M]e\l``.qa:8vM|y!m9ޝWLKP}3\/RggKbZLҩU2oA2ݧk| !0|#;@D3R_qTIBQ+*9E=H'bk"!-t5ttjv6S;$Fq16LCYRN`)&&dd慧[ tdhtřJlO{N J}+'+b3V_Vr\?䣛 5иO5%<]AÕjlv)u t7I#[fCŃ[u$&5x>6 VCf'/]!܍ ݘuqMYKlcG_3*`zw=|* x /Ws~[x*Eg6bJFqbgܤ qll,5wš9)~ևj⟬ݙA8hy?&m? 7z3+2WOT/`LH{q!Qǐͫ\Ȟ5)vwzbVP` \vP(VOK|,L<}ZQ0G؞UX\nu^$H ,8WYt@,JJ4A#] 3,*NmCЃ4_mL^;ΥV{pž'\7/C27k4;mt_ʛw%M;߉*g5ŝ(cF2I].>bX\^kL5B8ovMT~-]E|S{-_O~p>'G hm+߱1g'"&5>#[fC>R29y-%fe%\o۟V dfeN%9s>x\Ƕ)HOR6(m&SWQϳjbwDPI _7`me eޜ @d_f݌:JyW,V#';O6p,cDQ8вocN~9_@M؂%ۖFy]Bf?HΰA{8WƓ34-i_ ?M\>v7_~{<Ʋ1CtgLJ8ï.Iƙođq32>\.Q_aql@}{X)]:wM՜r6~ZlZcWRTA;_@%=j߅㭾4ryu#-"wH?ǵb7KV3.+G0){Bf6ïC3";:$v:,H )oat'N cdZppgԂ/\֞柮$qIJq*'5ėS2x?>P޷}zMDH̙Ճ9gfbgs `\Ys Tuahd`sVL潎P[;.@Mdי\KҶJ0&f-m1)f|ԟF_d3|}^<=}#w3vm{ S㽕,̶7;&Q>db`JOv5hJgΰ}t%s EB [ozj61򺼥\(A۫Y4R({>t`O"\+ I&Redefo9ṟ@s($qnW,:U#cIl߸m7RMI& R57 43UŲ'tKW}[e|+ m V}QNK#[g|モ1II.n::vbYY/™eI0- 7ϳbXkVʮ1YD!g "|^={>wvظq yyd6n~E۳cǒ 6n˵ j}xrߜL %"nrhXL:ؿrdQV!/a/B!B$/-xU"bxuiHu2Ga"_HQ I]^>!B!I'pqah=qJ?Cd'B!BA^T$B!BBKB!B!($p!B!BBKB!B!(+pfvCQ_!B!(b^P":Ke5 $ ?3ד1$)eNj.g }o;ٽ5j+;0\#7Ql=i1v6q~ϤK J̱ -OcRX+TB R#ؽaaSQ,mډVvj%vr9.xwL3Jkyb),=&-`t3'4ܹz[s66u]}-nHl>K*6ӆM<Ő.okjglc<|KcGNx 5|4K+%ń}coV9ZVy 79e[OģtX}bx l5. I $/oKWkO8.C tpWgÝ|yTn'`N-hP0^Wqv\%5{;1zQ H Jgp s9^9ȮKL iBBAM䏟Vpl_U]_] fcm[.^(ؕB=m>*wfr4dq`G8}yϣ8\?oXW,᧘ |?e W! ,ed>s3q=xvЕUtbaЇvm`9K%)l-}4n &i ?qN~<~LXglH0c7ÃƲ&B`;X; uUvθ{Usdz׫A ?5+{WlMLYVH}_/ OR#~Qi\/=Cz7݈UV.OdD4TQ0-G=їP W8rDO8*(.ִ*)'?{É#m^[ - [h~xz8ƣ&`)x6ii4;xS)I}RS9J*3i7@MH-"8;_8K܂aL#?{^Zy dz|_;+I(9qL}1IN/Ccos5-J"eX3OVe[$HIJٻ77,,ľ TbP*4(֯]ZbKD!ɝUKMz<9s9393t[C'n=U QIDZ&o-Щ=s,2% 'EGyO=wNo<ԔŽۯYr6 ":yq/ZyveDkMRZ˺#ЗA$Q9]N?`oIC\}3uEÈ*e]ZIz=T=Iф}4.9KCڍ<ǮS1T㹙xoƃ ykGhVgKQyaL/ݠWsʛ*7m`~'9wwݎ3{fAcN ;U@dص65q¹g gvy"ӌpl܍nyRGҏ~cڍޟF7ׇ@Sq|0l8ӗuzS|rd@nBs,8x"N k#Ao+n"ocаk!g3*ۅC׉MK%I6o9ELr )jo>i>3KL.a:ğ}SUξQBbhFlD7#0gY$% tҳqrt5: _G捝 omc(97ƪu+h}v_͘>^΅6HJ 7߆Uk]8Zg?xxILuC}is,_n8̕xÔ_\-n#7J\H IDAT[>Jx1@^aO8y=ГQ~s:=G ]׮:bUS>Hğ عS63?V%1ü#OpC hB@cCzR!X3Tk[3KS0qMj72֝mjytEF%>V^~x\L1&ZZ}Qj&'lhi8I/5=,sMeh~sb)@bX*0pYN؜}d/a|iRpj*.U˘'dEEXaB̲V (N%Pϟ| gٗTR2im`r{zާMxh@8ớ}ʢ2NLbšwb(bvLbL߹T81rL00}7נߴZȒΛ_{36T7jTϾ U-DI"qT-Dk;=]ycߐ2ܥ9 "v]}YI͠ GŊPJ;{WF8!lā߲/EWD;ADХyJktIEHT G<KMƹp;@ h-*ی˳q#( 7)߹c3Qn uH[kHa:o^-ܠ;.~fT܋".  iNSUԔkl{SR},Q33TRx" ne,6"MR],f͟N{6h.DxM뎠Z-~`btT2¼vaK @: _>kbC͸9 j+8WVB$%=I?p"uz`7p+wqN*ds`jQ eң?ϾCOFG"$YEOoܠezRK!oX:T$쇧+5;IWM`blKi`~]nRXguwR1 vo 9-(ݹ%=pYK6NU䱴]XG)'y@Vűqdtt-kM;#z8U~ͳ7`_wN}f{xӯ{+Aid¹Xx8x~xj&`,~ԅOBLq\[g6X*@w>&vff}뱐5jc 3'NFL:6+XƄ|ۀ %jAO R!(LR_fmKBgL^*]zA&n>ۯeBV ;FW{R8iT=}[H8vg;Ȏ_f}f#zldd֡d_\ ,OF~5ܸ0{_ WhzU1*S5#3k&ÉdGYh>~R\꾯Xz">Oo5.'ŬjgvO l4g +Om?6{F-)W@TY;<-[#XX726)+T=X;kȁq9YD!E"j^޽{;}4ogwbi^?~n~E˶EtD``v>;ǫ /g"oz?Ļ9wboUW994-k3?BQf!/B!BQP;dC,2fq):ʺ7-v5Fa G¦B!B!DA7 C~ cs7P(V3uΓB!BQ4ȣB!BQ`IB!B!.B!BQ`IB!B!V \$/Y!+^CEF>8_ND!B!Dz^Ge@|Hema_OLj>?]'N)Mn|j;t[П =ڱdj4֜FD yduܟ~8mUZU(侤hM1bBBKm;8y+ ]h[Sȁ>+6LIS^{6w\&C(\xc+Zu }n61- A! Ux~?ðr@'>7v0 *q u F<6G@U^Q ]|е bQ~tzwbQ['8p×xUcF/h/rl).w6/Y6qtq3F).' ^6?\#U-,_>7p(ǚ&jqǠy+N;1?w ]+;95+X6DŽJسr--ZWcbT/{yN7Bo~ț2#Xޓ W2Sc<\\vn>&:'^*Tg*tX|v5O⊫+UGcmq/ =\qIi۸x$˂]iVWw7#QOQM TYf=\,j.!^?(5xf_;Nj*XQb2 :ٽ|1*ư~Ȇ1R d\+Pʉa{Ӟ#XދNtd;:Ҡ |;pZQŅMc4Oxw9x(נzxCd>| IGHPR8=1GAab!(TԤ+ -GSﲘ(``YvJr$9osL*5[xbg;ФE5~;GT9+_9y9gr4nlɭKUQSnۯhxjev쌦N L>v˩(Tjމݬ1h0qjy#_vcP.75%bJZ7Bp~Ȼa5+-kBb/?5O1a B0%ή]'7o䴚LJ@,m|Wrbښj '˜TAǗvRk6ĚÿsƘegGȎ;dpѬO8^khc疚Iʃ[i:FG$őt[C'n=USJTyeAvM܂Y:is?"3sW.3C\Lau_ vβug/Tc7'te+"ӹWofq_3r5az@'R9HLU3[b%^!D~RU(O)42<{)]XF֔)Aȡ;r });lDU ֑1g8ZWD{;R5joI\#_ZUOFR4g~`_M:ȫsW%5%clk|xd~/P<W ykGhVgKQyaL/ݠWsʛ*7m`~'9wwݎ3{fAcN ;U@dص65q¹g gvy"ӌpl܍nyRGҏ~cڍޟF7G-NmL__MC ź O(8&!<6.{>ؘ mŴ߭_@m <xZQSKC j`ϰZ\e5dZas[kA)axmg*V-Y}~?S?ZJB3*ۅC׉MK%I6o9ELr )jԬ,!iFp3" }&RN?)gaJ%'+tkt3wInBF%>sؕyc'?cv[.Wjs{O kX;td~/V|+6X≍:j6$l?{-r5.ף㜿<ɺ{Hc'*ȖQ;87!tğ 9RZwJ.N~xbyqGz1>UC[uG &/>`Jcg\.R 0֧bNDZ+˷VmS8\Bד}@&4lݐۛS1Vr.^HљbM"18}Q Pclhi8+ܤ󗚞HR9&qX4_ŦRH5!6r{GnK&jOF l}ʑY+ׯcm9>֝mjpvyUY+x8?["+:7 +S,'oYjE16(-gFVmlSNzO߹I/ X>x'|wOYt@ƉI8N*kv1w1y].+K?fZ']{Yj(wZ W;.]AK%4,OiaDv{WF8!lā߲5X2w(K}S"ЏŚٷig4m^(,]jR#;/!d~U<R28s3f&_aݬ0 t-[LZV/Ayw\ IE\(>-)0k9:X)fff=D> @dbYl8E F*QzY4??/2m ]"U5 AS:ZP~3q*dyח:tn{@ѿ3~} ņ6q?s)2Vp~_6tȒPI8Gaڌa Y5 Df/ȌOoD–'0cA?~BzD߸DXB')g6NnSLr.^HFG"$YEOoܠ^_=N}{\4Ūѧ"AOe?<@`d0{3ct+ʙ潏Ѧ6&]b; @ jZ$gO_{,WM8֕8';=+>{/`VZMP!nŅbFYP"ʽ3sZPBQsK;{8$&:LmpEciaR ~3N:Vc/Z֚V#vG1qJ Sgo@ 2_WhmȆs{R320p6M/(VoѯY> '⸶m0} M$imc!k@M#fNt7`=V,[gct>md5z࿠'#ڭqD[IXdp8m15?Xb~PpkT7,ғұM,3_J-pBfz2n^R:+gWy]E,OF~5ܸȻ0ŋHŌFЫ̰4UX3N$<8BAJW}o[5r?fhT#=ۗ~`[9}y;G׼2okI| x\m:2*|󃢪qqOq˖-~/xrz5s+26)+T=X;kȁq9YD!E"j^޽{;}l-^ճz4| 7ie":"00q b]]GvU煗3Zp 7 D;÷*ҫjr|~?(O!B!xico>bYEΆr ]Q‘)(f.A/B!BBܶPLlhхխO9tjr('5e>=*>Zu MXZJ7ŘvhPIs+PŻ3:`n"㹲o#;D9e뵧ks?ċ(\xc+zNa͹X\B*Z1^iL]ѫig~{81D_2aicFģ0bQf;ѳjbddq5`3eK]ɻNn ~#] Ŷ+'9;UFU^ ik1.svSA_JcKCxkՋ{c!;/Gz2?^rx ;?feۅr4q ftjCqU HDZ.w!EGy\=wNo<ԔŽۯYr6 ":yq/ZyXˈ"2֚229uGn/e̓Hrj$r+u$w qΰ#=vE!J'LXc׈Ns~rn&5Im0l[#>]Es:[@ Gd|STȾop+{ХQIϮؖ+ c[x'|wOYt@ƉI8N{z*)YpY2{FQJԮ^3O3indņ6q?s)2Vp~rHֱd?aM$%=I?p"uz`7p+wqN*ds`jQ eң?yW)VhHC$蓂-TxX1{<[)hUOE*G^<*ƶ6 ءLbrx) 444??݊ryq)+ aeŌ7ۡ6E*{g,素vwqfI,Mt8V͋>.watfuX_ҵ5>_G쬏UcTi6~:e(MQ瓇R bfd`ms$cbNV,I@Ʋ+NelL PFAlSCz,wt:O#fNt7`j!xj&/k6%eraax.S \72!+T _GD=it4ξN$MSu3r/u>B3j6G2PUPLw/7)GGo :蓸_$87ǻ5᩹hzU1*S5#3k&ÉdGYh>~R\꾯Xz"/LҿUN㫮$c._© ,mᣎ)C6i_ ӿ6G@>;'#~N&UUcF/S@;B˯]]?c&jHʞ%l=~.r' ^^Ng)GՋ+ӧr %/Z|1'de\uʘv+;*xGM!J$M1a,j %ZǼ}AXx~L\߳f TNnf[;'~G=tP,Wy6!to~țqULX Btɉ9i<=W%68Vd{&6IM_..]W\]]q:Snt|ikUOMƵ{ ^Jz,|כU^>zNa͹X\B*Z1^iL]ѫig~{81D_2aicFxQ,*Ӭcg:z虠͐Pб-{̑L{grC)'M{`I{/f;ґhK^,I`DMQBզ1x ˙y㋇Ҫ~ רw8Ggԟx 3S{^'Gj΅wYL0Jf%E՜E9s&-<3TPhҢ #I_9y9gr4nlɭKUQSnۯhBP.cg4uZx`[NG1RNfFU(-w~4d`X6\R ~U1+GIC4fTp'9:O'm_@1)[pUEM!nX f˚OSL,,`?q+yɍ/c+9&Slp23˺c[e4._ի\&I2ng;D񥴾1=~T/9'\1&kr4k'SΟ+%7,ܸs hIƇ9ѫV9(Օ\. r)3]LJu&+&^8[\Reߤ{ЕgC?xjO> _g8x ~eՄņV|J2x"0qW flB'UEԭq e1 ϞsJ/Ed5eJerh-B_DtB:+u$w qΰ#=v,PMm;kKC+?qmQd$Ez;дC![qRHq܋V)ipNPvc,mbkD'ErT 9?9zQy8ֈhWΖP._A7U0on~寋 1tf4h3cag (l>֦&X8#> 4!NfR/g㇁( o`k]]swj?])XՇjKN±pP!Ddx21waޜ ):SLI$dz4jj 0-'vRI2$F شXJ\4oRcct7F_nm1pYɈM/#[97w?rsdv?/J? 8r7`̻%DžpzF~Zǽ}EV| \d_f޶Z@xEw*6m=˾\(F7Ok[۔Ӄ}>wnF0 lSqb+=+<|F1g.p `cΥ‰Yս8Q;9=Պu t{*hcFw5x¥Λ_{36G򑦄g#VR-e̝hLx^ҏ1AVɦz^ !•wz*1G!ƾ!eK/`PRw K#{K % 2 mG%g#\7㊕(s' =q;%[ @:I Y}F}Fe&9"Q-Wv]}Yqxsvx+ZTӷgFz Ծe( CJwnL+{Z9z=tμekW37(˽}>=)ŶCڇළT5f-^!T@K== ,^G[l= gHST%jW/FϙJyw4{FU7sbC͸9 j+8W޹]"[r^E_tw"7{E6tȒPI8G<ƴj^bs_3f-gO`Ƃ~ܛ=C /(2q,@ORl:Hݦ*]bE)¹A5ˊ'{<[)hUOEUl f~fnE9ڼѸt$v*i=}TRBl5\zw*ƶ6 ?<$&*w +B8?݊ Ō7ۡ6E*{g,素vwqfI,Mt8V͋>.w_tfuX_ҵ5>_G쬏UcTi6~:e(MQ瓇R bfd`ms$cbNV,I@Ʋ+NelL PFAlSCz,wt:O#fNt7`뽦j/&brOҭ%wi :cN:H53^R!_dј5hJdሟRn5B5ٵuY9Ӱ0r.r`Q}7$PxF^ކ)O(f4>^U @gE̼Ěp"YQ߬W⸺+xL9J4ƞK}?tLҜ>}{/u>B3j6G2PUPLw/߆?|hWߒr9R \72!+T _GD=i"f+|󃢪qqOq˖-~/xrz5s+26)+T=X;kȁq9YD!E"j^޽{;}l-^ճz4| 7ie":"00q b]]Gv /g"oz?Ļ9wboUW994-k3?BQf/A/B!B<-|!s8 esZ0#aS^KQA͂]^>!B!y&pq`ȏa y *wfҢyB!B!yQB!B! , \!B!B!B! , \!B!*\ 54E5!B!y=C#[K2 y>0'&p5.N|>Nܤq| L|6;z8 ,b RڂjJKE ZmUZZvRZB[,IdC$Ȟ,/\y?ϓI3grΙsf93&snYd'SFBajPvoBpd c]NM x>H5yO>s'fo=/T@J#.$pƷe76qJBgHŽ! {*5L6KbI_jYۘFbqna^M"l*o:G6hI*D*l~d(x4lGupz_qyư^kGܵt ܺv j3'C•e8Ԡunt4B'jNFTEJX+`XNrYU@.O=?Usϫu:l ̕C E\yꈊLBK(\;ï?,+wCѓ=gBMTAǒ`5Lf6oENE͸MQYc*ǣ&p)6xyV>NXj4X9P%)IjyݢaZ(y_iD>[pݪ> + t; Lp= x!ǗÇћϰe7hP\z0Ǿ{  l=/r|:Zj;f֍n|8ʻygݩz5ʽxv;W1}9El%Ul߲Og?:zykn^9z7rfT 3MF5?!֓ce3u$\ f$gO)8nC0a=c}v%m #J ZкX(h^A<Ęp$bn!D¥cf/2hh1/3.} >S毽s4tJlOoNe1{IÖd3кU'm2@_k- }7U9p߸JUﹱ̽ub qt*sBEFڝ k߫&-OR t*EEDTY߇.OK!CvzǷtX !OL}񽽇.a1u7&ҟz д;,-uI<}Ȩd\]ٴz)Ji,]EkYRoMz*ؔ¦f:&7GH+]F 9Oz aم)3?)/||1 vD GY3Mp~Dy?lyJ6S m">2Whb(^/v~>5t_T+K,3u&qxp Q5`bQ꾍+Ma{WRZ,pƝa)L4f?k~ Q~gZZк6f쬻aBz<* ~C[\^NdpWvxu85 ÿE1wbDDe_+bQfTq嫕[ Zj:{)ʪB)S "u$yu%gNr5#ȹ,R*MNCG,_7o% OTzN'栦_`̥wyN ő?B컕{_37Rv*q$Aqˆ,0q53me0$oPɈۉ;dÇ3Ys;mk`uB&N.PҾ v-?qjnfrepsQ|8L;?OhGe5:T13<3.{(Tr evUՖ ^ [-*(g|0pꫴRfІPKτsYɉv&q{]v|߼/O9Õ*Z2xP~p f.4lz]v6_: C0J8݃oN)_xqKj̴o/rNZsVxwI-&qsLۗYH6Ke[߿EbISs<֍Oӣ-S&FPENM|)4|= ]_Uƣkдn4;6.dT25K }2Zl\l;n-}zT ot|Qc`Z6~9JQ`zדgdbKѳkZ[mTkMN9VNC*\\a 9RJw|ɷK[s}&֋ؾyn5.mCM}|dzaIIN~awbXϑXSrBXkIo-eJC n]b՘Nj ^3f!( &E7րk׮l޼ m]bܚ'i+nŜ8t79h~k`"*9׹@J"nz2'`odU^zb-*O|r?(ķ_!B!(fUK>X8? 3j6 B-EU$RL{B!B`wFň~AF7V !B!d0τB>nR#W{L˷uٿM__>v !B!B% !B!B[B!B!DeZ K+-JIͿhʷa/!_eW68>ͅ%B!P R=[;6R vU[ѳWkV.@,[sfxPz5r,'˿|n"twrUvׯKmL{+#5*OAw#Bnv㛖 .8R0{`&o7#Y!/J :(+}f&g|/ Io2jqj(4)M8sG<|x}XKd37;:Sƌd5\ #ڸj0s/31<&`C ұfaq3{GQM=OwKZ@- ^!80|qL|7='3H0 V &e3+ɒ7C*QGx hN77o WpR֎$(K \H1z*%3.Cfz_03.gM{;i[Tv$';ZW_yJ9VIjJAUVJ3jZ/jr]=@I2Arty2j2WobC\(XUMǶ<㎳B҅drϰRtڟVQY$G䷍#< #iݼ{3d荥ɁPnT "k\ Q5=Sјҧc֟ƕѥΌ#sF뉊3N ߓԢ7mU>0P :o? Q?3cHFqwMgC|(F9c2_m$-\ܰ89oc99F%fxwyR΄q8]!%+5/繌̰+_zD+wM_嶵(gN<8bOcÕj 5yMt} 3n^](P\ؼsrR|(gCc^x6 ' eQNٷg.@cgwj V.Б܄U8.Q !D!SSq2ʇ}q٫%C+xx4s5,%xyAEF~ Rh ҳl zX0$Qpl2v;Yuv;}tT)S6ZkOǹmx%WL`@D8b# 7opCAdNW:kQjTr,T \e6xm2{gmFD\p xe%5x736}&Cӕ<7aη0+M@;FPD99 DjV&YeGgd_žemRw4+(B@3{KNGy"E*(|Xv~ =0--ٳv_&CCx$5+4=I7R dʠx)¥&! ,[MqImxzԜ!ݭnn}>ȟo+O'SB \h\qLPIZ ~\;SsZ}`3$&dC9<+eQVIl JYڎ|'=`VÞ6u]I*GVV8xa &vƤ\?:ǣy<~=O~ 9#mkӤJ$۾߾Ȯ[719h!-tjU uvF!s.aQx3^Kȍ(ךş$x!(t[gز [P(8E&Ztф_W5Kv{z-)'_pB >c-)7jW+Pa<*Qyt0T) c`wcǷ",2Y{_1'h[3+7z?xl?tX#>IzjѰ5 рδW Ų-^jIVAcN(XMN (wBSzӼZz&:aէ4pBʍf5G^xF͟usunCUib,ҥ?O֝bۮZ FMX]Ep& ?lowk\<%!SĜrV*کn?~ # ǧsgm4vt NE6[D/\H-=Jɓw`7%V lw?7v|1csg; M8o%cUϣXe~Sg\dr3ٕnӾQ%Y~4@Ok>K$Cfr<1gػ~ 'nwSz7J7Oϰ=7>5iDk䯏d<os# r͉!АdAvh1_G~9z=>O_l T(4=~栵Feڼco8^ȭOo Uĭ,V^iDžYj'!(? Hy[sn]`ςv)3o.`0ϜK)%;C2HHKˏYK tAofm? BSNe=6))_#A_QհΝ'a׮]ټycřv=S*qrl~tT,+0=4wB "?R~E+((辿׮]K^<,'5EOo&W=n1'N$ݍAl tq;x0sBy;teS54NTOrRӁ.oFЌwPo3ڋB!B!hҚuѩC7w,>s#]Be-S-M) }B!B)z_g ׇ]A/:X !B!d0Xb}nذ_ !(|>ݤ~Gʯh 0྿SRRJs҃[ںߦMd{y&B!BQlIB!B!Ŗ.B!BQlVB&#=CI_!B!(au-=ٮ7afJ]̙Ks*)Ui3cf w\Kmڏ|S>ݟNs[)K>3z ʚVhJ!M[LCvVttw4^ܩDZԶ^&٧`cFB4d^;/BL": g|[vkw`o?HHm2<[:8=qD2$saZŐ=ug{?ģ(vuiom$+XGF$bs$OlB5/?زnڻQeg:4tRgbw`HJ I0Cpߛbt{?X<#/{V5vAz]6X(yY> _ `ٿ,ԟ6ȱB<_?|!>Ӭ_M XPp\Tt  ^Z>hrpGCxó4a7?$^5 8$/G!l_4Ϥݳ3͗q5\eKXocʙش'Ġf1d;PD3_cX|:3:ۮҾ U~' ƾ.'uM\6VBQi8Q-+acm:.gIWź<>W?VKe谵 +- #E4 EZ8a`C*$b"g W9vL_[*X((V4o['{Ϫ ͩ%FkVfl޸(qtT(GMWoj,]Mpx'-:`(hQtf|0U}VvN~4v)z=9B/7aXo3, >^w[_ŋ\<3ր)u!෴.}{w^z%tͦri.DUxqlϙ*v pʽf4eN U݉fpLe픡!-`lNޖ]*zfV}3=G0ݝILyq:871l2"w{y5;ktbNs5tVX3ɔG!JFpsL WY0 dӟ~ N&9 gX)Su IDATX]w|<}ay_JNh)^ƹUGMEA1(XgΕ$Z 9䔈[ss,8{xQmVY-% 2'(CU3:3hXoY`ܒ{[h`'m2@_k,c]:zB*VTug0s88ay~8{jR5["#΁>cװ*-+TjуS'ѫ}ރtx6C?1n(jh|žTE|9kVI7FL5yeI28B44ߗ_jҤ}>XSObVKMw5TjwU2`lZ q s.LٙP[̂ۮ"ZDaR6X+w HŦX65+4=I7R2ii"}hb#Mz[niAq9'1ȕXf/sE_.fRke{O2x!*=^%:tD\\qɈ""kW2PY( š_y2&#k`{JP+p џxo{>,QI: }FݷKx瞠j$b*JޖEOQ#zץ.yOÐ'2fyK/qr'2=^:_aѓI<}j󄙻R "A\y~ Rv4W+Uc2^^ N.PҾ@A)OET=! X&`"SA9~3e::)@GV]V7ѿ~ܼJM<g۩T dǑť #:Gpt*j%\B|UH\;[ @%#z/n'TɆgx*XAJj4q*I{յ?YqÐ֜b怚‰K9lZQ/H~r.WGi: W !xPB Eκ<ӢyJ)ظl+>9]~}*y^F[q >Ch~Դsl!WsW3c9~2(ƅO)C ۽tCZ펤Z:?5tΗ {b:պ@I*d_p$@Um+3+Tr evUՖ ^ [-*(g|0pꫴRfІPKτsYɉv&q{]v|߼/O9Õ*Z2xP~p f.4lz]v6_: 󒿑@&HAc/ >gm{ѽ1JÂ\{Ò[2+.4/B,sKa ^!f7.sFV兀ʨ'fѢnnTn'gӍrL|B!BhhՒ$2l&Ώ#CLlPx}Qoɦs?~!B!*ƝD1_Pэ)HvB!B!(B!B!($p!B!BbKB!B!($p!B!Bb˴j6JjE@g8vۼ8!B!(u-=ٮ7afJ]̙Ks*)Ui3cf w\Kmڏ|S>ݟNs[)K>3z >fhJSڋ-[babBaPvoBpd c]ta! ;t,4Ԩ3=x3B%/'ÿ~]emc[ Ƒ={5}XɦvFqyư^G%=:s ֡NO8飒yr 1,mٍMܱS?:]Mfsoroz7FIMt =ƞl*=h{k rO'FAW_cb`5~!pQi?j1bql1I^Cؾl?:1gi?o~`{IXU Xz 5AvIТ0`âLZI/6';Nb]d^f4KUGݨKYzc#}!g7x/wvSӤ7޵&.]iՄ~ޞ5i6Rԛ2gPKժM]gi-VLDceeL FƳZpAMM`ۂuucRQroJsXe[̋RVAc_:qc&.+\} ^΃QfnaQ>ov1价)gX6<=ݢ?&˹#il={>f xv>RT ߌc嶩]B5'#*Ӣe%0wMe9{,ta*ǎkO ʝmr$qsVgMMTAǒ>oVfl޸(qtT(GgK-ͽnڏbWiㄥFXۍf2^X( SGTdRn+Ǭ+;Q^WD[x"Lp|(nUƆ|Sa&]J@Ņcxzw~a|;e(/vk up Iȋfa{̪1rùެݕ>'-@v9Ί1|6j";=Yq'I1 Y7a;3}1N1q L>]o2`*_1yk=>e$+(L+ 6nFţeklbH *|;EH.+nND_;p4Wjqܨ`*sNo "iwýgym?[DaxƽX^5yj?X~Djdp\ AT@lLـ$oP2'PřcAl}LK*6E{پ#G$&ؼ86j:0jv695Ĝk謬gY֍__(C_b%"r@w?1!.eczt}H_Lߙy ;jE@fv@ Y~{} c'o Q !D!Sl=Q!?\&1SG•`o8LBzth^A<Ęp$bn!GʯI.s5,%xyAEFI$hZ~rBO2έ:EpQTЂ5,K1VyՃOGq##S -88M&1hkOԒ| >+X}]gY]O^o\%ʃܘg^ e=1qp6'qxjEFڝO3|ƮaSU,[2WԢ#NWMGO%l~cQ{bR [%3pVbHim]$=C"lX`5`a+kudhYU!" NbFl0knJtT_묷FB3%=0{4i߄u?3.I`mFߡ>&#83mRKJ%MouM8.#ԇL-NģߙE&8kym?]23 [71nPpT2`lZ qco~ _J'KPbPh }e+ P(U&^|k=x!}+=^(VXf=гqxp Q5`bQ꾍+Ma{WRZ,pƝa)L4fJO3햮e{6>ԫqSPk;s~./ۅek*uKp|Q,ȩb^E&6[E/5lZ3e O}S,r+}A"L\'WU~(p+Q)z@Zۛ3-jatHJ5H=mw$סX)|RK'xo8>;mk`uB&NygtyB;*7ۯѡcAB jf,Ǐ\7w}|}7+<׏ȭv% w=^S(4hB_eŬV4ajQqFY8{S'S_mu=~06dZ gw&,CJNd53ߦ3Ʒ8MnxyKOTՒ;1saSg貳1w`i`Dw0l蜈܀El *h{ȧPpl9kSP^|wM^z%^qɰ}lt@̟O̫o\4}^`K]{c5MgVљc]æl:˼(?Wנ)?c~oia2PQXt7ϳu&hTIQT-]аSײPjӻ^Aކ)N?_[E?_sh2m^krrαr7JWc̹RK=UHi(o^Ķ)dao>v:%;ȶٗGUAiȠ6VyC2I8D!1AQհ$'{?ܰaݻwZ 1, K, V䄰4Zʔ(ݺĪ1Xvf"BQYu &طDŽ6P Sp$3PR#;]8a# ˢ\6ҀN= L&K*7LVn?m$ 7Ztmoڸd$=yKaM낥I\Z~ HUKӴϠ!;0wDp #^i_c4kt2e#+(ڏU )n-sobr4j%NhQpAIaQ쫻C+bzdAnQ ;Dבl!D/ #qAx>9SR<2ʌl^PI4A_ Ui֥07Y|ҠN؞#p$.@US>ae~sRפ x(~__QϦC4*Fr : p4aU) I\h?q}g;o3tEob<-waצ`V-O# K\6$/W/77vdS2ؙkPk[G\=jeZV/u# X<[er/qjxyK\{rcwh|/Z6í&~xHxySN#ZΚȥ,5j%1WHf@l"O?ԤO[`a`Hj-Ȃwl;Ucb%s>_w.r:;7a?6X0qjJw\< OνUhPS -.q}Uu8w/R>oP??3oGJFοSkL%(7t g9 #zլ0$֮r0#T[jh|.ê:-kj.uN8vj5WB0VG\$Jx2z[4z ɮ!ǣv5Ƴ\•%t0tND 1~O7УzyWQMe͡\ kE8%y"N|36͹3Y9iZY[^WPl\LNmŗٯvIh GI| /*\>b8UhS?[Nr oYFE#fI%'nz2| Yr6^= ۷,02II_( *p-TTҴ5S:hJM#<:fT$VёJz5$~OinbCuaN; IDAT;biab35ލe61б%J;:;{Sw1jj&aؒq\X&%˷#\²&fzRɀ[?dJz+2Ik"IP((ogKVd[#g޴4)=MCY,S`|+"GgȏSÙ(f+4UB!%'䓫(p Idˀ&~ ڊY ~^ oĉ F2wJ>x׏y ɗ$l[:7a=cza ?#L֙05iEmeW^3z6}«&h$# Hzr&EJ%b߈jIʅuݥB J ߀7"/G¢0a}3bcܓKV%+[lYddi%uZ)ݗo{0.5E=c) RM\ă9NHH~pKLvE#{бDpYFN< Џܹ|5 )^̦l[ `qFQ8~-ǿ~tYpA5. u"vYt>ʗٹ3 tTC'J^o'~OIx5$e.b4 H 0 r|.9mbYХS%;[S^PR{{<-MٺY˟A&ҺRGI|A}Vue|7lC/ב14L<5:|J7bhPFNz0d@+A Ԗ 0tÐ3,MZR0y{2`'U6$ 2UֽYq+*Ð.g|MxAN?A9)XW$sπ4Lf_dʹD?w2;I\-?DdƺJ/&N6~JTal`ܐ}\?-$YK̴qz[lG_&e|99*;#1ALoսӑ c$,"&x㯠W{D^Sڵ+۶mjl^'o&ߛeս䨨G9ma;r:>wޏ^.ոtSsn.9q6bƿ r|Wv*|o7*   z=8MlCK0aIJ[*-0Ab:_KU^:]AAAAUeP81DFgG')S4僲o۩3Yyʝv GeI;̌UgclMsѧRk(NӀ,\,x -9+9djWtmhdqyF"Œ ;ӫۃOxD--ŷnm\ w2cVvauR$.|-?^$Kn*~ò(W L^qv:FL}%+\귥{Z@tw‰tes&OjS4dfUt+3;`,&:FG4dFW~Q ?ѫRZFwG,iJ$![ɋBWwV4y4|ݢw<#/w7CN`_F/y*1~ϮGAr~]˥3yPeټlƓi-O_iH=_28hR}rVbE=Dmwc#9Xdsg8uİՔ$I.8 >糝7hL0vܲ9˩X7B5v\z+G4G':O279ܺpaצ`V-O# KoP??3oGJFοSkL%x{a 'ݴ VhiB'U[ 8><O:yDžÑXۋjVJJkWj?-p5uPVqlYW8w(s+W2ٷz>"1gVœۢ>m$^">ώKWr W;/ow1v?C_E75s.&e8xLcT4fhlLJi-ein{]AUgr18i_Fbd%KA#+ Q.j1P*4㇩Э}'O hjqc-KK{˨90U>v, Z_2]R`,ߋՑ1U'?1ri NHEbISLD icAuvSv0oN*$e4HO0sp,5M[\x4R3lpXD O@SSIvBDZJmRIiGьjWD*:RI_4ٜ #iT͓YCQ=nD{hIܭ4HHCWt0*-1P|ԉޛToEU3 cǖ2)Ym9 54{֛vO$j!Sz^IRm\I@Ay;["z8IiRbz[Y<)<:F~txjΤGIAiF,:BJN'WQ22Kf(hHǠu jʰQ+Q'֍'asg̍*P[o\F1i5}`h]gTXEhdc5?f{oTPІ_4b1Fd-Ax$s7ޮ(P~8 =/|Y{\x1YF#adX@Fr<ד3)R*1S,jIʅuݥB J ]&+j+ѳ[L/}) /bkض@}; } zNVw#aQtfDz1ɥku+KV(J%qy03u5.5|c) RM\ă9NHINӀ#,[Y]jEFN< jkY|ɢr󞌜HeL|PŸUx F>'e٤~t3MĠC?oCPV[O Y%/ϑ̱,{_} M4Cq-@qwLL1)RQSisEj'ȁ! dU,kRQJAt}tF (l؟KH15iҮ )UH /$)05%GUA3 cvM%搫4} ٶ"?RNz'ټMU;J ݺ0ungc w331W!$#LLiҳK6gTskؘ8^.ze u5+`gH^w: n)_nL1.Pze ˏ <0IoM"ˇ"N (ʊO^Ʊ8E/d*/Z\(_\~d~#hbC=0uj2k'&mJL>%I?v#kHIC칒m5!SQVyg!C?(_ K>4u".)6aU_G1PWʃw{.2GŅ0tmn$U2$ U *J">;]^78܌!Yk}d b7fY3/e f @Zk燧䂮!UȎfO=Ҫ=^u2<q.l33.n tJ (e \/Kg1n.ܰjMshȿF$.DHT2rU6]Ν# h07d]>L@2o.ΤQ qEwծBԵN&;Ϳq͟a NC%sMQx9sPsT0ߥ喝XH%b YF]x [(ӭn˾>@j*.`֒QCX5+SKX_bј)y}?N#ۭp%KH8wjbن}&h?X1K}ƨ 1-4jX $$qI6NOr˖-ѣk$/'G^eyx83ȜРwc:o웤EA/}ؾh{]ve۶mYZmիWy{(-l_.׵SG.2ŷNvun%5FPB5WAOʎ8:>S%/uF:^]    ېLXFҖ5r ʷSg&;2 Ə֡&X03V7aFXHOEԖ m haT ¿ˁOE2ëuO:Զy4@j:9y L{EEVɪ `p18&'?Ȗ 4^9Ml$,2\,ܰ3Z=:^LpE׶֭kNfLJғw9~.XʙąЋdX_/ѿ~:M }GWPZ:Й0JXk߰,ʕa੣'8:ZL'Sb8^͜2P>8&&IaQ쫻C+bzdAnQ ;Dבl!D/ ,2c?A;r~]˥3yPeټlƓi-O׿4$xXíK/)Wa\o0xAʱ=1XGnI-]tyӐzp&eCqФ "qTwc#9Xdsg8uİՔ$I.8 >糝7߀7t0~kSi0p }CΈ'R%d.v:˦zdu%pJFlU=^;Ӱv Ycm눫G ,Zۛٸuzsakx၇X~Le6NA/<}=3y@nnEF^xo)#|38/ojiDYs6忐Vd3 3 hMAMm1bL]$0r㫳s.e@Ngg&'~&K&NM OQ{{9S^; .s/sFTTCko:| \ O=>uqā*__'i x-ݭ1$*֣ĄL|^x4)DFڗJFZ"YWeBKcJA8u*9:{COQޯ1ބ0ѿ~:㳜DžÑXۋjVJJkWj?-p5v08]t̄e IDAT9Aī\ [=Xq3+ml끶]/BGcjgǥ+\r+K` ڗb@oGS⯢ʚCraL2pJEfG,~9pygr瞄[%?/4R3lpXD O@SSIvHN連M*I74QcHZEG* ӋDob7-RlnU,]=?m:Lltq9ad6A 2ΘOX}@콩K5VT50vlI 8_., Vsi@aYAai)ad@2W=$ʵ YQ$%+2ΑZ`_oyI!u,G0M3ZՌ dRrH>אI hHǠu jʰQ+yέS8 w} BoWkdH~[NO='a݊V  kqg<e΄iN˷ eMVHFLJ 5Ւ 1 )Tc⁻K*3.Dob9YE^-EaәguǸ'"LVVv5gӷy|D7êde2, NK_7-fݥgu=B ՞x0niҎhd:7q9K(?c7;W׽&?׋ٔ~+yb,T1n(V>l5. u"vYt>ʗGae9gk5r -?A/IH\F-LUn AS7?5䗐lTQ]J^.-'a\(gl]Mڵ9#'}Ѣ?/yUf䒣*GA3-r32 ~rՖXfL\zrXgSN/&01I^4j S%"req94ߣ z_D6u5+`gH^w: n)_$c T&9`;p,Yu5v*@ᣈ豓m*"+Wq,4yi ʄ 1_:2'ڮXPϧ6JL>%'n${ )InȞ}=WOY$@MPgGΛ/4ܻSF3df4R" 5+ȤYJc JLd|񙒤O9xZN-y1tmn$UrQx4{7$S*j̾%u3߄Ĝ_Ml?!UȎfO=Ҫ=^YRI.fͼO{^"΅m|F1re].C`#\bke,֭҅V۝y. wTdׅ BJFοʆ˹}ޒ@A FL~!|ԇ u[eÙ4 d0Nڕ1W<މ痯L/;w j?/$n);w;-V-oI?lBVpQ*RutK~.J=^pHZ P1b/4Mrh Rsl]s7)AǾј׭L~~\}~d^)>;p<Mn$ڸDpP<;a.ANՉ9tv7dWSOR"&K?HZsIKfÙDЃRŲ?I (9mbYХS%;[S^PR{{<-MٺY˟A&ҺRGI|A}Vue|7lC/ב14L<5:|J7bhPFNz0d@+A Ԗ 0tÐ3,MZR0y{2`'U6$ 2UֽYq+d]ǜ)ӉM/ĩ)CBiuۯ٘=z4fJDy~/ꏓLAIr1ر5;j\i2`U:9u_j1V)> ;]'IoӴv{^rTmЇޭ[FV#H,dVz+&aUr69dSW!3^JC2 aJsdf,nIqEL[JD#|g9!sɕ=CDV?jDob4m㷩Y^G/Zf ߧ!d9.)3_nٲ=z~-duȫ,(! 2`j}+$4]e혎m&ifA7K"#z׮]ٶm?Tgw`m^?7l/%GEe>Al uѿ~r-ƥzwsɹ}{8P6UӼ#T hQ_AAAti>ېLXFҖ5r /sa-s`t ٦h5 `ݷԙdNuI;̌UgclMsѧғEe>%B"Zߨ(NӀ,\,/.XnxB.^{ҡͣR[\B= L&K*7LVn?Hnߺq-Ɍ[Izš=K9z,}q# ˢ\6p/?2yIٵ1ɗpߖka q|ir '͙< OM;Аw;"zWδTÂ_d)䕸.__a*~o݇Q71M Ǐb_UZQ|ԫ',urH@ Le;X9%}f=u`I?Ĝ{CE~ۇ\8  NKg(3γy2B'I[Ӑzp&eCqФ z6S4*Fr : p4aU) I\h?q}g;o ]ae3E/?r>ɗSn>@wk1ZVin#:Otduo+suM1Z9#;FHx{ʦzdu%pJFlU=^;Ӱv Ycm눫G ,Zۛٸuzsakx၇X~Le6NA/<}=3y@nnEF^xo)#|38/ojiDYs6忐Vd3 3 hMAMm1bL]$0r㫳s.e@Ngg&'~&K&NM OQ{{9Se:5K&8UtaqM2:3 ~ۑ.5w=N"gGr\[|n>QńI-m?>fTg1e洡@ 9YFĝA 3GRJNܴŅ+J#5E\˺4+a{?4mw-Ot&Fxtͨv1HI$#eN02I ZIn])Q"q6o9Az^>bZF2Ȱx'gRTb)X+'Ւ 1 )Tc⁻K*ŕLVVv5gӷ>^S_|Œװmсv@"/G¢0a}3bcܓKײWlQfiK`v7gj]jHZS)Ps \q6[4iGXMݻՊ$sx9vֲr|E=9-5-= `qFÉ ,yڽ2x\*y9de9gkylJ傍.eT5=S)adH&(ԩI4q9"5IHl}1-kRQJAt}tF (l؟KH15iҮ )UH /$)05%GUA3 cvM%搫4} ٶ"?bټMU;J ݺ0ungc w331W!$#LLiҳK6gTskؘ8^.ze u5+`gH^w: n)_nL1.Pze ˏ <0IoM"ˇ"N (ʊO^Ʊ8E/d*/Z\(_\~d~#hbC=N(+0&Ԟ5$!{]\F~|A/Iώ&7_hrwԍf=hjE XV |&(_ K>4u".)6aU_G1PWʃw{.2GŅ0tmn$U2$ U *J">;]^78܌!Yk}d b7fY3/e f @Zk燧䂮!UȎfO=Ҫ=^u2<q.l33.n tJ (e \/Kg1n.ܰjMshȿF$.DHT2rgk&7{D"K bBZJQg߫vU~km( ԾZREbKȂH,sPUܫͭys_\Art,>d=vJv/ADA,fI`Yޗz+a*0#kX#kޓKO R/NmqP\xՖ&惚NDJ~oԙ's D=z=Zh<_ź,py*}o%C_`O,\b+.rDnƬte L[0cR&/N^ɼdРEFRlId3ٻ/Ƶ(#+VJR9r NUUKjDK5 .L/6-wʸ‹G<͖/q9<ԜD=8*`;sy*U K[qR:DϏ%lNk*ZumCtC 5.]P2a3H AXa,-M͡Oushf[p8KOKYh?3RFI쮏pI,6i`;6/ctrƵz+u,o' LJRN"b݇l>٤4,~֗.{SZFOoC1l<һgâtӣjt|jݿܰaݺu3>}:6sxȏbKo:y%;Gwkw`m3Ei_aRߓ+]taZ<{7,,_͓'i{=j;8HHؼu}ұÝzAEzE.]$y~?Ui\5b-*~O?Y(׿O!B!x'if}8l j{Y0O*%NiB!B x08?pg2iQb)N!B!OՎB!B!% !B!BZB!B!D% !B!BZPA/B!BS=o)VD'IUܨ[v[{@9~gkx;9vvN'/,P83Weҭj\R Ajm‘LkWZw}m;Nͺđ=v/ ʈ|7 *vS튂w|/GeOXYmѣ;oʠE{0l5?4@^˰A4*.Mj ~J2_%)elGw+CvXX&\|tl3OO 9+ Wyç,$e'_m/V-lcDN*ePSbJ$Iܿ2שV*|(Ã˛ز^ ؟g{8U~惉Wxa8ƴ{Yۯ<+te|6Rmh~5nU:mWp-^<'S3&b‹AP_MyЉSGwyY d^[ϐum)QС~~~EdIh_f^V IDAT&eɁ ;Y0-SOsJQGC I:h{2k~OA5R<~.̜2U[ҾIWMj*i)8so7z ^,Zqdհ@ ,Xj>7cuT?\!/.8zSS}b`ޒLn^B 2457m ?a P(z{MJ|5+q e]]H;NcgK/,rN#QHQ_\`Wq1tS?u_u,@qnN ]3H8J SYV0ѭ습B_L~. p++lpsV ~ b`XZgc v|+|GUGVU~e`'EUaqhZP^<.&b'_)昫X凯\r5Z̟;G2L34U"6#9ݛ37K찪8M#%MhӲq뗲Ub~XʺȆKGRۗrv6;<ĉ#q$N'tcϣ4>G`ќaDHf;%m. al#IpWpB%yyaڮ\B:3?n7qO…w=>SX.IMg N_ӡW5., 'InO-Ny\%{~+eU͗ WHx2mt=7NbNg'dfe UJ (J'~)YgX7s%ɝ_r4K?D:*zH-ŵ3;:}:5_\Art,>d=vJv/ADA,fI`Yޗz+a{%\!͝3pN&SA8uhj 8`[N'S!̟ n{p'Ǔnkh[ K -|ڶزBƅĥz2/4hQmj 6Ɖ+P͞'[O3]|v_%7o)v4DA3Ujg+8ؓ}RgFw_,ލkQF9N*hӥc5Ru2Li34>4 xgtLݖ;e\ Z@qPl|y[B65e-!k3h Z{k,+8[wO;¨ţC?G%gھS]RTo?/nUXyOɐͨ1UBп/g̕M]X8 /DG0BSܘQe@7;bEڌ˩/N̝ؕiJ×f\=.a\GSnbXâ]L3:gbc. ǗXyB7 !D棻ɶH,@M>C 5.SX!CA6: KBԱ~x34ϮlA U+SWd]\ʳلԧ[3Wуmйlφٰp%L~e|ƏgN+^ּC9nZ[mT^ԒӬygi) 2`B(1N+GK/_MT34[_{󯢪wrÆ t\ ,،Cα}QȏbKo:y%;Gwkw`m3Ei_aRߓ+]taRmm߰6OߦMp#!""N bmݮKw] /_\-/rz&]JʨshQw{~*F&^!B!z2o aW),^:1ֺPFWm DRvB!BҪxn`LW&-Z, !B!`"omB!B!HB!B!($p!B!BRKB!B!(L+p摝i- (YIZu)iB!Bޓyj1~J2M13܊9d<_zp wR(36o~3s@ Oz5n8n|%*2sJLuUZ˜W3j4$;/;O$iطi Gb3Q] hݝL҅4ĞJ ;ѣ#O,uiKۓ7,#f^ثDeӤڍUM,›S{;plmB-tTS.qdO8"mqmp˲=?ea]סw' /ԯbL2ZOEjazi? @ eDtlΩvE ̗ju6ѝsePT{DeXy sX=RU F/zxo>rB5_^KdW߯ڔ?v26Y+:.| j‡2<-4EMcsνfxt*?+^0vcڽǬWLhJ֙l=E?j6 gql1 7رj-_:3K=9>zkXȿ'lcDN*ePSbJL1.ЃҧxO`YfL[ńn s|; kW#.xU^!PRN-Cu?9ﳋ<7$xM˺v`tZ6 ϧA}產^PuѲdjd%x\F=煝9e}#;\/TR2p*rQog<. XxؾbT@[W1&[Kiαߌ4 V3UãCwO`Y`fOGt>״;'Y5->>lїyn{ȿơCh(ځ ye.n|v CᤫD;ijw,&E<*" ;֤CrYta2ǎӺ-+Eod:WuKY8r#޻ϛU&(Ȇ#SQ/{ӯ jLR~p753-[oPu6w? ^9g,5\YŒԌzXɖ~ZM H>kl<ٳg9{r1'bε|KQ>wyweŜC45^ˈѬu~'9qGV ٪n}3_Oõr'=5ջ#m;a삽ގU]V ߧU.\Ph7C6.Lx^}'.ӿ,\.kRoAر3Dly*7s\ԏ1}1ND`q_3"8=v{4&se}2{FJ$0q; 6ܱI/I[;w~e0wE5843 ;j Jpfv_+y6̜ۈ3bfϚNZ!Jb3cqyRrtܺxo7­lUԂ9$p1!<s}>~%Nڿd)昫X凯\r5ZM]%-b#;ӽi{?~/lù<מ@&NՑuF`؉{dAغCPH7F%V\p֦iٌK|8alH96ez׃9fx)ߒ3I?ݏٝdoTS,:4WlU+ҨԢ;CޚK5=8r~& Y6e:_'bC o[&O†[}jjd^]s(_-'ʩ i|yJ/xm}Ns <9@AbۏjN`+y6Rh\ۛEh>5hҮ a.J`mI C]@N-6&qagڤKAf=֩Y4ť-vdoEl)Ʒs  {cәI3;w뗳zFXOCEドS,rI4v/0V-Βm. al#IpWpB%yyaڮ\2YǹBkVM~䭀 <|.;&00v5du/wYj((qf~<ۏP'roB3CW5.,p^ʉDߓ _≹\_oKV|U5_*\"/s\N vtvKfzkf_iѼ(GACpjo=ERkۧ䢴iӸY!t6yp7ljGJ>j\Iri :OegkⓩȅWOl?$R @qNN@NE>W3Wu0)O!)Y wx;Qˆ3x9*X^Jj4y;ƃ7DwNc$t*gX.Mx`dt*]sԭZ\bxrP_2~uz mCa y^~Œ/Y[h<_ź,py*}o%C_`O,\b+.rDnƬte L[0cR&/N^ɼdРEFRlId3ٻ/Ƶ(#+VJR9r NUUKjDK5 .L/6-wʸ‹G<͖/q9<ԜD=8*`;sy*U K[qR:DϏ%lNk*ZumCtuX&x4jX4fno>ɆZC!DIQ]dM$guIW. Pp߇~߰S ,0H?ŖЧ9hmqQy{QKOO8r,Ȁ )rv|z8$]f`40z:XZ:C)fC6ˇluL?FKc`Sʷs٘ 6 ݳaQPQT5:>5_nذnݺ>eqt9Vt# Q,}mR'dR}ncm={~B< +L{^y啿K.l޼[uoyd6mOG wbnv]:vb|TDE}Px9*oxK3ɸv@lUWFCJS9Oo7//B!B!ɼe*Y_x<,N"[BA^v~V(L&@LZԵXB!B!A^T$B!BRKB!B!($p!B!BRKB!B!($pQydg/"Sߟ [2`y$BԂU!xq7ó co?-_!B!ēd^*e2ϛ]O̮oz,L԰=Z`/'C(v><ץ-;w;oOHw4>yaNfj7FT7}IJoNÇ#qd+xoKj\"O+G9…!];ٲ0ڻ҉WR3ZdLwt3E)OEjQ$sT:M h)oUE(NA^dxCI/Rp\ Ftz zu*/ê zG IDATI?6?:&qxqi_)K%V]u/QI8cLuDŎUk-*HЮ(_ |u| XU @n6MAR5%d ̊K9:,gj\fz_>lїyn1vF317TWΎauh41t ӂ7b'7M펊ok7rht;NfTPPwyK!ͼtaxū)ԛ7{v [ޤ̈́< PWqhM@&n d68!x$SP>kY|E\n&dx\%K[wDXqCUrIݩh*QN5?6m%i78s3cǏ'/}ǮhZ4(wkMJ rUb/;S-Md /TtKXdF^Qn&x\SP3+-FF}E}U[QFҽ%GǙ\#V(z{MJ|5+q߸Քx^_=q|e7@wši9FfQcP61P 0X~h<~)ZxbkDyA2em5hko@j>Ν_f3kѽ}bs*߈U0sn#Έ>k:m$j!W,0!%! iɗ[%Nڿd)昫X凯\r5ZM]%-b#;ӽi J5r_ʇs?`7qy=] .J[ˢ_ʺO[# D l! OkUt|e7>C.r|xڙbX'1Yy ٙdkҮߢ9qħıo@C6}PA\x |v ?beUez׃fx)ߒOP\ƧDM>7}G{ Kr's<)(Z2ЕYw ɲ$.LRs3,:=F3.;|e[ QS~ݹj=a1̤ȻuYz?#zrQɾ{xn@0nO iҽ ;ĿU *pSGSϢ]k@uUS \ğbAEB\2jk{N+s-w%#[ENJAC9m;UB 7PiVM~䭀7C7XB%9:tƔ_\+}Kz(:0\$NJ6Ԕu!8WST(/ o\qw0'{RH!x xƥ\s.M)[KV^<1+mɞ ͪ/DPJZIύs9;؅ @.}FףͫI=o2RX.T28}Mns k ig_?D:*zH-0vfpxBo Zf㫙+H: "4/b}<]>g e0X1+]8{ yXTJߥ8ؓ}RgFw_,ލkQFwOgzϴml_SB3G<͖/q9<ԜD=8**1,>/J=oTh;JӃ#>gVAM?U8q Ңٳ$uiv&w^uo K؜֔Uچx(/kﭱh c{2db3j̨@KY_a(,+꼱O3s}̱.MiCQug#z>aj\<1:#zT2T?3c)δ})3Ч*e~ _ݪ x$̳52qoà]\6|{EcVNiи`:SltYD t%e|oXe?<ݺC> 2x W@LZԵX{B!BOȋB!BQjIB!B!.B!BQjIB!B!.LLAJz֪ːMI<N+H|LB!Bd^*/MCBC+#j% XYb-? nӅ4ĞJ ;ѣ2=E.miV6޹y{Fwmqv {5,t4S18#Ex3pjOo_!KT2/dlO #'!o}:3/|:i܇=Q _!mH2Wk߂hB?jxbΜG?'Y5->>lїyn{FyXVFIW9:-z#vr(!=k7r;C!9vLGͨhXyмu-$ӹ3]M͊đCL$spdt*jEvoAX@͌do熆ƏboyK+jV$=5gE*Z:b(XGCqfqc8<߃+ ZGoj:ߙt:lJ[淧 wX-fÚ?ȃ/LΆgn|y4QW˟aOeƬ&ˊ9.hkS;cs.J9Y#E}N_~`/@ Kѽ N']yg9㕟K~ ]ۏq"ʘa30̼4gϞl.ެ})ԛ7{v [ޤ̈́&`S\h;=y92= NNB yI$8S|1ײ.<}L$] KΉ_08ʻSTtشԦh#ƎUO^ .]hQ*֚<5 . ^v[2Vɢ%,_#Ro_\貳ɉ;W˗` ō3b}b`ޒLy+k==I%>ޕI8FlQÚU~ *PjE:Q ow[F/k<~)ZxbkDy|{9bGC kzPդ-|;CgJ2f;֢{FVԆswpFLLYi#Q !W,0!%! iɗ[%Nڿd)昫X凯\r5ZM]%-b#;ӽi J5r_ʇs?`7qy=] .J[ˢ_ʺO[# D l! |+8lEg vo5|=c)%V\p֦iٌK|8alH9FOE~${|kVjEv&iXhAԣ]V+XX5Vy:n?8oǾ xwkP؎Ab?}q܀`nDž iҽ ;ĿU *pSGSϢ]k@uUS \ğbAEB\2jk{N+s-w%#[ENJAC9m;UBKJ_R/5e+Rދa?V_;)CqޝUUADH@@QdHPq@Y4nKRfVt ^n9!(,%S D@Ep`gL<ϣ}Z^{k_ e+_>'|Ho(!V2,KBܛu/d߷h"/)4Gw䤹IWdӽ;+zycO.đREZb9Kܜ0` 'ճqxzOQzة1ёH抳$Vҵ t#N9~Ilqۄb Sjf|q|CJ>G"GFj XNzm~WY#S̍4Tt{7'ԇ[takf)ѩEK <ƵϷaHWѧKr2; 4+i_$}DV%VQY!ģ+vb̉]poߌZr\+΁= xejB תR[4waaL߃֭jhRjQsyU$1WAK삭 KWxU\Y·7翏".$7l}+pBQfųsQ,[ĵ^7XR ko HnVНN ۚZ,n&ҭ^)S_^ ILwo#G L]ɟ(ߜ_0fkX)5k2vwjxu1NX{A89c`[Ka ^PQ]ĬSP#[a~>4ZO3溒׬{`e__L'Zd=RXټZLۅ~o!sU9!1ZJ&'Y[5J?tK"*b1[/gc&M2o'eI̷YDXf{2U#Yc6µ-C- Y?Ml߸-WE6s n)m1WEU33\n 8p`S1?GbY߻< /N%sr&A)֌Ú߱YD!w}ՊoH=\ʟ߿"""(;7<<w&dy3+V^傋FvY/pi~߿==jl:wAho( !B!yRy3`ނO0/ ֞> ]^(L!:iJeoڢr/^>!B!Qƅ׿K{`&P! !B! /*B!B!D% !B!BTYB!B!D% !B!BTYO ܬ%7q65x%TK !B!UycDSۓAAXYTBȁ=9mgy;o0fqb7DJ!k fPWe{8E=owVNH44!ݰV3^MɪnGӛwB>+Jnrb[ ;G<6T.r"%=Mп 7FdGkoP0Z;QC#+y10ɄД)}Xf.R'_6xYӯ≣c۠)׹E ^[2p2X=ueg/7g;wn4ۄ4˧>#Yqķz]TrOD UGʉTl;$jQ+ְƙd Sٷ=WGmH?څr FZ [X&62a-Ԍ0),h5^E_7>TL),'4|Aޡ|{FkӬ m&4rw&wR3P9/K;_<| iECBɴ! mwXc-c;yi;-WS^`r7Ƴh^^^xy5ƥcGYf<Ta0 4#?:n9 \4inq`7oDe8/ʲ,7ɬ'E1}x{?fV%la׭Xg5 IDATz鉫1y/ ?o =~K)Zg 9y$'cn;j'峫?tj_{)-} u0=S,l]rR7;w8!;Gb0LNP1.]GLǬݩ#r!*? ;擰{ ka[>k!KripK%^}`LƘO"3KSMdvH:`ܵG5sCc{ ۸TjO$SEEΝc:ћVp|~#g2o\uu:~r2Ǖ2/op|ό}>1:Ϳv\0?C4P܅gㄡi+<-& j&Kظ7 ++֤skDF CKcܝU2eTOE=%-5h}>-oYjf3cfJZ&6M+|f; x+fuh|w\OXP{(3&+|BKEΌ;c7)&3.Q !bT03##%)k ()J'_SSLUػyVAŴZ\dl$*/t|۶?e77O%p$tyF^j3"d1G勂]Ӯt |"<&+/kq|xbc6,#E-`[x6-gaL~4k<6Q.]*V)NKI5wm7㦬'%% S`G T03\yM!$35-okZ3jwsW7Q!D(Z jp]_ PEkfEޤ+jNN5539w<{žVl<ҕN; ꀽPcя3ɿvopEPQTtgrg>ώ eb-^D{ڙt?vV 5][ѵxzGHwR8>TZ04g `(j샧e";>kS.]ecFaD Z,]1e5qpAt#Βdt о2jj&03T/K_SNnt |X!Q[or,BLp{$EyI9$'ǕOr'p5[s{t!*#Wy] 愱 9مu~փNj5~İuʞ1t#Vf.yDZAX~̢ UT)^<2ş"5_E/˽n!hoх1rҧD-(rcB; 4+i_$}DV%VQW!DU+vb̉]poߌZIW.5{RAcՄ}Uѥַh4+6 [1ФgHbgყ[_@EOҫyboGoE\T={In/K5Wlȅ)̊g綣XlIj8>T\XM>׊R<7ݨhi5;|q5Xػ,M[R:6ѓDC FF뙺?Wkɘ>/L6MzϺ]_ ΛG)<㓃wwF [DkYb~7fmwCҮX1w FG qZB c~BǕKω8U:C;Cia+y{*:W 6_fot{HrQ,l^nb ZKl-TBAqV*WZFΘC-%ۿ` KO:%1P&]ce$[qe, QUP,Z3⽁x*X _1 `ږcdo\Ė+ԢaE#E%~モəv.rÆ 8SXןO][Qǂ9e9[۠`DkaMv,">jEڷ|W^yO߿?kVsg?<|ޤl66WRbb2o ""u}w*+\pSN=K_:\#6@M8; -Ӎ *9B!BQ]=E@A:y >a¼4tZ{0tzz0)iM/B!BTWиwI~*$;!B!B<EEB!B!$p!B!B*KB!B!$p!B!B*KL7MvaX O|typ ܬ%7q떅np\ZDB!B#YqķzVV8lhß:E)GՑr"# EGԊ5qflg;*Tm&UQv*CyCIͰ iX 5#t3LKy:=5Zࣗ}z'~CŔɘ`BW|ʷg;`6oB#[lqjBy'),53r ÇaV4$LA6x7;27&JQ[97 &NGKd৏_fh^Mb_j ]Ϸ)[)=P/}-h1pqǾO;j*^8X|Ҹ}(۲J/Y/Qa<}ƫ1.u-vc /,ׇ^nx9fݼD>ʊ7{Ad54q .ohz_^ nTQoݤhUj6V!}Sj:?wFK.J`<ϡCzZt󧞙bBnwҪU]%_njn2G@l*; L`;Iҫ+S*߃+NϮ54iڰٙu(fDЫ#i`Vm=$,_5c?A5TQںX鱴*fi'[5*Zφ ~ő؟w_BBN.˴Y8qW0͛7"yeYp }dVǢPs >uq?fV%la׭X:1y/ ?o =~K칵ƌNa?pmLniɓ<:5+g{|s#d~ؙ Wqh2-'R>՟ķ̺_`]z˚=3znڿSBq!&g +Zf}P>:C'. va vpBv4&l!a^_0.$#c?h]fﻎ/ŏYӻSGBHͰén> װ6ƺJZWQ.RK넳]*cz6|iuW]j6l$@:We?+$]ƥJV{j&W쟲. D/rӉ޴s9ySEӑ3_/ϗͮ8ߙ/xfilցoG( vB .<' eL[no1iP+5$'\ƽY18W\& _'6]@\y-KYQ_RڇBv!7W4T*_K/dd#5Ezz}*jF2u^[?hiEX)e+K:~;H,5m3_ϙ1^i-LmB醴fF{(3&+|BKEΌ;c7)&3.Q !(bi) M$_X@LU:ʥb0 O:h  -O%+f#QxSŷܶL$)9i Hx*Y#6v5'7"?EP/!C0!|>.ovk3}e!/|5ۯLq|xbc6,#E-`[x6-g(szƴHƳi+rݥbQ7ΓjFn3qqMYOJV>)L5aŲ,w~uѶg7ǻSʡ`fv*51ד&s{4^M"9#]#۲ʰ#3vga ?w{5Mrh ע5ĢZ\UoRK5\'뚙;b+]6׫+M; ꀽPcя3ɿvop.gQѝʝ<;2q ss[:0E ݵ3 jk>ᯏܧH=PiӜ-G PZ |w>nn?F(b/%@S9_&&u&}YiGٹh2F|B3hS|QkP#O~ e,_Nu= 5ܠ]'k7:{X!Q[or,B0uµ% MV%%莓LU>ʕLzx`oEE3oӅ8RR[\9;u)6 dzy:O/? Z[;5&:i\orr) Z,]ψo;8tM0m~Oj8>T`Hz(@=Iu#>j5~İuʞ1t#Vf.yDZ dš'(lzUwg,#}}WS9_sl5Bj^KOo0mGl=]zeXXN4xe ?Ej>e^Ytakf)ѩEK, ܘ1gr& eڗ#I5UUC!6~]ߵ\cN<:{fԒemOrؓwp0^ &ۘ=p.E}Q|FXϴ=h`݊aM&58WEs>|ԼT< .J*|~ ^%7)VvQeAՓTPq\(j¬xvn;e˖H=Pq+.K۝~-Us ݍ V?Oa[SD+%cka=N4 baYWV=rTjӤڵ|ji/4&hϜO^fΙ1u EV_ l[kZػ3~ѿTʗ2//ΛG)<㓃wwF [či, cv֌՛R;!Si ǘ;am8o-Æ1xZ9!_j.1k?'Tk֓ 5^e(ش~׿aɦ#w1r/Œo&Be.g{ ٟṟa9R29 zLPJ_Qz95qhҕQ}x;x0X6.NbWV":UŢ5# OEm:mQi:6OfElrŲwynEA ^JLnmSۇ5mce{H)BWT+Ҿ#p+ޢGXO՛ߓ~JJLLDD䖻׿op^傋FvY/pi~߿==jl:wAzѽ_/^~!B!y˴y3`ނO0/ ֞> ]^(L!:iC)ʃ0mh/^~!B!N.4.]s0y ɮ•Z~!B!B< !B!BTYB!B!D% !B!BTYB!B!D%njzy/H3ooȥ<&,gpޔƽގ[q ^FjyB!BQ=סn5G{PxtCmdMmO:afB&r`g4bOrNۙwE)Y Rmk$rQ-{}N>4͛[{gܽoI K@%6?.|!`'D 'fЇ|2 _b񎵌GIRVsNt«?/~SQJXUqS!6qPe%w?} 05Fsj:tS%*g@<R׍1nm788Y?’q}hGkI죬x~4ԫ.QN5?6Eq ا IDATCYj$? x:q՞IƋ;oGct7d,Gd޸Tt%Ke|++YB[5*b3cߧOckLt~o8@(+ -j8wYx8a(c Ou{IZ$96 Ȋ9Ĺ5i8ѰQ=wgk^̢zޖ4>  LՌd꼶Ҋ  _Eڿ:biVw5m93f֫4em3^̦~e1tٙbO"qtJ߿3q"h23BGJ-,ĨafGFJgS2j15P 'ȕNr) 5wӭZFirWɊHTn'^Tm-c)8ʼoNcloZ;.*JHt_ͽO1 fDc_] }_E yl5_mMp#_<ުPi`;mYF@K.$-[NcN gml[ϮQi?1/ؑfg&4W0堻K* n| /'܍Fݸe⎛4#)%>%=9VJ3jwsWR!5EkAMk?Zhr,v՛R )ƺf&;g/JJfGu^_n(k1_;CKYpyzr⁨ng|㍸b-^D{ڙt?vV 5][ѵxzGHӈF%xUɧ9[X @Vc<-y(_z0p"/cX6j n%bx}=a} ~ӍP6^8Kс@[9믲ij&03Tpv=#ޫsbɇDrn%3!βTQ!%S'\^"1ɀodE^R"i8ɤl\${ vV2ƞ8]#.ȕs^¹9al@Nv!gr Sc#)(ҵ `#N9~Ilqۄ] Swjf,Pj8>T!%##5kg,'kSAլZZ){ ҍXY*=̛EjCC?^NfQ*_XFԍ/wI[9믲i\{||}.t/7o˜X9SSX\}g1aτLʴ/G>k"YB<ޔ:w%~nrU9|QKU>ʥs`OxY*hпocµ*ruo;⃰0ŠAV {Rsͫ"9M j^*glU]v ?Kb͊9}qYFP$G%as,#l\#ڧ0+ێbٲ%&ehxCŭP,owOTM$|v7j+ZZ N_\?mM-nx7 d{V// f$|;7#z,=rTjӤڵ|jiWy믲ixuR+ߟ{- y]I=mldތADDn~ UDEWx"⯑z9\togϹFtl3qvACIͰ iX 5#t3Lo|2SXOh BÃC>yYLMh`3^M7$fsf_Dvxy0ӊi3C>/xZvƣ$v\) y9'f@:zԟ?ĩ(i%,)x /Ƹuc̶?>(+쁟M;}ДQZ2_X2h2s~ͺy;I\b߼hGs61/xDтvVt@q۸ZfO#~-s]iE 9tHOn3SP]ԭٿNZMMȁ}Mp9I,8q'IzUw~v@{Uų{Psby|ܯXyF7M ;znWLzu$]K[5ֱjuPcf_~#nz>sk)_/Ei雸3zqN<\{3>y(]Dl~WS:@Ki&_\Ȯ ga늖;ع ј8ye¸pbOw:߿d?fMN !ē+? ;擰{ ka[e|#_N8ۥ| o0gcL'VיzOMdvH:`ܳG5sCc{ ۸TjO$S D(Nxu:~r2ǕƋ;oGct7d,GdVѫVQP3>}[cu-` ?~F]ihPù z CVx[L GM& qo@V!WIƉaЇ Ƹ;d^˦fEcԠal]HG_2L|?gzL0m Vx; x+fuh|w\OXP{(3&+|BKEΌ;c7)&3.Q !x3LHIlJ&Z- dJIW.SՀn^xAk0`h1W*Y1 e?g"OiMkyES:I3]9ӏNO[] }_E yl5_mMͽO1 fDc_2\j:VlfeOҲl4pƶ~Řs?ix6mB|3]TRq-tTs7v㞉;nzRҌP<}d.Q n5b^|=yex5$vl5kZ݌=)>3jwsWQ!tւ&9\kYbQ-.7ʥShuLv^@.~S3~c:`/zc`!ۥ,xZ&P6`E _Z1&lJh)ze$ip$w/ß_NS6B݇(-Mz8Y1GWĒ %Jf~;CeB #g4nŰߦWCRsͫ"9M j^*glU]v ?Kbv2rՌ6f 9Gظb G.OaV<;ŲeK\M ߎޜ>,#zܰ9^Ҁj8>T܊ Œvg_+~KUhDgwՀuSbaw@7nJ Z`FOg }9bgJͲkɘ>/L6MzϺ]ʧVr_ΛG)<㓃wwF [Dr+5sZ}-K˜ݯ5cԬN`Tuk1NX{A89c`[Ka ^VPQUĬSP#[a~>4ZO;8 YEE%7L\*aOfifȫ߰wȦ6^A6/@ʿ\:8ksRXxΞ\?30FJ&ǣ?=Y5Fꏍ[&eB6_&+vcL[N"MQ.L-fSPbݖQU!\+o߯=LID]ijӨP{ac< C?}-x`ўCEU23o5k+&O,ۗE* !DWٿ#WFCCCY6mc-h2Gݱ~Ȏ p!֕Z \pzGpQÙX Չ!CibW\ցz;QՋR7? *<B% A{ G!\@%|Ԛ1=?.]ҘqדJ'_n=Ngg=n 4ýD>$I+?|mTrE=Fꏪ#X Gz9-KWލΎrR}ۻcZ62e gXڨ ĥY`V2S(=p>cf3bdHfa@""10ooZS仈oє88۔sSdt*9CH=>1]Bɴo_Xm4mjҧ-Ɏo/e/ &#$M:D5$<Ḷ6 7q"49=ޖ~ e?,ӈ{>?O{6-2k6&]ߘ^>E,_\&Mpɸy?YOY'QYgx47=w,=iI.;/<^bˋxdR *}ofV.!?(V.lEK/۞ 0c~=RBAtSd'sUgMM=B}YCٻv;zUwm~NPWdz;Ps!*XQ6.~htYZdg^-㼢+!ώE6֓x6|\LJsEAEs}^γkVY"p/|7"/! y`V9B܁ 0ޗ&M8>h2+v[`Ơ+ Gr_>W V|2/|W +l<NSo* hV <\AA ςNd[ڑ ?4>Vcsy1v͑29k-Iqpjѓ!D?Fht9|Iض&L߼w&$(NmٻS&mlɬwzPWZz!TR2qW@Ε9^}.j(/)ʥu1{q`v.zn7QN5Eq0#e?txw:swkMIZCv =H4b-9XOʼvթKyfGO lW,x, 6LL痞աl;o ?rhdP˭+]X~Vx4 .L.bՐ-)X3+1/!MrSɼ]2US3VwFΟoD`8ͪ񤹼J-E1Ƅ=S\VD1)6ui;gNp |f=Kf;4>n9b,Ϙ#f6lXnf?Ii:s:=dB!JaP,0&86 IDAT##9əh )[Nʿr)昫Ϻhh17+wصl*y2֟SQ|$N]Y^pQTDcLׇkIOn~V Fe,vS &xEᕣ4nDŽ%L۟&m+,?SJRҲ;vbȉgМrf\+] ƶ)7Tө7hp47Ogz/]yc"?j6,"\6*y)wqUTt |y吏%-8 IF-QPvF/?EYlz֭0hL O6Wݝ: 6z?(wJ'~̓+to0C;)w\iQvʜ>c:Udx۽ER}`n%kp)kgĮ|ZU]oBƼI'W7Ɣ'ΝK+Sx?k X߫v:%\oU/æȣ`9VB]4h\Y ObOV cCǖlY͗ {9S`KYXe5Wnk ھxa:H"z6_%OSF 1.j8UOttk֬aeŐ~{nފ8?9)K >l_gڸWٿ#WFCCCY~ukFFFT=9M{c6v~}QQ4\xWN9͙K9\x?Dlcz7DMn0UۍJI_%+wn!B!+Ӗ!*gTtZ'1|zZ0)U͟{~B!Bb.4)ÃJ52pabAi•5ھBT9蠽ʅ.Ja eNj͘מp.fi8ƒɴJ'_n=Ngg=n 4ýD>$I+?|mTrE=Fꏪ#X Gz9-KWލΎrR}ۻcZ3M+s:jQڞQ|{Jc|џ-'7|2`qn@%V>}y] ۟g'&K(3vCk "ޝ&-]-SԴ=$F_xs󑖴hَBz-/I1d:D[ljw,&Gre+Zz9v4X(i= ;7'?I5:%_njnfo='1kHP5{n'QNm @xjQ6DӶ{7?5>ϑZ N~4kT̫zX0s%tqBQ׆zf޶|OGLs|m:=6eE}E fC5EY@[8x>n㗐PP}a0!RyClKYf&@4-LZwcЕ#/m`iLzZYjWpf>LfoM싃oq^7wLTI`}4{+cq.̠,eg,~3/Ʈ99~4ZҜDO·^vwb,~1"{%%n?sF 7`.v #I4=gv_cI[2ԕ_!0]d8Z+YsC8]N!] Q^RK늛c I-"z5\"ܨo*j6"` ZT9=tn^-֚<5t9fǶCv zSt%W|#]v}Q`PA&vis:m @!GN8ju_</c uEIRE%kqsQ8%Ľ ^n*WKꕖbjFu_{C[bcK.*^Sh30t Y44\(X?Ƙp*Å/wcܬgiV s<ѧY|3'8SXw1wAgLG3PlGpz],.nf?Ii:s:=dB!LZTA<N'gRbn(PnV:)ʥc_T 'O_|<'_$Ubײ%Ot|[NZ OEѻ08uC[gyES:E3]PùْN[WfF!X^ 닚JSSpfeHl_J$'t?;1̜>a[>͚Ҹ@B6Cv.ќHM{|GrϑxHJR8owKTQ]K+, aˉ$e$ct{޼SisTpxl$}˟/H!0u+k8MZr-l6 ;&_ag9/+8VBwj|-1{`\9E̷i{GEw:e 2:\H;v}8Zʣ =J~uW I}efl}QbPi*J:x8j7>u ^ ʸyC"njcOǏYv)OƦW:3gWuI1;p4g;i@Lzi?~3:uϽ38pHF7}["3[oϙKBܖ+.r&3*7e+*H"\}|n܈l3$Wө7H?'tll:ӦMOr6{?+fͧ(h ԄWgMOŢU ?3=ǡr&! WO7߫rݻY_&?TE㯌BcQL/Wi<Ӻn7n 5̀K϶rW饥t^Ăk׫|5c1i^C 5.zw HYrFo<~#4: @EZkT۷ʸ-X6bR+Gaiݐ?: K4+?MڬWX~B!Jԥew$!WŐ;ա9eZ]\j{w%׿?6 ۦkBܮ߸RMZߠޜ>%?oܓvmx捉ndf9Gذڥ9xxeų}!lZ3QlhxBQԃAxVZtlȖ |)|pnڍ1n:7GY83/ELA u[F>kWq,2se~b0[$vӯMvCy닚EU23o5k+&O,ۗE !D5q0)Gʯj1o~}UyZ15UOo&v>=966]._5N˅8ӜՋ'sO46GpCtn-? CxPEݨU*_ݾB!BqK!*gTtZ'1|zZ0)U޾B!Bq*fB y (>=ˬ|Q,Cǐl=mQ,B!5 {ǰqj;h^ݕ7Ʋ`~W4åKLQ!c?hо?CycǦMr,9MC;VR0FKhO[+3S%pZ<SةǬdѺ#d=(w~U"ܤlٲ{;~ Ow2BT蠽ʅ^ݕ+*y:=ڌb9i0s _'fkj8ǏK4f;:gwHǪϗ%[7FN)0tj?; huk&W>!I'_Ȅ^an]"R:y4>زt%b}5~C~FL3 kT5#4 ̪酫HwVL ,HDR"M>|{Jc|џ-'7|2`q* ~5Ḷ6 7q"/g`|}}m{=Omͻe!=s׏L\'*Ƴ-c#Fs'>R\kي^N=3^ݕ7z;B4c~=RBAtSd'̕gG E^{I<)cVcG&qpnM!Jk֐ kN^E՝fۺߩԁ񬿢I\5>ϑZ N~4kT̫gRo5?!4\Q:x$:qLf(5+` ǭ~#b8 / f#X0O?^\ }1+oM싃oq^7wmc?k-n hV <\A`46EK7߾cCO0ػLB!!NG^/|h[7;H/( .H%%z$\ɪr W3IKWpzNǬ wѺBy |ȸ^M0;Hj=7?W~Rj '3':ޝoHms4qI#f2>3Eĩjz** 8lcoзfZg:mdyPHS4F#kZn]_+$~wFΟoDW=iV}=' Wj) 1&1@q!c.|FCBxF܅BP ͺ-1C:/7'EE ,HNtr&Z-B d"Й׺yywK17\'NxEOFp'jw?`7'q҇η)zUOn~V Fe,vSOz3ҚU GmY@K$~;.|VmO6~rsEϑbIc1sS@rEu):Gz?t yAX}wMys|>H!(+6tlNZ8ӫwK:HR(ZkrMoX^%u*,^@d*Q#";2u˼>V'j{`q:Im;(XZ:Ck+GuaNT+WQaLd%tQ}< csmE:/Z7svYșI48SmhИ`gk5ԯ>E Fc݊}\Q& !aT@x*+.r& ʼ3jvchJQ<s諉2q H8W7,z tuUwjB_oz]7<\r~y [2 QsjKx?,!9GG] ƶ)7<7~U*5G{UR8 IDAT$PxmK@G?,zb~%Q |mdx&xVmņx@HQh+DN@KA=;`|/ðN;Udx۽ER}`n%h>Mfo7٫^kp)kgĮ|ZU]oBƼIs':Y] !zj.>bB(ґ0on4ZB_N+K]Vմw{-^WԦQ cϨdr<ؓ|5GWeRl|2-R6Xܴc``}-Cm?G݂wY>}LUT5>)3?Y=C2 o {+ T2,ar[{ O2/+obD#_1Qȑw11Z#_BܭnI[>R~UkĈ=44ߧ|odd}LMՓ۴{OOͼ>>jm +QN˅8ӜՋ'sO46GpCtn-? CxPܸż#a[ʠB!BQfe3`07։A _^(L!&qʝׯ+Ls??EG)4Zmb|3_|}}h°w\(a CfTJt>Z>T !B!DEϡV/x>}xgχDbۡ>8]!MoSwUeV>قRcH(U@!#Da=Ymg^MÅ,ECdrA 捝4UCʿ\[o$u 73uZnqa<艝I|J;BXP\_z6m(~NNK?*I{ٲe7qɗ)xɠq/5J}l+ǒ3[84dcy56%=Z;7Bӻ+(87k+%&_rE gbCf+d~7{١4Φ]qZYVHrWۭ˟_woLYh<4B$蠽ʅ.Ja eNj͘מp.fi8ƒհiՑ\:x5 ~ k+L$œޯLdB0s [5TrE=Fꏪ#X Gz9-KWލΎrR}ۻcZ62e gXڨ ĥY`V2S(=pۋ5&C2 Ax{ӺOߞX&$E}4vv /ߦ {"P9O_BG'I-ԋ2C+Z OO___|gx8';;,8F4֬C,}'-i}uEvKGZҢe;BF iѦeWf/˓XJOE,_'&dּXUf ,̬_~}w56ٝ9 7X= !+Bɴo_Xm4meb|,WS/V<2)l@Ǿh3~+M펐@re+Zz9X(i= ;7'?I5:%_njnfo3d޵Iԫl[;u:P:߁s QbOtsF";j%\ yv4]}P,굡ijr?>+ Z/8^:=6w[E fC5EY@[8x>n㗐PP}a0!RyClKYf&@4-LZwceCqn2?4>Vï1\ϽC#Y!v*AvA|xy5]N蜑mk9~gH t#֎ \m7>#3~#̼HqFZ ˘JQqpO,E/??;^廮_XK_yDϙט*??eƖzueD]Q RIpĵ^ ;W*,zqB+7[EjٹDRQTlZEf#5}_=Kہ=8s3eTbqsQ8%Ľ ^n*W+l*WOۃ>3~zΜNBT2by NΤ@PHܒtRK17\'NxEOFI\dŮeKn'?(k)<G~oNԥmO%@1t}Vɟ^XjϨaYj7u[c1':`ux_nN L닚JVpfeHl_J$'tv2gH9o}¶T;|5q.]E5c4(%^xaޟr"Iݞ77v)،XC*;eN_)ʟ ]²@O^)k9&ߊtULSpxl$}˟/S!DSXpU_oPĐkaI\ؙ6)ʥ_%;Ly_ũ'lV'*m'x̣8ie? Ͼ0`~Ou˾qCilm,].~[ #fb@JfQDћcYR T;xѯ\{D 뮌{ނe> &Q~} p73Wlh{p1+ݢN_e߬> N.qOyujnWD?: K4+?MڬWX~ڟU !LR<߱\CN SGfPC8Xivįy0#_ ;4 agh;͊L{/z-jmyyR2Xi__L#[og8(/0s&,hи/xt8|e.xĮ' HG^üh}}u8,u[U޽Po4#~O!xfXK26\IbCgtSs`2uNW ٓr|fQ[x'|'|UHcD_KcsnwIĽ?ќ)%},b PUP2+XQ|]惵G{m_Ls??EGf%,ah֌]JiI5~cuB!B!,U9*b8O<Ç_a|0HYl;+m*t'h1$[O[ Ba=Ymg^MÅ,ECdrA 捝t"UCʿ\[o$u 73uZnqa<艝I|J;BݘQ\_z6m(~NNK?*I{ٲe7qɗ)xɠq/5J}l+ǒ3[84dcy56%=Z;7Bӻ+(87k+%&EwPU/æF5pyLr/;Ԑơٴ}+.Z@@= I΍t O/wW)84lFU.pQ );uRkƼ_6+ShL8FH .I+x^P1i2$ KD7D)wqUT?s" *+(r|Ll}J,\z2-"SDEAT;?05.}^^rp 3ws̭e~iބƎv9݄NSw*gwti뇷/AϾKDJ)AqY??OonԯxL'b+CvSّq<8+_쁿'M;=˻o2G[s{f?qZwal@)B{?os8%!%uz{Pw?%_0sʲ>vó3,-trO A A vGCQ(Nplrq DF-zf y}:vkFR}/9=tCaҐ KmMB{]FvԫˠfGiUZufO=54|hڨYN,n0qtLQ0ے6y$O/ß?Eb`:7TQڹ*/7+kFIwxIWUVcY*s4z? ++(̼ڃ'8yd%C|8B1d4YN\ yAYdՄΏ PP $FӜ>9fv:k=΁M!P9}_Lx)6JkI ^81<Ѩ},jCI1G"<=_&:e|INXFso7 E4qg%uF7zۯbb=Ǐ3֖ ,ozyֻ_eށ,i[;;%!,UWa i8-$njDGWגIBĿbiqO&}'0&HBT39;о6nnh(̾J|fv֧SUnmzUMI"BwpJ%/t'|'ΦuթK~~>d99{՝ﻎD NeS FV46 9uI)y+VfiTw\c/2Nݙ=-?LH贍4FwZ!DS03'-)sIj([N_SSL k捗[mhV+w lȠunL/>9i(0>#[uc5n|GN%~E ~];poZµ%\o,K^(}~AG5#~TC%.pMxYų냩|mIKX>v<Cqx@{by jWF2C_yY4jcsKi*ԽrYS6ntRGgs&s$ vC}hƉ_!v9%s ˡ.2Q!2Sg\^&>@ 8,7e+Ŀb&w^5{s=px*:W$/cdgj: D/vw b˟ts+(k}~ 8ʼny.лw}%Rqp1h#R 9[bMo{(pZl_}mQHIame&cт$J@63GDEGnj ņEڋZD=$%῟)b]?ڌ/GDrpH+y_"K|u'"#~џ0y#Ne#H2_WoBhSjΕ={QeÞkFM6W$KMо8|JAc݄}=8WWѡַhp87o4iɳBF&z5BԅL UP9r N/#Pɍg1xk$z3b_.^AIDAT:PHFRP3aV^,Xv8U~aqld47<@Yߒߓ>2QKr`wb:vZ,i^[==iS?F aܴ@|g9ȯ3#Vs|%4xiT+՚8dҒ|cd2ihI/ql|3v69^20oc[٢#j 'auaoB>jE|$~瞻qcexoxxClM哿Mok{5)**fb㖭\n@>7oԚZVz1L>Gl.Ꮓ;w1݃FͣS\\JkؙwWSC~!B!,^:Eer4 b6Ga 3*)Ui~!B!,I\h P ֏ dFYB!B! !B!BTYB!B!D% !B!BTYB!B!DJ\([f-] 7Kbiڜ_Ӿ =MCצ=s*7 ǵrЃhO B!B<:J;Ay]!wQI<8t\V=ثU{(EjEuU]nv>WIa+;>?fhSE8BTI9v NťQ.CG/c_?\ʈL YIMǕ-5t ˜F޴IT+L6s]#<裸sj [/xNgQsI:]LCv+WօL'LJG[I~L _ԧE𤋮;wk3|;m7v.{7]J|>h0widgk$r|xU7a8~o;G߀_bbN/K!=xGV2͇ )CFŐ4UqLXMrq0KELbkiN>m/k3jmlwƭ?Q;;y-1?aL ߟp8cvy-QX7&;VWGMcam0ᑧ*%>*bb=Ǐ3z798BB|/>ӿ=Mݯ2@y|̴̝՝rDQ)$\Yq]z8\K&ŀ(':bLE3N`|OL.$Rׅz%˩fr-w}mGQ}쌭OZQmհx\1#^E캨=q]idPå OrTu+INbely#VMK3'+k6t {l7hIfO (Oɍlxen/s)l 玤iML1wsY9nb^䊕YmZ= [I'ڙFaԇ=pwQIieOo| _vwfoS&:m#M]BrR)f擖ǹt ZLuE- 'X)j5pp˭6ڂ 4ZLŕJFtdP::c7gpx7Ձmձ+,:` -Ch H8pDaקKo}Į6qYn6 =9%S%_|u%mpIƗ~3Ze(NN䢹;7Y`fvA10&l<:{_vװU{|8|R0]en%&d$pYaY-.7R ." ' 8:7,g>4j|qpCSLݏgX9YTr|xUEqף P/xv}0M= | ]ǎ`66o {by jWŬrc*N:{k3ͿD >Mz8۸!'^3~^ t:T 0Ԫm.Po\?7pֿZ2Y7/PO!D:Z2 ܬO'g)[$0 rKkfœ$Uѡַz.&q~A;( ;Us/a$z=$[$+.%jã)-ҊPsNf Rp8|->϶mui갶2TrhvK]63GDEGnj ņO!GxZjN _YAoaq2sc,>zוf|9="KEף97~Ŋ 9x\~qS-X U=7pпџ0y#Ne#H2_Wo]BN;Wb%.GE{ޮ5eXWœW,5Co+u_^E#MCDZF؍3'MK}z52ѻ'.dȒg>vU}r|xU7{ŊgyK~OVh˄F-@Kˁ݉:YhtpçY0_{nuL6qL#ΌxYZ͹YqDC4jM2iɇ 1C_yhoT<97ăa2)f_ůz{g a3'kXfƼgE-wǼA]֯0:7yVz׸1r"^tgm4yFo|o,v0I)dKh~<2S9D1EPKfOz1`0s_nQEUmg >E&5qPV)$Xa!B!HI\h P ֏ dFYB!B! &[B!B!2xpˇ !B!BąB!B!,I\!B!ʒąx ̟L箷ߪB!B7u'W¬`nv3w:8*vXg3BFC[GV~6}=Mc:LU:Zm+*dc` 3>@ga((o&US:=ͨA-7yPXfX5kjv(sCpB!B#0^N7PbX K+0mhniPՊ5;̥O&kd:Vu WV|sh *]X އ xo* j6Qg,/zw5>avK=)Ql|=t9Yd}ڄB!B3n,G!&]ЬA+9|? qtݭ8mkz 6n 9M@2 ۈOMH_OK|il:4&wp wQ a ]݉K  l_!z'A+zY Ϡ݈ۯ^b۳|1#?6S1eIBM#:= 3,hxZ0nB!B<:*'qr[B aC:{B*IDV`̾9~-XgM:Ȼe挮%{9yc͉fDzWeˇ_iwj)Ǡ4ap[ 1=$ggz)=t[$V bAWf2UD!B!q2u #G1b6l:9 }_mXȶhG)w u[F i!\WsS<۷ \.6jS\i>;WAk"ms(#GjZ璝#B!BQuU3.4N:s QKpIT6Z뉌ᗿJ2SIN_7ģLMo5L1g;=~jXiԂI K>̭ mN&ٷ(,2ͱy0B!B!S9SEf7~Pah]+0 LݰT~umj[8ؿt{ToPEkZHA)-Jd]yƣ4ƀKi+*^% ]J gr=hۯh #B!BS%=NDBz96g@X'KFszu3ezwqVA3A4ԽLԯzb3o{U <6C Ѱ <ưuW۫l_3Ʌ@E~Z=hcm5N v墢NSYB!BT9 r1} 3C5O M0rƯP}O3O<ӗs 3l\af'DfA&~0X)id|3BA_կX0U~ƅS.f𦘃Ѷ_ gNIU-Єc #QB!Bܜ;>07gEUc׭_ J:-Z+!B!LJ>ygXӃ&>^)/|(Xg9T^ _EWIB!B| ss<=cq!B!BJQzą!dąB!B!,EUcv#B!Bhx l*(IENDB`pspg-2.6.6/src/000077500000000000000000000000001360716715600133015ustar00rootroot00000000000000pspg-2.6.6/src/commands.c000066400000000000000000000246101360716715600152510ustar00rootroot00000000000000/*------------------------------------------------------------------------- * * commands.c * a list of commands and translations between keys and commands * * Portions Copyright (c) 2017-2019 Pavel Stehule * * IDENTIFICATION * src/commands.c * *------------------------------------------------------------------------- */ #include "pspg.h" #include "commands.h" int CTRL_HOME; int CTRL_END; #ifdef NCURSES_EXT_FUNCS static int get_code(const char *capname, int fallback) { #ifdef NCURSES_EXT_FUNCS char *s; int result; s = tigetstr((NCURSES_CONST char *) capname); if (s == NULL || s == (char *) -1) return fallback; result = key_defined(s); return result > 0 ? result : fallback; #else return fallback; #endif } #endif /* * Set a value of CTRL_HOME and CTRL_END key codes. These codes * can be redefined on some plaforms. */ void initialize_special_keycodes() { #ifdef NCURSES_EXT_FUNCS use_extended_names(TRUE); #endif CTRL_HOME = get_code("kHOM5", 538); CTRL_END = get_code("kEND5", 533); } /* * For debug purposes */ const char * cmd_string(int cmd) { switch (cmd) { case cmd_Invalid: return "Invalid"; case cmd_RESIZE_EVENT: return "RESIZE"; case cmd_MOUSE_EVENT: return "MOUSE"; case cmd_ReleaseCols: return "ReleaseCols"; case cmd_FreezeOneCol: return "FreezeOneCol"; case cmd_FreezeTwoCols: return "FreezeTwoCols"; case cmd_FreezeThreeCols: return "FreezeThreeCols"; case cmd_FreezeFourCols: return "FreezeFourCols"; case cmd_FreezeFiveCols: return "FreezeFiveCols"; case cmd_FreezeSixCols: return "FreezeSixCols"; case cmd_FreezeSevenCols: return "FreezeSevenCols"; case cmd_FreezeEightCols: return "FreezeEightCols"; case cmd_FreezeNineCols: return "FreezeNineCols"; case cmd_SoundToggle: return "SoundTogle"; case cmd_MouseToggle: return "MouseTogle"; case cmd_UtfArtToggle: return "UtfArtToggle"; case cmd_MenuAsciiArtToggle: return "MenuAsciiArtToggle"; case cmd_CSSearchSet: return "CSSearchSet"; case cmd_CISearchSet: return "CISearchSet"; case cmd_USSearchSet: return "USSearchSet"; case cmd_HighlightLines: return "HighlightLines"; case cmd_HighlightValues: return "HighlightValues"; case cmd_NoHighlight: return "NoHighlight"; case cmd_SetTheme_MidnightBlack: return "SetTheme_MidnightBlack"; case cmd_SetTheme_Midnight: return "SetTheme_Midnight"; case cmd_SetTheme_Foxpro: return "SetTheme_Foxpro"; case cmd_SetTheme_Pdmenu: return "SetTheme_Pdmenu"; case cmd_SetTheme_White: return "SetTheme_White"; case cmd_SetTheme_Mutt: return "SetTheme_Mutt"; case cmd_SetTheme_Pcfand: return "SetTheme_Pcfand"; case cmd_SetTheme_Green: return "SetTheme_Green"; case cmd_SetTheme_Blue: return "SetTheme_Blue"; case cmd_SetTheme_WP: return "SetTheme_WP"; case cmd_SetTheme_Lowcontrast: return "SetTheme_Lowcontrast"; case cmd_SetTheme_Darkcyan: return "SetTheme_Darkcyan"; case cmd_SetTheme_Paradox: return "SetTheme_Paradox"; case cmd_SetTheme_DBase: return "SetTheme_DBase"; case cmd_SetTheme_DBasemagenta: return "SetTheme_DBasemagenta"; case cmd_SetTheme_Red: return "SetTheme_Red"; case cmd_SetTheme_Simple: return "SetTheme_Simple"; case cmd_SetTheme_SolarDark: return "SetTheme_SolarDark"; case cmd_SetTheme_SolarLight: return "SetTheme_SolarLight"; case cmd_SetTheme_GruvboxLight: return "SetTheme_GruvboxLight"; case cmd_SetTheme_TaoLight: return "SetTheme_TaoLight"; case cmd_SaveSetup: return "SaveSetup"; case cmd_Escape: return "Escape"; case cmd_Quit: return "Quit"; case cmd_RawOutputQuit: return "RawOutputQuit"; case cmd_ShowMenu: return "ShowMenu"; case cmd_FlushBookmarks: return "FlushBookmarks"; case cmd_ToggleBookmark: return "ToggleBookmark"; case cmd_PrevBookmark: return "PrevBookmark"; case cmd_NextBookmark: return "NextBookmark"; case cmd_CursorUp: return "CursorUp"; case cmd_CursorDown: return "CursorDown"; case cmd_ScrollUp: return "ScrollUp"; case cmd_ScrollDown: return "ScrollDown"; case cmd_ScrollUpHalfPage: return "ScrollUpHalfPage"; case cmd_ScrollDownHalfPage: return "ScrollDownHalfPage"; case cmd_MoveLeft: return "MoveLeft"; case cmd_MoveRight: return "MoveRight"; case cmd_CursorFirstRow: return "CursorFirstRow"; case cmd_CursorLastRow: return "CursorLastRow"; case cmd_CursorFirstRowPage: return "CursorFirstRowPage"; case cmd_CursorLastRowPage: return "CursorLastRowPage"; case cmd_CursorHalfPage: return "CursorHalfPage"; case cmd_PageUp: return "PageUp"; case cmd_PageDown: return "PageDown"; case cmd_ShowFirstCol: return "ShowFirstCol"; case cmd_ShowLastCol: return "ShowLastCol"; case cmd_SaveData: return "SaveData"; case cmd_ForwardSearch: return "ForwardSearch"; case cmd_BackwardSearch: return "BackwardSearch"; case cmd_SearchNext: return "SearchNext"; case cmd_SearchPrev: return "SearchPrev"; case cmd_SearchColumn: return "SearchColumn"; case cmd_ShowTopBar: return "ShowTopBar"; case cmd_ShowBottomBar: return "ShowBottomBar"; case cmd_RowNumToggle: return "RowNumToggle"; case cmd_GotoLine: return "GotoLine"; case cmd_ShowCursor: return "ShowCursor"; case cmd_ShowVerticalCursor: return "ShowVerticalCursor"; case cmd_BoldLabelsToggle: return "BoldLabelsToggle"; case cmd_BoldCursorToggle: return "BoldCursorToggle"; case cmd_SortAsc: return "SortAsc"; case cmd_SortDesc: return "SortDesc"; case cmd_OriginalSort: return "OriginalSort"; case cmd_TogglePause: return "TogglePause"; default: return "unknown command"; } } int translate_event(int c, bool alt, bool watch_mode) { if (alt) { switch (c) { case 'b': return cmd_BoldLabelsToggle; case 'c': return cmd_ShowCursor; case 'l': return cmd_GotoLine; case 'm': return cmd_MouseToggle; case 'n': return cmd_RowNumToggle; case 'o': return cmd_FlushBookmarks; case 'k': return cmd_ToggleBookmark; case 'i': return cmd_PrevBookmark; case 'j': return cmd_NextBookmark; case 'q': return cmd_RawOutputQuit; case 'v': return cmd_ShowVerticalCursor; case '9': return cmd_ShowMenu; case 27: return cmd_Escape; case '0': return cmd_Quit; } } else { switch (c) { case KEY_RESIZE: return cmd_RESIZE_EVENT; case KEY_MOUSE: return cmd_MOUSE_EVENT; case KEY_F(9): return cmd_ShowMenu; case KEY_F(10): case 'q': return cmd_Quit; case KEY_UP: case 'k': return cmd_CursorUp; case KEY_DOWN: case 'j': return cmd_CursorDown; case '0': return cmd_ReleaseCols; case '1': return cmd_FreezeOneCol; case '2': return cmd_FreezeTwoCols; case '3': return cmd_FreezeThreeCols; case '4': return cmd_FreezeFourCols; case '5': return cmd_FreezeFiveCols; case '6': return cmd_FreezeSixCols; case '7': return cmd_FreezeSevenCols; case '8': return cmd_FreezeEightCols; case '9': return cmd_FreezeNineCols; case 4: /* CTRL D */ return cmd_ScrollDownHalfPage; case 21: /* CTRL U */ return cmd_ScrollUpHalfPage; case 5: /* CTRL E */ return cmd_ScrollDown; case 25: /* CTRL Y */ return cmd_ScrollUp; case KEY_LEFT: case 'h': return cmd_MoveLeft; case KEY_RIGHT: case 'l': return cmd_MoveRight; case 'H': return cmd_CursorFirstRowPage; case 'L': return cmd_CursorLastRowPage; case 'M': return cmd_CursorHalfPage; case KEY_PPAGE: case 2: /* CTRL B */ return cmd_PageUp; case ' ': return watch_mode ? cmd_TogglePause : cmd_PageDown; case 6: /* CTRL F */ case KEY_NPAGE: return cmd_PageDown; case KEY_HOME: case '^': return cmd_ShowFirstCol; case KEY_END: case '$': return cmd_ShowLastCol; case 's': return cmd_SaveData; case '/': return cmd_ForwardSearch; case '?': return cmd_BackwardSearch; case 'n': return cmd_SearchNext; case 'N': return cmd_SearchPrev; case 'g': return cmd_CursorFirstRow; case 'G': return cmd_CursorLastRow; case 'c': return cmd_SearchColumn; case 'a': return cmd_SortAsc; case 'd': return cmd_SortDesc; case 'u': return cmd_OriginalSort; } } if (c == CTRL_HOME) return cmd_CursorFirstRow; else if (c == CTRL_END) return cmd_CursorLastRow; return cmd_Invalid; } /* * Returns cmd for theme * */ int theme_get_cmd(int theme) { switch (theme) { case 0: return cmd_SetTheme_MidnightBlack; case 1: return cmd_SetTheme_Midnight; case 2: return cmd_SetTheme_Foxpro; case 3: return cmd_SetTheme_Pdmenu; case 4: return cmd_SetTheme_White; case 5: return cmd_SetTheme_Mutt; case 6: return cmd_SetTheme_Pcfand; case 7: return cmd_SetTheme_Green; case 8: return cmd_SetTheme_Blue; case 9: return cmd_SetTheme_WP; case 10: return cmd_SetTheme_Lowcontrast; case 11: return cmd_SetTheme_Darkcyan; case 12: return cmd_SetTheme_Paradox; case 13: return cmd_SetTheme_DBase; case 14: return cmd_SetTheme_DBasemagenta; case 15: return cmd_SetTheme_Red; case 16: return cmd_SetTheme_Simple; case 17: return cmd_SetTheme_SolarDark; case 18: return cmd_SetTheme_SolarLight; case 19: return cmd_SetTheme_GruvboxLight; case 20: return cmd_SetTheme_TaoLight; }; return cmd_Invalid; } /* * Returns theme for cmd * */ int cmd_get_theme(int cmd) { switch (cmd) { case cmd_SetTheme_MidnightBlack: return 0; case cmd_SetTheme_Midnight: return 1; case cmd_SetTheme_Foxpro: return 2; case cmd_SetTheme_Pdmenu: return 3; case cmd_SetTheme_White: return 4; case cmd_SetTheme_Mutt: return 5; case cmd_SetTheme_Pcfand: return 6; case cmd_SetTheme_Green: return 7; case cmd_SetTheme_Blue: return 8; case cmd_SetTheme_WP: return 9; case cmd_SetTheme_Lowcontrast: return 10; case cmd_SetTheme_Darkcyan: return 11; case cmd_SetTheme_Paradox: return 12; case cmd_SetTheme_DBase: return 13; case cmd_SetTheme_DBasemagenta: return 14; case cmd_SetTheme_Red: return 15; case cmd_SetTheme_Simple: return 16; case cmd_SetTheme_SolarDark: return 17; case cmd_SetTheme_SolarLight: return 18; case cmd_SetTheme_GruvboxLight: return 19; case cmd_SetTheme_TaoLight: return 20; }; return 1; } pspg-2.6.6/src/commands.h000066400000000000000000000046631360716715600152640ustar00rootroot00000000000000/*------------------------------------------------------------------------- * * command.h * a list of commands and translations between keys and commands * * Portions Copyright (c) 2017-2019 Pavel Stehule * * IDENTIFICATION * src/commands.h * *------------------------------------------------------------------------- */ #ifndef COMMANDS_H #define COMMANDS_H /* * List of supported commands. Some these commands can be mapped to keys */ typedef enum PspgCommand { cmd_Invalid = 0, cmd_RESIZE_EVENT, cmd_MOUSE_EVENT, cmd_ReleaseCols = 100, cmd_FreezeOneCol, cmd_FreezeTwoCols, cmd_FreezeThreeCols, cmd_FreezeFourCols, cmd_FreezeFiveCols, cmd_FreezeSixCols, cmd_FreezeSevenCols, cmd_FreezeEightCols, cmd_FreezeNineCols, cmd_SoundToggle, cmd_MouseToggle, cmd_UtfArtToggle, cmd_MenuAsciiArtToggle, cmd_CSSearchSet, cmd_CISearchSet, cmd_USSearchSet, cmd_HighlightLines, cmd_HighlightValues, cmd_NoHighlight, cmd_SetTheme_MidnightBlack, cmd_SetTheme_Midnight, cmd_SetTheme_Foxpro, cmd_SetTheme_Pdmenu, cmd_SetTheme_White, cmd_SetTheme_Mutt, cmd_SetTheme_Pcfand, cmd_SetTheme_Green, cmd_SetTheme_Blue, cmd_SetTheme_WP, cmd_SetTheme_Lowcontrast, cmd_SetTheme_Darkcyan, cmd_SetTheme_Paradox, cmd_SetTheme_DBase, cmd_SetTheme_DBasemagenta, cmd_SetTheme_Red, cmd_SetTheme_Simple, cmd_SetTheme_SolarDark, cmd_SetTheme_SolarLight, cmd_SetTheme_GruvboxLight, cmd_SetTheme_TaoLight, cmd_SaveSetup, cmd_Escape, cmd_Quit, cmd_RawOutputQuit, cmd_ShowMenu, cmd_FlushBookmarks, cmd_ToggleBookmark, cmd_PrevBookmark, cmd_NextBookmark, cmd_CursorUp, cmd_CursorDown, cmd_ScrollUp, cmd_ScrollDown, cmd_ScrollUpHalfPage, cmd_ScrollDownHalfPage, cmd_MoveLeft, cmd_MoveRight, cmd_CursorFirstRow, cmd_CursorLastRow, cmd_CursorFirstRowPage, cmd_CursorLastRowPage, cmd_CursorHalfPage, cmd_PageUp, cmd_PageDown, cmd_ShowFirstCol, cmd_ShowLastCol, cmd_SaveData, cmd_ForwardSearch, cmd_BackwardSearch, cmd_SearchNext, cmd_SearchPrev, cmd_SearchColumn, cmd_ShowTopBar, cmd_ShowBottomBar, cmd_RowNumToggle, cmd_GotoLine, cmd_ShowCursor, cmd_ShowVerticalCursor, cmd_BoldLabelsToggle, cmd_BoldCursorToggle, cmd_SortAsc, cmd_SortDesc, cmd_OriginalSort, cmd_TogglePause } PspgCommand; extern void initialize_special_keycodes(); extern const char *cmd_string(int cmd); extern int translate_event(int c, bool alt, bool watch_mode); extern int cmd_get_theme(int cmd); extern int theme_get_cmd(int theme); #endif pspg-2.6.6/src/config.c000066400000000000000000000122421360716715600147130ustar00rootroot00000000000000/*------------------------------------------------------------------------- * * config.c * a routines for loading, saving configuration * * Portions Copyright (c) 2017-2019 Pavel Stehule * * IDENTIFICATION * src/config.c * *------------------------------------------------------------------------- */ #include "config.h" #include #include #include #include #include static bool parse_cfg(char *line, char *key, bool *bool_val, int *int_val) { int key_length = 0; /* skip initial spaces */ while (*line == ' ') line++; /* copy key to key array */ while (*line != ' ' && *line != '=' && *line != '\0') { if (key_length < 99) { key[key_length++] = *line++; } else break; } key[key_length] = '\0'; /* search '=' */ while (*line != '=' && *line != '\0') line++; if (key_length > 0 && *line == '=') { line += 1; /* skip spaces */ while (*line == ' ') line++; if (*line >= '0' && *line <= '9') { *int_val = atoi(line); return true; } else if (strncmp(line, "true", 4) == 0) { *bool_val = true; return true; } else if (strncmp(line, "false", 5) == 0) { *bool_val = false; return true; } } return false; } #define SAFE_SAVE_BOOL_OPTION(name, opt) \ do { \ result = fprintf(f, "%s = %s\n", (name), (opt) ? "true" : "false"); \ if (result < 0) \ return false; \ } while (0) bool save_config(char *path, Options *opts) { FILE *f; int result; errno = 0; f = fopen(path, "w"); if (f == NULL) return false; SAFE_SAVE_BOOL_OPTION("ascii_menu", opts->force_ascii_art); SAFE_SAVE_BOOL_OPTION("bold_labels", opts->bold_labels); SAFE_SAVE_BOOL_OPTION("bold_cursor", opts->bold_cursor); SAFE_SAVE_BOOL_OPTION("ignore_case", opts->ignore_case); SAFE_SAVE_BOOL_OPTION("ignore_lower_case", opts->ignore_lower_case); SAFE_SAVE_BOOL_OPTION("no_cursor", opts->no_cursor); SAFE_SAVE_BOOL_OPTION("no_sound", opts->no_sound); SAFE_SAVE_BOOL_OPTION("no_mouse", opts->no_mouse); SAFE_SAVE_BOOL_OPTION("less_status_bar", opts->less_status_bar); SAFE_SAVE_BOOL_OPTION("no_highlight_search", opts->no_highlight_search); SAFE_SAVE_BOOL_OPTION("no_highlight_lines", opts->no_highlight_lines); SAFE_SAVE_BOOL_OPTION("force_uniborder", opts->force_uniborder); SAFE_SAVE_BOOL_OPTION("show_rownum", opts->show_rownum); SAFE_SAVE_BOOL_OPTION("without_commandbar", opts->no_commandbar); SAFE_SAVE_BOOL_OPTION("without_topbar", opts->no_topbar); SAFE_SAVE_BOOL_OPTION("vertical_cursor", opts->vertical_cursor); SAFE_SAVE_BOOL_OPTION("on_sigint_exit", opts->on_sigint_exit); SAFE_SAVE_BOOL_OPTION("no_sigint_search_reset", opts->no_sigint_search_reset); SAFE_SAVE_BOOL_OPTION("double_header", opts->double_header); result = fprintf(f, "theme = %d\n", opts->theme); if (result < 0) return false; result = fprintf(f, "border_type = %d\n", opts->border_type); if (result < 0) return false; result = fclose(f); if (result != 0) return false; return true; } /* * Simple parser of config file. I don't expect too much fields, so performance is * not significant. */ bool load_config(char *path, Options *opts) { FILE *f; char *line = NULL; ssize_t read; size_t len; errno = 0; f = fopen(path, "r"); if (f == NULL) return false; while ((read = getline(&line, &len, f)) != -1) { char key[100]; bool bool_val = false; int int_val = -1; if (parse_cfg(line, key, &bool_val, &int_val)) { if (strcmp(key, "ascii_menu") == 0) opts->force_ascii_art = bool_val; else if (strcmp(key, "bold_labels") == 0) opts->bold_labels = bool_val; else if (strcmp(key, "bold_cursor") == 0) opts->bold_cursor = bool_val; else if (strcmp(key, "ignore_case") == 0) opts->ignore_case = bool_val; else if (strcmp(key, "ignore_lower_case") == 0) opts->ignore_lower_case = bool_val; else if (strcmp(key, "no_sound") == 0) opts->no_sound = bool_val; else if (strcmp(key, "no_cursor") == 0) opts->no_cursor = bool_val; else if (strcmp(key, "no_mouse") == 0) opts->no_mouse = bool_val; else if (strcmp(key, "less_status_bar") == 0) opts->less_status_bar = bool_val; else if (strcmp(key, "no_highlight_search") == 0) opts->no_highlight_search = bool_val; else if (strcmp(key, "no_highlight_lines") == 0) opts->no_highlight_lines = bool_val; else if (strcmp(key, "force_uniborder") == 0) opts->force_uniborder = bool_val; else if (strcmp(key, "show_rownum") == 0) opts->show_rownum = bool_val; else if (strcmp(key, "theme") == 0) opts->theme = int_val; else if (strcmp(key, "without_commandbar") == 0) opts->no_commandbar = bool_val; else if (strcmp(key, "without_topbar") == 0) opts->no_topbar = bool_val; else if (strcmp(key, "vertical_cursor") == 0) opts->vertical_cursor = bool_val; else if (strcmp(key, "border_type") == 0) opts->border_type = int_val; else if (strcmp(key, "double_header") == 0) opts->double_header = bool_val; else if (strcmp(key, "on_sigint_exit") == 0) opts->on_sigint_exit = bool_val; else if (strcmp(key, "no_sigint_search_reset") == 0) opts->no_sigint_search_reset = bool_val; free(line); line = NULL; } } fclose(f); return true; } pspg-2.6.6/src/config.h000066400000000000000000000024441360716715600147230ustar00rootroot00000000000000/*------------------------------------------------------------------------- * * config.h * load/save configuration * * Portions Copyright (c) 2017-2019 Pavel Stehule * * IDENTIFICATION * src/config.h * *------------------------------------------------------------------------- */ #ifndef PSPG_CONFIG_H #define PSPG_CONFIG_H #include typedef struct { char *pathname; bool ignore_case; bool ignore_lower_case; bool no_sound; bool no_mouse; bool less_status_bar; bool no_highlight_search; bool no_highlight_lines; bool force_uniborder; bool force8bit; bool no_commandbar; bool no_topbar; bool show_rownum; bool no_cursor; bool vertical_cursor; bool tabular_cursor; bool force_ascii_art; int theme; int freezed_cols; bool bold_labels; bool bold_cursor; bool tsv_format; bool csv_format; char csv_separator; char csv_header; /* a - auto, - off, + on */ char *nullstr; bool ignore_short_rows; char double_header; int border_type; bool on_sigint_exit; bool no_sigint_search_reset; char *query; int watch_time; char *host; char *username; char *port; bool force_password_prompt; char *password; char *dbname; } Options; extern bool save_config(char *path, Options *opts); extern bool load_config(char *path, Options *opts); #endif pspg-2.6.6/src/menu.c000066400000000000000000000231001360716715600144050ustar00rootroot00000000000000/*------------------------------------------------------------------------- * * menu.c * holds menu related code * * Portions Copyright (c) 2017-2019 Pavel Stehule * * IDENTIFICATION * src/menu.c * *------------------------------------------------------------------------- */ #include #include "pspg.h" #include "st_menu.h" #include "commands.h" #define MENU_ITEM_THEME 1 #define MENU_ITEM_OPTIONS 2 ST_CMDBAR_ITEM _bottombar[] = { {"Save", false, 2, cmd_SaveData}, {"Search", false, 7, cmd_ForwardSearch}, {"Menu", false, 9, cmd_ShowMenu}, {"Quit", false, 10, cmd_Quit}, {NULL} }; ST_MENU_ITEM _file[] = { {"~S~ave", cmd_SaveData, "s"}, {"--"}, {"~R~aw output quit", cmd_RawOutputQuit, "M-q"}, {"E~x~it", cmd_Quit, "q, F10"}, {NULL} }; /* * This content must be permanent for all menu life cycle. State variable * menu references on this content. */ ST_MENU_ITEM _search[] = { {"~S~earch", cmd_ForwardSearch, "/"}, {"Search ~b~ackward", cmd_BackwardSearch, "?"}, {"Search ~a~gain", cmd_SearchNext, "n"}, {"Search p~r~evious", cmd_SearchPrev, "N"}, {"--"}, {"Search ~c~olumn", cmd_SearchColumn, "c"}, {"--"}, {"~T~oggle bookmark", cmd_ToggleBookmark, "M-k"}, {"~P~rev bookmark", cmd_PrevBookmark, "M-i"}, {"~N~ext bookmark", cmd_NextBookmark, "M-j"}, {"~F~lush bookmarks", cmd_FlushBookmarks, "M-o"}, {NULL} }; ST_MENU_ITEM _command[] = { {"_0_Release fixed columns", cmd_ReleaseCols, "0"}, {"_1_Freeze one column", cmd_FreezeOneCol, "1"}, {"_2_Freeze two columns", cmd_FreezeTwoCols, "2"}, {"_3_Freeze three columns", cmd_FreezeThreeCols, "3"}, {"_4_Freeze four columns", cmd_FreezeFourCols, "4"}, {"--"}, {"~P~rev row", cmd_CursorUp, "k, Key up"}, {"~N~ext row", cmd_CursorDown, "j, Key down"}, {"Move to l~e~ft", cmd_MoveLeft, "h, Key left"}, {"Move to ~r~ight", cmd_MoveRight, "l, Key right"}, {"--"}, {"Go to ~f~irst row", cmd_CursorFirstRow, "g, C-Home"}, {"Go to l~a~st row", cmd_CursorLastRow, "G, C-End"}, {"Go to ~l~ine", cmd_GotoLine, "M-l"}, {"--"}, {"~S~how first column", cmd_ShowFirstCol, "^, Home"}, {"Sho~w~ last column", cmd_ShowLastCol, "$, End"}, {"--"}, {"Page up", cmd_PageUp, "C-b, Prev page"}, {"Page down", cmd_PageDown, "C-f, space, Next page"}, {"--"}, {"As~c~ending order", cmd_SortAsc, "a"}, {"~D~escending order", cmd_SortDesc, "d"}, {"~O~riginal order", cmd_OriginalSort, "u"}, {NULL} }; ST_MENU_ITEM _theme[] = { {"_0_Midnight black", cmd_SetTheme_MidnightBlack}, {"_1_Midnight theme", cmd_SetTheme_Midnight}, {"_2_FoxPro like", cmd_SetTheme_Foxpro}, {"_3_Pdmenu like", cmd_SetTheme_Pdmenu}, {"_4_White theme", cmd_SetTheme_White}, {"_5_Mutt theme", cmd_SetTheme_Mutt}, {"_6_PC Fand like", cmd_SetTheme_Pcfand}, {"_7_Green theme", cmd_SetTheme_Green}, {"_8_Blue theme", cmd_SetTheme_Blue}, {"_9_Word perfect theme", cmd_SetTheme_WP}, {"_l_Low contrast blue theme", cmd_SetTheme_Lowcontrast}, {"_c_Dark cyan theme", cmd_SetTheme_Darkcyan}, {"_p_Paradox like", cmd_SetTheme_Paradox}, {"_d_DbaseIV retro", cmd_SetTheme_DBase}, {"_e_DbaseIV retro (Magenta)", cmd_SetTheme_DBasemagenta}, {"_r_Red white theme", cmd_SetTheme_Red}, {"_s_Simple theme", cmd_SetTheme_Simple}, {"_o_Solar Dark theme", cmd_SetTheme_SolarDark}, {"_g_Solar Light theme", cmd_SetTheme_SolarLight}, {"_u_Gruvbox Light theme", cmd_SetTheme_GruvboxLight}, {"_t_Tao Light theme", cmd_SetTheme_TaoLight}, {NULL}, }; ST_MENU_ITEM _options[] = { {"~C~ase sensitive search", cmd_CSSearchSet, NULL}, {"Case ~i~nsensitive search", cmd_CISearchSet, NULL}, {"~U~pper case sensitive search", cmd_USSearchSet, NULL}, {"--"}, {"Highlight searched ~l~ines", cmd_HighlightLines, NULL}, {"Highlight searched ~v~alues", cmd_HighlightValues, NULL}, {"~W~ithout highlighting", cmd_NoHighlight, NULL}, {"--"}, {"Show cursor", cmd_ShowCursor, "M-c"}, {"Show vertical cursor", cmd_ShowVerticalCursor, "M-v"}, {"Show line ~n~umbers", cmd_RowNumToggle, "M-n"}, {"Show top bar", cmd_ShowTopBar, NULL}, {"Show bottom bar", cmd_ShowBottomBar, NULL}, {"--"}, {"~M~ouse support", cmd_MouseToggle, "M-m"}, {"~Q~uiet mode", cmd_SoundToggle, NULL}, {"--"}, {"Force unicode ~b~orders", cmd_UtfArtToggle, NULL}, {"Force ~a~scii menu", cmd_MenuAsciiArtToggle, NULL}, {"Bold labels", cmd_BoldLabelsToggle, "M-b"}, {"Bold cursor", cmd_BoldCursorToggle, NULL}, {"~T~heme", MENU_ITEM_THEME, NULL, 0, 0, 0, _theme}, {"--"}, {"~S~ave setup", cmd_SaveSetup, NULL}, {NULL}, }; ST_MENU_ITEM menubar[] = { {"~F~ile", 0, NULL, 0, 0, 0, _file}, {"~S~earch", 0, NULL, 0, 0, 0, _search}, {"~C~ommand", 0, NULL, 0, 0, 0, _command}, {"~O~ptions", MENU_ITEM_OPTIONS, NULL, 0, 0, 0, _options}, {NULL} }; ST_MENU_CONFIG menu_config; ST_MENU_CONFIG menu_config2; int menu_theme = -1; /* * Returns menu style joined to main theme */ static int get_menu_style(int main_theme) { switch (main_theme) { case 0: return ST_MENU_STYLE_MCB; case 1: return ST_MENU_STYLE_MC; case 2: return ST_MENU_STYLE_FOXPRO; case 3: return ST_MENU_STYLE_DOS; case 4: return ST_MENU_STYLE_FAND_1; case 5: return ST_MENU_STYLE_NOCOLOR; case 6: return ST_MENU_STYLE_FAND_1; case 7: return ST_MENU_STYLE_ONECOLOR; case 8: return ST_MENU_STYLE_DOS; case 9: return ST_MENU_STYLE_PERFECT; case 10: return ST_MENU_STYLE_XGOLD_BLACK; case 11: return ST_MENU_STYLE_OLD_TURBO; case 12: return ST_MENU_STYLE_VISION; case 13: return ST_MENU_STYLE_DBASE; case 14: return ST_MENU_STYLE_OLD_TURBO; case 15: return ST_MENU_STYLE_PERFECT; case 16: return ST_MENU_STYLE_ONECOLOR; case 20: return ST_MENU_STYLE_TAO; default: return ST_MENU_STYLE_VISION; } } /* * Prepare configuration for st_menu */ void init_menu_config(Options *opts) { int start_from_rgb = 220; menu_config.force8bit = opts->force8bit; menu_config.force_ascii_art = opts->force_ascii_art; menu_config.language = NULL; menu_config.encoding = NULL; menu_config2.force8bit = opts->force8bit; menu_config2.language = NULL; menu_config2.encoding = NULL; menu_theme = get_menu_style(opts->theme); if (menu_theme == ST_MENU_STYLE_FREE_DOS) { int fcp; fcp = st_menu_load_style(&menu_config, menu_theme, 30); st_menu_load_style(&menu_config2, ST_MENU_STYLE_FREE_DOS_P, fcp); } st_menu_load_style_rgb(&menu_config, menu_theme, menu_theme == ST_MENU_STYLE_ONECOLOR ? 3 : 30, &start_from_rgb); if (opts->theme == 1) menu_config.shadow_width = 2; else if (opts->theme == 4) menu_config.text_space = 4; menu_config.force_ascii_art = opts->force_ascii_art; menu_config2.force_ascii_art = opts->force_ascii_art; } /* * Prepare configuration and initialize menu */ struct ST_MENU * init_menu(struct ST_MENU *current_menu) { struct ST_MENU *menu = NULL; if (menu_theme == ST_MENU_STYLE_FREE_DOS) menu = st_menu_new_menubar2(&menu_config, &menu_config2, menubar); else menu = st_menu_new_menubar(&menu_config, menubar); if (current_menu) { int positions[1024]; st_menu_save(current_menu, positions, 1023); st_menu_load(menu, positions); st_menu_free(current_menu); } return menu; } struct ST_CMDBAR * init_cmdbar(struct ST_CMDBAR *current_cmdbar) { struct ST_CMDBAR *cmdbar = NULL; cmdbar = st_cmdbar_new(&menu_config, _bottombar); if (current_cmdbar) { st_cmdbar_unpost(current_cmdbar); st_cmdbar_free(current_cmdbar); } return cmdbar; } void post_menu(Options *opts, struct ST_MENU *menu) { st_menu_set_option(menu, cmd_ReleaseCols, ST_MENU_OPTION_MARKED, opts->freezed_cols == 0); st_menu_set_option(menu, cmd_FreezeOneCol, ST_MENU_OPTION_MARKED, (opts->freezed_cols == 1 || opts->freezed_cols == -1)); st_menu_set_option(menu, cmd_FreezeTwoCols, ST_MENU_OPTION_MARKED, opts->freezed_cols == 2); st_menu_set_option(menu, cmd_FreezeThreeCols, ST_MENU_OPTION_MARKED, opts->freezed_cols == 3); st_menu_set_option(menu, cmd_FreezeFourCols, ST_MENU_OPTION_MARKED, opts->freezed_cols == 4); st_menu_set_option(menu, cmd_SoundToggle, ST_MENU_OPTION_MARKED, opts->no_sound); st_menu_set_option(menu, cmd_UtfArtToggle, ST_MENU_OPTION_MARKED, opts->force_uniborder); st_menu_set_option(menu, cmd_MenuAsciiArtToggle, ST_MENU_OPTION_MARKED, opts->force_ascii_art); st_menu_set_option(menu, cmd_MouseToggle, ST_MENU_OPTION_MARKED, !opts->no_mouse); st_menu_set_option(menu, cmd_NoHighlight, ST_MENU_OPTION_MARKED, opts->no_highlight_search); st_menu_set_option(menu, cmd_HighlightValues, ST_MENU_OPTION_MARKED, opts->no_highlight_lines); st_menu_set_option(menu, cmd_HighlightLines, ST_MENU_OPTION_MARKED, !(opts->no_highlight_search || opts->no_highlight_lines)); st_menu_set_option(menu, cmd_CSSearchSet, ST_MENU_OPTION_MARKED, !(opts->ignore_case || opts->ignore_lower_case)); st_menu_set_option(menu, cmd_CISearchSet, ST_MENU_OPTION_MARKED, opts->ignore_case); st_menu_set_option(menu, cmd_USSearchSet, ST_MENU_OPTION_MARKED, opts->ignore_lower_case); st_menu_set_option(menu, cmd_ShowTopBar, ST_MENU_OPTION_MARKED, !opts->no_topbar); st_menu_set_option(menu, cmd_ShowBottomBar, ST_MENU_OPTION_MARKED, !opts->no_commandbar); st_menu_set_option(menu, cmd_RowNumToggle, ST_MENU_OPTION_MARKED, opts->show_rownum); st_menu_set_option(menu, cmd_ShowCursor, ST_MENU_OPTION_MARKED, !opts->no_cursor); st_menu_set_option(menu, cmd_ShowVerticalCursor, ST_MENU_OPTION_MARKED, opts->vertical_cursor); st_menu_set_option(menu, cmd_BoldLabelsToggle, ST_MENU_OPTION_MARKED, opts->bold_labels); st_menu_set_option(menu, cmd_BoldCursorToggle, ST_MENU_OPTION_MARKED, opts->bold_cursor); st_menu_reset_all_submenu_options(menu, MENU_ITEM_THEME, ST_MENU_OPTION_MARKED); st_menu_enable_option(menu, theme_get_cmd(opts->theme), ST_MENU_OPTION_MARKED); } pspg-2.6.6/src/pgclient.c000066400000000000000000000146121360716715600152560ustar00rootroot00000000000000/*------------------------------------------------------------------------- * * pgcliend.c * execute query and format result * * Portions Copyright (c) 2017-2019 Pavel Stehule * * IDENTIFICATION * src/pgclient.c * *------------------------------------------------------------------------- */ #include #include #include #include #include "pspg.h" #include "unicode.h" #ifdef HAVE_POSTGRESQL #include char errmsg[1024]; static RowBucketType * push_row(RowBucketType *rb, RowType *row, bool is_multiline) { if (rb->nrows >= 1000) { RowBucketType *new = malloc(sizeof(RowBucketType)); if (!new) return NULL; new->nrows = 0; new->allocated = true; new->next_bucket = NULL; rb->next_bucket = new; rb = new; } rb->rows[rb->nrows] = row; rb->multilines[rb->nrows++] = is_multiline; return rb; } /* * Correct solution is importing header file catalog/pg_type_d.h, * but this file is not in basic libpq headers, so instead enhancing * dependency just copy these values that should be immutable. */ #define INT8OID 20 #define INT2OID 21 #define INT4OID 23 #define FLOAT4OID 700 #define FLOAT8OID 701 #define XIDOID 28 #define CIDOID 29 #define CASHOID 790 #define NUMERICOID 1700 #define OIDOID 26 static char column_type_class(Oid ftype) { char align; switch (ftype) { case INT2OID: case INT4OID: case INT8OID: case FLOAT4OID: case FLOAT8OID: case NUMERICOID: case OIDOID: case XIDOID: case CIDOID: case CASHOID: align = 'd'; break; default: align = 'a'; break; } return align; } #endif #define EXIT_OUT_OF_MEMORY() do { PQclear(result); PQfinish(conn); leave_ncurses("out of memory"); } while (0) #define RELEASE_AND_LEAVE(s) do { PQclear(result); PQfinish(conn); *err = s; return false; } while (0) #define RELEASE_AND_EXIT(s) do { PQclear(result); PQfinish(conn); leave_ncurses(s); } while (0) #ifdef HAVE_POSTGRESQL static int field_info(Options *opts, char *str, bool *multiline) { long int digits; long int others; if (opts->force8bit) { int cw = 0; int width = 0; while (*str) { if (*str++ == '\n') { *multiline = true; width = cw > width ? cw : width; cw = 0; } else cw++; } return cw > width ? cw : width; } else return utf_string_dsplen_multiline(str, strlen(str), multiline, false, &digits, &others); } static int max_int(int a, int b) { return a > b ? a : b; } #endif /* * exit on fatal error, or return error */ bool pg_exec_query(Options *opts, RowBucketType *rb, PrintDataDesc *pdesc, const char **err) { #ifdef HAVE_POSTGRESQL PGconn *conn = NULL; PGresult *result = NULL; int nfields; int size; int i, j; char *locbuf; RowType *row; bool multiline_row; bool multiline_col; char *password; const char *keywords[8]; const char *values[8]; rb->nrows = 0; rb->next_bucket = NULL; if (opts->force_password_prompt && !opts->password) { password = getpass("Password: "); opts->password = strdup(password); if (!opts->password) EXIT_OUT_OF_MEMORY(); } keywords[0] = "host"; values[0] = opts->host; keywords[1] = "port"; values[1] = opts->port; keywords[2] = "user"; values[2] = opts->username; keywords[3] = "password"; values[3] = opts->password; keywords[4] = "dbname"; values[4] = opts->dbname; keywords[5] = "fallback_application_name"; values[5] = "pspg"; keywords[6] = "client_encoding"; values[6] = getenv("PGCLIENTENCODING") ? NULL : "auto"; keywords[7] = NULL; values[7] = NULL; conn = PQconnectdbParams(keywords, values, true); if (PQstatus(conn) == CONNECTION_BAD && PQconnectionNeedsPassword(conn) && !opts->password) { password = getpass("Password: "); opts->password = strdup(password); if (!opts->password) EXIT_OUT_OF_MEMORY(); keywords[3] = "password"; values[3] = opts->password; conn = PQconnectdbParams(keywords, values, true); } /* Check to see that the backend connection was successfully made */ if (PQstatus(conn) != CONNECTION_OK) { sprintf(errmsg, "Connection to database failed: %s", PQerrorMessage(conn)); RELEASE_AND_LEAVE(errmsg); } /* * ToDo: Because data are copied to local memory, the result can be fetched. * It can save 1/2 memory. */ result = PQexec(conn, opts->query); if (PQresultStatus(result) != PGRES_TUPLES_OK) { sprintf(errmsg, "Query doesn't return data: %s", PQerrorMessage(conn)); RELEASE_AND_LEAVE(errmsg); } if ((nfields = PQnfields(result)) > 1024) RELEASE_AND_EXIT("too much columns"); pdesc->nfields = nfields; pdesc->has_header = true; for (i = 0; i < nfields; i++) pdesc->types[i] = column_type_class(PQftype(result, i)); /* calculate necessary size of header data */ size = 0; for (i = 0; i < nfields; i++) size += strlen(PQfname(result, i)) + 1; locbuf = malloc(size); if (!locbuf) EXIT_OUT_OF_MEMORY(); /* store header */ row = malloc(offsetof(RowType, fields) + (nfields * sizeof(char *))); if (!row) EXIT_OUT_OF_MEMORY(); row->nfields = nfields; multiline_row = false; for (i = 0; i < nfields; i++) { char *name = PQfname(result, i); strcpy(locbuf, name); row->fields[i] = locbuf; locbuf += strlen(name) + 1; pdesc->widths[i] = field_info(opts, row->fields[i], &multiline_col); pdesc->multilines[i] = multiline_col; multiline_row |= multiline_col; } rb = push_row(rb, row, multiline_row); if (!rb) EXIT_OUT_OF_MEMORY(); /* calculate size for any row and store it */ for (i = 0; i < PQntuples(result); i++) { size = 0; for (j = 0; j < nfields; j++) size += strlen(PQgetvalue(result, i, j)) + 1; locbuf = malloc(size); if (!locbuf) EXIT_OUT_OF_MEMORY(); /* store data */ row = malloc(offsetof(RowType, fields) + (nfields * sizeof(char *))); if (!row) EXIT_OUT_OF_MEMORY(); row->nfields = nfields; multiline_row = false; for (j = 0; j < nfields; j++) { char *value = PQgetvalue(result, i, j); strcpy(locbuf, value); row->fields[j] = locbuf; locbuf += strlen(value) + 1; pdesc->widths[j] = max_int(pdesc->widths[j], field_info(opts, row->fields[j], &multiline_col)); pdesc->multilines[j] |= multiline_col; multiline_row |= multiline_col; } rb = push_row(rb, row, multiline_row); if (!rb) EXIT_OUT_OF_MEMORY(); } PQclear(result); PQfinish(conn); *err = NULL; return true; #else *err = "Query cannot be executed. The Postgres library was not available at compile time."; return false; #endif } pspg-2.6.6/src/pretty-csv.c000066400000000000000000000767361360716715600156100ustar00rootroot00000000000000/*------------------------------------------------------------------------- * * pretty-csv.c * import and formatting csv and tsv documents * * Portions Copyright (c) 2017-2019 Pavel Stehule * * IDENTIFICATION * src/pretty-csv.c * *------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include "pspg.h" #include "unicode.h" #ifndef offsetof #define offsetof(type, field) ((long) &((type *)0)->field) #endif /* offsetof */ typedef struct { char *buffer; int processed; int used; int size; int maxfields; int starts[1024]; /* start of first char of column (in bytes) */ int sizes[1024]; /* lenght of chars of column (in bytes) */ long int digits[1024]; /* number of digits, used for format detection */ long int tsizes[1024]; /* size of column in bytes, used for format detection */ int firstdigit[1024]; /* rows where first char is digit */ int widths[1024]; /* column's display width */ bool multilines[1024]; /* true if column has multiline row */ } LinebufType; typedef struct { char *buffer; int used; int size; int free; LineBuffer *linebuf; bool force8bit; int flushed_rows; /* number of flushed rows */ int maxbytes; bool printed_headline; } PrintbufType; typedef struct { int border; char linestyle; bool double_header; char header_mode; bool ignore_short_rows; } PrintConfigType; static void * smalloc(int size, char *debugstr) { char *result; result = malloc(size); if (!result) { if (debugstr) fprintf(stderr, "out of memory while %s\n", debugstr); else fprintf(stderr, "out of memory\n"); exit(EXIT_FAILURE); } return result; } /* * Add new row to LineBuffer */ static void pb_flush_line(PrintbufType *printbuf) { char *line; if (printbuf->linebuf->nrows == 1000) { LineBuffer *nb = smalloc(sizeof(LineBuffer), "serialize csv output"); memset(nb, 0, sizeof(LineBuffer)); printbuf->linebuf->next = nb; nb->prev = printbuf->linebuf; printbuf->linebuf = nb; } line = smalloc(printbuf->used + 1, "serialize csv output"); memcpy(line, printbuf->buffer, printbuf->used); line[printbuf->used] = '\0'; printbuf->linebuf->rows[printbuf->linebuf->nrows++] = line; if (printbuf->used > printbuf->maxbytes) printbuf->maxbytes = printbuf->used; printbuf->used = 0; printbuf->free = printbuf->size; printbuf->flushed_rows += 1; } static void pb_write(PrintbufType *printbuf, const char *str, int size) { if (printbuf->free < size) { printbuf->size += 10 * 1024; printbuf->free += 10 * 1024; printbuf->buffer = realloc(printbuf->buffer, printbuf->size); if (!printbuf->buffer) leave_ncurses("out of memory while serialize csv output\n"); } memcpy(printbuf->buffer + printbuf->used, str, size); printbuf->used += size; printbuf->free -= size; } static void pb_writes(PrintbufType *printbuf, const char *str) { pb_write(printbuf, str, strlen(str)); } static void pb_write_repeat(PrintbufType *printbuf, int n, const char *str, int size) { bool need_realloc = false; while (printbuf->free < size * n) { printbuf->size += 10 * 1024; printbuf->free += 10 * 1024; need_realloc = true; } if (need_realloc) { printbuf->buffer = realloc(printbuf->buffer, printbuf->size); if (!printbuf->buffer) leave_ncurses("out of memory while serialize csv output\n"); } while (n--) { memcpy(printbuf->buffer + printbuf->used, str, size); printbuf->used += size; printbuf->free -= size; } } static void pb_writes_repeat(PrintbufType *printbuf, int n, const char *str) { pb_write_repeat(printbuf, n, str, strlen(str)); } static void pb_putc(PrintbufType *printbuf, char c) { if (printbuf->free < 1) { printbuf->size += 10 * 1024; printbuf->free += 10 * 1024; printbuf->buffer = realloc(printbuf->buffer, printbuf->size); if (!printbuf->buffer) leave_ncurses("out of memory while serialize csv output\n"); } printbuf->free -= 1; printbuf->buffer[printbuf->used++] = c; } static void pb_puts(PrintbufType *printbuf, char *str) { pb_write(printbuf, str, strlen(str)); } static void pb_putc_repeat(PrintbufType *printbuf, int n, int c) { bool need_realloc = false; while (printbuf->free < n) { printbuf->size += 10 * 1024; printbuf->free += 10 * 1024; need_realloc = true; } if (need_realloc) { printbuf->buffer = realloc(printbuf->buffer, printbuf->size); if (!printbuf->buffer) leave_ncurses("out of memory while serialize csv output\n"); } memset(printbuf->buffer + printbuf->used, c, n); printbuf->used += n; printbuf->free -= n; printbuf->free -= n; } static void pb_print_vertical_header(PrintbufType *printbuf, PrintDataDesc *pdesc, PrintConfigType *pconfig, char pos) { int border = pconfig->border; bool double_header = pconfig->double_header; char linestyle = pconfig->linestyle; const char *lhchr; /* left header char */ const char *mhchr; /* middle header char */ const char *rhchr; /* right header char */ const char *hhchr; /* horizont header char */ int i; /* leave fast when there is nothing to work */ if ((border == 0 || border == 1) && (pos != 'm')) return; if (linestyle == 'a') { if (pos == 'm' &&double_header) { lhchr = ":"; mhchr = ":"; rhchr = ":"; hhchr = "="; } else { lhchr = "+"; mhchr = "+"; rhchr = "+"; hhchr = "-"; } } else { /* linestyle = 'u' */ if (pos == 'm') { if (double_header) { lhchr = "\342\225\236"; /* ╞ */ mhchr = "\342\225\252"; /* ╪ */ rhchr = "\342\225\241"; /* ╡ */ hhchr = "\342\225\220"; /* ═ */ } else { lhchr = "\342\224\234"; /* ├ */ mhchr = "\342\224\274"; /* ┼ */ rhchr = "\342\224\244"; /* ┤ */ hhchr = "\342\224\200"; /* ─ */ } } else if (pos == 't') { lhchr = "\342\224\214"; /* ┌ */ mhchr = "\342\224\254"; /* ┬ */ rhchr = "\342\224\220"; /* ┐ */ hhchr = "\342\224\200"; /* ─ */ } else { /* pos == 'b' */ lhchr = "\342\224\224"; /* └ */ mhchr = "\342\224\264"; /* ┴ */ rhchr = "\342\224\230"; /* ┘ */ hhchr = "\342\224\200"; /* ─ */ } } if (border == 2) { pb_writes(printbuf, lhchr); pb_writes(printbuf, hhchr); } else if (border == 1) { pb_writes(printbuf, hhchr); } for (i = 0; i < pdesc->nfields; i++) { if (i > 0) { if (border == 0) { pb_write(printbuf, " ", 1); } else { pb_writes(printbuf, hhchr); pb_writes(printbuf, mhchr); pb_writes(printbuf, hhchr); } } pb_writes_repeat(printbuf, pdesc->widths[i], hhchr); } if (border == 2) { pb_writes(printbuf, hhchr); pb_writes(printbuf, rhchr); } else if (border == 1) { pb_writes(printbuf, hhchr); } else if (border == 0 && pdesc->multilines[pdesc->nfields - 1]) { pb_write(printbuf, " ", 1); } pb_flush_line(printbuf); } /* * Header detection - simple heuristic, when first row has all text fields * and second rows has any numeric field, then csv has header. */ static bool is_header(RowBucketType *rb) { RowType *row; int i; if (rb->nrows < 2) return false; row = rb->rows[0]; for (i = 0; i < row->nfields; i++) { if (row->fields[i][0] == '\0') return false; if (isdigit((row->fields[i])[0])) return false; } row = rb->rows[1]; for (i = 0; i < row->nfields; i++) { if (row->fields[i][0] == '\0') return true; if (isdigit((row->fields[i])[0])) return true; } return false; } static char * pb_put_line(char *str, bool multiline, PrintbufType *printbuf) { char *nextline = NULL; if (multiline) { char *ptr = str; int size = 0; int chrl; while (*ptr) { if (*ptr == '\n') { nextline = ptr + 1; break; } chrl = printbuf->force8bit ? 1 : utf8charlen(*ptr); size += chrl; ptr += chrl; } pb_write(printbuf, str, size); } else pb_puts(printbuf, str); return nextline; } /* * Print formatted data loaded inside RowBuckets */ static void pb_print_rowbuckets(PrintbufType *printbuf, RowBucketType *rb, PrintConfigType *pconfig, PrintDataDesc *pdesc, char *title) { bool is_last_column_multiline = pdesc->multilines[pdesc->nfields - 1]; int last_column_num = pdesc->nfields - 1; int printed_rows = 0; char linestyle = pconfig->linestyle; int border = pconfig->border; char buffer[20]; printbuf->printed_headline = false; printbuf->flushed_rows = 0; printbuf->maxbytes = 0; if (title) { pb_puts(printbuf, title); pb_flush_line(printbuf); } pb_print_vertical_header(printbuf, pdesc, pconfig, 't'); while (rb) { int i; for (i = 0; i < rb->nrows; i++) { int j; bool isheader = false; RowType *row; bool free_row; bool more_lines = true; bool multiline = rb->multilines[i]; /* skip broken rows */ if (pconfig->ignore_short_rows && rb->rows[i]->nfields != pdesc->nfields) continue; /* * For multilines we can modify pointers so do copy now */ if (multiline) { RowType *source = rb->rows[i]; int size; size = offsetof(RowType, fields) + (source->nfields * sizeof(char*)); row = smalloc(size, "RowType"); memcpy(row, source, size); free_row = true; } else { row = rb->rows[i]; free_row = false; } while (more_lines) { more_lines = false; if (border == 2) { if (linestyle == 'a') pb_write(printbuf, "| ", 2); else pb_write(printbuf, "\342\224\202 ", 4); } else if (border == 1) pb_write(printbuf, " ", 1); isheader = printed_rows == 0 ? pdesc->has_header : false; for (j = 0; j < row->nfields; j++) { int width; int spaces; char *field; bool _more_lines = false; if (j > 0) { if (border != 0) { if (linestyle == 'a') pb_write(printbuf, "| ", 2); else pb_write(printbuf, "\342\224\202 ", 4); } } field = row->fields[j]; if (field && *field != '\0') { bool left_align = pdesc->types[j] != 'd'; if (printbuf->force8bit) { if (multiline) { char *ptr = field; width = 0; while (*ptr) { if (*ptr++ == '\n') { more_lines |= true; break; } width += 1; } } else width = strlen(field); } else { if (multiline) { width = utf_string_dsplen_multiline(field, SIZE_MAX, &_more_lines, true, NULL, NULL); more_lines |= _more_lines; } else width = utf_string_dsplen(field, SIZE_MAX); } spaces = pdesc->widths[j] - width; /* * The display width can be canculated badly when labels or * displayed string has some special or invisible chars. Here * is simple ugly fix - the number of spaces cannot be negative. */ if (spaces < 0) spaces = 0; /* left spaces */ if (isheader) pb_putc_repeat(printbuf, spaces / 2, ' '); else if (!left_align) pb_putc_repeat(printbuf, spaces, ' '); if (multiline) row->fields[j] = pb_put_line(row->fields[j], multiline, printbuf); else (void) pb_put_line(row->fields[j], multiline, printbuf); /* right spaces */ if (isheader) pb_putc_repeat(printbuf, spaces - (spaces / 2), ' '); else if (left_align) pb_putc_repeat(printbuf, spaces, ' '); } else pb_putc_repeat(printbuf, pdesc->widths[j], ' '); if (_more_lines) { if (linestyle == 'a') pb_putc(printbuf, '+'); else pb_write(printbuf, "\342\206\265", 3); } else { if (border != 0 || j < last_column_num || is_last_column_multiline) pb_putc(printbuf, ' '); } } for (j = row->nfields; j < pdesc->nfields; j++) { bool addspace; if (j > 0) { if (border != 0) { if (linestyle == 'a') pb_write(printbuf, "| ", 2); else pb_write(printbuf, "\342\224\202 ", 4); } } addspace = border != 0 || j < last_column_num || is_last_column_multiline; pb_putc_repeat(printbuf, pdesc->widths[j] + (addspace ? 1 : 0), ' '); } if (border == 2) { if (linestyle == 'a') pb_write(printbuf, "|", 2); else pb_write(printbuf, "\342\224\202", 3); } pb_flush_line(printbuf); if (isheader) { pb_print_vertical_header(printbuf, pdesc, pconfig, 'm'); printbuf->printed_headline = true; } printed_rows += 1; } if (free_row) free(row); } rb = rb->next_bucket; } pb_print_vertical_header(printbuf, pdesc, pconfig, 'b'); snprintf(buffer, 20, "(%d rows)", printed_rows - (printbuf->printed_headline ? 1 : 0)); pb_puts(printbuf, buffer); pb_flush_line(printbuf); } /* * Try to detect column type and prepare all data necessary for printing */ static void prepare_pdesc(RowBucketType *rb, LinebufType *linebuf, PrintDataDesc *pdesc, PrintConfigType *pconfig) { int i; /* copy data from linebuf */ pdesc->nfields = linebuf->maxfields; for (i = 0; i < pdesc->nfields; i++) { pdesc->widths[i] = linebuf->widths[i]; pdesc->multilines[i] = linebuf->multilines[i]; } if (pconfig->header_mode == 'a') pdesc->has_header = is_header(rb); else pdesc->has_header = pconfig->header_mode == '+'; /* try to detect types from numbers of digits */ for (i = 0; i < pdesc->nfields; i++) { if ((linebuf->tsizes[i] == 0 && linebuf->digits[i] > 0) || (linebuf->firstdigit[i] > 0 && linebuf->processed - 1 == 1)) pdesc->types[i] = 'd'; else if ((((double) linebuf->firstdigit[i] / (double) (linebuf->processed - 1)) > 0.8) && (((double) linebuf->digits[i] / (double) linebuf->tsizes[i]) > 0.5)) pdesc->types[i] = 'd'; else pdesc->types[i] = 'a'; } } /* * Save append one char to linebuffer */ inline static void append_char(LinebufType *linebuf, char c) { if (linebuf->used >= linebuf->size) { linebuf->size += linebuf->size < (10 * 1024) ? linebuf->size : (10 * 1024); linebuf->buffer = realloc(linebuf->buffer, linebuf->size); if (!linebuf->buffer) leave_ncurses("out of memory while read csv or tsv data\n"); } linebuf->buffer[linebuf->used++] = c; } /* * Save string to linebuffer */ inline static void append_str(LinebufType *linebuf, char *str) { int l = strlen(str); if (linebuf->used + l >= linebuf->size) { linebuf->size += linebuf->size < (10 * 1024) ? linebuf->size : (10 * 1024); linebuf->buffer = realloc(linebuf->buffer, linebuf->size); if (!linebuf->buffer) leave_ncurses("out of memory while read csv or tsv data\n"); } while (*str) linebuf->buffer[linebuf->used++] = *str++; } /* * Ensure dynamicaly allocated structure is valid every time. */ static inline RowBucketType * prepare_RowBucket(RowBucketType *rb) { /* move row from linebuf to rowbucket */ if (rb->nrows >= 1000) { RowBucketType *new = smalloc(sizeof(RowBucketType), "import csv data"); new->nrows = 0; new->allocated = true; new->next_bucket = NULL; rb->next_bucket = new; rb = new; } return rb; } /* * Calculate width of columns */ static void postprocess_fields(int nfields, RowType *row, LinebufType *linebuf, bool force8bit, bool ignore_short_rows, bool reduced_sizes, /* the doesn't calculate ending zero */ bool *is_multiline_row) { bool malformed; int width; int i; if (ignore_short_rows) malformed = linebuf->maxfields > 0 && nfields != linebuf->maxfields; else malformed = false; *is_multiline_row = false; for (i = 0; i < nfields; i++) { long int digits = 0; long int total = 0; bool multiline; if (force8bit) { int cw = 0; char *ptr = row->fields[i]; width = 0; while (*ptr) { if (isdigit(*ptr)) digits += 1; else if (*ptr != '-' && *ptr != ' ' && *ptr != ':') total += 1; if (*ptr++ == '\n') { multiline = true; width = cw > width ? cw : width; cw = 0; } else cw++; } width = cw > width ? cw : width; } else width = utf_string_dsplen_multiline(row->fields[i], linebuf->sizes[i] - (reduced_sizes ? 0 : 1), &multiline, false, &digits, &total); /* skip first possible header row */ if (linebuf->processed > 0) { linebuf->tsizes[i] += total; linebuf->digits[i] += digits; if (isdigit(*row->fields[i])) linebuf->firstdigit[i]++; } if (!malformed) { if (width > linebuf->widths[i]) linebuf->widths[i] = width; *is_multiline_row |= multiline; linebuf->multilines[i] |= multiline; } } if (nfields > linebuf->maxfields) linebuf->maxfields = nfields; if (!malformed) linebuf->processed += 1; } /* * Appends fields to rows without complete set of fields. * New fields holds null str. */ static void postprocess_rows(RowBucketType *rb, LinebufType *linebuf, bool force8bit, char *nullstr) { int nullstr_size = strlen(nullstr); int nullstr_width = force8bit ? strlen(nullstr) : utf_string_dsplen(nullstr, strlen(nullstr)); while (rb) { int i; for (i = 0; i < rb->nrows; i++) { RowType *oldrow = rb->rows[i]; if (linebuf->maxfields > 0 && linebuf->maxfields > oldrow->nfields) { int j; int newsize = 0; char *locbuf; RowType *newrow; /* calculate rows size and check width for new columns */ for (j = 0; j < linebuf->maxfields; j++) { if (j < oldrow->nfields) { char *str = oldrow->fields[j]; newsize += str ? strlen(str) + 1 : 0; } else { newsize += nullstr_size + 1; if (linebuf->widths[j] < nullstr_width) linebuf->widths[j] = nullstr_width; } } locbuf = smalloc(newsize, "postprocess csv or tsv data"); newrow = smalloc(offsetof(RowType, fields) + (linebuf->maxfields * sizeof(char*)), "postprocess csv or tsv data"); newrow->nfields = linebuf->maxfields; for (j = 0; j < newrow->nfields; j++) { if (j < oldrow->nfields) { if (oldrow->fields[j]) { strcpy(locbuf, oldrow->fields[j]); newrow->fields[j] = locbuf; locbuf += strlen(newrow->fields[j]) + 1; } else newrow->fields[j] = NULL; } else { strcpy(locbuf, nullstr); newrow->fields[j] = locbuf; locbuf += nullstr_size + 1; } } if (oldrow->nfields > 0) free(oldrow->fields[0]); free(oldrow); rb->rows[i] = newrow; } } rb = rb->next_bucket; } } /* * Read tsv format from ifile */ static void read_tsv(RowBucketType *rb, LinebufType *linebuf, bool force8bit, FILE *ifile, bool ignore_short_rows, char *nullstr) { bool closed = false; int size = 0; int nfields = 0; int c; int nullstr_size = strlen(nullstr); c = fgetc(ifile); do { if (c == '\r') goto next_char; if (c != EOF && c != '\n') { bool backslash = false; bool translated = false; if (c == '\\') { backslash = true; c = fgetc(ifile); if (c != EOF) { /* NULL */ if (c == 'N') { append_str(linebuf, nullstr); size += nullstr_size; goto next_char; } else if (c == 't') { c = '\t'; translated = true; } else if (c == 'n') { c = '\n'; translated = true; } else if (c == '\\') { translated = true; } } } if (c != EOF) { if (c == '\t' && !translated) { append_char(linebuf, '\0'); linebuf->sizes[nfields++] = size + 1; size = 0; } else { if (backslash && !translated) { append_char(linebuf, '\\'); size +=1; } append_char(linebuf, c); size += 1; } } } else { int i; if (linebuf->used > 0) { char *locbuf; RowType *row; bool multiline = false; append_char(linebuf, '\0'); linebuf->sizes[nfields++] = size + 1; rb = prepare_RowBucket(rb); locbuf = smalloc(linebuf->used, "import csv data"); memcpy(locbuf, linebuf->buffer, linebuf->used); row = smalloc(offsetof(RowType, fields) + (nfields * sizeof(char*)), "import csv data"); row->nfields = nfields; for (i = 0; i < nfields; i++) { row->fields[i] = locbuf; locbuf += linebuf->sizes[i]; } postprocess_fields(nfields, row, linebuf, force8bit, ignore_short_rows, false, &multiline); rb->multilines[rb->nrows] = multiline; rb->rows[rb->nrows++] = row; } nfields = 0; linebuf->used = 0; size = 0; closed = c == EOF; } next_char: c = fgetc(ifile); } while (!closed); /* append nullstr to missing columns */ if (nullstr_size > 0 && !ignore_short_rows) postprocess_rows(rb, linebuf, force8bit, nullstr); } static void read_csv(RowBucketType *rb, LinebufType *linebuf, char sep, bool force8bit, FILE *ifile, bool ignore_short_rows, char *nullstr) { bool skip_initial = true; bool closed = false; bool found_string = false; int first_nw = 0; int last_nw = 0; int pos = 0; int nfields = 0; int instr = false; /* true when csv string is processed */ int c; int nullstr_size = strlen(nullstr); c = fgetc(ifile); do { /* ignore ^M */ if (c == '\r') goto next_char; if (c != EOF && (c != '\n' || instr)) { int l; if (skip_initial) { if (c == ' ') goto next_char; skip_initial = false; last_nw = first_nw; } if (c == '"') { if (instr) { int c2 = fgetc(ifile); if (c2 == '"') { /* double double quotes */ append_char(linebuf, c); pos = pos + 1; } else { /* start of end of string */ ungetc(c2, ifile); instr = false; } } else { instr = true; found_string = true; } } else { append_char(linebuf, c); pos = pos + 1; } if (sep == -1 && !instr) { /* * Automatic separator detection - now it is very simple, first win. * Can be enhanced in future by more sofisticated mechanism. */ if (c == ',') sep = ','; else if (c == ';') sep = ';'; else if (c == '|') sep = '|'; } if (sep != -1 && c == sep && !instr) { if (nfields >= 1024) { fprintf(stderr, "too much columns"); exit(EXIT_FAILURE); } if (skip_initial) { fprintf(stderr, "internal error - unexpected value of variable: \"skip_initial\"\n"); exit(EXIT_FAILURE); } if (last_nw - first_nw > 0 || found_string || nullstr_size == 0) { linebuf->sizes[nfields] = last_nw - first_nw; linebuf->starts[nfields++] = first_nw; } else { /* append null string */ linebuf->sizes[nfields] = nullstr_size; linebuf->starts[nfields++] = pos; append_str(linebuf, nullstr); pos += nullstr_size; } skip_initial = true; found_string = false; first_nw = pos; } else if (instr || c != ' ') { last_nw = pos; } l = force8bit ? 1 : utf8charlen(c); if (l > 1) { int i; /* read other chars */ for (i = 1; i < l; i++) { c = fgetc(ifile); if (c == EOF) { log_writeln("unexpected quit, broken unicode char\n"); break; } append_char(linebuf, c); pos = pos + 1; } last_nw = pos; } } else { char *locbuf; RowType *row; int i; int data_size; bool multiline; if (c == '\n') { /* try to process \nEOF as one symbol */ c = fgetc(ifile); if (c != EOF) ungetc(c, ifile); } if (!skip_initial && (last_nw - first_nw > 0 || found_string || nullstr_size == 0)) { linebuf->sizes[nfields] = last_nw - first_nw; linebuf->starts[nfields++] = first_nw; } else if (nullstr_size > 0 && (nfields > 1 || (nfields == 0 && linebuf->maxfields == 1) || (nfields == 0 && linebuf->processed == 0))) { /* append null string */ linebuf->sizes[nfields] = nullstr_size; linebuf->starts[nfields++] = pos; append_str(linebuf, nullstr); pos += nullstr_size; } else { linebuf->sizes[nfields] = 0; linebuf->starts[nfields++] = -1; } if (!linebuf->used) goto next_row; rb = prepare_RowBucket(rb); data_size = 0; for (i = 0; i < nfields; i++) data_size += linebuf->sizes[i] + 1; locbuf = smalloc(data_size, "import csv data"); memset(locbuf, 0, data_size); row = smalloc(offsetof(RowType, fields) + (nfields * sizeof(char*)), "import csv data"); row->nfields = nfields; multiline = false; for (i = 0; i < nfields; i++) { row->fields[i] = locbuf; if (linebuf->sizes[i] > 0) memcpy(locbuf, linebuf->buffer + linebuf->starts[i], linebuf->sizes[i]); locbuf[linebuf->sizes[i]] = '\0'; locbuf += linebuf->sizes[i] + 1; } postprocess_fields(nfields, row, linebuf, force8bit, ignore_short_rows, true, &multiline); rb->multilines[rb->nrows] = multiline; rb->rows[rb->nrows++] = row; next_row: linebuf->used = 0; nfields = 0; linebuf->processed += 1; skip_initial = true; first_nw = 0; last_nw = 0; pos = 0; closed = c == EOF; } next_char: if (!closed) c = fgetc(ifile); } while (!closed); /* append nullstr to missing columns */ if (nullstr_size > 0 && !ignore_short_rows) postprocess_rows(rb, linebuf, force8bit, nullstr); } /* * Read external unformatted data (csv or result of some query * */ bool read_and_format(FILE *fp, Options *opts, DataDesc *desc, const char **err) { LinebufType linebuf; RowBucketType rowbuckets, *rb; PrintConfigType pconfig; PrintbufType printbuf; PrintDataDesc pdesc; memset(desc, 0, sizeof(DataDesc)); if (!opts->query) { if (fp != NULL) { if (opts->pathname != NULL) { char *name; name = basename(opts->pathname); strncpy(desc->filename, name, 64); desc->filename[64] = '\0'; } } else fp = stdin; } desc->title[0] = '\0'; desc->title_rows = 0; desc->border_top_row = -1; desc->border_head_row = -1; desc->border_bottom_row = -1; desc->first_data_row = -1; desc->last_data_row = -1; desc->is_expanded_mode = false; desc->headline_transl = NULL; desc->cranges = NULL; desc->columns = 0; desc->footer_row = -1; desc->alt_footer_row = -1; desc->is_pgcli_fmt = false; desc->namesline = NULL; desc->order_map = NULL; desc->total_rows = 0; desc->multilines_already_tested = false; desc->maxbytes = -1; desc->maxx = -1; memset(&desc->rows, 0, sizeof(LineBuffer)); desc->rows.prev = NULL; memset(&linebuf, 0, sizeof(LinebufType)); linebuf.buffer = malloc(10 * 1024); linebuf.used = 0; linebuf.size = 10 * 1024; pconfig.linestyle = (opts->force_ascii_art || opts->force8bit) ? 'a' : 'u'; pconfig.border = opts->border_type; pconfig.double_header = opts->double_header; pconfig.header_mode = opts->csv_header; pconfig.ignore_short_rows = opts->ignore_short_rows; rowbuckets.allocated = false; if (opts->query) { if (!pg_exec_query(opts, &rowbuckets, &pdesc, err)) return false; } else if (opts->csv_format) { read_csv(&rowbuckets, &linebuf, opts->csv_separator, opts->force8bit, fp, opts->ignore_short_rows, opts->nullstr); prepare_pdesc(&rowbuckets, &linebuf, &pdesc, &pconfig); } else if (opts->tsv_format) { read_tsv(&rowbuckets, &linebuf, opts->force8bit, fp, opts->ignore_short_rows, opts->nullstr); prepare_pdesc(&rowbuckets, &linebuf, &pdesc, &pconfig); } /* reuse allocated memory */ printbuf.buffer = linebuf.buffer; printbuf.size = linebuf.size; printbuf.free = linebuf.size; printbuf.used = 0; printbuf.linebuf = &desc->rows; printbuf.force8bit = opts->force8bit; /* init other printbuf fields */ printbuf.printed_headline = false; printbuf.flushed_rows = 0; printbuf.maxbytes = 0; /* sanitize ptr */ linebuf.buffer = NULL; linebuf.size = 0; pb_print_rowbuckets(&printbuf, &rowbuckets, &pconfig, &pdesc, NULL); desc->border_type = pconfig.border; desc->linestyle = pconfig.linestyle; desc->maxbytes = printbuf.maxbytes; if (printbuf.printed_headline) { int headline_rowno; headline_rowno = pconfig.border == 2 ? 2 : 1; if (desc->rows.nrows > headline_rowno) { desc->namesline = desc->rows.rows[headline_rowno - 1]; desc->border_head_row = headline_rowno; desc->headline = desc->rows.rows[headline_rowno]; desc->headline_size = strlen(desc->headline); if (opts->force8bit) desc->headline_char_size = desc->headline_size; else desc->headline_char_size = desc->maxx = utf_string_dsplen(desc->headline, SIZE_MAX); desc->first_data_row = desc->border_head_row + 1; desc->maxy = printbuf.flushed_rows - 1; desc->total_rows = printbuf.flushed_rows; desc->last_row = desc->total_rows - 1; desc->footer_row = desc->last_row; desc->footer_rows = 1; if (pconfig.border == 2) { desc->border_top_row = 0; desc->last_data_row = desc->total_rows - 2 - 1; desc->border_bottom_row = desc->last_data_row + 1; } else { desc->border_top_row = -1; desc->border_bottom_row = -1; desc->last_data_row = desc->total_rows - 1 - 1; } } } else { char *ptr; int i; /* * When we have not headline. We know structure, so we can * "translate" headline here (generate translated headline). */ desc->columns = linebuf.maxfields; desc->cranges = smalloc(desc->columns * sizeof(CRange), "prepare metadata"); memset(desc->cranges, 0, desc->columns * sizeof(CRange)); desc->headline_transl = smalloc(desc->maxbytes + 3, "prepare metadata"); ptr = desc->headline_transl; if (pconfig.border == 1) *ptr++ = 'd'; else if (pconfig.border == 2) { *ptr++ = 'L'; *ptr++ = 'd'; } for (i = 0; i < linebuf.maxfields; i++) { int width = linebuf.widths[i]; desc->cranges[i].name_pos = -1; desc->cranges[i].name_size = -1; if (i > 0) { if (pconfig.border > 0) { *ptr++ = 'd'; *ptr++ = 'I'; *ptr++ = 'd'; } else *ptr++ = 'I'; } while (width--) { *ptr++ = 'd'; } } if (pconfig.border == 1) *ptr++ = 'd'; else if (pconfig.border == 2) { *ptr++ = 'd'; *ptr++ = 'R'; } *ptr = '\0'; desc->headline_char_size = strlen(desc->headline_transl); desc->cranges[0].xmin = 0; ptr = desc->headline_transl; i = 0; while (*ptr) { if (*ptr++ == 'I') { desc->cranges[i].xmax = ptr - desc->headline_transl - 1; desc->cranges[++i].xmin = ptr - desc->headline_transl - 1; } } desc->cranges[i].xmax = desc->headline_char_size - 1; desc->maxy = printbuf.flushed_rows - 1; desc->total_rows = printbuf.flushed_rows; desc->last_row = desc->total_rows - 1; desc->footer_row = desc->last_row; desc->footer_rows = 1; if (pconfig.border == 2) { desc->first_data_row = 0; desc->border_top_row = 0; desc->border_head_row = 0; desc->last_data_row = desc->total_rows - 2 - 1; desc->border_bottom_row = desc->last_data_row + 1; } else { desc->first_data_row = 0; desc->border_top_row = -1; desc->border_head_row = -1; desc->border_bottom_row = -1; desc->last_data_row = desc->total_rows - 1 - 1; } } free(printbuf.buffer); /* release row buckets */ rb = &rowbuckets; while (rb) { RowBucketType *nextrb; int i; for (i = 0; i < rb->nrows; i++) { RowType *r = rb->rows[i]; /* only first field holds allocated string */ if (r->nfields > 0) free(r->fields[0]); free(r); } nextrb = rb->next_bucket; if (rb->allocated) free(rb); rb = nextrb; } *err = NULL; return true; } pspg-2.6.6/src/print.c000066400000000000000000000666341360716715600146200ustar00rootroot00000000000000/*------------------------------------------------------------------------- * * print.c * visualisation loaded data * * Portions Copyright (c) 2017-2019 Pavel Stehule * * IDENTIFICATION * src/print.c * *------------------------------------------------------------------------- */ #if defined HAVE_NCURSESW_CURSES_H #include #elif defined HAVE_NCURSESW_H #include #elif defined HAVE_NCURSES_CURSES_H #include #elif defined HAVE_NCURSES_H #include #elif defined HAVE_CURSES_H #include #else /* fallback */ #include #endif #include #include #include #include #ifndef GWINSZ_IN_SYS_IOCTL #include #endif #include #include "pspg.h" #include "unicode.h" /* * Flush data to window. When row is a decoration, then * replace ascii decoration by special terminal decoration. */ static void flush_bytes(WINDOW *win, char *rowstr, int bytes, int offsetx, bool is_top_deco, bool is_head_deco, bool is_bottom_deco, DataDesc *desc, ScrDesc *scrdesc, Options *opts) { if ((is_top_deco || is_head_deco || is_bottom_deco) && desc->linestyle == 'a' && opts->force_uniborder) { while (bytes > 0) { int column_format = desc->headline_transl[offsetx]; if (column_format == 'd' && *rowstr == '-') { waddch(win, ACS_HLINE); rowstr += 1; bytes -= 1; offsetx += 1; } else if (column_format == 'L' && (*rowstr == '+' || *rowstr == '|')) { if (is_head_deco) waddch(win, ACS_LTEE); else if (is_top_deco) waddch(win, ACS_ULCORNER); else /* bottom row */ waddch(win, ACS_LLCORNER); rowstr += 1; bytes -= 1; offsetx += 1; } else if (column_format == 'I' && *rowstr == '+') { if (is_head_deco) waddch(win, ACS_PLUS); else if (is_top_deco) waddch(win, ACS_TTEE); else /* bottom row */ waddch(win, ACS_BTEE); rowstr += 1; bytes -= 1; offsetx += 1; } else if (column_format == 'R' && (*rowstr == '+' || *rowstr == '|')) { if (is_head_deco) waddch(win, ACS_RTEE); else if (is_top_deco) waddch(win, ACS_URCORNER); else /* bottom row */ waddch(win, ACS_LRCORNER); rowstr += 1; bytes -= 1; offsetx += 1; } else { int len = opts->force8bit ? 1 : utf8charlen(*rowstr); waddnstr(win, rowstr, len); offsetx += utf_dsplen(rowstr); rowstr +=len; bytes -= len; } } } else { /* * waddnstr is working with utf8 on ncursesw */ waddnstr(win, rowstr, bytes); } } void window_fill(int window_identifier, int srcy, int srcx, /* offset to displayed data */ int cursor_row, /* row of row cursor */ int vcursor_xmin, /* xmin in display coordinates */ int vcursor_xmax, /* xmax in display coordinates */ DataDesc *desc, ScrDesc *scrdesc, Options *opts) { int maxy, maxx; int row; LineBuffer *lnb = &desc->rows; int lnb_row; attr_t active_attr; attr_t pattern_fix; int srcy_bak = srcy; char *free_row; WINDOW *win; Theme *t; bool is_footer = window_identifier == WINDOW_FOOTER; bool is_fix_rows = window_identifier == WINDOW_LUC || window_identifier == WINDOW_FIX_ROWS; bool is_rownum = window_identifier == WINDOW_ROWNUM; bool is_rownum_luc = window_identifier == WINDOW_ROWNUM_LUC; win = scrdesc->wins[window_identifier]; t = &scrdesc->themes[window_identifier]; pattern_fix = t->found_str_attr & A_UNDERLINE; /* when we want to detect expanded records titles */ if (desc->is_expanded_mode) { scrdesc->first_rec_title_y = -1; scrdesc->last_rec_title_y = -1; } /* fast leaving */ if (win == NULL) return; if (is_rownum_luc) { /* just clean */ werase(win); return; } /* skip first x LineBuffers */ while (srcy > 1000) { lnb = lnb->next; srcy -= 1000; } lnb_row = srcy; row = 0; getmaxyx(win, maxy, maxx); while (row < maxy ) { int bytes; char *ptr; char *rowstr = NULL; bool line_is_valid = false; LineInfo *lineinfo = NULL; bool is_bookmark_row = false; bool is_cursor_row = false; bool is_found_row = false; bool is_pattern_row = false; char buffer[10]; int positions[100][2]; int npositions = 0; is_cursor_row = (!opts->no_cursor && row == cursor_row); if (desc->order_map) { int rowno = row + srcy_bak; if (rowno <= desc->last_row) { MappedLine *mp = &desc->order_map[rowno]; lnb = mp->lnb; lnb_row = mp->lnb_row; rowstr = lnb->rows[lnb_row]; lineinfo = lnb->lineinfo ? &lnb->lineinfo[lnb_row] : NULL; line_is_valid = true; } } else { if (lnb_row == 1000) { lnb = lnb ? lnb->next : NULL; lnb_row = 0; } if (lnb != NULL && lnb_row < lnb->nrows) { rowstr = lnb->rows[lnb_row]; if (lnb->lineinfo != NULL) lineinfo = &lnb->lineinfo[lnb_row]; else lineinfo = NULL; lnb_row += 1; line_is_valid = true; } } /* when rownum is printed, don't process original text */ if (is_rownum && line_is_valid) { int rowno = row + srcy_bak + 1 - desc->first_data_row; snprintf(buffer, sizeof(buffer), "%*d ", maxx - 1, rowno); rowstr = buffer; } is_bookmark_row = (lineinfo != NULL && (lineinfo->mask & LINEINFO_BOOKMARK) != 0) ? true : false; if (!is_fix_rows && *scrdesc->searchterm != '\0' && lnb != NULL && rowstr != NULL && !opts->no_highlight_search) { if (lineinfo == NULL) { int i; lnb->lineinfo = malloc(1000 * sizeof(LineInfo)); if (lnb->lineinfo == NULL) leave_ncurses("out of memory"); memset(lnb->lineinfo, 0, 1000 * sizeof(LineInfo)); for (i = 0; i < lnb->nrows; i++) lnb->lineinfo[i].mask = LINEINFO_UNKNOWN; lineinfo = &lnb->lineinfo[lnb_row - 1]; } if (lineinfo->mask & LINEINFO_UNKNOWN) { const char *str = rowstr; lineinfo->mask ^= LINEINFO_UNKNOWN; lineinfo->mask &= ~(LINEINFO_FOUNDSTR | LINEINFO_FOUNDSTR_MULTI); while (str != NULL) { /* * When we would to ignore case or lower case (in this case, we know, so * pattern has not any upper char, then we have to use slower case insensitive * searching. */ if (opts->ignore_case || (opts->ignore_lower_case && !scrdesc->has_upperchr)) { if (opts->force8bit) str = nstrstr(str, scrdesc->searchterm); else str = utf8_nstrstr(str, scrdesc->searchterm); } else if (opts->ignore_lower_case && scrdesc->has_upperchr) { if (opts->force8bit) str = nstrstr_ignore_lower_case(str, scrdesc->searchterm); else str = utf8_nstrstr_ignore_lower_case(str, scrdesc->searchterm); } else /* we can use case sensitive searching (binary comparation) */ str = strstr(str, scrdesc->searchterm); if (str != NULL) { if (lineinfo->mask & LINEINFO_FOUNDSTR) { /* When we detect multi occurrence, then stop searching */ lineinfo->mask |= LINEINFO_FOUNDSTR_MULTI; break; } else { lineinfo->mask |= LINEINFO_FOUNDSTR; if (opts->force8bit) lineinfo->start_char = str - rowstr; else lineinfo->start_char = utf8len_start_stop(rowstr, str); } str += scrdesc->searchterm_size; } } } } is_pattern_row = (lineinfo != NULL && (lineinfo->mask & LINEINFO_FOUNDSTR) != 0) ? true : false; /* prepare position cache, when first occurrence is visible */ if (lineinfo != NULL && (lineinfo->mask & LINEINFO_FOUNDSTR_MULTI) != 0 && srcx + maxx > lineinfo->start_char && *scrdesc->searchterm != '\0') { const char *str = rowstr; while (str != NULL && npositions < 100) { str = pspg_search(opts, scrdesc, str); if (str != NULL) { positions[npositions][0] = opts->force8bit ? str - rowstr : utf8len_start_stop(rowstr, str); positions[npositions][1] = positions[npositions][0] + scrdesc->searchterm_char_size; /* don't search more if we are over visible part */ if (positions[npositions][1] > srcx + maxx) { npositions += 1; break; } str += scrdesc->searchterm_size; npositions += 1; } } } active_attr = 0; if (is_bookmark_row) { if (!is_footer && !is_rownum) { if (desc->border_type == 2) active_attr = is_cursor_row ? t->cursor_bookmark_attr : t->bookmark_line_attr; else active_attr = is_cursor_row ? t->cursor_bookmark_attr : t->bookmark_data_attr; } else active_attr = is_cursor_row ? t->cursor_bookmark_attr : t->bookmark_data_attr; } /* would not to show pattern colors in rownum window */ else if (is_pattern_row && !is_rownum) { if (!is_footer) { if (desc->border_type == 2) active_attr = is_cursor_row ? t->cursor_line_attr : t->pattern_line_attr; else active_attr = is_cursor_row ? t->cursor_data_attr : t->pattern_data_attr; } else active_attr = is_cursor_row ? t->cursor_data_attr : t->pattern_data_attr; } else { if (!is_footer && !is_rownum) { if (desc->border_type == 2) active_attr = is_cursor_row ? t->cursor_line_attr : t->line_attr; else active_attr = is_cursor_row ? t->cursor_data_attr : t->data_attr; } else active_attr = is_cursor_row ? t->cursor_data_attr : t->data_attr; } wattron(win, active_attr); wmove(win, row++, 0); if (is_rownum) { waddstr(win, rowstr); wattroff(win, active_attr); continue; } if (rowstr != NULL) { int i = 0; int effective_row = row + srcy_bak - 1; /* row was incremented before, should be reduced */ bool fix_line_attr_style; bool is_expand_head; int ei_min, ei_max; int left_spaces; /* aux left spaces */ int saved_pos; bool is_top_deco = false; bool is_head_deco = false; bool is_bottom_deco = false; int trailing_spaces = 0; is_top_deco = effective_row == desc->border_top_row; is_head_deco = effective_row == desc->border_head_row; is_bottom_deco = effective_row == desc->border_bottom_row; is_found_row = scrdesc->found && scrdesc->found_row == effective_row; if (desc->is_expanded_mode) { fix_line_attr_style = effective_row >= desc->border_bottom_row; is_expand_head = is_expanded_header(opts, rowstr, &ei_min, &ei_max); if (is_expand_head) { if (scrdesc->first_rec_title_y == -1) scrdesc->first_rec_title_y = row - 1; else scrdesc->last_rec_title_y = row - 1; } } else { if (!is_footer) { is_top_deco = effective_row == desc->border_top_row; is_head_deco = effective_row == desc->border_head_row; is_bottom_deco = effective_row == desc->border_bottom_row; fix_line_attr_style = is_top_deco || is_head_deco || is_bottom_deco; } else fix_line_attr_style = false; is_expand_head = false; } /* skip first srcx chars */ i = srcx; left_spaces = 0; if (opts->force8bit) { while(i > 0) { if (*rowstr != '\0' && *rowstr != '\n') { i -= 1; rowstr += 1; if (i < 0) left_spaces = -i; } else break; } } else { while(i > 0) { if (*rowstr != '\0' && *rowstr != '\n') { i -= utf_dsplen(rowstr); rowstr += utf8charlen(*rowstr); if (i < 0) left_spaces = -i; } else break; } } /* Fix too hungry cutting when some multichar char is removed */ if (left_spaces > 0) { char *p; int aux_left_spaces = left_spaces; free_row = malloc(left_spaces + strlen(rowstr) + 1); if (!free_row) leave_ncurses("out of memory"); p = free_row; while (aux_left_spaces-- > 0) { *p++ = ' '; } strcpy(p, rowstr); rowstr = free_row; } else free_row = NULL; ptr = rowstr; bytes = 0; i = 0; saved_pos = srcx; /* find length of maxx characters */ if (*ptr != '\0') { while (i < maxx) { bool is_cursor; bool is_cross_cursor = false; bool is_vertical_cursor = false; int pos = (i != -1) ? srcx + i : -1; bool skip_char = false; if (i != -1 && vcursor_xmin <= i && i <= vcursor_xmax) { is_cross_cursor = is_cursor_row; is_cursor = !is_cursor_row && !is_pattern_row; is_vertical_cursor = true; } else { is_cross_cursor = false; is_vertical_cursor = false; is_cursor = is_cursor_row; } if (is_expand_head && !is_pattern_row && !is_bookmark_row) { attr_t new_attr; if (is_cursor) new_attr = pos >= ei_min && pos <= ei_max ? t->cursor_expi_attr : t->cursor_line_attr; else new_attr = pos >= ei_min && pos <= ei_max ? t->expi_attr : t->line_attr; if (new_attr != active_attr) { if (bytes > 0) { waddnstr(win, rowstr, bytes); rowstr += bytes; bytes = 0; saved_pos = pos; } /* disable current style */ wattroff(win, active_attr); /* active new style */ active_attr = new_attr; wattron(win, active_attr); } } else if (!fix_line_attr_style) { attr_t new_attr = active_attr; bool print_acs_vline = false; char column_format; column_format = desc->headline_transl != NULL && pos >= 0 ? desc->headline_transl[pos] : ' '; if (opts->force_uniborder && desc->linestyle == 'a') { if (*(rowstr + left_spaces + bytes) == '|' && (column_format == 'L' || column_format == 'R' || column_format == 'I')) { print_acs_vline = true; } } if (is_cross_cursor) { new_attr = column_format == 'd' ? t->cross_cursor_attr : t->cross_cursor_line_attr; } else if (is_bookmark_row) { if (!is_cursor_row ) new_attr = column_format == 'd' ? t->bookmark_data_attr : t->bookmark_line_attr; else new_attr = t->cursor_bookmark_attr; } else if (is_pattern_row && !is_cursor) { if (is_footer) new_attr = t->pattern_data_attr; else if (is_vertical_cursor) new_attr = column_format == 'd' ? t->pattern_vertical_cursor_attr : t->pattern_vertical_cursor_line_attr; else if (pos < desc->headline_char_size) new_attr = column_format == 'd' ? t->pattern_data_attr : t->pattern_line_attr; if ((new_attr == t->pattern_data_attr || new_attr == t->pattern_vertical_cursor_attr) && pos >= lineinfo->start_char) { if ((lineinfo->mask & LINEINFO_FOUNDSTR_MULTI) != 0) { int j; for (j = 0; j < npositions; j++) { if (pos >= positions[j][0] && pos < positions[j][1]) { new_attr = t->found_str_attr; break; } } } else { if (pos < lineinfo->start_char + scrdesc->searchterm_char_size) new_attr = t->found_str_attr; } } } else if (is_footer) new_attr = is_cursor ? t->cursor_data_attr : t->data_attr; else if (pos < desc->headline_char_size) { if (is_cursor ) new_attr = column_format == 'd' ? t->cursor_data_attr : t->cursor_line_attr; else new_attr = column_format == 'd' ? t->data_attr : t->line_attr; } if (is_cursor || is_cross_cursor) { if (is_found_row && pos >= scrdesc->found_start_x && pos < scrdesc->found_start_x + scrdesc->searchterm_char_size) new_attr = new_attr ^ ( A_REVERSE | pattern_fix ); else if (is_pattern_row && pos >= lineinfo->start_char) { if ((lineinfo->mask & LINEINFO_FOUNDSTR_MULTI) != 0) { int j; for (j = 0; j < npositions; j++) { if (pos >= positions[j][0] && pos < positions[j][1]) { new_attr = t->cursor_pattern_attr; break; } } } else { if (pos < lineinfo->start_char + scrdesc->searchterm_char_size) new_attr = t->cursor_pattern_attr; } } } if (print_acs_vline && bytes > 0) { waddnstr(win, rowstr, bytes); rowstr += bytes; bytes = 0; saved_pos = pos; } if (new_attr != active_attr) { if (bytes > 0) { waddnstr(win, rowstr, bytes); rowstr += bytes; bytes = 0; saved_pos = pos; } /* disable current style */ wattroff(win, active_attr); /* active new style */ active_attr = new_attr; wattron(win, active_attr); } if (print_acs_vline) { waddch(win, ACS_VLINE); bytes = 0; rowstr += 1; /* * because we printed subst char already and we updated rowstr, * we don't would to increase bytes variable later. */ skip_char = true; } } else { if (!is_footer) { int new_attr; if (is_cross_cursor) { new_attr = t->cross_cursor_line_attr; } else if (is_cursor) { new_attr = t->cursor_line_attr; } else { new_attr = t->line_attr; } if (new_attr != active_attr) { if (bytes > 0) { flush_bytes(win, rowstr, bytes, saved_pos, is_top_deco, is_head_deco, is_bottom_deco, desc, scrdesc, opts); rowstr += bytes; bytes = 0; saved_pos = pos; } /* disable current style */ wattroff(win, active_attr); /* active new style */ active_attr = new_attr; wattron(win, active_attr); } } } if (*ptr != '\0') { if (opts->force8bit) { i += 1; ptr += 1; if (!skip_char) bytes += 1; } else { int dsplen = utf_dsplen(ptr); int len = utf8charlen(*ptr); i = dsplen != -1 && i != -1 ? i + dsplen : -1; ptr += len; if (!skip_char) bytes += len; } } else { /* * psql reduces trailing spaces when border is 0 or 1. These spaces * should be printed after content. */ if (is_vertical_cursor && i != -1) { int ts1 = maxx - i + 1; int ts2 = vcursor_xmax - i + 1; trailing_spaces = ts1 < ts2 ? ts1 : ts2; } break; } } /* end while */ } if (bytes > 0) flush_bytes(win, rowstr, bytes, saved_pos, is_top_deco, is_head_deco, is_bottom_deco, desc, scrdesc, opts); /* print trailing spaces necessary for correct vertical cursor */ if (trailing_spaces > 0) { wprintw(win, "%*s", trailing_spaces, ""); i += trailing_spaces; } /* When we don't possition of last char, we can (for cursor draw) use 0 */ i = i != -1 ? i : 0; /* clean other chars on line */ if (i < maxx) wclrtoeol(win); /* draw cursor or bookmark line to screen end of line */ if (i < maxx) { if (is_cursor_row && !is_bookmark_row) mvwchgat(win, row - 1, i, -1, t->cursor_data_attr, PAIR_NUMBER(t->cursor_data_attr), 0); else if (!is_cursor_row && is_bookmark_row) mvwchgat(win, row - 1, i, -1, t->bookmark_data_attr, PAIR_NUMBER(t->bookmark_data_attr), 0); else if (is_cursor_row && is_bookmark_row) mvwchgat(win, row - 1, i, -1, t->cursor_bookmark_attr, PAIR_NUMBER(t->cursor_bookmark_attr), 0); else if (!is_cursor_row && is_pattern_row) mvwchgat(win, row - 1, i, -1, t->pattern_data_attr, PAIR_NUMBER(t->pattern_data_attr), 0); } if (free_row != NULL) { free(free_row); free_row = NULL; } } else { wclrtobot(win); break; } wattroff(win, active_attr); } } #ifdef COLORIZED_NO_ALTERNATE_SCREEN static void ansi_colors(int pairno, short int *fc, short int *bc) { pair_content(pairno, fc, bc); *fc = *fc != -1 ? *fc + 30 : 39; *bc = *bc != -1 ? *bc + 40 : 49; } #endif static char * ansi_attr(attr_t attr) { #ifndef COLORIZED_NO_ALTERNATE_SCREEN return ""; #else static char result[20]; int pairno; short int fc, bc; pairno = PAIR_NUMBER(attr); ansi_colors(pairno, &fc, &bc); if ((attr & A_BOLD) != 0) { snprintf(result, 20, "\e[1;%d;%dm", fc, bc); } else snprintf(result, 20, "\e[0;%d;%dm", fc, bc); return result; #endif } /* * Print data to primary screen without ncurses */ static void draw_rectange(int offsety, int offsetx, /* y, x offset on screen */ int maxy, int maxx, /* size of visible rectangle */ int srcy, int srcx, /* offset to displayed data */ Options *opts, DataDesc *desc, attr_t data_attr, /* colors for data (alphanums) */ attr_t line_attr, /* colors for borders */ attr_t expi_attr, /* colors for expanded headers */ bool clreoln) /* force clear to eoln */ { int row; LineBuffer *lnb = &desc->rows; int lnb_row; attr_t active_attr; int srcy_bak = srcy; /* skip first x LineBuffers */ while (srcy > 1000) { lnb = lnb->next; srcy -= 1000; } lnb_row = srcy; row = 0; if (offsety) printf("\e[%dB", offsety); while (row < maxy) { int bytes; char *ptr; char *rowstr = NULL; if (desc->order_map) { int rowno = row + srcy_bak; if (rowno <= desc->last_row) { MappedLine *mp = &desc->order_map[rowno]; lnb = mp->lnb; lnb_row = mp->lnb_row; rowstr = lnb->rows[lnb_row]; } } else { if (lnb_row == 1000) { lnb = lnb ? lnb->next : NULL; lnb_row = 0; } if (lnb != NULL && lnb_row < lnb->nrows) { rowstr = lnb->rows[lnb_row]; lnb_row += 1; } } active_attr = line_attr; printf("%s", ansi_attr(active_attr)); row += 1; if (rowstr != NULL) { int i; int effective_row = row + srcy_bak - 1; /* row was incremented before, should be reduced */ bool fix_line_attr_style; bool is_expand_head; int ei_min, ei_max; int left_spaces; char *free_row; if (desc->is_expanded_mode) { fix_line_attr_style = effective_row >= desc->border_bottom_row; is_expand_head = is_expanded_header(opts, rowstr, &ei_min, &ei_max); } else { fix_line_attr_style = effective_row == desc->border_top_row || effective_row == desc->border_head_row || effective_row >= desc->border_bottom_row; is_expand_head = false; } if (offsetx != 0) printf("\e[%dC", offsetx); /* skip first srcx chars */ i = srcx; left_spaces = 0; if (opts->force8bit) { while(i > 0) { if (*rowstr != '\0' && *rowstr != '\n') { i -= 1; rowstr += 1; if (i < 0) left_spaces = -i; } else break; } } else { while(i > 0) { if (*rowstr != '\0' && *rowstr != '\n') { i -= utf_dsplen(rowstr); rowstr += utf8charlen(*rowstr); if (i < 0) left_spaces = -i; } else break; } } /* Fix too hungry cutting when some multichar char is removed */ if (left_spaces > 0) { char *p; free_row = malloc(left_spaces + strlen(rowstr) + 1); if (!free_row) { fprintf(stderr, "out of memory"); exit(1); } p = free_row; while (left_spaces-- > 0) { *p++ = ' '; } strcpy(p, rowstr); rowstr = free_row; } else free_row = NULL; ptr = rowstr; bytes = 0; /* find length of maxx characters */ if (*ptr != '\0' && *ptr != '\n') { i = 0; while (i < maxx) { int pos = srcx + i; if (is_expand_head) { attr_t new_attr; new_attr = pos >= ei_min && pos <= ei_max ? expi_attr : line_attr; if (new_attr != active_attr) { if (bytes > 0) { printf("%.*s", bytes, rowstr); rowstr += bytes; bytes = 0; } /* active new style */ active_attr = new_attr; printf("%s", ansi_attr(active_attr)); } } else if (!fix_line_attr_style && desc->headline_transl != NULL) { if (pos < desc->headline_char_size) { attr_t new_attr; new_attr = desc->headline_transl[pos] == 'd' ? data_attr : line_attr; if (new_attr != active_attr) { if (bytes > 0) { //waddnstr(win, rowstr, bytes); printf("%.*s", bytes, rowstr); rowstr += bytes; bytes = 0; } /* active new style */ active_attr = new_attr; printf("%s", ansi_attr(active_attr)); } } } if (*ptr != '\0' && *ptr != '\n') { int len = opts->force8bit ? 1 : utf8charlen(*ptr); i += opts->force8bit ? 1 : utf_dsplen(ptr); ptr += len; bytes += len; } else break; } } if (bytes > 0) { printf("%.*s", bytes, rowstr); if (clreoln) printf("\e[K"); printf("\n"); } if (free_row != NULL) { free(free_row); free_row = NULL; } } else break; } } void draw_data(Options *opts, ScrDesc *scrdesc, DataDesc *desc, int first_data_row, int first_row, int cursor_col, int footer_cursor_col, int fix_rows_offset) { struct winsize size; int i; if (ioctl(0, TIOCGWINSZ, (char *) &size) >= 0) { int expected_rows = min_int(size.ws_row - 1 - scrdesc->top_bar_rows, desc->last_row + 1); for (i = 0; i < expected_rows; i++) printf("\eD"); /* Go wit cursor to up */ printf("\e[%dA", expected_rows); /* now, the screen can be different, due prompt */ scrdesc->rows_rows = min_int(scrdesc->rows_rows, expected_rows - scrdesc->fix_rows_rows); /* * Save cursor - Attention, there are a Fedora29 bug, and it doesn't work */ printf("\e7"); if (scrdesc->fix_cols_cols > 0) { draw_rectange(scrdesc->fix_rows_rows, 0, scrdesc->rows_rows, scrdesc->fix_cols_cols, first_data_row + first_row - fix_rows_offset, 0, opts, desc, COLOR_PAIR(4) | A_BOLD, 0, COLOR_PAIR(8) | A_BOLD, false); } if (scrdesc->fix_rows_rows > 0 ) { /* Go to saved position */ printf("\e8\e7"); draw_rectange(0, scrdesc->fix_cols_cols, scrdesc->fix_rows_rows, size.ws_col - scrdesc->fix_cols_cols, desc->title_rows + fix_rows_offset, scrdesc->fix_cols_cols + cursor_col, opts, desc, COLOR_PAIR(4) | A_BOLD, 0, COLOR_PAIR(8) | A_BOLD, true); } if (scrdesc->fix_rows_rows > 0 && scrdesc->fix_cols_cols > 0) { /* Go to saved position */ printf("\e8\e7"); draw_rectange(0, 0, scrdesc->fix_rows_rows, scrdesc->fix_cols_cols, desc->title_rows + fix_rows_offset, 0, opts, desc, COLOR_PAIR(4) | A_BOLD, 0, COLOR_PAIR(8) | A_BOLD, false); } if (scrdesc->rows_rows > 0) { /* Go to saved position */ printf("\e8\e7"); draw_rectange(scrdesc->fix_rows_rows, scrdesc->fix_cols_cols, scrdesc->rows_rows, size.ws_col - scrdesc->fix_cols_cols, first_data_row + first_row - fix_rows_offset, scrdesc->fix_cols_cols + cursor_col, opts, desc, opts->theme == 2 ? 0 | A_BOLD : 0, opts->theme == 2 && (desc->headline_transl == NULL) ? A_BOLD : 0, COLOR_PAIR(8) | A_BOLD, true); } if (w_footer(scrdesc) != NULL) { /* Go to saved position */ printf("\e8\e7"); draw_rectange(scrdesc->fix_rows_rows + scrdesc->rows_rows, 0, scrdesc->footer_rows, scrdesc->maxx, first_data_row + first_row + scrdesc->rows_rows - fix_rows_offset, footer_cursor_col, opts, desc, COLOR_PAIR(9), 0, 0, true); } /* reset */ printf("\e[0m\r"); } } pspg-2.6.6/src/pspg.c000066400000000000000000004724601360716715600144330ustar00rootroot00000000000000/*------------------------------------------------------------------------- * * pspg.c * a terminal pager designed for usage from psql * * Portions Copyright (c) 2017-2019 Pavel Stehule * * IDENTIFICATION * src/pspg.c * *------------------------------------------------------------------------- */ #if defined HAVE_NCURSESW_CURSES_H #include #elif defined HAVE_NCURSESW_H #include #elif defined HAVE_NCURSES_CURSES_H #include #elif defined HAVE_NCURSES_H #include #elif defined HAVE_CURSES_H #include #else /* fallback */ #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef GWINSZ_IN_SYS_IOCTL #include #endif #include #include #include "commands.h" #include "config.h" #include "pspg.h" #include "themes.h" #include "unicode.h" #ifdef DEBUG_PIPE /* used for mallinfo */ #include #endif #ifdef COMPILE_MENU #include "st_menu.h" #endif #ifdef HAVE_LIBREADLINE #if defined(HAVE_READLINE_READLINE_H) #include #elif defined(HAVE_READLINE_H) #include #endif #if RL_VERSION_MAJOR < 6 #define rl_display_prompt rl_prompt #endif #endif #ifdef HAVE_READLINE_HISTORY #if defined(HAVE_READLINE_HISTORY_H) #include #elif defined(HAVE_HISTORY_H) #include #endif #endif #define PSPG_VERSION "2.6.6" /* GNU Hurd does not define MAXPATHLEN */ #ifndef MAXPATHLEN #define MAXPATHLEN 4096 #endif #ifdef HAVE_LIBREADLINE static char readline_buffer[1024]; static bool got_readline_string; static bool force8bit; static unsigned char input; static bool input_avail = false; static WINDOW *g_bottom_bar; static attr_t input_attr; #endif static bool handle_sigint = false; static char last_row_search[256]; static char last_col_search[256]; static char last_line[256]; static char last_path[1025]; #ifdef HAVE_READLINE_HISTORY static char last_history[256]; #endif #define UNUSED(expr) do { (void)(expr); } while (0) #define USE_EXTENDED_NAMES #ifdef DEBUG_PIPE FILE *debug_pipe = NULL; int debug_eventno = 0; #endif static bool press_alt = false; static bool got_sigint = false; static MEVENT event; static long last_watch_ms = 0; static time_t last_watch_sec = 0; /* time when we did last refresh */ static bool paused = false; /* true, when watch mode is paused */ static const char *err = NULL; static bool active_ncurses = false; static int number_width(int num); static int get_event(MEVENT *mevent, bool *alt, bool *sigint, bool *timeout, int timeoutval); static char * tilde(char *path); static void print_log_prefix(FILE *logfile); FILE *logfile = NULL; static void SigintHandler(int sig_num) { signal(SIGINT, SigintHandler); handle_sigint = true; } int min_int(int a, int b) { if (a < b) return a; else return b; } /* * Prints error message and stops application */ void leave_ncurses(const char *str) { if (active_ncurses) endwin(); fprintf(stderr, "%s\n", str); if (logfile) { print_log_prefix(logfile); fprintf(logfile, "leave ncurses: %s\n", str); } exit(EXIT_FAILURE); } void leave_ncurses2(const char *fmt, const char *str) { if (active_ncurses) endwin(); fprintf(stderr, fmt, str); if (logfile) { print_log_prefix(logfile); fprintf(logfile, fmt, str); } exit(EXIT_FAILURE); } inline void log_writeln(const char *str) { if (logfile) { print_log_prefix(logfile); fprintf(logfile, "%s\n", str); } } static void current_time(time_t *sec, long *ms) { struct timespec spec; clock_gettime(CLOCK_MONOTONIC, &spec); *ms = roundl(spec.tv_nsec / 1.0e6); *sec = spec.tv_sec; } #define time_diff(s1, ms1, s2, ms2) ((s1 - s2) * 1000 + ms1 - ms2) #ifdef DEBUG_PIPE static void print_duration(time_t start_sec, long start_ms, const char *label) { time_t end_sec; long end_ms; current_time(&end_sec, &end_ms); fprintf(debug_pipe, "duration of \"%s\" is %ld ms\n", label, time_diff(end_sec, end_ms, start_sec, start_ms)); } #endif /* * Case insensitive string comparation. */ static bool nstreq(const char *str1, const char *str2) { while (*str1 != '\0') { if (*str2 == '\0') return false; if (toupper(*str1++) != toupper(*str2++)) return false; } return *str2 == '\0'; } /* * special case insensitive searching routines */ const char * nstrstr(const char *haystack, const char *needle) { const char *haystack_cur, *needle_cur, *needle_prev; int f1 = 0, f2 = 0; needle_cur = needle; needle_prev = NULL; haystack_cur = haystack; while (*needle_cur != '\0') { if (*haystack_cur == '\0') return NULL; if (needle_prev != needle_cur) { needle_prev = needle_cur; f1 = toupper(*needle_cur); } f2 = toupper(*haystack_cur); if (f1 == f2) { needle_cur += 1; haystack_cur += 1; } else { needle_cur = needle; haystack_cur = haystack += 1; } } return haystack; } static const char * nstrstr_with_sizes(const char *haystack, const int haystack_size, const char *needle, int needle_size) { const char *haystack_cur, *needle_cur, *needle_prev; const char *haystack_end, *needle_end; int f1 = 0, f2 = 0; needle_cur = needle; needle_prev = NULL; haystack_cur = haystack; haystack_end = haystack + haystack_size; needle_end = needle + needle_size; while (needle_cur < needle_end) { if (haystack_cur == haystack_end) return NULL; if (needle_prev != needle_cur) { needle_prev = needle_cur; f1 = toupper(*needle_cur); } f2 = toupper(*haystack_cur); if (f1 == f2) { needle_cur += 1; haystack_cur += 1; } else { needle_cur = needle; haystack_cur = haystack += 1; } } return haystack; } /* * Special string searching, lower chars are case insensitive, * upper chars are case sensitive. */ const char * nstrstr_ignore_lower_case(const char *haystack, const char *needle) { const char *haystack_cur, *needle_cur, *needle_prev; int f1 = 0; bool eq; needle_cur = needle; needle_prev = NULL; haystack_cur = haystack; while (*needle_cur != '\0') { bool needle_char_is_upper = false; /* be compiler quiet */ if (*haystack_cur == '\0') return NULL; if (needle_prev != needle_cur) { needle_prev = needle_cur; needle_char_is_upper = isupper(*needle_cur); f1 = toupper(*needle_cur); } if (needle_char_is_upper) { /* case sensitive */ eq = *haystack_cur == *needle_cur; } else { /* case insensitive */ eq = f1 == toupper(*haystack_cur); } if (eq) { needle_cur += 1; haystack_cur += 1; } else { needle_cur = needle; haystack_cur = haystack += 1; } } return haystack; } /* * Multiple used block - searching in string based on configuration */ const char * pspg_search(Options *opts, ScrDesc *scrdesc, const char *str) { bool ignore_case = opts->ignore_case; bool ignore_lower_case = opts->ignore_lower_case; bool force8bit = opts->force8bit; bool has_upperchr = scrdesc->has_upperchr; const char *searchterm = scrdesc->searchterm; const char *result; if (ignore_case || (ignore_lower_case && !has_upperchr)) { result = force8bit ? nstrstr(str, searchterm) : utf8_nstrstr(str, searchterm); } else if (ignore_lower_case && has_upperchr) { result = force8bit ? nstrstr_ignore_lower_case(str, searchterm) : utf8_nstrstr_ignore_lower_case(str, searchterm); } else result = strstr(str, searchterm); return result; } /* * Translate from UTF8 to semantic characters. */ static bool translate_headline(Options *opts, DataDesc *desc) { char *srcptr; char *destptr; char *last_black_char = NULL; bool broken_format = false; int processed_chars = 0; bool is_expanded_info = false; bool force8bit = opts->force8bit; srcptr = desc->headline; destptr = malloc(desc->headline_size + 2); if (!destptr) { fprintf(stderr, "out of memory\n"); exit(EXIT_FAILURE); } memset(destptr, 0, desc->headline_size + 2); desc->headline_transl = destptr; desc->linestyle = 'a'; desc->border_type = 0; desc->expanded_info_minx = -1; while (*srcptr != '\0' && *srcptr != '\n' && *srcptr != '\r') { /* only spaces can be after known right border */ if (last_black_char != NULL && *last_black_char == 'R') { if (*srcptr != ' ') { broken_format = true; break; } } if (*srcptr != ' ') last_black_char = destptr; if (desc->is_expanded_mode && *srcptr == '[') { if (desc->expanded_info_minx != -1) { broken_format = true; break; } /* entry to expanded info mode */ is_expanded_info = true; desc->expanded_info_minx = processed_chars; *destptr++ = 'd'; srcptr += force8bit ? 1 : utf8charlen(*srcptr); } else if (is_expanded_info) { if (*srcptr == ']') { is_expanded_info = false; } *destptr++ = 'd'; srcptr += force8bit ? 1 : utf8charlen(*srcptr); } else if (strncmp(srcptr, "\342\224\214", 3) == 0 || /* ┌ */ strncmp(srcptr, "\342\225\224", 3) == 0) /* ╔ */ { /* should be expanded mode */ if (processed_chars > 0 || !desc->is_expanded_mode) { broken_format = true; break; } desc->linestyle = 'u'; desc->border_type = 2; *destptr++ = 'L'; srcptr += 3; } else if (strncmp(srcptr, "\342\224\220", 3) == 0 || /* ┐ */ strncmp(srcptr, "\342\225\227", 3) == 0) /* ╗ */ { if (desc->linestyle != 'u' || desc->border_type != 2 || !desc->is_expanded_mode) { broken_format = true; break; } *destptr++ = 'R'; srcptr += 3; } else if (strncmp(srcptr, "\342\224\254", 3) == 0 || /* ┬╤ */ strncmp(srcptr, "\342\225\244", 3) == 0 || strncmp(srcptr, "\342\225\245", 3) == 0 || /* ╥╦ */ strncmp(srcptr, "\342\225\246", 3) == 0) { if (desc->linestyle != 'u' || !desc->is_expanded_mode) { broken_format = true; break; } if (desc->border_type == 0) desc->border_type = 1; *destptr++ = 'I'; srcptr += 3; } else if (strncmp(srcptr, "\342\224\234", 3) == 0 || /* ├╟ */ strncmp(srcptr, "\342\225\237", 3) == 0 || strncmp(srcptr, "\342\225\236", 3) == 0 || /* ╞╠ */ strncmp(srcptr, "\342\225\240", 3) == 0) { if (processed_chars > 0) { broken_format = true; break; } desc->linestyle = 'u'; desc->border_type = 2; *destptr++ = 'L'; srcptr += 3; } else if (strncmp(srcptr, "\342\224\244", 3) == 0 || /* ┤╢ */ strncmp(srcptr, "\342\225\242", 3) == 0 || strncmp(srcptr, "\342\225\241", 3) == 0 || /* ╡╣ */ strncmp(srcptr, "\342\225\243", 3) == 0) { if (desc->linestyle != 'u' || desc->border_type != 2) { broken_format = true; break; } *destptr++ = 'R'; srcptr += 3; } else if (strncmp(srcptr, "\342\224\274", 3) == 0 || /* ┼╪ */ strncmp(srcptr, "\342\225\252", 3) == 0 || strncmp(srcptr, "\342\225\253", 3) == 0 || /* ╫╬ */ strncmp(srcptr, "\342\225\254", 3) == 0) { if (desc->linestyle != 'u') { broken_format = true; break; } if (desc->border_type == 0) desc->border_type = 1; *destptr++ = 'I'; srcptr += 3; } else if (strncmp(srcptr, "\342\224\200", 3) == 0 || /* ─ */ strncmp(srcptr, "\342\225\220", 3) == 0) /* ═ */ { if (processed_chars == 0) { desc->linestyle = 'u'; } else if (desc->linestyle != 'u') { broken_format = true; break; } *destptr++ = 'd'; srcptr += 3; } else if (*srcptr == '+') { if (processed_chars == 0) { *destptr++ = 'L'; desc->linestyle = 'a'; desc->border_type = 2; } else { if (desc->linestyle != 'a') { broken_format = true; break; } if (desc->border_type == 0) desc->border_type = 1; *destptr++ = (srcptr[1] == '-') ? 'I' : 'R'; } srcptr += 1; } else if (*srcptr == '-') { if (processed_chars == 0) { desc->linestyle = 'a'; } else if (desc->linestyle != 'a') { broken_format = true; break; } *destptr++ = 'd'; srcptr += 1; } else if (*srcptr == '|') { if (processed_chars == 0 && srcptr[1] == '-') { *destptr++ = 'L'; desc->linestyle = 'a'; desc->border_type = 2; desc->is_pgcli_fmt = true; } else if (processed_chars > 0 && desc->is_pgcli_fmt && srcptr[-1] == '-') { *destptr++ = 'R'; } else { broken_format = true; break; } srcptr += 1; } else if (*srcptr == ' ') { if (desc->border_type != 0) { broken_format = true; break; } *destptr++ = 'I'; srcptr += 1; } else { broken_format = true; break; } processed_chars += 1; } /* should not be - unclosed header */ if (is_expanded_info) broken_format = true; else if (desc->is_expanded_mode && desc->expanded_info_minx == -1) broken_format = true; if (!broken_format) { char *namesline = desc->namesline; char *first_char = NULL; /* first non space char of column name */ int offset; char *ptr; int i; /* Move right corner more right */ if (desc->border_type == 0) { last_black_char[0] = 'd'; last_black_char[1] = 'R'; last_black_char[3] = '\0'; } /* trim ending spaces */ else if (last_black_char != 0) { last_black_char[1] = '\0'; } desc->headline_char_size = strlen(desc->headline_transl); desc->columns = 1; ptr = desc->headline_transl; while (*ptr) { if (*ptr++ == 'I') desc->columns += 1; } desc->cranges = malloc(desc->columns * sizeof(CRange)); if (!desc->cranges) { fprintf(stderr, "out of memory\n"); exit(EXIT_FAILURE); } i = 0; offset = 0; ptr = desc->headline_transl; desc->cranges[0].xmin = 0; desc->cranges[0].name_pos = -1; desc->cranges[0].name_size = -1; while (*ptr) { char *nextchar = NULL; int display_width; if (namesline) { /* invalidate namesline if there are not good enough chars */ if (!*namesline) { namesline = NULL; nextchar = NULL; } else nextchar = namesline + (opts->force8bit ? 1 : utf8charlen(*namesline)); } if (*ptr == 'I') { desc->cranges[i++].xmax = offset; desc->cranges[i].xmin = offset; desc->cranges[i].name_pos = -1; desc->cranges[i].name_size = -1; } else if (*ptr == 'd') { if (namesline && *namesline != ' ') { if (desc->cranges[i].name_pos == -1) { first_char = namesline; desc->cranges[i].name_pos = namesline - desc->namesline; desc->cranges[i].name_size = nextchar - namesline; first_char = namesline; } else desc->cranges[i].name_size = nextchar - first_char; } } /* possibly some chars can hold more display possitions */ if (namesline) { display_width = utf_dsplen(namesline); namesline = nextchar; } else display_width = 1; offset += display_width; ptr += display_width; } desc->cranges[i].xmax = offset - 1; if (!namesline) desc->namesline = NULL; /* * New PostgreSQL system tables contains visible oid columns. I would to * detect this situation and increase by one default freezed columns. So * second column (with name) will be freezed by default too. */ if (desc->namesline && desc->columns >= 2) { if (desc->cranges[0].name_size == 3 && nstrstr_with_sizes(desc->namesline + desc->cranges[0].name_pos, desc->cranges[0].name_size, "oid", 3)) { if (desc->cranges[1].name_size > 4 && nstrstr_with_sizes(desc->namesline + desc->cranges[1].name_pos + desc->cranges[1].name_size - 4, 4, "name", 4)) desc->oid_name_table = true; } } return true; } free(desc->headline_transl); desc->headline_transl = NULL; return false; } /* * Cut text from column and translate it to number. */ static bool cut_text(char *str, int xmin, int xmax, bool border0, bool force8bit, char **result) { #define TEXT_STACK_BUFFER_SIZE 1024 if (str) { char *_str = NULL; char *after_last_nospc = NULL; int pos = 0; int charlen; bool skip_left_spaces = true; while (*str) { charlen = utf8charlen(*str); if (pos > xmin || (border0 && pos >= xmin)) { if (skip_left_spaces) { if (*str == ' ') { pos += 1; str += 1; continue; } /* first nspc char */ skip_left_spaces = false; _str = str; } } if (*str != ' ') after_last_nospc = str + charlen; pos += utf_dsplen(str); str += charlen; if (pos >= xmax) break; } if (_str != NULL) { char buffer[TEXT_STACK_BUFFER_SIZE]; char *dynbuf = NULL; char *cstr = NULL; int size; int dynbuf_size = 0; cstr = strndup(_str, after_last_nospc - _str); if (!cstr) leave_ncurses("out of memory"); if (force8bit) { *result = cstr; return true; } errno = 0; size = strxfrm(buffer, (const char *) cstr, 1024); if (errno != 0) { /* cannot to sort this string */ free(cstr); return false; } if (size > TEXT_STACK_BUFFER_SIZE - 1) { while (size > dynbuf_size) { if (dynbuf) free(dynbuf); dynbuf_size = size + 1; dynbuf = malloc(dynbuf_size); if (!dynbuf) leave_ncurses("out of memory"); errno = 0; size = strxfrm(dynbuf, cstr, dynbuf_size); if (errno != 0) { /* cannot to sort this string */ free(cstr); return false; } } } free(cstr); if (!dynbuf) { dynbuf = strdup(buffer); if (!dynbuf) leave_ncurses("out of memory"); } *result = dynbuf; return true; } } *result = NULL; return false; } /* * Try to cut numeric (double) value from row defined by specified xmin, xmax positions. * Units (bytes, kB, MB, GB, TB) are supported. Returns true, when returned value is valid. */ static bool cut_numeric_value(char *str, int xmin, int xmax, double *d, bool border0, bool *isnull, char **nullstr) { #define BUFFER_MAX_SIZE 101 char buffer[BUFFER_MAX_SIZE]; char *buffptr; char *after_last_nospace = NULL; char *first_nospace_nodigit = NULL; char decimal_point = '\0'; bool only_digits = false; bool only_digits_with_point = false; bool skip_initial_spaces = true; int x = 0; long mp = 1; *isnull = false; if (str) { after_last_nospace = buffptr = buffer; memset(buffer, 0, BUFFER_MAX_SIZE); while (*str) { int charlen = utf8charlen(*str); if (x > xmin || (border0 && x >= xmin)) { char c = *str; if (skip_initial_spaces) { if (c == ' ') { x += 1; str += 1; continue; } /* first char should be a digit */ if (!isdigit(c)) { char *_nullstr = *nullstr; int len; char *saved_str = str; after_last_nospace = saved_str; /* * We should to check nullstr if exists, or we should to save * this string as nullstr. */ while (*str) { if (*str != ' ') after_last_nospace = str + charlen; x += utf_dsplen(str); str += charlen; if (x >= xmax) break; if (*str) charlen = utf8charlen(*str); } len = after_last_nospace - saved_str; if (_nullstr) { if (strlen(_nullstr) == len) *isnull = strncmp(_nullstr, saved_str, len) == 0; else *isnull = false; } else { _nullstr = malloc(len + 1); if (!_nullstr) leave_ncurses("out of memory"); memcpy(_nullstr, saved_str, len); _nullstr[len] = '\0'; *isnull = true; *nullstr = _nullstr; } return false; } skip_initial_spaces = false; only_digits = true; } memcpy(buffptr, str, charlen); /* trim from right */ if (c != ' ') { bool only_digits_prev = only_digits; bool only_digits_with_point_prev = only_digits_with_point; after_last_nospace = buffptr + charlen; if (after_last_nospace - buffer > (BUFFER_MAX_SIZE - 1)) { /* too long string - should not be translated to number */ return false; } if (c == '.' || c == ',') { if (only_digits) { only_digits = false; only_digits_with_point = true; decimal_point = c; } else return false; } else if (!isdigit(c)) { only_digits = false; only_digits_with_point = false; } /* Save point of chage between digits and other */ if ((only_digits_prev || only_digits_with_point_prev) && !(only_digits || only_digits_with_point)) { first_nospace_nodigit = buffptr; } } buffptr += charlen; } x += utf_dsplen(str); str += charlen; if (x >= xmax) break; } /* while (*str) */ /* trim spaces from right */ *after_last_nospace = '\0'; if (first_nospace_nodigit) { if (nstreq(first_nospace_nodigit, "bytes")) mp = 1l; else if (nstreq(first_nospace_nodigit, "kB")) mp = 1024l; else if (nstreq(first_nospace_nodigit, "MB")) mp = 1024l * 1024; else if (nstreq(first_nospace_nodigit, "GB")) mp = 1024l * 1024 * 1024; else if (nstreq(first_nospace_nodigit, "TB")) mp = 1024l * 1024 * 1024 * 1024; else /* unknown unit */ return false; *first_nospace_nodigit = '\0'; } if (decimal_point == ',') { char *ptr = buffer; while (*ptr) { if (*ptr == ',') *ptr = '.'; ptr += 1; } } errno = 0; *d = strtod(buffer, NULL); if (errno == 0) { *d = *d * mp; return true; } } return false; } /* * Trim footer rows - We should to trim footer rows and calculate footer_char_size */ static void trim_footer_rows(Options *opts, DataDesc *desc) { if (desc->headline_transl != NULL && desc->footer_row != -1) { LineBuffer *rows = &desc->rows; int rowidx = 0; int rownum; desc->footer_char_size = 0; for (rownum = 0, rowidx = 0; rownum < desc->footer_row; rownum++, rowidx++) { if (rowidx == 1000) { rows = rows->next; rowidx = 0; } } while (rows != NULL && rowidx < rows->nrows) { char *line; char *endptr; int len; if (rowidx == 1000) { rows = rows->next; rowidx = 0; continue; } line = rows->rows[rowidx++]; endptr = line + strlen(line) - 1; while (endptr > line) { if (*endptr != ' ') { endptr[1] = '\0'; break; } endptr -= 1; } len = opts->force8bit ? strlen(line) : utf8len(line); if (len > desc->footer_char_size) desc->footer_char_size = len; } } else desc->footer_char_size = desc->maxx; } /* * Returns true when char is left upper corner */ static bool isTopLeftChar(char *str) { const char *u1 = "\342\224\214"; const char *u2 = "\342\225\224"; if (str[0] == '+') return true; if (strncmp(str, u1, 3) == 0) return true; if (strncmp(str, u2, 3) == 0) return true; return false; } /* * Returns true when char is top left header char */ static bool isHeadLeftChar(char *str) { const char *u1 = "\342\224\200"; const char *u2 = "\342\225\220"; const char *u3 = "\342\225\236"; const char *u4 = "\342\224\234"; const char *u5 = "\342\225\240"; const char *u6 = "\342\225\237"; /* ascii */ if ((str[0] == '+' || str[0] == '-') && str[1] == '-') return true; /* pgcli fmt */ if (str[0] == '|' && str[1] == '-') return true; /* expanded border 1 */ if (str[0] == '-' && str[1] == '[') return true; if (strncmp(str, u1, 3) == 0) return true; if (strncmp(str, u2, 3) == 0) return true; if (strncmp(str, u3, 3) == 0) return true; if (strncmp(str, u4, 3) == 0) return true; if (strncmp(str, u5, 3) == 0) return true; if (strncmp(str, u6, 3) == 0) return true; return false; } /* * Returns true when char is bottom left corner */ static bool isBottomLeftChar(char *str) { const char *u1 = "\342\224\224"; const char *u2 = "\342\225\232"; if (str[0] == '+') return true; if (strncmp(str, u1, 3) == 0) return true; if (strncmp(str, u2, 3) == 0) return true; return false; } /* * detect different faces of headline in extended mode */ bool is_expanded_header(Options *opts, char *str, int *ei_minx, int *ei_maxx) { int pos = 0; if (*str == '+') { str += 1; pos += 1; } else if (strncmp(str, "\342\224\214", 3) == 0 || /* ┌ */ strncmp(str, "\342\225\224", 3) == 0 || /* ╔ */ strncmp(str, "\342\224\234", 3) == 0 || /* ├╟ */ strncmp(str, "\342\225\237", 3) == 0 || strncmp(str, "\342\225\236", 3) == 0 || /* ╞╠ */ strncmp(str, "\342\225\240", 3) == 0) { str += 3; pos += 1; } if (*str == '-') { str += 1; pos += 1; } else if (strncmp(str, "\342\224\200", 3) == 0 || /* ─ */ strncmp(str, "\342\225\220", 3) == 0) /* ═ */ { str += 3; pos += 1; } if (strncmp(str, "[ ", 2) != 0) return false; if (ei_minx != NULL && ei_maxx != NULL) { pos += 2; str += 2; *ei_minx = pos - 1; while (*str != ']' && *str != '\0') { pos += 1; str += opts->force8bit ? 1 : utf8charlen(*str); } *ei_maxx = pos - 1; } return true; } /* * Returns true when char (multibyte char) correspond with symbols for * line continuation. */ static bool is_line_continuation_char(char *str, DataDesc *desc) { const char *u1 = "\342\206\265"; /* ↵ */ const char *u2 = "\342\200\246"; /* … */ if (desc->linestyle == 'a') { return str[0] == '+' || str[0] == '.'; } else { /* desc->linestyle == 'u'; */ return strncmp(str, u1, 3) == 0 || strncmp(str, u2, 3) == 0; } } /* * Copy trimmed string */ static void strncpytrim(Options *opts, char *dest, const char *src, size_t ndest, size_t nsrc) { const char *endptr; endptr = src + nsrc - 1; /* skip trailing spaces */ while (*src == ' ') { if (nsrc-- <= 0) break; src++; } /* skip ending spaces */ while (*endptr == ' ') { if (nsrc-- <= 0) break; endptr--; } while(nsrc > 0) { size_t clen; if (*src == '\0') break; clen = (size_t) opts->force8bit ? 1 : utf8charlen(*src); if (clen <= ndest && clen <= nsrc) { int i; for (i = 0; i < clen; i++) { *dest++ = *src++; ndest--; nsrc--; } } else break; } *dest = '\0'; } /* * Read data from file and fill DataDesc. */ static int readfile(FILE *fp, Options *opts, DataDesc *desc) { char *line = NULL; size_t len; ssize_t read; int nrows = 0; LineBuffer *rows; #ifdef DEBUG_PIPE time_t start_sec; long start_ms; current_time(&start_sec, &start_ms); #endif /* safe reset */ desc->filename[0] = '\0'; if (fp != NULL) { if (opts->pathname != NULL) { char *name; name = basename(opts->pathname); strncpy(desc->filename, name, 64); desc->filename[64] = '\0'; } } else fp = stdin; desc->title[0] = '\0'; desc->title_rows = 0; desc->border_top_row = -1; desc->border_head_row = -1; desc->border_bottom_row = -1; desc->first_data_row = -1; desc->last_data_row = -1; desc->is_expanded_mode = false; desc->headline_transl = NULL; desc->cranges = NULL; desc->columns = 0; desc->footer_row = -1; desc->alt_footer_row = -1; desc->is_pgcli_fmt = false; desc->namesline = NULL; desc->order_map = NULL; desc->total_rows = 0; desc->maxbytes = -1; desc->maxx = -1; memset(&desc->rows, 0, sizeof(LineBuffer)); rows = &desc->rows; desc->rows.prev = NULL; desc->oid_name_table = false; desc->multilines_already_tested = false; errno = 0; while ((read = getline(&line, &len, fp)) != -1) { int clen; if (line[read - 1] == '\n') { line[read - 1] = '\0'; read -= 1; } clen = utf_string_dsplen(line, read); if (rows->nrows == 1000) { LineBuffer *newrows = malloc(sizeof(LineBuffer)); if (!newrows) { fprintf(stderr, "out of memory\n"); exit(EXIT_FAILURE); } memset(newrows, 0, sizeof(LineBuffer)); rows->next = newrows; newrows->prev = rows; rows = newrows; } rows->rows[rows->nrows++] = line; /* save possible table name */ if (nrows == 0 && !isTopLeftChar(line)) { strncpytrim(opts, desc->title, line, 63, read); desc->title_rows = 1; } if (desc->border_head_row == -1 && desc->border_top_row == -1 && isTopLeftChar(line)) { desc->border_top_row = nrows; desc->is_expanded_mode = is_expanded_header(opts, line, NULL, NULL); } else if (desc->border_head_row == -1 && isHeadLeftChar(line)) { desc->border_head_row = nrows; if (!desc->is_expanded_mode) desc->is_expanded_mode = is_expanded_header(opts, line, NULL, NULL); /* title surely doesn't it there */ if ((!desc->is_expanded_mode && nrows == 1) || (desc->is_expanded_mode && nrows == 0)) { desc->title[0] = '\0'; desc->title_rows = 0; } } else if (!desc->is_expanded_mode && desc->border_bottom_row == -1 && isBottomLeftChar(line)) { desc->border_bottom_row = nrows; desc->last_data_row = nrows - 1; } else if (!desc->is_expanded_mode && desc->border_bottom_row != -1 && desc->footer_row == -1) { desc->footer_row = nrows; } else if (desc->is_expanded_mode && isBottomLeftChar(line)) { /* Outer border is repeated in expanded mode, use last detected row */ desc->border_bottom_row = nrows; desc->last_data_row = nrows - 1; } if (!desc->is_expanded_mode && desc->border_head_row != -1 && desc->border_head_row < nrows && desc->alt_footer_row == -1) { if (*line != '\0' && *line != ' ') desc->alt_footer_row = nrows; } if ((int) len > desc->maxbytes) desc->maxbytes = (int) len; if ((int) clen > desc->maxx + 1) desc->maxx = clen - 1; if ((int) clen > 1 || (clen == 1 && *line != '\n')) desc->last_row = nrows; nrows += 1; line = NULL; } if (errno != 0) { fprintf(stderr, "cannot to read file: %s\n", strerror(errno)); exit(EXIT_FAILURE); } desc->total_rows = nrows; /* * border headline cannot be higher than 1000, to simply find it * in first row block. Higher number is surelly wrong, probably * some comment. */ if (desc->border_top_row >= 1000) desc->border_top_row = -1; if (desc->border_head_row >= 1000) desc->border_head_row = -1; if (desc->last_row != -1) desc->maxy = desc->last_row; desc->headline_char_size = 0; if (desc->border_head_row != -1) { desc->headline = desc->rows.rows[desc->border_head_row]; desc->headline_size = strlen(desc->headline); if (desc->last_data_row == -1) desc->last_data_row = desc->last_row - 1; if (desc->border_head_row >= 1) desc->namesline = desc->rows.rows[desc->border_head_row - 1]; } else if (desc->is_expanded_mode && desc->border_top_row != -1) { desc->headline = desc->rows.rows[desc->border_top_row]; desc->headline_size = strlen(desc->headline); } else { desc->headline = NULL; desc->headline_size = 0; desc->headline_char_size = 0; /* there are not a data set */ desc->last_data_row = desc->last_row; desc->title_rows = 0; desc->title[0] = '\0'; } #ifdef DEBUG_PIPE print_duration(start_sec, start_ms, "read file"); #endif return 0; } /* * Prepare order map - it is used for printing data in different than * original order. "sbcn" - sort by column number */ static void update_order_map(Options *opts, ScrDesc *scrdesc, DataDesc *desc, int sbcn, bool desc_sort) { LineBuffer *lnb = &desc->rows; char *nullstr = NULL; int xmin, xmax; int lineno = 0; bool continual_line = false; bool has_multilines = false; bool isnull; bool detect_string_column = false; bool border0 = (desc->border_type == 0); bool border1 = (desc->border_type == 1); bool border2 = (desc->border_type == 2); SortData *sortbuf; int sortbuf_pos = 0; int i; xmin = desc->cranges[sbcn - 1].xmin; xmax = desc->cranges[sbcn - 1].xmax; sortbuf = malloc(desc->total_rows * sizeof(SortData)); if (!sortbuf) leave_ncurses("out of memory"); /* first time we should to detect multilines */ if (!desc->multilines_already_tested) { desc->multilines_already_tested = true; lnb = &desc->rows; lineno = 0; while (lnb) { for (i = 0; i < lnb->nrows; i++) { if (lineno >= desc->first_data_row && lineno <= desc->last_data_row) { char *str = lnb->rows[i]; bool found_continuation_symbol = false; int j = 0; while (j < desc->headline_char_size) { if (border0) { /* border 0, last continuation symbol is after headline */ if (j + 1 == desc->headline_char_size) { char *sym; sym = str + (opts->force8bit ? 1 : utf8charlen(*str)); if (*sym != '\0') found_continuation_symbol = is_line_continuation_char(sym, desc); } else if (desc->headline_transl[j] == 'I') found_continuation_symbol = is_line_continuation_char(str, desc); } else if (border1) { if ((j + 1 < desc->headline_char_size && desc->headline_transl[j + 1] == 'I') || (j + 1 == desc->headline_char_size)) found_continuation_symbol = is_line_continuation_char(str, desc); } else if (border2) { if ((j + 1 < desc->headline_char_size) && (desc->headline_transl[j + 1] == 'I' || desc->headline_transl[j + 1] == 'R')) found_continuation_symbol = is_line_continuation_char(str, desc); } if (found_continuation_symbol) break; j += opts->force8bit ? 1 : utf_dsplen(str); str += opts->force8bit ? 1 : utf8charlen(*str); } if (found_continuation_symbol) { if (lnb->lineinfo == NULL) { lnb->lineinfo = malloc(1000 * sizeof(LineInfo)); if (lnb->lineinfo == NULL) leave_ncurses("out of memory"); memset(lnb->lineinfo, 0, 1000 * sizeof(LineInfo)); } lnb->lineinfo[i].mask ^= LINEINFO_CONTINUATION; has_multilines = true; } } lineno += 1; } lnb = lnb->next; } } lnb = &desc->rows; lineno = 0; sortbuf_pos = 0; if (!desc->order_map) { desc->order_map = malloc(desc->total_rows * sizeof(MappedLine)); if (!desc->order_map) leave_ncurses("out of memory"); } /* * There are two possible sorting methods: numeric or string. * We can try numeric sort first if all values are numbers or * just only one type of string value (like NULL string). This * value can be repeated, * * When there are more different strings, then start again and * use string sort. */ while (lnb) { for (i = 0; i < lnb->nrows; i++) { desc->order_map[lineno].lnb = lnb; desc->order_map[lineno].lnb_row = i; if (lineno >= desc->first_data_row && lineno <= desc->last_data_row) { if (!continual_line) { sortbuf[sortbuf_pos].lnb = lnb; sortbuf[sortbuf_pos].lnb_row = i; sortbuf[sortbuf_pos].strxfrm = NULL; if (cut_numeric_value(lnb->rows[i], xmin, xmax, &sortbuf[sortbuf_pos].d, border0, &isnull, &nullstr)) sortbuf[sortbuf_pos++].info = INFO_DOUBLE; else { sortbuf[sortbuf_pos++].info = INFO_UNKNOWN; if (!isnull) { detect_string_column = true; goto sort_by_string; } } } if (has_multilines) { continual_line = (lnb->lineinfo && (lnb->lineinfo[i].mask & LINEINFO_CONTINUATION)); } } lineno += 1; } lnb = lnb->next; } sort_by_string: free(nullstr); if (detect_string_column) { /* read data again and use nls_string */ lnb = &desc->rows; lineno = 0; sortbuf_pos = 0; while (lnb) { for (i = 0; i < lnb->nrows; i++) { desc->order_map[lineno].lnb = lnb; desc->order_map[lineno].lnb_row = i; if (lineno >= desc->first_data_row && lineno <= desc->last_data_row) { if (!continual_line) { sortbuf[sortbuf_pos].lnb = lnb; sortbuf[sortbuf_pos].lnb_row = i; sortbuf[sortbuf_pos].d = 0.0; if (cut_text(lnb->rows[i], xmin, xmax, border0, opts->force8bit, &sortbuf[sortbuf_pos].strxfrm)) sortbuf[sortbuf_pos++].info = INFO_STRXFRM; else sortbuf[sortbuf_pos++].info = INFO_UNKNOWN; /* empty string */ } if (has_multilines) { continual_line = (lnb->lineinfo && (lnb->lineinfo[i].mask & LINEINFO_CONTINUATION)); } } lineno += 1; } lnb = lnb->next; } } if (lineno != desc->total_rows) leave_ncurses("unexpected processed rows after sort prepare"); if (detect_string_column) sort_column_text(sortbuf, sortbuf_pos, desc_sort); else sort_column_num(sortbuf, sortbuf_pos, desc_sort); lineno = desc->first_data_row; for (i = 0; i < sortbuf_pos; i++) { desc->order_map[lineno].lnb = sortbuf[i].lnb; desc->order_map[lineno].lnb_row = sortbuf[i].lnb_row; lineno += 1; /* assign other continual lines */ if (has_multilines) { int lnb_row; bool continual = false; lnb = sortbuf[i].lnb; lnb_row = sortbuf[i].lnb_row; continual = lnb->lineinfo && (lnb->lineinfo[lnb_row].mask & LINEINFO_CONTINUATION); while (lnb && continual) { lnb_row += 1; if (lnb_row >= lnb->nrows) { lnb_row = 0; lnb = lnb->next; } desc->order_map[lineno].lnb = lnb; desc->order_map[lineno].lnb_row = lnb_row; lineno += 1; continual = lnb && lnb->lineinfo && (lnb->lineinfo[lnb_row].mask & LINEINFO_CONTINUATION); } } } /* * We cannot to say nothing about found_row, so most * correct solution is clean it now. */ scrdesc->found_row = -1; for (i = 0; i < sortbuf_pos; i++) free(sortbuf[i].strxfrm); free(sortbuf); } /* * Prepare dimensions of windows layout */ static void create_layout_dimensions(Options *opts, ScrDesc *scrdesc, DataDesc *desc, int fixCols, int fixRows, int maxy, int maxx) { scrdesc->maxy = maxy; scrdesc->maxx = maxx; if (opts->show_rownum) { int startx = number_width(desc->maxy) + 2; scrdesc->main_start_x = startx; scrdesc->main_maxx -= startx; } scrdesc->fix_cols_cols = 0; /* search end of fixCol'th column */ if (desc->headline_transl != NULL && fixCols > 0) { char *c = desc->headline_transl; while (*c != 0) { if (*c == 'I' && --fixCols == 0) { scrdesc->fix_cols_cols = c - desc->headline_transl + 1; break; } c += 1; } } scrdesc->fix_rows_rows = 0; scrdesc->footer_rows = 0; if (fixRows != -1) { scrdesc->fix_rows_rows = fixRows; } else if (!desc->is_expanded_mode && desc->border_head_row != -1 && desc->headline_transl != NULL) { scrdesc->fix_rows_rows = desc->border_head_row + 1 - desc->title_rows; } /* disable fixed parts when is not possible draw in screen */ if (scrdesc->fix_cols_cols > scrdesc->main_maxx) scrdesc->fix_cols_cols = 0; if (scrdesc->fix_rows_rows > scrdesc->main_maxy) scrdesc->fix_rows_rows = 0; if (scrdesc->fix_rows_rows == 0 && !desc->is_expanded_mode) { desc->title_rows = 0; desc->title[0] = '\0'; } desc->fixed_rows = scrdesc->fix_rows_rows; } static void create_layout(Options *opts, ScrDesc *scrdesc, DataDesc *desc, int first_data_row, int first_row) { if (w_luc(scrdesc) != NULL) { delwin(w_luc(scrdesc)); w_luc(scrdesc) = NULL; } if (w_fix_rows(scrdesc) != NULL) { delwin(w_fix_rows(scrdesc)); w_fix_rows(scrdesc) = NULL; } if (w_fix_cols(scrdesc) != NULL) { delwin(w_fix_cols(scrdesc)); w_fix_cols(scrdesc) = NULL; } if (w_rows(scrdesc) != NULL) { delwin(w_rows(scrdesc)); w_rows(scrdesc) = NULL; } if (w_footer(scrdesc) != NULL) { delwin(w_footer(scrdesc)); w_footer(scrdesc) = NULL; } if (w_rownum(scrdesc) != NULL) { delwin(w_rownum(scrdesc)); w_rownum(scrdesc) = NULL; } if (w_rownum_luc(scrdesc) != NULL) { delwin(w_rownum_luc(scrdesc)); w_rownum_luc(scrdesc) = NULL; } if (desc->headline_transl != NULL && desc->footer_row > 0) { int rows_rows = desc->footer_row - first_row - first_data_row; int data_rows; /* desc->footer_row == desc->first_data_row when result is empty */ if (rows_rows > 0 || desc->footer_row == desc->first_data_row) { data_rows = scrdesc->main_maxy - desc->fixed_rows; scrdesc->rows_rows = min_int(rows_rows, data_rows); } else { int new_fix_rows_rows = scrdesc->fix_rows_rows + rows_rows - 1; scrdesc->fix_rows_rows = new_fix_rows_rows > 0 ? new_fix_rows_rows : 0; scrdesc->rows_rows = new_fix_rows_rows >= 0 ? 1 : 0; data_rows = scrdesc->main_maxy - scrdesc->fix_rows_rows; } scrdesc->footer_rows = min_int(data_rows - scrdesc->rows_rows, desc->last_row - desc->footer_row + 1); if (scrdesc->footer_rows > 0) { w_footer(scrdesc) = subwin(stdscr, scrdesc->footer_rows, scrdesc->main_maxx, scrdesc->main_start_y + scrdesc->fix_rows_rows + scrdesc->rows_rows, scrdesc->main_start_x); } } else if (desc->headline_transl != NULL) { scrdesc->rows_rows = min_int(scrdesc->main_maxy - scrdesc->fix_rows_rows, desc->last_row - desc->first_data_row + 1); } else { scrdesc->rows_rows = 0; scrdesc->fix_rows_rows = 0; scrdesc->footer_rows = min_int(scrdesc->main_maxy, desc->last_row + 1); w_footer(scrdesc) = subwin(stdscr, scrdesc->footer_rows, scrdesc->main_maxx, scrdesc->main_start_y, scrdesc->main_start_x); } if (scrdesc->fix_rows_rows > 0) { w_fix_rows(scrdesc) = subwin(stdscr, scrdesc->fix_rows_rows, scrdesc->main_maxx - scrdesc->fix_cols_cols, scrdesc->main_start_y, scrdesc->fix_cols_cols + scrdesc->main_start_x); } if (scrdesc->fix_cols_cols > 0 && scrdesc->rows_rows > 0) { w_fix_cols(scrdesc) = subwin(stdscr, scrdesc->rows_rows, scrdesc->fix_cols_cols, scrdesc->fix_rows_rows + scrdesc->main_start_y, scrdesc->main_start_x); } if (scrdesc->fix_rows_rows > 0 && scrdesc->fix_cols_cols > 0) { w_luc(scrdesc) = subwin(stdscr, scrdesc->fix_rows_rows, scrdesc->fix_cols_cols, scrdesc->main_start_y, scrdesc->main_start_x); } if (scrdesc->rows_rows > 0) { w_rows(scrdesc) = subwin(stdscr, scrdesc->rows_rows, scrdesc->main_maxx - scrdesc->fix_cols_cols, scrdesc->fix_rows_rows + scrdesc->main_start_y, scrdesc->fix_cols_cols + scrdesc->main_start_x); } if (scrdesc->fix_rows_rows > 0 && opts->show_rownum) { Theme *theme = &scrdesc->themes[WINDOW_ROWNUM_LUC]; w_rownum_luc(scrdesc) = subwin(stdscr, scrdesc->fix_rows_rows, scrdesc->main_start_x, scrdesc->main_start_y, 0); wbkgd(w_rownum_luc(scrdesc), theme->data_attr); } if (scrdesc->rows_rows + scrdesc->footer_rows > 0 && opts->show_rownum) { w_rownum(scrdesc) = subwin(stdscr, scrdesc->rows_rows + scrdesc->footer_rows, scrdesc->main_start_x, scrdesc->fix_rows_rows + scrdesc->main_start_y, 0); } } /* * Refresh aux windows like top bar or bottom bar. */ static void refresh_aux_windows(Options *opts, ScrDesc *scrdesc, DataDesc *desc) { int maxy, maxx; WINDOW *top_bar = w_top_bar(scrdesc); WINDOW *bottom_bar = w_bottom_bar(scrdesc); refresh(); getmaxyx(stdscr, maxy, maxx); if (top_bar != NULL) { delwin(top_bar); top_bar = NULL; w_top_bar(scrdesc) = NULL; } if (opts->no_topbar) scrdesc->top_bar_rows = 0; else { scrdesc->top_bar_rows = 1; top_bar = subwin(stdscr, 1, 0, 0, 0); wbkgd(top_bar, COLOR_PAIR(2)); wnoutrefresh(top_bar); w_top_bar(scrdesc) = top_bar; } if (bottom_bar != NULL) { delwin(bottom_bar); bottom_bar = NULL; w_bottom_bar(scrdesc) = NULL; } bottom_bar = subwin(stdscr, 1, 0, maxy - 1, 0); w_bottom_bar(scrdesc) = bottom_bar; werase(bottom_bar); /* data colours are better than default */ wbkgd(bottom_bar, COLOR_PAIR(3)); wnoutrefresh(bottom_bar); scrdesc->main_maxy = maxy; scrdesc->main_maxx = maxx; scrdesc->main_start_y = 0; scrdesc->main_start_x = 0; if (top_bar != NULL) { scrdesc->main_maxy -= 1; scrdesc->main_start_y = 1; } if (bottom_bar != NULL) { if (!opts->no_commandbar) scrdesc->main_maxy -= 1; } } /* * Returns width of number */ static int number_width(int num) { if (num < 10) return 1; if (num < 100) return 2; if (num < 1000) return 3; if (num < 10000) return 4; if (num < 100000) return 5; if (num < 1000000) return 6; if (num < 10000000) return 7; return 8; } /* * returns true when cursor is on footer window */ static bool is_footer_cursor(int cursor_row, ScrDesc *scrdesc, DataDesc *desc) { if (w_footer(scrdesc) == NULL) return false; else if (scrdesc->rows_rows == 0) return true; return cursor_row + scrdesc->fix_rows_rows + desc->title_rows + 1 > desc->footer_row; } static void print_status(Options *opts, ScrDesc *scrdesc, DataDesc *desc, int cursor_row, int cursor_col, int first_row, int fix_rows_offset, int vertical_cursor_column) { int maxy, maxx; int smaxy, smaxx; char buffer[200]; WINDOW *top_bar = w_top_bar(scrdesc); WINDOW *bottom_bar = w_bottom_bar(scrdesc); Theme *top_bar_theme = &scrdesc->themes[WINDOW_TOP_BAR]; Theme *bottom_bar_theme = &scrdesc->themes[WINDOW_BOTTOM_BAR]; /* do nothing when there are not top status bar */ if (scrdesc->top_bar_rows > 0) { getmaxyx(top_bar, maxy, maxx); getmaxyx(stdscr, smaxy, smaxx); (void) maxy; wbkgd(top_bar, err ? bottom_bar_theme->error_attr : COLOR_PAIR(2)); werase(top_bar); if (desc->title[0] != '\0' || desc->filename[0] != '\0') { wattron(top_bar, top_bar_theme->title_attr); if (desc->title[0] != '\0' && desc->title_rows > 0) mvwprintw(top_bar, 0, 0, "%s", desc->title); else if (desc->filename[0] != '\0') mvwprintw(top_bar, 0, 0, "%s", desc->filename); wattroff(top_bar, top_bar_theme->title_attr); } if (opts->watch_time > 0) { if (last_watch_sec > 0) { long ms, td; time_t sec; struct timespec spec; int w = number_width(opts->watch_time); int x = 0; clock_gettime(CLOCK_MONOTONIC, &spec); ms = roundl(spec.tv_nsec / 1.0e6); sec = spec.tv_sec; td = (sec - last_watch_sec) * 1000 + ms - last_watch_ms; if (desc->title[0] != '\0' || desc->filename[0] != '\0') x = maxx / 4; if (paused) mvwprintw(top_bar, 0, x, "paused %ld sec", td / 1000); else mvwprintw(top_bar, 0, x, "%*ld/%d", w, td/1000 + 1, opts->watch_time); } if (err) { int i; char *ptr = buffer; /* copy first row to buffer */ for (i = 0; i < 200; i++) if (err[i] == '\0' || err[i] == '\n') { *ptr = '\0'; break; } else *ptr++ = err[i]; wprintw(top_bar, " %s", buffer); } } if (opts->no_cursor) { double percent; if (desc->headline_transl) { percent = (first_row + scrdesc->main_maxy - 1 - desc->fixed_rows - desc->title_rows) / ((double) (desc->maxy + 1 - desc->fixed_rows - desc->title_rows)) * 100.0; percent = percent > 100.0 ? 100.0 : percent; if (opts->vertical_cursor && desc->columns > 0 && vertical_cursor_column > 0) { int vminx = desc->cranges[vertical_cursor_column - 1].xmin; int vmaxx = desc->cranges[vertical_cursor_column - 1].xmax; snprintf(buffer, 199, "V:[%*d/%*d %*d..%*d] [FC:%*d C:%*d..%*d/%*d L:%*d/%*d %3.0f%%", number_width(desc->columns), vertical_cursor_column, number_width(desc->columns), desc->columns, number_width(desc->headline_char_size), vminx + 1, number_width(desc->headline_char_size), vmaxx + 1, number_width(desc->headline_char_size), scrdesc->fix_cols_cols, number_width(desc->headline_char_size), cursor_col + scrdesc->fix_cols_cols + 1, number_width(desc->headline_char_size), min_int(smaxx + cursor_col, desc->headline_char_size), number_width(desc->headline_char_size), desc->headline_char_size, number_width(desc->maxy - desc->fixed_rows), first_row + scrdesc->main_maxy - fix_rows_offset - desc->fixed_rows - desc->title_rows, number_width(desc->maxy - desc->fixed_rows - desc->title_rows), desc->maxy + 1 - desc->fixed_rows - desc->title_rows, percent); } else { snprintf(buffer, 199, "FC:%*d C:%*d..%*d/%*d L:%*d/%*d %3.0f%%", number_width(desc->headline_char_size), scrdesc->fix_cols_cols, number_width(desc->headline_char_size), cursor_col + scrdesc->fix_cols_cols + 1, number_width(desc->headline_char_size), min_int(smaxx + cursor_col, desc->headline_char_size), number_width(desc->headline_char_size), desc->headline_char_size, number_width(desc->maxy - desc->fixed_rows), first_row + scrdesc->main_maxy - fix_rows_offset - desc->fixed_rows - desc->title_rows, number_width(desc->maxy - desc->fixed_rows - desc->title_rows), desc->maxy + 1 - desc->fixed_rows - desc->title_rows, percent); } } else { percent = ((first_row + scrdesc->main_maxy) / ((double) (desc->last_row + 1))) * 100.0; percent = percent > 100.0 ? 100.0 : percent; snprintf(buffer, 199, "C:%*d..%*d/%*d L:%*d/%*d %3.0f%%", number_width(desc->maxx), cursor_col + scrdesc->fix_cols_cols + 1, number_width(desc->maxx), min_int(smaxx + cursor_col, desc->maxx), number_width(desc->maxx), desc->maxx, number_width(desc->maxy - scrdesc->fix_rows_rows), first_row + scrdesc->main_maxy, number_width(desc->last_row), desc->last_row + 1, percent); } } else { if (desc->headline_transl) { if (opts->vertical_cursor && desc->columns > 0 && vertical_cursor_column > 0) { int vminx = desc->cranges[vertical_cursor_column - 1].xmin; int vmaxx = desc->cranges[vertical_cursor_column - 1].xmax; snprintf(buffer, 199, "V:[%*d/%*d %*d..%*d] FC:%*d C:%*d..%*d/%*d L:[%*d + %*d %*d/%*d] %3.0f%%", number_width(desc->columns), vertical_cursor_column, number_width(desc->columns), desc->columns, number_width(desc->headline_char_size), vminx + 1, number_width(desc->headline_char_size), vmaxx + 1, number_width(desc->headline_char_size), scrdesc->fix_cols_cols, number_width(desc->headline_char_size), cursor_col + scrdesc->fix_cols_cols + 1, number_width(desc->headline_char_size), min_int(smaxx + cursor_col, desc->headline_char_size), number_width(desc->headline_char_size), desc->headline_char_size, number_width(desc->maxy - desc->fixed_rows), first_row + 1 - fix_rows_offset, number_width(smaxy), cursor_row - first_row + fix_rows_offset, number_width(desc->maxy - desc->fixed_rows - desc->title_rows), cursor_row + 1, number_width(desc->maxy - desc->fixed_rows - desc->title_rows), desc->maxy + 1 - desc->fixed_rows - desc->title_rows, (cursor_row + 1) / ((double) (desc->maxy + 1 - desc->fixed_rows - desc->title_rows)) * 100.0); } else { snprintf(buffer, 199, "FC:%*d C:%*d..%*d/%*d L:[%*d + %*d %*d/%*d] %3.0f%%", number_width(desc->headline_char_size), scrdesc->fix_cols_cols, number_width(desc->headline_char_size), cursor_col + scrdesc->fix_cols_cols + 1, number_width(desc->headline_char_size), min_int(smaxx + cursor_col, desc->headline_char_size), number_width(desc->headline_char_size), desc->headline_char_size, number_width(desc->maxy - desc->fixed_rows), first_row + 1 - fix_rows_offset, number_width(smaxy), cursor_row - first_row + fix_rows_offset, number_width(desc->maxy - desc->fixed_rows - desc->title_rows), cursor_row + 1, number_width(desc->maxy - desc->fixed_rows - desc->title_rows), desc->maxy + 1 - desc->fixed_rows - desc->title_rows, (cursor_row + 1) / ((double) (desc->maxy + 1 - desc->fixed_rows - desc->title_rows)) * 100.0); } } else { snprintf(buffer, 199, "C:%*d..%*d/%*d L:[%*d + %*d %*d/%*d] %3.0f%%", number_width(desc->maxx), cursor_col + scrdesc->fix_cols_cols + 1, number_width(desc->maxx), min_int(smaxx + cursor_col, desc->maxx), number_width(desc->maxx), desc->maxx, number_width(desc->maxy - scrdesc->fix_rows_rows), first_row + 1, number_width(smaxy), cursor_row - first_row, number_width(desc->last_row), cursor_row + 1, number_width(desc->last_row), desc->last_row + 1, ((cursor_row + 1) / ((double) (desc->last_row + 1))) * 100.0); } } mvwprintw(top_bar, 0, maxx - strlen(buffer) - 2, " %s", buffer); wnoutrefresh(top_bar); } if (opts->less_status_bar) { /* less-status-bar */ char title[65]; char *str; size_t bytes = sizeof(title) - 2; char *ptr = title; if (desc->title_rows > 0 && desc->title[0] != '\0') str = desc->title; else if (desc->filename[0] != '\0') str = desc->filename; else str = ""; while (bytes > 0 && *str != '\0') { size_t sz = opts->force8bit ? 1 : utf8charlen(*str); if (sz > bytes) break; memcpy(ptr, str, sz); ptr += sz; str += sz; bytes -= sz; } if (ptr != title) *ptr++ = ' '; *ptr = '\0'; wattron(bottom_bar, bottom_bar_theme->prompt_attr); if (desc->headline_transl) { snprintf(buffer, 199, "%slines %d-%d/%d %.0f%% ", title, first_row + 1 - fix_rows_offset, first_row + 1 - fix_rows_offset + scrdesc->rows_rows, desc->maxy + 1 - desc->fixed_rows - desc->title_rows, (cursor_row + 1) / ((double) (desc->maxy + 1 - desc->fixed_rows - desc->title_rows)) * 100.0); } else { snprintf(buffer, 199, "%slines %d-%d/%d %.0f%% ", title, first_row + 1, first_row + 1 + scrdesc->footer_rows, desc->last_row + 1, ((cursor_row + 1) / ((double) (desc->last_row + 1))) * 100.0); } mvwprintw(bottom_bar, 0, 0, "%s", buffer); wclrtoeol(bottom_bar); wnoutrefresh(bottom_bar); wattroff(bottom_bar, bottom_bar_theme->prompt_attr); } } static void make_beep(Options *opts) { if (!opts->no_sound) beep(); } /* * It is used for result of action info */ static int show_info_wait(Options *opts, ScrDesc *scrdesc, char *fmt, char *par, bool beep, bool refresh_first, bool applytimeout, bool is_error) { WINDOW *bottom_bar = w_bottom_bar(scrdesc); Theme *t = &scrdesc->themes[WINDOW_BOTTOM_BAR]; attr_t att; int c; int timeout = -1; /* * When refresh is required first, then store params and quit immediately. * Only once can be info moved after refresh */ if (refresh_first && scrdesc->fmt == NULL) { if (fmt != NULL) { scrdesc->fmt = strdup(fmt); if (!scrdesc->fmt) leave_ncurses("out of memory"); } else scrdesc->fmt = NULL; if (par != NULL) { scrdesc->par = strdup(par); if (!scrdesc->par) leave_ncurses("out of memory"); } else scrdesc->par = NULL; scrdesc->beep = beep; scrdesc->applytimeout = applytimeout; scrdesc->is_error = is_error; return 0; } att = !is_error ? t->bottom_light_attr : t->error_attr; wattron(bottom_bar, att); if (par != NULL) mvwprintw(bottom_bar, 0, 0, fmt, par); else mvwprintw(bottom_bar, 0, 0, "%s", fmt); if (logfile) { char buffer[1024]; print_log_prefix(logfile); if (par) snprintf(buffer, 1024, fmt, par); else snprintf(buffer, 1024, "%s", fmt); fprintf(logfile, "info: %s\n", buffer); } wclrtoeol(bottom_bar); mvwchgat(bottom_bar, 0, 0, -1, att, PAIR_NUMBER(att), 0); wattroff(bottom_bar, att); wnoutrefresh(bottom_bar); refresh(); if (beep) make_beep(opts); if (applytimeout) timeout = strlen(fmt) < 50 ? 2000 : 6000; c = get_event(&event, &press_alt, &got_sigint, NULL, timeout); /* * Screen should be refreshed after show any info. */ scrdesc->refresh_scr = true; /* eat escape if pressed here */ if (c == 27 && press_alt) { press_alt = false; return 0; } else return c == ERR ? 0 : c; } #ifdef HAVE_LIBREADLINE #if RL_READLINE_VERSION >= 0x0603 static int readline_input_avail(void) { return input_avail; } #endif static int readline_getc(FILE *dummy) { input_avail = false; return input; } static void forward_to_readline(char c) { input = c; input_avail = true; rl_callback_read_char(); } static void got_string(char *line) { if (line) strcpy(readline_buffer, line); else readline_buffer[0] = '\0'; got_readline_string = true; } static void readline_redisplay() { size_t cursor_col; if (!force8bit) { size_t prompt_dsplen = utf_string_dsplen(rl_display_prompt, SIZE_MAX); cursor_col = prompt_dsplen + readline_utf_string_dsplen(rl_line_buffer, rl_point, prompt_dsplen); } else { cursor_col = strlen(rl_display_prompt) + min_int(strlen(rl_line_buffer), rl_point); } wbkgd(g_bottom_bar, input_attr); werase(g_bottom_bar); mvwprintw(g_bottom_bar, 0, 0, "%s%s", rl_display_prompt, rl_line_buffer); mvwchgat(g_bottom_bar, 0, 0, -1, input_attr, PAIR_NUMBER(input_attr), 0); if (cursor_col >= COLS) curs_set(0); else { wmove(g_bottom_bar, 0, cursor_col); curs_set(2); } wrefresh(g_bottom_bar); } #endif static void get_string(Options *opts, ScrDesc *scrdesc, char *prompt, char *buffer, int maxsize, char *defstr) { WINDOW *bottom_bar = w_bottom_bar(scrdesc); Theme *t = &scrdesc->themes[WINDOW_BOTTOM_BAR]; if (logfile) { print_log_prefix(logfile); fprintf(logfile, "input string prompt- \"%s\"\n", prompt); } #ifdef HAVE_LIBREADLINE int c; int prev_c = 0; mmask_t prev_mousemask = 0; bool input_is_valid = true; g_bottom_bar = bottom_bar; got_readline_string = false; force8bit = opts->force8bit; input_attr = t->input_attr; wattron(bottom_bar, t->input_attr); mvwprintw(bottom_bar, 0, 0, ""); wclrtoeol(bottom_bar); curs_set(1); echo(); rl_getc_function = readline_getc; #if RL_READLINE_VERSION >= 0x0603 rl_input_available_hook = readline_input_avail; #endif rl_redisplay_function = readline_redisplay; rl_callback_handler_install(prompt, got_string); mousemask(0, &prev_mousemask); /* use default value from buffer */ if (defstr && *defstr) { rl_insert_text(defstr); rl_forced_update_display(); wrefresh(bottom_bar); } wtimeout(bottom_bar, 100); while (!got_readline_string) { do { c = wgetch(bottom_bar); if (c == ERR && errno == EINTR) goto finish_read; if (handle_sigint) goto finish_read; } while (c == ERR || c == 0); /* detect double alts .. escape */ if (c == 27 && prev_c == 27) { /* * Cannot leave here - readline requires complete ALT pair. * So just update flag here. */ input_is_valid = false; } prev_c = c; forward_to_readline(c); wrefresh(bottom_bar); if (!input_is_valid) break; } finish_read: if (handle_sigint) { handle_sigint = false; input_is_valid = false; } mousemask(prev_mousemask, NULL); rl_callback_handler_remove(); curs_set(0); noecho(); /* don't allow alt chars (garbage) in input string */ if (input_is_valid) { char *ptr = readline_buffer; while (*ptr) if (*ptr++ == 27) { input_is_valid = false; break; } } if (input_is_valid) { strncpy(buffer, readline_buffer, maxsize - 1); buffer[maxsize] = '\0'; #ifdef HAVE_READLINE_HISTORY if (*buffer) { /* * Don't write same strings to hist file */ if (*last_history == '\0' || strncmp(last_history, buffer, sizeof(last_history)) != 0) { add_history(buffer); strncpy(last_history, buffer, sizeof(last_history) - 1); last_history[sizeof(last_history) - 1] = '\0'; } } #endif } else { if (defstr) *defstr = '\0'; buffer[0] = '\0'; } #else wbkgd(bottom_bar, t->input_attr); werase(bottom_bar); mvwprintw(bottom_bar, 0, 0, "%s", prompt); curs_set(1); echo(); wgetnstr(bottom_bar, buffer, maxsize); /* reset ctrlc, wgetnstr doesn't handle this signal now */ handle_sigint = false; curs_set(0); noecho(); #endif /* * Screen should be refreshed after show any info. */ scrdesc->refresh_scr = true; if (logfile) { print_log_prefix(logfile); fprintf(logfile, "input string - \"%s\"\n", buffer); } } #define SEARCH_FORWARD 1 #define SEARCH_BACKWARD 2 static bool has_upperchr(Options *opts, char *str) { if (opts->force8bit) { while (*str != '\0') { if (isupper(*str)) return true; str += 1; } } else { while (*str != '\0') { if (utf8_isupper(str)) return true; str += utf8charlen(*str); } } return false; } static void reset_searching_lineinfo(LineBuffer *lnb) { while (lnb != NULL) { if (lnb->lineinfo != NULL) { int i; for (i = 0; i < lnb->nrows; i++) { lnb->lineinfo[i].mask |= LINEINFO_UNKNOWN; lnb->lineinfo[i].mask &= ~(LINEINFO_FOUNDSTR | LINEINFO_FOUNDSTR_MULTI); } } lnb = lnb->next; } } /* * Replace tilde by HOME dir */ static char * tilde(char *path) { static char writebuf[MAXPATHLEN]; int chars = 0; char *w; w = writebuf; while (*path && chars < MAXPATHLEN - 1) { if (*path == '~') { char *home = getenv("HOME"); if (home == NULL) leave_ncurses("HOME directory is not defined"); while (*home && chars < MAXPATHLEN - 1) { *w++ = *home++; chars += 1; } path++; } else { *w++ = *path++; chars += 1; } } *w = '\0'; return writebuf; } /* * Set cursor_col to ensure visibility of vertical column */ static int get_cursor_col_for_vertical_column(int vertical_cursor_column, int cursor_col, DataDesc *desc, ScrDesc *scrdesc) { int xmin = desc->cranges[vertical_cursor_column - 1].xmin; int xmax = desc->cranges[vertical_cursor_column - 1].xmax; /* Do nothing if vertical cursor is visible already */ if (xmax < scrdesc->fix_cols_cols) return 0; else if (xmin > scrdesc->fix_cols_cols && xmax < scrdesc->main_maxx + cursor_col) return cursor_col; else { int max_cursor_col = desc->headline_char_size - scrdesc->main_maxx; int column_center = (xmin + xmax) / 2; int cursor_fixed; cursor_col = column_center - ((scrdesc->main_maxx - scrdesc->fix_cols_cols) / 2 + scrdesc->fix_cols_cols); cursor_col = cursor_col < max_cursor_col ? cursor_col : max_cursor_col; cursor_col = cursor_col > 0 ? cursor_col : 0; /* try to show starts chars when it is possible */ if (xmin < scrdesc->fix_cols_cols + cursor_col) { cursor_fixed = xmin - scrdesc->fix_cols_cols + 1; if (column_center < scrdesc->main_maxx + cursor_fixed) cursor_col = cursor_fixed; } return cursor_col; } } /* * Calculate focus point from left border of selected columns. */ static int get_x_focus(int vertical_cursor_column, int cursor_col, DataDesc *desc, ScrDesc *scrdesc) { int xmin = desc->cranges[vertical_cursor_column - 1].xmin; return xmin > scrdesc->fix_cols_cols ? xmin - cursor_col : xmin; } /* * Reads keycode. When keycode is Esc - then read next keycode, and sets flag alt. * When keycode is related to mouse, then get mouse event details. */ static int get_event(MEVENT *mevent, bool *alt, bool *sigint, bool *timeout, int timeoutval) { bool first_event = true; int c; int loops = -1; int retry_count = 0; #ifdef DEBUG_PIPE char buffer[20]; #endif #if NCURSES_WIDECHAR > 0 && defined HAVE_NCURSESW wint_t ch; int ret; #endif retry: *alt = false; *sigint = false; if (timeout) *timeout = false; repeat: if (timeoutval != -1) loops = timeoutval / 1000; for (;;) { errno = 0; #if NCURSES_WIDECHAR > 0 && defined HAVE_NCURSESW ret = get_wch(&ch); (void) ret; c = ch; #else c = getch(); #endif if ((c == ERR && errno == EINTR) || handle_sigint) { *sigint = true; handle_sigint = false; return 0; } /* * Leave this cycle if there is some unexpected error. * Outer cycle is limited by 10 iteration. */ if (err != 0) break; /* * On ncurses6 (Linux) get_wch returns zero on delay. But by man pages it * should to return ERR (CentOS 7 does it). So repead reading for both cases. */ if (c != 0 && c != ERR) break; if (loops >= 0) { if (--loops == 0) { if (timeout) *timeout = true; return 0; } } } if (c == KEY_MOUSE) { int ok = getmouse(mevent); if (ok != OK) { #ifdef DEBUG_PIPE /* * This is almost all problematic error, that can disable mouse * functionality. It is based on ncurses resets (endwin) or unwanted * mouse reconfigurations (mousemask). */ fprintf(debug_pipe, "Attention: error reading mouse event\n"); #endif goto repeat; } } if (c == 27) /* Escape (before ALT chars) */ { if (first_event) { first_event = false; goto repeat; } } *alt = !first_event; #ifdef DEBUG_PIPE debug_eventno += 1; if (c == KEY_MOUSE) { sprintf(buffer, ", bstate: %08lx", (unsigned long) mevent->bstate); } else buffer[0] = '\0'; fprintf(debug_pipe, "*** eventno: %d, key: %s%s%s ***\n", debug_eventno, *alt ? "Alt " : "", keyname(c), buffer); fflush(debug_pipe); if (0) { struct mallinfo mi; mi = mallinfo(); fprintf(debug_pipe, "Total non-mmapped bytes (arena): %d\n", mi.arena); fprintf(debug_pipe, "# of free chunks (ordblks): %d\n", mi.ordblks); fprintf(debug_pipe, "# of free fastbin blocks (smblks): %d\n", mi.smblks); fprintf(debug_pipe, "# of mapped regions (hblks): %d\n", mi.hblks); fprintf(debug_pipe, "Bytes in mapped regions (hblkhd): %d\n", mi.hblkhd); fprintf(debug_pipe, "Max. total allocated space (usmblks): %d\n", mi.usmblks); fprintf(debug_pipe, "Free bytes held in fastbins (fsmblks): %d\n", mi.fsmblks); fprintf(debug_pipe, "Total allocated space (uordblks): %d\n", mi.uordblks); fprintf(debug_pipe, "Total free space (fordblks): %d\n", mi.fordblks); fprintf(debug_pipe, "Topmost releasable block (keepcost): %d\n", mi.keepcost); } #endif if (c == ERR) { #ifdef DEBUG_PIPE fprintf(debug_pipe, "ERR input - retry no: %d\n", retry_count); #endif if (logfile) { print_log_prefix(logfile); fprintf(logfile, "ERR input - retry no: %d\n", retry_count); } if (++retry_count < 10) goto retry; #ifdef DEBUG_PIPE fprintf(debug_pipe, "ERR input - touch retry limit, stop\n"); #endif if (logfile) { print_log_prefix(logfile); fprintf(logfile, "ERR input - touch retry limit, stop\n"); } } return c; } #define VISIBLE_DATA_ROWS (scrdesc.main_maxy - scrdesc.fix_rows_rows - fix_rows_offset) #define MAX_FIRST_ROW (desc.last_row - desc.title_rows - scrdesc.main_maxy + 1) #define MAX_CURSOR_ROW (desc.last_row - desc.first_data_row) #define CURSOR_ROW_OFFSET (scrdesc.fix_rows_rows + desc.title_rows + fix_rows_offset) static void exit_ncurses(void) { if (active_ncurses) endwin(); } static void DataDescFree(DataDesc *desc) { LineBuffer *lb = &desc->rows; while (lb) { LineBuffer *next; int i; for (i = 0; i < lb->nrows; i++) free(lb->rows[i]); free(lb->lineinfo); next = lb->next; if (lb != &desc->rows) free(lb); lb = next; } free(desc->order_map); free(desc->headline_transl); free(desc->cranges); } static void print_log_prefix(FILE *logfile) { time_t rawtime; struct tm *timeinfo; const char *asct; int len; time(&rawtime); timeinfo = localtime(&rawtime); asct = asctime(timeinfo); len = strlen(asct); fprintf(logfile, "%.*s ", len - 1, asct); fprintf(logfile, "[%ld] ", (long) getpid()); } /* * Copy persistent data (search related and info box related) * to new instance. */ static void MergeScrDesc(ScrDesc *new, ScrDesc *old) { memcpy(new->searchterm, old->searchterm, 255); new->searchterm_char_size = old->searchterm_char_size; new->searchterm_size = old->searchterm_size; memcpy(new->searchcolterm, old->searchcolterm, 255); new->searchcolterm_size = old->searchcolterm_size; new->has_upperchr = old->has_upperchr; new->found = old->found; new->found_start_x = old->found_start_x; new->found_start_bytes = old->found_start_bytes; new->found_row = old->found_row; new->fmt = old->fmt; new->par = old->par; } int main(int argc, char *argv[]) { int maxx, maxy; int event_keycode = 0; int prev_event_keycode = 0; int next_event_keycode = 0; int command = cmd_Invalid; int translated_command = cmd_Invalid; int translated_command_history = cmd_Invalid; long last_ms = 0; /* time of last mouse release in ms */ time_t last_sec = 0; /* time of last mouse release in sec */ long next_watch = 0; int next_command = cmd_Invalid; bool reuse_event = false; int cursor_row = 0; int cursor_col = 0; int footer_cursor_col = 0; int vertical_cursor_column = -1; /* table columns are counted from one */ int last_x_focus = -1; /* it is used for repeated vertical cursor display */ int first_row = 0; int prev_first_row; int first_data_row; int default_freezed_cols = 1; int i; int reserved_rows = -1; /* dbcli has significant number of self reserved lines */ DataDesc desc; ScrDesc scrdesc; Options opts; int fixedRows = -1; /* detect automatically (not yet implemented option) */ FILE *fp = NULL; bool detected_format = false; bool no_alternate_screen = false; int fix_rows_offset = 0; int opt; int option_index = 0; mmask_t prev_mousemask = 0; bool quit_if_one_screen = false; int search_direction = SEARCH_FORWARD; bool redirect_mode; bool noatty; /* true, when cannot to get keys from stdin */ bool fresh_found = false; int fresh_found_cursor_col = -1; bool reinit = false; bool ignore_mouse_release = false; /* after leave menu by press ignore release too */ bool no_doupdate = false; /* when we sure stdstr refresh is useles */ bool prev_event_is_mouse_press = false; int prev_mouse_event_y = -1; int prev_mouse_event_x = -1; bool only_for_tables = false; bool no_interactive = false; bool interactive = false; bool raw_output_quit = false; bool mouse_was_initialized = false; int last_ordered_column = -1; /* order by when watch mode is active */ bool last_order_desc = false; /* true, when sort of data is descend */ long mouse_event = 0; long vertical_cursor_changed_mouse_event = 0; #ifdef DEBUG_PIPE time_t start_app_sec; long start_app_ms; bool first_doupdate = true; #endif struct winsize size; bool size_is_valid = false; int ioctl_result; bool handle_timeout = false; static struct option long_options[] = { /* These options set a flag. */ {"force-uniborder", no_argument, 0, 5}, {"help", no_argument, 0, 1}, {"hlite-search", no_argument, 0, 'g'}, {"HILITE-SEARCH", no_argument, 0, 'G'}, {"ignore-case", no_argument, 0, 'i'}, {"IGNORE-CASE", no_argument, 0, 'I'}, {"no-bars", no_argument, 0, 8}, {"no-mouse", no_argument, 0, 2}, {"no-sound", no_argument, 0, 3}, {"less-status-bar", no_argument, 0, 4}, {"no-commandbar", no_argument, 0, 6}, {"no-topbar", no_argument, 0, 7}, {"no-cursor", no_argument, 0, 10}, {"vertical-cursor", no_argument, 0, 15}, {"tabular-cursor", no_argument, 0, 11}, {"line-numbers", no_argument, 0, 9}, {"quit-if-one-screen", no_argument, 0, 'F'}, {"version", no_argument, 0, 'V'}, {"bold-labels", no_argument, 0, 12}, {"bold-cursor", no_argument, 0, 13}, {"only-for-tables", no_argument, 0, 14}, {"about", no_argument, 0, 16}, {"csv", no_argument, 0, 17}, {"double-header", no_argument, 0, 24}, {"csv-separator", required_argument, 0, 18}, {"border", required_argument, 0, 19}, {"no-sigint-exit", no_argument, 0, 21}, {"no-sigint-search-reset", no_argument, 0, 22}, {"ni", no_argument, 0, 23}, {"log", required_argument, 0, 25}, {"watch", required_argument, 0, 'w'}, {"query", required_argument, 0, 'q'}, {"host", required_argument, 0, 'h'}, {"port", required_argument, 0, 'p'}, {"password", no_argument, 0, 'W'}, {"username", required_argument, 0, 'U'}, {"dbname", required_argument, 0, 'd'}, {"file", required_argument, 0, 'f'}, {"rr", required_argument, 0, 26}, {"interactive", no_argument, 0, 27}, {"csv-header", required_argument, 0, 28}, {"ignore-short-rows", no_argument, 0, 29}, {"tsv", no_argument, 0, 30}, {"null", required_argument, 0, 31}, {0, 0, 0, 0} }; #ifdef COMPILE_MENU bool menu_is_active = false; struct ST_MENU *menu = NULL; struct ST_CMDBAR *cmdbar = NULL; #endif opts.pathname = NULL; opts.ignore_case = false; opts.ignore_lower_case = false; opts.no_sound = false; opts.no_mouse = false; opts.less_status_bar = false; opts.no_highlight_search = false; opts.force_uniborder = false; opts.force8bit = false; opts.no_commandbar = false; opts.no_topbar = false; opts.theme = 1; opts.show_rownum = false; opts.no_cursor = false; opts.vertical_cursor = false; opts.tabular_cursor = false; opts.freezed_cols = -1; /* default will be 1 if screen width will be enough */ opts.force_ascii_art = false; opts.bold_labels = false; opts.bold_cursor = false; opts.tsv_format = false; opts.csv_format = false; opts.csv_separator = -1; /* auto detection */ opts.csv_header = 'a'; /* auto detection */ opts.nullstr = ""; opts.ignore_short_rows = false; opts.double_header = false; opts.border_type = 2; /* outer border */ opts.on_sigint_exit = false; opts.no_sigint_search_reset = false; opts.query = NULL; opts.watch_time = 0; opts.host = NULL; opts.username = NULL; opts.port = NULL; opts.force_password_prompt = false; opts.password = NULL; opts.dbname = NULL; load_config(tilde("~/.pspgconf"), &opts); #ifdef DEBUG_PIPE debug_pipe = fopen(DEBUG_PIPE, "w"); setlinebuf(debug_pipe); fprintf(debug_pipe, "demo application start\n"); current_time(&start_app_sec, &start_app_ms); #endif while ((opt = getopt_long(argc, argv, "abs:c:d:f:h:p:XVFgGiIq:U:w:W", long_options, &option_index)) != -1) { int n; switch (opt) { case 1: fprintf(stderr, "pspg is a Unix pager designed for table browsing.\n\n"); fprintf(stderr, "Usage:\n"); fprintf(stderr, " %s [OPTION]\n", argv[0]); fprintf(stderr, "\nGeneral options:\n"); fprintf(stderr, " --about about authors\n"); fprintf(stderr, " --help show this help\n"); fprintf(stderr, " -V, --version show version\n\n"); fprintf(stderr, "\n"); fprintf(stderr, " -f, --file=FILE open file\n"); fprintf(stderr, " -F, --quit-if-one-screen\n"); fprintf(stderr, " quit if content is one screen\n"); fprintf(stderr, " -X don't use alternate screen\n"); fprintf(stderr, " --interactive force interactive mode\n"); fprintf(stderr, " --ni not interactive mode (only for csv and query)\n"); fprintf(stderr, " --no-mouse don't use own mouse handling\n"); fprintf(stderr, " --no-sigint-search-reset\n"); fprintf(stderr, " without reset searching on sigint (CTRL C)\n"); fprintf(stderr, " --only-for-tables use std pager when content is not table\n"); fprintf(stderr, " --on-sigint-exit without exit on sigint(CTRL C or Escape)\n"); fprintf(stderr, " --rr ROWNUM rows reserved for specific purposes\n"); fprintf(stderr, "\nOutput format options:\n"); fprintf(stderr, " -a force ascii\n"); fprintf(stderr, " -b black-white style\n"); fprintf(stderr, " -s N set color style number (0..%d)\n", MAX_STYLE); fprintf(stderr, " --bold-labels row, column labels use bold font\n"); fprintf(stderr, " --bold-cursor cursor use bold font\n"); fprintf(stderr, " --border type of borders (0..2)\n"); fprintf(stderr, " --double-header header separator uses double lines\n"); fprintf(stderr, " --force-uniborder replace ascii borders by unicode borders\n"); fprintf(stderr, " --ignore-bad-rows rows with wrong column numbers are ignored\n"); fprintf(stderr, " --null string string used instead NULL\n"); fprintf(stderr, "\nSearching options\n"); fprintf(stderr, " -g --hlite-search, -G --HILITE-SEARCH\n"); fprintf(stderr, " don't highlight lines for searches\n"); fprintf(stderr, " -i --ignore-case ignore case in searches that do not contain uppercase\n"); fprintf(stderr, " -I --IGNORE-CASE ignore case in all searches\n"); fprintf(stderr, "\nInterface options:\n"); fprintf(stderr, " -c N fix N columns (0..9)\n"); fprintf(stderr, " --less-status-bar status bar like less pager\n"); fprintf(stderr, " --line-numbers show line number column\n"); fprintf(stderr, " --no-bars, --no-commandbar, --no-topbar\n"); fprintf(stderr, " don't show bottom, top bar or both\n"); fprintf(stderr, " --no-cursor row cursor will be hidden\n"); fprintf(stderr, " --no-sound don't use beep when scroll is not possible\n"); fprintf(stderr, " --tabular-cursor cursor is visible only when data has table format\n"); fprintf(stderr, " --vertical-cursor show vertical column cursor\n"); fprintf(stderr, "\nInput format options:\n"); fprintf(stderr, " --csv input stream has csv format\n"); fprintf(stderr, " --csv-separator char used as field separator\n"); fprintf(stderr, " --csv-header [on/off] specify header line usage\n"); fprintf(stderr, " --tsv input stream has tsv format\n"); fprintf(stderr, "\nWatch mode options:\n"); fprintf(stderr, " -q, --query=QUERY execute query\n"); fprintf(stderr, " -w, --watch time the query is repeated every time (sec)\n"); fprintf(stderr, "\nConnection options\n"); fprintf(stderr, " -d, --dbname=DBNAME database name\n"); fprintf(stderr, " -h, --host=HOSTNAME database server host (default: \"local socket\")\n"); fprintf(stderr, " -p, --port=PORT database server port (default: \"5432\")\n"); fprintf(stderr, " -U, --username=USERNAME database user name\n"); fprintf(stderr, " -W, --password force password prompt\n"); fprintf(stderr, "\nDebug options:\n"); fprintf(stderr, " --log=FILE log debug info to file\n"); fprintf(stderr, "\n"); fprintf(stderr, "pspg shares lot of key commands with less pager or vi editor.\n"); exit(0); case 'a': opts.force_ascii_art = true; break; case 'I': opts.ignore_case = true; break; case 'i': opts.ignore_lower_case = true; break; case 'q': opts.query = optarg; break; case 'w': opts.watch_time = atoi(optarg); if (opts.watch_time < 0 || opts.watch_time > 3600) { fprintf(stderr, "query watch time can be between 0 and 3600\n"); exit(EXIT_FAILURE); } break; case 2: opts.no_mouse = true; break; case 3: opts.no_sound = true; break; case 4: opts.less_status_bar = true; break; case 5: opts.force_uniborder = true; break; case 6: opts.no_commandbar = true; break; case 7: opts.no_topbar = true; break; case 8: opts.no_commandbar = true; opts.no_topbar = true; break; case 9: opts.show_rownum = true; break; case 10: opts.no_cursor = true; break; case 11: opts.tabular_cursor = true; break; case 12: opts.bold_labels = true; break; case 13: opts.bold_cursor = true; break; case 14: only_for_tables = true; break; case 15: opts.vertical_cursor = true; break; case 16: fprintf(stdout, "The pspg-%s is special pager designed for databases.\n\n", PSPG_VERSION); fprintf(stdout, "Authors:\n"); fprintf(stdout, " 2017-2019 Pavel Stehule, Benesov district, Czech Republic\n\n"); fprintf(stdout, "Licence:\n"); fprintf(stdout, " Distributed under BSD licence\n\n"); exit(0); break; case 17: opts.csv_format = true; break; case 18: opts.csv_separator = *optarg; break; case 19: n = atoi(optarg); if (n < 0 || n > 2) { fprintf(stderr, "csv border type can be between 0 and 2\n"); exit(EXIT_FAILURE); } opts.border_type = n; break; case 21: opts.on_sigint_exit = true; break; case 22: opts.no_sigint_search_reset = true; break; case 23: no_interactive = true; break; case 24: opts.double_header = true; break; case 25: { const char *path; path = tilde(optarg); logfile = fopen(path, "a"); if (logfile == NULL) { fprintf(stderr, "cannot to open log file file: %s\n", path); exit(EXIT_FAILURE); } setlinebuf(logfile); } break; case 26: reserved_rows = atoi(optarg); if (reserved_rows < 1 || reserved_rows > 100) { fprintf(stderr, "reserved rows should be between 1 and 100\n"); exit(EXIT_FAILURE); } break; case 27: interactive = true; break; case 28: { if (nstreq(optarg, "off")) opts.csv_header = '-'; else if (nstreq(optarg, "on")) opts.csv_header = '+'; else { fprintf(stderr, "csv_header option can be on \"or\" \"off\"\n"); exit(EXIT_FAILURE); } } break; case 29: opts.ignore_short_rows = true; break; case 30: opts.tsv_format = true; break; case 31: opts.nullstr = strdup(optarg); break; case 'V': fprintf(stdout, "pspg-%s\n", PSPG_VERSION); #ifdef HAVE_LIBREADLINE fprintf(stdout, "with readline (version: 0x%04x)\n", RL_READLINE_VERSION); #endif #ifdef COMPILE_MENU fprintf(stdout, "with integrated menu\n"); #endif #ifdef NCURSES_VERSION fprintf(stdout, "ncurses version: %s, patch: %ld\n", NCURSES_VERSION, (long) NCURSES_VERSION_PATCH); #endif #ifdef HAVE_NCURSESW fprintf(stdout, "ncurses with wide char support\n"); #endif #ifdef NCURSES_WIDECHAR fprintf(stdout, "ncurses widechar num: %d\n", NCURSES_WIDECHAR); #endif fprintf(stdout, "wchar_t width: %d, max: %d\n", __SIZEOF_WCHAR_T__, __WCHAR_MAX__); #ifdef HAVE_POSTGRESQL fprintf(stdout, "with postgres client integration\n"); #endif exit(0); case 'X': no_alternate_screen = true; break; case 'b': opts.theme = 0; break; case 's': n = atoi(optarg); if (n < 0 || n > MAX_STYLE) { fprintf(stderr, "only color schemas 0 .. %d are supported\n", MAX_STYLE); exit(EXIT_FAILURE); } opts.theme = n; break; case 'c': n = atoi(optarg); if (n < 0 || n > 9) { fprintf(stderr, "fixed columns should be between 0 and 4\n"); exit(EXIT_FAILURE); } opts.freezed_cols = n; break; case 'f': { char *path = tilde(optarg); fp = fopen(path, "r"); if (fp == NULL) { fprintf(stderr, "cannot to read file: %s\n", path); exit(EXIT_FAILURE); } opts.pathname = strdup(optarg); } break; case 'F': quit_if_one_screen = true; break; case 'g': opts.no_highlight_lines = true; break; case 'G': opts.no_highlight_search = true; break; case 'h': opts.host = strdup(optarg); break; case 'p': { long port; port = strtol(optarg, NULL, 10); if ((port < 1) || (port > 65535)) { fprintf(stderr, "invalid port number: %s\n", optarg); exit(EXIT_FAILURE); } opts.port = strdup(optarg); } break; case 'U': opts.username = strdup(optarg); break; case 'W': opts.force_password_prompt = true; break; case 'd': opts.dbname = strdup(optarg); break; default: fprintf(stderr, "Try %s --help\n", argv[0]); exit(EXIT_FAILURE); } } if (opts.watch_time && !(opts.query || opts.pathname)) { fprintf(stderr, "cannot use watch mode when query or file is missing\n"); exit(EXIT_FAILURE); } if (no_interactive && interactive) { fprintf(stderr, "option --ni and --interactive cannot be used together\n"); exit(EXIT_FAILURE); } if (opts.query && opts.pathname) { fprintf(stderr, "option --query and --file cannot be used together\n"); exit(EXIT_FAILURE); } if (opts.csv_format && opts.tsv_format) { fprintf(stderr, "option --csv and --tsv cannot be used together\n"); exit(EXIT_FAILURE); } if (opts.less_status_bar) opts.no_topbar = true; setlocale(LC_ALL, ""); /* Don't use UTF when terminal doesn't use UTF */ opts.force8bit = strcmp(nl_langinfo(CODESET), "UTF-8") != 0; if (logfile) { print_log_prefix(logfile); fprintf(logfile, "started\n"); } if (opts.csv_format || opts.tsv_format || opts.query) { /* * ToDo: first query can be broken too in watch mode. */ if (!read_and_format(fp, &opts, &desc, &err)) { fprintf(stderr, "%s\n", err); exit(EXIT_FAILURE); } } else readfile(fp, &opts, &desc); if (opts.watch_time > 0) { current_time(&last_watch_sec, &last_watch_ms); next_watch = last_watch_sec * 1000 + last_watch_ms + opts.watch_time * 1000; } if (fp != NULL) { fclose(fp); fp = NULL; } if (logfile) { print_log_prefix(logfile); fprintf(logfile, "read input %d rows\n", desc.total_rows); } if ((opts.csv_format || opts.tsv_format || opts.query) && (no_interactive || (!interactive && !isatty(STDOUT_FILENO)))) { LineBuffer *lnb = &desc.rows; int lnb_row = 0; /* write formatted data to stdout and quit */ while (lnb) { while (lnb_row < lnb->nrows) fprintf(stdout, "%s\n", lnb->rows[lnb_row++]); lnb = lnb->next; lnb_row = 0; } return 0; } if (desc.headline) (void) translate_headline(&opts, &desc); detected_format = desc.headline_transl; if (detected_format && desc.oid_name_table) default_freezed_cols = 2; /* * The issue #75 - COLUMNS, LINES are not correctly initialized. * Get real terminal size, and refresh ncurses data. */ if ((ioctl_result = ioctl(STDOUT_FILENO, TIOCGWINSZ, (char *) &size)) >= 0) { size_is_valid = true; if (logfile) { print_log_prefix(logfile); fprintf(logfile, "terminal size by TIOCGWINSZ rows: %d, cols: %d\n", size.ws_row, size.ws_col); } } else { if (logfile) { print_log_prefix(logfile); fprintf(logfile, "cannot to detect terminal size via TIOCGWINSZ: res: %d\n", ioctl_result); } } /* When we know terminal dimensions */ if (size_is_valid && quit_if_one_screen) { int available_rows = size.ws_row; if (reserved_rows != -1) available_rows -= reserved_rows; /* the content can be displayed in one screen */ if (available_rows >= desc.last_row && size.ws_col > desc.maxx) { LineBuffer *lnb = &desc.rows; int lnb_row = 0; endwin(); while (lnb_row < lnb->nrows) printf("%s\n", lnb->rows[lnb_row++]); if (logfile) { print_log_prefix(logfile); fprintf(logfile, "quit due quit_if_one_screen option without ncurses init\n"); } return 0; } } if (!detected_format && only_for_tables) { const char *pagerprog; FILE *fout = NULL; LineBuffer *lnb = &desc.rows; int lnb_row = 0; pagerprog = getenv("PSPG_PAGER"); if (!pagerprog) pagerprog = getenv("PAGER"); if (!pagerprog) pagerprog = "more"; else { /* if PAGER is empty or all-white-space, don't use pager */ if (strspn(pagerprog, " \t\r\n") == strlen(pagerprog)) fout = stdout; } if (!fout) { fout = popen(pagerprog, "w"); if (!fout) { /* if popen fails, silently proceed without pager */ fout = stdout; } } if (fout != stdout) { signal(SIGPIPE, SIG_IGN); signal(SIGINT, SIG_IGN); } while (lnb) { while (lnb_row < lnb->nrows) { int r; r = fprintf(fout, "%s\n", lnb->rows[lnb_row++]); if (r < 0) goto exit_while_01; } lnb = lnb->next; lnb_row = 0; } exit_while_01: if (fout != stdout) pclose(fout); if (logfile) { print_log_prefix(logfile); fprintf(logfile, "exit without start ncurses\n"); fclose(logfile); } return 0; } if (!isatty(fileno(stdin))) { if (freopen("/dev/tty", "r", stdin) != NULL) noatty = false; else if (freopen(ttyname(fileno(stdout)), "r", stdin) != NULL) noatty = false; else { /* * cannot to reopen terminal device. See discussion to issue #35 * fallback solution - read keys directly from stderr. Just check * it it is possible. */ if (!isatty(fileno(stderr))) { fprintf(stderr, "missing a access to terminal device\n"); exit(EXIT_FAILURE); } noatty = true; fclose(stdin); } } else noatty = false; signal(SIGINT, SigintHandler); atexit(exit_ncurses); if (noatty) /* use stderr like stdin. This is fallback solution used by less */ newterm(termname(), stdout, stderr); else initscr(); if (logfile) { print_log_prefix(logfile); fprintf(logfile, "ncurses started\n"); } active_ncurses = true; if(!has_colors()) leave_ncurses("your terminal does not support color"); start_color(); reinit_theme: initialize_color_pairs(opts.theme, opts.bold_labels, opts.bold_cursor); timeout(1000); cbreak(); keypad(stdscr, TRUE); curs_set(0); noecho(); wbkgdset(stdscr, COLOR_PAIR(1)); #ifdef NCURSES_EXT_FUNCS set_escdelay(25); #endif initialize_special_keycodes(); if (!opts.no_mouse) { mouse_was_initialized = true; mouseinterval(0); #if NCURSES_MOUSE_VERSION > 1 mousemask(BUTTON1_PRESSED | BUTTON1_RELEASED | BUTTON4_PRESSED | BUTTON5_PRESSED | BUTTON_ALT, NULL); #else mousemask(BUTTON1_PRESSED | BUTTON1_RELEASED, NULL); #endif } if (desc.headline_transl != NULL && !desc.is_expanded_mode) { if (desc.border_head_row != -1) desc.first_data_row = desc.border_head_row + 1; } else if (desc.title_rows > 0 && desc.is_expanded_mode) desc.first_data_row = desc.title_rows; else { desc.first_data_row = 0; desc.last_data_row = desc.last_row; desc.title_rows = 0; desc.title[0] = '\0'; } first_data_row = desc.first_data_row; trim_footer_rows(&opts, &desc); if (reinit) { ScrDesc aux; int i; /* we should to save searching related data from scrdesc */ memcpy(&aux, &scrdesc, sizeof(ScrDesc)); for (i = 0; i < 9; i++) if (scrdesc.wins[i]) delwin(scrdesc.wins[i]); memset(&scrdesc, 0, sizeof(ScrDesc)); MergeScrDesc(&scrdesc, &aux); } else memset(&scrdesc, 0, sizeof(ScrDesc)); initialize_theme(opts.theme, WINDOW_TOP_BAR, desc.headline_transl != NULL, false, &scrdesc.themes[WINDOW_TOP_BAR]); initialize_theme(opts.theme, WINDOW_BOTTOM_BAR, desc.headline_transl != NULL, false, &scrdesc.themes[WINDOW_BOTTOM_BAR]); if (size_is_valid) resize_term(size.ws_row, size.ws_col); clear(); refresh_aux_windows(&opts, &scrdesc, &desc); getmaxyx(stdscr, maxy, maxx); if (logfile) { print_log_prefix(logfile); fprintf(logfile, "screen size - maxy: %d, maxx: %d\n", maxy, maxx); } if (quit_if_one_screen) { int available_rows = maxy; if (reserved_rows != -1) available_rows -= reserved_rows; /* the content can be displayed in one screen */ if (available_rows >= desc.last_row && maxx >= desc.maxx) { LineBuffer *lnb = &desc.rows; int lnb_row = 0; endwin(); while (lnb_row < lnb->nrows) printf("%s\n", lnb->rows[lnb_row++]); if (logfile) { print_log_prefix(logfile); fprintf(logfile, "ncurses ended and quit due quit_if_one_screen option\n"); } return 0; } } /* some corrections */ if (detected_format) { if (desc.is_expanded_mode) { if (strchr(desc.headline_transl,'I') == NULL) { char *str = desc.rows.rows[desc.title_rows + 1]; int pos = 0; /* fallback point, didn't find separator already */ while (pos < 40) { if ((desc.linestyle == 'a' && *str == '|' && pos > 1) || (desc.linestyle == 'u' && pos > 1 && (strncmp(str, /* │ */ "\342\224\202", 3) == 0 || strncmp(str, /* ║ */ "\342\225\221", 3) == 0))) { desc.headline_transl[pos] = 'I'; break; } pos += 1; str += opts.force8bit ? 1 : utf8charlen(*str); } } } else { if (desc.border_type != 2) { if (desc.border_bottom_row == -1 && desc.footer_row == -1) { if (desc.alt_footer_row != -1 && desc.border_type == 1) { desc.footer_row = desc.alt_footer_row; desc.last_data_row = desc.footer_row - 1; } else { /* fallback */ desc.last_data_row = desc.last_row - 1; desc.footer_row = desc.last_row; } } trim_footer_rows(&opts, &desc); } } } if (opts.tabular_cursor && !opts.no_cursor) opts.no_cursor = desc.headline_transl == NULL; /* run this part only once, don't repeat it when theme is reinitialized */ if (opts.vertical_cursor && desc.columns > 0 && vertical_cursor_column == -1) { int freezed_cols = opts.freezed_cols != -1 ? opts.freezed_cols : default_freezed_cols; /* The position of vertical cursor should be set */ if (freezed_cols + 1 <= desc.columns) vertical_cursor_column = freezed_cols + 1; else vertical_cursor_column = 1; /* in this moment, there are not any vertical offset, calculation is simple */ last_x_focus = get_x_focus(vertical_cursor_column, cursor_col, &desc, &scrdesc); } initialize_theme(opts.theme, WINDOW_ROWNUM_LUC, desc.headline_transl != NULL, opts.no_highlight_lines, &scrdesc.themes[WINDOW_ROWNUM_LUC]); initialize_theme(opts.theme, WINDOW_ROWNUM, desc.headline_transl != NULL, opts.no_highlight_lines, &scrdesc.themes[WINDOW_ROWNUM]); create_layout_dimensions(&opts, &scrdesc, &desc, opts.freezed_cols != -1 ? opts.freezed_cols : default_freezed_cols, fixedRows, maxy, maxx); create_layout(&opts, &scrdesc, &desc, first_data_row, first_row); initialize_theme(opts.theme, WINDOW_LUC, desc.headline_transl != NULL, opts.no_highlight_lines, &scrdesc.themes[WINDOW_LUC]); initialize_theme(opts.theme, WINDOW_FIX_ROWS, desc.headline_transl != NULL, opts.no_highlight_lines, &scrdesc.themes[WINDOW_FIX_ROWS]); initialize_theme(opts.theme, WINDOW_FIX_COLS, desc.headline_transl != NULL, opts.no_highlight_lines, &scrdesc.themes[WINDOW_FIX_COLS]); initialize_theme(opts.theme, WINDOW_ROWS, desc.headline_transl != NULL, opts.no_highlight_lines, &scrdesc.themes[WINDOW_ROWS]); initialize_theme(opts.theme, WINDOW_FOOTER, desc.headline_transl != NULL, opts.no_highlight_lines, &scrdesc.themes[WINDOW_FOOTER]); print_status(&opts, &scrdesc, &desc, cursor_row, cursor_col, first_row, 0, vertical_cursor_column); /* initialize readline if it is active */ #ifdef HAVE_LIBREADLINE rl_catch_signals = 0; rl_catch_sigwinch = 0; rl_deprep_term_function = NULL; rl_prep_term_function = NULL; last_row_search[0] = '\0'; last_col_search[0] = '\0'; last_line[0] = '\0'; last_path[0] = '\0'; #if RL_READLINE_VERSION > 0x0603 rl_change_environment = 0; #endif rl_inhibit_completion = 1; #ifdef HAVE_READLINE_HISTORY if (!reinit) read_history(tilde("~/.pspg_history")); last_history[0] = '\0'; #endif #endif #ifdef COMPILE_MENU init_menu_config(&opts); if (!opts.less_status_bar && !opts.no_commandbar) cmdbar = init_cmdbar(cmdbar); #endif while (true) { bool refresh_scr = false; bool resize_scr = false; bool after_freeze_signal = false; bool recheck_vertical_cursor_visibility = false; #ifdef DEBUG_PIPE time_t start_draw_sec; long start_draw_ms; #endif fix_rows_offset = desc.fixed_rows - scrdesc.fix_rows_rows; /* * Next code allows to inject event, and later process original event again. * It is used for reuse mouse event: 1. replace top bar by menubar, 2. activate * field on menubar - possibly pulldown menu. Following code holds event one * iteration. */ if (reuse_event) { /* unfortunately, gcc raises false warning here -Wmaybe-uninitialized */ if (prev_event_keycode == 0) { prev_event_keycode = event_keycode; } else { next_event_keycode = prev_event_keycode; reuse_event = false; prev_event_keycode = 0; } } /* * Draw windows, only when function (key) redirect was not forced. * Redirect emmit immediate redraw. */ if (next_command == cmd_Invalid) { if (!no_doupdate && !handle_timeout) { int vcursor_xmin_fix = -1; int vcursor_xmax_fix = -1; int vcursor_xmin_data = -1; int vcursor_xmax_data = -1; if (opts.vertical_cursor && desc.columns > 0 && vertical_cursor_column > 0) { int vcursor_xmin = desc.cranges[vertical_cursor_column - 1].xmin; int vcursor_xmax = desc.cranges[vertical_cursor_column - 1].xmax; if (vcursor_xmin < scrdesc.fix_cols_cols) { vcursor_xmin_fix = vcursor_xmin; vcursor_xmin_data = vcursor_xmin - scrdesc.fix_cols_cols; } else { vcursor_xmin_fix = vcursor_xmin - cursor_col; vcursor_xmin_data = vcursor_xmin - scrdesc.fix_cols_cols - cursor_col; } if (vcursor_xmax < scrdesc.fix_cols_cols) { vcursor_xmax_fix = vcursor_xmax; vcursor_xmax_data = vcursor_xmax - scrdesc.fix_cols_cols; } else { vcursor_xmax_fix = vcursor_xmax - cursor_col; vcursor_xmax_data = vcursor_xmax - scrdesc.fix_cols_cols - cursor_col; } /* * When vertical cursor is not in freezed columns, then it cannot to * overwrite fixed col cols. Only last char position can be shared. */ if (vertical_cursor_column > (opts.freezed_cols > -1 ? opts.freezed_cols : default_freezed_cols)) if (vcursor_xmin_fix < scrdesc.fix_cols_cols - 1) vcursor_xmin_fix = scrdesc.fix_cols_cols - 1; } #ifdef DEBUG_PIPE current_time(&start_draw_sec, &start_draw_ms); #endif window_fill(WINDOW_LUC, desc.title_rows + desc.fixed_rows - scrdesc.fix_rows_rows, 0, -1, vcursor_xmin_fix, vcursor_xmax_fix, &desc, &scrdesc, &opts); window_fill(WINDOW_ROWS, first_data_row + first_row - fix_rows_offset, scrdesc.fix_cols_cols + cursor_col, cursor_row - first_row + fix_rows_offset, vcursor_xmin_data, vcursor_xmax_data, &desc, &scrdesc, &opts); window_fill(WINDOW_FIX_COLS, first_data_row + first_row - fix_rows_offset, 0, cursor_row - first_row + fix_rows_offset, vcursor_xmin_fix, vcursor_xmax_fix, &desc, &scrdesc, &opts); window_fill(WINDOW_FIX_ROWS, desc.title_rows + desc.fixed_rows - scrdesc.fix_rows_rows, scrdesc.fix_cols_cols + cursor_col, -1, vcursor_xmin_data, vcursor_xmax_data, &desc, &scrdesc, &opts); window_fill(WINDOW_FOOTER, first_data_row + first_row + scrdesc.rows_rows - fix_rows_offset, footer_cursor_col, cursor_row - first_row - scrdesc.rows_rows + fix_rows_offset, -1, -1, &desc, &scrdesc, &opts); window_fill(WINDOW_ROWNUM_LUC, 0, 0, 0, -1, -1, &desc, &scrdesc, &opts); window_fill(WINDOW_ROWNUM, first_data_row + first_row - fix_rows_offset, 0, cursor_row - first_row + fix_rows_offset, -1, -1, &desc, &scrdesc, &opts); if (w_luc(&scrdesc)) wnoutrefresh(w_luc(&scrdesc)); if (w_rows(&scrdesc)) wnoutrefresh(w_rows(&scrdesc)); if (w_fix_cols(&scrdesc)) wnoutrefresh(w_fix_cols(&scrdesc)); if (w_fix_rows(&scrdesc)) wnoutrefresh(w_fix_rows(&scrdesc)); if (w_footer(&scrdesc)) wnoutrefresh(w_footer(&scrdesc)); if (w_rownum(&scrdesc)) wnoutrefresh(w_rownum(&scrdesc)); if (w_rownum_luc(&scrdesc)) wnoutrefresh(w_rownum_luc(&scrdesc)); #ifdef DEBUG_PIPE print_duration(start_draw_sec, start_draw_ms, "draw time"); #endif } /* !no_doupdate */ #ifdef COMPILE_MENU if (cmdbar) st_cmdbar_post(cmdbar); if (menu != NULL && menu_is_active) { st_menu_post(menu); st_menu_set_focus(menu, ST_MENU_FOCUS_FULL); } #endif if (no_doupdate) no_doupdate = false; else if (next_command == 0 || scrdesc.fmt != NULL) { doupdate(); #ifdef DEBUG_PIPE if (first_doupdate) { first_doupdate = false; print_duration(start_app_sec, start_app_ms, "first view"); } #endif } if (scrdesc.fmt != NULL) { next_event_keycode = show_info_wait(&opts, &scrdesc, scrdesc.fmt, scrdesc.par, scrdesc.beep, false, scrdesc.applytimeout, scrdesc.is_error); if (scrdesc.fmt != NULL) { free(scrdesc.fmt); scrdesc.fmt = NULL; } if (scrdesc.par != NULL) { free(scrdesc.par); scrdesc.par = NULL; } refresh_aux_windows(&opts, &scrdesc, &desc); continue; } if (next_event_keycode != 0) { event_keycode = next_event_keycode; next_event_keycode = 0; } else { /* * Store previous event, if this event is mouse press. With it we * can join following mouse release together, and reduce useles * refresh. */ if (event_keycode == KEY_MOUSE && event.bstate == BUTTON1_PRESSED) { prev_event_is_mouse_press = true; prev_mouse_event_y = event.y; prev_mouse_event_x = event.x; } else prev_event_is_mouse_press = false; event_keycode = get_event(&event, &press_alt, &got_sigint, &handle_timeout, opts.watch_time > 0 ? 1000 : -1); if (opts.watch_time) { long ms; time_t sec; long ct; current_time(&sec, &ms); ct = sec * 1000 + ms; if (ct > next_watch && !paused) { FILE *fp2 = NULL; DataDesc desc2; bool fresh_data = false; if (opts.pathname) { char *path = tilde(opts.pathname); errno = 0; fp2 = fopen(path, "r"); if (fp2 == NULL) { err = strerror(errno); fresh_data = false; } else fresh_data = true; } if (opts.csv_format || opts.tsv_format || opts.query) fresh_data = read_and_format(fp2, &opts, &desc2, &err); else readfile(fp2, &opts, &desc2); if (fresh_data) { int max_cursor_row; int max_first_row; ScrDesc aux; DataDescFree(&desc); memcpy(&desc, &desc2, sizeof(desc)); if (desc.headline) (void) translate_headline(&opts, &desc); if (desc.headline_transl != NULL && !desc.is_expanded_mode) { if (desc.border_head_row != -1) desc.first_data_row = desc.border_head_row + 1; } else if (desc.title_rows > 0 && desc.is_expanded_mode) desc.first_data_row = desc.title_rows; else { desc.first_data_row = 0; desc.last_data_row = desc.last_row; desc.title_rows = 0; desc.title[0] = '\0'; } detected_format = desc.headline_transl; if (detected_format && desc.oid_name_table) default_freezed_cols = 2; /* we should to save searching related data from scrdesc */ memcpy(&aux, &scrdesc, sizeof(ScrDesc)); create_layout_dimensions(&opts, &scrdesc, &desc, opts.freezed_cols != -1 ? opts.freezed_cols : default_freezed_cols, fixedRows, maxy, maxx); create_layout(&opts, &scrdesc, &desc, first_data_row, first_row); MergeScrDesc(&scrdesc, &aux); /* new result can have different number of row, check cursor */ max_cursor_row = MAX_CURSOR_ROW; cursor_row = cursor_row > max_cursor_row ? max_cursor_row : cursor_row; if (cursor_row - first_row + 1 > VISIBLE_DATA_ROWS) first_row = cursor_row - VISIBLE_DATA_ROWS + 1; max_first_row = MAX_FIRST_ROW; max_first_row = max_first_row < 0 ? 0 : max_first_row; first_row = first_row > max_first_row ? max_first_row : first_row; last_watch_sec = sec; last_watch_ms = ms; if (last_ordered_column != -1) update_order_map(&opts, &scrdesc, &desc, last_ordered_column, last_order_desc); } else DataDescFree(&desc2); if ((ct - next_watch) < (opts.watch_time * 1000)) next_watch = next_watch + 1000 * opts.watch_time; else next_watch = ct + 100 * opts.watch_time; clear(); refresh_scr = true; handle_timeout = false; } print_status(&opts, &scrdesc, &desc, cursor_row, cursor_col, first_row, fix_rows_offset, vertical_cursor_column); if (scrdesc.wins[WINDOW_TOP_BAR]) wrefresh(scrdesc.wins[WINDOW_TOP_BAR]); } /* the comment for ignore_mouse_release follow */ if (ignore_mouse_release) { ignore_mouse_release = false; if (event_keycode == KEY_MOUSE && event.bstate & event.bstate & BUTTON1_RELEASED) { no_doupdate = true; continue; } } } redirect_mode = false; } else { command = next_command; next_command = cmd_Invalid; redirect_mode = true; no_doupdate = false; } /* Exit immediately on F10 or input error */ if (got_sigint) { if (!opts.no_sigint_search_reset && (*scrdesc.searchterm || *scrdesc.searchcolterm)) { *scrdesc.searchterm = '\0'; *scrdesc.searchcolterm = '\0'; scrdesc.searchterm_size = 0; scrdesc.searchterm_char_size = 0; reset_searching_lineinfo(&desc.rows); } else { if (opts.on_sigint_exit) break; else show_info_wait(&opts, &scrdesc, " For quit press \"q\" (or use on-sigint-exit option).", NULL, true, true, true, false); } } else if ((event_keycode == ERR || event_keycode == KEY_F(10)) && !redirect_mode) { #ifdef DEBUG_PIPE fprintf(debug_pipe, "exit main loop: %s\n", event_keycode == ERR ? "input error" : "F10"); #endif if (logfile) { print_log_prefix(logfile); fprintf(logfile, "exit main loop: %s\n", event_keycode == ERR ? "input error" : "F10"); } break; } #ifndef COMPILE_MENU if (!redirect_mode) { translated_command_history = translated_command; command = translate_event(event_keycode, press_alt, opts.watch_time > 0 ? true : false); translated_command = command; } #else /* * Don't send RESIZE to menu. It cannot to handle this event, and it * cannot to translate this event. This event is lost in menu. * So, don't do it. */ if (!redirect_mode && event_keycode != KEY_RESIZE) { bool processed = false; bool activated = false; ST_MENU_ITEM *ami; ST_CMDBAR_ITEM *aci; processed = st_menu_driver(menu, event_keycode, press_alt, &event); if (processed) { ami = st_menu_selected_item(&activated); if (activated) { next_command = ami->code; goto hide_menu; } aci = st_menu_selected_command(&activated); if (activated) { next_command = aci->code; goto refresh; } } if (menu_is_active && !processed && (event_keycode == ST_MENU_ESCAPE || event_keycode == KEY_MOUSE)) { hide_menu: st_menu_unpost(menu, true); menu_is_active = false; st_menu_set_focus(menu, ST_MENU_FOCUS_NONE); /* * When we leave menu due mouse action, and this mouse action * is button1 press, then we would to ignore button1 release. * The behave is consistent for this mouse click (press, release). */ if (event_keycode == KEY_MOUSE && event.bstate & event.bstate & BUTTON1_PRESSED) ignore_mouse_release = true; goto refresh; } if (!processed) { translated_command_history = translated_command; command = translate_event(event_keycode, press_alt, opts.watch_time > 0 ? true : false); translated_command = command; } else continue; } else { if (!redirect_mode) { translated_command_history = translated_command; command = translate_event(event_keycode, press_alt, opts.watch_time > 0 ? true : false); translated_command = command; } } #endif prev_first_row = first_row; #ifdef DEBUG_PIPE fprintf(debug_pipe, "main switch: %s\n", cmd_string(command)); #endif if (logfile) { print_log_prefix(logfile); fprintf(logfile, "process command: %s\n", cmd_string(command)); } if (command == cmd_Quit) break; else if (command == cmd_Invalid) continue; else if (command == cmd_RawOutputQuit) { raw_output_quit = true; break; } else if (command == cmd_Escape) { /* same like sigterm handling */ if (!opts.no_sigint_search_reset && (*scrdesc.searchterm || *scrdesc.searchcolterm)) { *scrdesc.searchterm = '\0'; *scrdesc.searchcolterm = '\0'; scrdesc.searchterm_size = 0; scrdesc.searchterm_char_size = 0; reset_searching_lineinfo(&desc.rows); } else { if (opts.on_sigint_exit) break; else show_info_wait(&opts, &scrdesc, " For quit press \"q\" (or use on-sigint-exit option).", NULL, true, true, true, false); } } switch (command) { #ifdef COMPILE_MENU case cmd_ShowMenu: { if (menu == NULL || reinit) { st_menu_set_desktop_window(stdscr); init_menu_config(&opts); menu = init_menu(menu); } st_menu_set_focus(menu, ST_MENU_FOCUS_FULL); post_menu(&opts, menu); menu_is_active = true; continue; } #endif case cmd_NoHighlight: opts.no_highlight_search = true; opts.no_highlight_lines = false; goto reset_search; case cmd_HighlightValues: opts.no_highlight_search = false; opts.no_highlight_lines = true; goto reset_search; case cmd_HighlightLines: opts.no_highlight_search = false; opts.no_highlight_lines = false; goto reset_search; case cmd_CISearchSet: opts.ignore_lower_case = false; opts.ignore_case = true; goto reset_search; case cmd_USSearchSet: opts.ignore_lower_case = true; opts.ignore_case = false; goto reset_search; case cmd_CSSearchSet: opts.ignore_lower_case = false; opts.ignore_case = false; reset_search: scrdesc.searchterm[0] = '\0'; scrdesc.searchterm_size = 0; scrdesc.searchterm_char_size = 0; reset_searching_lineinfo(&desc.rows); break; case cmd_ShowTopBar: opts.no_topbar = !opts.no_topbar; refresh_scr = true; break; case cmd_ShowBottomBar: opts.no_commandbar = !opts.no_commandbar; if (opts.no_commandbar) { if (cmdbar) { st_cmdbar_unpost(cmdbar); st_cmdbar_free(cmdbar); cmdbar = NULL; } } else if (!opts.less_status_bar) cmdbar = init_cmdbar(cmdbar); refresh_scr = true; break; case cmd_RowNumToggle: opts.show_rownum = !opts.show_rownum; refresh_scr = true; break; case cmd_UtfArtToggle: opts.force_uniborder = !opts.force_uniborder; refresh_scr = true; break; case cmd_MenuAsciiArtToggle: opts.force_ascii_art = !opts.force_ascii_art; reinit = true; goto reinit_theme; case cmd_SoundToggle: opts.no_sound = !opts.no_sound; break; case cmd_SaveSetup: if (!save_config(tilde("~/.pspgconf"), &opts)) { if (errno != 0) show_info_wait(&opts, &scrdesc, " Cannot write to ~/.pspgconf (%s) (press any key)", strerror(errno), true, true, false, true); else show_info_wait(&opts, &scrdesc, " Cannot write to ~/.pspgconf (press any key)", NULL, true, true, false, true); } else show_info_wait(&opts, &scrdesc, " Setup saved to ~/.pspgconf", NULL, true, true, true, false); break; case cmd_SetTheme_MidnightBlack: case cmd_SetTheme_Midnight: case cmd_SetTheme_Foxpro: case cmd_SetTheme_Pdmenu: case cmd_SetTheme_White: case cmd_SetTheme_Mutt: case cmd_SetTheme_Pcfand: case cmd_SetTheme_Green: case cmd_SetTheme_Blue: case cmd_SetTheme_WP: case cmd_SetTheme_Lowcontrast: case cmd_SetTheme_Darkcyan: case cmd_SetTheme_Paradox: case cmd_SetTheme_DBase: case cmd_SetTheme_DBasemagenta: case cmd_SetTheme_Red: case cmd_SetTheme_Simple: case cmd_SetTheme_SolarDark: case cmd_SetTheme_SolarLight: case cmd_SetTheme_GruvboxLight: case cmd_SetTheme_TaoLight: opts.theme = cmd_get_theme(command); reinit = true; goto reinit_theme; case cmd_BoldLabelsToggle: opts.bold_labels = !opts.bold_labels; reinit = true; goto reinit_theme; case cmd_BoldCursorToggle: opts.bold_cursor = !opts.bold_cursor; reinit = true; goto reinit_theme; case cmd_MouseToggle: { if (!opts.no_mouse) { mousemask(0, &prev_mousemask); opts.no_mouse = true; } else { if (!mouse_was_initialized) { mouseinterval(0); #if NCURSES_MOUSE_VERSION > 1 mousemask(BUTTON1_PRESSED | BUTTON1_RELEASED | BUTTON4_PRESSED | BUTTON5_PRESSED | BUTTON_ALT, NULL); #else mousemask(BUTTON1_PRESSED | BUTTON1_RELEASED, NULL); #endif mouse_was_initialized = true; } else mousemask(prev_mousemask, NULL); opts.no_mouse= false; } show_info_wait(&opts, &scrdesc, " mouse handling: %s ", opts.no_mouse ? "off" : "on", false, true, true, false); break; } case cmd_ShowCursor: opts.no_cursor = !opts.no_cursor; refresh_scr = true; break; case cmd_ShowVerticalCursor: { if (desc.columns == 0) { show_info_wait(&opts, &scrdesc, " Vertical cursor is available only for tables.", NULL, true, true, true, false); break; } opts.vertical_cursor = !opts.vertical_cursor; if (opts.vertical_cursor) { int i; int xpoint; int prev_command = translated_command_history; if (scrdesc.found && ( prev_command == cmd_SearchPrev || prev_command == cmd_SearchNext || prev_command == cmd_ForwardSearch || prev_command == cmd_BackwardSearch)) { /* * When immediately previous command was some search command, try to * set vertical cursor by searching result. */ for (i = 0; i < desc.columns; i++) { if (desc.cranges[i].xmin <= scrdesc.found_start_x && scrdesc.found_start_x < desc.cranges[i].xmax) { vertical_cursor_column = i + 1; last_x_focus = get_x_focus(vertical_cursor_column, cursor_col, &desc, &scrdesc); break; } } } if (last_x_focus == -1) { /* try to find first visible columns after fixed columns */ last_x_focus = scrdesc.fix_cols_cols; } if (last_x_focus >= scrdesc.fix_cols_cols - 1) xpoint = last_x_focus + cursor_col; else xpoint = last_x_focus; for (i = 0; i < desc.columns; i++) { if (desc.cranges[i].xmin <= xpoint && desc.cranges[i].xmax > xpoint) { vertical_cursor_column = i + 1; if (vertical_cursor_column > (opts.freezed_cols > -1 ? opts.freezed_cols : default_freezed_cols)) { if (desc.cranges[i].xmax > scrdesc.main_maxx + cursor_col) { cursor_col = desc.cranges[i].xmax - scrdesc.main_maxx; } else if (desc.cranges[i].xmin < scrdesc.fix_cols_cols + cursor_col) { cursor_col = desc.cranges[i].xmin - scrdesc.fix_cols_cols + 1; } } break; } } } refresh_scr = true; } break; case cmd_FlushBookmarks: { LineBuffer *lnb = &desc.rows; int rownum_cursor_row; while (lnb != NULL) { if (lnb->lineinfo != NULL) { rownum_cursor_row = 0; while (rownum_cursor_row < lnb->nrows) { if ((lnb->lineinfo[rownum_cursor_row].mask & LINEINFO_BOOKMARK) != 0) lnb->lineinfo[rownum_cursor_row].mask ^= LINEINFO_BOOKMARK; rownum_cursor_row += 1; } } lnb = lnb->next; } } break; case cmd_ToggleBookmark: { LineBuffer *lnb = &desc.rows; int lnb_row; int _cursor_row = cursor_row + scrdesc.fix_rows_rows + desc.title_rows + fix_rows_offset; if (desc.order_map) { lnb = desc.order_map[_cursor_row].lnb; lnb_row = desc.order_map[_cursor_row].lnb_row; } else { /* skip first x LineBuffers */ while (_cursor_row > 1000) { lnb = lnb->next; _cursor_row -= 1000; } lnb_row = _cursor_row; } if (lnb->lineinfo == NULL) { lnb->lineinfo = malloc(1000 * sizeof(LineInfo)); if (lnb->lineinfo == NULL) leave_ncurses("out of memory"); memset(lnb->lineinfo, 0, 1000 * sizeof(LineInfo)); } lnb->lineinfo[lnb_row].mask ^= LINEINFO_BOOKMARK; } break; case cmd_PrevBookmark: { LineBuffer *lnb = &desc.rows; int rownum_cursor_row; int rownum = 0; bool found = false; /* start from previous line before cursor */ rownum_cursor_row = cursor_row + CURSOR_ROW_OFFSET - 1; if (rownum_cursor_row >= 0) { if (desc.order_map) { while (rownum_cursor_row >= 0) { MappedLine *mp = &desc.order_map[rownum_cursor_row]; if (mp->lnb->lineinfo) { if ((mp->lnb->lineinfo[mp->lnb_row].mask & LINEINFO_BOOKMARK) != 0) { found = true; rownum = rownum_cursor_row; goto exit_search_prev_bookmark; } } rownum_cursor_row -= 1; } } else { /* skip first x LineBuffers */ while (rownum_cursor_row >= 1000 && lnb != NULL) { lnb = lnb->next; rownum_cursor_row -= 1000; rownum += 1000; } rownum += rownum_cursor_row; while (lnb != NULL) { if (lnb->lineinfo != NULL) { if (rownum_cursor_row < 0) rownum_cursor_row = lnb->nrows - 1; while (rownum_cursor_row >= 0) { if ((lnb->lineinfo[rownum_cursor_row].mask & LINEINFO_BOOKMARK) != 0) { found = true; goto exit_search_prev_bookmark; } rownum -= 1; rownum_cursor_row -= 1; } } else rownum -= 1000; lnb = lnb->prev; } } } exit_search_prev_bookmark: if (found) { cursor_row = rownum - CURSOR_ROW_OFFSET; if (cursor_row < first_row) first_row = cursor_row; } else make_beep(&opts); } break; case cmd_NextBookmark: { LineBuffer *lnb = &desc.rows; int rownum_cursor_row; int rownum = 0; bool found = false; /* start after (next line) cursor line */ rownum_cursor_row = cursor_row + CURSOR_ROW_OFFSET + 1; if (desc.order_map) { while (rownum_cursor_row < desc.total_rows) { MappedLine *mp = &desc.order_map[rownum_cursor_row]; if (mp->lnb->lineinfo) { if ((mp->lnb->lineinfo[mp->lnb_row].mask & LINEINFO_BOOKMARK) != 0) { found = true; rownum = rownum_cursor_row; goto exit_search_next_bookmark; } } rownum_cursor_row += 1; } } else { /* skip first x LineBuffers */ while (rownum_cursor_row >= 1000 && lnb != NULL) { lnb = lnb->next; rownum_cursor_row -= 1000; rownum += 1000; } rownum += rownum_cursor_row; while (lnb != NULL) { if (lnb->lineinfo != NULL) { while (rownum_cursor_row < lnb->nrows) { if ((lnb->lineinfo[rownum_cursor_row].mask & LINEINFO_BOOKMARK) != 0) { found = true; goto exit_search_next_bookmark; } rownum += 1; rownum_cursor_row += 1; } } else rownum += 1000; rownum_cursor_row = 0; lnb = lnb->next; } } exit_search_next_bookmark: if (found) { int max_first_row; cursor_row = rownum - CURSOR_ROW_OFFSET; if (cursor_row - first_row + 1 > VISIBLE_DATA_ROWS) first_row = cursor_row - VISIBLE_DATA_ROWS + 1; max_first_row = MAX_FIRST_ROW; if (max_first_row < 0) max_first_row = 0; if (first_row > max_first_row) first_row = max_first_row; } else make_beep(&opts); } break; case cmd_ReleaseCols: opts.freezed_cols = 0; show_first_col: if (after_freeze_signal && opts.vertical_cursor && vertical_cursor_column > (opts.freezed_cols > -1 ? opts.freezed_cols : default_freezed_cols)) recheck_vertical_cursor_visibility = true; else cursor_col = 0; refresh_scr = true; break; case cmd_FreezeOneCol: opts.freezed_cols = 1; after_freeze_signal = true; goto show_first_col; case cmd_FreezeTwoCols: opts.freezed_cols = 2; after_freeze_signal = true; goto show_first_col; case cmd_FreezeThreeCols: opts.freezed_cols = 3; after_freeze_signal = true; goto show_first_col; case cmd_FreezeFourCols: opts.freezed_cols = 4; after_freeze_signal = true; goto show_first_col; case cmd_FreezeFiveCols: opts.freezed_cols = 5; after_freeze_signal = true; goto show_first_col; case cmd_FreezeSixCols: opts.freezed_cols = 6; after_freeze_signal = true; goto show_first_col; case cmd_FreezeSevenCols: opts.freezed_cols = 7; after_freeze_signal = true; goto show_first_col; case cmd_FreezeEightCols: opts.freezed_cols = 8; after_freeze_signal = true; goto show_first_col; case cmd_FreezeNineCols: opts.freezed_cols = 9; after_freeze_signal = true; goto show_first_col; case cmd_CursorFirstRow: cursor_row = 0; first_row = 0; break; case cmd_CursorLastRow: cursor_row = MAX_CURSOR_ROW; first_row = MAX_FIRST_ROW; if (first_row < 0) first_row = 0; break; case cmd_CursorUp: { if (opts.no_cursor) { next_command = cmd_ScrollUp; break; } if (cursor_row > 0) { /* * When we are on data position, and we are going up, and a * fixed rows are hidden, then unhide fixed rows first (by * decreasing first_row) */ if (fix_rows_offset > 0 && !is_footer_cursor(cursor_row, &scrdesc, &desc)) first_row -= 1; else cursor_row -= 1; /* * When fixed rows are hidden, then gap between first * row and cursor row can be bigger (about fix_rows_offset. */ if (cursor_row + fix_rows_offset < first_row) first_row = cursor_row + fix_rows_offset; } else make_beep(&opts); break; } case cmd_CursorDown: { int max_cursor_row; int max_first_row; if (opts.no_cursor) { next_command = cmd_ScrollDown; break; } max_cursor_row = MAX_CURSOR_ROW; if (++cursor_row > max_cursor_row) { cursor_row = max_cursor_row; make_beep(&opts); } if (cursor_row - first_row + 1 > VISIBLE_DATA_ROWS) first_row += 1; max_first_row = MAX_FIRST_ROW; if (max_first_row < 0) max_first_row = 0; if (first_row > max_first_row) first_row = max_first_row; } break; case cmd_ScrollDownHalfPage: { int offset = ((VISIBLE_DATA_ROWS - 1) >> 1); int max_cursor_row; int max_first_row; max_first_row = MAX_FIRST_ROW; max_cursor_row = MAX_CURSOR_ROW; if (first_row + offset <= max_first_row) { first_row += offset; cursor_row += offset; } else if (cursor_row + offset <= max_cursor_row) { cursor_row += offset; first_row = max_first_row; } else { cursor_row = max_cursor_row; first_row = max_first_row; } } break; case cmd_ScrollUpHalfPage: { int offset = ((VISIBLE_DATA_ROWS - 1) >> 1); if (first_row - offset > 0) { first_row -= offset; cursor_row -= offset; } else if (cursor_row - offset > 0) { first_row = 0; cursor_row -= offset; } else { first_row = 0; cursor_row = 0; } } break; case cmd_ScrollDown: { int max_cursor_row; int max_first_row; max_first_row = MAX_FIRST_ROW; max_cursor_row = MAX_CURSOR_ROW; if (first_row < max_first_row) { first_row += 1; cursor_row += 1; } else if (cursor_row < max_cursor_row) { cursor_row += 1; } } break; case cmd_ScrollUp: if (first_row > 0) { first_row -= 1; cursor_row -= 1; } else if (cursor_row > 0) cursor_row -= 1; break; case cmd_MoveLeft: { bool _is_footer_cursor = is_footer_cursor(cursor_row, &scrdesc, &desc); int recheck_count = 0; recheck_left: if (++recheck_count > 2) break; if (_is_footer_cursor) { if (footer_cursor_col > 0) footer_cursor_col -= 1; else if (scrdesc.rows_rows >= 0) { _is_footer_cursor = false; footer_cursor_col = 0; goto recheck_left; } } else { int move_left = 30; if (cursor_col == 0 && scrdesc.footer_rows > 0 && (!opts.vertical_cursor || (opts.vertical_cursor && vertical_cursor_column == 1))) { _is_footer_cursor = true; goto recheck_left; } if (desc.headline_transl != NULL) { if (opts.vertical_cursor && desc.columns > 0 && vertical_cursor_column > 0) { move_left = 0; if (vertical_cursor_column > (opts.freezed_cols > -1 ? opts.freezed_cols : default_freezed_cols)) { int left_border = scrdesc.fix_cols_cols + cursor_col - 1; int xmin = desc.cranges[vertical_cursor_column - 1].xmin; if (xmin < left_border) { move_left = left_border - xmin; if (move_left > 30) move_left = 30; } else { if (vertical_cursor_column > 1) { vertical_cursor_column -= 1; last_x_focus = get_x_focus(vertical_cursor_column, cursor_col, &desc, &scrdesc); xmin = desc.cranges[vertical_cursor_column - 1].xmin; if (xmin < left_border) { move_left = left_border - xmin; if (move_left > 30) move_left = 30; } } } } else { if (vertical_cursor_column > 1) vertical_cursor_column -= 1; cursor_col = 0; break; } } else { int i; for (i = 1; i <= 30; i++) { int pos = scrdesc.fix_cols_cols + cursor_col - i - 1; if (pos < 0) break; if (desc.headline_transl[pos] == 'I') { move_left = i; break; } } } } cursor_col -= move_left; if (cursor_col < 3) cursor_col = 0; } } break; case cmd_MoveRight: { bool _is_footer_cursor = is_footer_cursor(cursor_row, &scrdesc, &desc); int recheck_count = 0; recheck_right: if (++recheck_count > 2) break; if (_is_footer_cursor) { int max_footer_cursor_col = desc.footer_char_size - scrdesc.main_maxx; if (footer_cursor_col + 1 >= max_footer_cursor_col && scrdesc.rows_rows >= 0) { _is_footer_cursor = false; footer_cursor_col = max_footer_cursor_col; goto recheck_right; } else footer_cursor_col += 1; if (footer_cursor_col > max_footer_cursor_col) footer_cursor_col = max_footer_cursor_col; } else { int move_right = 30; int max_cursor_col; int new_cursor_col = cursor_col; if (desc.headline_transl != NULL) { if (opts.vertical_cursor) { int vmaxx = desc.cranges[vertical_cursor_column - 1].xmax; /* move only right when right corner is not visible already */ if (cursor_col + scrdesc.main_maxx < vmaxx) { int wx = vmaxx - scrdesc.main_maxx - cursor_col + 1; move_right = wx > 30 ? 30 : wx; } else { if (vertical_cursor_column < desc.columns) { vertical_cursor_column += 1; last_x_focus = get_x_focus(vertical_cursor_column, cursor_col, &desc, &scrdesc); vmaxx = desc.cranges[vertical_cursor_column - 1].xmax; if (cursor_col + scrdesc.main_maxx < vmaxx) { int wx = vmaxx - scrdesc.main_maxx - cursor_col + 1; move_right = wx > 30 ? 30 : wx; } else move_right = 0; } } } else { int i; char *str = &desc.headline_transl[scrdesc.fix_cols_cols + cursor_col]; for (i = 1; i <= 30; i++) { if (str[i] == 'I') { move_right = i + 1; break; } } } } new_cursor_col += move_right; if (desc.headline_transl != NULL) max_cursor_col = desc.headline_char_size - scrdesc.main_maxx; else max_cursor_col = desc.maxx - scrdesc.maxx - 1; max_cursor_col = max_cursor_col > 0 ? max_cursor_col : 0; if (new_cursor_col > max_cursor_col) new_cursor_col = max_cursor_col; if (new_cursor_col == cursor_col && scrdesc.footer_rows > 0 && (!opts.vertical_cursor || (opts.vertical_cursor && vertical_cursor_column == desc.columns))) { _is_footer_cursor = true; goto recheck_right; } cursor_col = new_cursor_col; /* * When we go leave fixed columns, then first unfixed column should * be visible. */ if (desc.headline_transl && opts.vertical_cursor) { int fixed_columns = opts.freezed_cols > -1 ? opts.freezed_cols : default_freezed_cols; if (vertical_cursor_column - 1 == fixed_columns) cursor_col = 0; } } } break; case cmd_CursorFirstRowPage: cursor_row = first_row; break; case cmd_CursorLastRowPage: cursor_row = first_row + VISIBLE_DATA_ROWS - 1; break; case cmd_CursorHalfPage: cursor_row = first_row + ((VISIBLE_DATA_ROWS - 1) >> 1); break; case cmd_PageUp: { int offset; if (desc.is_expanded_mode && scrdesc.first_rec_title_y != -1 && scrdesc.last_rec_title_y != -1) offset = scrdesc.last_rec_title_y - scrdesc.first_rec_title_y; else offset = scrdesc.main_maxy - scrdesc.fix_rows_rows; if (first_row > 0) { first_row -= offset; if (first_row < 0) first_row = 0; } if (cursor_row > 0) { cursor_row -= offset; if (cursor_row < 0) cursor_row = 0; } else make_beep(&opts); } break; case cmd_PageDown: { int max_cursor_row; int max_first_row; int offset; if (desc.is_expanded_mode && scrdesc.first_rec_title_y != -1 && scrdesc.last_rec_title_y != -1) offset = scrdesc.last_rec_title_y - scrdesc.first_rec_title_y; else offset = scrdesc.main_maxy - scrdesc.fix_rows_rows; first_row += offset; cursor_row += offset; max_cursor_row = MAX_CURSOR_ROW; if (cursor_row > max_cursor_row) { cursor_row = max_cursor_row; make_beep(&opts); } if (cursor_row - first_row + 1 > VISIBLE_DATA_ROWS) first_row += 1; max_first_row = MAX_FIRST_ROW; if (max_first_row < 0) max_first_row = 0; if (first_row > max_first_row) first_row = max_first_row; } break; case cmd_RESIZE_EVENT: refresh_scr = true; resize_scr = true; break; case cmd_ShowFirstCol: { bool _is_footer_cursor = is_footer_cursor(cursor_row, &scrdesc, &desc); int recheck_count = 0; recheck_home: if (++recheck_count > 2) break; if (_is_footer_cursor) { if (footer_cursor_col > 0) footer_cursor_col = 0; else if (scrdesc.rows_rows > 0) { footer_cursor_col = 0; _is_footer_cursor = false; goto recheck_home; } } else { if (opts.vertical_cursor && desc.columns > 0) { vertical_cursor_column = 1; last_x_focus = get_x_focus(vertical_cursor_column, cursor_col, &desc, &scrdesc); } if (cursor_col > 0) cursor_col = 0; else if (scrdesc.footer_rows > 0) { cursor_col = 0; _is_footer_cursor = true; goto recheck_home; } } break; } case cmd_ShowLastCol: { bool _is_footer_cursor = is_footer_cursor(cursor_row, &scrdesc, &desc); int recheck_count = 0; recheck_end: if (++recheck_count > 2) break; if (_is_footer_cursor) { if (footer_cursor_col < desc.footer_char_size - scrdesc.main_maxx) footer_cursor_col = desc.footer_char_size - scrdesc.main_maxx; else if (scrdesc.rows_rows > 0) { footer_cursor_col = desc.footer_char_size - scrdesc.main_maxx; _is_footer_cursor = false; goto recheck_end; } } else { int new_cursor_col; if (opts.vertical_cursor && desc.columns > 0) { vertical_cursor_column = desc.columns; last_x_focus = get_x_focus(vertical_cursor_column, cursor_col, &desc, &scrdesc); } if (desc.headline != NULL) new_cursor_col = desc.headline_char_size - scrdesc.main_maxx; else new_cursor_col = desc.maxx - maxx - 1; new_cursor_col = new_cursor_col > 0 ? new_cursor_col : 0; if (new_cursor_col > cursor_col) cursor_col = new_cursor_col; else if (scrdesc.footer_rows > 0) { _is_footer_cursor = true; cursor_col = new_cursor_col; goto recheck_end; } } break; } case cmd_GotoLine: { char linenotxt[256]; get_string(&opts, &scrdesc, "line: ", linenotxt, sizeof(linenotxt) - 1, last_line); if (linenotxt[0] != '\0') { char *endptr; long lineno; errno = 0; lineno = strtol(linenotxt, &endptr, 10); if (endptr == linenotxt) show_info_wait(&opts, &scrdesc, " Cannot convert input string to number", NULL, true, true, false, true); else if (errno != 0) show_info_wait(&opts, &scrdesc, " Cannot convert input string to number (%s)", strerror(errno), true, true, false, true); else { int max_cursor_row; int max_first_row; cursor_row = lineno - 1; if (cursor_row < 0) cursor_row = 0; max_cursor_row = MAX_CURSOR_ROW; if (cursor_row > max_cursor_row) { cursor_row = max_cursor_row; make_beep(&opts); } if (cursor_row < first_row || cursor_row - first_row > VISIBLE_DATA_ROWS) { max_first_row = MAX_FIRST_ROW; if (max_first_row < 0) max_first_row = 0; first_row = cursor_row - VISIBLE_DATA_ROWS / 2; if (first_row > max_first_row) first_row = max_first_row; if (first_row < 0) first_row = 0; } snprintf(last_line, sizeof(last_line), "%ld", lineno); } } break; } case cmd_OriginalSort: if (desc.order_map) { free(desc.order_map); desc.order_map = NULL; last_ordered_column = -1; } /* * We cannot to say nothing about found_row, so most * correct solution is clean it now. */ scrdesc.found_row = -1; break; case cmd_SortAsc: case cmd_SortDesc: { if (opts.vertical_cursor && vertical_cursor_column > 0 && desc.columns > 0) { update_order_map(&opts, &scrdesc, &desc, vertical_cursor_column, command == cmd_SortDesc); last_ordered_column = vertical_cursor_column; last_order_desc = command == cmd_SortDesc; } else if (desc.columns == 0) show_info_wait(&opts, &scrdesc, " Sort is available only for tables.", NULL, true, true, true, false); else show_info_wait(&opts, &scrdesc, " Vertical cursor is not visible", NULL, true, true, true, false); break; } case cmd_SaveData: { char buffer[MAXPATHLEN + 1024]; char *path; FILE *fp; bool ok = false; errno = 0; get_string(&opts, &scrdesc, "log file: ", buffer, sizeof(buffer) - 1, last_path); if (buffer[0] != '\0') { strncpy(last_path, buffer, sizeof(last_path) - 1); last_path[sizeof(last_path) - 1] = '\0'; path = tilde(buffer); fp = fopen(path, "w"); if (fp != NULL) { LineBuffer *lnb = &desc.rows; ok = true; while (lnb) { for (i = 0; i < lnb->nrows; i++) { /* * Reset errno. Previous openf can dirty it, when file was * created. */ errno = 0; fprintf(fp, "%s\n", lnb->rows[i]); if (errno != 0) { ok = false; goto exit; } } lnb = lnb->next; } fclose(fp); } exit: if (!ok) { if (errno != 0) snprintf(buffer, sizeof(buffer), "%s (%s)", path, strerror(errno)); else strcpy(buffer, path); next_event_keycode = show_info_wait(&opts, &scrdesc, " Cannot write to %s (press any key)", buffer, true, false, false, true); } } refresh_scr = true; break; } case cmd_ForwardSearch: { char locsearchterm[256]; get_string(&opts, &scrdesc, "/", locsearchterm, sizeof(locsearchterm) - 1, last_row_search); if (locsearchterm[0] != '\0') { memcpy(last_row_search, locsearchterm, sizeof(last_row_search)); strncpy(scrdesc.searchterm, locsearchterm, sizeof(scrdesc.searchterm)); scrdesc.has_upperchr = has_upperchr(&opts, scrdesc.searchterm); scrdesc.searchterm_size = strlen(scrdesc.searchterm); scrdesc.searchterm_char_size = opts.force8bit ? strlen(scrdesc.searchterm) : utf8len(scrdesc.searchterm); } else { scrdesc.searchterm[0] = '\0'; scrdesc.searchterm_size = 0; scrdesc.searchterm_char_size = 0; } reset_searching_lineinfo(&desc.rows); search_direction = SEARCH_FORWARD; /* continue to find next: */ } case cmd_SearchNext: { int rownum_cursor_row; int rownum = 0; int skip_bytes = 0; LineBuffer *lnb = &desc.rows; /* call inverse command when search direction is SEARCH_BACKWARD */ if (command == cmd_SearchNext && search_direction == SEARCH_BACKWARD && !redirect_mode) { next_command = cmd_SearchPrev; break; } rownum_cursor_row = cursor_row + CURSOR_ROW_OFFSET; if (scrdesc.found && rownum_cursor_row == scrdesc.found_row) skip_bytes = scrdesc.found_start_bytes + scrdesc.searchterm_size; scrdesc.found = false; if (desc.order_map) { rownum = rownum_cursor_row; while (rownum < desc.total_rows) { MappedLine *mp = &desc.order_map[rownum]; const char *str; const char *rowstr; rowstr = mp->lnb->rows[mp->lnb_row]; str = pspg_search(&opts, &scrdesc, rowstr + skip_bytes); if (str != NULL) { scrdesc.found_start_x = opts.force8bit ? str - rowstr : utf8len_start_stop(rowstr, str); scrdesc.found_start_bytes = str - rowstr; scrdesc.found = true; goto found_next_pattern; } rownum += 1; skip_bytes = 0; } } else { /* skip first x LineBuffers */ while (rownum_cursor_row > 1000 && lnb != NULL) { lnb = lnb->next; rownum_cursor_row -= 1000; rownum += 1000; } rownum += rownum_cursor_row; while (lnb != NULL) { while (rownum_cursor_row < lnb->nrows) { const char *str; const char *rowstr = lnb->rows[rownum_cursor_row]; str = pspg_search(&opts, &scrdesc, rowstr + skip_bytes); if (str != NULL) { scrdesc.found_start_x = opts.force8bit ? str - rowstr : utf8len_start_stop(rowstr, str); scrdesc.found_start_bytes = str - rowstr; scrdesc.found = true; goto found_next_pattern; } rownum += 1; rownum_cursor_row += 1; skip_bytes = 0; } rownum_cursor_row = 0; lnb = lnb->next; } } found_next_pattern: if (scrdesc.found) { int max_first_row; cursor_row = rownum - CURSOR_ROW_OFFSET; scrdesc.found_row = rownum; fresh_found = true; fresh_found_cursor_col = -1; if (cursor_row - first_row + 1 > VISIBLE_DATA_ROWS) first_row = cursor_row - VISIBLE_DATA_ROWS + 1; max_first_row = MAX_FIRST_ROW; if (max_first_row < 0) max_first_row = 0; if (first_row > max_first_row) first_row = max_first_row; } else show_info_wait(&opts, &scrdesc, " Not found (press any key)", NULL, true, true, false, false); break; } case cmd_BackwardSearch: { char locsearchterm[256]; get_string(&opts, &scrdesc, "?", locsearchterm, sizeof(locsearchterm) - 1, last_row_search); if (locsearchterm[0] != '\0') { memcpy(last_row_search, locsearchterm, sizeof(last_row_search)); strncpy(scrdesc.searchterm, locsearchterm, sizeof(scrdesc.searchterm)); scrdesc.has_upperchr = has_upperchr(&opts, scrdesc.searchterm); scrdesc.searchterm_size = strlen(scrdesc.searchterm); scrdesc.searchterm_char_size = utf8len(scrdesc.searchterm); } else { scrdesc.searchterm[0] = '\0'; scrdesc.searchterm_size = 0; scrdesc.searchterm_char_size = 0; } reset_searching_lineinfo(&desc.rows); search_direction = SEARCH_BACKWARD; /* continue to find next: */ } case cmd_SearchPrev: { int rowidx; int search_row; LineBuffer *rows = &desc.rows; int cut_bytes = 0; /* call inverse command when search direction is SEARCH_BACKWARD */ if (command == cmd_SearchPrev && search_direction == SEARCH_BACKWARD && !redirect_mode) { next_command = cmd_SearchNext; break; } rowidx = cursor_row + scrdesc.fix_rows_rows + desc.title_rows; search_row = cursor_row; /* * when we can search on found line, the use it, * else try start searching from previous row. */ if (scrdesc.found && rowidx == scrdesc.found_row && scrdesc.found_start_bytes > 0) cut_bytes = scrdesc.found_start_bytes; else { rowidx -= 1; search_row -= 1; } scrdesc.found = false; if (desc.order_map) { if (search_row > -1) { MappedLine *mp = &desc.order_map[rowidx]; rows = mp->lnb; rowidx = mp->lnb_row; } } else { /* go forward */ while (rowidx > 1000) { rows = rows->next; rowidx -= 1000; } } while (search_row >= 0) { const char *str; char *row; bool free_row; if (cut_bytes != 0) { row = malloc(strlen(rows->rows[rowidx]) + 1); if (row == NULL) leave_ncurses("out of memory"); strcpy(row, rows->rows[rowidx]); row[cut_bytes] = '\0'; free_row = true; } else { row = rows->rows[rowidx]; free_row = false; } str = row; /* try to find most right pattern */ while (str != NULL) { str = pspg_search(&opts, &scrdesc, str); if (str != NULL) { cursor_row = search_row; if (first_row > cursor_row) first_row = cursor_row; scrdesc.found_start_x = opts.force8bit ? str - row : utf8len_start_stop(row, str); scrdesc.found_start_bytes = str - row; scrdesc.found_row = cursor_row + CURSOR_ROW_OFFSET; scrdesc.found = true; fresh_found = true; fresh_found_cursor_col = -1; str += scrdesc.searchterm_size; } } if (free_row) free(row); if (scrdesc.found) break; search_row -= 1; cut_bytes = 0; if (desc.order_map) { MappedLine *mp = &desc.order_map[search_row + scrdesc.fix_rows_rows + desc.title_rows]; rows = mp->lnb; rowidx = mp->lnb_row; } else { rowidx -= 1; if (rowidx < 0) { rows = rows->prev; rowidx = 999; } } } if (!scrdesc.found) show_info_wait(&opts, &scrdesc, " Not found (press any key)", NULL, true, true, false, false); break; } case cmd_SearchColumn: { if (desc.namesline) { char locsearchterm[256]; int startcolumn = 1; int colnum; bool found = false; bool search_from_start = false; get_string(&opts, &scrdesc, "c:", locsearchterm, sizeof(locsearchterm) - 1, last_col_search); if (locsearchterm[0] != '\0') { memcpy(last_col_search, locsearchterm, sizeof(last_col_search)); strncpy(scrdesc.searchcolterm, locsearchterm, sizeof(scrdesc.searchcolterm)); scrdesc.searchcolterm_size = strlen(scrdesc.searchcolterm); } if (scrdesc.searchcolterm[0] != '\0') { /* * Where we should to start searching? * 1. after visible vertical cursor * 2. after cursor_col * 3. from first column */ if (opts.vertical_cursor) startcolumn = vertical_cursor_column + 1; else if (cursor_col > 0) { int first_x = scrdesc.fix_cols_cols + cursor_col; int i; /* fallback */ startcolumn = 1; for (i = 0; i < desc.columns; i++) { if (desc.cranges[i].xmin <= first_x && first_x < desc.cranges[i].xmax) { startcolumn = i + 1; break; } } } else startcolumn = 1; for (colnum = startcolumn; colnum <= desc.columns; colnum++) { if (opts.force8bit) { if (nstrstr_with_sizes(desc.namesline + desc.cranges[colnum - 1].name_pos, desc.cranges[colnum - 1].name_size, scrdesc.searchcolterm, scrdesc.searchcolterm_size)) { found = true; break; } } else { if (utf8_nstrstr_with_sizes(desc.namesline + desc.cranges[colnum - 1].name_pos, desc.cranges[colnum - 1].name_size, scrdesc.searchcolterm, scrdesc.searchcolterm_size)) { found = true; break; } } } if (!found) { search_from_start = true; for (colnum = 1; colnum < startcolumn; colnum++) { if (nstrstr_with_sizes(desc.namesline + desc.cranges[colnum - 1].name_pos, desc.cranges[colnum - 1].name_size, scrdesc.searchcolterm, scrdesc.searchcolterm_size)) { found = true; break; } } } if (found) { if (search_from_start) show_info_wait(&opts, &scrdesc, " Search from first column (press any key)", NULL, true, true, true, false); opts.vertical_cursor = true; vertical_cursor_column = colnum; cursor_col = get_cursor_col_for_vertical_column(vertical_cursor_column, cursor_col, &desc, &scrdesc); last_x_focus = get_x_focus(vertical_cursor_column, cursor_col, &desc, &scrdesc); } else show_info_wait(&opts, &scrdesc, " Not found (press any key)", NULL, true, true, false, false); } else show_info_wait(&opts, &scrdesc, " Search pattern is a empty string (press any key)", NULL, true, true, true, false); } else show_info_wait(&opts, &scrdesc, " Columns names are not detected (press any key)", NULL, true, true, true, false); break; } case cmd_TogglePause: paused = !paused; break; case cmd_MOUSE_EVENT: { mouse_event += 1; #if NCURSES_MOUSE_VERSION > 1 if (event.bstate & BUTTON_ALT && event.bstate & BUTTON5_PRESSED) { next_command = cmd_MoveRight; break; } if (event.bstate & BUTTON_ALT && event.bstate & BUTTON4_PRESSED) { next_command = cmd_MoveLeft; break; } if (event.bstate & BUTTON5_PRESSED) { int max_cursor_row; int max_first_row; int offset = 1; max_first_row = MAX_FIRST_ROW; if (max_first_row < 0) max_first_row = 0; if (desc.headline_transl != NULL) offset = (scrdesc.main_maxy - scrdesc.fix_rows_rows) / 3; if (first_row + offset > max_first_row) offset = 1; first_row += offset; cursor_row += offset; max_cursor_row = MAX_CURSOR_ROW; if (cursor_row > max_cursor_row) { cursor_row = max_cursor_row; make_beep(&opts); } if (cursor_row - first_row + 1 > VISIBLE_DATA_ROWS) first_row += 1; if (first_row > max_first_row) first_row = max_first_row; } else if (event.bstate & BUTTON4_PRESSED) { int offset = 1; if (desc.headline_transl != NULL) offset = (scrdesc.main_maxy - scrdesc.fix_rows_rows) / 3; if (first_row <= offset) offset = 1; if (first_row > 0) { first_row -= offset; if (first_row < 0) first_row = 0; } if (cursor_row > 0) { cursor_row -= offset; if (cursor_row < 0) cursor_row = 0; } else make_beep(&opts); } else #endif if (event.bstate & BUTTON1_PRESSED || event.bstate & BUTTON1_RELEASED) { int max_cursor_row; int max_first_row; bool is_double_click = false; bool _is_footer_cursor; long ms; time_t sec; if (event.y == 0 && scrdesc.top_bar_rows > 0) { next_command = cmd_ShowMenu; reuse_event = true; prev_event_keycode = 0; break; } if (event.bstate & BUTTON1_RELEASED) { current_time(&sec, &ms); if (last_sec > 0) { long td; td = time_diff(sec, ms, last_sec, last_ms); if (td < 250) is_double_click = true; } last_sec = sec; last_ms = ms; } /* * When current event is MOUSE RELEASE, and prev event was MOUSE_PRESS * and it is not double click, and there are same position, then we can * ignore this event. */ if (prev_event_is_mouse_press && !is_double_click && prev_mouse_event_y == event.y && prev_mouse_event_x == event.x) { no_doupdate = true; continue; } if (event.y >= scrdesc.top_bar_rows && event.y <= scrdesc.fix_rows_rows) { if (is_double_click) { /* * protection against unwanted vertical cursor hide, * when cursor was changed by first click of current double click. */ if (mouse_event - vertical_cursor_changed_mouse_event > 3) { next_command = cmd_ShowVerticalCursor; continue; } } } else cursor_row = event.y - scrdesc.fix_rows_rows - scrdesc.top_bar_rows + first_row - fix_rows_offset; if (cursor_row < 0) cursor_row = 0; if (cursor_row + fix_rows_offset < first_row) first_row = cursor_row + fix_rows_offset; max_cursor_row = MAX_CURSOR_ROW; if (cursor_row > max_cursor_row) cursor_row = max_cursor_row; if (cursor_row - first_row + 1 > VISIBLE_DATA_ROWS) first_row += 1; max_first_row = MAX_FIRST_ROW; if (max_first_row < 0) max_first_row = 0; if (first_row > max_first_row) first_row = max_first_row; _is_footer_cursor = is_footer_cursor(cursor_row, &scrdesc, &desc); /* * Save last x focused point. It will be used for repeated hide/unhide * vertical cursor. But only if cursor is not in footer area. */ if (!_is_footer_cursor) last_x_focus = event.x; if (event.bstate & BUTTON_ALT && is_double_click) { next_command = cmd_ToggleBookmark; } else if (!(event.bstate & BUTTON_ALT) && opts.vertical_cursor && !_is_footer_cursor) { int xpoint = event.x - scrdesc.main_start_x; int vertical_cursor_column_orig = vertical_cursor_column; int i; if (xpoint > scrdesc.fix_cols_cols - 1) xpoint += cursor_col; if (xpoint >= 0) { for (i = 0; i < desc.columns; i++) { if (desc.cranges[i].xmin <= xpoint && desc.cranges[i].xmax > xpoint) { int xmin = desc.cranges[i].xmin; int xmax = desc.cranges[i].xmax; vertical_cursor_column = i + 1; if (vertical_cursor_column != vertical_cursor_column_orig && event.y >= scrdesc.top_bar_rows && event.y <= scrdesc.fix_rows_rows) { vertical_cursor_changed_mouse_event = mouse_event; } if (vertical_cursor_column > (opts.freezed_cols > -1 ? opts.freezed_cols : default_freezed_cols)) { if (xmax > scrdesc.main_maxx + cursor_col) { cursor_col = xmax - scrdesc.main_maxx; } else if (xmin < scrdesc.fix_cols_cols + cursor_col) { cursor_col = xmin - scrdesc.fix_cols_cols + 1; } } last_x_focus = get_x_focus(vertical_cursor_column, cursor_col, &desc, &scrdesc); break; } } } } } break; } } /* end switch */ if (fresh_found && scrdesc.found) { int maxy, maxx; bool _is_footer_cursor = is_footer_cursor(cursor_row, &scrdesc, &desc); UNUSED(maxy); if (opts.vertical_cursor && !_is_footer_cursor) { int i; for (i = 0; i < desc.columns; i++) { if (desc.cranges[i].xmin <= scrdesc.found_start_x && scrdesc.found_start_x < desc.cranges[i].xmax) { vertical_cursor_column = i + 1; last_x_focus = get_x_focus(vertical_cursor_column, cursor_col, &desc, &scrdesc); break; } } } if (fresh_found && w_fix_cols(&scrdesc) != NULL) { getmaxyx(w_fix_cols(&scrdesc), maxy, maxx); if (scrdesc.found_start_x + scrdesc.searchterm_char_size <= maxx) fresh_found = false; } if (fresh_found && !_is_footer_cursor && w_rows(&scrdesc) != NULL) { getmaxyx(w_rows(&scrdesc), maxy, maxx); if (cursor_col + scrdesc.fix_cols_cols <= scrdesc.found_start_x && cursor_col + scrdesc.fix_cols_cols + maxx >= scrdesc.found_start_x + scrdesc.searchterm_char_size) { fresh_found = false; } else { /* we would to move cursor_col to left or right to be partially visible */ if (cursor_col + scrdesc.fix_cols_cols > scrdesc.found_start_x) next_command = cmd_MoveLeft; else if (cursor_col + scrdesc.fix_cols_cols + maxx < scrdesc.found_start_x + scrdesc.searchterm_char_size) next_command = cmd_MoveRight; } } if (fresh_found && _is_footer_cursor && w_footer(&scrdesc) != NULL) { getmaxyx(w_footer(&scrdesc), maxy, maxx); if (footer_cursor_col + scrdesc.fix_cols_cols <= scrdesc.found_start_x && footer_cursor_col + maxx >= scrdesc.found_start_x + scrdesc.searchterm_char_size) { fresh_found = false; } else { /* we would to move cursor_col to left or right to be partially visible */ if (footer_cursor_col > scrdesc.found_start_x) next_command = cmd_MoveLeft; else if (footer_cursor_col + maxx < scrdesc.found_start_x + scrdesc.searchterm_char_size) next_command = cmd_MoveRight; } } if (next_command != 0) { /* protect agains infinity loop */ if (fresh_found_cursor_col != -1) { /* the direction should not be changed */ if (_is_footer_cursor) { if ((fresh_found_cursor_col > footer_cursor_col && next_command == cmd_MoveRight) || (fresh_found_cursor_col < footer_cursor_col && next_command == cmd_MoveLeft) || (fresh_found_cursor_col == footer_cursor_col)) { next_command = cmd_Invalid; fresh_found = false; } } else { if ((fresh_found_cursor_col > cursor_col && next_command == cmd_MoveRight) || (fresh_found_cursor_col < cursor_col && next_command == cmd_MoveLeft) || (fresh_found_cursor_col == cursor_col)) { next_command = cmd_Invalid; fresh_found = false; } } } else fresh_found_cursor_col = _is_footer_cursor? footer_cursor_col : cursor_col; } else fresh_found = false; } print_status(&opts, &scrdesc, &desc, cursor_row, cursor_col, first_row, fix_rows_offset, vertical_cursor_column); if (first_row != prev_first_row) { /* now, maybe more/less rows from footer should be displayed */ if (desc.headline_transl != NULL && desc.footer_row > 0) { int rows_rows; rows_rows = min_int(desc.footer_row - scrdesc.fix_rows_rows - first_row - desc.title_rows, scrdesc.main_maxy - scrdesc.fix_rows_rows); rows_rows = rows_rows > 0 ? rows_rows : 0; if (!refresh_scr) { refresh_scr = scrdesc.rows_rows != rows_rows; } } } if (refresh_scr || scrdesc.refresh_scr) { if (resize_scr) { /* * Workaround - the variables COLS, LINES are not refreshed * when pager is resized and executed inside psql. */ if (ioctl(0, TIOCGWINSZ, (char *) &size) >= 0) { resize_term(size.ws_row, size.ws_col); clear(); } resize_scr = false; } refresh: getmaxyx(stdscr, maxy, maxx); refresh_aux_windows(&opts, &scrdesc, &desc); create_layout_dimensions(&opts, &scrdesc, &desc, opts.freezed_cols != -1 ? opts.freezed_cols : default_freezed_cols, fixedRows, maxy, maxx); create_layout(&opts, &scrdesc, &desc, first_data_row, first_row); /* recheck visibility of vertical cursor. now we have fresh fix_cols_cols data */ if (recheck_vertical_cursor_visibility && vertical_cursor_column > 0) { int vminx = desc.cranges[vertical_cursor_column - 1].xmin; int left_border = scrdesc.fix_cols_cols + cursor_col - 1; if (vminx < left_border) cursor_col = vminx - scrdesc.fix_cols_cols + 1; } print_status(&opts, &scrdesc, &desc, cursor_row, cursor_col, first_row, fix_rows_offset, vertical_cursor_column); if (cmdbar) cmdbar = init_cmdbar(cmdbar); refresh_scr = false; scrdesc.refresh_scr = false; } } endwin(); if (logfile) { print_log_prefix(logfile); fprintf(logfile, "ncurses ended\n"); } active_ncurses = false; if (raw_output_quit) { LineBuffer *lnb = &desc.rows; while (lnb) { int lnb_row = 0; while (lnb_row < lnb->nrows) printf("%s\n", lnb->rows[lnb_row++]); lnb = lnb->next; } } else if (no_alternate_screen) { draw_data(&opts, &scrdesc, &desc, first_data_row, first_row, cursor_col, footer_cursor_col, fix_rows_offset); } #ifdef HAVE_READLINE_HISTORY write_history(tilde("~/.pspg_history")); #endif #ifdef DEBUG_PIPE /* * Try to release all allocated memory in debug mode, for better * memory leak detection. */ if (0) { LineBuffer *lnb = &desc.rows; LineBuffer *_lnb; int lnb_row; while (lnb) { for (lnb_row = 0; lnb_row < lnb->nrows; lnb_row++) { if (lnb->rows[lnb_row]) free(lnb->rows[lnb_row]); } if (lnb->lineinfo) free(lnb->lineinfo); _lnb = lnb; lnb = lnb->next; if (_lnb != &desc.rows) free(_lnb); } if (desc.cranges) free(desc.cranges); if (desc.headline_transl) free(desc.headline_transl); if (opts.pathname) free(opts.pathname); if (cmdbar) st_cmdbar_free(cmdbar); if (menu) st_menu_free(menu); } fclose(debug_pipe); #endif if (logfile) { print_log_prefix(logfile); fprintf(logfile, "correct quit\n"); fclose(logfile); } return 0; } pspg-2.6.6/src/pspg.h000066400000000000000000000204171360716715600144270ustar00rootroot00000000000000/*------------------------------------------------------------------------- * * pspg.h * themes initialization * * Portions Copyright (c) 2017-2019 Pavel Stehule * * IDENTIFICATION * src/pspg.h * *------------------------------------------------------------------------- */ #ifndef PSPG_PSPG_H #define PSPG_PSPG_H #include "config.h" #include "themes.h" #include "st_menu.h" #define LINEINFO_NONE 0 #define LINEINFO_BOOKMARK 1 #define LINEINFO_FOUNDSTR 2 #define LINEINFO_FOUNDSTR_MULTI 4 #define LINEINFO_UNKNOWN 8 #define LINEINFO_CONTINUATION 16 #define MAX_STYLE 20 typedef struct LineInfo { char mask; short int start_char; } LineInfo; typedef struct LineBuffer { int first_row; int nrows; char *rows[1000]; LineInfo *lineinfo; struct LineBuffer *next; struct LineBuffer *prev; } LineBuffer; typedef struct { LineBuffer *lnb; int lnb_row; } MappedLine; typedef enum { INFO_UNKNOWN, INFO_DOUBLE, INFO_STRXFRM } SortDataInfo; typedef struct { SortDataInfo info; double d; char *strxfrm; LineBuffer *lnb; int lnb_row; } SortData; /* * Column range */ typedef struct { int xmin; int xmax; int name_pos; /* column's name position */ int name_size; /* size of column name in bytes */ } CRange; /* * Available formats of headline chars * * L, R .. outer border * I .. inner border * d .. data */ /* * This structure should be immutable */ typedef struct { int border_top_row; /* nrow of bottom outer border or -1 */ int border_head_row; /* nrow of head outer (required) */ int border_bottom_row; /* nrow of bottom outer border or -1 */ int border_type; /* detected type of border: 0, 1, 2 */ char linestyle; /* detected linestyle: a, u */ bool is_expanded_mode; /* true when data are in expanded mode */ bool is_pgcli_fmt; /* table was generated by pgcli */ int expanded_info_minx; /* begin of info in \x mode .. RECORD x */ char title[65]; /* detected title (trimmed) or NULL */ int title_rows; /* number of rows used as table title (skipped later) */ char filename[65]; /* filename (printed on top bar) */ LineBuffer rows; /* list of rows buffers */ int total_rows; /* number of input rows */ MappedLine *order_map; /* maps sorted lines to original lines */ int maxy; /* maxy of used pad area with data */ int maxx; /* maxx of used pad area with data */ int maxbytes; /* max length of line in bytes */ char *namesline; /* header column's names line */ char *headline; /* header separator line */ int headline_size; /* size of headerline in bytes */ char *headline_transl; /* translated headline */ int headline_char_size; /* size of headerline in chars */ CRange *cranges; /* pairs of start, end of columns */ int columns; /* number of columns */ int first_data_row; /* fist data row line (starts by zero) */ int last_data_row; /* last line of data row */ int footer_row; /* nrow of first footer row or -1 */ int alt_footer_row; /* alternative footer row (used when border = 1) */ int footer_char_size; /* width of footer */ int last_row; /* last not empty row */ int fixed_rows; /* number of fixed rows */ int fixed_columns; /* number of fixed columns */ int data_rows; /* number of data rows */ int footer_rows; /* number of footer rows */ bool oid_name_table; /* detected system table with first oid column */ bool multilines_already_tested; /* true, when we know where are multilines */ } DataDesc; /* * This structure can be mutable - depends on displayed data */ typedef struct { int fix_rows_rows; /* current number of fixed rows in window rows */ int fix_cols_cols; /* current number of fixed columns in window rows */ int rows_rows; /* current number of data rows */ int footer_rows; /* current number of footer rows */ int maxy; /* max y size of screen */ int maxx; /* max x size of screen */ int main_maxy; /* max y size of main place (fixed + data + footer rows) */ int main_maxx; /* max x size of main place (maxx - main_start_x) */ int main_start_y; /* y position of first row of main place */ int main_start_x; /* x position of first row of main place */ int top_bar_rows; /* 1 or 0 when top bar is not used */ WINDOW *wins[9]; Theme themes[9]; char searchterm[256]; /* currently active search input */ int searchterm_char_size; /* size of searchterm in chars */ int searchterm_size; /* size of searchterm in bytes */ bool has_upperchr; /* true, when search term has upper char */ bool found; /* true, when last search was successfull */ int found_start_x; /* x position of found pattern */ int found_start_bytes; /* bytes position of found pattern */ int found_row; /* row of found pattern */ int first_rec_title_y; /* y of first displayed record title in expanded mode */ int last_rec_title_y; /* y of last displayed record title in expanded mode */ char searchcolterm[256]; /* last searched column patterm */ int searchcolterm_size; /* length of searched column pattern in bytes */ char *fmt; /* format string for info when refresh first is required */ char *par; /* parameter for info when refresh first is required */ bool beep; /* beep for info when refresh is required */ bool applytimeout; /* true, when saved info should be close after timeout */ bool is_error; /* true, when saved info should be displayed as error */ bool refresh_scr; /* force rewrite screen */ } ScrDesc; #define w_luc(scrdesc) ((scrdesc)->wins[WINDOW_LUC]) #define w_fix_rows(scrdesc) ((scrdesc)->wins[WINDOW_FIX_ROWS]) #define w_fix_cols(scrdesc) ((scrdesc)->wins[WINDOW_FIX_COLS]) #define w_rows(scrdesc) ((scrdesc)->wins[WINDOW_ROWS]) #define w_footer(scrdesc) ((scrdesc)->wins[WINDOW_FOOTER]) #define w_top_bar(scrdesc) ((scrdesc)->wins[WINDOW_TOP_BAR]) #define w_bottom_bar(scrdesc) ((scrdesc)->wins[WINDOW_BOTTOM_BAR]) #define w_rownum(scrdesc) ((scrdesc)->wins[WINDOW_ROWNUM]) #define w_rownum_luc(scrdesc) ((scrdesc)->wins[WINDOW_ROWNUM_LUC]) /* * Used for storing not yet formatted data */ typedef struct { int nfields; char *fields[]; } RowType; typedef struct _rowBucketType { int nrows; RowType *rows[1000]; bool multilines[1000]; bool allocated; struct _rowBucketType *next_bucket; } RowBucketType; /* * Used for formatting */ typedef struct { int nfields; bool has_header; char types[1024]; /* a or d .. content in column */ int widths[1024]; /* column's display width */ bool multilines[1024]; /* true if column has multiline row */ } PrintDataDesc; /* from print.c */ extern void window_fill(int window_identifier, int srcy, int srcx, int cursor_row, int vcursor_xmin, int vcursor_xmax, DataDesc *desc, ScrDesc *scrdesc, Options *opts); extern void draw_data(Options *opts, ScrDesc *scrdesc, DataDesc *desc, int first_data_row, int first_row, int cursor_col, int footer_cursor_col, int fix_rows_offset); /* from pspg.c */ extern void leave_ncurses(const char *str); extern void leave_ncurses2(const char *fmt, const char *str); extern void log_writeln(const char *str); extern bool is_expanded_header(Options *opts, char *str, int *ei_minx, int *ei_maxx); extern int min_int(int a, int b); extern const char *nstrstr(const char *haystack, const char *needle); extern const char *nstrstr_ignore_lower_case(const char *haystack, const char *needle); extern const char *pspg_search(Options *opts, ScrDesc *scrdesc, const char *str); /* from menu.c */ extern void init_menu_config(Options *opts); extern struct ST_MENU *init_menu(struct ST_MENU *current_menu); extern struct ST_CMDBAR *init_cmdbar(struct ST_CMDBAR *current_cmdbar); extern void post_menu(Options *opts, struct ST_MENU *current_menu); /* from sort.c */ extern void sort_column_num(SortData *sortbuf, int rows, bool desc); extern void sort_column_text(SortData *sortbuf, int rows, bool desc); /* from pretty-csv.c */ extern bool read_and_format(FILE *fp, Options *opts, DataDesc *desc, const char **err); /* from pgclient.c */ extern bool pg_exec_query(Options *opts, RowBucketType *rb, PrintDataDesc *pdesc, const char **err); /* * REMOVE THIS COMMENT FOR DEBUG OUTPUT * and modify a path. * #define DEBUG_PIPE "/home/pavel/debug" */ #ifdef DEBUG_PIPE extern FILE *debug_pipe; extern int debug_eventno; #endif #endif pspg-2.6.6/src/sort.c000066400000000000000000000037271360716715600144450ustar00rootroot00000000000000/*------------------------------------------------------------------------- * * sort.c * sort of data inside columns * * Portions Copyright (c) 2017-2019 Pavel Stehule * * IDENTIFICATION * src/sort.c * *------------------------------------------------------------------------- */ #include #include #include "pspg.h" static int compar_num_asc(const void *a, const void *b) { SortData *sda = (SortData *) a; SortData *sdb = (SortData *) b; if (sdb->info == INFO_DOUBLE) { if (sda->info == INFO_DOUBLE) return sda->d - sdb->d; else return 1; } else { if (sda->info == INFO_DOUBLE) return -1; else return 0; } } static int compar_num_desc(const void *a, const void *b) { SortData *sda = (SortData *) a; SortData *sdb = (SortData *) b; if (sdb->info == INFO_DOUBLE) { if (sda->info == INFO_DOUBLE) return sdb->d - sda->d; else return 1; } else { if (sda->info == INFO_DOUBLE) return -1; else return 0; } } void sort_column_num(SortData *sortbuf, int rows, bool desc) { qsort(sortbuf, rows, sizeof(SortData), desc ? compar_num_desc : compar_num_asc); } static int compar_text_asc(const void *a, const void *b) { SortData *sda = (SortData *) a; SortData *sdb = (SortData *) b; if (sdb->info == INFO_STRXFRM) { if (sda->info == INFO_STRXFRM) return strcmp(sda->strxfrm, sdb->strxfrm); else return 1; } else { if (sda->info == INFO_STRXFRM) return -1; else return 0; } } static int compar_text_desc(const void *a, const void *b) { SortData *sda = (SortData *) a; SortData *sdb = (SortData *) b; if (sdb->info == INFO_STRXFRM) { if (sda->info == INFO_STRXFRM) return strcmp(sdb->strxfrm, sda->strxfrm); else return 1; } else { if (sda->info == INFO_STRXFRM) return -1; else return 0; } } void sort_column_text(SortData *sortbuf, int rows, bool desc) { qsort(sortbuf, rows, sizeof(SortData), desc ? compar_text_desc : compar_text_asc); } pspg-2.6.6/src/st_menu.c000066400000000000000000001665141360716715600151340ustar00rootroot00000000000000#include #if defined HAVE_NCURSESW_CURSES_H #include #elif defined HAVE_NCURSESW_H #include #elif defined HAVE_NCURSES_CURSES_H #include #elif defined HAVE_NCURSES_H #include #elif defined HAVE_CURSES_H #include #else /* fallback */ #include #endif #if defined HAVE_NCURSESW_PANEL_H #include #elif defined HAVE_NCURSES_PANEL_H #include #elif defined HAVE_PANEL_H #include #else /* fallback */ #include #endif #include #include #include #include #ifdef HAVE_LIBUNISTRING /* libunistring */ #include #include #include #else /* Alternative minimalistic own unicode support */ #include "unicode.h" #endif #include "st_menu.h" /* * This window is main application window. It is used for taking content * for shadow drawing. */ static WINDOW *desktop_win = NULL; typedef struct { char *c; int length; int row; } ST_MENU_ACCELERATOR; struct ST_MENU { ST_MENU_ITEM *menu_items; WINDOW *draw_area; WINDOW *window; PANEL *panel; WINDOW *shadow_window; PANEL *shadow_panel; int cursor_row; int mouse_row; /* mouse row where button1 was pressed */ int *options; /* state options, initially copyied from menu */ ST_MENU_ACCELERATOR *accelerators; int naccelerators; ST_MENU_CONFIG *config; int shortcut_x_pos; int item_x_pos; int nitems; /* number of menu items */ int *bar_fields_x_pos; /* array of x positions of menubar fields */ int ideal_y_pos; /* y pos when is enough space */ int ideal_x_pos; /* x pos when is enough space */ int rows; /* number of rows */ int cols; /* number of columns */ int focus; /* identify possible event filtering */ char *title; bool is_menubar; struct ST_MENU *active_submenu; struct ST_MENU **submenus; }; struct ST_CMDBAR { ST_CMDBAR_ITEM *cmdbar_items; WINDOW *window; PANEL *panel; ST_MENU_CONFIG *config; int nitems; int *positions; char **labels; ST_CMDBAR_ITEM **ordered_items; }; static struct ST_CMDBAR *active_cmdbar = NULL; static ST_MENU_ITEM *selected_item = NULL; static ST_CMDBAR_ITEM *selected_command = NULL; static bool press_accelerator = false; static bool button1_clicked = false; static bool press_enter = false; static bool command_was_activated = false; static inline int char_length(ST_MENU_CONFIG *config, const char *c); static inline int char_width(ST_MENU_CONFIG *config, char *c, int bytes); static inline int str_width(ST_MENU_CONFIG *config, char *str); static inline char *chr_casexfrm(ST_MENU_CONFIG *config, char *str); static inline int wchar_to_utf8(ST_MENU_CONFIG *config, char *str, int n, wchar_t wch); static bool _st_menu_driver(struct ST_MENU *menu, int c, bool alt, MEVENT *mevent, bool is_top, bool is_nested_pulldown, bool *unpost_submenu); static void _st_menu_free(struct ST_MENU *menu); static int menutext_displaywidth(ST_MENU_CONFIG *config, char *text, char **accelerator, bool *extern_accel); static void pulldownmenu_content_size(ST_MENU_CONFIG *config, ST_MENU_ITEM *menu_items, int *rows, int *columns, int *shortcut_x_pos, int *item_x_pos, ST_MENU_ACCELERATOR *accelerators, int *naccelerators, int *first_row); static void pulldownmenu_draw_shadow(struct ST_MENU *menu); static void menubar_draw(struct ST_MENU *menu); static void pulldownmenu_draw(struct ST_MENU *menu, bool is_top); static void cmdbar_draw(struct ST_CMDBAR *cmdbar); static bool cmdbar_driver(struct ST_CMDBAR *cmdbar, int c, bool alt, MEVENT *mevent); /* * Generic functions */ static inline int max_int(int a, int b) { return a > b ? a : b; } static inline int min_int(int a, int b) { return a < b ? a : b; } static void * safe_malloc(size_t size) { void *ptr = malloc(size); if (!ptr) { endwin(); printf("FATAL: Out of memory\n"); exit(1); } memset(ptr, 0, size); return ptr; } /* * Returns bytes of multibyte char */ static inline int char_length(ST_MENU_CONFIG *config, const char *c) { int result; if (!config->force8bit) { /* * I would not to check validity of UTF8 char. So I pass * 4 as n (max possible size of UTF8 char in bytes). When * in this case, u8_mblen should to return possitive number, * but be sure, and return 1 everytime. * * This functionality can be enhanced to check real size * of utf8 string. */ #ifdef HAVE_LIBUNISTRING result = u8_mblen((const uint8_t *) c, 4); #else result = utf8charlen(*((char *) c)); #endif if (result > 0) return result; } return 1; } /* * Retuns display width of char */ static inline int char_width(ST_MENU_CONFIG *config, char *c, int bytes) { if (!config->force8bit) #ifdef HAVE_LIBUNISTRING return u8_width((const uint8_t *) c, 1, config->encoding); #else return utf_dsplen((const char *) c); #endif return 1; } /* * returns display width of string */ static inline int str_width(ST_MENU_CONFIG *config, char *str) { if (!config->force8bit) #ifdef HAVE_LIBUNISTRING return u8_strwidth((const uint8_t *) str, config->encoding); #else return utf_string_dsplen((const char *) str, strlen(str)); #endif return strlen(str); } /* * Transform string to simply compareable case insensitive string */ static inline char * chr_casexfrm(ST_MENU_CONFIG *config, char *str) { char buffer[20]; char *result; if (!config->force8bit) { #ifdef HAVE_LIBUNISTRING size_t length; length = sizeof(buffer); result = u8_casexfrm((const uint8_t *) str, char_length(config, str), config->language, NULL, buffer, &length); if (result == buffer) { result = strdup(buffer); if (!result) { endwin(); printf("FATAL: out of memory\n"); exit(1); } } #else char buffer2[10]; int chrl = utf8charlen(*str); int fold; strncpy(buffer2, str, chrl); buffer2[chrl] = '\0'; fold = utf8_tofold((const char *) buffer2); *((int *) buffer) = fold; buffer[sizeof(int)] = '\0'; result = strdup(buffer); if (!result) { endwin(); printf("FATAL: out of memory\n"); exit(1); } #endif } else { buffer[0] = tolower(str[0]); buffer[1] = '\0'; result = strdup(buffer); if (!result) { endwin(); printf("FATAL: out of memory\n"); exit(1); } } return result; } /* * Convert wide char to multibyte encoding */ static inline int wchar_to_utf8(ST_MENU_CONFIG *config, char *str, int n, wchar_t wch) { int result; if (!config->force8bit) { #ifdef HAVE_LIBUNISTRING result = u8_uctomb((uint8_t *) str, (ucs4_t) wch, n); #else unicode_to_utf8(wch, (unsigned char *) str, &result); #endif } else { *str = (char) wch; result = 1; } return result; } /* * Workhorse for st_menu_save */ static int _save_menustate(struct ST_MENU *menu, int *cursor_rows, int max_rows, int write_pos) { int active_row = -1; int i; if (write_pos >= max_rows) { endwin(); printf("FATAL: Cannot save menu positions, too complex menu.\n"); exit(1); } cursor_rows[write_pos++] = menu->cursor_row; if (menu->submenus) { for (i = 0; i < menu->nitems; i++) { if (menu->submenus[i]) { write_pos = _save_menustate(menu->submenus[i], cursor_rows, max_rows, write_pos); if (menu->active_submenu == menu->submenus[i]) active_row = i + 1; } } } for (i = 0; i < menu->nitems; i++) cursor_rows[write_pos++] = menu->options[i]; cursor_rows[write_pos++] = active_row; return write_pos; } /* * Workhorse for st_menu_load */ static int _load_menustate(struct ST_MENU *menu, int *cursor_rows, int read_pos) { int active_row; int i; menu->cursor_row = cursor_rows[read_pos++]; if (menu->submenus) { for (i = 0; i < menu->nitems; i++) { if (menu->submenus[i]) { read_pos = _load_menustate(menu->submenus[i], cursor_rows, read_pos); } } } for (i = 0; i < menu->nitems; i++) menu->options[i] = cursor_rows[read_pos++]; active_row = cursor_rows[read_pos++]; if (active_row != -1) menu->active_submenu = menu->submenus[active_row - 1]; return read_pos; } /* * Serialize important fields of menustate to cursor_rows array. */ void st_menu_save(struct ST_MENU *menu, int *cursor_rows, int max_rows) { _save_menustate(menu, cursor_rows, max_rows, 0); } /* * Load cursor positions and active submenu from safe */ void st_menu_load(struct ST_MENU *menu, int *cursor_rows) { _load_menustate(menu, cursor_rows, 0); } /* * Returns display length of some text. ~ char is ignored. * ~~ is used as ~. */ static int menutext_displaywidth(ST_MENU_CONFIG *config, char *text, char **accelerator, bool *extern_accel) { int result = 0; bool _extern_accel = false; char *_accelerator = NULL; bool first_char = true; int bytes; while (*text != '\0') { if (*text == '~' || (*text == '_' && first_char)) { /* * ~~ or __ disable effect of special chars ~ and _. ~x~ defines * internal accelerator (inside menu item text). _x_ defines * external accelerator (displayed before menu item text) _ has this * effect only when it is first char of menu item text. */ if (text[1] == *text) { result += 1; text += 2; } else { if (*text == '_') _extern_accel = true; text += 1; if (_accelerator == NULL) _accelerator = text; /* eat second '_' */ if (_extern_accel) text += 1; } first_char = false; continue; } bytes = char_length(config, text); result += char_width(config, text, bytes); text += bytes; first_char = false; } if (extern_accel) *extern_accel = _extern_accel; if (accelerator) *accelerator = _accelerator; return result; } /* * Collect display info about pulldown menu */ static void pulldownmenu_content_size(ST_MENU_CONFIG *config, ST_MENU_ITEM *menu_items, int *rows, int *columns, int *shortcut_x_pos, int *item_x_pos, ST_MENU_ACCELERATOR *accelerators, int *naccelerators, int *first_row) { char *accelerator; bool has_extern_accel = false; int max_text_width = 0; int max_shortcut_width = 0; int naccel = 0; int default_row = -1; *rows = 0; *columns = 0; *shortcut_x_pos = 0; *first_row = -1; *naccelerators = 0; while (menu_items->text) { bool extern_accel; *rows += 1; if (*menu_items->text && strncmp(menu_items->text, "--", 2) != 0) { int text_width = 0; int shortcut_width = 0; if (*first_row == -1) *first_row = *rows; text_width = menutext_displaywidth(config, menu_items->text, &accelerator, &extern_accel); if (extern_accel) has_extern_accel = true; if (accelerator != NULL) { accelerators[naccel].c = chr_casexfrm(config, accelerator); accelerators[naccel].length = strlen(accelerators[naccel].c); accelerators[naccel++].row = *rows; } if (menu_items->shortcut) shortcut_width = str_width(config, menu_items->shortcut); if (menu_items->submenu) shortcut_width += shortcut_width > 0 ? 2 : 1; if (menu_items->options & ST_MENU_OPTION_DEFAULT && default_row == -1) default_row = *rows; /* * left alligned shortcuts are used by MC style */ if (config->left_alligned_shortcuts) { max_text_width = max_int(max_text_width, 1 + text_width + 2); max_shortcut_width = max_int(max_shortcut_width, shortcut_width); } else *columns = max_int(*columns, 1 + text_width + 1 + (config->extra_inner_space ? 2 : 0) + (shortcut_width > 0 ? shortcut_width + 4 : 0)); } menu_items += 1; } if (config->left_alligned_shortcuts) { *columns = max_text_width + (max_shortcut_width > 0 ? max_shortcut_width + 1 : 0); *shortcut_x_pos = max_text_width; } else *shortcut_x_pos = -1; *naccelerators = naccel; /* * When external accelerators are used, move content to right */ if (has_extern_accel) { *columns += config->extern_accel_text_space + 1; if (*shortcut_x_pos != -1) *shortcut_x_pos += config->extern_accel_text_space + 1; *item_x_pos = config->extern_accel_text_space + 1; } else *item_x_pos = 1; if (default_row != -1) *first_row = default_row; } /* * Draw menubar */ static void menubar_draw(struct ST_MENU *menu) { ST_MENU_ITEM *menu_item = menu->menu_items; ST_MENU_CONFIG *config = menu->config; bool has_focus; bool has_accelerators; int i; selected_item = NULL; /* do nothing when content is invisible */ if (menu->focus == ST_MENU_FOCUS_NONE) return; show_panel(menu->panel); top_panel(menu->panel); update_panels(); has_focus = menu->focus == ST_MENU_FOCUS_FULL; has_accelerators = menu->focus == ST_MENU_FOCUS_FULL || menu->focus == ST_MENU_FOCUS_ALT_MOUSE; if (has_focus) wbkgd(menu->window, COLOR_PAIR(config->menu_background_cpn) | config->menu_background_attr); else wbkgd(menu->window, COLOR_PAIR(config->menu_unfocused_cpn) | config->menu_unfocused_attr); werase(menu->window); i = 0; while (menu_item->text) { char *text = menu_item->text; bool highlight = false; bool is_cursor_row = menu->cursor_row == i + 1 && has_focus; bool is_disabled = menu_item->options & ST_MENU_OPTION_DISABLED; int current_pos; /* bar_fields_x_pos holds x positions of menubar items */ current_pos = menu->bar_fields_x_pos[i]; if (is_cursor_row) { wmove(menu->window, 0, current_pos - 1); wattron(menu->window, COLOR_PAIR(config->cursor_cpn) | config->cursor_attr); waddstr(menu->window, " "); selected_item = menu_item; } else wmove(menu->window, 0, current_pos); if (is_disabled) wattron(menu->window, COLOR_PAIR(config->disabled_cpn) | config->disabled_attr); while (*text) { /* there are not external accelerators */ if (*text == '~') { if (text[1] == '~') { waddstr(menu->window, "~"); text += 2; continue; } if (!is_disabled && has_accelerators) { if (!highlight) { wattron(menu->window, COLOR_PAIR(is_cursor_row ? config->cursor_accel_cpn : config->accelerator_cpn) | (is_cursor_row ? config->cursor_accel_attr : config->accelerator_attr) ); } else { wattroff(menu->window, COLOR_PAIR(is_cursor_row ? config->cursor_accel_cpn : config->accelerator_cpn) | (is_cursor_row ? config->cursor_accel_attr : config->accelerator_attr)); if (is_cursor_row) wattron(menu->window, COLOR_PAIR(config->cursor_cpn) | config->cursor_attr); } highlight = !highlight; } text += 1; } else { int chlen = char_length(config, text); waddnstr(menu->window, text, chlen); text += chlen; } } if (is_cursor_row) { waddstr(menu->window, " "); wattroff(menu->window, COLOR_PAIR(config->cursor_cpn) | config->cursor_attr); } if (is_disabled) wattroff(menu->window, COLOR_PAIR(config->disabled_cpn) | config->disabled_attr); menu_item += 1; i += 1; } wnoutrefresh(menu->window); if (menu->active_submenu) pulldownmenu_draw(menu->active_submenu, true); } #ifdef DEBUG_PIPE static void debug_print_size(WINDOW *window, char *name) { int rows, cols; int y, x; getbegyx(window, y, x); getmaxyx(window, rows, cols); fprintf(debug_pipe, "window \"%s\" y: %d, x: %d, rows: %d. cols: %d\n", name, y, x, rows, cols); } #endif /* * adjust pulldown possition - move panels from ideal position to any position * where can be fully displayed. */ static void pulldownmenu_ajust_position(struct ST_MENU *menu, int maxy, int maxx) { ST_MENU_CONFIG *config = menu->config; int rows, cols; int new_y, new_x; int y, x; getbegyx(menu->window, y, x); getmaxyx(menu->window, rows, cols); /* * Hypothesis: when panel is moved, then assigned windows is moved * to and possibly reduced (when terminal is smaller). But when terminal * grows, then size of assigned window grows too, more than was original * size. So we should to recheck size of assigned window, and fix it, when * it is bigger than should be. */ if (rows != menu->rows || cols != menu->cols) { int new_rows = y + menu->rows <= maxy ? menu->rows : maxy - y + 1; int new_cols = x + menu->cols <= maxx ? menu->cols : maxx - x + 1; if (new_rows != rows || new_cols != cols) wresize(menu->window, new_rows, new_cols); } #ifdef DEBUG_PIPE debug_print_size(menu->window, "menu window"); #endif /* * Previous issue is same for shadow window. But with different timing. * Visibility of shadow needs one row and one column more. The begin of * shadow window should be in relation to begin of menu window. */ if (config->shadow_width > 0) { int srows, scols; /* panel move can move shadow window. Force correct position now */ getmaxyx(menu->shadow_window, srows, scols); mvwin(menu->shadow_window, y+1 , x+config->shadow_width); if (srows != menu->rows || scols != menu->cols) { int new_srows, new_scols; new_srows = y + 1 + menu->rows <= maxy ? menu->rows : maxy - y - 1; new_scols = x + config->shadow_width + menu->cols <= maxx ? menu->cols : maxx - x - config->shadow_width; wresize(menu->shadow_window, new_srows, new_scols); } } #ifdef DEBUG_PIPE debug_print_size(menu->shadow_window, "menu shadow window"); #endif if (menu->ideal_x_pos + menu->cols > maxx) { new_x = maxx - menu->cols; if (new_x < 0) new_x = 0; } else new_x = menu->ideal_x_pos; if (menu->ideal_y_pos + menu->rows > maxy) { new_y = maxy - menu->rows; if (new_y < 1) new_y = 1; } else new_y = menu->ideal_y_pos; if (new_y != y || new_x != x) { int result; result = move_panel(menu->panel, new_y, new_x); /* * move_panel fails when it cannot be displayed completly. * This is problem for shadow window because is n char right, * over left border. So we have to create new window with * different sizes. * Don't try move shadow panel, when a move of menu panel * failed. */ if (result == OK && menu->shadow_panel) { int new_rows, new_cols; int smaxy, smaxx; new_cols = menu->cols - (new_x == menu->ideal_x_pos ? 0 : config->shadow_width); new_rows = menu->rows - (maxy >= new_y + menu->rows + 1 ? 0 : 1); getmaxyx(menu->shadow_window, smaxy, smaxx); if (new_cols <= smaxx || new_rows <= smaxy) { WINDOW *new_shadow_window; new_shadow_window = newwin(new_rows, new_cols, new_y + 1, new_x + config->shadow_width); /* There are no other possibility to resize panel */ replace_panel(menu->shadow_panel, new_shadow_window); delwin(menu->shadow_window); menu->shadow_window = new_shadow_window; wbkgd(menu->shadow_window, COLOR_PAIR(config->menu_shadow_cpn) | config->menu_shadow_attr); wnoutrefresh(menu->shadow_window); } move_panel(menu->shadow_panel, new_y + 1, new_x + config->shadow_width); } } if (menu->active_submenu) pulldownmenu_ajust_position(menu->active_submenu, maxy, maxx); update_panels(); } /* * Draw shadow */ static void pulldownmenu_draw_shadow(struct ST_MENU *menu) { ST_MENU_CONFIG *config = menu->config; if (menu->shadow_window) { int smaxy, smaxx; int i, j; int wmaxy, wmaxx; attr_t shadow_attr; shadow_attr = config->menu_shadow_attr | A_DIM; getmaxyx(menu->shadow_window, smaxy, smaxx); show_panel(menu->shadow_panel); top_panel(menu->shadow_panel); /* desktop_win must be global */ werase(menu->shadow_window); if (desktop_win) overwrite(desktop_win, menu->shadow_window); if (active_cmdbar) overwrite(active_cmdbar->window, menu->shadow_window); wmaxy = smaxy - 1; wmaxx = smaxx - config->shadow_width; #if NCURSES_WIDECHAR > 0 && defined HAVE_NCURSESW for (i = 0; i <= smaxy; i++) for (j = 0; j <= smaxx; j++) { cchar_t cch; wchar_t wch[CCHARW_MAX]; attr_t attr; short int cp; /* skip overwritten content */ if (i < wmaxy && j < wmaxx) continue; mvwin_wch(menu->shadow_window, i, j, &cch); getcchar(&cch, wch, &attr, &cp, NULL); /* * When original attributte holds A_ALTCHARSET bit, then * then updated attributte have to hold this bit too, elsewhere * ACS chars will be broken. */ setcchar(&cch, wch, shadow_attr | (attr & A_ALTCHARSET), config->menu_shadow_cpn, NULL); mvwadd_wch(menu->shadow_window, i, j, &cch); } #else for (i = 0; i <= smaxy; i++) for (j = 0; j <= smaxx; j++) { if (i < wmaxy && j < wmaxx) continue; if (mvwinch(menu->shadow_window, i, j) & A_ALTCHARSET) mvwchgat(menu->shadow_window, i, j, 1, shadow_attr | A_ALTCHARSET, config->menu_shadow_cpn, NULL); else mvwchgat(menu->shadow_window, i, j, 1, shadow_attr, config->menu_shadow_cpn, NULL); } #endif wnoutrefresh(menu->shadow_window); } if (menu->active_submenu) pulldownmenu_draw_shadow(menu->active_submenu); } /* * pulldown menu bar draw */ static void pulldownmenu_draw(struct ST_MENU *menu, bool is_top) { bool draw_box = menu->config->draw_box; ST_MENU_ITEM *menu_items = menu->menu_items; ST_MENU_CONFIG *config = menu->config; WINDOW *draw_area = menu->draw_area; int row = 1; int maxy, maxx; int text_min_x, text_max_x; int *options = menu->options; bool force_ascii_art = config->force_ascii_art; selected_item = NULL; if (is_top) { int stdscr_maxy, stdscr_maxx; /* adjust positions of pulldown menus */ getmaxyx(stdscr, stdscr_maxy, stdscr_maxx); pulldownmenu_ajust_position(menu, stdscr_maxy, stdscr_maxx); /* Draw shadows of window and all nested active pull down menu */ pulldownmenu_draw_shadow(menu); } show_panel(menu->panel); top_panel(menu->panel); update_panels(); werase(menu->window); getmaxyx(draw_area, maxy, maxx); /* be compiler quiet */ (void) maxy; if (draw_box) { if (!force_ascii_art) box(draw_area, 0, 0); else wborder(draw_area, '|', '|','-','-','+','+','+','+'); } text_min_x = (draw_box ? 1 : 0) + (config->extra_inner_space ? 1 : 0); text_max_x = maxx - (draw_box ? 1 : 0) - (config->extra_inner_space ? 1 : 0); while (menu_items->text != NULL) { bool has_submenu = menu_items->submenu ? true : false; bool is_disabled = false; bool is_marked = false; if (options) { int offset = menu_items - menu->menu_items; int option = options[offset]; is_disabled = option & ST_MENU_OPTION_DISABLED; is_marked = option & ST_MENU_OPTION_MARKED; } if (*menu_items->text == '\0' || strncmp(menu_items->text, "--", 2) == 0) { int i; if (draw_box) { wmove(draw_area, row, 0); if (!force_ascii_art) waddch(draw_area, ACS_LTEE); else waddch(draw_area, '|'); } else wmove(draw_area, row - 1, 0); for(i = 0; i < maxx - 1 - (draw_box ? 1 : -1); i++) { if (!force_ascii_art) waddch(draw_area, ACS_HLINE); else waddch(draw_area, '-'); } if (draw_box) { if (!force_ascii_art) waddch(draw_area, ACS_RTEE); else waddch(draw_area, '|'); } } else { char *text = menu_items->text; bool highlight = false; bool is_cursor_row = menu->cursor_row == row; bool first_char = true; bool is_extern_accel; int text_y = -1; int text_x = -1; if (is_cursor_row) { mvwchgat(draw_area, row - (draw_box ? 0 : 1), text_min_x, text_max_x - text_min_x, config->cursor_attr, config->cursor_cpn, NULL); wattron(draw_area, COLOR_PAIR(config->cursor_cpn) | config->cursor_attr); selected_item = menu_items; } if (is_disabled) wattron(menu->window, COLOR_PAIR(config->disabled_cpn) | config->disabled_attr); is_extern_accel = (*text == '_' && text[1] != '_'); if (menu->item_x_pos != 1 && !is_extern_accel) { wmove(draw_area, row - (draw_box ? 0 : 1), text_min_x + 1 + menu->item_x_pos); } else wmove(draw_area, row - (draw_box ? 0 : 1), text_min_x + 1); while (*text) { if (*text == '~' || (*text == '_' && (first_char || highlight))) { if (text[1] == *text) { waddnstr(draw_area, text, 1); text += 2; first_char = false; continue; } if (!is_disabled) { if (!highlight) { wattron(draw_area, COLOR_PAIR(is_cursor_row ? config->cursor_accel_cpn : config->accelerator_cpn) | (is_cursor_row ? config->cursor_accel_attr : config->accelerator_attr)); } else { wattroff(draw_area, COLOR_PAIR(is_cursor_row ? config->cursor_accel_cpn : config->accelerator_cpn) | (is_cursor_row ? config->cursor_accel_attr : config->accelerator_attr)); if (is_cursor_row) wattron(draw_area, COLOR_PAIR(config->cursor_cpn) | config->cursor_attr); if (is_extern_accel) { int y, x; getyx(draw_area, y, x); wmove(draw_area, y, x + config->extern_accel_text_space); } } highlight = !highlight; } text += 1; } else { int chlen = char_length(config, text); /* Save initial position of text. This first char, when is not * external accelerator used, or first char after highlighted char * when extern accelerator is used. */ if (text_y == -1 && text_x == -1) { if (!is_extern_accel || !highlight) getyx(draw_area, text_y, text_x); } waddnstr(draw_area, text, chlen); text += chlen; } first_char = false; } if (menu_items->shortcut != NULL) { if (menu->shortcut_x_pos != -1) { wmove(draw_area, row - (draw_box ? 0 : 1), menu->shortcut_x_pos + (draw_box ? 1 : 0)); } else { int dspl = str_width(config, menu_items->shortcut); wmove(draw_area, row - (draw_box ? 0 : 1), text_max_x - dspl - 1 - (has_submenu ? 2 : 0)); } waddstr(draw_area, menu_items->shortcut); } if (has_submenu) { mvwprintw(draw_area, row - (draw_box ? 0 : 1), text_max_x - 2, "%lc", config->submenu_tag); } if (is_marked) { mvwprintw(draw_area, row - (draw_box ? 0 : 1), text_x - 1, "%lc", config->mark_tag); } if (is_cursor_row) wattroff(draw_area, COLOR_PAIR(config->cursor_cpn) | config->cursor_attr); if (is_disabled) wattroff(menu->window, COLOR_PAIR(config->disabled_cpn) | config->disabled_attr); } menu_items += 1; row += 1; } wnoutrefresh(menu->window); if (menu->active_submenu) pulldownmenu_draw(menu->active_submenu, false); } /* * Sets desktop window - it is used to draw shadow. The window * should be panelized. */ void st_menu_set_desktop_window(WINDOW *win) { desktop_win = win; } /* * Show menu - pull down or menu bar. */ void st_menu_post(struct ST_MENU *menu) { curs_set(0); noecho(); menu->mouse_row = -1; /* show menu */ if (menu->is_menubar) menubar_draw(menu); else pulldownmenu_draw(menu, true); } /* * Hide menu. When close_active_submenu is true, then the path * of active submenu is destroyed - it doesn't rememeber opened * submenus. */ void st_menu_unpost(struct ST_MENU *menu, bool close_active_submenu) { /* hide active submenu */ if (menu->active_submenu) { st_menu_unpost(menu->active_submenu, close_active_submenu); if (close_active_submenu) menu->active_submenu = NULL; } menu->mouse_row = -1; hide_panel(menu->panel); if (menu->shadow_panel) hide_panel(menu->shadow_panel); update_panels(); } /* * Allow to set focus level for menu objects. This allow to * redirect events to some else where focus is not full. */ void st_menu_set_focus(struct ST_MENU *menu, int focus) { menu->focus = focus; } /* * The coordinates of subwin are not "correctly" refreshed, when * parent panel is moved. Maybe it is bug in ncurses, maybe not. * The new coordinates are calculated from parent and offset to parent * and difference between new and old coordinates is applyed on * x, y points. */ static void add_correction(WINDOW *s, int *y, int *x) { WINDOW *p = wgetparent(s); /* * Note: function is_subwin is unknown on some * older ncurses implementations. Don't use it. */ if (p) { int py, px, sy, sx, oy, ox; int fix_y, fix_x; getbegyx(p, py, px); getbegyx(s, sy, sx); getparyx(s, oy, ox); fix_y = sy - (py + oy); fix_x = sx - (px + ox); *y += fix_y; *x += fix_x; } } /* * Handle any outer event - pressed key, or mouse event. This driver * doesn't handle shortcuts - shortcuts are displayed only. * is_top is true, when _st_menu_driver is called first time, when * it is called recursivly, then it is false. Only in top call, the * draw routines can be called. * when unpost_submenu is true, then driver should to unpost active * subwindow of current menu. This info is propagated back - the nested * element tell to owner, close me. */ static bool _st_menu_driver(struct ST_MENU *menu, int c, bool alt, MEVENT *mevent, bool is_top, bool is_nested_pulldown, bool *unpost_submenu) { ST_MENU_CONFIG *config; int cursor_row; /* number of active menu item */ bool is_menubar; /* true, when processed object is menu bar */ int first_row = -1; /* number of row of first enabled item */ int last_row = -1; /* last menu item */ int mouse_row = -1; /* item number selected by mouse */ int search_row = -1; /* code menu selected by accelerator */ bool found_row = false; /* we found new active menu item (row var will be valid) */ bool post_menu = false; /* when it is true, then assiciated pulldown menu will be posted */ int row; bool processed = false; ST_MENU_ITEM *menu_items; /* reset globals */ selected_item = NULL; press_accelerator = false; press_enter = false; button1_clicked = false; *unpost_submenu = false; /* maybe only cmdbar is used */ if (!menu) goto post_process; config = menu->config; cursor_row = menu->cursor_row; /* number of active menu item */ is_menubar = menu->is_menubar; /* true, when processed object is menu bar */ /* Fucus filter */ if ((menu->focus == ST_MENU_FOCUS_MOUSE_ONLY && c != KEY_MOUSE) || (menu->focus == ST_MENU_FOCUS_ALT_MOUSE && c != KEY_MOUSE && !alt) || (menu->focus == ST_MENU_FOCUS_NONE)) goto post_process; /* * Propagate event to nested active object first. When nested object would be * closed, close it. When nested object read event, go to end */ if (menu->active_submenu) { bool _is_nested_pulldown = is_nested_pulldown ? true : (is_menubar ? false : true); bool unpost_submenu = false; /* * Key right is used in pulldown menu for access to nested menu. * When nested menu is active already, then there is not any * work on this level. KEY_RIGHT can buble to menubar and can * be processed there. */ if (!is_menubar && c == KEY_RIGHT) goto post_process; /* * Submenu cannot be top object. When now is not menu bar, then now should be * pulldown menu, and nested object should be nested pulldown menu. */ processed = _st_menu_driver(menu->active_submenu, c, alt, mevent, false, _is_nested_pulldown, &unpost_submenu); if (unpost_submenu) { st_menu_unpost(menu->active_submenu, false); menu->active_submenu = NULL; } /* * When we close some object, then we did some work on this * level, and we should not do more work here. */ if (processed) goto post_process; } /* * The checks of events, that can unpost this level menu. For unposting top * object is responsible the user. */ if (!is_top) { if (c == ST_MENU_ESCAPE) { *unpost_submenu = true; /* * escape should to close all opened objects, so we cannot to * returns true (processed) due we are in top object. */ return is_top ? true : false; } if (c == KEY_MOUSE && mevent->bstate & (BUTTON1_PRESSED | BUTTON1_RELEASED)) { int y = mevent->y; int x = mevent->x; /* * For some styles, the window is different than draw_area. The * draw_area is subwindow of window. When main window is moved * due moving panel (see adjust position), then subwindow has not * expected coordinates. Following routine calculate fix between * current draw_area coordinates and expected coordinates. Then * apply this fix on mouse position. */ add_correction(menu->draw_area, &y, &x); if (!is_menubar && !wenclose(menu->draw_area, y, x)) { *unpost_submenu = true; return false; } } /* * Nested submenu can be unposted by pressing key left */ if (c == KEY_LEFT && is_nested_pulldown) { *unpost_submenu = true; return true; } } if (c == KEY_MOUSE) { #if NCURSES_MOUSE_VERSION > 1 if (mevent->bstate & BUTTON5_PRESSED) { c = KEY_DOWN; } else if (mevent->bstate & BUTTON4_PRESSED) { c = KEY_UP; } else #endif if (mevent->bstate & (BUTTON1_PRESSED | BUTTON1_RELEASED)) { if (is_menubar) { /* * On menubar level we can process mouse event if row is zero, or * we can check if mouse is positioned inside draw area or active * submenu. If not, then we should to unpost active submenu. */ if (mevent->y == 0) { int i = 0; int chars_before; /* * How much chars before active item and following item * specify range of menubar item. */ chars_before = (config->text_space != -1) ? (config->text_space / 2) : 1; menu_items = menu->menu_items; while (menu_items->text) { int minx, maxx; /* first menubar field get mouse from left corner */ minx = i > 0 ? (menu->bar_fields_x_pos[i] - chars_before) : 0; /* last menubar field get mouse to right corner */ maxx = i + 1 < menu->nitems ? menu->bar_fields_x_pos[i + 1] - chars_before : mevent->x + 1; /* transform possitions to target menu code */ if (mevent->x >= minx && mevent->x < maxx) { mouse_row = i + 1; break; } menu_items += 1; i = i + 1; } } } else { int row, col; row = mevent->y; col = mevent->x; /* fix mouse coordinates, if draw_area has "wrong" coordinates */ add_correction(menu->draw_area, &row, &col); /* calculate row from transformed mouse event */ if (wmouse_trafo(menu->draw_area, &row, &col, false)) mouse_row = row + 1 - (config->draw_box ? 1:0); } } } else /* there are no mouse event, reset prev mouse row */ menu->mouse_row = -1; /* * Try to check if key is accelerator. This check should be on last level. * So don't do it if submenu is active. */ if (c != KEY_MOUSE && c != KEY_HOME && c != KEY_END && c != KEY_UP && c != KEY_DOWN && c != KEY_LEFT && c != KEY_RIGHT) { char buffer[20]; char *pressed; int l_pressed; int i; /* * accelerator can be alt accelerator for menuber or non alt, and * the menu should not to have active submenu. */ if ((!alt && !menu->active_submenu) || (alt && is_menubar)) { l_pressed = wchar_to_utf8(config, buffer, 20, (wchar_t) c); buffer[l_pressed] = '\0'; pressed = chr_casexfrm(config, (char *) buffer); l_pressed = strlen(pressed); for (i = 0; i < menu->naccelerators; i++) { if (menu->accelerators[i].length == l_pressed && memcmp(menu->accelerators[i].c, pressed, l_pressed) == 0) { /* check if row is enabled */ search_row = menu->accelerators[i].row; if (menu->options[search_row - 1] & ST_MENU_OPTION_DISABLED) /* revert back, found accelerator is for disabled menu item */ search_row = -1; else break; } } free(pressed); /* Process key in this case only when we found accelerator */ if (search_row != -1) processed = true; } } /* * Iterate over menu items, and try to find next or previous row, code, or mouse * row. */ menu_items = menu->menu_items; row = 1; while (menu_items->text != 0) { if (*menu_items->text != '\0' && (strncmp(menu_items->text, "--", 2) != 0) && ((menu->options[row - 1] & ST_MENU_OPTION_DISABLED) == 0)) { if (first_row == -1) { first_row = row; if (c == KEY_HOME && !is_menubar) { menu->cursor_row = first_row; found_row = true; processed = true; break; } } if (is_menubar) { if (c == KEY_RIGHT && row > cursor_row) { menu->cursor_row = row; found_row = true; processed = true; break; } else if (c == KEY_LEFT && row == cursor_row) { if (last_row != -1) { menu->cursor_row = last_row; found_row = true; processed = true; break; } } } else { /* Is not menubar */ if (c == KEY_DOWN && row > cursor_row) { menu->cursor_row = row; processed = true; found_row = true; break; } else if (c == KEY_UP && row == cursor_row) { if (last_row != -1) { menu->cursor_row = last_row; found_row = true; processed = true; break; } else c = KEY_END; } } if (mouse_row != -1 && row == mouse_row) { menu->cursor_row = row; found_row = true; processed = true; post_menu = true; if (mevent->bstate & BUTTON1_PRESSED) { menu->mouse_row = mouse_row; } else { /* * Fully valid release event for transformation to * clicked event is only event, when PRESSED row * and released row is same. */ if (mevent->bstate& BUTTON1_RELEASED && menu->mouse_row == mouse_row) { button1_clicked = true; } menu->mouse_row = -1; } break; } else if (search_row != -1 && row == search_row) { menu->cursor_row = row; press_accelerator = true; found_row = true; post_menu = true; processed = true; break; } last_row = row; } menu_items += 1; row += 1; } /* * When rows not found, maybe we would to search limit points * or we would to return back in ring buffer of menu items. */ if (!found_row) { if (is_menubar) { if (c == KEY_RIGHT) { menu->cursor_row = first_row; processed = true; } else if (c == KEY_LEFT) { menu->cursor_row = last_row; processed = true; } } else { if (c == KEY_END) { menu->cursor_row = last_row; processed = true; } else if (c == KEY_DOWN) { menu->cursor_row = first_row; processed = true; } } } /* when menubar is changed, unpost active pulldown submenu */ if (menu->active_submenu && cursor_row != menu->cursor_row) { st_menu_unpost(menu->active_submenu, false); menu->active_submenu = NULL; /* remember, submenu was visible */ post_menu = true; } /* enter has sense only on selectable menu item */ if (c == 10 && menu->cursor_row != -1) press_enter = true; /* * Some actions can activate submenu, check it and open it, if it * is required. */ if (press_accelerator || (c == KEY_DOWN && is_menubar) || (c == KEY_RIGHT && !is_menubar) || c == 10 || post_menu) { menu->active_submenu = menu->submenus[menu->cursor_row - 1]; if (menu->active_submenu) { /* when submenu is active, then reset accelerator and mouse flags */ press_accelerator = false; press_enter = false; button1_clicked = false; } /* * When mouse event opens or reopens submenu, then we take * this event as processed event. Valid accelerator is processed * always. Enter (c == 10) is processed always too. */ if (press_accelerator || c == 10) processed = true; else processed = menu->active_submenu != NULL; } /* * We can set processed flag, when some mouse row was founded. That means * so mouse click was somewhere to draw area. */ if (mouse_row != -1) processed = true; post_process: /* * show content, only top object is can do this - nested objects * are displayed recursivly. */ if (is_top) { /* when we processed some event, then we usually got a full focus */ if (processed) menu->focus = ST_MENU_FOCUS_FULL; else { /* * When event was not processed by menubar, then we * we can try to sent it to command bar. But with * full focus, the menubar is hungry, and we send nothing. */ if (active_cmdbar) { if (!menu || menu->focus != ST_MENU_FOCUS_FULL) processed = cmdbar_driver(active_cmdbar, c, alt, mevent); } } /* * command bar should be drawed first - because it is deeper * than pulldown menu */ if (active_cmdbar) cmdbar_draw(active_cmdbar); if (menu) { if (menu->is_menubar) menubar_draw(menu); else pulldownmenu_draw(menu, true); /* eat all keyboard input, when focus is full on top level */ if (c != KEY_MOUSE && c != KEY_RESIZE && c != ST_MENU_ESCAPE && menu->focus == ST_MENU_FOCUS_FULL) processed = true; } } return processed; } bool st_menu_driver(struct ST_MENU *menu, int c, bool alt, MEVENT *mevent) { bool aux_unpost_submenu = false; /* * We should to complete mouse click based on two * events. Mouse click is valid if press, release * was related with same command. Now, when mouse * is pressed, we don't know a related object, but * we can reset selected_command variable. */ if (mevent->bstate & BUTTON1_PRESSED) selected_command = NULL; /* * We would to close pulldown menus on F10 key - similar behave * like SCAPE, so we can translate F10 event to ST_MENU_ESCAPE, * when menubar can accept these keys (based on focus). */ if (menu && KEY_F(10) == c && menu->focus == ST_MENU_FOCUS_FULL) c = ST_MENU_ESCAPE; return _st_menu_driver(menu, c, alt, mevent, true, false, &aux_unpost_submenu); } /* * Create state variable for pulldown menu. It based on template - a array of ST_MENU_ITEM fields. * The initial position can be specified. The config (specify desplay properties) should be * passed. The config can be own or preloaded from preddefined styles by function st_menu_load_style. * a title is not supported yet. */ struct ST_MENU * st_menu_new(ST_MENU_CONFIG *config, ST_MENU_ITEM *menu_items, int begin_y, int begin_x, char *title) { struct ST_MENU *menu; int rows, cols; ST_MENU_ITEM *menu_item; int menu_fields = 0; int i; menu = safe_malloc(sizeof(struct ST_MENU)); menu->menu_items = menu_items; menu->config = config; menu->title = title; menu->naccelerators = 0; menu->is_menubar = false; menu->mouse_row = -1; /* how much items are in template */ menu_item = menu_items; while (menu_item->text != NULL) { menu_fields += 1; menu_item += 1; } /* preallocate good enough memory */ menu->accelerators = safe_malloc(sizeof(ST_MENU_ACCELERATOR) * menu_fields); menu->submenus = safe_malloc(sizeof(struct ST_MENU) * menu_fields); menu->options = safe_malloc(sizeof(int) * menu_fields); menu->nitems = menu_fields; /* get pull down menu dimensions */ pulldownmenu_content_size(config, menu_items, &rows, &cols, &menu->shortcut_x_pos, &menu->item_x_pos, menu->accelerators, &menu->naccelerators, &menu->cursor_row); if (config->draw_box) { rows += 2; cols += 2; } if (config->wide_vborders) cols += 2; if (config->wide_hborders) rows += 2; /* Prepare property for menu shadow */ if (config->shadow_width > 0) { menu->shadow_window = newwin(rows, cols, begin_y + 1, begin_x + config->shadow_width); menu->shadow_panel = new_panel(menu->shadow_window); hide_panel(menu->shadow_panel); wbkgd(menu->shadow_window, COLOR_PAIR(config->menu_shadow_cpn) | config->menu_shadow_attr); wnoutrefresh(menu->shadow_window); } else { menu->shadow_window = NULL; menu->shadow_panel = NULL; } menu->window = newwin(rows, cols, begin_y, begin_x); menu->ideal_y_pos = begin_y; menu->ideal_x_pos = begin_x; menu->rows = rows; menu->cols = cols; wbkgd(menu->window, COLOR_PAIR(config->menu_background_cpn) | config->menu_background_attr); wnoutrefresh(menu->window); /* * Initialize submenu states (nested submenus) */ menu_item = menu_items; i = 0; while (menu_item->text) { if (menu_item->submenu) { menu->submenus[i] = st_menu_new(config, menu_item->submenu, begin_y + i + config->submenu_offset_y + (config->draw_box ? 1 : 0) + (config->wide_vborders ? 1 : 0), begin_x + cols + config->submenu_offset_x, NULL); } else menu->submenus[i] = NULL; menu->options[i] = menu_item->options; menu_item += 1; i += 1; } /* draw area can be same like window or smaller */ if (config->wide_vborders || config->wide_hborders) { menu->draw_area = derwin(menu->window, rows - (config->wide_hborders ? 2 : 0), cols - (config->wide_vborders ? 2 : 0), config->wide_hborders ? 1 : 0, config->wide_vborders ? 1 : 0); wbkgd(menu->draw_area, COLOR_PAIR(config->menu_background_cpn) | config->menu_background_attr); wnoutrefresh(menu->draw_area); } else menu->draw_area = menu->window; menu->panel = new_panel(menu->window); hide_panel(menu->panel); return menu; } /* * Create state variable for menubar based on template (array) of ST_MENU_ITEM */ struct ST_MENU *st_menu_new_menubar2(ST_MENU_CONFIG *barcfg, ST_MENU_CONFIG *pdcfg, ST_MENU_ITEM *menu_items) { struct ST_MENU *menu; int maxy, maxx; ST_MENU_ITEM *menu_item; int menu_fields = 0; int aux_width = 0; int text_space; int current_pos; int i = 0; int naccel = 0; if (pdcfg == NULL) pdcfg = barcfg; getmaxyx(stdscr, maxy, maxx); /* by compiler quiet */ (void) maxy; menu = safe_malloc(sizeof(struct ST_MENU)); menu->window = newwin(1, maxx, 0, 0); menu->panel = new_panel(menu->window); /* there are not shadows */ menu->shadow_window = NULL; menu->shadow_panel = NULL; menu->config = barcfg; menu->menu_items = menu_items; menu->cursor_row = 1; menu->active_submenu = NULL; menu->is_menubar = true; menu->mouse_row = -1; wbkgd(menu->window, COLOR_PAIR(barcfg->menu_background_cpn) | barcfg->menu_background_attr); menu_item = menu_items; while (menu_item->text) { menu_fields += 1; if (barcfg->text_space == -1) aux_width += menutext_displaywidth(barcfg, menu_item->text, NULL, NULL); menu_item += 1; } /* * last bar position is hypotetical - we should not to calculate length of last field * every time. */ menu->bar_fields_x_pos = safe_malloc(sizeof(int) * (menu_fields + 1)); menu->submenus = safe_malloc(sizeof(struct ST_MENU) * menu_fields); menu->accelerators = safe_malloc(sizeof(ST_MENU_ACCELERATOR) * menu_fields); menu->options = safe_malloc(sizeof(int) * menu_fields); menu->nitems = menu_fields; /* * When text_space is not defined, then try to vallign menu items */ if (barcfg->text_space == -1) { text_space = (maxx + 1 - aux_width) / (menu_fields + 1); if (text_space < 4) text_space = 4; else if (text_space > 15) text_space = 15; current_pos = text_space; } else { text_space = barcfg->text_space; current_pos = barcfg->init_text_space; } /* Initialize submenu */ menu_item = menu_items; i = 0; while (menu_item->text) { char *accelerator; menu->bar_fields_x_pos[i] = current_pos; current_pos += menutext_displaywidth(barcfg, menu_item->text, &accelerator, NULL); current_pos += text_space; if (menu_item->submenu) { menu->submenus[i] = st_menu_new(pdcfg, menu_item->submenu, 1, menu->bar_fields_x_pos[i] + pdcfg->menu_bar_menu_offset - (pdcfg->draw_box ? 1 : 0) - (pdcfg->wide_vborders ? 1 : 0) - (pdcfg->extra_inner_space ? 1 : 0) - 1, NULL); } else menu->submenus[i] = NULL; if (accelerator) { menu->accelerators[naccel].c = chr_casexfrm(barcfg, accelerator); menu->accelerators[naccel].length = strlen(menu->accelerators[naccel].c); menu->accelerators[naccel++].row = i + 1; } menu->naccelerators = naccel; menu->options[i] = menu_item->options; menu_item += 1; i += 1; } /* * store hypotetical x bar position */ menu->bar_fields_x_pos[i] = current_pos; return menu; } struct ST_MENU * st_menu_new_menubar(ST_MENU_CONFIG *config, ST_MENU_ITEM *menu_items) { return st_menu_new_menubar2(config, NULL, menu_items); } /* * Remove all objects allocated by menu and nested objects * it is workhorse for st_menu_free */ static void _st_menu_free(struct ST_MENU *menu) { int i; if (menu) { if (menu->submenus) { for (i = 0; i < menu->nitems; i++) st_menu_free(menu->submenus[i]); free(menu->submenus); } if (menu->accelerators) free(menu->accelerators); if (menu->shadow_panel) del_panel(menu->shadow_panel); if (menu->shadow_window) delwin(menu->shadow_window); del_panel(menu->panel); delwin(menu->window); free(menu); } } void st_menu_free(struct ST_MENU *menu) { _st_menu_free(menu); update_panels(); } /* * Returns active item and info about selecting of active item */ ST_MENU_ITEM * st_menu_selected_item(bool *activated) { /* * Activated can be true only when selected_item is valid */ if (selected_item) *activated = press_accelerator || press_enter || button1_clicked; else *activated = false; return selected_item; } /* * Set flag of first menu item specified by code */ bool st_menu_enable_option(struct ST_MENU *menu, int code, int option) { ST_MENU_ITEM *menu_items = menu->menu_items; int i = 0; while (menu_items->text) { if (menu_items->code == code) { menu->options[i] |= option; return true; } if (menu->submenus[i]) if (st_menu_enable_option(menu->submenus[i], code, option)) return true; menu_items += 1; i += 1; } return false; } /* * Reset flag of first menu item specified by code */ bool st_menu_reset_option(struct ST_MENU *menu, int code, int option) { ST_MENU_ITEM *menu_items = menu->menu_items; int i = 0; while (menu_items->text) { if (menu_items->code == code) { menu->options[i] &= ~option; return true; } if (menu->submenus[i]) if (st_menu_reset_option(menu->submenus[i], code, option)) return true; menu_items += 1; i += 1; } return false; } /* * Reset flag of first menu item specified by code */ bool st_menu_reset_all_options(struct ST_MENU *menu, int option) { ST_MENU_ITEM *menu_items = menu->menu_items; int i = 0; while (menu_items->text) { menu->options[i] &= ~option; if (menu->submenus[i]) st_menu_reset_all_options(menu->submenus[i], option); menu_items += 1; i += 1; } return false; } /* * Reset flag of first menu item specified by code */ bool st_menu_reset_all_submenu_options(struct ST_MENU *menu, int menu_code, int option) { ST_MENU_ITEM *menu_items = menu->menu_items; int i = 0; while (menu_items->text) { if (menu->submenus[i]) { if (menu_items->code == menu_code) { st_menu_reset_all_options(menu->submenus[i], option); return true; } if (st_menu_reset_all_submenu_options(menu->submenus[i], menu_code, option)) return true; } menu_items += 1; i += 1; } return false; } /* * Set flag of first menu item specified by code */ bool st_menu_set_option(struct ST_MENU *menu, int code, int option, bool value) { ST_MENU_ITEM *menu_items = menu->menu_items; int i = 0; while (menu_items->text) { if (menu_items->code == code) { if (value) menu->options[i] |= option; else menu->options[i] &= ~option; return true; } if (menu->submenus[i]) if (st_menu_set_option(menu->submenus[i], code, option, value)) return true; menu_items += 1; i += 1; } return false; } /* * Reduce string to expected display width. The buffer should be * preallocated on good enough length - size of src. */ static void reduce_string(ST_MENU_CONFIG *config, int display_width, char *dest, char *src) { int current_width = str_width(config, src); int char_count = 0; while (src && display_width > 0) { if (current_width <= display_width) { strcpy(dest, src); return; } else { int chrlen = char_length(config, src); int dw = char_width(config, src, chrlen); if (char_count < 2) { memcpy(dest, src, chrlen); dest += chrlen; display_width -= dw; } else if (char_count == 2) { *dest++ = '~'; display_width -= 1; } char_count += 1; current_width -= dw; src += chrlen; } } *dest = '\0'; } static void cmdbar_draw(struct ST_CMDBAR *cmdbar) { ST_MENU_CONFIG *config = cmdbar->config; int i; show_panel(cmdbar->panel); top_panel(cmdbar->panel); update_panels(); werase(cmdbar->window); if (config->funckey_bar_style) { for (i = 0; i < cmdbar->nitems; i++) { wmove(cmdbar->window, 0, cmdbar->positions[i]); wattron(cmdbar->window, COLOR_PAIR(config->cursor_cpn) | config->cursor_attr); wprintw(cmdbar->window, "%2d", i+1); wattroff(cmdbar->window, COLOR_PAIR(config->cursor_cpn) | config->cursor_attr); if (cmdbar->labels[i]) waddstr(cmdbar->window, cmdbar->labels[i]); } } else { for (i = 0; i < cmdbar->nitems; i++) { bool need_sep = false; bool marked = false; int accel_prop; int text_prop; marked = &cmdbar->cmdbar_items[i] == selected_command && !command_was_activated; if (marked) { mvwchgat(cmdbar->window, 0, cmdbar->positions[i] - 1, cmdbar->positions[i+1] - config->text_space + 1 - cmdbar->positions[i] + 1, config->cursor_attr, config->cursor_cpn, NULL); accel_prop = COLOR_PAIR(config->cursor_accel_cpn) | config->cursor_accel_attr; text_prop = COLOR_PAIR(config->cursor_cpn) | config->cursor_attr; } else { accel_prop = COLOR_PAIR(config->accelerator_cpn) | config->accelerator_attr; text_prop = COLOR_PAIR(config->menu_unfocused_cpn) | config->menu_unfocused_attr; } wmove(cmdbar->window, 0, cmdbar->positions[i]); wattron(cmdbar->window, accel_prop); if (cmdbar->cmdbar_items[i].alt) { need_sep = true; waddstr(cmdbar->window, "M-"); } if (cmdbar->cmdbar_items[i].fkey > 0) { need_sep = true; wprintw(cmdbar->window, "F%d", cmdbar->cmdbar_items[i].fkey); } wattroff(cmdbar->window, accel_prop); wattron(cmdbar->window, text_prop); if (need_sep) waddstr(cmdbar->window, " "); waddstr(cmdbar->window, cmdbar->cmdbar_items[i].text); wattroff(cmdbar->window, text_prop); } } wnoutrefresh(cmdbar->window); } static bool cmdbar_driver(struct ST_CMDBAR *cmdbar, int c, bool alt, MEVENT *mevent) { ST_CMDBAR_ITEM *cmdbar_item = cmdbar->cmdbar_items; ST_MENU_CONFIG *config = cmdbar->config; if (c == KEY_MOUSE && mevent->bstate & (BUTTON1_PRESSED | BUTTON1_RELEASED)) { int y = mevent->y; int x = mevent->x; int i; if (!wenclose(cmdbar->window, y, x)) { command_was_activated = true; return false; } for (i = 0; i < cmdbar->nitems; i++) { int begin_x = i > 0 ? cmdbar->positions[i] : 0; int next_begin_x = cmdbar->positions[i + 1]; if (!config->funckey_bar_style) { begin_x -= 1; next_begin_x -= 1; } if (begin_x <= x && x < next_begin_x) { if (config->funckey_bar_style) { if (cmdbar->labels[i]) { /* * This design is not exact, but it is good enough. * The click is valid, when press and release is over same * object. */ if (mevent->bstate & BUTTON1_PRESSED) { command_was_activated = false; selected_command = cmdbar->ordered_items[i]; return true; } else if (mevent->bstate & BUTTON1_RELEASED) { if (selected_command == cmdbar->ordered_items[i]) { command_was_activated = true; return true; } } } } else { if (mevent->bstate & BUTTON1_PRESSED) { command_was_activated = false; selected_command = &cmdbar->cmdbar_items[i]; return true; } else if (mevent->bstate & BUTTON1_RELEASED) { if (selected_command == &cmdbar->cmdbar_items[i]) { command_was_activated = true; return true; } } } } } selected_command = NULL; return true; } else { while (cmdbar_item->text) { if (cmdbar_item->alt == alt && KEY_F(cmdbar_item->fkey) == c) { command_was_activated = true; selected_command = cmdbar_item; return true; } cmdbar_item += 1; } } return false; } ST_CMDBAR_ITEM * st_menu_selected_command(bool *activated) { *activated = selected_command != NULL && command_was_activated; return selected_command; } /* * Create state variable for commandbar. It based on template - a array of ST_CMDBAR_ITEM fields. */ struct ST_CMDBAR * st_cmdbar_new(ST_MENU_CONFIG *config, ST_CMDBAR_ITEM *cmdbar_items) { struct ST_CMDBAR *cmdbar; ST_CMDBAR_ITEM *cmdbar_item; int maxy, maxx; int i; int last_position; cmdbar = safe_malloc(sizeof(struct ST_CMDBAR)); cmdbar->cmdbar_items = cmdbar_items; cmdbar->config = config; getmaxyx(stdscr, maxy, maxx); cmdbar->window = newwin(1, maxx, maxy - 1, 0); cmdbar->panel = new_panel(cmdbar->window); wbkgd(cmdbar->window, COLOR_PAIR(config->menu_unfocused_cpn) | config->menu_unfocused_attr); werase(cmdbar->window); cmdbar->nitems = 0; cmdbar_item = cmdbar_items; if (!config->funckey_bar_style) { while (cmdbar_item->text) { cmdbar->nitems += 1; cmdbar_item += 1; } } else cmdbar->nitems = 10; cmdbar->positions = safe_malloc(sizeof(int) * (cmdbar->nitems + 1)); cmdbar->labels = safe_malloc(sizeof(char*) * cmdbar->nitems); cmdbar->ordered_items = safe_malloc(sizeof(ST_CMDBAR_ITEM *) * cmdbar->nitems); last_position = 0; if (config->funckey_bar_style) { int width = maxx / 10; float extra_width = (maxx % 10) / 10.0; float extra_width_sum = 0; if (width < 7) { /* when terminal is too thin, don't show all fields */ cmdbar->nitems = maxx / 7; width = maxx / cmdbar->nitems; extra_width = (maxx % cmdbar->nitems) / (cmdbar->nitems * 1.0); extra_width_sum = 0; } for (i = 0; i < cmdbar->nitems; i++) { cmdbar->positions[i] = last_position; last_position += width; extra_width_sum += extra_width; if (extra_width_sum > 1.0) { last_position += 1; extra_width_sum -= 1; } } cmdbar->positions[cmdbar->nitems] = maxx + 1; cmdbar_item = cmdbar_items; while (cmdbar_item->text) { int fkey = cmdbar_item->fkey; int display_width; if (cmdbar_item->alt) { endwin(); fprintf(stderr, "Alt is not supported in funckey bar style"); exit(1); } if (fkey < 1 || fkey > 10) { endwin(); fprintf(stderr, "fkey code should be between 1 and 10"); exit(1); } /* don't display keys in reduced bar */ if (fkey > cmdbar->nitems) { cmdbar_item += 1; continue; } if (cmdbar->labels[fkey - 1]) { endwin(); fprintf(stderr, "multiple assigned items inside funckey bar"); exit(1); } cmdbar->ordered_items[fkey - 1] = cmdbar_item; display_width = cmdbar->positions[fkey] - cmdbar->positions[fkey - 1] - 2; cmdbar->labels[fkey - 1] = safe_malloc(strlen(cmdbar_item->text) + 1); reduce_string(config, display_width, cmdbar->labels[fkey - 1], cmdbar_item->text); cmdbar_item += 1; } } else { last_position = config->init_text_space; for (i = 0; i < cmdbar->nitems; i++) { cmdbar_item = &cmdbar_items[i]; cmdbar->positions[i] = last_position; if (cmdbar_item->alt) last_position += strlen("M-"); if (cmdbar_item->fkey > 0) last_position += strlen("Fx"); if (cmdbar_item->fkey > 9) last_position += strlen("0"); if (cmdbar->positions[i] != last_position) last_position += 1; last_position += str_width(config, cmdbar_item->text); last_position += config->text_space != -1 ? config->text_space : 3; } cmdbar->positions[cmdbar->nitems] = last_position; } return cmdbar; } void st_cmdbar_post(struct ST_CMDBAR *cmdbar) { active_cmdbar = cmdbar; cmdbar_draw(cmdbar); } void st_cmdbar_unpost(struct ST_CMDBAR *cmdbar) { active_cmdbar = NULL; hide_panel(cmdbar->panel); update_panels(); } void st_cmdbar_free(struct ST_CMDBAR *cmdbar) { int i; active_cmdbar = NULL; del_panel(cmdbar->panel); delwin(cmdbar->window); for (i = 0; i < cmdbar->nitems; i++) if (cmdbar->labels[i]) free(cmdbar->labels[i]); free(cmdbar->labels); free(cmdbar->positions); free(cmdbar->ordered_items); free(cmdbar); update_panels(); } pspg-2.6.6/src/st_menu.h000066400000000000000000000147671360716715600151430ustar00rootroot00000000000000#include #ifndef _ST_MENU_H #define _ST_MENU_H #define ST_MENU_STYLE_MCB 0 #define ST_MENU_STYLE_MC 1 #define ST_MENU_STYLE_VISION 2 #define ST_MENU_STYLE_DOS 3 #define ST_MENU_STYLE_FAND_1 4 #define ST_MENU_STYLE_FAND_2 5 #define ST_MENU_STYLE_FOXPRO 6 #define ST_MENU_STYLE_PERFECT 7 #define ST_MENU_STYLE_NOCOLOR 8 #define ST_MENU_STYLE_ONECOLOR 9 #define ST_MENU_STYLE_TURBO 10 #define ST_MENU_STYLE_PDMENU 11 #define ST_MENU_STYLE_OLD_TURBO 12 #define ST_MENU_STYLE_FREE_DOS 13 #define ST_MENU_STYLE_FREE_DOS_P 14 #define ST_MENU_STYLE_MC46 15 #define ST_MENU_STYLE_DBASE 16 #define ST_MENU_STYLE_MENUWORKS 17 #define ST_MENU_STYLE_TAO 18 #define ST_MENU_STYLE_XGOLD 19 #define ST_MENU_STYLE_XGOLD_BLACK 20 #define ST_MENU_LAST_STYLE ST_MENU_STYLE_XGOLD_BLACK #define ST_MENU_ESCAPE 27 #define ST_MENU_OPTION_DEFAULT 1 #define ST_MENU_OPTION_DISABLED 2 #define ST_MENU_OPTION_MARKED 4 #define ST_MENU_FOCUS_FULL 0 /* all possible events can be processed */ #define ST_MENU_FOCUS_ALT_MOUSE 1 /* only mouse, ALT key events */ #define ST_MENU_FOCUS_MOUSE_ONLY 2 /* only mouse events are processed */ #define ST_MENU_FOCUS_NONE 3 /* menu has not any focus */ /* * Uncomment it and set for your environment when you would to * use named pipe for debugging. * #define DEBUG_PIPE "/home/pavel/debug" */ #ifdef DEBUG_PIPE /* * When you would to use named pipe for debugging, then there should * be active reader from this pipe before start demo application. * In this case "tail -f ~/debug" inside other terminal. */ extern FILE *debug_pipe; extern int debug_eventno; #endif typedef struct st_ST_MENU_ITEM { char *text; /* text of menu item, possible specify accelerator by ~ */ int code; /* code of menu item (optional) */ char *shortcut; /* shortcut text, only printed (optional) */ int data; /* allow to assign some value to menu item (optional) */ char group; /* specify semantics of data value (optional) */ int options; /* locked, marked, ... (optional) */ struct st_ST_MENU_ITEM *submenu; /* reference to nested menu (optional) */ } ST_MENU_ITEM; typedef struct { bool force8bit; char *encoding; const char *language; bool wide_vborders; /* wide vertical menu borders like Turbo Vision */ bool wide_hborders; /* wide horizontal menu borders like custom menu mc */ bool draw_box; /* when true, then box is created */ bool left_alligned_shortcuts; /* when true, a shortcuts are left alligned */ bool funckey_bar_style; /* when true, menu bar is displayed as mc toolbar */ bool extra_inner_space; /* when true, then there 2 spaces between text and border */ bool force_ascii_art; /* use ascii chars for borders */ int shadow_width; /* when shadow_width is higher than zero, shadow is visible */ int menu_background_cpn; /* draw area color pair number */ int menu_background_attr; /* draw area attributte */ int menu_unfocused_cpn; /* draw area color pair number when menu has not focus */ int menu_unfocused_attr; /* draw area attribute when menu has not focus */ int menu_shadow_cpn; /* menu shadow color pair number */ int menu_shadow_attr; /* menu shadow area attributte */ int accelerator_cpn; /* color pair of accelerators */ int accelerator_attr; /* accelerator attributes */ int cursor_cpn; /* cursor color pair */ int cursor_attr; /* cursor attributte */ int cursor_accel_cpn; /* color pair of accelerator on cursor row */ int cursor_accel_attr; /* attributte of of accelerator on cursor row */ int disabled_cpn; /* color of disabled menu fields */ int disabled_attr; /* attributes of disabled menu fields */ int shortcut_space; /* spaces between text and shortcut */ int text_space; /* spaces between text fields (menubar), when it is -1, then dynamic spaces (FAND) */ int init_text_space; /* initial space for menu bar */ int menu_bar_menu_offset; /* offset between menu bar and menu */ int inner_space; /* space between draw area and border, FAND uses 2 spaces */ int extern_accel_text_space; /* space between external accelerator and menu item text */ int submenu_tag; /* symbol used for submenu tag */ int submenu_offset_y; /* offset for submenu related to right border of parent menu window */ int submenu_offset_x; /* offset for submenu related to cursor in parent menu window */ int mark_tag; /* symbol used for mark tag */ } ST_MENU_CONFIG; struct ST_MENU; typedef struct { char *text; /* text of command bar field */ bool alt; /* should be used like Alt+FX */ int fkey; /* Func key number */ int code; /* code of command bar item */ int option; /* locked, marked, ... (optional) */ } ST_CMDBAR_ITEM; struct ST_CMDBAR; extern int st_menu_load_style(ST_MENU_CONFIG *config, int style, int start_from_cpn); extern int st_menu_load_style_rgb(ST_MENU_CONFIG *config, int style, int start_from_cpn, int *start_from_rgb); extern void st_menu_set_desktop_window(WINDOW *win); extern struct ST_MENU *st_menu_new(ST_MENU_CONFIG *config, ST_MENU_ITEM *items, int begin_y, int begin_x, char *title); extern struct ST_MENU *st_menu_new_menubar(ST_MENU_CONFIG *config, ST_MENU_ITEM *items); extern struct ST_MENU *st_menu_new_menubar2(ST_MENU_CONFIG *barcfg, ST_MENU_CONFIG *pdcfg, ST_MENU_ITEM *items); extern void st_menu_post(struct ST_MENU *menu); extern void st_menu_unpost(struct ST_MENU *menu, bool close_active_submenu); extern bool st_menu_driver(struct ST_MENU *menu, int c, bool alt, MEVENT *mevent); extern void st_menu_free(struct ST_MENU *menu); extern void st_menu_save(struct ST_MENU *menu, int *cursor_rows, int max_rows); extern void st_menu_load(struct ST_MENU *menu, int *cursor_rows); extern ST_MENU_ITEM *st_menu_selected_item(bool *activated); extern ST_CMDBAR_ITEM *st_menu_selected_command(bool *activated); extern bool st_menu_enable_option(struct ST_MENU *menu, int code, int option); extern bool st_menu_reset_option(struct ST_MENU *menu, int code, int option); extern bool st_menu_set_option(struct ST_MENU *menu, int code, int option, bool value); extern bool st_menu_reset_all_submenu_options(struct ST_MENU *menu, int menu_code, int option); extern bool st_menu_reset_all_options(struct ST_MENU *menu, int option); extern void st_menu_set_focus(struct ST_MENU *menu, int focus); extern struct ST_CMDBAR *st_cmdbar_new(ST_MENU_CONFIG *config, ST_CMDBAR_ITEM *cmdbar_items); extern void st_cmdbar_post(struct ST_CMDBAR *cmdbar); extern void st_cmdbar_unpost(struct ST_CMDBAR *cmdbar); extern void st_cmdbar_free(struct ST_CMDBAR *cmdbar); #endif pspg-2.6.6/src/st_menu_styles.c000066400000000000000000000703241360716715600165300ustar00rootroot00000000000000#include #include "st_menu.h" #if defined HAVE_NCURSESW_CURSES_H #include #elif defined HAVE_NCURSESW_H #include #elif defined HAVE_NCURSES_CURSES_H #include #elif defined HAVE_NCURSES_H #include #elif defined HAVE_CURSES_H #include #else /* fallback */ #include #endif #include /* 0..255 rgb based colors */ static void init_color_rgb_ff(short color, short r, short g, short b) { init_color(color, (r / 255.0) * 1000.0, (g / 255.0) * 1000.0, (b / 255.0) * 1000.0); } /* * Set ligh colour */ static attr_t slc(short id, short foreground, short background) { if (COLORS == 8 || foreground == -1) { init_pair(id, foreground, background); return A_BOLD; } else if (foreground < 8) { init_pair(id, foreground + 8, background); return 0; } else { init_pair(id, foreground, background); return 0; } } #define islc(f,b) (slc(start_from_cpn++, f, b)) /* * Prepared styles - config settings. start_from_cpn is first color pair * number that can be used by st_menu library. For ST_MENU_STYLE_ONECOLOR * style it is number of already existing color pair. */ int st_menu_load_style(ST_MENU_CONFIG *config, int style, int start_from_cpn) { return st_menu_load_style_rgb(config, style, start_from_cpn, NULL); } int st_menu_load_style_rgb(ST_MENU_CONFIG *config, int style, int start_from_cpn, int *start_from_rgb) { memset(config, 0, sizeof(ST_MENU_CONFIG)); config->submenu_tag = '>'; config->mark_tag = '*'; config->draw_box = true; config->extern_accel_text_space = 2; config->force_ascii_art = false; config->submenu_offset_y = 0; config->submenu_offset_x = 0; #if defined HAVE_NCURSESW if (!config->force8bit) config->mark_tag = L'\x2714'; #endif config->funckey_bar_style = false; switch (style) { case ST_MENU_STYLE_MCB: config->menu_background_cpn = start_from_cpn; config->menu_background_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_WHITE); config->menu_unfocused_cpn = start_from_cpn; config->menu_unfocused_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_WHITE); config->menu_shadow_cpn = start_from_cpn; config->menu_shadow_attr = 0; init_pair(start_from_cpn++, COLOR_WHITE, COLOR_BLACK); config->accelerator_cpn = start_from_cpn; config->accelerator_attr = islc(COLOR_WHITE, COLOR_BLACK); config->cursor_cpn = start_from_cpn; config->cursor_attr = 0; init_pair(start_from_cpn++, -1, -1); config->cursor_accel_cpn = start_from_cpn; config->cursor_accel_attr = islc(COLOR_WHITE, COLOR_BLACK); config->disabled_cpn = config->menu_background_cpn; config->disabled_attr = A_BOLD; config->left_alligned_shortcuts = true; config->wide_vborders = false; config->wide_hborders = false; config->shortcut_space = 5; config->text_space = 5; config->init_text_space = 2; config->menu_bar_menu_offset = 0; config->shadow_width = 0; config->funckey_bar_style = true; break; case ST_MENU_STYLE_MC: config->menu_background_cpn = start_from_cpn; config->menu_background_attr = islc(COLOR_WHITE, COLOR_CYAN); config->menu_unfocused_cpn = start_from_cpn; config->menu_unfocused_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_CYAN); config->menu_shadow_cpn = start_from_cpn; config->menu_shadow_attr = 0; init_pair(start_from_cpn++, COLOR_WHITE, COLOR_BLACK); config->accelerator_cpn = start_from_cpn; config->accelerator_attr = islc(COLOR_YELLOW, COLOR_CYAN); config->cursor_cpn = start_from_cpn; config->cursor_attr = islc(COLOR_WHITE, COLOR_BLACK); config->cursor_accel_cpn = start_from_cpn; config->cursor_accel_attr = islc(COLOR_YELLOW, COLOR_BLACK); config->disabled_cpn = start_from_cpn; config->disabled_attr = islc(COLOR_BLACK, COLOR_CYAN); config->left_alligned_shortcuts = true; config->wide_vborders = false; config->wide_hborders = false; config->extra_inner_space = false; config->shortcut_space = 5; config->text_space = 5; config->init_text_space = 2; config->menu_bar_menu_offset = 0; config->shadow_width = 2; config->funckey_bar_style = true; break; case ST_MENU_STYLE_VISION: config->menu_background_cpn = start_from_cpn; config->menu_background_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_WHITE); config->menu_unfocused_cpn = start_from_cpn; config->menu_unfocused_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_WHITE); config->menu_shadow_cpn = start_from_cpn; config->menu_shadow_attr = 0; init_pair(start_from_cpn++, COLOR_WHITE, COLOR_BLACK); config->accelerator_cpn = start_from_cpn; config->accelerator_attr = 0; init_pair(start_from_cpn++, COLOR_RED, COLOR_WHITE); config->cursor_cpn = start_from_cpn; config->cursor_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_GREEN); config->cursor_accel_cpn = start_from_cpn; config->cursor_accel_attr = 0; init_pair(start_from_cpn++, COLOR_RED, COLOR_GREEN); config->disabled_cpn = start_from_cpn; config->disabled_attr = islc(COLOR_BLACK, COLOR_WHITE); config->left_alligned_shortcuts = false; config->wide_vborders = true; config->wide_hborders = false; config->extra_inner_space = false; config->shortcut_space = 4; config->text_space = 2; config->init_text_space = 2; config->menu_bar_menu_offset = 1; config->shadow_width = 2; if (!config->force8bit) config->submenu_tag = L'\x25BA'; config->submenu_offset_y = 0; config->submenu_offset_x = -15; break; case ST_MENU_STYLE_DOS: config->menu_background_cpn = start_from_cpn; config->menu_background_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_WHITE); config->menu_unfocused_cpn = start_from_cpn; config->menu_unfocused_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_WHITE); config->menu_shadow_cpn = start_from_cpn; config->menu_shadow_attr = 0; init_pair(start_from_cpn++, COLOR_WHITE, COLOR_BLACK); config->accelerator_cpn = start_from_cpn; config->accelerator_attr = islc(COLOR_WHITE, COLOR_WHITE); config->cursor_cpn = start_from_cpn; config->cursor_attr = 0; init_pair(start_from_cpn++, COLOR_WHITE, COLOR_BLACK); config->cursor_accel_cpn = start_from_cpn; config->cursor_accel_attr = islc(COLOR_WHITE, COLOR_BLACK); config->disabled_cpn = start_from_cpn; config->disabled_attr = islc(COLOR_BLACK, COLOR_WHITE); config->left_alligned_shortcuts = false; config->wide_vborders = false; config->wide_hborders = false; config->extra_inner_space = false; config->shortcut_space = 4; config->text_space = 2; config->init_text_space = 1; config->menu_bar_menu_offset = 1; config->shadow_width = 2; break; case ST_MENU_STYLE_FAND_1: config->menu_background_cpn = start_from_cpn; config->menu_background_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_CYAN); config->menu_unfocused_cpn = start_from_cpn; config->menu_unfocused_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_CYAN); config->menu_shadow_cpn = start_from_cpn; config->menu_shadow_attr = 0; init_pair(start_from_cpn++, COLOR_WHITE, COLOR_BLACK); config->accelerator_cpn = start_from_cpn; config->accelerator_attr = 0; init_pair(start_from_cpn++, COLOR_RED, COLOR_CYAN); config->cursor_cpn = start_from_cpn; config->cursor_attr = islc(COLOR_YELLOW, COLOR_BLUE); config->cursor_accel_cpn = start_from_cpn; config->cursor_accel_attr = islc(COLOR_YELLOW, COLOR_BLUE); config->disabled_cpn = start_from_cpn; config->disabled_attr = islc(COLOR_BLACK, COLOR_CYAN); config->left_alligned_shortcuts = false; config->wide_vborders = false; config->wide_hborders = false; config->extra_inner_space = true; config->shortcut_space = 4; config->text_space = -1; config->init_text_space = 1; config->menu_bar_menu_offset = 2; config->shadow_width = 2; if (!config->force8bit) config->submenu_tag = L'\x00BB'; break; case ST_MENU_STYLE_FAND_2: config->menu_background_cpn = start_from_cpn; config->menu_background_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_CYAN); config->menu_unfocused_cpn = start_from_cpn; config->menu_unfocused_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_CYAN); config->menu_shadow_cpn = start_from_cpn; config->menu_shadow_attr = 0; init_pair(start_from_cpn++, COLOR_WHITE, COLOR_BLACK); config->accelerator_cpn = start_from_cpn; config->accelerator_attr = islc(COLOR_CYAN, COLOR_CYAN); config->cursor_cpn = start_from_cpn; config->cursor_attr = islc(COLOR_YELLOW, COLOR_BLUE); config->cursor_accel_cpn = start_from_cpn; config->cursor_accel_attr = islc(COLOR_YELLOW, COLOR_BLUE); config->disabled_cpn = start_from_cpn; config->disabled_attr = islc(COLOR_BLACK, COLOR_CYAN); config->left_alligned_shortcuts = false; config->wide_vborders = false; config->wide_hborders = false; config->extra_inner_space = true; config->shortcut_space = 4; config->text_space = -1; config->init_text_space = 1; config->menu_bar_menu_offset = 2; config->shadow_width = 2; if (!config->force8bit) config->submenu_tag = L'\x00BB'; break; case ST_MENU_STYLE_FOXPRO: config->menu_background_cpn = start_from_cpn; config->menu_background_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_WHITE); config->menu_unfocused_cpn = start_from_cpn; config->menu_unfocused_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_WHITE); config->menu_shadow_cpn = start_from_cpn; config->menu_shadow_attr = 0; init_pair(start_from_cpn++, COLOR_WHITE, COLOR_BLACK); config->accelerator_cpn = start_from_cpn; config->accelerator_attr = islc(COLOR_WHITE, COLOR_WHITE); config->cursor_cpn = start_from_cpn; config->cursor_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_CYAN); config->cursor_accel_cpn = start_from_cpn; config->cursor_accel_attr = islc(COLOR_WHITE, COLOR_CYAN); /* This is different, from original, but cyan text is not readable */ config->disabled_cpn = start_from_cpn; config->disabled_attr = A_DIM | islc(COLOR_CYAN, COLOR_WHITE); config->left_alligned_shortcuts = false; config->wide_vborders = false; config->wide_hborders = false; config->extra_inner_space = false; config->shortcut_space = 4; config->text_space = 2; config->init_text_space = 1; config->menu_bar_menu_offset = 1; config->shadow_width = 2; break; case ST_MENU_STYLE_PERFECT: config->menu_background_cpn = start_from_cpn; config->menu_background_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_WHITE); config->menu_unfocused_cpn = start_from_cpn; config->menu_unfocused_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_WHITE); config->menu_shadow_cpn = start_from_cpn; config->menu_shadow_attr = 0; init_pair(start_from_cpn++, COLOR_WHITE, COLOR_BLACK); config->accelerator_cpn = start_from_cpn; config->accelerator_attr = 0; init_pair(start_from_cpn++, COLOR_RED, COLOR_WHITE); config->cursor_cpn = start_from_cpn; config->cursor_attr = islc(COLOR_WHITE, COLOR_RED); config->cursor_accel_cpn = start_from_cpn; config->cursor_accel_attr = islc(COLOR_WHITE, COLOR_RED); config->disabled_cpn = start_from_cpn; config->disabled_attr = islc(COLOR_BLACK, COLOR_WHITE); config->left_alligned_shortcuts = false; config->wide_vborders = false; config->wide_hborders = false; config->extra_inner_space = false; config->shortcut_space = 4; config->text_space = 2; config->init_text_space = 1; config->menu_bar_menu_offset = 1; config->shadow_width = 2; if (!config->force8bit) config->submenu_tag = L'\x2BC8'; break; case ST_MENU_STYLE_NOCOLOR: config->menu_background_cpn = 0; config->menu_background_attr = 0; config->menu_unfocused_cpn = 0; config->menu_unfocused_attr = 0; config->menu_shadow_cpn = start_from_cpn; config->menu_shadow_attr = A_REVERSE; config->accelerator_cpn = 0; config->accelerator_attr = A_UNDERLINE; config->cursor_cpn = 0; config->cursor_attr = A_REVERSE; config->cursor_accel_cpn = 0; config->cursor_accel_attr = A_UNDERLINE | A_REVERSE; config->disabled_cpn = 0; config->disabled_attr = A_DIM; config->left_alligned_shortcuts = false; config->wide_vborders = false; config->wide_hborders = false; config->extra_inner_space = false; config->shortcut_space = 4; config->text_space = 2; config->init_text_space = 1; config->menu_bar_menu_offset = 1; config->shadow_width = 0; break; case ST_MENU_STYLE_ONECOLOR: config->menu_background_cpn = start_from_cpn; config->menu_background_attr = 0; config->menu_unfocused_cpn = start_from_cpn; config->menu_unfocused_attr = 0; config->menu_shadow_cpn = start_from_cpn; config->menu_shadow_attr = A_REVERSE; config->accelerator_cpn = start_from_cpn; config->accelerator_attr = A_UNDERLINE; config->cursor_cpn = start_from_cpn; config->cursor_attr = A_REVERSE; config->cursor_accel_cpn = start_from_cpn; config->cursor_accel_attr = A_UNDERLINE | A_REVERSE; config->disabled_cpn = start_from_cpn; config->disabled_attr = A_DIM; config->left_alligned_shortcuts = false; config->wide_vborders = false; config->wide_hborders = false; config->shortcut_space = 4; config->text_space = 2; config->init_text_space = 1; config->menu_bar_menu_offset = 1; config->extra_inner_space = false; config->shortcut_space = 4; config->text_space = 2; config->init_text_space = 1; config->menu_bar_menu_offset = 1; config->shadow_width = 0; break; case ST_MENU_STYLE_TURBO: config->menu_background_cpn = start_from_cpn; config->menu_background_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_WHITE); config->menu_unfocused_cpn = start_from_cpn; config->menu_unfocused_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_WHITE); config->menu_shadow_cpn = start_from_cpn; config->menu_shadow_attr = 0; init_pair(start_from_cpn++, COLOR_WHITE, COLOR_BLACK); config->accelerator_cpn = start_from_cpn; config->accelerator_attr = 0; init_pair(start_from_cpn++, COLOR_RED, COLOR_WHITE); config->cursor_cpn = start_from_cpn; config->cursor_attr = islc(COLOR_WHITE, COLOR_BLACK); config->cursor_accel_cpn = start_from_cpn; config->cursor_accel_attr = islc(COLOR_WHITE, COLOR_BLACK); config->disabled_cpn = start_from_cpn; config->disabled_attr = islc(COLOR_BLACK, COLOR_WHITE); config->left_alligned_shortcuts = false; config->wide_vborders = false; config->wide_hborders = false; config->extra_inner_space = false; config->shortcut_space = 4; config->text_space = 2; config->init_text_space = 1; config->menu_bar_menu_offset = 1; config->shadow_width = 2; break; case ST_MENU_STYLE_PDMENU: config->menu_background_cpn = start_from_cpn; config->menu_background_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_CYAN); config->menu_unfocused_cpn = start_from_cpn; config->menu_unfocused_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_CYAN); config->menu_shadow_cpn = start_from_cpn; config->menu_shadow_attr = 0; init_pair(start_from_cpn++, COLOR_WHITE, COLOR_BLACK); config->accelerator_cpn = start_from_cpn; config->accelerator_attr = islc(COLOR_WHITE, COLOR_CYAN); config->cursor_cpn = start_from_cpn; config->cursor_attr = 0; init_pair(start_from_cpn++, COLOR_CYAN, COLOR_BLACK); config->cursor_accel_cpn = start_from_cpn; config->cursor_accel_attr = islc(COLOR_WHITE, COLOR_BLACK); config->disabled_cpn = start_from_cpn; config->disabled_attr = islc(COLOR_BLACK, COLOR_CYAN); config->left_alligned_shortcuts = false; config->wide_vborders = false; config->wide_hborders = false; config->extra_inner_space = false; config->shortcut_space = 4; config->text_space = 2; config->init_text_space = 1; config->menu_bar_menu_offset = 1; config->shadow_width = 2; break; case ST_MENU_STYLE_OLD_TURBO: config->menu_background_cpn = start_from_cpn; config->menu_background_attr = islc(COLOR_YELLOW, COLOR_BLUE); config->menu_unfocused_cpn = start_from_cpn; config->menu_unfocused_attr = islc(COLOR_YELLOW, COLOR_BLUE); config->accelerator_cpn = start_from_cpn; config->accelerator_attr = islc(COLOR_CYAN, COLOR_BLUE); config->cursor_cpn = start_from_cpn; config->cursor_attr = islc(COLOR_YELLOW, COLOR_MAGENTA); config->cursor_accel_cpn = start_from_cpn; config->cursor_accel_attr = islc(COLOR_YELLOW, COLOR_MAGENTA); config->disabled_cpn = start_from_cpn; config->disabled_attr = A_DIM | islc(COLOR_WHITE, COLOR_BLUE); config->left_alligned_shortcuts = true; config->wide_vborders = false; config->wide_hborders = false; config->extra_inner_space = false; config->shortcut_space = 4; config->text_space = 2; config->init_text_space = 1; config->menu_bar_menu_offset = 1; config->shadow_width = 0; break; case ST_MENU_STYLE_FREE_DOS: config->menu_background_cpn = start_from_cpn; config->menu_background_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_WHITE); config->menu_unfocused_cpn = start_from_cpn; config->menu_unfocused_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_WHITE); config->menu_shadow_cpn = start_from_cpn; config->menu_shadow_attr = 0; init_pair(start_from_cpn++, COLOR_WHITE, COLOR_BLACK); config->accelerator_cpn = start_from_cpn; config->accelerator_attr = 0; init_pair(start_from_cpn++, COLOR_RED, COLOR_WHITE); config->cursor_cpn = start_from_cpn; config->cursor_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_CYAN); config->cursor_accel_cpn = start_from_cpn; config->cursor_accel_attr = 0; init_pair(start_from_cpn++, COLOR_RED, COLOR_CYAN); /* This is different, from original, but cyan text is not readable */ config->disabled_cpn = start_from_cpn; config->disabled_attr = islc(COLOR_BLACK, COLOR_WHITE); config->left_alligned_shortcuts = false; config->wide_vborders = false; config->wide_hborders = false; config->extra_inner_space = false; config->shortcut_space = 4; config->text_space = 2; config->init_text_space = 2; config->menu_bar_menu_offset = 0; config->shadow_width = 1; break; case ST_MENU_STYLE_FREE_DOS_P: config->menu_background_cpn = start_from_cpn; config->menu_background_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_CYAN); config->menu_unfocused_cpn = start_from_cpn; config->menu_unfocused_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_CYAN); config->menu_shadow_cpn = start_from_cpn; config->menu_shadow_attr = 0; init_pair(start_from_cpn++, COLOR_WHITE, COLOR_BLACK); config->accelerator_cpn = start_from_cpn; config->accelerator_attr = 0; init_pair(start_from_cpn++, COLOR_RED, COLOR_CYAN); config->cursor_cpn = start_from_cpn; config->cursor_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_WHITE); config->cursor_accel_cpn = start_from_cpn; config->cursor_accel_attr = 0; init_pair(start_from_cpn++, COLOR_RED, COLOR_WHITE); /* This is different, from original, but cyan text is not readable */ config->disabled_cpn = start_from_cpn; config->disabled_attr = islc(COLOR_BLACK, COLOR_CYAN); config->left_alligned_shortcuts = false; config->wide_vborders = false; config->wide_hborders = false; config->extra_inner_space = false; config->shortcut_space = 4; config->text_space = 2; config->init_text_space = 1; config->menu_bar_menu_offset = 1; config->shadow_width = 1; break; case ST_MENU_STYLE_MC46: config->menu_background_cpn = start_from_cpn; config->menu_background_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_CYAN); config->menu_unfocused_cpn = start_from_cpn; config->menu_unfocused_attr = 0; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_CYAN); config->menu_shadow_cpn = start_from_cpn; config->menu_shadow_attr = 0; init_pair(start_from_cpn++, COLOR_WHITE, COLOR_BLACK); config->accelerator_cpn = start_from_cpn; config->accelerator_attr = islc(COLOR_YELLOW, COLOR_CYAN); config->cursor_cpn = start_from_cpn; config->cursor_attr = islc(COLOR_WHITE, COLOR_BLACK); config->cursor_accel_cpn = start_from_cpn; config->cursor_accel_attr = islc(COLOR_YELLOW, COLOR_BLACK); config->disabled_cpn = start_from_cpn; config->disabled_attr = islc(COLOR_BLACK, COLOR_CYAN); config->left_alligned_shortcuts = true; config->wide_vborders = false; config->wide_hborders = false; config->extra_inner_space = false; config->shortcut_space = 5; config->text_space = 5; config->init_text_space = 2; config->menu_bar_menu_offset = 0; config->shadow_width = 0; config->funckey_bar_style = true; break; case ST_MENU_STYLE_DBASE: config->menu_background_cpn = start_from_cpn; config->menu_background_attr = islc(COLOR_WHITE, COLOR_BLACK); config->menu_unfocused_cpn = start_from_cpn; config->menu_unfocused_attr = islc(COLOR_WHITE, COLOR_BLACK); config->menu_shadow_cpn = start_from_cpn; config->menu_shadow_attr = 0; init_pair(start_from_cpn++, COLOR_WHITE, COLOR_BLACK); config->accelerator_cpn = start_from_cpn; config->accelerator_attr = A_UNDERLINE | islc(COLOR_WHITE, COLOR_BLACK); config->cursor_cpn = start_from_cpn; config->cursor_attr = islc(COLOR_YELLOW, COLOR_CYAN); config->cursor_accel_cpn = start_from_cpn; config->cursor_accel_attr = A_UNDERLINE | islc(COLOR_YELLOW, COLOR_CYAN); config->disabled_cpn = start_from_cpn; config->disabled_attr = A_DIM | islc(COLOR_WHITE, COLOR_BLACK); config->left_alligned_shortcuts = true; config->wide_vborders = false; config->wide_hborders = false; config->extra_inner_space = false; config->shortcut_space = 5; config->text_space = 5; config->init_text_space = 2; config->menu_bar_menu_offset = 1; config->shadow_width = 2; break; case ST_MENU_STYLE_MENUWORKS: config->menu_background_cpn = start_from_cpn; config->menu_background_attr = islc(COLOR_WHITE, COLOR_RED); config->menu_unfocused_cpn = start_from_cpn; config->menu_unfocused_attr = islc(COLOR_WHITE, COLOR_BLACK); config->menu_shadow_cpn = start_from_cpn; config->menu_shadow_attr = 0; init_pair(start_from_cpn++, COLOR_BLUE, COLOR_BLACK); config->accelerator_cpn = start_from_cpn; config->accelerator_attr = A_UNDERLINE | islc(COLOR_YELLOW, COLOR_RED); config->cursor_cpn = start_from_cpn; config->cursor_attr = islc(COLOR_YELLOW, COLOR_BLACK); config->cursor_accel_cpn = start_from_cpn; config->cursor_accel_attr = A_UNDERLINE | islc(COLOR_YELLOW, COLOR_BLACK); config->disabled_cpn = start_from_cpn; config->disabled_attr = A_DIM | islc(COLOR_WHITE, COLOR_RED); config->left_alligned_shortcuts = true; config->wide_vborders = false; config->wide_hborders = false; config->extra_inner_space = false; config->shortcut_space = 5; config->text_space = 5; config->init_text_space = 2; config->menu_bar_menu_offset = 1; config->shadow_width = 2; break; case ST_MENU_STYLE_TAO: if (start_from_rgb) { int _start_from_rgb = *start_from_rgb; *start_from_rgb += 5; init_color_rgb_ff(_start_from_rgb + 0, 0xfa, 0xfa, 0xfa); /* menu bg */ init_color_rgb_ff(_start_from_rgb + 1, 0x17, 0x17, 0x17); /* menu fg */ init_color_rgb_ff(_start_from_rgb + 2, 0x4e, 0x4e, 0x4e); /* cursor bg */ init_color_rgb_ff(_start_from_rgb + 3, 0xaa, 0xaa, 0xaa); /* shadow */ init_color_rgb_ff(_start_from_rgb + 4, 0x66, 0x66, 0x66); /* shadow */ config->menu_background_cpn = start_from_cpn; init_pair(start_from_cpn++, _start_from_rgb + 1, _start_from_rgb + 0); config->menu_background_attr = 0; config->menu_unfocused_cpn = start_from_cpn; init_pair(start_from_cpn++, _start_from_rgb + 1, _start_from_rgb + 0); config->menu_unfocused_attr = 0; config->menu_shadow_cpn = start_from_cpn; config->menu_shadow_attr = 0; init_pair(start_from_cpn++, COLOR_WHITE, _start_from_rgb + 3); config->accelerator_cpn = start_from_cpn; init_pair(start_from_cpn++, _start_from_rgb + 1, _start_from_rgb + 0); config->accelerator_attr = A_UNDERLINE | A_BOLD; config->cursor_cpn = start_from_cpn; init_pair(start_from_cpn++, _start_from_rgb + 0, _start_from_rgb + 2); config->cursor_attr = 0; config->cursor_accel_cpn = start_from_cpn; init_pair(start_from_cpn++, _start_from_rgb + 0, _start_from_rgb + 2); config->cursor_accel_attr = A_UNDERLINE ; config->disabled_cpn = start_from_cpn; init_pair(start_from_cpn, _start_from_rgb + 4, _start_from_rgb + 0); config->disabled_attr = 0; } else { /* fallback */ config->menu_background_cpn = start_from_cpn; config->menu_background_attr = islc(COLOR_BLACK, COLOR_WHITE); config->menu_unfocused_cpn = start_from_cpn; config->menu_unfocused_attr = islc(COLOR_BLACK, COLOR_WHITE); config->menu_shadow_cpn = start_from_cpn; config->menu_shadow_attr = 0; init_pair(start_from_cpn++, COLOR_BLUE, COLOR_BLACK); config->accelerator_cpn = start_from_cpn; config->accelerator_attr = A_UNDERLINE | islc(COLOR_BLACK, COLOR_WHITE); config->cursor_cpn = start_from_cpn; config->cursor_attr = islc(COLOR_WHITE, COLOR_BLACK); config->cursor_accel_cpn = start_from_cpn; config->cursor_accel_attr = A_UNDERLINE | islc(COLOR_WHITE, COLOR_BLACK); config->disabled_cpn = start_from_cpn; config->disabled_attr = A_DIM | islc(COLOR_BLACK, COLOR_WHITE); } config->left_alligned_shortcuts = true; config->wide_vborders = true; config->wide_hborders = false; config->extra_inner_space = false; config->shortcut_space = 5; config->text_space = 5; config->init_text_space = 2; config->menu_bar_menu_offset = 1; config->shadow_width = 2; break; case ST_MENU_STYLE_XGOLD: config->menu_background_cpn = start_from_cpn; init_pair(start_from_cpn++, COLOR_BLUE, COLOR_CYAN); config->menu_unfocused_cpn = start_from_cpn; init_pair(start_from_cpn++, COLOR_BLUE, COLOR_CYAN); config->menu_shadow_cpn = start_from_cpn; init_pair(start_from_cpn++, COLOR_CYAN, COLOR_BLUE); config->menu_shadow_attr = A_DIM | A_REVERSE; config->accelerator_cpn = start_from_cpn; config->accelerator_attr = islc(COLOR_YELLOW, COLOR_CYAN); config->cursor_cpn = start_from_cpn; config->cursor_attr = islc(COLOR_WHITE, COLOR_BLUE); config->cursor_accel_cpn = start_from_cpn; config->cursor_accel_attr = islc(COLOR_WHITE, COLOR_BLUE); config->disabled_cpn = start_from_cpn; config->disabled_attr = islc(COLOR_BLACK, COLOR_CYAN); config->left_alligned_shortcuts = false; config->wide_vborders = false; config->wide_hborders = false; config->extra_inner_space = false; config->shortcut_space = 4; config->text_space = 2; config->init_text_space = 2; config->menu_bar_menu_offset = 0; config->shadow_width = 2; config->submenu_offset_y = 0; config->submenu_offset_x = 0; break; case ST_MENU_STYLE_XGOLD_BLACK: config->menu_background_cpn = start_from_cpn; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_CYAN); config->menu_unfocused_cpn = start_from_cpn; init_pair(start_from_cpn++, COLOR_BLACK, COLOR_CYAN); config->menu_shadow_cpn = start_from_cpn; init_pair(start_from_cpn++, COLOR_CYAN, COLOR_BLUE); config->menu_shadow_attr = A_DIM | A_REVERSE; config->accelerator_cpn = start_from_cpn; config->accelerator_attr = islc(COLOR_YELLOW, COLOR_CYAN); config->cursor_cpn = start_from_cpn; config->cursor_attr = islc(COLOR_WHITE, COLOR_BLUE); config->cursor_accel_cpn = start_from_cpn; config->cursor_accel_attr = islc(COLOR_WHITE, COLOR_BLUE); config->disabled_cpn = start_from_cpn; config->disabled_attr = islc(COLOR_BLACK, COLOR_CYAN); config->left_alligned_shortcuts = false; config->wide_vborders = false; config->wide_hborders = false; config->extra_inner_space = false; config->shortcut_space = 4; config->text_space = 2; config->init_text_space = 2; config->menu_bar_menu_offset = 0; config->shadow_width = 2; config->submenu_offset_y = 0; config->submenu_offset_x = 0; break; } return start_from_cpn; } pspg-2.6.6/src/themes.c000066400000000000000000001135661360716715600147460ustar00rootroot00000000000000/*------------------------------------------------------------------------- * * themes.c * themes initialization * * Portions Copyright (c) 2017-2019 Pavel Stehule * * IDENTIFICATION * src/themes.c * *------------------------------------------------------------------------- */ #include "themes.h" #include #include attr_t theme_attrs[50]; #define theme_attr(id) (COLOR_PAIR(id) | theme_attrs[id]) #ifndef A_ITALIC #define A_ITALIC A_DIM #endif static void set_colour(short id, short foreground, short background, bool light, attr_t attrs) { if (COLORS == 8 || foreground == -1) { init_pair(id, foreground, background); theme_attrs[id] = attrs | (light ? A_BOLD : 0); } else if (foreground < 8) { init_pair(id, foreground + (light ? 8 : 0), background); theme_attrs[id] = attrs; } else { init_pair(id, foreground, background); theme_attrs[id] = attrs; } } static int if_in_int(int v, const int *s, int v1, int v2) { while(*s != -1) { if (v == *s) return v1; s += 1; } return v2; } /* 0..255 rgb based colors */ static void init_color_rgb_ff(short color, short r, short g, short b) { init_color(color, (r / 255.0) * 1000.0, (g / 255.0) * 1000.0, (b / 255.0) * 1000.0); } /* * Set color pairs based on style */ void initialize_color_pairs(int theme, bool bold_labels, bool bold_cursor) { attr_t labels_attr = bold_labels ? A_BOLD : 0; attr_t cursor_attr = bold_cursor ? A_BOLD : 0; init_pair(21, COLOR_WHITE, COLOR_BLACK); /* Fx keys */ set_colour(26, COLOR_WHITE, COLOR_RED, true, 0); /* error */ set_colour(27, COLOR_BLACK, COLOR_WHITE, false, 0); /* input */ memset(theme_attrs, 0, sizeof(theme_attrs)); switch (theme) { case 0: /* mc black theme */ use_default_colors(); init_pair(1, -1, -1); set_colour(2, COLOR_BLACK, COLOR_WHITE, false, 0); /* top bar colors */ set_colour(3, -1, -1, false, 0); /* data alphanumeric */ set_colour(4, -1, -1, true, labels_attr); /* fix rows, columns */ set_colour(5, COLOR_BLACK, COLOR_WHITE, false, cursor_attr); /* active cursor over fixed cols */ set_colour(6, COLOR_BLACK, COLOR_WHITE, false, cursor_attr); /* active cursor */ set_colour(7, COLOR_BLACK, COLOR_WHITE, false, 0); /* title color */ set_colour(8, COLOR_BLACK, COLOR_WHITE, false, 0); /* expanded header */ set_colour(9, -1, -1, false, 0); /* footer */ set_colour(10, COLOR_BLACK, COLOR_WHITE, false, cursor_attr); /* footer cursor */ set_colour(11, COLOR_BLACK, COLOR_WHITE, false, 0); /* cursor over decoration */ set_colour(12, COLOR_BLACK, COLOR_WHITE, false, 0); /* bottom bar colors */ set_colour(13, COLOR_BLACK, COLOR_WHITE, false, 0); /* light bottom bar colors */ set_colour(14, COLOR_BLACK, COLOR_WHITE, false, 0); /* color of bookmark lines */ set_colour(15, COLOR_WHITE, COLOR_BLACK, false, 0); /* color of marked search pattern */ set_colour(16, -1, -1, false, 0); /* color of line with pattern */ set_colour(17, -1, -1, false, 0); /* color of line art with pattern */ set_colour(18, -1, -1, false, 0); /* color of marked search pattern in no-hl line mode */ set_colour(19, -1, -1, false, 0); /* color of marked search pattern in cursor */ set_colour(20, COLOR_WHITE, COLOR_BLACK, false, 0); set_colour(21, -1, -1, false, 0); /* rownum colors */ set_colour(22, -1, -1, false, A_REVERSE); /* cross cursor data */ set_colour(23, -1, -1, false, A_REVERSE); /* cross cursor line */ set_colour(22, -1, -1, false, A_REVERSE); /* cross cursor data */ set_colour(23, -1, -1, false, A_REVERSE); /* cross cursor line */ set_colour(24, COLOR_BLACK, COLOR_WHITE, false, cursor_attr);/* vertical cursor pattern data */ set_colour(25, COLOR_BLACK, COLOR_WHITE, false, cursor_attr);/* vertical cursor pattern line */ set_colour(27, -1, -1, false, 0); /* input */ break; case 1: /* mc theme */ init_pair(1, COLOR_WHITE, COLOR_BLUE); set_colour(2, COLOR_BLACK, COLOR_CYAN, false, 0); set_colour(3, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(4, COLOR_YELLOW, COLOR_BLUE, true, labels_attr); set_colour(5, COLOR_YELLOW, COLOR_CYAN, true, cursor_attr); set_colour(6, COLOR_BLACK, COLOR_CYAN, false, 0); set_colour(7, COLOR_BLACK, COLOR_CYAN, false, 0); set_colour(8, COLOR_RED, COLOR_BLUE, false, 0); set_colour(9, COLOR_CYAN, COLOR_BLUE, false, 0); set_colour(10, COLOR_BLACK, COLOR_CYAN, false, cursor_attr); set_colour(11, COLOR_WHITE, COLOR_CYAN, false, 0); set_colour(12, COLOR_WHITE, COLOR_CYAN, true, 0); set_colour(13, COLOR_BLACK, COLOR_GREEN, false, 0); set_colour(14, COLOR_WHITE, COLOR_RED, true, 0); set_colour(15, COLOR_YELLOW, COLOR_GREEN, true, 0); set_colour(16, COLOR_BLACK, COLOR_GREEN, false, 0); set_colour(17, COLOR_WHITE, COLOR_GREEN, false, 0); set_colour(18, COLOR_GREEN, COLOR_BLUE, false, 0); set_colour(19, COLOR_YELLOW, COLOR_CYAN, true, 0); set_colour(20, COLOR_WHITE, COLOR_BLACK, true, 0); set_colour(21, COLOR_WHITE, COLOR_CYAN, true, 0); set_colour(22, COLOR_CYAN, COLOR_BLACK, true, A_REVERSE | cursor_attr); set_colour(23, COLOR_CYAN, COLOR_WHITE, true, A_REVERSE); set_colour(24, COLOR_GREEN, COLOR_BLACK, true, A_REVERSE | cursor_attr); set_colour(25, COLOR_GREEN, COLOR_WHITE, true, A_REVERSE); set_colour(26, COLOR_WHITE, COLOR_RED, true,0); break; case 2: /* FoxPro theme */ init_pair(1, COLOR_WHITE, COLOR_CYAN); set_colour(2, COLOR_BLACK, COLOR_WHITE, false,0); set_colour(3, COLOR_WHITE, COLOR_CYAN, true, 0); set_colour(4, COLOR_WHITE, COLOR_CYAN, true, labels_attr); set_colour(5, COLOR_WHITE, COLOR_BLUE, true, cursor_attr); set_colour(6, COLOR_WHITE, COLOR_BLUE, true, cursor_attr); set_colour(7, COLOR_YELLOW, COLOR_WHITE, true,0); set_colour(8, COLOR_WHITE, COLOR_BLUE, true,0); set_colour(9, COLOR_BLUE, COLOR_CYAN, false,0); set_colour(10, COLOR_WHITE, COLOR_BLUE, true, cursor_attr); set_colour(11, COLOR_WHITE, COLOR_BLUE, false,0); set_colour(12, COLOR_WHITE, COLOR_BLUE, true,0); set_colour(13, COLOR_WHITE, COLOR_BLUE, true,0); set_colour(14, COLOR_WHITE, COLOR_MAGENTA, true,0); set_colour(15, COLOR_YELLOW, COLOR_GREEN, true,0); set_colour(16, COLOR_BLACK, COLOR_GREEN, false,0); set_colour(17, COLOR_WHITE, COLOR_GREEN, false,0); set_colour(18, COLOR_YELLOW, COLOR_GREEN, true,0); set_colour(19, COLOR_YELLOW, COLOR_BLUE, true,0); set_colour(20, COLOR_WHITE, COLOR_BLACK, false,0); set_colour(21, COLOR_WHITE, COLOR_CYAN, false, 0); set_colour(22, COLOR_BLUE, COLOR_BLACK, true, A_REVERSE | cursor_attr); set_colour(23, COLOR_BLUE, COLOR_WHITE, true, A_REVERSE); set_colour(24, COLOR_GREEN, COLOR_BLACK, true, A_REVERSE | cursor_attr); set_colour(25, COLOR_GREEN, COLOR_WHITE, true, A_REVERSE); set_colour(26, COLOR_YELLOW, COLOR_RED, true,0); break; case 3: /* PD Menu theme */ init_pair(1, COLOR_BLACK, COLOR_CYAN); set_colour(2, COLOR_BLACK, COLOR_WHITE, false, 0); set_colour(3, COLOR_BLACK, COLOR_CYAN, false, 0); set_colour(4, COLOR_WHITE, COLOR_CYAN, true, labels_attr); set_colour(5, COLOR_WHITE, COLOR_BLACK, true, cursor_attr); set_colour(6, COLOR_CYAN, COLOR_BLACK, true, cursor_attr); set_colour(7, COLOR_BLACK, COLOR_WHITE, false, 0); set_colour(8, COLOR_WHITE, COLOR_CYAN, true, 0); set_colour(9, COLOR_BLACK, COLOR_CYAN, false, 0); set_colour(10, COLOR_CYAN, COLOR_BLACK, true, cursor_attr); set_colour(11, COLOR_CYAN, COLOR_BLACK, false, 0); set_colour(12, COLOR_CYAN, COLOR_BLACK, false, 0); set_colour(13, COLOR_WHITE, COLOR_BLACK, true, 0); set_colour(14, COLOR_WHITE, COLOR_RED, true, 0); set_colour(15, COLOR_WHITE, COLOR_GREEN, true, 0); set_colour(16, COLOR_BLACK, COLOR_GREEN, false, 0); set_colour(17, COLOR_BLACK, COLOR_GREEN, false, 0); set_colour(18, COLOR_WHITE, COLOR_GREEN, true, 0); set_colour(19, COLOR_YELLOW, COLOR_BLACK, true, 0); set_colour(20, COLOR_WHITE, COLOR_BLUE, true, 0); set_colour(21, COLOR_BLACK, COLOR_CYAN, false, 0); set_colour(22, COLOR_WHITE, COLOR_BLACK, true, A_REVERSE | cursor_attr); set_colour(23, COLOR_WHITE, COLOR_CYAN, true, A_REVERSE); set_colour(24, COLOR_GREEN, COLOR_BLACK, true, A_REVERSE | cursor_attr); set_colour(25, COLOR_GREEN, COLOR_BLACK, true, A_REVERSE); break; case 4: /* White theme */ init_pair(1, COLOR_BLACK, COLOR_WHITE); set_colour(2, COLOR_BLACK, COLOR_CYAN, false, 0); set_colour(3, COLOR_BLACK, COLOR_WHITE, false, 0); set_colour(4, COLOR_BLACK, COLOR_WHITE, true, labels_attr); set_colour(5, COLOR_WHITE, COLOR_BLUE, true, cursor_attr); set_colour(6, COLOR_WHITE, COLOR_BLUE, true, cursor_attr); set_colour(7, COLOR_BLACK, COLOR_CYAN, false, 0); set_colour(8, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(9, COLOR_BLACK, COLOR_WHITE, false, 0); set_colour(10, COLOR_WHITE, COLOR_BLUE, true, cursor_attr); set_colour(11, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(12, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(13, COLOR_WHITE, COLOR_BLUE, true, 0); set_colour(14, COLOR_WHITE, COLOR_RED, true, 0); set_colour(15, COLOR_YELLOW, COLOR_GREEN, true, 0); set_colour(16, COLOR_BLACK, COLOR_GREEN, false, 0); set_colour(17, COLOR_BLACK, COLOR_GREEN, false, 0); set_colour(18, COLOR_YELLOW, COLOR_GREEN, true, 0); set_colour(19, COLOR_YELLOW, COLOR_CYAN, true, 0); set_colour(20, COLOR_WHITE, COLOR_BLACK, true, cursor_attr); set_colour(22, COLOR_WHITE, COLOR_BLACK, true, cursor_attr); set_colour(23, COLOR_WHITE, COLOR_BLACK, false, 0); set_colour(24, COLOR_GREEN, COLOR_BLACK, true, A_REVERSE | cursor_attr); set_colour(25, COLOR_GREEN, COLOR_BLACK, true, A_REVERSE); set_colour(27, COLOR_WHITE, COLOR_BLACK, true, A_REVERSE); /* input */ break; case 5: /* Mutt theme */ use_default_colors(); init_pair(1, -1, -1); set_colour(2, COLOR_GREEN, COLOR_BLUE, true, 0); set_colour(3, -1, -1, false, 0); set_colour(4, COLOR_CYAN, -1, true, labels_attr); set_colour(5, COLOR_BLACK, COLOR_CYAN, false, 0); set_colour(6, COLOR_BLACK, COLOR_CYAN, false, 0); set_colour(7, COLOR_GREEN, COLOR_BLUE, true, 0); set_colour(8, COLOR_BLACK, COLOR_BLUE, false, 0); set_colour(9, COLOR_BLACK, COLOR_CYAN, false, 0); set_colour(10, COLOR_BLACK, COLOR_CYAN, false, cursor_attr); set_colour(11, -1, COLOR_CYAN, false, 0); set_colour(12, COLOR_BLACK, COLOR_CYAN, false, 0); set_colour(13, COLOR_BLACK, COLOR_CYAN, false, 0); set_colour(14, COLOR_WHITE, COLOR_RED, true, 0); set_colour(15, COLOR_YELLOW, COLOR_GREEN, true, 0); set_colour(16, COLOR_BLACK, COLOR_GREEN, false, 0); set_colour(17, -1, COLOR_GREEN, false, 0); set_colour(18, COLOR_YELLOW, COLOR_GREEN, true, 0); set_colour(19, COLOR_YELLOW, COLOR_CYAN, true, 0); set_colour(20, COLOR_WHITE, COLOR_CYAN, true, cursor_attr); set_colour(22, COLOR_WHITE, COLOR_BLACK, false, cursor_attr); set_colour(23, COLOR_WHITE, COLOR_BLACK, false, 0); set_colour(24, COLOR_GREEN, COLOR_BLACK, true, A_REVERSE | cursor_attr); set_colour(25, COLOR_GREEN, COLOR_WHITE, true, A_REVERSE); break; case 6: /* PC Fand theme */ init_pair(1, COLOR_WHITE, COLOR_BLACK); set_colour(2, COLOR_BLACK, COLOR_CYAN, false, 0); set_colour(3, COLOR_WHITE, COLOR_BLACK, false, 0); set_colour(4, COLOR_CYAN, COLOR_BLACK, true, labels_attr); set_colour(5, COLOR_WHITE, COLOR_BLUE, true, cursor_attr); set_colour(6, COLOR_WHITE, COLOR_BLUE, true, cursor_attr); set_colour(7, COLOR_BLACK, COLOR_CYAN, false, 0); set_colour(8, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(9, COLOR_CYAN, COLOR_BLACK, false, 0); set_colour(10, COLOR_WHITE, COLOR_BLUE, true, cursor_attr); set_colour(11, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(12, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(13, COLOR_WHITE, COLOR_BLUE, true, 0); set_colour(14, COLOR_WHITE, COLOR_RED, true, 0); set_colour(15, COLOR_YELLOW, COLOR_GREEN, true, 0); set_colour(16, COLOR_BLACK, COLOR_GREEN, false, 0); set_colour(17, COLOR_WHITE, COLOR_GREEN, false, 0); set_colour(18, COLOR_YELLOW, COLOR_BLACK, true, 0); set_colour(19, COLOR_CYAN, COLOR_BLUE, false, 0); set_colour(20, COLOR_CYAN, COLOR_BLUE, true, cursor_attr); set_colour(22, COLOR_WHITE, COLOR_CYAN, true, cursor_attr); set_colour(23, COLOR_WHITE, COLOR_CYAN, false, 0); set_colour(24, COLOR_GREEN, COLOR_BLACK, true, A_REVERSE | cursor_attr); set_colour(25, COLOR_GREEN, COLOR_WHITE, true, A_REVERSE); set_colour(27, COLOR_WHITE, COLOR_BLACK, true, 0); /* input */ break; case 7: /* Green theme */ init_pair(1, COLOR_GREEN, COLOR_BLACK); set_colour(2, COLOR_CYAN, COLOR_BLACK, false, 0); set_colour(3, COLOR_GREEN, COLOR_BLACK, false, 0); set_colour(4, COLOR_GREEN, COLOR_BLACK, true, labels_attr); set_colour(5, COLOR_WHITE, COLOR_GREEN, true, cursor_attr); set_colour(6, COLOR_WHITE, COLOR_GREEN, true, cursor_attr); set_colour(7, COLOR_CYAN, COLOR_BLACK, false, 0); set_colour(8, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(9, COLOR_CYAN, COLOR_BLACK, false, 0); set_colour(10, COLOR_WHITE, COLOR_GREEN, true, cursor_attr); set_colour(11, COLOR_GREEN, COLOR_GREEN, true, 0); set_colour(12, COLOR_WHITE, COLOR_GREEN, true, 0); set_colour(13, COLOR_WHITE, COLOR_GREEN, true, 0); set_colour(14, COLOR_WHITE, COLOR_RED, true, 0); set_colour(15, COLOR_WHITE, COLOR_CYAN, true, 0); set_colour(16, COLOR_BLACK, COLOR_CYAN, false, 0); set_colour(17, COLOR_GREEN, COLOR_CYAN, false, 0); set_colour(18, COLOR_CYAN, COLOR_BLACK, false, 0); set_colour(19, COLOR_CYAN, COLOR_GREEN, false, 0); set_colour(20, COLOR_WHITE, COLOR_BLACK, true, cursor_attr); set_colour(21, COLOR_CYAN, COLOR_BLACK, false, 0); set_colour(22, COLOR_GREEN, COLOR_BLACK, true, A_REVERSE | cursor_attr); set_colour(23, COLOR_GREEN, COLOR_GREEN, true, A_REVERSE); set_colour(24, COLOR_CYAN, COLOR_BLACK, true, A_REVERSE | cursor_attr); set_colour(25, COLOR_CYAN, COLOR_GREEN, true, A_REVERSE); set_colour(27, COLOR_WHITE, COLOR_BLACK, true, 0); /* input */ break; case 8: /* Blue theme */ init_pair(1, COLOR_CYAN, COLOR_BLUE); set_colour(2, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(3, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(4, COLOR_WHITE, COLOR_BLUE, true, labels_attr); set_colour(5, COLOR_WHITE, COLOR_CYAN, true, cursor_attr); set_colour(6, COLOR_WHITE, COLOR_CYAN, true, cursor_attr); set_colour(7, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(8, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(9, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(10, COLOR_WHITE, COLOR_CYAN, true, cursor_attr); set_colour(11, COLOR_CYAN, COLOR_CYAN, true, 0); set_colour(12, COLOR_WHITE, COLOR_CYAN, true, 0); set_colour(13, COLOR_WHITE, COLOR_CYAN, true, 0); set_colour(14, COLOR_WHITE, COLOR_RED, true, 0); set_colour(15, COLOR_YELLOW, COLOR_GREEN, true, 0); set_colour(16, COLOR_BLACK, COLOR_GREEN, false, 0); set_colour(17, COLOR_CYAN, COLOR_GREEN, true, 0); set_colour(18, COLOR_CYAN, COLOR_BLUE, false, 0); set_colour(19, COLOR_YELLOW, COLOR_CYAN, true, 0); set_colour(20, COLOR_YELLOW, COLOR_BLACK, true, 0); set_colour(21, COLOR_CYAN, COLOR_BLUE, false, 0); set_colour(22, COLOR_CYAN, COLOR_BLACK, true, A_REVERSE | cursor_attr); set_colour(23, COLOR_CYAN, COLOR_CYAN, true, A_REVERSE); set_colour(24, COLOR_GREEN, COLOR_BLACK, true, A_REVERSE | cursor_attr); set_colour(25, COLOR_GREEN, COLOR_CYAN, true, A_REVERSE); set_colour(27, COLOR_WHITE, COLOR_BLACK, true, A_REVERSE); /* input */ break; case 9: /* Word Perfect theme */ init_pair(1, COLOR_WHITE, COLOR_BLUE); set_colour(2, COLOR_BLACK, COLOR_WHITE, false, 0); set_colour(3, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(4, COLOR_CYAN, COLOR_BLUE, true, labels_attr); set_colour(5, COLOR_WHITE, COLOR_CYAN, true, cursor_attr); set_colour(6, COLOR_WHITE, COLOR_CYAN, true, cursor_attr); set_colour(7, COLOR_BLACK, COLOR_WHITE, false, 0); set_colour(8, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(9, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(10, COLOR_WHITE, COLOR_CYAN, true, cursor_attr); set_colour(11, COLOR_WHITE, COLOR_CYAN, false, 0); set_colour(12, COLOR_WHITE, COLOR_CYAN, true, 0); set_colour(13, COLOR_WHITE, COLOR_CYAN, true, 0); set_colour(14, COLOR_WHITE, COLOR_RED, true, 0); set_colour(15, COLOR_YELLOW, COLOR_GREEN, true, 0); set_colour(16, COLOR_BLACK, COLOR_GREEN, false, 0); set_colour(17, COLOR_WHITE, COLOR_GREEN, false, 0); set_colour(18, COLOR_YELLOW, COLOR_BLUE, true, 0); set_colour(19, COLOR_YELLOW, COLOR_CYAN, true, 0); set_colour(20, COLOR_YELLOW, COLOR_BLACK, true, 0); set_colour(21, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(22, COLOR_CYAN, COLOR_BLACK, true, A_REVERSE | cursor_attr); set_colour(23, COLOR_CYAN, COLOR_WHITE, true, A_REVERSE); set_colour(24, COLOR_GREEN, COLOR_BLACK, true, A_REVERSE | cursor_attr); set_colour(25, COLOR_GREEN, COLOR_WHITE, true, A_REVERSE); break; case 10: /* low contrast theme */ init_pair(1, COLOR_BLUE, COLOR_CYAN); set_colour(2, COLOR_BLUE, COLOR_CYAN, false, 0); set_colour(3, COLOR_BLUE, COLOR_CYAN, false, 0); set_colour(4, COLOR_WHITE, COLOR_CYAN, true, labels_attr); set_colour(5, COLOR_WHITE, COLOR_BLUE, true, cursor_attr); set_colour(6, COLOR_WHITE, COLOR_BLUE, true, cursor_attr); set_colour(7, COLOR_BLUE, COLOR_CYAN, false, 0); set_colour(8, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(9, COLOR_BLUE, COLOR_CYAN, false, 0); set_colour(10, COLOR_WHITE, COLOR_BLUE, true, cursor_attr); set_colour(11, COLOR_CYAN, COLOR_BLUE, false, 0); set_colour(12, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(13, COLOR_WHITE, COLOR_BLUE, true, 0); set_colour(14, COLOR_WHITE, COLOR_RED, true, 0); set_colour(15, COLOR_YELLOW, COLOR_GREEN, true, 0); set_colour(16, COLOR_BLACK, COLOR_GREEN, false, 0); set_colour(17, COLOR_BLUE, COLOR_GREEN, false, 0); set_colour(18, COLOR_YELLOW, COLOR_CYAN, true, 0); set_colour(19, COLOR_YELLOW, COLOR_BLUE, true, 0); set_colour(20, COLOR_WHITE, COLOR_BLACK, true, 0); set_colour(21, COLOR_BLUE, COLOR_CYAN, false, 0); set_colour(22, COLOR_WHITE, COLOR_BLACK, true, cursor_attr); set_colour(23, COLOR_CYAN, COLOR_BLACK, false, 0); set_colour(24, COLOR_GREEN, COLOR_BLACK, true, A_REVERSE | cursor_attr); set_colour(25, COLOR_GREEN, COLOR_BLUE, true, A_REVERSE); set_colour(27, COLOR_BLACK, COLOR_CYAN, false, 0); /* input */ break; case 11: /* Dark cyan theme */ init_pair(1, COLOR_CYAN, COLOR_BLACK); set_colour(2, COLOR_WHITE, COLOR_BLUE, true, 0); set_colour(3, COLOR_CYAN, COLOR_BLACK, false, 0); set_colour(4, COLOR_CYAN, COLOR_BLACK, true, labels_attr); set_colour(5, COLOR_WHITE, COLOR_MAGENTA, true, cursor_attr); set_colour(6, COLOR_WHITE, COLOR_MAGENTA, true, cursor_attr); set_colour(7, COLOR_WHITE, COLOR_BLUE, true, 0); set_colour(8, COLOR_WHITE, COLOR_BLUE, true, 0); set_colour(9, COLOR_WHITE, COLOR_BLACK, false, 0); set_colour(10, COLOR_WHITE, COLOR_MAGENTA, true, cursor_attr); set_colour(11, COLOR_WHITE, COLOR_MAGENTA, false, 0); set_colour(12, COLOR_WHITE, COLOR_MAGENTA, true, 0); set_colour(13, COLOR_WHITE, COLOR_MAGENTA, true, 0); set_colour(14, COLOR_WHITE, COLOR_RED, true, 0); set_colour(15, COLOR_YELLOW, COLOR_GREEN, true, 0); set_colour(16, COLOR_BLACK, COLOR_GREEN, false, 0); set_colour(17, COLOR_CYAN, COLOR_GREEN, true, 0); set_colour(18, COLOR_YELLOW, COLOR_BLACK, true, 0); set_colour(19, COLOR_CYAN, COLOR_MAGENTA, false, 0); set_colour(20, COLOR_WHITE, COLOR_BLUE, true, 0); set_colour(22, COLOR_WHITE, COLOR_BLUE, true, cursor_attr); set_colour(23, COLOR_CYAN, COLOR_BLUE, false, 0); set_colour(24, COLOR_GREEN, COLOR_BLACK, true, A_REVERSE | cursor_attr); set_colour(25, COLOR_GREEN, COLOR_CYAN, true, A_REVERSE); set_colour(27, COLOR_WHITE, COLOR_BLACK, true, 0); /* input */ break; case 12: /* Paradox like theme */ init_pair(1, COLOR_BLUE, COLOR_CYAN); set_colour(2, COLOR_BLUE, COLOR_CYAN, false, 0); set_colour(3, COLOR_WHITE, COLOR_CYAN, true, 0); set_colour(4, COLOR_BLUE, COLOR_CYAN, false, labels_attr); set_colour(5, COLOR_WHITE, COLOR_BLUE, true, cursor_attr); set_colour(6, COLOR_WHITE, COLOR_BLUE, true, cursor_attr); set_colour(7, COLOR_BLUE, COLOR_CYAN, false, 0); set_colour(8, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(9, COLOR_BLUE, COLOR_CYAN, false, 0); set_colour(10, COLOR_WHITE, COLOR_BLUE, true, cursor_attr); set_colour(11, COLOR_CYAN, COLOR_BLUE, false, 0); set_colour(12, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(13, COLOR_WHITE, COLOR_BLUE, true, 0); set_colour(14, COLOR_WHITE, COLOR_RED, true, 0); set_colour(15, COLOR_YELLOW, COLOR_GREEN, true, 0); set_colour(16, COLOR_BLACK, COLOR_GREEN, false, 0); set_colour(17, COLOR_BLUE, COLOR_GREEN, false, 0); set_colour(18, COLOR_YELLOW, COLOR_CYAN, true, 0); set_colour(19, COLOR_CYAN, COLOR_BLUE, false, 0); set_colour(20, COLOR_WHITE, COLOR_MAGENTA, true, cursor_attr); set_colour(21, COLOR_CYAN, COLOR_CYAN, true, 0); set_colour(22, COLOR_WHITE, COLOR_BLACK, true, cursor_attr); set_colour(23, COLOR_CYAN, COLOR_BLACK, false, 0); set_colour(24, COLOR_GREEN, COLOR_BLACK, true, A_REVERSE | cursor_attr); set_colour(25, COLOR_GREEN, COLOR_BLUE, true, A_REVERSE); break; case 13: /* DBase retro theme */ init_pair(1, COLOR_WHITE, COLOR_BLUE); set_colour(2, COLOR_WHITE, COLOR_BLACK, false, 0); set_colour(3, COLOR_WHITE, COLOR_BLUE, true, 0); set_colour(4, COLOR_WHITE, COLOR_BLUE, true, labels_attr); set_colour(5, COLOR_YELLOW, COLOR_CYAN, true, cursor_attr); set_colour(6, COLOR_YELLOW, COLOR_CYAN, true, cursor_attr); set_colour(7, COLOR_WHITE, COLOR_BLACK, false, 0); set_colour(8, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(9, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(10, COLOR_BLACK, COLOR_CYAN, false, cursor_attr); set_colour(11, COLOR_WHITE, COLOR_CYAN, false, 0); set_colour(12, COLOR_WHITE, COLOR_BLACK, true, 0); set_colour(13, COLOR_WHITE, COLOR_BLACK, true, 0); set_colour(14, COLOR_WHITE, COLOR_RED, true, 0); set_colour(15, COLOR_YELLOW, COLOR_GREEN, true, 0); set_colour(16, COLOR_BLACK, COLOR_GREEN, false, 0); set_colour(17, COLOR_WHITE, COLOR_GREEN, false, 0); set_colour(18, COLOR_CYAN, COLOR_BLUE, false, 0); set_colour(19, COLOR_WHITE, COLOR_CYAN, true, 0); set_colour(20, COLOR_WHITE, COLOR_BLACK, true, cursor_attr); set_colour(22, COLOR_CYAN, COLOR_BLACK, true, A_REVERSE | cursor_attr); set_colour(23, COLOR_CYAN, COLOR_WHITE, true, A_REVERSE); set_colour(24, COLOR_GREEN, COLOR_BLACK, true, A_REVERSE | cursor_attr); set_colour(25, COLOR_GREEN, COLOR_WHITE, true, A_REVERSE); set_colour(27, COLOR_BLACK, COLOR_CYAN, false, 0); /* input */ break; case 14: /* DBase retro magenta */ init_pair(1, COLOR_WHITE, COLOR_BLUE); set_colour(2, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(3, COLOR_WHITE, COLOR_BLUE, true, 0); set_colour(4, COLOR_MAGENTA, COLOR_BLUE, true, labels_attr); set_colour(5, COLOR_BLACK, COLOR_CYAN, false, 0); set_colour(6, COLOR_BLACK, COLOR_CYAN, false, 0); set_colour(7, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(8, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(9, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(10, COLOR_BLACK, COLOR_CYAN, false, cursor_attr); set_colour(11, COLOR_WHITE, COLOR_CYAN, false, 0); set_colour(12, COLOR_WHITE, COLOR_BLACK, true, 0); set_colour(13, COLOR_WHITE, COLOR_BLACK, true, 0); set_colour(14, COLOR_WHITE, COLOR_RED, true, 0); set_colour(15, COLOR_YELLOW, COLOR_GREEN, true, 0); set_colour(16, COLOR_BLACK, COLOR_GREEN, false, 0); set_colour(17, COLOR_WHITE, COLOR_GREEN, false, 0); set_colour(18, COLOR_CYAN, COLOR_BLUE, false, 0); set_colour(19, COLOR_WHITE, COLOR_CYAN, true, 0); set_colour(20, COLOR_WHITE, COLOR_BLACK, false, 0); set_colour(21, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(22, COLOR_CYAN, COLOR_BLACK, true, A_REVERSE | cursor_attr); set_colour(23, COLOR_CYAN, COLOR_WHITE, true, A_REVERSE); set_colour(24, COLOR_GREEN, COLOR_BLACK, true, A_REVERSE | cursor_attr); set_colour(25, COLOR_GREEN, COLOR_WHITE, true, A_REVERSE); set_colour(27, COLOR_WHITE, COLOR_BLUE, true, 0); /* input */ break; case 15: /* Red theme */ init_pair(1, COLOR_BLACK, COLOR_WHITE); set_colour(2, COLOR_BLACK, COLOR_WHITE, false, 0); set_colour(3, COLOR_BLACK, COLOR_WHITE, false, 0); set_colour(4, COLOR_RED, COLOR_WHITE, false, A_DIM); set_colour(5, COLOR_WHITE, COLOR_RED, true, cursor_attr); set_colour(6, COLOR_WHITE, COLOR_RED, true, cursor_attr); set_colour(7, COLOR_BLACK, COLOR_WHITE, false, 0); set_colour(8, COLOR_WHITE, COLOR_BLUE, false, 0); set_colour(9, COLOR_BLACK, COLOR_WHITE, false, 0); set_colour(10, COLOR_WHITE, COLOR_RED, true, cursor_attr); set_colour(11, COLOR_BLACK, COLOR_RED, false, 0); set_colour(12, COLOR_WHITE, COLOR_BLACK, false, 0); set_colour(13, COLOR_WHITE, COLOR_BLACK, true, 0); set_colour(14, COLOR_YELLOW, COLOR_RED, true, A_REVERSE | A_BOLD); set_colour(15, COLOR_YELLOW, COLOR_BLACK, true, 0); set_colour(16, COLOR_WHITE, COLOR_BLACK, true, 0); set_colour(17, COLOR_WHITE, COLOR_BLACK, true, 0); set_colour(18, COLOR_CYAN, COLOR_BLUE, true, 0); set_colour(19, COLOR_WHITE, COLOR_CYAN, true, 0); set_colour(20, COLOR_WHITE, COLOR_BLACK, false, 0); set_colour(22, COLOR_WHITE, COLOR_BLACK, true, cursor_attr); set_colour(23, COLOR_RED, COLOR_BLACK, false, 0); set_colour(24, COLOR_RED, COLOR_BLACK, true, A_REVERSE | cursor_attr); set_colour(25, COLOR_RED, COLOR_BLACK, true, A_REVERSE); set_colour(27, COLOR_WHITE, COLOR_BLACK, true, A_REVERSE); /* input */ break; case 16: /* Simple theme */ use_default_colors(); init_pair(1, -1, -1); set_colour(2, -1, -1, false, 0); set_colour(3, -1, -1, false, 0); set_colour(4, -1, -1, true, A_ITALIC | labels_attr); set_colour(5, -1, -1, true, A_REVERSE | cursor_attr); set_colour(6, -1, -1, true, A_REVERSE | cursor_attr); set_colour(7, -1, -1, false, 0); set_colour(8, -1, -1, false, 0); set_colour(9, -1, -1, false, 0); set_colour(10, -1, -1, true, A_REVERSE | cursor_attr); set_colour(11, -1, -1, false, A_REVERSE); set_colour(12, -1, -1, false, 0); set_colour(13, -1, -1, true, 0); set_colour(14, -1, -1, false, A_UNDERLINE); set_colour(15, -1, -1, false, A_UNDERLINE); set_colour(16, -1, -1, false, 0); set_colour(17, -1, -1, false, 0); set_colour(18, -1, -1, false, A_UNDERLINE); set_colour(19, -1, -1, false, A_UNDERLINE | A_REVERSE | A_BOLD); set_colour(20, -1, -1, false, A_UNDERLINE | A_REVERSE | A_BOLD); set_colour(21, -1, -1, false, 0); set_colour(22, -1, -1, true, cursor_attr); set_colour(23, -1, -1, false, 0); set_colour(24, -1, -1, true, A_REVERSE | cursor_attr); set_colour(25, -1, -1, true, A_REVERSE); set_colour(27, -1, -1, false, 0); /* input */ break; case 17: /* Solar Dark theme */ init_color(235, 27, 212, 259); init_color(234, 0, 169, 212); init_color(240, 345, 431, 459); init_color(244, 557, 616, 624); init_color(245, 576, 631, 631); init_color(254, 933, 910, 835); init_color(136, 710, 537, 0); init_color(137, 900, 627, 0); init_color(138, 800, 627, 0); init_color(33, 149, 545, 824); init_color(160, 863, 196, 184); init_pair(1, 245, 234); init_pair(2, 245, 235); init_pair(3, 244, 234); init_pair(4, 33, 234); init_pair(5, 235, 136); init_pair(6, 235, 136); init_pair(7, 33, 235); init_pair(8, 33, 235); init_pair(9, 61, 234); init_pair(10, 235, 136); init_pair(11, 235, 136); init_pair(12, -1, -1); init_pair(13, -1, -1); init_pair(14, 230, 160); init_pair(15, 254, 235); init_pair(16, 245, 235); init_pair(17, 245, 235); init_pair(18, -1, -1); init_pair(19, -1, -1); init_pair(20, 254, 136); init_pair(21, 244, 235); init_pair(22, 235, 137); init_pair(23, 235, 137); init_pair(24, 235, 138); init_pair(25, 235, 138); theme_attrs[4] = labels_attr; theme_attrs[5] = cursor_attr; theme_attrs[6] = cursor_attr; theme_attrs[10] = cursor_attr; break; case 18: /* Solar Light theme */ init_color(234, 13, 98, 119); init_color(235, 18, 141, 172); init_color(240, 110, 146, 200); init_color(245, 576, 631, 631); init_color(244, 557, 616, 624); init_color(136, 710, 537, 0); init_color(160, 863, 196, 184); init_color(137, 880, 607, 0); init_color(138, 780, 607, 0); init_pair(1, 234, 245); init_pair(2, 235, 244); init_pair(3, 234, 245); init_pair(4, 17, 245); init_pair(5, 235, 136); init_pair(6, 235, 136); init_pair(7, 17, 244); init_pair(8, 17, 235); init_pair(9, 17, 245); init_pair(10, 235, 136); init_pair(11, 235, 136); init_pair(12, -1, -1); init_pair(13, -1, -1); init_pair(14, 255, 160); init_pair(15, 255, 244); init_pair(16, 240, 244); init_pair(17, 240, 244); init_pair(18, -1, -1); init_pair(19, -1, -1); init_pair(20, 255, 136); init_pair(21, 235, 244); init_pair(22, 235, 137); init_pair(23, 235, 137); init_pair(24, 235, 138); init_pair(25, 235, 138); theme_attrs[4] = labels_attr; theme_attrs[5] = cursor_attr; theme_attrs[6] = cursor_attr; theme_attrs[10] = cursor_attr; break; case 19: /* Gruvbox light theme */ init_color_rgb_ff(200, 0xff, 0xff, 0xd7); /* background */ init_color_rgb_ff(201, 0x26, 0x26, 0x26); /* foreground */ init_color_rgb_ff(202, 0xaf, 0xaf, 0x87); /* modeline bg */ init_color_rgb_ff(203, 0x4e, 0x4e, 0x4e); /* modeline fg */ init_color_rgb_ff(204, 0xd7, 0xd6, 0xaf); /* table decor */ init_color_rgb_ff(205, 0xeb, 0xdb, 0xb2); /* cursor bg */ init_color_rgb_ff(206, 0xaf, 0xaf, 0xaf); /* footer */ init_color_rgb_ff(207, 0xff, 0xff, 0xaf); /* lineno bg */ init_color_rgb_ff(210, 0x87, 0x00, 0x00); /* keyword - red */ init_color_rgb_ff(211, 0Xd7, 0x5f, 0x5f); /* bookmark - faded red */ init_color_rgb_ff(212, 0x00, 0x5f, 0x87); /* mark - faded blue */ init_color_rgb_ff(213, 0xfb, 0xf1, 0xc7); /* cursor bg */ init_color_rgb_ff(214, 0xd0, 0xcf, 0xa0); /* mark line cursor */ init_pair(1, 204, 200); init_pair(2, 203, 202); init_pair(3, 201, 200); init_pair(4, 210, 200); init_pair(5, 210, 205); init_pair(6, 203, 205); init_pair(7, 203, 202); init_pair(8, 17, 200); init_pair(9, 206, 200); init_pair(10, 203, 205); init_pair(11, 206, 205); init_pair(13, 203, 202); init_pair(14, COLOR_WHITE, 211); init_pair(15, 212, 204); init_pair(16, 201, 204); init_pair(17, 206, 204); init_pair(18, -1, -1); init_pair(19, -1, -1); init_pair(20, 212, 205); init_pair(21, 206, 207); init_pair(22, 203, 213); init_pair(23, 206, 213); init_pair(24, 201, 214); init_pair(25, 206, 214); theme_attrs[4] = labels_attr; theme_attrs[5] = cursor_attr; theme_attrs[6] = cursor_attr; theme_attrs[10] = cursor_attr; break; case 20: /* Tao theme */ init_color_rgb_ff(200, 0xf1, 0xf1, 0xf1); /* background */ init_color_rgb_ff(201, 0x61, 0x61, 0x61); /* foreground */ init_color_rgb_ff(202, 0xfc, 0xfc, 0xfc); /* modeline bg */ init_color_rgb_ff(203, 0x17, 0x17, 0x17); /* modeline fg */ init_color_rgb_ff(204, 0x9e, 0x9e, 0x9e); /* table decor */ init_color_rgb_ff(205, 0x4e, 0x4e, 0x4e); /* cursor bg */ init_color_rgb_ff(213, 0xf6, 0xf6, 0xf6); /* cursor fg */ init_color_rgb_ff(206, 0x9e, 0x9e, 0x9e); /* footer */ init_color_rgb_ff(207, 0xf6, 0xf6, 0xf6); /* lineno bg */ init_color_rgb_ff(210, 0x00, 0x00, 0x00); /* keyword - red */ init_color_rgb_ff(211, 0Xd7, 0x5f, 0x5f); /* bookmark - faded red */ init_color_rgb_ff(212, 0xff, 0xff, 0xff); /* mark fg - white */ init_color_rgb_ff(215, 0xc3, 0xc3, 0xc3); /* mark bg */ init_color_rgb_ff(214, 0xda, 0xda, 0xda); /* marked line bg */ init_color_rgb_ff(216, 0x25, 0x25, 0x25); init_color_rgb_ff(217, 0x40, 0x40, 0x40); /* vertical marked cursor bg */ init_color(240, 40, 50, 200); init_pair(1, 204, 200); init_pair(2, 203, 202); init_pair(3, 201, 200); init_pair(4, 210, 200); init_pair(5, 213, 205); init_pair(6, 213, 205); init_pair(7, 203, 202); init_pair(8, 17, 200); init_pair(9, 206, 200); init_pair(10, 213, 205); init_pair(11, 204, 205); init_pair(13, 203, 202); init_pair(14, 212, 211); init_pair(15, 216, 214); init_pair(16, 201, 214); init_pair(17, 206, 214); init_pair(18, -1, -1); init_pair(19, -1, -1); init_pair(20, 212, 205); init_pair(21, 204, 207); set_colour(22, COLOR_WHITE, COLOR_BLACK, true, cursor_attr); set_colour(23, 204, COLOR_BLACK, false, 0); set_colour(27, COLOR_WHITE, COLOR_BLACK, true, A_REVERSE); /* input */ init_pair(24, 213, 217); init_pair(25, 204, 217); theme_attrs[4] = labels_attr; theme_attrs[5] = cursor_attr; theme_attrs[6] = cursor_attr; theme_attrs[10] = cursor_attr; break; } } #define _in if_in_int #define _notin if_notin_int void initialize_theme(int theme, int window_identifier, bool is_tabular_fmt, bool no_highlight_lines, Theme *t) { memset(t, 0, sizeof(Theme)); switch (window_identifier) { case WINDOW_LUC: case WINDOW_FIX_ROWS: t->data_attr = theme_attr(4); t->cursor_data_attr = theme_attr(5); t->cursor_line_attr = theme_attr(11); t->cursor_expi_attr = theme_attr(6); break; case WINDOW_TOP_BAR: t->title_attr = theme_attr(7); break; case WINDOW_BOTTOM_BAR: t->prompt_attr = _in(theme, (int[]) {0, 1, -1}, theme_attr(2), theme_attr(13)); t->bottom_attr = theme_attr(12); t->bottom_light_attr = theme_attr(13); break; case WINDOW_FIX_COLS: t->data_attr = theme_attr(4); t->line_attr = 0; t->expi_attr = theme_attr(8); t->cursor_data_attr = theme_attr(5); t->cursor_line_attr = theme_attr(11); t->cursor_expi_attr = theme_attr(6); t->cursor_pattern_attr = theme_attr(20); t->bookmark_data_attr = theme_attr(14); t->bookmark_line_attr = theme_attr(14); t->cursor_bookmark_attr = theme_attr(14); t->found_str_attr = !no_highlight_lines ? theme_attr(15) : theme_attr(18); t->pattern_data_attr = theme_attr(16); t->pattern_line_attr = theme_attr(17); t->line_attr |= 0; t->expi_attr |= A_BOLD; t->bookmark_data_attr |= _in(theme, (int[]){15, -1}, A_REVERSE | A_BOLD, A_BOLD); t->bookmark_line_attr |= _in(theme, (int[]){15, -1}, A_REVERSE | A_BOLD, 0); t->cursor_bookmark_attr |= _in(theme, (int[]){15, -1}, A_BOLD, A_REVERSE | A_BOLD); t->found_str_attr |= no_highlight_lines ? (_in(theme, (int[]){0, -1}, A_REVERSE, A_BOLD)) : _in(theme, (int[]){0, 15, -1}, A_REVERSE | A_BOLD, A_BOLD); t->pattern_data_attr |= _in(theme, (int[]) {15, -1}, A_BOLD, 0) | _in(theme, (int[]) {0, 15, -1}, A_REVERSE, 0); t->pattern_line_attr |= _in(theme, (int[]) {11, 7, 8, 15, -1}, A_BOLD, 0) | _in(theme, (int[]) {0, 15, -1}, A_REVERSE, 0); t->found_str_attr |= _in(theme, (int[]) {16, -1}, A_UNDERLINE | (no_highlight_lines ? A_ITALIC : 0), 0); break; case WINDOW_ROWS: t->data_attr = theme_attr(3); t->line_attr = 0; t->expi_attr = theme_attr(8); t->cursor_data_attr = theme_attr(6); t->cursor_line_attr = theme_attr(11); t->cursor_expi_attr = theme_attr(6); t->cursor_pattern_attr = theme_attr(19); t->bookmark_data_attr = theme_attr(14); t->bookmark_line_attr = theme_attr(14); t->cursor_bookmark_attr = theme_attr(14); t->found_str_attr = !no_highlight_lines ? theme_attr(15) : theme_attr(18); t->pattern_data_attr = theme_attr(16); t->pattern_line_attr = theme_attr(17); t->expi_attr |= A_BOLD; t->bookmark_data_attr |= _in(theme, (int[]){15, -1}, A_REVERSE | A_BOLD, A_BOLD); t->bookmark_line_attr |= _in(theme, (int[]){15, -1}, A_REVERSE | A_BOLD, 0); t->cursor_bookmark_attr |= _in(theme, (int[]){15, -1}, A_BOLD, A_REVERSE | A_BOLD); t->found_str_attr |= no_highlight_lines ? (_in(theme, (int[]){0, -1}, A_REVERSE, A_BOLD)) : _in(theme, (int[]){0, 15, -1}, A_REVERSE | A_BOLD, A_BOLD); t->pattern_data_attr |= _in(theme, (int[]) {15, -1}, A_BOLD, 0) | _in(theme, (int[]) {0, 15, -1}, A_REVERSE, 0); t->pattern_line_attr |= _in(theme, (int[]) {11, 7, 8, 15, -1}, A_BOLD, 0) | _in(theme, (int[]) {0, 15, -1}, A_REVERSE, 0); t->found_str_attr |= _in(theme, (int[]) {16, -1}, A_UNDERLINE, 0); break; case WINDOW_FOOTER: t->data_attr = is_tabular_fmt ? theme_attr(9) : theme_attr(3); t->line_attr = 0; t->expi_attr = 0; t->cursor_data_attr = theme_attr(10); t->cursor_line_attr = 0; t->cursor_expi_attr = 0; t->cursor_pattern_attr = theme_attr(19); t->bookmark_data_attr = theme_attr(14); t->bookmark_line_attr = theme_attr(14); t->cursor_bookmark_attr = theme_attr(14); t->found_str_attr = !no_highlight_lines ? theme_attr(15) : theme_attr(18); t->pattern_data_attr = theme_attr(16); t->pattern_line_attr = theme_attr(17); t->line_attr |= 0, t->expi_attr |= 0; t->cursor_line_attr |= 0; t->cursor_expi_attr |= 0; t->bookmark_line_attr |= 0; t->cursor_bookmark_attr |= A_BOLD | A_REVERSE; t->found_str_attr |= no_highlight_lines ? (_in(theme, (int[]){0, -1}, A_REVERSE, A_BOLD)) : A_BOLD; t->pattern_data_attr |= 0; t->pattern_line_attr |= 0; t->cursor_pattern_attr |= A_REVERSE; break; case WINDOW_ROWNUM: case WINDOW_ROWNUM_LUC: t->data_attr = theme_attr(21); t->cursor_data_attr = theme_attr(10); t->bookmark_data_attr = theme_attr(14); t->cursor_bookmark_attr = theme_attr(14); t->pattern_data_attr = theme_attr(16); t->cursor_bookmark_attr |= A_BOLD | A_REVERSE; break; } if (no_highlight_lines) { t->pattern_data_attr = t->data_attr; t->pattern_line_attr = t->line_attr; } /* cross cursor - initial setting */ t->cross_cursor_attr = theme_attr(22); t->cross_cursor_line_attr = theme_attr(23); t->pattern_vertical_cursor_attr = theme_attr(24); t->pattern_vertical_cursor_line_attr = theme_attr(25); /* input bottom line and error bottom line colors */ t->error_attr = theme_attr(26); t->input_attr = theme_attr(27); } pspg-2.6.6/src/themes.h000066400000000000000000000050741360716715600147450ustar00rootroot00000000000000/*------------------------------------------------------------------------- * * themes.h * themes initialization * * Portions Copyright (c) 2017-2019 Pavel Stehule * * IDENTIFICATION * src/themes.h * *------------------------------------------------------------------------- */ #ifndef PSPG_THEMES_H #define PSPG_THEMES_H #include #if defined HAVE_NCURSESW_CURSES_H #include #elif defined HAVE_NCURSESW_H #include #elif defined HAVE_NCURSES_CURSES_H #include #elif defined HAVE_NCURSES_H #include #elif defined HAVE_CURSES_H #include #else /* fallback */ #include #endif typedef struct { attr_t data_attr; /* colors for data (alphanums) */ attr_t line_attr; /* colors for borders */ attr_t expi_attr; /* colors for expanded headers */ attr_t cursor_data_attr; /* colors for cursor on data positions */ attr_t cursor_line_attr; /* colors for cursor on border position */ attr_t cursor_expi_attr; /* colors for cursor on expanded headers */ attr_t bookmark_data_attr; /* colors for bookmark */ attr_t bookmark_line_attr; attr_t cursor_bookmark_attr; /* colors for cursor on bookmark line */ attr_t found_str_attr; /* colors for marked string */ attr_t pattern_data_attr; /* colors for pattern line data */ attr_t pattern_line_attr; /* colors for pattern lide art */ attr_t cursor_pattern_attr; /* colors for pattern on cursor line */ attr_t title_attr; /* colors for title window */ attr_t bottom_attr; /* colors for bottom text */ attr_t bottom_light_attr; /* colors for lighter bottom text */ attr_t prompt_attr; /* less prompt color */ attr_t cursor_rownum_attr; /* colors for cursor rownum column */ attr_t cross_cursor_attr; /* colors for cross horizontal and vertical cursor (data) */ attr_t cross_cursor_line_attr; /* colors for cross horizontal and vertical cursor (border) */ attr_t pattern_vertical_cursor_attr; attr_t pattern_vertical_cursor_line_attr; attr_t error_attr; /* colors for display error */ attr_t input_attr; /* colors for input line */ } Theme; #define WINDOW_LUC 0 #define WINDOW_FIX_ROWS 1 #define WINDOW_FIX_COLS 2 #define WINDOW_ROWS 3 #define WINDOW_FOOTER 4 #define WINDOW_TOP_BAR 5 #define WINDOW_BOTTOM_BAR 6 #define WINDOW_ROWNUM 7 #define WINDOW_ROWNUM_LUC 8 extern void initialize_color_pairs(int theme, bool bold_labels, bool bold_cursor); extern void initialize_theme(int theme, int window_identifier, bool is_tabular_fmt, bool no_highlight_lines, Theme *t); #endif pspg-2.6.6/src/unicode.c000066400000000000000000000606241360716715600151030ustar00rootroot00000000000000/*------------------------------------------------------------------------- * * unicode.c * unicode and wide chars routines * * Portions Copyright (c) 2017-2019 Pavel Stehule * * IDENTIFICATION * src/unicode.c * *------------------------------------------------------------------------- */ #include #include #include "unicode.h" #include "string.h" /* * Returns length of utf8 string in chars. */ size_t utf8len(char *s) { size_t len = 0; for (; *s; ++s) if ((*s & 0xC0) != 0x80) ++len; return len; } /* * Returns length of utf8 string in chars. */ size_t utf8len_start_stop(const char *start, const char *stop) { size_t len = 0; for (; *start && start < stop ; ++start) if ((*start & 0xC0) != 0x80) ++len; return len; } /* * Returns length of utf8 char in bytes */ inline int utf8charlen(char ch) { if ((ch & 0x80) == 0) return 1; if ((ch & 0xF0) == 0xF0) return 4; if ((ch & 0xE0) == 0xE0) return 3; if ((ch & 0xC0) == 0xC0) return 2; return 1; } /* * This is an implementation of wcwidth() and wcswidth() as defined in * "The Single UNIX Specification, Version 2, The Open Group, 1997" * * * Markus Kuhn -- 2001-09-08 -- public domain * * customised for PostgreSQL * * original available at : http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c */ struct mbinterval { unsigned short first; unsigned short last; }; /* auxiliary function for binary search in interval table */ static int mbbisearch(wchar_t ucs, const struct mbinterval *table, int max) { int min = 0; int mid; if (ucs < table[0].first || ucs > table[max].last) return 0; while (max >= min) { mid = (min + max) / 2; if (ucs > table[mid].last) min = mid + 1; else if (ucs < table[mid].first) max = mid - 1; else return 1; } return 0; } /* The following functions define the column width of an ISO 10646 * character as follows: * * - The null character (U+0000) has a column width of 0. * * - Other C0/C1 control characters and DEL will lead to a return * value of -1. * * - Non-spacing and enclosing combining characters (general * category code Mn or Me in the Unicode database) have a * column width of 0. * * - Other format characters (general category code Cf in the Unicode * database) and ZERO WIDTH SPACE (U+200B) have a column width of 0. * * - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF) * have a column width of 0. * * - Spacing characters in the East Asian Wide (W) or East Asian * FullWidth (F) category as defined in Unicode Technical * Report #11 have a column width of 2. * * - All remaining characters (including all printable * ISO 8859-1 and WGL4 characters, Unicode control characters, * etc.) have a column width of 1. * * This implementation assumes that wchar_t characters are encoded * in ISO 10646. */ static int ucs_wcwidth(wchar_t ucs) { /* sorted list of non-overlapping intervals of non-spacing characters */ static const struct mbinterval combining[] = { {0x0300, 0x036F}, {0x0483, 0x0489}, {0x0591, 0x05BD}, {0x05BF, 0x05BF}, {0x05C1, 0x05C2}, {0x05C4, 0x05C5}, {0x05C7, 0x05C7}, {0x0610, 0x061A}, {0x064B, 0x065F}, {0x0670, 0x0670}, {0x06D6, 0x06DC}, {0x06DF, 0x06E4}, {0x06E7, 0x06E8}, {0x06EA, 0x06ED}, {0x0711, 0x0711}, {0x0730, 0x074A}, {0x07A6, 0x07B0}, {0x07EB, 0x07F3}, {0x07FD, 0x07FD}, {0x0816, 0x0819}, {0x081B, 0x0823}, {0x0825, 0x0827}, {0x0829, 0x082D}, {0x0859, 0x085B}, {0x08D3, 0x08E1}, {0x08E3, 0x0902}, {0x093A, 0x093A}, {0x093C, 0x093C}, {0x0941, 0x0948}, {0x094D, 0x094D}, {0x0951, 0x0957}, {0x0962, 0x0963}, {0x0981, 0x0981}, {0x09BC, 0x09BC}, {0x09C1, 0x09C4}, {0x09CD, 0x09CD}, {0x09E2, 0x09E3}, {0x09FE, 0x0A02}, {0x0A3C, 0x0A3C}, {0x0A41, 0x0A51}, {0x0A70, 0x0A71}, {0x0A75, 0x0A75}, {0x0A81, 0x0A82}, {0x0ABC, 0x0ABC}, {0x0AC1, 0x0AC8}, {0x0ACD, 0x0ACD}, {0x0AE2, 0x0AE3}, {0x0AFA, 0x0B01}, {0x0B3C, 0x0B3C}, {0x0B3F, 0x0B3F}, {0x0B41, 0x0B44}, {0x0B4D, 0x0B56}, {0x0B62, 0x0B63}, {0x0B82, 0x0B82}, {0x0BC0, 0x0BC0}, {0x0BCD, 0x0BCD}, {0x0C00, 0x0C00}, {0x0C04, 0x0C04}, {0x0C3E, 0x0C40}, {0x0C46, 0x0C56}, {0x0C62, 0x0C63}, {0x0C81, 0x0C81}, {0x0CBC, 0x0CBC}, {0x0CBF, 0x0CBF}, {0x0CC6, 0x0CC6}, {0x0CCC, 0x0CCD}, {0x0CE2, 0x0CE3}, {0x0D00, 0x0D01}, {0x0D3B, 0x0D3C}, {0x0D41, 0x0D44}, {0x0D4D, 0x0D4D}, {0x0D62, 0x0D63}, {0x0DCA, 0x0DCA}, {0x0DD2, 0x0DD6}, {0x0E31, 0x0E31}, {0x0E34, 0x0E3A}, {0x0E47, 0x0E4E}, {0x0EB1, 0x0EB1}, {0x0EB4, 0x0EBC}, {0x0EC8, 0x0ECD}, {0x0F18, 0x0F19}, {0x0F35, 0x0F35}, {0x0F37, 0x0F37}, {0x0F39, 0x0F39}, {0x0F71, 0x0F7E}, {0x0F80, 0x0F84}, {0x0F86, 0x0F87}, {0x0F8D, 0x0FBC}, {0x0FC6, 0x0FC6}, {0x102D, 0x1030}, {0x1032, 0x1037}, {0x1039, 0x103A}, {0x103D, 0x103E}, {0x1058, 0x1059}, {0x105E, 0x1060}, {0x1071, 0x1074}, {0x1082, 0x1082}, {0x1085, 0x1086}, {0x108D, 0x108D}, {0x109D, 0x109D}, {0x135D, 0x135F}, {0x1712, 0x1714}, {0x1732, 0x1734}, {0x1752, 0x1753}, {0x1772, 0x1773}, {0x17B4, 0x17B5}, {0x17B7, 0x17BD}, {0x17C6, 0x17C6}, {0x17C9, 0x17D3}, {0x17DD, 0x17DD}, {0x180B, 0x180D}, {0x1885, 0x1886}, {0x18A9, 0x18A9}, {0x1920, 0x1922}, {0x1927, 0x1928}, {0x1932, 0x1932}, {0x1939, 0x193B}, {0x1A17, 0x1A18}, {0x1A1B, 0x1A1B}, {0x1A56, 0x1A56}, {0x1A58, 0x1A60}, {0x1A62, 0x1A62}, {0x1A65, 0x1A6C}, {0x1A73, 0x1A7F}, {0x1AB0, 0x1B03}, {0x1B34, 0x1B34}, {0x1B36, 0x1B3A}, {0x1B3C, 0x1B3C}, {0x1B42, 0x1B42}, {0x1B6B, 0x1B73}, {0x1B80, 0x1B81}, {0x1BA2, 0x1BA5}, {0x1BA8, 0x1BA9}, {0x1BAB, 0x1BAD}, {0x1BE6, 0x1BE6}, {0x1BE8, 0x1BE9}, {0x1BED, 0x1BED}, {0x1BEF, 0x1BF1}, {0x1C2C, 0x1C33}, {0x1C36, 0x1C37}, {0x1CD0, 0x1CD2}, {0x1CD4, 0x1CE0}, {0x1CE2, 0x1CE8}, {0x1CED, 0x1CED}, {0x1CF4, 0x1CF4}, {0x1CF8, 0x1CF9}, {0x1DC0, 0x1DFF}, {0x20D0, 0x20F0}, {0x2CEF, 0x2CF1}, {0x2D7F, 0x2D7F}, {0x2DE0, 0x2DFF}, {0x302A, 0x302D}, {0x3099, 0x309A}, {0xA66F, 0xA672}, {0xA674, 0xA67D}, {0xA69E, 0xA69F}, {0xA6F0, 0xA6F1}, {0xA802, 0xA802}, {0xA806, 0xA806}, {0xA80B, 0xA80B}, {0xA825, 0xA826}, {0xA8C4, 0xA8C5}, {0xA8E0, 0xA8F1}, {0xA8FF, 0xA8FF}, {0xA926, 0xA92D}, {0xA947, 0xA951}, {0xA980, 0xA982}, {0xA9B3, 0xA9B3}, {0xA9B6, 0xA9B9}, {0xA9BC, 0xA9BD}, {0xA9E5, 0xA9E5}, {0xAA29, 0xAA2E}, {0xAA31, 0xAA32}, {0xAA35, 0xAA36}, {0xAA43, 0xAA43}, {0xAA4C, 0xAA4C}, {0xAA7C, 0xAA7C}, {0xAAB0, 0xAAB0}, {0xAAB2, 0xAAB4}, {0xAAB7, 0xAAB8}, {0xAABE, 0xAABF}, {0xAAC1, 0xAAC1}, {0xAAEC, 0xAAED}, {0xAAF6, 0xAAF6}, {0xABE5, 0xABE5}, {0xABE8, 0xABE8}, {0xABED, 0xABED}, {0xFB1E, 0xFB1E}, {0xFE00, 0xFE0F}, {0xFE20, 0xFE2F}, }; /* test for 8-bit control characters */ if (ucs == 0) return 0; if (ucs < 0x20 || (ucs >= 0x7f && ucs < 0xa0) || ucs > 0x0010ffff) return -1; /* binary search in table of non-spacing characters */ if (mbbisearch(ucs, combining, sizeof(combining) / sizeof(struct mbinterval) - 1)) return 0; /* * if we arrive here, ucs is not a combining or C0/C1 control character */ return 1 + (ucs >= 0x1100 && (ucs <= 0x115f || /* Hangul Jamo init. consonants */ (ucs >= 0x2e80 && ucs <= 0xa4cf && (ucs & ~0x0011) != 0x300a && ucs != 0x303f) || /* CJK ... Yi */ (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */ (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility * Ideographs */ (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */ (ucs >= 0xff00 && ucs <= 0xff5f) || /* Fullwidth Forms */ (ucs >= 0xffe0 && ucs <= 0xffe6) || (ucs >= 0x20000 && ucs <= 0x2ffff))); } /* * Map a Unicode code point to UTF-8. utf8string must have 4 bytes of * space allocated. */ unsigned char * unicode_to_utf8(wchar_t c, unsigned char *utf8string, int *size) { int _size; if (c <= 0x7F) { utf8string[0] = c; _size = 1; } else if (c <= 0x7FF) { utf8string[0] = 0xC0 | ((c >> 6) & 0x1F); utf8string[1] = 0x80 | (c & 0x3F); _size = 2; } else if (c <= 0xFFFF) { utf8string[0] = 0xE0 | ((c >> 12) & 0x0F); utf8string[1] = 0x80 | ((c >> 6) & 0x3F); utf8string[2] = 0x80 | (c & 0x3F); _size = 3; } else { utf8string[0] = 0xF0 | ((c >> 18) & 0x07); utf8string[1] = 0x80 | ((c >> 12) & 0x3F); utf8string[2] = 0x80 | ((c >> 6) & 0x3F); utf8string[3] = 0x80 | (c & 0x3F); _size = 4; } if (size != NULL) *size = _size; return utf8string; } /* * Convert a UTF-8 character to a Unicode code point. * This is a one-character version of pg_utf2wchar_with_len. * * No error checks here, c must point to a long-enough string. */ wchar_t utf8_to_unicode(const unsigned char *c) { if ((*c & 0x80) == 0) return (wchar_t) c[0]; else if ((*c & 0xe0) == 0xc0) return (wchar_t) (((c[0] & 0x1f) << 6) | (c[1] & 0x3f)); else if ((*c & 0xf0) == 0xe0) return (wchar_t) (((c[0] & 0x0f) << 12) | ((c[1] & 0x3f) << 6) | (c[2] & 0x3f)); else if ((*c & 0xf8) == 0xf0) return (wchar_t) (((c[0] & 0x07) << 18) | ((c[1] & 0x3f) << 12) | ((c[2] & 0x3f) << 6) | (c[3] & 0x3f)); else #if __WCHAR_MAX__ > 0x10000 /* that is an invalid code on purpose */ return 0xffffffff; #else /* that is an invalid code on purpose */ return 0xffff; #endif } inline int utf_dsplen(const char *s) { if (*s == ' ') return 1; return ucs_wcwidth(utf8_to_unicode((const unsigned char *) s)); } inline static int _utf_dsplen(const char *s) { return ucs_wcwidth(utf8_to_unicode((const unsigned char *) s)); } /* * Returns display length of \0 ended multibyte string. * The string is limited by max_bytes too. */ int utf_string_dsplen(const char *s, size_t max_bytes) { int result = 0; const char *ptr = s; while (*ptr != '\0' && max_bytes > 0) { if (*ptr == ' ') { ptr += 1; result += 1; max_bytes -= 1; } else { int clen; clen = utf8charlen(*ptr); result += _utf_dsplen(ptr); ptr += clen; max_bytes -= clen; } } return result; } int utf_string_dsplen_multiline(const char *s, size_t max_bytes, bool *multiline, bool first_only, long int *digits, long int *others) { int result = -1; int rowlen = 0; const char *ptr = s; *multiline = false; while (*ptr != '\0' && max_bytes > 0) { int clen; if (!first_only) { if (*ptr >= '0' && *ptr <= '9') (*digits)++; else if (*ptr != '-' && *ptr != ' ' && *ptr != ':') (*others)++; } if (*ptr == '\n') { *multiline = true; result = rowlen > result ? rowlen : result; max_bytes -= 1; rowlen = 0; ptr += 1; if (first_only) break; continue; } clen = utf8charlen(*ptr); rowlen += utf_dsplen(ptr); ptr += clen; max_bytes -= clen; } return result != -1 ? result : rowlen; } /* * This version of previous function uses similar calculation like * readline libarry - and supports terminal tabs. * * This code is based on demo ulfalizer/readline-and-ncurses * */ int readline_utf_string_dsplen(const char *s, size_t max_bytes, size_t offset) { int result = 0; const char *ptr = s; while (*ptr != '\0' && max_bytes > 0) { int clen = utf8charlen(*ptr); int dsplen = utf_dsplen(ptr); if (dsplen > 0) result += dsplen; else if (*ptr == '\t') result = ((result + offset + 8) & ~7) - offset; ptr += clen; max_bytes -= clen; } return result; } /* * following code is taken from starwing/luautf8 library. * */ typedef struct conv_table { wchar_t first; wchar_t last; int step; int offset; } conv_table; typedef struct range_table { wchar_t first; wchar_t last; int step; } range_table; static int convert_char(conv_table *t, size_t size, wchar_t ucs) { size_t begin, end; begin = 0; end = size; while (begin < end) { int mid = (begin + end) / 2; if (t[mid].last < ucs) begin = mid + 1; else if (t[mid].first > ucs) end = mid; else if ((ucs - t[mid].first) % t[mid].step == 0) return ucs + t[mid].offset; else return ucs; } return ucs; } static int find_in_range(range_table *t, size_t size, wchar_t ucs) { size_t begin, end; begin = 0; end = size; while (begin < end) { int mid = (begin + end) / 2; if (t[mid].last < ucs) begin = mid + 1; else if (t[mid].first > ucs) end = mid; else return (ucs - t[mid].first) % t[mid].step == 0; } return 0; } #define table_size(t) (sizeof(t)/sizeof((t)[0])) int utf8_tofold(const char *s) { static struct conv_table tofold_table[] = { { 0x41, 0x5A, 1, 32 }, { 0xB5, 0xB5, 1, 775 }, { 0xC0, 0xD6, 1, 32 }, { 0xD8, 0xDE, 1, 32 }, { 0x100, 0x12E, 2, 1 }, { 0x132, 0x136, 2, 1 }, { 0x139, 0x147, 2, 1 }, { 0x14A, 0x176, 2, 1 }, { 0x178, 0x178, 1, -121 }, { 0x179, 0x17D, 2, 1 }, { 0x17F, 0x17F, 1, -268 }, { 0x181, 0x181, 1, 210 }, { 0x182, 0x184, 2, 1 }, { 0x186, 0x186, 1, 206 }, { 0x187, 0x187, 1, 1 }, { 0x189, 0x18A, 1, 205 }, { 0x18B, 0x18B, 1, 1 }, { 0x18E, 0x18E, 1, 79 }, { 0x18F, 0x18F, 1, 202 }, { 0x190, 0x190, 1, 203 }, { 0x191, 0x191, 1, 1 }, { 0x193, 0x193, 1, 205 }, { 0x194, 0x194, 1, 207 }, { 0x196, 0x196, 1, 211 }, { 0x197, 0x197, 1, 209 }, { 0x198, 0x198, 1, 1 }, { 0x19C, 0x19C, 1, 211 }, { 0x19D, 0x19D, 1, 213 }, { 0x19F, 0x19F, 1, 214 }, { 0x1A0, 0x1A4, 2, 1 }, { 0x1A6, 0x1A6, 1, 218 }, { 0x1A7, 0x1A7, 1, 1 }, { 0x1A9, 0x1A9, 1, 218 }, { 0x1AC, 0x1AC, 1, 1 }, { 0x1AE, 0x1AE, 1, 218 }, { 0x1AF, 0x1AF, 1, 1 }, { 0x1B1, 0x1B2, 1, 217 }, { 0x1B3, 0x1B5, 2, 1 }, { 0x1B7, 0x1B7, 1, 219 }, { 0x1B8, 0x1BC, 4, 1 }, { 0x1C4, 0x1C4, 1, 2 }, { 0x1C5, 0x1C5, 1, 1 }, { 0x1C7, 0x1C7, 1, 2 }, { 0x1C8, 0x1C8, 1, 1 }, { 0x1CA, 0x1CA, 1, 2 }, { 0x1CB, 0x1DB, 2, 1 }, { 0x1DE, 0x1EE, 2, 1 }, { 0x1F1, 0x1F1, 1, 2 }, { 0x1F2, 0x1F4, 2, 1 }, { 0x1F6, 0x1F6, 1, -97 }, { 0x1F7, 0x1F7, 1, -56 }, { 0x1F8, 0x21E, 2, 1 }, { 0x220, 0x220, 1, -130 }, { 0x222, 0x232, 2, 1 }, { 0x23A, 0x23A, 1, 10795 }, { 0x23B, 0x23B, 1, 1 }, { 0x23D, 0x23D, 1, -163 }, { 0x23E, 0x23E, 1, 10792 }, { 0x241, 0x241, 1, 1 }, { 0x243, 0x243, 1, -195 }, { 0x244, 0x244, 1, 69 }, { 0x245, 0x245, 1, 71 }, { 0x246, 0x24E, 2, 1 }, { 0x345, 0x345, 1, 116 }, { 0x370, 0x372, 2, 1 }, { 0x376, 0x376, 1, 1 }, { 0x37F, 0x37F, 1, 116 }, { 0x386, 0x386, 1, 38 }, { 0x388, 0x38A, 1, 37 }, { 0x38C, 0x38C, 1, 64 }, { 0x38E, 0x38F, 1, 63 }, { 0x391, 0x3A1, 1, 32 }, { 0x3A3, 0x3AB, 1, 32 }, { 0x3C2, 0x3C2, 1, 1 }, { 0x3CF, 0x3CF, 1, 8 }, { 0x3D0, 0x3D0, 1, -30 }, { 0x3D1, 0x3D1, 1, -25 }, { 0x3D5, 0x3D5, 1, -15 }, { 0x3D6, 0x3D6, 1, -22 }, { 0x3D8, 0x3EE, 2, 1 }, { 0x3F0, 0x3F0, 1, -54 }, { 0x3F1, 0x3F1, 1, -48 }, { 0x3F4, 0x3F4, 1, -60 }, { 0x3F5, 0x3F5, 1, -64 }, { 0x3F7, 0x3F7, 1, 1 }, { 0x3F9, 0x3F9, 1, -7 }, { 0x3FA, 0x3FA, 1, 1 }, { 0x3FD, 0x3FF, 1, -130 }, { 0x400, 0x40F, 1, 80 }, { 0x410, 0x42F, 1, 32 }, { 0x460, 0x480, 2, 1 }, { 0x48A, 0x4BE, 2, 1 }, { 0x4C0, 0x4C0, 1, 15 }, { 0x4C1, 0x4CD, 2, 1 }, { 0x4D0, 0x52E, 2, 1 }, { 0x531, 0x556, 1, 48 }, { 0x10A0, 0x10C5, 1, 7264 }, { 0x10C7, 0x10CD, 6, 7264 }, { 0x13F8, 0x13FD, 1, -8 }, { 0x1E00, 0x1E94, 2, 1 }, { 0x1E9B, 0x1E9B, 1, -58 }, { 0x1E9E, 0x1E9E, 1, -7615 }, { 0x1EA0, 0x1EFE, 2, 1 }, { 0x1F08, 0x1F0F, 1, -8 }, { 0x1F18, 0x1F1D, 1, -8 }, { 0x1F28, 0x1F2F, 1, -8 }, { 0x1F38, 0x1F3F, 1, -8 }, { 0x1F48, 0x1F4D, 1, -8 }, { 0x1F59, 0x1F5F, 2, -8 }, { 0x1F68, 0x1F6F, 1, -8 }, { 0x1F88, 0x1F8F, 1, -8 }, { 0x1F98, 0x1F9F, 1, -8 }, { 0x1FA8, 0x1FAF, 1, -8 }, { 0x1FB8, 0x1FB9, 1, -8 }, { 0x1FBA, 0x1FBB, 1, -74 }, { 0x1FBC, 0x1FBC, 1, -9 }, { 0x1FBE, 0x1FBE, 1, -7173 }, { 0x1FC8, 0x1FCB, 1, -86 }, { 0x1FCC, 0x1FCC, 1, -9 }, { 0x1FD8, 0x1FD9, 1, -8 }, { 0x1FDA, 0x1FDB, 1, -100 }, { 0x1FE8, 0x1FE9, 1, -8 }, { 0x1FEA, 0x1FEB, 1, -112 }, { 0x1FEC, 0x1FEC, 1, -7 }, { 0x1FF8, 0x1FF9, 1, -128 }, { 0x1FFA, 0x1FFB, 1, -126 }, { 0x1FFC, 0x1FFC, 1, -9 },{ 0x2126, 0x2126, 1, -7517 }, { 0x212A, 0x212A, 1, -8383 }, { 0x212B, 0x212B, 1, -8262 }, { 0x2132, 0x2132, 1, 28 }, { 0x2160, 0x216F, 1, 16 }, { 0x2183, 0x2183, 1, 1 }, { 0x24B6, 0x24CF, 1, 26 }, { 0x2C00, 0x2C2E, 1, 48 }, { 0x2C60, 0x2C60, 1, 1 }, { 0x2C62, 0x2C62, 1, -10743 }, { 0x2C63, 0x2C63, 1, -3814 }, { 0x2C64, 0x2C64, 1, -10727 }, { 0x2C67, 0x2C6B, 2, 1 }, { 0x2C6D, 0x2C6D, 1, -10780 }, { 0x2C6E, 0x2C6E, 1, -10749 }, { 0x2C6F, 0x2C6F, 1, -10783 }, { 0x2C70, 0x2C70, 1, -10782 }, { 0x2C72, 0x2C75, 3, 1 },{ 0x2C7E, 0x2C7F, 1, -10815 }, { 0x2C80, 0x2CE2, 2, 1 }, { 0x2CEB, 0x2CED, 2, 1 }, { 0x2CF2, 0xA640, 31054, 1 }, { 0xA642, 0xA66C, 2, 1 }, { 0xA680, 0xA69A, 2, 1 }, { 0xA722, 0xA72E, 2, 1 }, { 0xA732, 0xA76E, 2, 1 }, { 0xA779, 0xA77B, 2, 1 }, { 0xA77D, 0xA77D, 1, -35332 }, { 0xA77E, 0xA786, 2, 1 }, { 0xA78B, 0xA78B, 1, 1 }, { 0xA78D, 0xA78D, 1, -42280 }, { 0xA790, 0xA792, 2, 1 }, { 0xA796, 0xA7A8, 2, 1 }, { 0xA7AA, 0xA7AA, 1, -42308 }, { 0xA7AB, 0xA7AB, 1, -42319 }, { 0xA7AC, 0xA7AC, 1, -42315 },{ 0xA7AD, 0xA7AD, 1, -42305 }, { 0xA7B0, 0xA7B0, 1, -42258 }, { 0xA7B1, 0xA7B1, 1, -42282 }, { 0xA7B2, 0xA7B2, 1, -42261 }, { 0xA7B3, 0xA7B3, 1, 928 }, { 0xA7B4, 0xA7B6, 2, 1 }, { 0xAB70, 0xABBF, 1, -38864 }, { 0xFF21, 0xFF3A, 1, 32 } #if __WCHAR_MAX__ > 0x10000 , { 0x10400, 0x10427, 1, 40 }, { 0x10C80, 0x10CB2, 1, 64 }, { 0x118A0, 0x118BF, 1, 32 } #endif }; return convert_char(tofold_table, table_size(tofold_table), utf8_to_unicode((const unsigned char *) s)); } const char * utf8_nstrstr_with_sizes(const char *haystack, int haystack_size, const char *needle, int needle_size) { const char *haystack_cur, *needle_cur, *needle_prev; const char *haystack_end, *needle_end; int f1 = 0, f2 = 0; int needle_char_len = 0; /* be compiler quiet */ needle_cur = needle; needle_prev = NULL; haystack_cur = haystack; haystack_end = haystack + haystack_size; needle_end = needle + needle_size; while (needle_cur < needle_end) { if (haystack_cur == haystack_end) return NULL; if (needle_prev != needle_cur) { needle_prev = needle_cur; needle_char_len = utf8charlen(*needle_cur); f1 = utf8_tofold(needle_cur); } f2 = utf8_tofold(haystack_cur); if (f1 == f2) { needle_cur += needle_char_len; haystack_cur += utf8charlen(*haystack_cur); } else { needle_cur = needle; haystack_cur = haystack += utf8charlen(*haystack); } } return haystack; } const char * utf8_nstrstr(const char *haystack, const char *needle) { const char *haystack_cur, *needle_cur, *needle_prev; int f1 = 0, f2 = 0; int needle_char_len = 0; /* be compiler quiet */ needle_cur = needle; needle_prev = NULL; haystack_cur = haystack; while (*needle_cur != '\0') { if (*haystack_cur == '\0') return NULL; if (needle_prev != needle_cur) { needle_prev = needle_cur; needle_char_len = utf8charlen(*needle_cur); f1 = utf8_tofold(needle_cur); } f2 = utf8_tofold(haystack_cur); if (f1 == f2) { needle_cur += needle_char_len; haystack_cur += utf8charlen(*haystack_cur); } else { needle_cur = needle; haystack_cur = haystack += utf8charlen(*haystack); } } return haystack; } /* * Special string searching, lower chars are case insensitive, * upper chars are case sensitive. */ const char * utf8_nstrstr_ignore_lower_case(const char *haystack, const char *needle) { const char *haystack_cur, *needle_cur, *needle_prev; int f1 = 0, f2 = 0; bool eq; needle_cur = needle; needle_prev = NULL; haystack_cur = haystack; while (*needle_cur != '\0') { int haystack_char_len; int needle_char_len = 0; bool needle_char_is_upper = false; if (*haystack_cur == '\0') return NULL; haystack_char_len = utf8charlen(*haystack_cur); if (needle_prev != needle_cur) { needle_prev = needle_cur; needle_char_len = utf8charlen(*needle_cur); needle_char_is_upper = utf8_isupper(needle_cur); f1 = utf8_tofold(needle_cur); } if (needle_char_is_upper) { /* case sensitive */ if (needle_char_len == haystack_char_len) eq = memcmp(haystack_cur, needle_cur, needle_char_len) == 0; else eq = false; } else { /* case insensitive */ f2 = utf8_tofold(haystack_cur); eq = f1 == f2; } if (eq) { needle_cur += needle_char_len; haystack_cur += haystack_char_len; } else { needle_cur = needle; haystack_cur = haystack += utf8charlen(*haystack); } } return haystack; } bool utf8_isupper(const char *s) { static struct range_table upper_table[] = { { 0x41, 0x5A, 1 }, { 0xC0, 0xD6, 1 }, { 0xD8, 0xDE, 1 }, { 0x100, 0x136, 2 }, { 0x139, 0x147, 2 }, { 0x14A, 0x178, 2 }, { 0x179, 0x17D, 2 }, { 0x181, 0x182, 1 }, { 0x184, 0x186, 2 }, { 0x187, 0x189, 2 }, { 0x18A, 0x18B, 1 }, { 0x18E, 0x191, 1 }, { 0x193, 0x194, 1 }, { 0x196, 0x198, 1 }, { 0x19C, 0x19D, 1 }, { 0x19F, 0x1A0, 1 }, { 0x1A2, 0x1A6, 2 }, { 0x1A7, 0x1A9, 2 }, { 0x1AC, 0x1AE, 2 }, { 0x1AF, 0x1B1, 2 }, { 0x1B2, 0x1B3, 1 }, { 0x1B5, 0x1B7, 2 }, { 0x1B8, 0x1BC, 4 }, { 0x1C4, 0x1CD, 3 }, { 0x1CF, 0x1DB, 2 }, { 0x1DE, 0x1EE, 2 }, { 0x1F1, 0x1F4, 3 }, { 0x1F6, 0x1F8, 1 }, { 0x1FA, 0x232, 2 }, { 0x23A, 0x23B, 1 }, { 0x23D, 0x23E, 1 }, { 0x241, 0x243, 2 }, { 0x244, 0x246, 1 }, { 0x248, 0x24E, 2 }, { 0x370, 0x372, 2 }, { 0x376, 0x37F, 9 }, { 0x386, 0x388, 2 }, { 0x389, 0x38A, 1 }, { 0x38C, 0x38E, 2 }, { 0x38F, 0x391, 2 }, { 0x392, 0x3A1, 1 }, { 0x3A3, 0x3AB, 1 }, { 0x3CF, 0x3D2, 3 }, { 0x3D3, 0x3D4, 1 }, { 0x3D8, 0x3EE, 2 }, { 0x3F4, 0x3F7, 3 }, { 0x3F9, 0x3FA, 1 }, { 0x3FD, 0x42F, 1 }, { 0x460, 0x480, 2 }, { 0x48A, 0x4C0, 2 }, { 0x4C1, 0x4CD, 2 }, { 0x4D0, 0x52E, 2 }, { 0x531, 0x556, 1 }, { 0x10A0, 0x10C5, 1 }, { 0x10C7, 0x10CD, 6 }, { 0x13A0, 0x13F5, 1 }, { 0x1E00, 0x1E94, 2 }, { 0x1E9E, 0x1EFE, 2 }, { 0x1F08, 0x1F0F, 1 }, { 0x1F18, 0x1F1D, 1 }, { 0x1F28, 0x1F2F, 1 }, { 0x1F38, 0x1F3F, 1 }, { 0x1F48, 0x1F4D, 1 }, { 0x1F59, 0x1F5F, 2 }, { 0x1F68, 0x1F6F, 1 }, { 0x1FB8, 0x1FBB, 1 }, { 0x1FC8, 0x1FCB, 1 }, { 0x1FD8, 0x1FDB, 1 }, { 0x1FE8, 0x1FEC, 1 }, { 0x1FF8, 0x1FFB, 1 }, { 0x2102, 0x2107, 5 }, { 0x210B, 0x210D, 1 }, { 0x2110, 0x2112, 1 }, { 0x2115, 0x2119, 4 }, { 0x211A, 0x211D, 1 }, { 0x2124, 0x212A, 2 }, { 0x212B, 0x212D, 1 }, { 0x2130, 0x2133, 1 }, { 0x213E, 0x213F, 1 }, { 0x2145, 0x2160, 27 }, { 0x2161, 0x216F, 1 }, { 0x2183, 0x24B6, 819 }, { 0x24B7, 0x24CF, 1 }, { 0x2C00, 0x2C2E, 1 }, { 0x2C60, 0x2C62, 2 }, { 0x2C63, 0x2C64, 1 }, { 0x2C67, 0x2C6D, 2 }, { 0x2C6E, 0x2C70, 1 }, { 0x2C72, 0x2C75, 3 }, { 0x2C7E, 0x2C80, 1 }, { 0x2C82, 0x2CE2, 2 }, { 0x2CEB, 0x2CED, 2 }, { 0x2CF2, 0xA640, 31054 }, { 0xA642, 0xA66C, 2 }, { 0xA680, 0xA69A, 2 }, { 0xA722, 0xA72E, 2 }, { 0xA732, 0xA76E, 2 }, { 0xA779, 0xA77D, 2 }, { 0xA77E, 0xA786, 2 }, { 0xA78B, 0xA78D, 2 }, { 0xA790, 0xA792, 2 }, { 0xA796, 0xA7AA, 2 }, { 0xA7AB, 0xA7AD, 1 }, { 0xA7B0, 0xA7B4, 1 }, { 0xA7B6, 0xFF21, 22379 }, { 0xFF22, 0xFF3A, 1 } #if __WCHAR_MAX__ > 0x10000 , { 0x10400, 0x10427, 1 }, { 0x10C80, 0x10CB2, 1 }, { 0x118A0, 0x118BF, 1 }, { 0x1D400, 0x1D419, 1 }, { 0x1D434, 0x1D44D, 1 }, { 0x1D468, 0x1D481, 1 }, { 0x1D49C, 0x1D49E, 2 }, { 0x1D49F, 0x1D4A5, 3 }, { 0x1D4A6, 0x1D4A9, 3 }, { 0x1D4AA, 0x1D4AC, 1 }, { 0x1D4AE, 0x1D4B5, 1 }, { 0x1D4D0, 0x1D4E9, 1 }, { 0x1D504, 0x1D505, 1 }, { 0x1D507, 0x1D50A, 1 }, { 0x1D50D, 0x1D514, 1 }, { 0x1D516, 0x1D51C, 1 }, { 0x1D538, 0x1D539, 1 }, { 0x1D53B, 0x1D53E, 1 }, { 0x1D540, 0x1D544, 1 }, { 0x1D546, 0x1D54A, 4 }, { 0x1D54B, 0x1D550, 1 }, { 0x1D56C, 0x1D585, 1 }, { 0x1D5A0, 0x1D5B9, 1 }, { 0x1D5D4, 0x1D5ED, 1 }, { 0x1D608, 0x1D621, 1 }, { 0x1D63C, 0x1D655, 1 }, { 0x1D670, 0x1D689, 1 }, { 0x1D6A8, 0x1D6C0, 1 }, { 0x1D6E2, 0x1D6FA, 1 }, { 0x1D71C, 0x1D734, 1 }, { 0x1D756, 0x1D76E, 1 }, { 0x1D790, 0x1D7A8, 1 }, { 0x1D7CA, 0x1F130, 6502 }, { 0x1F131, 0x1F149, 1 }, { 0x1F150, 0x1F169, 1 }, { 0x1F170, 0x1F189, 1 }, #endif }; return find_in_range(upper_table, table_size(upper_table), utf8_to_unicode((const unsigned char *) s)) != 0; } int utf2wchar_with_len(const unsigned char *from, wchar_t *to, int len) { int cnt = 0; unsigned int c1, c2, c3, c4; while (len > 0 && *from) { if ((*from & 0x80) == 0) { *to = *from++; len--; } else if ((*from & 0xe0) == 0xc0) { if (len < 2) break; /* drop trailing incomplete char */ c1 = *from++ & 0x1f; c2 = *from++ & 0x3f; *to = (c1 << 6) | c2; len -= 2; } else if ((*from & 0xf0) == 0xe0) { if (len < 3) break; /* drop trailing incomplete char */ c1 = *from++ & 0x0f; c2 = *from++ & 0x3f; c3 = *from++ & 0x3f; *to = (c1 << 12) | (c2 << 6) | c3; len -= 3; } else if ((*from & 0xf8) == 0xf0) { if (len < 4) break; /* drop trailing incomplete char */ c1 = *from++ & 0x07; c2 = *from++ & 0x3f; c3 = *from++ & 0x3f; c4 = *from++ & 0x3f; *to = (c1 << 18) | (c2 << 12) | (c3 << 6) | c4; len -= 4; } else { /* treat a bogus char as length 1; not ours to raise error */ *to = *from++; len--; } to++; cnt++; } *to = 0; return cnt; } pspg-2.6.6/src/unicode.h000066400000000000000000000026001360716715600150760ustar00rootroot00000000000000/*------------------------------------------------------------------------- * * unicode.h * unicode and wide chars routines * * Portions Copyright (c) 2017-2019 Pavel Stehule * * IDENTIFICATION * src/unicode.h * *------------------------------------------------------------------------- */ #ifndef PSPG_UNICODE_H #define PSPG_UNICODE_H #include #include extern size_t utf8len(char *s); extern size_t utf8len_start_stop(const char *start, const char *stop); extern int utf8charlen(char ch); extern int utf_dsplen(const char *s); extern int utf_string_dsplen(const char *s, size_t max_bytes); extern int readline_utf_string_dsplen(const char *s, size_t max_bytes, size_t offset); extern const char *utf8_nstrstr(const char *haystack, const char *needle); extern const char *utf8_nstrstr_with_sizes(const char *haystack, int haystack_size, const char *needle, int needle_size); extern const char *utf8_nstrstr_ignore_lower_case(const char *haystack, const char *needle); extern bool utf8_isupper(const char *s); extern unsigned char *unicode_to_utf8(wchar_t c, unsigned char *utf8string, int *size); extern int utf8_tofold(const char *s); extern int utf2wchar_with_len(const unsigned char *from, wchar_t *to, int len); extern int utf_string_dsplen_multiline(const char *s, size_t max_bytes, bool *multiline, bool first_only, long int *digits, long int *others); #endif pspg-2.6.6/tests/000077500000000000000000000000001360716715600136545ustar00rootroot00000000000000pspg-2.6.6/tests/ascii.txt000066400000000000000000005563001360716715600155160ustar00rootroot00000000000000+-------------------------------------------+--------------+---------+-----------+----------+-------+-------------+---------------+----------+-----------+---------------+---------------+-------------+-------------+----------------+---------+----------+-----------+------------+------------+-------------+----------------+----------------+----------------+---------------------+----------------+--------------+----------------+--------------+------------+------------------------------------------+-------------------------+--------------+ | relname | relnamespace | reltype | reloftype | relowner | relam | relfilenode | reltablespace | relpages | reltuples | relallvisible | reltoastrelid | relhasindex | relisshared | relpersistence | relkind | relnatts | relchecks | relhasoids | relhaspkey | relhasrules | relhastriggers | relhassubclass | relrowsecurity | relforcerowsecurity | relispopulated | relreplident | relispartition | relfrozenxid | relminmxid | relacl | reloptions | relpartbound | +-------------------------------------------+--------------+---------+-----------+----------+-------+-------------+---------------+----------+-----------+---------------+---------------+-------------+-------------+----------------+---------+----------+-----------+------------+------------+-------------+----------------+----------------+----------------+---------------------+----------------+--------------+----------------+--------------+------------+------------------------------------------+-------------------------+--------------+ | test | 2200 | 16387 | 0 | 16384 | 0 | 16391 | 0 | 0 | 0 | 0 | 16388 | f | f | p | r | 1 | 0 | f | f | f | f | f | f | f | t | d | f | 560 | 1 | | | | | pg_toast_16385 | 99 | 16389 | 0 | 16384 | 0 | 16392 | 0 | 0 | 0 | 0 | 0 | t | f | p | t | 3 | 0 | f | t | f | f | f | f | f | t | n | f | 560 | 1 | | | | | pg_toast_16385_index | 99 | 0 | 0 | 16384 | 403 | 16393 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_statistic | 11 | 11306 | 0 | 10 | 0 | 2619 | 0 | 16 | 395 | 16 | 2840 | t | f | p | r | 26 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres} | | | | pg_type | 11 | 71 | 0 | 10 | 0 | 0 | 0 | 9 | 382 | 9 | 0 | t | f | p | r | 30 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_toast_2604 | 99 | 11563 | 0 | 10 | 0 | 2830 | 0 | 0 | 0 | 0 | 0 | t | f | p | t | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | | | | | pg_toast_2604_index | 99 | 0 | 0 | 10 | 403 | 2831 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_toast_2606 | 99 | 11564 | 0 | 10 | 0 | 2832 | 0 | 0 | 0 | 0 | 0 | t | f | p | t | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | | | | | pg_toast_2606_index | 99 | 0 | 0 | 10 | 403 | 2833 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_toast_2609 | 99 | 11565 | 0 | 10 | 0 | 2834 | 0 | 0 | 0 | 0 | 0 | t | f | p | t | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | | | | | pg_toast_2609_index | 99 | 0 | 0 | 10 | 403 | 2835 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_toast_1255 | 99 | 11566 | 0 | 10 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | t | f | p | t | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | | | | | pg_toast_1255_index | 99 | 0 | 0 | 10 | 403 | 0 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_toast_2618 | 99 | 11567 | 0 | 10 | 0 | 2838 | 0 | 52 | 228 | 52 | 0 | t | f | p | t | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | | | | | pg_toast_2618_index | 99 | 0 | 0 | 10 | 403 | 2839 | 0 | 2 | 228 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_toast_3596 | 99 | 11568 | 0 | 10 | 0 | 3598 | 0 | 0 | 0 | 0 | 0 | t | f | p | t | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | | | | | pg_toast_3596_index | 99 | 0 | 0 | 10 | 403 | 3599 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_toast_2619 | 99 | 11569 | 0 | 10 | 0 | 2840 | 0 | 3 | 13 | 3 | 0 | t | f | p | t | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | | | | | pg_toast_2619_index | 99 | 0 | 0 | 10 | 403 | 2841 | 0 | 2 | 13 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_toast_3381 | 99 | 11570 | 0 | 10 | 0 | 3439 | 0 | 0 | 0 | 0 | 0 | t | f | p | t | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | | | | | pg_toast_3381_index | 99 | 0 | 0 | 10 | 403 | 3440 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_toast_2620 | 99 | 11571 | 0 | 10 | 0 | 2336 | 0 | 0 | 0 | 0 | 0 | t | f | p | t | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | | | | | pg_toast_2620_index | 99 | 0 | 0 | 10 | 403 | 2337 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_toast_2396 | 99 | 11572 | 0 | 10 | 0 | 0 | 1664 | 0 | 0 | 0 | 0 | t | t | p | t | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | | | | | pg_toast_2396_index | 99 | 0 | 0 | 10 | 403 | 0 | 1664 | 1 | 0 | 0 | 0 | f | t | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_toast_2964 | 99 | 11573 | 0 | 10 | 0 | 0 | 1664 | 0 | 0 | 0 | 0 | t | t | p | t | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | | | | | pg_toast_2964_index | 99 | 0 | 0 | 10 | 403 | 0 | 1664 | 1 | 0 | 0 | 0 | f | t | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_toast_3592 | 99 | 11574 | 0 | 10 | 0 | 0 | 1664 | 0 | 0 | 0 | 0 | t | t | p | t | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | | | | | pg_toast_3592_index | 99 | 0 | 0 | 10 | 403 | 0 | 1664 | 1 | 0 | 0 | 0 | f | t | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_aggregate_fnoid_index | 11 | 0 | 0 | 10 | 403 | 2650 | 0 | 2 | 142 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_am_name_index | 11 | 0 | 0 | 10 | 403 | 2651 | 0 | 2 | 6 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_am_oid_index | 11 | 0 | 0 | 10 | 403 | 2652 | 0 | 2 | 6 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_amop_fam_strat_index | 11 | 0 | 0 | 10 | 403 | 2653 | 0 | 5 | 725 | 0 | 0 | f | f | p | i | 4 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_amop_opr_fam_index | 11 | 0 | 0 | 10 | 403 | 2654 | 0 | 5 | 725 | 0 | 0 | f | f | p | i | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_amop_oid_index | 11 | 0 | 0 | 10 | 403 | 2756 | 0 | 4 | 725 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_amproc_fam_proc_index | 11 | 0 | 0 | 10 | 403 | 2655 | 0 | 4 | 442 | 0 | 0 | f | f | p | i | 4 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_amproc_oid_index | 11 | 0 | 0 | 10 | 403 | 2757 | 0 | 4 | 442 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_policy | 11 | 11550 | 0 | 10 | 0 | 3256 | 0 | 0 | 0 | 0 | 0 | t | f | p | r | 7 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_attrdef_adrelid_adnum_index | 11 | 0 | 0 | 10 | 403 | 2656 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_attrdef_oid_index | 11 | 0 | 0 | 10 | 403 | 2657 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_attribute_relid_attnam_index | 11 | 0 | 0 | 10 | 403 | 0 | 0 | 13 | 2582 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_attribute_relid_attnum_index | 11 | 0 | 0 | 10 | 403 | 0 | 0 | 10 | 2582 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_authid_rolname_index | 11 | 0 | 0 | 10 | 403 | 0 | 1664 | 2 | 6 | 0 | 0 | f | t | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_authid_oid_index | 11 | 0 | 0 | 10 | 403 | 0 | 1664 | 2 | 6 | 0 | 0 | f | t | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_auth_members_role_member_index | 11 | 0 | 0 | 10 | 403 | 0 | 1664 | 2 | 3 | 0 | 0 | f | t | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_auth_members_member_role_index | 11 | 0 | 0 | 10 | 403 | 0 | 1664 | 2 | 3 | 0 | 0 | f | t | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_cast_oid_index | 11 | 0 | 0 | 10 | 403 | 2660 | 0 | 2 | 219 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_cast_source_target_index | 11 | 0 | 0 | 10 | 403 | 2661 | 0 | 2 | 219 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_class_oid_index | 11 | 0 | 0 | 10 | 403 | 0 | 0 | 4 | 341 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_class_relname_nsp_index | 11 | 0 | 0 | 10 | 403 | 0 | 0 | 6 | 341 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_class_tblspc_relfilenode_index | 11 | 0 | 0 | 10 | 403 | 0 | 0 | 5 | 341 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_collation_name_enc_nsp_index | 11 | 0 | 0 | 10 | 403 | 3164 | 0 | 9 | 982 | 0 | 0 | f | f | p | i | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_collation_oid_index | 11 | 0 | 0 | 10 | 403 | 3085 | 0 | 5 | 982 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_constraint_conname_nsp_index | 11 | 0 | 0 | 10 | 403 | 2664 | 0 | 2 | 2 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_constraint_conrelid_index | 11 | 0 | 0 | 10 | 403 | 2665 | 0 | 2 | 2 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_constraint_contypid_index | 11 | 0 | 0 | 10 | 403 | 2666 | 0 | 2 | 2 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_constraint_oid_index | 11 | 0 | 0 | 10 | 403 | 2667 | 0 | 2 | 2 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_conversion_default_index | 11 | 0 | 0 | 10 | 403 | 2668 | 0 | 2 | 132 | 0 | 0 | f | f | p | i | 4 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_conversion_name_nsp_index | 11 | 0 | 0 | 10 | 403 | 2669 | 0 | 2 | 132 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_conversion_oid_index | 11 | 0 | 0 | 10 | 403 | 2670 | 0 | 2 | 132 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_database_datname_index | 11 | 0 | 0 | 10 | 403 | 0 | 1664 | 2 | 2 | 0 | 0 | f | t | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_database_oid_index | 11 | 0 | 0 | 10 | 403 | 0 | 1664 | 2 | 2 | 0 | 0 | f | t | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_depend_depender_index | 11 | 0 | 0 | 10 | 403 | 2673 | 0 | 41 | 7444 | 0 | 0 | f | f | p | i | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_depend_reference_index | 11 | 0 | 0 | 10 | 403 | 2674 | 0 | 46 | 7444 | 0 | 0 | f | f | p | i | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_description_o_c_o_index | 11 | 0 | 0 | 10 | 403 | 2675 | 0 | 22 | 3986 | 0 | 0 | f | f | p | i | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_shdescription_o_c_index | 11 | 0 | 0 | 10 | 403 | 0 | 1664 | 2 | 1 | 0 | 0 | f | t | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_enum_oid_index | 11 | 0 | 0 | 10 | 403 | 3502 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_enum_typid_label_index | 11 | 0 | 0 | 10 | 403 | 3503 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_enum_typid_sortorder_index | 11 | 0 | 0 | 10 | 403 | 3534 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_index_indrelid_index | 11 | 0 | 0 | 10 | 403 | 2678 | 0 | 2 | 134 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_index_indexrelid_index | 11 | 0 | 0 | 10 | 403 | 2679 | 0 | 2 | 134 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_inherits_relid_seqno_index | 11 | 0 | 0 | 10 | 403 | 2680 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_inherits_parent_index | 11 | 0 | 0 | 10 | 403 | 2187 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_init_privs_o_c_o_index | 11 | 0 | 0 | 10 | 403 | 3395 | 0 | 2 | 152 | 0 | 0 | f | f | p | i | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_language_name_index | 11 | 0 | 0 | 10 | 403 | 2681 | 0 | 2 | 4 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_language_oid_index | 11 | 0 | 0 | 10 | 403 | 2682 | 0 | 2 | 4 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_largeobject_loid_pn_index | 11 | 0 | 0 | 10 | 403 | 2683 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_largeobject_metadata_oid_index | 11 | 0 | 0 | 10 | 403 | 2996 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_statistic_ext_oid_index | 11 | 0 | 0 | 10 | 403 | 3380 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_statistic_ext_name_index | 11 | 0 | 0 | 10 | 403 | 3997 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_statistic_ext_relid_index | 11 | 0 | 0 | 10 | 403 | 3379 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_namespace_nspname_index | 11 | 0 | 0 | 10 | 403 | 2684 | 0 | 2 | 6 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_namespace_oid_index | 11 | 0 | 0 | 10 | 403 | 2685 | 0 | 2 | 6 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_opclass_am_name_nsp_index | 11 | 0 | 0 | 10 | 403 | 2686 | 0 | 2 | 134 | 0 | 0 | f | f | p | i | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_opclass_oid_index | 11 | 0 | 0 | 10 | 403 | 2687 | 0 | 2 | 134 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_operator_oid_index | 11 | 0 | 0 | 10 | 403 | 2688 | 0 | 5 | 793 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_operator_oprname_l_r_n_index | 11 | 0 | 0 | 10 | 403 | 2689 | 0 | 6 | 793 | 0 | 0 | f | f | p | i | 4 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_opfamily_am_name_nsp_index | 11 | 0 | 0 | 10 | 403 | 2754 | 0 | 2 | 116 | 0 | 0 | f | f | p | i | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_opfamily_oid_index | 11 | 0 | 0 | 10 | 403 | 2755 | 0 | 2 | 116 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_pltemplate_name_index | 11 | 0 | 0 | 10 | 403 | 0 | 1664 | 2 | 8 | 0 | 0 | f | t | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_proc_oid_index | 11 | 0 | 0 | 10 | 403 | 0 | 0 | 10 | 2949 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_proc_proname_args_nsp_index | 11 | 0 | 0 | 10 | 403 | 0 | 0 | 33 | 2949 | 0 | 0 | f | f | p | i | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_rewrite_oid_index | 11 | 0 | 0 | 10 | 403 | 2692 | 0 | 2 | 121 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_rewrite_rel_rulename_index | 11 | 0 | 0 | 10 | 403 | 2693 | 0 | 2 | 121 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_sequence_seqrelid_index | 11 | 0 | 0 | 10 | 403 | 5002 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_shdepend_depender_index | 11 | 0 | 0 | 10 | 403 | 0 | 1664 | 2 | 6 | 0 | 0 | f | t | p | i | 4 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_shdepend_reference_index | 11 | 0 | 0 | 10 | 403 | 0 | 1664 | 2 | 6 | 0 | 0 | f | t | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_statistic_relid_att_inh_index | 11 | 0 | 0 | 10 | 403 | 2696 | 0 | 2 | 395 | 0 | 0 | f | f | p | i | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_tablespace_oid_index | 11 | 0 | 0 | 10 | 403 | 0 | 1664 | 2 | 2 | 0 | 0 | f | t | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_tablespace_spcname_index | 11 | 0 | 0 | 10 | 403 | 0 | 1664 | 2 | 2 | 0 | 0 | f | t | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_transform_oid_index | 11 | 0 | 0 | 10 | 403 | 3574 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_transform_type_lang_index | 11 | 0 | 0 | 10 | 403 | 3575 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_trigger_tgconstraint_index | 11 | 0 | 0 | 10 | 403 | 2699 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_trigger_tgrelid_tgname_index | 11 | 0 | 0 | 10 | 403 | 2701 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_trigger_oid_index | 11 | 0 | 0 | 10 | 403 | 2702 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_event_trigger_evtname_index | 11 | 0 | 0 | 10 | 403 | 3467 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_event_trigger_oid_index | 11 | 0 | 0 | 10 | 403 | 3468 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_ts_config_cfgname_index | 11 | 0 | 0 | 10 | 403 | 3608 | 0 | 2 | 16 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_ts_config_oid_index | 11 | 0 | 0 | 10 | 403 | 3712 | 0 | 2 | 16 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_ts_config_map_index | 11 | 0 | 0 | 10 | 403 | 3609 | 0 | 4 | 304 | 0 | 0 | f | f | p | i | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_ts_dict_dictname_index | 11 | 0 | 0 | 10 | 403 | 3604 | 0 | 2 | 16 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_ts_dict_oid_index | 11 | 0 | 0 | 10 | 403 | 3605 | 0 | 2 | 16 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_ts_parser_prsname_index | 11 | 0 | 0 | 10 | 403 | 3606 | 0 | 2 | 1 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_ts_parser_oid_index | 11 | 0 | 0 | 10 | 403 | 3607 | 0 | 2 | 1 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_ts_template_tmplname_index | 11 | 0 | 0 | 10 | 403 | 3766 | 0 | 2 | 5 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_ts_template_oid_index | 11 | 0 | 0 | 10 | 403 | 3767 | 0 | 2 | 5 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_type_oid_index | 11 | 0 | 0 | 10 | 403 | 0 | 0 | 2 | 382 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_type_typname_nsp_index | 11 | 0 | 0 | 10 | 403 | 0 | 0 | 5 | 382 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_foreign_data_wrapper_oid_index | 11 | 0 | 0 | 10 | 403 | 112 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_foreign_data_wrapper_name_index | 11 | 0 | 0 | 10 | 403 | 548 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_foreign_server_oid_index | 11 | 0 | 0 | 10 | 403 | 113 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_foreign_server_name_index | 11 | 0 | 0 | 10 | 403 | 549 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_user_mapping_oid_index | 11 | 0 | 0 | 10 | 403 | 174 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_user_mapping_user_server_index | 11 | 0 | 0 | 10 | 403 | 175 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_foreign_table_relid_index | 11 | 0 | 0 | 10 | 403 | 3119 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_default_acl_role_nsp_obj_index | 11 | 0 | 0 | 10 | 403 | 827 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_default_acl_oid_index | 11 | 0 | 0 | 10 | 403 | 828 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_db_role_setting_databaseid_rol_index | 11 | 0 | 0 | 10 | 403 | 0 | 1664 | 1 | 0 | 0 | 0 | f | t | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_seclabel_object_index | 11 | 0 | 0 | 10 | 403 | 3597 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 4 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_shseclabel_object_index | 11 | 0 | 0 | 10 | 403 | 0 | 1664 | 1 | 0 | 0 | 0 | f | t | p | i | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_extension_oid_index | 11 | 0 | 0 | 10 | 403 | 3080 | 0 | 2 | 1 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_extension_name_index | 11 | 0 | 0 | 10 | 403 | 3081 | 0 | 2 | 1 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_range_rngtypid_index | 11 | 0 | 0 | 10 | 403 | 3542 | 0 | 2 | 6 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_policy_oid_index | 11 | 0 | 0 | 10 | 403 | 3257 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_policy_polrelid_polname_index | 11 | 0 | 0 | 10 | 403 | 3258 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_replication_origin_roiident_index | 11 | 0 | 0 | 10 | 403 | 0 | 1664 | 1 | 0 | 0 | 0 | f | t | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_replication_origin_roname_index | 11 | 0 | 0 | 10 | 403 | 0 | 1664 | 1 | 0 | 0 | 0 | f | t | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_partitioned_table_partrelid_index | 11 | 0 | 0 | 10 | 403 | 3351 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_publication_oid_index | 11 | 0 | 0 | 10 | 403 | 6110 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_publication_pubname_index | 11 | 0 | 0 | 10 | 403 | 6111 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_publication_rel_oid_index | 11 | 0 | 0 | 10 | 403 | 6112 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_publication_rel_prrelid_prpubid_index | 11 | 0 | 0 | 10 | 403 | 6113 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_subscription_oid_index | 11 | 0 | 0 | 10 | 403 | 0 | 1664 | 1 | 0 | 0 | 0 | f | t | p | i | 1 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_subscription_subname_index | 11 | 0 | 0 | 10 | 403 | 0 | 1664 | 1 | 0 | 0 | 0 | f | t | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_subscription_rel_srrelid_srsubid_index | 11 | 0 | 0 | 10 | 403 | 6117 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_authid | 11 | 2842 | 0 | 10 | 0 | 0 | 1664 | 1 | 6 | 1 | 0 | t | t | p | r | 11 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres} | | | | pg_shadow | 11 | 11580 | 0 | 10 | 0 | 11579 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 9 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres} | | | | pg_settings | 11 | 11649 | 0 | 10 | 0 | 11648 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 17 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=rw/postgres} | | | | pg_hba_file_rules | 11 | 11657 | 0 | 10 | 0 | 11656 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 9 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres} | | | | pg_file_settings | 11 | 11654 | 0 | 10 | 0 | 11653 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 7 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres} | | | | pg_config | 11 | 11666 | 0 | 10 | 0 | 11665 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 2 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres} | | | | pg_user_mapping | 11 | 11548 | 0 | 10 | 0 | 1418 | 0 | 0 | 0 | 0 | 0 | t | f | p | r | 3 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres} | | | | pg_replication_origin_status | 11 | 11780 | 0 | 10 | 0 | 11779 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 4 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres} | | | | pg_subscription | 11 | 6101 | 0 | 10 | 0 | 0 | 1664 | 0 | 0 | 0 | 0 | t | t | p | r | 8 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres} | | | | pg_stat_user_tables | 11 | 11684 | 0 | 10 | 0 | 11683 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 22 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_stat_xact_user_tables | 11 | 11688 | 0 | 10 | 0 | 11687 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 11 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_attribute | 11 | 75 | 0 | 10 | 0 | 0 | 0 | 48 | 2582 | 48 | 0 | t | f | p | r | 22 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_proc | 11 | 81 | 0 | 10 | 0 | 0 | 0 | 76 | 2949 | 76 | 2836 | t | f | p | r | 29 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_class | 11 | 83 | 0 | 10 | 0 | 0 | 0 | 11 | 341 | 11 | 0 | t | f | p | r | 33 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_attrdef | 11 | 10000 | 0 | 10 | 0 | 2604 | 0 | 0 | 0 | 0 | 2830 | t | f | p | r | 4 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_constraint | 11 | 10001 | 0 | 10 | 0 | 2606 | 0 | 1 | 2 | 1 | 2832 | t | f | p | r | 24 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_statio_all_tables | 11 | 11691 | 0 | 10 | 0 | 11690 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 11 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_statio_sys_tables | 11 | 11695 | 0 | 10 | 0 | 11694 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 11 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_statio_user_tables | 11 | 11698 | 0 | 10 | 0 | 11697 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 11 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_stat_all_indexes | 11 | 11701 | 0 | 10 | 0 | 11700 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 8 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_inherits | 11 | 10002 | 0 | 10 | 0 | 2611 | 0 | 0 | 0 | 0 | 0 | t | f | p | r | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_index | 11 | 10003 | 0 | 10 | 0 | 2610 | 0 | 3 | 134 | 3 | 0 | t | f | p | r | 19 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_operator | 11 | 10004 | 0 | 10 | 0 | 2617 | 0 | 15 | 793 | 15 | 0 | t | f | p | r | 14 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_opfamily | 11 | 10005 | 0 | 10 | 0 | 2753 | 0 | 2 | 116 | 2 | 0 | t | f | p | r | 4 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_opclass | 11 | 10006 | 0 | 10 | 0 | 2616 | 0 | 3 | 134 | 3 | 0 | t | f | p | r | 8 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_am | 11 | 10131 | 0 | 10 | 0 | 2601 | 0 | 1 | 6 | 1 | 0 | t | f | p | r | 3 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_amop | 11 | 10132 | 0 | 10 | 0 | 2602 | 0 | 7 | 725 | 7 | 0 | t | f | p | r | 8 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_amproc | 11 | 10858 | 0 | 10 | 0 | 2603 | 0 | 4 | 442 | 4 | 0 | t | f | p | r | 5 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_language | 11 | 11301 | 0 | 10 | 0 | 2612 | 0 | 1 | 4 | 1 | 0 | t | f | p | r | 8 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_largeobject_metadata | 11 | 11302 | 0 | 10 | 0 | 2995 | 0 | 0 | 0 | 0 | 0 | t | f | p | r | 2 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_aggregate | 11 | 11304 | 0 | 10 | 0 | 2600 | 0 | 2 | 142 | 2 | 0 | t | f | p | r | 22 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_statistic_ext | 11 | 11305 | 0 | 10 | 0 | 3381 | 0 | 0 | 0 | 0 | 3439 | t | f | p | r | 8 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_rewrite | 11 | 11307 | 0 | 10 | 0 | 2618 | 0 | 12 | 121 | 12 | 2838 | t | f | p | r | 7 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_trigger | 11 | 11308 | 0 | 10 | 0 | 2620 | 0 | 0 | 0 | 0 | 2336 | t | f | p | r | 17 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_event_trigger | 11 | 11309 | 0 | 10 | 0 | 3466 | 0 | 0 | 0 | 0 | 0 | t | f | p | r | 6 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_description | 11 | 11310 | 0 | 10 | 0 | 2609 | 0 | 35 | 3986 | 35 | 2834 | t | f | p | r | 4 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_cast | 11 | 11311 | 0 | 10 | 0 | 2605 | 0 | 2 | 219 | 2 | 0 | t | f | p | r | 5 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_enum | 11 | 11531 | 0 | 10 | 0 | 3501 | 0 | 0 | 0 | 0 | 0 | t | f | p | r | 3 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_namespace | 11 | 11532 | 0 | 10 | 0 | 2615 | 0 | 1 | 6 | 1 | 0 | t | f | p | r | 3 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_conversion | 11 | 11533 | 0 | 10 | 0 | 2607 | 0 | 3 | 132 | 3 | 0 | t | f | p | r | 7 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_depend | 11 | 11534 | 0 | 10 | 0 | 2608 | 0 | 55 | 7444 | 55 | 0 | t | f | p | r | 7 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_database | 11 | 1248 | 0 | 10 | 0 | 0 | 1664 | 1 | 2 | 1 | 0 | t | t | p | r | 13 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_db_role_setting | 11 | 11535 | 0 | 10 | 0 | 0 | 1664 | 0 | 0 | 0 | 2966 | t | t | p | r | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_tablespace | 11 | 11536 | 0 | 10 | 0 | 0 | 1664 | 1 | 2 | 1 | 0 | t | t | p | r | 4 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_pltemplate | 11 | 11537 | 0 | 10 | 0 | 0 | 1664 | 1 | 8 | 1 | 0 | t | t | p | r | 8 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_auth_members | 11 | 2843 | 0 | 10 | 0 | 0 | 1664 | 1 | 3 | 1 | 0 | t | t | p | r | 4 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_shdepend | 11 | 11538 | 0 | 10 | 0 | 0 | 1664 | 1 | 6 | 1 | 0 | t | t | p | r | 7 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_shdescription | 11 | 11539 | 0 | 10 | 0 | 0 | 1664 | 1 | 1 | 1 | 2846 | t | t | p | r | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_ts_config | 11 | 11540 | 0 | 10 | 0 | 3602 | 0 | 1 | 16 | 1 | 0 | t | f | p | r | 4 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_ts_config_map | 11 | 11541 | 0 | 10 | 0 | 3603 | 0 | 2 | 304 | 2 | 0 | t | f | p | r | 4 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_ts_dict | 11 | 11542 | 0 | 10 | 0 | 3600 | 0 | 1 | 16 | 1 | 0 | t | f | p | r | 5 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_ts_parser | 11 | 11543 | 0 | 10 | 0 | 3601 | 0 | 1 | 1 | 1 | 0 | t | f | p | r | 7 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_ts_template | 11 | 11544 | 0 | 10 | 0 | 3764 | 0 | 1 | 5 | 1 | 0 | t | f | p | r | 4 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_extension | 11 | 11545 | 0 | 10 | 0 | 3079 | 0 | 1 | 1 | 1 | 0 | t | f | p | r | 7 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_foreign_data_wrapper | 11 | 11546 | 0 | 10 | 0 | 2328 | 0 | 0 | 0 | 0 | 0 | t | f | p | r | 6 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_foreign_server | 11 | 11547 | 0 | 10 | 0 | 1417 | 0 | 0 | 0 | 0 | 0 | t | f | p | r | 7 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_foreign_table | 11 | 11549 | 0 | 10 | 0 | 3118 | 0 | 0 | 0 | 0 | 0 | t | f | p | r | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_replication_origin | 11 | 11551 | 0 | 10 | 0 | 0 | 1664 | 0 | 0 | 0 | 0 | t | t | p | r | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_default_acl | 11 | 11552 | 0 | 10 | 0 | 826 | 0 | 0 | 0 | 0 | 0 | t | f | p | r | 4 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_init_privs | 11 | 11553 | 0 | 10 | 0 | 3394 | 0 | 2 | 152 | 2 | 0 | t | f | p | r | 5 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_seclabel | 11 | 11554 | 0 | 10 | 0 | 3596 | 0 | 0 | 0 | 0 | 3598 | t | f | p | r | 5 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_shseclabel | 11 | 4066 | 0 | 10 | 0 | 0 | 1664 | 0 | 0 | 0 | 4060 | t | t | p | r | 4 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_collation | 11 | 11555 | 0 | 10 | 0 | 3456 | 0 | 30 | 982 | 30 | 0 | t | f | p | r | 8 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_partitioned_table | 11 | 11556 | 0 | 10 | 0 | 3350 | 0 | 0 | 0 | 0 | 0 | t | f | p | r | 8 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_range | 11 | 11557 | 0 | 10 | 0 | 3541 | 0 | 1 | 6 | 1 | 0 | t | f | p | r | 6 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_transform | 11 | 11558 | 0 | 10 | 0 | 3576 | 0 | 0 | 0 | 0 | 0 | t | f | p | r | 4 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_sequence | 11 | 11559 | 0 | 10 | 0 | 2224 | 0 | 0 | 0 | 0 | 0 | t | f | p | r | 8 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_publication | 11 | 11560 | 0 | 10 | 0 | 6104 | 0 | 0 | 0 | 0 | 0 | t | f | p | r | 6 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_publication_rel | 11 | 11561 | 0 | 10 | 0 | 6106 | 0 | 0 | 0 | 0 | 0 | t | f | p | r | 2 | 0 | t | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_subscription_rel | 11 | 11562 | 0 | 10 | 0 | 6102 | 0 | 0 | 0 | 0 | 0 | t | f | p | r | 4 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_roles | 11 | 11576 | 0 | 10 | 0 | 11575 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 13 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_locks | 11 | 11626 | 0 | 10 | 0 | 11625 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 15 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_group | 11 | 11584 | 0 | 10 | 0 | 11583 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 3 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_user | 11 | 11587 | 0 | 10 | 0 | 11586 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 9 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_policies | 11 | 11590 | 0 | 10 | 0 | 11589 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 8 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_rules | 11 | 11594 | 0 | 10 | 0 | 11593 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 4 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_views | 11 | 11598 | 0 | 10 | 0 | 11597 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 4 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_tables | 11 | 11602 | 0 | 10 | 0 | 11601 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 8 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_matviews | 11 | 11606 | 0 | 10 | 0 | 11605 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 7 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_indexes | 11 | 11610 | 0 | 10 | 0 | 11609 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 5 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_sequences | 11 | 11614 | 0 | 10 | 0 | 11613 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 11 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_stats | 11 | 11618 | 0 | 10 | 0 | 11617 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 14 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | {security_barrier=true} | | | pg_publication_tables | 11 | 11622 | 0 | 10 | 0 | 11621 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 3 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_cursors | 11 | 11629 | 0 | 10 | 0 | 11628 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 6 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_available_extensions | 11 | 11632 | 0 | 10 | 0 | 11631 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 4 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_available_extension_versions | 11 | 11635 | 0 | 10 | 0 | 11634 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 8 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_prepared_xacts | 11 | 11638 | 0 | 10 | 0 | 11637 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 5 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_prepared_statements | 11 | 11642 | 0 | 10 | 0 | 11641 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 5 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_seclabels | 11 | 11645 | 0 | 10 | 0 | 11644 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 8 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_timezone_names | 11 | 11663 | 0 | 10 | 0 | 11662 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 4 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_timezone_abbrevs | 11 | 11660 | 0 | 10 | 0 | 11659 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 3 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_stat_all_tables | 11 | 11669 | 0 | 10 | 0 | 11668 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 22 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_stat_xact_all_tables | 11 | 11673 | 0 | 10 | 0 | 11672 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 11 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_stat_sys_tables | 11 | 11677 | 0 | 10 | 0 | 11676 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 22 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_stat_xact_sys_tables | 11 | 11681 | 0 | 10 | 0 | 11680 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 11 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_stat_sys_indexes | 11 | 11705 | 0 | 10 | 0 | 11704 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 8 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_stat_user_indexes | 11 | 11708 | 0 | 10 | 0 | 11707 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 8 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_statio_all_indexes | 11 | 11711 | 0 | 10 | 0 | 11710 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 7 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_statio_sys_indexes | 11 | 11715 | 0 | 10 | 0 | 11714 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 7 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_statio_user_indexes | 11 | 11718 | 0 | 10 | 0 | 11717 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 7 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_statio_all_sequences | 11 | 11721 | 0 | 10 | 0 | 11720 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 5 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_statio_sys_sequences | 11 | 11725 | 0 | 10 | 0 | 11724 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 5 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_statio_user_sequences | 11 | 11728 | 0 | 10 | 0 | 11727 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 5 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_stat_activity | 11 | 11731 | 0 | 10 | 0 | 11730 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 20 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_stat_replication | 11 | 11735 | 0 | 10 | 0 | 11734 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 19 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_stat_wal_receiver | 11 | 11739 | 0 | 10 | 0 | 11738 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 12 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_stat_subscription | 11 | 11742 | 0 | 10 | 0 | 11741 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 9 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_stat_ssl | 11 | 11745 | 0 | 10 | 0 | 11744 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 7 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_replication_slots | 11 | 11748 | 0 | 10 | 0 | 11747 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 12 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_stat_database | 11 | 11752 | 0 | 10 | 0 | 11751 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 19 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_stat_database_conflicts | 11 | 11755 | 0 | 10 | 0 | 11754 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 7 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_stat_user_functions | 11 | 11758 | 0 | 10 | 0 | 11757 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 6 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_stat_xact_user_functions | 11 | 11762 | 0 | 10 | 0 | 11761 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 6 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_stat_archiver | 11 | 11766 | 0 | 10 | 0 | 11765 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 7 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_stat_bgwriter | 11 | 11769 | 0 | 10 | 0 | 11768 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 11 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_stat_progress_vacuum | 11 | 11772 | 0 | 10 | 0 | 11771 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 11 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_user_mappings | 11 | 11776 | 0 | 10 | 0 | 11775 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 6 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_largeobject | 11 | 11303 | 0 | 10 | 0 | 2613 | 0 | 0 | 0 | 0 | 0 | t | f | p | r | 3 | 0 | f | f | f | f | f | f | f | t | n | f | 550 | 1 | {postgres=arwdDxt/postgres} | | | | information_schema_catalog_name | 13028 | 13049 | 0 | 10 | 0 | 13048 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 1 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | attributes | 13028 | 13064 | 0 | 10 | 0 | 13063 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 31 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | applicable_roles | 13028 | 13057 | 0 | 10 | 0 | 13056 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 3 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | administrable_role_authorizations | 13028 | 13061 | 0 | 10 | 0 | 13060 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 3 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | check_constraint_routine_usage | 13028 | 13072 | 0 | 10 | 0 | 13071 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 6 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | character_sets | 13028 | 13068 | 0 | 10 | 0 | 13067 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 8 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | check_constraints | 13028 | 13076 | 0 | 10 | 0 | 13075 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 4 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | collations | 13028 | 13080 | 0 | 10 | 0 | 13079 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 4 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | collation_character_set_applicability | 13028 | 13084 | 0 | 10 | 0 | 13083 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 6 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | column_domain_usage | 13028 | 13088 | 0 | 10 | 0 | 13087 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 7 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | column_privileges | 13028 | 13092 | 0 | 10 | 0 | 13091 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 8 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | routine_privileges | 13028 | 13142 | 0 | 10 | 0 | 13141 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 10 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | column_udt_usage | 13028 | 13096 | 0 | 10 | 0 | 13095 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 7 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | columns | 13028 | 13100 | 0 | 10 | 0 | 13099 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 44 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_toast_13169 | 99 | 13172 | 0 | 10 | 0 | 13171 | 0 | 0 | 0 | 0 | 0 | t | f | p | t | 3 | 0 | f | t | f | f | f | f | f | t | n | f | 550 | 1 | | | | | constraint_column_usage | 13028 | 13104 | 0 | 10 | 0 | 13103 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 7 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | role_routine_grants | 13028 | 13146 | 0 | 10 | 0 | 13145 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 10 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | constraint_table_usage | 13028 | 13108 | 0 | 10 | 0 | 13107 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 6 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | domain_constraints | 13028 | 13112 | 0 | 10 | 0 | 13111 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 8 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_toast_13169_index | 99 | 0 | 0 | 10 | 403 | 13173 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | domain_udt_usage | 13028 | 13116 | 0 | 10 | 0 | 13115 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 6 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | routines | 13028 | 13149 | 0 | 10 | 0 | 13148 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 82 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | domains | 13028 | 13120 | 0 | 10 | 0 | 13119 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 27 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | enabled_roles | 13028 | 13124 | 0 | 10 | 0 | 13123 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 1 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | sql_parts | 13028 | 13180 | 0 | 10 | 0 | 13179 | 0 | 1 | 9 | 1 | 13181 | f | f | p | r | 5 | 0 | f | f | f | f | f | f | f | t | d | f | 550 | 1 | | | | | key_column_usage | 13028 | 13127 | 0 | 10 | 0 | 13126 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 9 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | schemata | 13028 | 13153 | 0 | 10 | 0 | 13152 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 7 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | parameters | 13028 | 13131 | 0 | 10 | 0 | 13130 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 32 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | referential_constraints | 13028 | 13135 | 0 | 10 | 0 | 13134 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 9 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | sql_languages | 13028 | 13170 | 0 | 10 | 0 | 13169 | 0 | 1 | 4 | 1 | 13171 | f | f | p | r | 7 | 0 | f | f | f | f | f | f | f | t | d | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | role_column_grants | 13028 | 13139 | 0 | 10 | 0 | 13138 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 8 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | sequences | 13028 | 13156 | 0 | 10 | 0 | 13155 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 12 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_toast_13159 | 99 | 13162 | 0 | 10 | 0 | 13161 | 0 | 0 | 0 | 0 | 0 | t | f | p | t | 3 | 0 | f | t | f | f | f | f | f | t | n | f | 550 | 1 | | | | | pg_toast_13159_index | 99 | 0 | 0 | 10 | 403 | 13163 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_toast_13174 | 99 | 13177 | 0 | 10 | 0 | 13176 | 0 | 0 | 0 | 0 | 0 | t | f | p | t | 3 | 0 | f | t | f | f | f | f | f | t | n | f | 550 | 1 | | | | | sql_features | 13028 | 13160 | 0 | 10 | 0 | 13159 | 0 | 7 | 671 | 7 | 13161 | f | f | p | r | 7 | 0 | f | f | f | f | f | f | f | t | d | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_toast_13164 | 99 | 13167 | 0 | 10 | 0 | 13166 | 0 | 0 | 0 | 0 | 0 | t | f | p | t | 3 | 0 | f | t | f | f | f | f | f | t | n | f | 550 | 1 | | | | | pg_toast_13164_index | 99 | 0 | 0 | 10 | 403 | 13168 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_toast_13174_index | 99 | 0 | 0 | 10 | 403 | 13178 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | sql_implementation_info | 13028 | 13165 | 0 | 10 | 0 | 13164 | 0 | 1 | 12 | 1 | 13166 | f | f | p | r | 5 | 0 | f | f | f | f | f | f | f | t | d | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | sql_packages | 13028 | 13175 | 0 | 10 | 0 | 13174 | 0 | 1 | 10 | 1 | 13176 | f | f | p | r | 5 | 0 | f | f | f | f | f | f | f | t | d | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_toast_13179 | 99 | 13182 | 0 | 10 | 0 | 13181 | 0 | 0 | 0 | 0 | 0 | t | f | p | t | 3 | 0 | f | t | f | f | f | f | f | t | n | f | 550 | 1 | | | | | pg_toast_13179_index | 99 | 0 | 0 | 10 | 403 | 13183 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_toast_13184 | 99 | 13187 | 0 | 10 | 0 | 13186 | 0 | 0 | 0 | 0 | 0 | t | f | p | t | 3 | 0 | f | t | f | f | f | f | f | t | n | f | 550 | 1 | | | | | pg_toast_13184_index | 99 | 0 | 0 | 10 | 403 | 13188 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | pg_toast_13189 | 99 | 13192 | 0 | 10 | 0 | 13191 | 0 | 0 | 0 | 0 | 0 | t | f | p | t | 3 | 0 | f | t | f | f | f | f | f | t | n | f | 550 | 1 | | | | | sql_sizing | 13028 | 13185 | 0 | 10 | 0 | 13184 | 0 | 1 | 23 | 1 | 13186 | f | f | p | r | 4 | 0 | f | f | f | f | f | f | f | t | d | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | pg_toast_13189_index | 99 | 0 | 0 | 10 | 403 | 13193 | 0 | 1 | 0 | 0 | 0 | f | f | p | i | 2 | 0 | f | f | f | f | f | f | f | t | n | f | 0 | 0 | | | | | sql_sizing_profiles | 13028 | 13190 | 0 | 10 | 0 | 13189 | 0 | 0 | 0 | 0 | 13191 | f | f | p | r | 5 | 0 | f | f | f | f | f | f | f | t | d | f | 550 | 1 | {postgres=arwdDxt/postgres,=r/postgres} | | | | view_routine_usage | 13028 | 13244 | 0 | 10 | 0 | 13243 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 6 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | table_constraints | 13028 | 13195 | 0 | 10 | 0 | 13194 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 9 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | table_privileges | 13028 | 13199 | 0 | 10 | 0 | 13198 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 8 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | foreign_table_options | 13028 | 13294 | 0 | 10 | 0 | 13293 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 5 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | role_table_grants | 13028 | 13203 | 0 | 10 | 0 | 13202 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 8 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | view_table_usage | 13028 | 13248 | 0 | 10 | 0 | 13247 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 6 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | tables | 13028 | 13206 | 0 | 10 | 0 | 13205 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 12 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | transforms | 13028 | 13210 | 0 | 10 | 0 | 13209 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 8 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | | | | | triggered_update_columns | 13028 | 13214 | 0 | 10 | 0 | 13213 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 7 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | foreign_data_wrappers | 13028 | 13277 | 0 | 10 | 0 | 13276 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 5 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | triggers | 13028 | 13218 | 0 | 10 | 0 | 13217 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 17 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | views | 13028 | 13252 | 0 | 10 | 0 | 13251 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 10 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | udt_privileges | 13028 | 13222 | 0 | 10 | 0 | 13221 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 7 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | role_udt_grants | 13028 | 13226 | 0 | 10 | 0 | 13225 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 7 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | usage_privileges | 13028 | 13229 | 0 | 10 | 0 | 13228 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 8 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | data_type_privileges | 13028 | 13256 | 0 | 10 | 0 | 13255 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 5 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | role_usage_grants | 13028 | 13233 | 0 | 10 | 0 | 13232 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 8 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | user_defined_types | 13028 | 13236 | 0 | 10 | 0 | 13235 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 29 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | _pg_foreign_servers | 13028 | 13280 | 0 | 10 | 0 | 13279 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 9 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | | | | | view_column_usage | 13028 | 13240 | 0 | 10 | 0 | 13239 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 7 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | element_types | 13028 | 13260 | 0 | 10 | 0 | 13259 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 29 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | _pg_foreign_table_columns | 13028 | 13264 | 0 | 10 | 0 | 13263 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 4 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | | | | | column_options | 13028 | 13268 | 0 | 10 | 0 | 13267 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 6 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | _pg_foreign_data_wrappers | 13028 | 13271 | 0 | 10 | 0 | 13270 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 7 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | | | | | foreign_server_options | 13028 | 13284 | 0 | 10 | 0 | 13283 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 4 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | foreign_data_wrapper_options | 13028 | 13274 | 0 | 10 | 0 | 13273 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 4 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | user_mapping_options | 13028 | 13304 | 0 | 10 | 0 | 13303 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 5 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | foreign_servers | 13028 | 13287 | 0 | 10 | 0 | 13286 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 7 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | _pg_foreign_tables | 13028 | 13290 | 0 | 10 | 0 | 13289 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 7 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | | | | | foreign_tables | 13028 | 13297 | 0 | 10 | 0 | 13296 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 5 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | | _pg_user_mappings | 13028 | 13300 | 0 | 10 | 0 | 13299 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 7 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | | | | | user_mappings | 13028 | 13308 | 0 | 10 | 0 | 13307 | 0 | 0 | 0 | 0 | 0 | f | f | p | v | 3 | 0 | f | f | t | f | f | f | f | t | n | f | 0 | 0 | {postgres=arwdDxt/postgres,=r/postgres} | | | +-------------------------------------------+--------------+---------+-----------+----------+-------+-------------+---------------+----------+-----------+---------------+---------------+-------------+-------------+----------------+---------+----------+-----------+------------+------------+-------------+----------------+----------------+----------------+---------------------+----------------+--------------+----------------+--------------+------------+------------------------------------------+-------------------------+--------------+ (344 rows) pspg-2.6.6/tests/def.txt000066400000000000000000000072451360716715600151630ustar00rootroot00000000000000 Table "pg_catalog.pg_class" ┌─────────────────────┬──────────────┬───────────┬──────────┬─────────┐ │ Column │ Type │ Collation │ Nullable │ Default │ ╞═════════════════════╪══════════════╪═══════════╪══════════╪═════════╡ │ oid │ oid │ │ not null │ │ │ relname │ name │ │ not null │ │ │ relnamespace │ oid │ │ not null │ │ │ reltype │ oid │ │ not null │ │ │ reloftype │ oid │ │ not null │ │ │ relowner │ oid │ │ not null │ │ │ relam │ oid │ │ not null │ │ │ relfilenode │ oid │ │ not null │ │ │ reltablespace │ oid │ │ not null │ │ │ relpages │ integer │ │ not null │ │ │ reltuples │ real │ │ not null │ │ │ relallvisible │ integer │ │ not null │ │ │ reltoastrelid │ oid │ │ not null │ │ │ relhasindex │ boolean │ │ not null │ │ │ relisshared │ boolean │ │ not null │ │ │ relpersistence │ "char" │ │ not null │ │ │ relkind │ "char" │ │ not null │ │ │ relnatts │ smallint │ │ not null │ │ │ relchecks │ smallint │ │ not null │ │ │ relhasrules │ boolean │ │ not null │ │ │ relhastriggers │ boolean │ │ not null │ │ │ relhassubclass │ boolean │ │ not null │ │ │ relrowsecurity │ boolean │ │ not null │ │ │ relforcerowsecurity │ boolean │ │ not null │ │ │ relispopulated │ boolean │ │ not null │ │ │ relreplident │ "char" │ │ not null │ │ │ relispartition │ boolean │ │ not null │ │ │ relrewrite │ oid │ │ not null │ │ │ relfrozenxid │ xid │ │ not null │ │ │ relminmxid │ xid │ │ not null │ │ │ relacl │ aclitem[] │ │ │ │ │ reloptions │ text[] │ C │ │ │ │ relpartbound │ pg_node_tree │ C │ │ │ └─────────────────────┴──────────────┴───────────┴──────────┴─────────┘ Indexes: "pg_class_oid_index" UNIQUE, btree (oid) "pg_class_relname_nsp_index" UNIQUE, btree (relname, relnamespace) "pg_class_tblspc_relfilenode_index" btree (reltablespace, relfilenode) pspg-2.6.6/tests/help.txt000066400000000000000000000137421360716715600153540ustar00rootroot00000000000000General \copyright show PostgreSQL usage and distribution terms \crosstabview [COLUMNS] execute query and display results in crosstab \errverbose show most recent error message at maximum verbosity \g [FILE] or ; execute query (and send results to file or |pipe) \gdesc describe result of query, without executing it \gexec execute query, then execute each value in its result \gset [PREFIX] execute query and store results in psql variables \gx [FILE] as \g, but forces expanded output mode \q quit psql \watch [SEC] execute query every SEC seconds Help \? [commands] show help on backslash commands \? options show help on psql command-line options \? variables show help on special variables \h [NAME] help on syntax of SQL commands, * for all commands Query Buffer \e [FILE] [LINE] edit the query buffer (or file) with external editor \ef [FUNCNAME [LINE]] edit function definition with external editor \ev [VIEWNAME [LINE]] edit view definition with external editor \p show the contents of the query buffer \r reset (clear) the query buffer \s [FILE] display history or save it to file \w FILE write query buffer to file Input/Output \copy ... perform SQL COPY with data stream to the client host \echo [STRING] write string to standard output \i FILE execute commands from file \ir FILE as \i, but relative to location of current script \o [FILE] send all query results to file or |pipe \qecho [STRING] write string to query output stream (see \o) Conditional \if EXPR begin conditional block \elif EXPR alternative within current conditional block \else final alternative within current conditional block \endif end conditional block Informational (options: S = show system objects, + = additional detail) \d[S+] list tables, views, and sequences \d[S+] NAME describe table, view, sequence, or index \da[S] [PATTERN] list aggregates \dA[+] [PATTERN] list access methods \db[+] [PATTERN] list tablespaces \dc[S+] [PATTERN] list conversions \dC[+] [PATTERN] list casts \dd[S] [PATTERN] show object descriptions not displayed elsewhere \dD[S+] [PATTERN] list domains \ddp [PATTERN] list default privileges \dE[S+] [PATTERN] list foreign tables \det[+] [PATTERN] list foreign tables \des[+] [PATTERN] list foreign servers \deu[+] [PATTERN] list user mappings \dew[+] [PATTERN] list foreign-data wrappers \df[anptw][S+] [PATRN] list [only agg/normal/procedures/trigger/window] functions \dF[+] [PATTERN] list text search configurations \dFd[+] [PATTERN] list text search dictionaries \dFp[+] [PATTERN] list text search parsers \dFt[+] [PATTERN] list text search templates \dg[S+] [PATTERN] list roles \di[S+] [PATTERN] list indexes \dl list large objects, same as \lo_list \dL[S+] [PATTERN] list procedural languages \dm[S+] [PATTERN] list materialized views \dn[S+] [PATTERN] list schemas \do[S] [PATTERN] list operators \dO[S+] [PATTERN] list collations \dp [PATTERN] list table, view, and sequence access privileges \drds [PATRN1 [PATRN2]] list per-database role settings \dRp[+] [PATTERN] list replication publications \dRs[+] [PATTERN] list replication subscriptions \ds[S+] [PATTERN] list sequences \dt[S+] [PATTERN] list tables \dT[S+] [PATTERN] list data types \du[S+] [PATTERN] list roles \dv[S+] [PATTERN] list views \dx[+] [PATTERN] list extensions \dy [PATTERN] list event triggers \l[+] [PATTERN] list databases \sf[+] FUNCNAME show a function's definition \sv[+] VIEWNAME show a view's definition \z [PATTERN] same as \dp Formatting \a toggle between unaligned and aligned output mode \C [STRING] set table title, or unset if none \f [STRING] show or set field separator for unaligned query output \H toggle HTML output mode (currently off) \pset [NAME [VALUE]] set table output option (border|columns|csv_fieldsep|expanded|fieldsep| fieldsep_zero|footer|format|linestyle|null| numericlocale|pager|pager_min_lines|recordsep| recordsep_zero|tableattr|title|tuples_only| unicode_border_linestyle|unicode_column_linestyle| unicode_header_linestyle) \t [on|off] show only rows (currently off) \T [STRING] set HTML tag attributes, or unset if none \x [on|off|auto] toggle expanded output (currently off) Connection \c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo} connect to new database (currently "postgres") \conninfo display information about current connection \encoding [ENCODING] show or set client encoding \password [USERNAME] securely change the password for a user Operating System \cd [DIR] change the current working directory \setenv NAME [VALUE] set or unset environment variable \timing [on|off] toggle timing of commands (currently off) \! [COMMAND] execute command in shell or start interactive shell Variables \prompt [TEXT] NAME prompt user to set internal variable \set [NAME [VALUE]] set internal variable, or list all if no parameters \unset NAME unset (delete) internal variable Large Objects \lo_export LOBOID FILE \lo_import FILE [COMMENT] \lo_list \lo_unlink LOBOID large object operations pspg-2.6.6/tests/multiline-a.txt000066400000000000000000000003001360716715600166260ustar00rootroot00000000000000+---+---+---+ | a | b | c | +---+---+---+ | 1 | a+| a+| | | b | b+| | | | c | | 3 | a+| a+| | | b | b+| | | | c | | 2 | a+| a+| | | b | b+| | | | c | +---+---+---+ (3 rows) pspg-2.6.6/tests/multiline-u.txt000066400000000000000000000005601360716715600166620ustar00rootroot00000000000000┌───┬───┬───┐ │ a │ b │ c │ ╞═══╪═══╪═══╡ │ 1 │ a↵│ a↵│ │ │ b │ b↵│ │ │ │ c │ │ 3 │ a↵│ a↵│ │ │ b │ b↵│ │ │ │ c │ │ 2 │ a↵│ a↵│ │ │ b │ b↵│ │ │ │ c │ └───┴───┴───┘ (3 rows) pspg-2.6.6/tests/mysql-ascii.txt000066400000000000000000000111431360716715600166500ustar00rootroot00000000000000+------+------------------+-----------------------------------------------------------------------------------------------------------------------+-------------+-------+--------+--------+------------------------------------------------------------------------------------------------------------------------------------------------+ | FID | title | description | category | price | length | rating | actors | +------+------------------+-----------------------------------------------------------------------------------------------------------------------+-------------+-------+--------+--------+------------------------------------------------------------------------------------------------------------------------------------------------+ | 1 | ACADEMY DINOSAUR | A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher in The Canadian Rockies | Documentary | 0.99 | 86 | PG | Penelope Guiness, Christian Gable, Lucille Tracy, Sandra Peck, Johnny Cage, Mena Temple, Warren Nolte, Oprah Kilmer, Rock Dukakis, Mary Keitel | | 2 | ACE GOLDFINGER | A Astounding Epistle of a Database Administrator And a Explorer who must Find a Car in Ancient China | Horror | 4.99 | 48 | G | Bob Fawcett, Minnie Zellweger, Sean Guiness, Chris Depp | | 3 | ADAPTATION HOLES | A Astounding Reflection of a Lumberjack And a Car who must Sink a Lumberjack in A Baloon Factory | Documentary | 2.99 | 50 | NC-17 | Nick Wahlberg, Bob Fawcett, Cameron Streep, Ray Johansson, Julianne Dench | | 4 | AFFAIR PREJUDICE | A Fanciful Documentary of a Frisbee And a Lumberjack who must Chase a Monkey in A Shark Tank | Horror | 2.99 | 117 | G | Jodie Degeneres, Scarlett Damon, Kenneth Pesci, Fay Winslet, Oprah Kilmer | | 5 | AFRICAN EGG | A Fast-Paced Documentary of a Pastry Chef And a Dentist who must Pursue a Forensic Psychologist in The Gulf of Mexico | Family | 2.99 | 130 | G | Gary Phoenix, Dustin Tautou, Matthew Leigh, Matthew Carrey, Thora Temple | | 6 | AGENT TRUMAN | A Intrepid Panorama of a Robot And a Boy who must Escape a Sumo Wrestler in Ancient China | Foreign | 2.99 | 169 | PG | Kirsten Paltrow, Sandra Kilmer, Jayne Neeson, Warren Nolte, Morgan Williams, Kenneth Hoffman, Reese West | | 7 | AIRPLANE SIERRA | A Touching Saga of a Hunter And a Butler who must Discover a Butler in A Jet Boat | Comedy | 4.99 | 62 | PG-13 | Jim Mostel, Richard Penn, Oprah Kilmer, Mena Hopper, Michael Bolger | | 8 | AIRPORT POLLOCK | A Epic Tale of a Moose And a Girl who must Confront a Monkey in Ancient India | Horror | 4.99 | 54 | R | Fay Kilmer, Gene Willis, Susan Davis, Lucille Dee | | 9 | ALABAMA DEVIL | A Thoughtful Panorama of a Database Administrator And a Mad Scientist who must Outgun a Mad Scientist in A Jet Boat | Horror | 2.99 | 114 | PG-13 | Christian Gable, Elvis Marx, Rip Crawford, Mena Temple, Rip Winslet, Warren Nolte, Greta Keitel, William Hackman, Meryl Allen | | 10 | ALADDIN CALENDAR | A Action-Packed Tale of a Man And a Lumberjack who must Reach a Feminist in Ancient China | Sports | 4.99 | 63 | NC-17 | Alec Wayne, Judy Dean, Val Bolger, Ray Johansson, Renee Tracy, Jada Ryder, Greta Malden, Rock Dukakis | +------+------------------+-----------------------------------------------------------------------------------------------------------------------+-------------+-------+--------+--------+------------------------------------------------------------------------------------------------------------------------------------------------+ 10 rows in set (0.06 sec) MariaDB [sakila]> pspg-2.6.6/tests/mysql.txt000066400000000000000000000006431360716715600155650ustar00rootroot00000000000000+------+------------------+ | fid | title | +------+------------------+ | 1 | ACADEMY DINOSAUR | | 2 | ACE GOLDFINGER | | 3 | ADAPTATION HOLES | | 4 | AFFAIR PREJUDICE | | 5 | AFRICAN EGG | | 6 | AGENT TRUMAN | | 7 | AIRPLANE SIERRA | | 8 | AIRPORT POLLOCK | | 9 | ALABAMA DEVIL | | 10 | ALADDIN CALENDAR | +------+------------------+ (10 rows) in set (0.06 sec)pspg-2.6.6/tests/pg_class.txt000066400000000000000000006367431360716715600162330ustar00rootroot00000000000000┌───────────────────────────────────────────┬──────────────┬─────────┬───────────┬──────────┬───────┬─────────────┬───────────────┬──────────┬───────────┬───────────────┬───────────────┬─────────────┬─────────────┬────────────────┬─────────┬──────────┬───────────┬────────────┬────────────┬─────────────┬────────────────┬────────────────┬────────────────┬─────────────────────┬────────────────┬──────────────┬────────────────┬──────────────┬────────────┬──────────────────────────────────────────┬─────────────────────────┬──────────────┐ │ relname │ relnamespace │ reltype │ reloftype │ relowner │ relam │ relfilenode │ reltablespace │ relpages │ reltuples │ relallvisible │ reltoastrelid │ relhasindex │ relisshared │ relpersistence │ relkind │ relnatts │ relchecks │ relhasoids │ relhaspkey │ relhasrules │ relhastriggers │ relhassubclass │ relrowsecurity │ relforcerowsecurity │ relispopulated │ relreplident │ relispartition │ relfrozenxid │ relminmxid │ relacl │ reloptions │ relpartbound │ ╞═══════════════════════════════════════════╪══════════════╪═════════╪═══════════╪══════════╪═══════╪═════════════╪═══════════════╪══════════╪═══════════╪═══════════════╪═══════════════╪═════════════╪═════════════╪════════════════╪═════════╪══════════╪═══════════╪════════════╪════════════╪═════════════╪════════════════╪════════════════╪════════════════╪═════════════════════╪════════════════╪══════════════╪════════════════╪══════════════╪════════════╪══════════════════════════════════════════╪═════════════════════════╪══════════════╡ │ pg_statistic │ 11 │ 11258 │ 0 │ 10 │ 0 │ 2619 │ 0 │ 16 │ 393 │ 16 │ 2840 │ t │ f │ p │ r │ 26 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres} │ │ │ │ pg_type │ 11 │ 71 │ 0 │ 10 │ 0 │ 0 │ 0 │ 9 │ 375 │ 9 │ 0 │ t │ f │ p │ r │ 30 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_toast_2604 │ 99 │ 11515 │ 0 │ 10 │ 0 │ 2830 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ t │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ │ │ │ │ pg_toast_2604_index │ 99 │ 0 │ 0 │ 10 │ 403 │ 2831 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_toast_2606 │ 99 │ 11516 │ 0 │ 10 │ 0 │ 2832 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ t │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ │ │ │ │ pg_toast_2606_index │ 99 │ 0 │ 0 │ 10 │ 403 │ 2833 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_toast_2609 │ 99 │ 11517 │ 0 │ 10 │ 0 │ 2834 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ t │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ │ │ │ │ pg_toast_2609_index │ 99 │ 0 │ 0 │ 10 │ 403 │ 2835 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_toast_1255 │ 99 │ 11518 │ 0 │ 10 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ t │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ │ │ │ │ pg_toast_1255_index │ 99 │ 0 │ 0 │ 10 │ 403 │ 0 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_toast_2618 │ 99 │ 11519 │ 0 │ 10 │ 0 │ 2838 │ 0 │ 51 │ 226 │ 51 │ 0 │ t │ f │ p │ t │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ │ │ │ │ pg_toast_2618_index │ 99 │ 0 │ 0 │ 10 │ 403 │ 2839 │ 0 │ 2 │ 226 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_toast_3596 │ 99 │ 11520 │ 0 │ 10 │ 0 │ 3598 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ t │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ │ │ │ │ pg_toast_3596_index │ 99 │ 0 │ 0 │ 10 │ 403 │ 3599 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_toast_2619 │ 99 │ 11521 │ 0 │ 10 │ 0 │ 2840 │ 0 │ 3 │ 13 │ 3 │ 0 │ t │ f │ p │ t │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ │ │ │ │ pg_toast_2619_index │ 99 │ 0 │ 0 │ 10 │ 403 │ 2841 │ 0 │ 2 │ 13 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_toast_3381 │ 99 │ 11522 │ 0 │ 10 │ 0 │ 3439 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ t │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ │ │ │ │ pg_toast_3381_index │ 99 │ 0 │ 0 │ 10 │ 403 │ 3440 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_toast_2620 │ 99 │ 11523 │ 0 │ 10 │ 0 │ 2336 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ t │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ │ │ │ │ pg_toast_2620_index │ 99 │ 0 │ 0 │ 10 │ 403 │ 2337 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_toast_2396 │ 99 │ 11524 │ 0 │ 10 │ 0 │ 0 │ 1664 │ 0 │ 0 │ 0 │ 0 │ t │ t │ p │ t │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ │ │ │ │ pg_toast_2396_index │ 99 │ 0 │ 0 │ 10 │ 403 │ 0 │ 1664 │ 1 │ 0 │ 0 │ 0 │ f │ t │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_toast_2964 │ 99 │ 11525 │ 0 │ 10 │ 0 │ 0 │ 1664 │ 0 │ 0 │ 0 │ 0 │ t │ t │ p │ t │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ │ │ │ │ pg_toast_2964_index │ 99 │ 0 │ 0 │ 10 │ 403 │ 0 │ 1664 │ 1 │ 0 │ 0 │ 0 │ f │ t │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_toast_3592 │ 99 │ 11526 │ 0 │ 10 │ 0 │ 0 │ 1664 │ 0 │ 0 │ 0 │ 0 │ t │ t │ p │ t │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ │ │ │ │ pg_toast_3592_index │ 99 │ 0 │ 0 │ 10 │ 403 │ 0 │ 1664 │ 1 │ 0 │ 0 │ 0 │ f │ t │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_aggregate_fnoid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2650 │ 0 │ 2 │ 138 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_am_name_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2651 │ 0 │ 2 │ 6 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_am_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2652 │ 0 │ 2 │ 6 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_amop_fam_strat_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2653 │ 0 │ 5 │ 709 │ 0 │ 0 │ f │ f │ p │ i │ 4 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_amop_opr_fam_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2654 │ 0 │ 5 │ 709 │ 0 │ 0 │ f │ f │ p │ i │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_amop_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2756 │ 0 │ 4 │ 709 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_amproc_fam_proc_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2655 │ 0 │ 4 │ 411 │ 0 │ 0 │ f │ f │ p │ i │ 4 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_amproc_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2757 │ 0 │ 4 │ 411 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_policy │ 11 │ 11502 │ 0 │ 10 │ 0 │ 3256 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ r │ 7 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_attrdef_adrelid_adnum_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2656 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_attrdef_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2657 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_attribute_relid_attnam_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 0 │ 13 │ 2579 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_attribute_relid_attnum_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 0 │ 10 │ 2579 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_authid_rolname_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 1664 │ 2 │ 6 │ 0 │ 0 │ f │ t │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_authid_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 1664 │ 2 │ 6 │ 0 │ 0 │ f │ t │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_auth_members_role_member_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 1664 │ 2 │ 3 │ 0 │ 0 │ f │ t │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_auth_members_member_role_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 1664 │ 2 │ 3 │ 0 │ 0 │ f │ t │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_cast_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2660 │ 0 │ 2 │ 219 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_cast_source_target_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2661 │ 0 │ 2 │ 219 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_class_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 0 │ 4 │ 341 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_class_relname_nsp_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 0 │ 6 │ 341 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_class_tblspc_relfilenode_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 0 │ 5 │ 341 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_collation_name_enc_nsp_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3164 │ 0 │ 9 │ 964 │ 0 │ 0 │ f │ f │ p │ i │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_collation_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3085 │ 0 │ 5 │ 964 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_constraint_conname_nsp_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2664 │ 0 │ 2 │ 2 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_constraint_conrelid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2665 │ 0 │ 2 │ 2 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_constraint_contypid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2666 │ 0 │ 2 │ 2 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_constraint_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2667 │ 0 │ 2 │ 2 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_conversion_default_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2668 │ 0 │ 2 │ 132 │ 0 │ 0 │ f │ f │ p │ i │ 4 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_conversion_name_nsp_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2669 │ 0 │ 2 │ 132 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_conversion_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2670 │ 0 │ 2 │ 132 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_database_datname_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 1664 │ 2 │ 2 │ 0 │ 0 │ f │ t │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_database_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 1664 │ 2 │ 2 │ 0 │ 0 │ f │ t │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_depend_depender_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2673 │ 0 │ 40 │ 7327 │ 0 │ 0 │ f │ f │ p │ i │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_depend_reference_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2674 │ 0 │ 46 │ 7327 │ 0 │ 0 │ f │ f │ p │ i │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_description_o_c_o_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2675 │ 0 │ 22 │ 3924 │ 0 │ 0 │ f │ f │ p │ i │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_shdescription_o_c_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 1664 │ 2 │ 1 │ 0 │ 0 │ f │ t │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_enum_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3502 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_enum_typid_label_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3503 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_enum_typid_sortorder_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3534 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_index_indrelid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2678 │ 0 │ 2 │ 134 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_index_indexrelid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2679 │ 0 │ 2 │ 134 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_inherits_relid_seqno_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2680 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_inherits_parent_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2187 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_init_privs_o_c_o_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3395 │ 0 │ 2 │ 149 │ 0 │ 0 │ f │ f │ p │ i │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_language_name_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2681 │ 0 │ 2 │ 4 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_language_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2682 │ 0 │ 2 │ 4 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_largeobject_loid_pn_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2683 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_largeobject_metadata_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2996 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_statistic_ext_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3380 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_statistic_ext_name_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3997 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_statistic_ext_relid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3379 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_namespace_nspname_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2684 │ 0 │ 2 │ 6 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_namespace_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2685 │ 0 │ 2 │ 6 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_opclass_am_name_nsp_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2686 │ 0 │ 2 │ 133 │ 0 │ 0 │ f │ f │ p │ i │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_opclass_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2687 │ 0 │ 2 │ 133 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_operator_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2688 │ 0 │ 5 │ 787 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_operator_oprname_l_r_n_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2689 │ 0 │ 6 │ 787 │ 0 │ 0 │ f │ f │ p │ i │ 4 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_opfamily_am_name_nsp_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2754 │ 0 │ 2 │ 115 │ 0 │ 0 │ f │ f │ p │ i │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_opfamily_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2755 │ 0 │ 2 │ 115 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_pltemplate_name_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 1664 │ 2 │ 8 │ 0 │ 0 │ f │ t │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_proc_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 0 │ 10 │ 2894 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_proc_proname_args_nsp_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 0 │ 33 │ 2894 │ 0 │ 0 │ f │ f │ p │ i │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_rewrite_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2692 │ 0 │ 2 │ 121 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_rewrite_rel_rulename_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2693 │ 0 │ 2 │ 121 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_sequence_seqrelid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 5002 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_shdepend_depender_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 1664 │ 2 │ 6 │ 0 │ 0 │ f │ t │ p │ i │ 4 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_shdepend_reference_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 1664 │ 2 │ 6 │ 0 │ 0 │ f │ t │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_statistic_relid_att_inh_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2696 │ 0 │ 2 │ 393 │ 0 │ 0 │ f │ f │ p │ i │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_tablespace_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 1664 │ 2 │ 2 │ 0 │ 0 │ f │ t │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_tablespace_spcname_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 1664 │ 2 │ 2 │ 0 │ 0 │ f │ t │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_transform_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3574 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_transform_type_lang_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3575 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_trigger_tgconstraint_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2699 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_trigger_tgrelid_tgname_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2701 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_trigger_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 2702 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_event_trigger_evtname_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3467 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_event_trigger_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3468 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_ts_config_cfgname_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3608 │ 0 │ 2 │ 16 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_ts_config_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3712 │ 0 │ 2 │ 16 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_ts_config_map_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3609 │ 0 │ 4 │ 304 │ 0 │ 0 │ f │ f │ p │ i │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_ts_dict_dictname_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3604 │ 0 │ 2 │ 16 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_ts_dict_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3605 │ 0 │ 2 │ 16 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_ts_parser_prsname_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3606 │ 0 │ 2 │ 1 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_ts_parser_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3607 │ 0 │ 2 │ 1 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_ts_template_tmplname_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3766 │ 0 │ 2 │ 5 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_ts_template_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3767 │ 0 │ 2 │ 5 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_type_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 0 │ 2 │ 375 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_type_typname_nsp_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 0 │ 5 │ 375 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_foreign_data_wrapper_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 112 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_foreign_data_wrapper_name_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 548 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_foreign_server_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 113 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_foreign_server_name_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 549 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_user_mapping_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 174 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_user_mapping_user_server_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 175 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_foreign_table_relid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3119 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_default_acl_role_nsp_obj_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 827 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_default_acl_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 828 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_db_role_setting_databaseid_rol_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 1664 │ 1 │ 0 │ 0 │ 0 │ f │ t │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_seclabel_object_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3597 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 4 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_shseclabel_object_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 1664 │ 1 │ 0 │ 0 │ 0 │ f │ t │ p │ i │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_extension_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3080 │ 0 │ 2 │ 1 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_extension_name_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3081 │ 0 │ 2 │ 1 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_range_rngtypid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3542 │ 0 │ 2 │ 6 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_policy_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3257 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_policy_polrelid_polname_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3258 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_replication_origin_roiident_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 1664 │ 1 │ 0 │ 0 │ 0 │ f │ t │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_replication_origin_roname_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 1664 │ 1 │ 0 │ 0 │ 0 │ f │ t │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_partitioned_table_partrelid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 3351 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_publication_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 6110 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_publication_pubname_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 6111 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_publication_rel_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 6112 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_publication_rel_prrelid_prpubid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 6113 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_subscription_oid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 1664 │ 1 │ 0 │ 0 │ 0 │ f │ t │ p │ i │ 1 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_subscription_subname_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 0 │ 1664 │ 1 │ 0 │ 0 │ 0 │ f │ t │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_subscription_rel_srrelid_srsubid_index │ 11 │ 0 │ 0 │ 10 │ 403 │ 6117 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_authid │ 11 │ 2842 │ 0 │ 10 │ 0 │ 0 │ 1664 │ 1 │ 6 │ 1 │ 0 │ t │ t │ p │ r │ 11 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres} │ │ │ │ pg_shadow │ 11 │ 11532 │ 0 │ 10 │ 0 │ 11531 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 9 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres} │ │ │ │ pg_settings │ 11 │ 11601 │ 0 │ 10 │ 0 │ 11600 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 17 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=rw/postgres} │ │ │ │ pg_hba_file_rules │ 11 │ 11609 │ 0 │ 10 │ 0 │ 11608 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 9 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres} │ │ │ │ pg_file_settings │ 11 │ 11606 │ 0 │ 10 │ 0 │ 11605 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 7 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres} │ │ │ │ pg_config │ 11 │ 11618 │ 0 │ 10 │ 0 │ 11617 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 2 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres} │ │ │ │ pg_user_mapping │ 11 │ 11500 │ 0 │ 10 │ 0 │ 1418 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ r │ 3 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres} │ │ │ │ pg_replication_origin_status │ 11 │ 11732 │ 0 │ 10 │ 0 │ 11731 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 4 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres} │ │ │ │ pg_subscription │ 11 │ 6101 │ 0 │ 10 │ 0 │ 0 │ 1664 │ 0 │ 0 │ 0 │ 0 │ t │ t │ p │ r │ 8 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres} │ │ │ │ pg_stat_user_tables │ 11 │ 11636 │ 0 │ 10 │ 0 │ 11635 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 22 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_stat_xact_user_tables │ 11 │ 11640 │ 0 │ 10 │ 0 │ 11639 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 11 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_attribute │ 11 │ 75 │ 0 │ 10 │ 0 │ 0 │ 0 │ 48 │ 2579 │ 48 │ 0 │ t │ f │ p │ r │ 22 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_proc │ 11 │ 81 │ 0 │ 10 │ 0 │ 0 │ 0 │ 74 │ 2894 │ 74 │ 2836 │ t │ f │ p │ r │ 29 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_class │ 11 │ 83 │ 0 │ 10 │ 0 │ 0 │ 0 │ 11 │ 341 │ 11 │ 0 │ t │ f │ p │ r │ 33 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_attrdef │ 11 │ 10000 │ 0 │ 10 │ 0 │ 2604 │ 0 │ 0 │ 0 │ 0 │ 2830 │ t │ f │ p │ r │ 4 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_constraint │ 11 │ 10001 │ 0 │ 10 │ 0 │ 2606 │ 0 │ 1 │ 2 │ 1 │ 2832 │ t │ f │ p │ r │ 24 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_statio_all_tables │ 11 │ 11643 │ 0 │ 10 │ 0 │ 11642 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 11 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_statio_sys_tables │ 11 │ 11647 │ 0 │ 10 │ 0 │ 11646 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 11 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_statio_user_tables │ 11 │ 11650 │ 0 │ 10 │ 0 │ 11649 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 11 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_stat_all_indexes │ 11 │ 11653 │ 0 │ 10 │ 0 │ 11652 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 8 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_inherits │ 11 │ 10002 │ 0 │ 10 │ 0 │ 2611 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ r │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_index │ 11 │ 10003 │ 0 │ 10 │ 0 │ 2610 │ 0 │ 3 │ 134 │ 3 │ 0 │ t │ f │ p │ r │ 19 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_operator │ 11 │ 10004 │ 0 │ 10 │ 0 │ 2617 │ 0 │ 15 │ 787 │ 15 │ 0 │ t │ f │ p │ r │ 14 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_opfamily │ 11 │ 10005 │ 0 │ 10 │ 0 │ 2753 │ 0 │ 2 │ 115 │ 2 │ 0 │ t │ f │ p │ r │ 4 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_opclass │ 11 │ 10006 │ 0 │ 10 │ 0 │ 2616 │ 0 │ 3 │ 133 │ 3 │ 0 │ t │ f │ p │ r │ 8 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_am │ 11 │ 10130 │ 0 │ 10 │ 0 │ 2601 │ 0 │ 1 │ 6 │ 1 │ 0 │ t │ f │ p │ r │ 3 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_amop │ 11 │ 10131 │ 0 │ 10 │ 0 │ 2602 │ 0 │ 6 │ 709 │ 6 │ 0 │ t │ f │ p │ r │ 8 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_amproc │ 11 │ 10841 │ 0 │ 10 │ 0 │ 2603 │ 0 │ 4 │ 411 │ 4 │ 0 │ t │ f │ p │ r │ 5 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_language │ 11 │ 11253 │ 0 │ 10 │ 0 │ 2612 │ 0 │ 1 │ 4 │ 1 │ 0 │ t │ f │ p │ r │ 8 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_largeobject_metadata │ 11 │ 11254 │ 0 │ 10 │ 0 │ 2995 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ r │ 2 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_aggregate │ 11 │ 11256 │ 0 │ 10 │ 0 │ 2600 │ 0 │ 2 │ 138 │ 2 │ 0 │ t │ f │ p │ r │ 20 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_statistic_ext │ 11 │ 11257 │ 0 │ 10 │ 0 │ 3381 │ 0 │ 0 │ 0 │ 0 │ 3439 │ t │ f │ p │ r │ 8 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_rewrite │ 11 │ 11259 │ 0 │ 10 │ 0 │ 2618 │ 0 │ 12 │ 121 │ 12 │ 2838 │ t │ f │ p │ r │ 7 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_trigger │ 11 │ 11260 │ 0 │ 10 │ 0 │ 2620 │ 0 │ 0 │ 0 │ 0 │ 2336 │ t │ f │ p │ r │ 17 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_event_trigger │ 11 │ 11261 │ 0 │ 10 │ 0 │ 3466 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ r │ 6 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_description │ 11 │ 11262 │ 0 │ 10 │ 0 │ 2609 │ 0 │ 35 │ 3924 │ 35 │ 2834 │ t │ f │ p │ r │ 4 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_cast │ 11 │ 11263 │ 0 │ 10 │ 0 │ 2605 │ 0 │ 2 │ 219 │ 2 │ 0 │ t │ f │ p │ r │ 5 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_enum │ 11 │ 11483 │ 0 │ 10 │ 0 │ 3501 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ r │ 3 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_namespace │ 11 │ 11484 │ 0 │ 10 │ 0 │ 2615 │ 0 │ 1 │ 6 │ 1 │ 0 │ t │ f │ p │ r │ 3 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_conversion │ 11 │ 11485 │ 0 │ 10 │ 0 │ 2607 │ 0 │ 3 │ 132 │ 3 │ 0 │ t │ f │ p │ r │ 7 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_depend │ 11 │ 11486 │ 0 │ 10 │ 0 │ 2608 │ 0 │ 54 │ 7327 │ 54 │ 0 │ t │ f │ p │ r │ 7 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_database │ 11 │ 1248 │ 0 │ 10 │ 0 │ 0 │ 1664 │ 1 │ 2 │ 1 │ 0 │ t │ t │ p │ r │ 13 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_db_role_setting │ 11 │ 11487 │ 0 │ 10 │ 0 │ 0 │ 1664 │ 0 │ 0 │ 0 │ 2966 │ t │ t │ p │ r │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_tablespace │ 11 │ 11488 │ 0 │ 10 │ 0 │ 0 │ 1664 │ 1 │ 2 │ 1 │ 0 │ t │ t │ p │ r │ 4 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_pltemplate │ 11 │ 11489 │ 0 │ 10 │ 0 │ 0 │ 1664 │ 1 │ 8 │ 1 │ 0 │ t │ t │ p │ r │ 8 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_auth_members │ 11 │ 2843 │ 0 │ 10 │ 0 │ 0 │ 1664 │ 1 │ 3 │ 1 │ 0 │ t │ t │ p │ r │ 4 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_shdepend │ 11 │ 11490 │ 0 │ 10 │ 0 │ 0 │ 1664 │ 1 │ 6 │ 1 │ 0 │ t │ t │ p │ r │ 7 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_shdescription │ 11 │ 11491 │ 0 │ 10 │ 0 │ 0 │ 1664 │ 1 │ 1 │ 1 │ 2846 │ t │ t │ p │ r │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_ts_config │ 11 │ 11492 │ 0 │ 10 │ 0 │ 3602 │ 0 │ 1 │ 16 │ 1 │ 0 │ t │ f │ p │ r │ 4 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_ts_config_map │ 11 │ 11493 │ 0 │ 10 │ 0 │ 3603 │ 0 │ 2 │ 304 │ 2 │ 0 │ t │ f │ p │ r │ 4 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_ts_dict │ 11 │ 11494 │ 0 │ 10 │ 0 │ 3600 │ 0 │ 1 │ 16 │ 1 │ 0 │ t │ f │ p │ r │ 5 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_ts_parser │ 11 │ 11495 │ 0 │ 10 │ 0 │ 3601 │ 0 │ 1 │ 1 │ 1 │ 0 │ t │ f │ p │ r │ 7 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_ts_template │ 11 │ 11496 │ 0 │ 10 │ 0 │ 3764 │ 0 │ 1 │ 5 │ 1 │ 0 │ t │ f │ p │ r │ 4 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_extension │ 11 │ 11497 │ 0 │ 10 │ 0 │ 3079 │ 0 │ 1 │ 1 │ 1 │ 0 │ t │ f │ p │ r │ 7 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_foreign_data_wrapper │ 11 │ 11498 │ 0 │ 10 │ 0 │ 2328 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ r │ 6 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_foreign_server │ 11 │ 11499 │ 0 │ 10 │ 0 │ 1417 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ r │ 7 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_foreign_table │ 11 │ 11501 │ 0 │ 10 │ 0 │ 3118 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ r │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_replication_origin │ 11 │ 11503 │ 0 │ 10 │ 0 │ 0 │ 1664 │ 0 │ 0 │ 0 │ 0 │ t │ t │ p │ r │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_default_acl │ 11 │ 11504 │ 0 │ 10 │ 0 │ 826 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ r │ 4 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_init_privs │ 11 │ 11505 │ 0 │ 10 │ 0 │ 3394 │ 0 │ 2 │ 149 │ 2 │ 0 │ t │ f │ p │ r │ 5 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_seclabel │ 11 │ 11506 │ 0 │ 10 │ 0 │ 3596 │ 0 │ 0 │ 0 │ 0 │ 3598 │ t │ f │ p │ r │ 5 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_shseclabel │ 11 │ 4066 │ 0 │ 10 │ 0 │ 0 │ 1664 │ 0 │ 0 │ 0 │ 4060 │ t │ t │ p │ r │ 4 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_collation │ 11 │ 11507 │ 0 │ 10 │ 0 │ 3456 │ 0 │ 30 │ 964 │ 30 │ 0 │ t │ f │ p │ r │ 8 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_partitioned_table │ 11 │ 11508 │ 0 │ 10 │ 0 │ 3350 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ r │ 7 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_range │ 11 │ 11509 │ 0 │ 10 │ 0 │ 3541 │ 0 │ 1 │ 6 │ 1 │ 0 │ t │ f │ p │ r │ 6 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_transform │ 11 │ 11510 │ 0 │ 10 │ 0 │ 3576 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ r │ 4 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_sequence │ 11 │ 11511 │ 0 │ 10 │ 0 │ 2224 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ r │ 8 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_publication │ 11 │ 11512 │ 0 │ 10 │ 0 │ 6104 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ r │ 6 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_publication_rel │ 11 │ 11513 │ 0 │ 10 │ 0 │ 6106 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ r │ 2 │ 0 │ t │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_subscription_rel │ 11 │ 11514 │ 0 │ 10 │ 0 │ 6102 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ r │ 4 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_roles │ 11 │ 11528 │ 0 │ 10 │ 0 │ 11527 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 13 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_locks │ 11 │ 11578 │ 0 │ 10 │ 0 │ 11577 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 15 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_group │ 11 │ 11536 │ 0 │ 10 │ 0 │ 11535 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 3 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_user │ 11 │ 11539 │ 0 │ 10 │ 0 │ 11538 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 9 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_policies │ 11 │ 11542 │ 0 │ 10 │ 0 │ 11541 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 8 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_rules │ 11 │ 11546 │ 0 │ 10 │ 0 │ 11545 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 4 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_views │ 11 │ 11550 │ 0 │ 10 │ 0 │ 11549 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 4 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_tables │ 11 │ 11554 │ 0 │ 10 │ 0 │ 11553 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 8 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_matviews │ 11 │ 11558 │ 0 │ 10 │ 0 │ 11557 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 7 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_indexes │ 11 │ 11562 │ 0 │ 10 │ 0 │ 11561 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 5 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_sequences │ 11 │ 11566 │ 0 │ 10 │ 0 │ 11565 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 11 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_stats │ 11 │ 11570 │ 0 │ 10 │ 0 │ 11569 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 14 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ {security_barrier=true} │ │ │ pg_publication_tables │ 11 │ 11574 │ 0 │ 10 │ 0 │ 11573 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 3 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_cursors │ 11 │ 11581 │ 0 │ 10 │ 0 │ 11580 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 6 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_available_extensions │ 11 │ 11584 │ 0 │ 10 │ 0 │ 11583 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 4 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_available_extension_versions │ 11 │ 11587 │ 0 │ 10 │ 0 │ 11586 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 8 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_prepared_xacts │ 11 │ 11590 │ 0 │ 10 │ 0 │ 11589 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 5 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_prepared_statements │ 11 │ 11594 │ 0 │ 10 │ 0 │ 11593 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 5 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_seclabels │ 11 │ 11597 │ 0 │ 10 │ 0 │ 11596 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 8 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_timezone_names │ 11 │ 11615 │ 0 │ 10 │ 0 │ 11614 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 4 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_timezone_abbrevs │ 11 │ 11612 │ 0 │ 10 │ 0 │ 11611 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 3 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_stat_all_tables │ 11 │ 11621 │ 0 │ 10 │ 0 │ 11620 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 22 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_stat_xact_all_tables │ 11 │ 11625 │ 0 │ 10 │ 0 │ 11624 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 11 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_stat_sys_tables │ 11 │ 11629 │ 0 │ 10 │ 0 │ 11628 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 22 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_stat_xact_sys_tables │ 11 │ 11633 │ 0 │ 10 │ 0 │ 11632 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 11 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_stat_sys_indexes │ 11 │ 11657 │ 0 │ 10 │ 0 │ 11656 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 8 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_stat_user_indexes │ 11 │ 11660 │ 0 │ 10 │ 0 │ 11659 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 8 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_statio_all_indexes │ 11 │ 11663 │ 0 │ 10 │ 0 │ 11662 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 7 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_statio_sys_indexes │ 11 │ 11667 │ 0 │ 10 │ 0 │ 11666 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 7 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_statio_user_indexes │ 11 │ 11670 │ 0 │ 10 │ 0 │ 11669 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 7 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_statio_all_sequences │ 11 │ 11673 │ 0 │ 10 │ 0 │ 11672 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 5 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_statio_sys_sequences │ 11 │ 11677 │ 0 │ 10 │ 0 │ 11676 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 5 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_statio_user_sequences │ 11 │ 11680 │ 0 │ 10 │ 0 │ 11679 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 5 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_stat_activity │ 11 │ 11683 │ 0 │ 10 │ 0 │ 11682 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 20 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_stat_replication │ 11 │ 11687 │ 0 │ 10 │ 0 │ 11686 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 19 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_stat_wal_receiver │ 11 │ 11691 │ 0 │ 10 │ 0 │ 11690 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 12 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_stat_subscription │ 11 │ 11694 │ 0 │ 10 │ 0 │ 11693 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 9 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_stat_ssl │ 11 │ 11697 │ 0 │ 10 │ 0 │ 11696 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 7 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_replication_slots │ 11 │ 11700 │ 0 │ 10 │ 0 │ 11699 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 12 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_stat_database │ 11 │ 11704 │ 0 │ 10 │ 0 │ 11703 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 19 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_stat_database_conflicts │ 11 │ 11707 │ 0 │ 10 │ 0 │ 11706 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 7 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_stat_user_functions │ 11 │ 11710 │ 0 │ 10 │ 0 │ 11709 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 6 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_stat_xact_user_functions │ 11 │ 11714 │ 0 │ 10 │ 0 │ 11713 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 6 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_stat_archiver │ 11 │ 11718 │ 0 │ 10 │ 0 │ 11717 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 7 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_stat_bgwriter │ 11 │ 11721 │ 0 │ 10 │ 0 │ 11720 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 11 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_stat_progress_vacuum │ 11 │ 11724 │ 0 │ 10 │ 0 │ 11723 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 11 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_user_mappings │ 11 │ 11728 │ 0 │ 10 │ 0 │ 11727 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 6 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_largeobject │ 11 │ 11255 │ 0 │ 10 │ 0 │ 2613 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ r │ 3 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres} │ │ │ │ information_schema_catalog_name │ 12962 │ 12980 │ 0 │ 10 │ 0 │ 12979 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 1 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ attributes │ 12962 │ 12993 │ 0 │ 10 │ 0 │ 12992 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 31 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ applicable_roles │ 12962 │ 12986 │ 0 │ 10 │ 0 │ 12985 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 3 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ administrable_role_authorizations │ 12962 │ 12990 │ 0 │ 10 │ 0 │ 12989 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 3 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ check_constraint_routine_usage │ 12962 │ 13001 │ 0 │ 10 │ 0 │ 13000 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 6 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ character_sets │ 12962 │ 12997 │ 0 │ 10 │ 0 │ 12996 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 8 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ check_constraints │ 12962 │ 13005 │ 0 │ 10 │ 0 │ 13004 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 4 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ collations │ 12962 │ 13009 │ 0 │ 10 │ 0 │ 13008 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 4 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ collation_character_set_applicability │ 12962 │ 13013 │ 0 │ 10 │ 0 │ 13012 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 6 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ column_domain_usage │ 12962 │ 13017 │ 0 │ 10 │ 0 │ 13016 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 7 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ column_privileges │ 12962 │ 13021 │ 0 │ 10 │ 0 │ 13020 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 8 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ routine_privileges │ 12962 │ 13071 │ 0 │ 10 │ 0 │ 13070 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 10 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ column_udt_usage │ 12962 │ 13025 │ 0 │ 10 │ 0 │ 13024 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 7 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ columns │ 12962 │ 13029 │ 0 │ 10 │ 0 │ 13028 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 44 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_toast_13098 │ 99 │ 13101 │ 0 │ 10 │ 0 │ 13100 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ t │ 3 │ 0 │ f │ t │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ │ │ │ │ constraint_column_usage │ 12962 │ 13033 │ 0 │ 10 │ 0 │ 13032 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 7 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ role_routine_grants │ 12962 │ 13075 │ 0 │ 10 │ 0 │ 13074 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 10 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ constraint_table_usage │ 12962 │ 13037 │ 0 │ 10 │ 0 │ 13036 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 6 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ domain_constraints │ 12962 │ 13041 │ 0 │ 10 │ 0 │ 13040 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 8 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_toast_13098_index │ 99 │ 0 │ 0 │ 10 │ 403 │ 13102 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ domain_udt_usage │ 12962 │ 13045 │ 0 │ 10 │ 0 │ 13044 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 6 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ routines │ 12962 │ 13078 │ 0 │ 10 │ 0 │ 13077 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 82 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ domains │ 12962 │ 13049 │ 0 │ 10 │ 0 │ 13048 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 27 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ enabled_roles │ 12962 │ 13053 │ 0 │ 10 │ 0 │ 13052 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 1 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ sql_parts │ 12962 │ 13109 │ 0 │ 10 │ 0 │ 13108 │ 0 │ 1 │ 9 │ 1 │ 13110 │ f │ f │ p │ r │ 5 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ d │ f │ 548 │ 1 │ │ │ │ │ key_column_usage │ 12962 │ 13056 │ 0 │ 10 │ 0 │ 13055 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 9 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ schemata │ 12962 │ 13082 │ 0 │ 10 │ 0 │ 13081 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 7 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ parameters │ 12962 │ 13060 │ 0 │ 10 │ 0 │ 13059 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 32 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ referential_constraints │ 12962 │ 13064 │ 0 │ 10 │ 0 │ 13063 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 9 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ sql_languages │ 12962 │ 13099 │ 0 │ 10 │ 0 │ 13098 │ 0 │ 1 │ 4 │ 1 │ 13100 │ f │ f │ p │ r │ 7 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ d │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ role_column_grants │ 12962 │ 13068 │ 0 │ 10 │ 0 │ 13067 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 8 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ sequences │ 12962 │ 13085 │ 0 │ 10 │ 0 │ 13084 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 12 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_toast_13088 │ 99 │ 13091 │ 0 │ 10 │ 0 │ 13090 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ t │ 3 │ 0 │ f │ t │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ │ │ │ │ pg_toast_13088_index │ 99 │ 0 │ 0 │ 10 │ 403 │ 13092 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_toast_13103 │ 99 │ 13106 │ 0 │ 10 │ 0 │ 13105 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ t │ 3 │ 0 │ f │ t │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ │ │ │ │ sql_features │ 12962 │ 13089 │ 0 │ 10 │ 0 │ 13088 │ 0 │ 7 │ 671 │ 7 │ 13090 │ f │ f │ p │ r │ 7 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ d │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_toast_13093 │ 99 │ 13096 │ 0 │ 10 │ 0 │ 13095 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ t │ 3 │ 0 │ f │ t │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ │ │ │ │ pg_toast_13093_index │ 99 │ 0 │ 0 │ 10 │ 403 │ 13097 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_toast_13103_index │ 99 │ 0 │ 0 │ 10 │ 403 │ 13107 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ sql_implementation_info │ 12962 │ 13094 │ 0 │ 10 │ 0 │ 13093 │ 0 │ 1 │ 12 │ 1 │ 13095 │ f │ f │ p │ r │ 5 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ d │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ sql_packages │ 12962 │ 13104 │ 0 │ 10 │ 0 │ 13103 │ 0 │ 1 │ 10 │ 1 │ 13105 │ f │ f │ p │ r │ 5 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ d │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_toast_13108 │ 99 │ 13111 │ 0 │ 10 │ 0 │ 13110 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ t │ 3 │ 0 │ f │ t │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ │ │ │ │ pg_toast_13108_index │ 99 │ 0 │ 0 │ 10 │ 403 │ 13112 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_toast_13113 │ 99 │ 13116 │ 0 │ 10 │ 0 │ 13115 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ t │ 3 │ 0 │ f │ t │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ │ │ │ │ pg_toast_13113_index │ 99 │ 0 │ 0 │ 10 │ 403 │ 13117 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ pg_toast_13118 │ 99 │ 13121 │ 0 │ 10 │ 0 │ 13120 │ 0 │ 0 │ 0 │ 0 │ 0 │ t │ f │ p │ t │ 3 │ 0 │ f │ t │ f │ f │ f │ f │ f │ t │ n │ f │ 548 │ 1 │ │ │ │ │ sql_sizing │ 12962 │ 13114 │ 0 │ 10 │ 0 │ 13113 │ 0 │ 1 │ 23 │ 1 │ 13115 │ f │ f │ p │ r │ 4 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ d │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ pg_toast_13118_index │ 99 │ 0 │ 0 │ 10 │ 403 │ 13122 │ 0 │ 1 │ 0 │ 0 │ 0 │ f │ f │ p │ i │ 2 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ sql_sizing_profiles │ 12962 │ 13119 │ 0 │ 10 │ 0 │ 13118 │ 0 │ 0 │ 0 │ 0 │ 13120 │ f │ f │ p │ r │ 5 │ 0 │ f │ f │ f │ f │ f │ f │ f │ t │ d │ f │ 548 │ 1 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ view_routine_usage │ 12962 │ 13173 │ 0 │ 10 │ 0 │ 13172 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 6 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ table_constraints │ 12962 │ 13124 │ 0 │ 10 │ 0 │ 13123 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 9 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ table_privileges │ 12962 │ 13128 │ 0 │ 10 │ 0 │ 13127 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 8 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ foreign_table_options │ 12962 │ 13223 │ 0 │ 10 │ 0 │ 13222 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 5 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ role_table_grants │ 12962 │ 13132 │ 0 │ 10 │ 0 │ 13131 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 8 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ view_table_usage │ 12962 │ 13177 │ 0 │ 10 │ 0 │ 13176 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 6 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ tables │ 12962 │ 13135 │ 0 │ 10 │ 0 │ 13134 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 12 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ transforms │ 12962 │ 13139 │ 0 │ 10 │ 0 │ 13138 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 8 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ triggered_update_columns │ 12962 │ 13143 │ 0 │ 10 │ 0 │ 13142 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 7 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ foreign_data_wrappers │ 12962 │ 13206 │ 0 │ 10 │ 0 │ 13205 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 5 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ triggers │ 12962 │ 13147 │ 0 │ 10 │ 0 │ 13146 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 17 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ views │ 12962 │ 13181 │ 0 │ 10 │ 0 │ 13180 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 10 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ udt_privileges │ 12962 │ 13151 │ 0 │ 10 │ 0 │ 13150 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 7 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ role_udt_grants │ 12962 │ 13155 │ 0 │ 10 │ 0 │ 13154 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 7 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ usage_privileges │ 12962 │ 13158 │ 0 │ 10 │ 0 │ 13157 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 8 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ data_type_privileges │ 12962 │ 13185 │ 0 │ 10 │ 0 │ 13184 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 5 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ role_usage_grants │ 12962 │ 13162 │ 0 │ 10 │ 0 │ 13161 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 8 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ user_defined_types │ 12962 │ 13165 │ 0 │ 10 │ 0 │ 13164 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 29 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ _pg_foreign_servers │ 12962 │ 13209 │ 0 │ 10 │ 0 │ 13208 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 9 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ view_column_usage │ 12962 │ 13169 │ 0 │ 10 │ 0 │ 13168 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 7 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ element_types │ 12962 │ 13189 │ 0 │ 10 │ 0 │ 13188 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 29 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ _pg_foreign_table_columns │ 12962 │ 13193 │ 0 │ 10 │ 0 │ 13192 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 4 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ column_options │ 12962 │ 13197 │ 0 │ 10 │ 0 │ 13196 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 6 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ _pg_foreign_data_wrappers │ 12962 │ 13200 │ 0 │ 10 │ 0 │ 13199 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 7 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ foreign_server_options │ 12962 │ 13213 │ 0 │ 10 │ 0 │ 13212 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 4 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ foreign_data_wrapper_options │ 12962 │ 13203 │ 0 │ 10 │ 0 │ 13202 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 4 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ user_mapping_options │ 12962 │ 13233 │ 0 │ 10 │ 0 │ 13232 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 5 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ foreign_servers │ 12962 │ 13216 │ 0 │ 10 │ 0 │ 13215 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 7 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ _pg_foreign_tables │ 12962 │ 13219 │ 0 │ 10 │ 0 │ 13218 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 7 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ foreign_tables │ 12962 │ 13226 │ 0 │ 10 │ 0 │ 13225 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 5 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ │ _pg_user_mappings │ 12962 │ 13229 │ 0 │ 10 │ 0 │ 13228 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 7 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ │ │ │ │ user_mappings │ 12962 │ 13237 │ 0 │ 10 │ 0 │ 13236 │ 0 │ 0 │ 0 │ 0 │ 0 │ f │ f │ p │ v │ 3 │ 0 │ f │ f │ t │ f │ f │ f │ f │ t │ n │ f │ 0 │ 0 │ {postgres=arwdDxt/postgres,=r/postgres} │ │ │ └───────────────────────────────────────────┴──────────────┴─────────┴───────────┴──────────┴───────┴─────────────┴───────────────┴──────────┴───────────┴───────────────┴───────────────┴─────────────┴─────────────┴────────────────┴─────────┴──────────┴───────────┴────────────┴────────────┴─────────────┴────────────────┴────────────────┴────────────────┴─────────────────────┴────────────────┴──────────────┴────────────────┴──────────────┴────────────┴──────────────────────────────────────────┴─────────────────────────┴──────────────┘ (341 rows) pspg-2.6.6/tests/small.txt000066400000000000000000000007041360716715600155260ustar00rootroot00000000000000┌─────────────┬───────┬───────┐ │ a │ b │ c │ ╞═════════════╪═══════╪═══════╡ │ tomas │ tomas │ tomas │ │ pavel pavel │ tomas │ tomas │ │ petr │ tomas │ tomas │ └─────────────┴───────┴───────┘ (3 rows) pspg-2.6.6/tests/tables.txt000066400000000000000000000206021360716715600156670ustar00rootroot00000000000000 List of relations ┌────────────┬─────────────────────────┬───────┬──────────┬─────────────┬────────────┬─────────────┐ │ Schema │ Name │ Type │ Owner │ Persistence │ Size │ Description │ ╞════════════╪═════════════════════════╪═══════╪══════════╪═════════════╪════════════╪═════════════╡ │ pg_catalog │ pg_aggregate │ table │ postgres │ permanent │ 56 kB │ │ │ pg_catalog │ pg_am │ table │ postgres │ permanent │ 40 kB │ │ │ pg_catalog │ pg_amop │ table │ postgres │ permanent │ 80 kB │ │ │ pg_catalog │ pg_amproc │ table │ postgres │ permanent │ 56 kB │ │ │ pg_catalog │ pg_attrdef │ table │ postgres │ permanent │ 8192 bytes │ │ │ pg_catalog │ pg_attribute │ table │ postgres │ permanent │ 464 kB │ │ │ pg_catalog │ pg_auth_members │ table │ postgres │ permanent │ 40 kB │ │ │ pg_catalog │ pg_authid │ table │ postgres │ permanent │ 48 kB │ │ │ pg_catalog │ pg_cast │ table │ postgres │ permanent │ 48 kB │ │ │ pg_catalog │ pg_class │ table │ postgres │ permanent │ 136 kB │ │ │ pg_catalog │ pg_collation │ table │ postgres │ permanent │ 296 kB │ │ │ pg_catalog │ pg_constraint │ table │ postgres │ permanent │ 48 kB │ │ │ pg_catalog │ pg_conversion │ table │ postgres │ permanent │ 48 kB │ │ │ pg_catalog │ pg_database │ table │ postgres │ permanent │ 48 kB │ │ │ pg_catalog │ pg_db_role_setting │ table │ postgres │ permanent │ 8192 bytes │ │ │ pg_catalog │ pg_default_acl │ table │ postgres │ permanent │ 8192 bytes │ │ │ pg_catalog │ pg_depend │ table │ postgres │ permanent │ 488 kB │ │ │ pg_catalog │ pg_description │ table │ postgres │ permanent │ 320 kB │ │ │ pg_catalog │ pg_enum │ table │ postgres │ permanent │ 0 bytes │ │ │ pg_catalog │ pg_event_trigger │ table │ postgres │ permanent │ 8192 bytes │ │ │ pg_catalog │ pg_extension │ table │ postgres │ permanent │ 48 kB │ │ │ pg_catalog │ pg_foreign_data_wrapper │ table │ postgres │ permanent │ 8192 bytes │ │ │ pg_catalog │ pg_foreign_server │ table │ postgres │ permanent │ 8192 bytes │ │ │ pg_catalog │ pg_foreign_table │ table │ postgres │ permanent │ 8192 bytes │ │ │ pg_catalog │ pg_index │ table │ postgres │ permanent │ 64 kB │ │ │ pg_catalog │ pg_inherits │ table │ postgres │ permanent │ 0 bytes │ │ │ pg_catalog │ pg_init_privs │ table │ postgres │ permanent │ 56 kB │ │ │ pg_catalog │ pg_language │ table │ postgres │ permanent │ 48 kB │ │ │ pg_catalog │ pg_largeobject │ table │ postgres │ permanent │ 0 bytes │ │ │ pg_catalog │ pg_largeobject_metadata │ table │ postgres │ permanent │ 0 bytes │ │ │ pg_catalog │ pg_namespace │ table │ postgres │ permanent │ 48 kB │ │ │ pg_catalog │ pg_opclass │ table │ postgres │ permanent │ 48 kB │ │ │ pg_catalog │ pg_operator │ table │ postgres │ permanent │ 144 kB │ │ │ pg_catalog │ pg_opfamily │ table │ postgres │ permanent │ 48 kB │ │ │ pg_catalog │ pg_partitioned_table │ table │ postgres │ permanent │ 8192 bytes │ │ │ pg_catalog │ pg_pltemplate │ table │ postgres │ permanent │ 48 kB │ │ │ pg_catalog │ pg_policy │ table │ postgres │ permanent │ 8192 bytes │ │ │ pg_catalog │ pg_proc │ table │ postgres │ permanent │ 672 kB │ │ │ pg_catalog │ pg_publication │ table │ postgres │ permanent │ 0 bytes │ │ │ pg_catalog │ pg_publication_rel │ table │ postgres │ permanent │ 0 bytes │ │ │ pg_catalog │ pg_range │ table │ postgres │ permanent │ 40 kB │ │ │ pg_catalog │ pg_replication_origin │ table │ postgres │ permanent │ 8192 bytes │ │ │ pg_catalog │ pg_rewrite │ table │ postgres │ permanent │ 632 kB │ │ │ pg_catalog │ pg_seclabel │ table │ postgres │ permanent │ 8192 bytes │ │ │ pg_catalog │ pg_sequence │ table │ postgres │ permanent │ 0 bytes │ │ │ pg_catalog │ pg_shdepend │ table │ postgres │ permanent │ 40 kB │ │ │ pg_catalog │ pg_shdescription │ table │ postgres │ permanent │ 48 kB │ │ │ pg_catalog │ pg_shseclabel │ table │ postgres │ permanent │ 8192 bytes │ │ │ pg_catalog │ pg_statistic │ table │ postgres │ permanent │ 256 kB │ │ │ pg_catalog │ pg_statistic_ext │ table │ postgres │ permanent │ 8192 bytes │ │ │ pg_catalog │ pg_statistic_ext_data │ table │ postgres │ permanent │ 8192 bytes │ │ │ pg_catalog │ pg_subscription │ table │ postgres │ permanent │ 8192 bytes │ │ │ pg_catalog │ pg_subscription_rel │ table │ postgres │ permanent │ 0 bytes │ │ │ pg_catalog │ pg_tablespace │ table │ postgres │ permanent │ 48 kB │ │ │ pg_catalog │ pg_transform │ table │ postgres │ permanent │ 0 bytes │ │ │ pg_catalog │ pg_trigger │ table │ postgres │ permanent │ 8192 bytes │ │ │ pg_catalog │ pg_ts_config │ table │ postgres │ permanent │ 40 kB │ │ │ pg_catalog │ pg_ts_config_map │ table │ postgres │ permanent │ 56 kB │ │ │ pg_catalog │ pg_ts_dict │ table │ postgres │ permanent │ 48 kB │ │ │ pg_catalog │ pg_ts_parser │ table │ postgres │ permanent │ 40 kB │ │ │ pg_catalog │ pg_ts_template │ table │ postgres │ permanent │ 40 kB │ │ │ pg_catalog │ pg_type │ table │ postgres │ permanent │ 120 kB │ │ │ pg_catalog │ pg_user_mapping │ table │ postgres │ permanent │ 8192 bytes │ │ │ public │ bigtable │ table │ pavel │ permanent │ 35 MB │ │ └────────────┴─────────────────────────┴───────┴──────────┴─────────────┴────────────┴─────────────┘ (64 rows) pspg-2.6.6/tests/test2.csv000066400000000000000000000002401360716715600154260ustar00rootroot00000000000000s1, s2, s3, s4, s5 1, 2, 3, 4, 5 6, 7, 8, 9, 10 11, 12, 13, 14, 15 16, 17, 18, 19, 20 Horní Libochová , 100, Dlouhé , Dobrá voda 10,,20,30,,40pspg-2.6.6/tests/test3.csv000066400000000000000000000002611360716715600154320ustar00rootroot00000000000000rok,firma,typ, poznamka,najezd 1995,Opel,Vectra,"klimatizace, střešní okno",45000 1998,Škoda,"Felicia ""Fun""",,80000 2002,Škoda,Octavia,"klimatizace, ABS bouraná",70000 pspg-2.6.6/tests/test4.csv000066400000000000000000000002621360716715600154340ustar00rootroot00000000000000rok,firma,typ, poznamka,najezd 1995,Opel,Vectra,"klimatizace, střešní okno",45000 1998,Škoda,"Felicia ""Fun""",,80000 2002,Škoda,Octavia,"klimatizace, ABS bouraná",70000 pspg-2.6.6/tests/test5.csv000066400000000000000000000002201360716715600154270ustar00rootroot00000000000000rok,firma,typ, poznamka 1995,Opel,Vectra,"klimatizace, střešní okno" 1998,Škoda,"Felicia ""Fun""",ss 2002,Škoda,Octavia,"klimatizace, ABS" pspg-2.6.6/tests/test6.csv000066400000000000000000000002311360716715600154320ustar00rootroot00000000000000rok,firma,typ, poznamka 1995,Opel,Vectra,"klimatizace, střešní okno" 1998,Škoda,"Felicia ""Fun""", ss 2002,Škoda,Octavia,"klimatizace, ABS bourana" pspg-2.6.6/tests/test7.csv000066400000000000000000000002221360716715600154330ustar00rootroot000000000000001995,Opel,Vectra,"klimatizace, střešní okno",45000 1998,Škoda,"Felicia ""Fun""",,80000 2002,Škoda,Octavia,"klimatizace, ABS bouraná",70000 pspg-2.6.6/tests/test8.csv000066400000000000000000000000331360716715600154340ustar00rootroot0000000000000010,20,20,40,50 1,20,3 1,2 pspg-2.6.6/tools/000077500000000000000000000000001360716715600136525ustar00rootroot00000000000000pspg-2.6.6/tools/ax_debug_cflags.m4000066400000000000000000000020661360716715600172150ustar00rootroot00000000000000# gcc default/debug CFLAGS handling respecting user's CFLAGS # avoid AC_PROG_CC setting -O2 CFLAGS which will override DEBUG_CFLAGS' -O0 # must be used right after AC_INIT AC_DEFUN([AX_DEBUG_CFLAGS], [ # ensure CFLAGS are set AS_IF([test "${CFLAGS+set}"], [ USE_DEFAULT_CFLAGS=false ], [ USE_DEFAULT_CFLAGS=true CFLAGS="" ]) AC_PROG_CC # add --enable-debug arg AC_ARG_ENABLE([debug], AS_HELP_STRING([--enable-debug], [enable debug build]), [], []) AS_IF([test "$enable_debug" = "yes"], [ # add the DEBUG pre-processor define AC_DEFINE([DEBUG], [1], [debug build]) # gcc/gdb debug options AS_IF([test "$GCC" = "yes"], [ DEBUG_CFLAGS="-ggdb -O0" ], [ ACX_DEBUG_CFLAGS_G ]) ], [ # what AC_PROG_CC would have done if CFLAGS were not set AS_IF([$USE_DEFAULT_CFLAGS], [ ACX_DEBUG_CFLAGS_G AS_IF([test "$GCC" = "yes"], [ DEBUG_CFLAGS="$DEBUG_CFLAGS -O2" ]) ]) ]) AC_SUBST([DEBUG_CFLAGS], [$DEBUG_CFLAGS]) ]) AC_DEFUN([ACX_DEBUG_CFLAGS_G], [ # default to -g AS_IF([test "$ac_cv_prog_cc_g" = "yes"], [ DEBUG_CFLAGS="-g" ], [ DEBUG_CFLAGS="" ]) ]) pspg-2.6.6/tools/ax_lib_readline.m4000066400000000000000000000074471360716715600172310ustar00rootroot00000000000000# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_lib_readline.html # =========================================================================== # # SYNOPSIS # # AX_LIB_READLINE # # DESCRIPTION # # Searches for a readline compatible library. If found, defines # `HAVE_LIBREADLINE'. If the found library has the `add_history' function, # sets also `HAVE_READLINE_HISTORY'. Also checks for the locations of the # necessary include files and sets `HAVE_READLINE_H' or # `HAVE_READLINE_READLINE_H' and `HAVE_READLINE_HISTORY_H' or # 'HAVE_HISTORY_H' if the corresponding include files exists. # # The libraries that may be readline compatible are `libedit', # `libeditline' and `libreadline'. Sometimes we need to link a termcap # library for readline to work, this macro tests these cases too by trying # to link with `libtermcap', `libcurses' or `libncurses' before giving up. # # Here is an example of how to use the information provided by this macro # to perform the necessary includes or declarations in a C file: # # #ifdef HAVE_LIBREADLINE # # if defined(HAVE_READLINE_READLINE_H) # # include # # elif defined(HAVE_READLINE_H) # # include # # else /* !defined(HAVE_READLINE_H) */ # extern char *readline (); # # endif /* !defined(HAVE_READLINE_H) */ # char *cmdline = NULL; # #else /* !defined(HAVE_READLINE_READLINE_H) */ # /* no readline */ # #endif /* HAVE_LIBREADLINE */ # # #ifdef HAVE_READLINE_HISTORY # # if defined(HAVE_READLINE_HISTORY_H) # # include # # elif defined(HAVE_HISTORY_H) # # include # # else /* !defined(HAVE_HISTORY_H) */ # extern void add_history (); # extern int write_history (); # extern int read_history (); # # endif /* defined(HAVE_READLINE_HISTORY_H) */ # /* no history */ # #endif /* HAVE_READLINE_HISTORY */ # # LICENSE # # Copyright (c) 2008 Ville Laurikari # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 7 AU_ALIAS([VL_LIB_READLINE], [AX_LIB_READLINE]) AC_DEFUN([AX_LIB_READLINE], [ AC_CACHE_CHECK([for a readline compatible library], ax_cv_lib_readline, [ ORIG_LIBS="$LIBS" for readline_lib in readline edit editline; do for termcap_lib in "" termcap curses ncurses; do if test -z "$termcap_lib"; then TRY_LIB="-l$readline_lib" else TRY_LIB="-l$readline_lib -l$termcap_lib" fi LIBS="$ORIG_LIBS $TRY_LIB" AC_TRY_LINK_FUNC(readline, ax_cv_lib_readline="$TRY_LIB") if test -n "$ax_cv_lib_readline"; then break fi done if test -n "$ax_cv_lib_readline"; then break fi done if test -z "$ax_cv_lib_readline"; then ax_cv_lib_readline="no" fi LIBS="$ORIG_LIBS" ]) if test "$ax_cv_lib_readline" != "no"; then LIBS="$LIBS $ax_cv_lib_readline" AC_DEFINE(HAVE_LIBREADLINE, 1, [Define if you have a readline compatible library]) AC_CHECK_HEADERS(readline.h readline/readline.h) AC_CACHE_CHECK([whether readline supports history], ax_cv_lib_readline_history, [ ax_cv_lib_readline_history="no" AC_TRY_LINK_FUNC(add_history, ax_cv_lib_readline_history="yes") ]) if test "$ax_cv_lib_readline_history" = "yes"; then AC_DEFINE(HAVE_READLINE_HISTORY, 1, [Define if your readline library has \`add_history']) AC_CHECK_HEADERS(history.h readline/history.h) fi fi ])dnl pspg-2.6.6/tools/ax_require_defined.m4000066400000000000000000000023011360716715600177320ustar00rootroot00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_require_defined.html # =========================================================================== # # SYNOPSIS # # AX_REQUIRE_DEFINED(MACRO) # # DESCRIPTION # # AX_REQUIRE_DEFINED is a simple helper for making sure other macros have # been defined and thus are available for use. This avoids random issues # where a macro isn't expanded. Instead the configure script emits a # non-fatal: # # ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found # # It's like AC_REQUIRE except it doesn't expand the required macro. # # Here's an example: # # AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG]) # # LICENSE # # Copyright (c) 2014 Mike Frysinger # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 1 AC_DEFUN([AX_REQUIRE_DEFINED], [dnl m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])]) ])dnl AX_REQUIRE_DEFINED pspg-2.6.6/tools/ax_with_curses.m4000066400000000000000000000664231360716715600171560ustar00rootroot00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_with_curses.html # =========================================================================== # # SYNOPSIS # # AX_WITH_CURSES # # DESCRIPTION # # This macro checks whether a SysV or X/Open-compatible Curses library is # present, along with the associated header file. The NcursesW # (wide-character) library is searched for first, followed by Ncurses, # then the system-default plain Curses. The first library found is the # one returned. Finding libraries will first be attempted by using # pkg-config, and should the pkg-config files not be available, will # fallback to combinations of known flags itself. # # The following options are understood: --with-ncursesw, --with-ncurses, # --without-ncursesw, --without-ncurses. The "--with" options force the # macro to use that particular library, terminating with an error if not # found. The "--without" options simply skip the check for that library. # The effect on the search pattern is: # # (no options) - NcursesW, Ncurses, Curses # --with-ncurses --with-ncursesw - NcursesW only [*] # --without-ncurses --with-ncursesw - NcursesW only [*] # --with-ncursesw - NcursesW only [*] # --with-ncurses --without-ncursesw - Ncurses only [*] # --with-ncurses - NcursesW, Ncurses [**] # --without-ncurses --without-ncursesw - Curses only # --without-ncursesw - Ncurses, Curses # --without-ncurses - NcursesW, Curses # # [*] If the library is not found, abort the configure script. # # [**] If the second library (Ncurses) is not found, abort configure. # # The following preprocessor symbols may be defined by this macro if the # appropriate conditions are met: # # HAVE_CURSES - if any SysV or X/Open Curses library found # HAVE_CURSES_ENHANCED - if library supports X/Open Enhanced functions # HAVE_CURSES_COLOR - if library supports color (enhanced functions) # HAVE_CURSES_OBSOLETE - if library supports certain obsolete features # HAVE_NCURSESW - if NcursesW (wide char) library is to be used # HAVE_NCURSES - if the Ncurses library is to be used # # HAVE_CURSES_H - if is present and should be used # HAVE_NCURSESW_H - if should be used # HAVE_NCURSES_H - if should be used # HAVE_NCURSESW_CURSES_H - if should be used # HAVE_NCURSES_CURSES_H - if should be used # # (These preprocessor symbols are discussed later in this document.) # # The following output variables are defined by this macro; they are # precious and may be overridden on the ./configure command line: # # CURSES_LIBS - library to add to xxx_LDADD # CURSES_CFLAGS - include paths to add to xxx_CPPFLAGS # # In previous versions of this macro, the flags CURSES_LIB and # CURSES_CPPFLAGS were defined. These have been renamed, in keeping with # AX_WITH_CURSES's close bigger brother, PKG_CHECK_MODULES, which should # eventually supersede the use of AX_WITH_CURSES. Neither the library # listed in CURSES_LIBS, nor the flags in CURSES_CFLAGS are added to LIBS, # respectively CPPFLAGS, by default. You need to add both to the # appropriate xxx_LDADD/xxx_CPPFLAGS line in your Makefile.am. For # example: # # prog_LDADD = @CURSES_LIBS@ # prog_CPPFLAGS = @CURSES_CFLAGS@ # # If CURSES_LIBS is set on the configure command line (such as by running # "./configure CURSES_LIBS=-lmycurses"), then the only header searched for # is . If the user needs to specify an alternative path for a # library (such as for a non-standard NcurseW), the user should use the # LDFLAGS variable. # # The following shell variables may be defined by this macro: # # ax_cv_curses - set to "yes" if any Curses library found # ax_cv_curses_enhanced - set to "yes" if Enhanced functions present # ax_cv_curses_color - set to "yes" if color functions present # ax_cv_curses_obsolete - set to "yes" if obsolete features present # # ax_cv_ncursesw - set to "yes" if NcursesW library found # ax_cv_ncurses - set to "yes" if Ncurses library found # ax_cv_plaincurses - set to "yes" if plain Curses library found # ax_cv_curses_which - set to "ncursesw", "ncurses", "plaincurses" or "no" # # These variables can be used in your configure.ac to determine the level # of support you need from the Curses library. For example, if you must # have either Ncurses or NcursesW, you could include: # # AX_WITH_CURSES # if test "x$ax_cv_ncursesw" != xyes && test "x$ax_cv_ncurses" != xyes; then # AC_MSG_ERROR([requires either NcursesW or Ncurses library]) # fi # # If any Curses library will do (but one must be present and must support # color), you could use: # # AX_WITH_CURSES # if test "x$ax_cv_curses" != xyes || test "x$ax_cv_curses_color" != xyes; then # AC_MSG_ERROR([requires an X/Open-compatible Curses library with color]) # fi # # Certain preprocessor symbols and shell variables defined by this macro # can be used to determine various features of the Curses library. In # particular, HAVE_CURSES and ax_cv_curses are defined if the Curses # library found conforms to the traditional SysV and/or X/Open Base Curses # definition. Any working Curses library conforms to this level. # # HAVE_CURSES_ENHANCED and ax_cv_curses_enhanced are defined if the # library supports the X/Open Enhanced Curses definition. In particular, # the wide-character types attr_t, cchar_t and wint_t, the functions # wattr_set() and wget_wch() and the macros WA_NORMAL and _XOPEN_CURSES # are checked. The Ncurses library does NOT conform to this definition, # although NcursesW does. # # HAVE_CURSES_COLOR and ax_cv_curses_color are defined if the library # supports color functions and macros such as COLOR_PAIR, A_COLOR, # COLOR_WHITE, COLOR_RED and init_pair(). These are NOT part of the # X/Open Base Curses definition, but are part of the Enhanced set of # functions. The Ncurses library DOES support these functions, as does # NcursesW. # # HAVE_CURSES_OBSOLETE and ax_cv_curses_obsolete are defined if the # library supports certain features present in SysV and BSD Curses but not # defined in the X/Open definition. In particular, the functions # getattrs(), getcurx() and getmaxx() are checked. # # To use the HAVE_xxx_H preprocessor symbols, insert the following into # your system.h (or equivalent) header file: # # #if defined HAVE_NCURSESW_CURSES_H # # include # #elif defined HAVE_NCURSESW_H # # include # #elif defined HAVE_NCURSES_CURSES_H # # include # #elif defined HAVE_NCURSES_H # # include # #elif defined HAVE_CURSES_H # # include # #else # # error "SysV or X/Open-compatible Curses header file required" # #endif # # For previous users of this macro: you should not need to change anything # in your configure.ac or Makefile.am, as the previous (serial 10) # semantics are still valid. However, you should update your system.h (or # equivalent) header file to the fragment shown above. You are encouraged # also to make use of the extended functionality provided by this version # of AX_WITH_CURSES, as well as in the additional macros # AX_WITH_CURSES_PANEL, AX_WITH_CURSES_MENU and AX_WITH_CURSES_FORM. # # LICENSE # # Copyright (c) 2009 Mark Pulford # Copyright (c) 2009 Damian Pietras # Copyright (c) 2012 Reuben Thomas # Copyright (c) 2011 John Zaitseff # # 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 3 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, see . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 17 # internal function to factorize common code that is used by both ncurses # and ncursesw AC_DEFUN([_FIND_CURSES_FLAGS], [ AC_MSG_CHECKING([for $1 via pkg-config]) AX_REQUIRE_DEFINED([PKG_CHECK_EXISTS]) _PKG_CONFIG([_ax_cv_$1_libs], [libs], [$1]) _PKG_CONFIG([_ax_cv_$1_cppflags], [cflags], [$1]) AS_IF([test "x$pkg_failed" = "xyes" || test "x$pkg_failed" = "xuntried"],[ AC_MSG_RESULT([no]) # No suitable .pc file found, have to find flags via fallback AC_CACHE_CHECK([for $1 via fallback], [ax_cv_$1], [ AS_ECHO() pkg_cv__ax_cv_$1_libs="-l$1" pkg_cv__ax_cv_$1_cppflags="-D_GNU_SOURCE $CURSES_CFLAGS" LIBS="$ax_saved_LIBS $pkg_cv__ax_cv_$1_libs" CPPFLAGS="$ax_saved_CPPFLAGS $pkg_cv__ax_cv_$1_cppflags" AC_MSG_CHECKING([for initscr() with $pkg_cv__ax_cv_$1_libs]) AC_LINK_IFELSE([AC_LANG_CALL([], [initscr])], [ AC_MSG_RESULT([yes]) AC_MSG_CHECKING([for nodelay() with $pkg_cv__ax_cv_$1_libs]) AC_LINK_IFELSE([AC_LANG_CALL([], [nodelay])],[ ax_cv_$1=yes ],[ AC_MSG_RESULT([no]) m4_if( [$1],[ncursesw],[pkg_cv__ax_cv_$1_libs="$pkg_cv__ax_cv_$1_libs -ltinfow"], [$1],[ncurses],[pkg_cv__ax_cv_$1_libs="$pkg_cv__ax_cv_$1_libs -ltinfo"] ) LIBS="$ax_saved_LIBS $pkg_cv__ax_cv_$1_libs" AC_MSG_CHECKING([for nodelay() with $pkg_cv__ax_cv_$1_libs]) AC_LINK_IFELSE([AC_LANG_CALL([], [nodelay])],[ ax_cv_$1=yes ],[ ax_cv_$1=no ]) ]) ],[ ax_cv_$1=no ]) ]) ],[ AC_MSG_RESULT([yes]) # Found .pc file, using its information LIBS="$ax_saved_LIBS $pkg_cv__ax_cv_$1_libs" CPPFLAGS="$ax_saved_CPPFLAGS $pkg_cv__ax_cv_$1_cppflags" ax_cv_$1=yes ]) ]) AU_ALIAS([MP_WITH_CURSES], [AX_WITH_CURSES]) AC_DEFUN([AX_WITH_CURSES], [ AC_ARG_VAR([CURSES_LIBS], [linker library for Curses, e.g. -lcurses]) AC_ARG_VAR([CURSES_CFLAGS], [preprocessor flags for Curses, e.g. -I/usr/include/ncursesw]) AC_ARG_WITH([ncurses], [AS_HELP_STRING([--with-ncurses], [force the use of Ncurses or NcursesW])], [], [with_ncurses=check]) AC_ARG_WITH([ncursesw], [AS_HELP_STRING([--without-ncursesw], [do not use NcursesW (wide character support)])], [], [with_ncursesw=check]) ax_saved_LIBS=$LIBS ax_saved_CPPFLAGS=$CPPFLAGS AS_IF([test "x$with_ncurses" = xyes || test "x$with_ncursesw" = xyes], [ax_with_plaincurses=no], [ax_with_plaincurses=check]) ax_cv_curses_which=no # Test for NcursesW AS_IF([test "x$CURSES_LIBS" = x && test "x$with_ncursesw" != xno], [ _FIND_CURSES_FLAGS([ncursesw]) AS_IF([test "x$ax_cv_ncursesw" = xno && test "x$with_ncursesw" = xyes], [ AC_MSG_ERROR([--with-ncursesw specified but could not find NcursesW library]) ]) AS_IF([test "x$ax_cv_ncursesw" = xyes], [ ax_cv_curses=yes ax_cv_curses_which=ncursesw CURSES_LIBS="$pkg_cv__ax_cv_ncursesw_libs" CURSES_CFLAGS="$pkg_cv__ax_cv_ncursesw_cppflags" AC_DEFINE([HAVE_NCURSESW], [1], [Define to 1 if the NcursesW library is present]) AC_DEFINE([HAVE_CURSES], [1], [Define to 1 if a SysV or X/Open compatible Curses library is present]) AC_CACHE_CHECK([for working ncursesw/curses.h], [ax_cv_header_ncursesw_curses_h], [ AC_LINK_IFELSE([AC_LANG_PROGRAM([[ @%:@define _XOPEN_SOURCE_EXTENDED 1 @%:@include ]], [[ chtype a = A_BOLD; int b = KEY_LEFT; chtype c = COLOR_PAIR(1) & A_COLOR; attr_t d = WA_NORMAL; cchar_t e; wint_t f; int g = getattrs(stdscr); int h = getcurx(stdscr) + getmaxx(stdscr); initscr(); init_pair(1, COLOR_WHITE, COLOR_RED); wattr_set(stdscr, d, 0, NULL); wget_wch(stdscr, &f); ]])], [ax_cv_header_ncursesw_curses_h=yes], [ax_cv_header_ncursesw_curses_h=no]) ]) AS_IF([test "x$ax_cv_header_ncursesw_curses_h" = xyes], [ ax_cv_curses_enhanced=yes ax_cv_curses_color=yes ax_cv_curses_obsolete=yes AC_DEFINE([HAVE_CURSES_ENHANCED], [1], [Define to 1 if library supports X/Open Enhanced functions]) AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)]) AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features]) AC_DEFINE([HAVE_NCURSESW_CURSES_H], [1], [Define to 1 if is present]) ]) AC_CACHE_CHECK([for working ncursesw.h], [ax_cv_header_ncursesw_h], [ AC_LINK_IFELSE([AC_LANG_PROGRAM([[ @%:@define _XOPEN_SOURCE_EXTENDED 1 @%:@include ]], [[ chtype a = A_BOLD; int b = KEY_LEFT; chtype c = COLOR_PAIR(1) & A_COLOR; attr_t d = WA_NORMAL; cchar_t e; wint_t f; int g = getattrs(stdscr); int h = getcurx(stdscr) + getmaxx(stdscr); initscr(); init_pair(1, COLOR_WHITE, COLOR_RED); wattr_set(stdscr, d, 0, NULL); wget_wch(stdscr, &f); ]])], [ax_cv_header_ncursesw_h=yes], [ax_cv_header_ncursesw_h=no]) ]) AS_IF([test "x$ax_cv_header_ncursesw_h" = xyes], [ ax_cv_curses_enhanced=yes ax_cv_curses_color=yes ax_cv_curses_obsolete=yes AC_DEFINE([HAVE_CURSES_ENHANCED], [1], [Define to 1 if library supports X/Open Enhanced functions]) AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)]) AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features]) AC_DEFINE([HAVE_NCURSESW_H], [1], [Define to 1 if is present]) ]) AC_CACHE_CHECK([for working ncurses.h], [ax_cv_header_ncurses_h_with_ncursesw], [ AC_LINK_IFELSE([AC_LANG_PROGRAM([[ @%:@define _XOPEN_SOURCE_EXTENDED 1 @%:@include ]], [[ chtype a = A_BOLD; int b = KEY_LEFT; chtype c = COLOR_PAIR(1) & A_COLOR; attr_t d = WA_NORMAL; cchar_t e; wint_t f; int g = getattrs(stdscr); int h = getcurx(stdscr) + getmaxx(stdscr); initscr(); init_pair(1, COLOR_WHITE, COLOR_RED); wattr_set(stdscr, d, 0, NULL); wget_wch(stdscr, &f); ]])], [ax_cv_header_ncurses_h_with_ncursesw=yes], [ax_cv_header_ncurses_h_with_ncursesw=no]) ]) AS_IF([test "x$ax_cv_header_ncurses_h_with_ncursesw" = xyes], [ ax_cv_curses_enhanced=yes ax_cv_curses_color=yes ax_cv_curses_obsolete=yes AC_DEFINE([HAVE_CURSES_ENHANCED], [1], [Define to 1 if library supports X/Open Enhanced functions]) AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)]) AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features]) AC_DEFINE([HAVE_NCURSES_H], [1], [Define to 1 if is present]) ]) AS_IF([test "x$ax_cv_header_ncursesw_curses_h" = xno && test "x$ax_cv_header_ncursesw_h" = xno && test "x$ax_cv_header_ncurses_h_with_ncursesw" = xno], [ AC_MSG_WARN([could not find a working ncursesw/curses.h, ncursesw.h or ncurses.h]) ]) ]) ]) unset pkg_cv__ax_cv_ncursesw_libs unset pkg_cv__ax_cv_ncursesw_cppflags # Test for Ncurses AS_IF([test "x$CURSES_LIBS" = x && test "x$with_ncurses" != xno && test "x$ax_cv_curses_which" = xno], [ _FIND_CURSES_FLAGS([ncurses]) AS_IF([test "x$ax_cv_ncurses" = xno && test "x$with_ncurses" = xyes], [ AC_MSG_ERROR([--with-ncurses specified but could not find Ncurses library]) ]) AS_IF([test "x$ax_cv_ncurses" = xyes], [ ax_cv_curses=yes ax_cv_curses_which=ncurses CURSES_LIBS="$pkg_cv__ax_cv_ncurses_libs" CURSES_CFLAGS="$pkg_cv__ax_cv_ncurses_cppflags" AC_DEFINE([HAVE_NCURSES], [1], [Define to 1 if the Ncurses library is present]) AC_DEFINE([HAVE_CURSES], [1], [Define to 1 if a SysV or X/Open compatible Curses library is present]) AC_CACHE_CHECK([for working ncurses/curses.h], [ax_cv_header_ncurses_curses_h], [ AC_LINK_IFELSE([AC_LANG_PROGRAM([[ @%:@include ]], [[ chtype a = A_BOLD; int b = KEY_LEFT; chtype c = COLOR_PAIR(1) & A_COLOR; int g = getattrs(stdscr); int h = getcurx(stdscr) + getmaxx(stdscr); initscr(); init_pair(1, COLOR_WHITE, COLOR_RED); ]])], [ax_cv_header_ncurses_curses_h=yes], [ax_cv_header_ncurses_curses_h=no]) ]) AS_IF([test "x$ax_cv_header_ncurses_curses_h" = xyes], [ ax_cv_curses_color=yes ax_cv_curses_obsolete=yes AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)]) AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features]) AC_DEFINE([HAVE_NCURSES_CURSES_H], [1], [Define to 1 if is present]) ]) AC_CACHE_CHECK([for working ncurses.h], [ax_cv_header_ncurses_h], [ AC_LINK_IFELSE([AC_LANG_PROGRAM([[ @%:@include ]], [[ chtype a = A_BOLD; int b = KEY_LEFT; chtype c = COLOR_PAIR(1) & A_COLOR; int g = getattrs(stdscr); int h = getcurx(stdscr) + getmaxx(stdscr); initscr(); init_pair(1, COLOR_WHITE, COLOR_RED); ]])], [ax_cv_header_ncurses_h=yes], [ax_cv_header_ncurses_h=no]) ]) AS_IF([test "x$ax_cv_header_ncurses_h" = xyes], [ ax_cv_curses_color=yes ax_cv_curses_obsolete=yes AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)]) AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features]) AC_DEFINE([HAVE_NCURSES_H], [1], [Define to 1 if is present]) ]) AS_IF([test "x$ax_cv_header_ncurses_curses_h" = xno && test "x$ax_cv_header_ncurses_h" = xno], [ AC_MSG_WARN([could not find a working ncurses/curses.h or ncurses.h]) ]) ]) ]) unset pkg_cv__ax_cv_ncurses_libs unset pkg_cv__ax_cv_ncurses_cppflags # Test for plain Curses (or if CURSES_LIBS was set by user) AS_IF([test "x$with_plaincurses" != xno && test "x$ax_cv_curses_which" = xno], [ AS_IF([test "x$CURSES_LIBS" != x], [ LIBS="$ax_saved_LIBS $CURSES_LIBS" ], [ LIBS="$ax_saved_LIBS -lcurses" ]) AC_CACHE_CHECK([for Curses library], [ax_cv_plaincurses], [ AC_LINK_IFELSE([AC_LANG_CALL([], [initscr])], [ax_cv_plaincurses=yes], [ax_cv_plaincurses=no]) ]) AS_IF([test "x$ax_cv_plaincurses" = xyes], [ ax_cv_curses=yes ax_cv_curses_which=plaincurses AS_IF([test "x$CURSES_LIBS" = x], [ CURSES_LIBS="-lcurses" ]) AC_DEFINE([HAVE_CURSES], [1], [Define to 1 if a SysV or X/Open compatible Curses library is present]) # Check for base conformance (and header file) AC_CACHE_CHECK([for working curses.h], [ax_cv_header_curses_h], [ AC_LINK_IFELSE([AC_LANG_PROGRAM([[ @%:@include ]], [[ chtype a = A_BOLD; int b = KEY_LEFT; initscr(); ]])], [ax_cv_header_curses_h=yes], [ax_cv_header_curses_h=no]) ]) AS_IF([test "x$ax_cv_header_curses_h" = xyes], [ AC_DEFINE([HAVE_CURSES_H], [1], [Define to 1 if is present]) # Check for X/Open Enhanced conformance AC_CACHE_CHECK([for X/Open Enhanced Curses conformance], [ax_cv_plaincurses_enhanced], [ AC_LINK_IFELSE([AC_LANG_PROGRAM([[ @%:@define _XOPEN_SOURCE_EXTENDED 1 @%:@include @%:@ifndef _XOPEN_CURSES @%:@error "this Curses library is not enhanced" "this Curses library is not enhanced" @%:@endif ]], [[ chtype a = A_BOLD; int b = KEY_LEFT; chtype c = COLOR_PAIR(1) & A_COLOR; attr_t d = WA_NORMAL; cchar_t e; wint_t f; initscr(); init_pair(1, COLOR_WHITE, COLOR_RED); wattr_set(stdscr, d, 0, NULL); wget_wch(stdscr, &f); ]])], [ax_cv_plaincurses_enhanced=yes], [ax_cv_plaincurses_enhanced=no]) ]) AS_IF([test "x$ax_cv_plaincurses_enhanced" = xyes], [ ax_cv_curses_enhanced=yes ax_cv_curses_color=yes AC_DEFINE([HAVE_CURSES_ENHANCED], [1], [Define to 1 if library supports X/Open Enhanced functions]) AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)]) ]) # Check for color functions AC_CACHE_CHECK([for Curses color functions], [ax_cv_plaincurses_color], [ AC_LINK_IFELSE([AC_LANG_PROGRAM([[ @%:@define _XOPEN_SOURCE_EXTENDED 1 @%:@include ]], [[ chtype a = A_BOLD; int b = KEY_LEFT; chtype c = COLOR_PAIR(1) & A_COLOR; initscr(); init_pair(1, COLOR_WHITE, COLOR_RED); ]])], [ax_cv_plaincurses_color=yes], [ax_cv_plaincurses_color=no]) ]) AS_IF([test "x$ax_cv_plaincurses_color" = xyes], [ ax_cv_curses_color=yes AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)]) ]) # Check for obsolete functions AC_CACHE_CHECK([for obsolete Curses functions], [ax_cv_plaincurses_obsolete], [ AC_LINK_IFELSE([AC_LANG_PROGRAM([[ @%:@include ]], [[ chtype a = A_BOLD; int b = KEY_LEFT; int g = getattrs(stdscr); int h = getcurx(stdscr) + getmaxx(stdscr); initscr(); ]])], [ax_cv_plaincurses_obsolete=yes], [ax_cv_plaincurses_obsolete=no]) ]) AS_IF([test "x$ax_cv_plaincurses_obsolete" = xyes], [ ax_cv_curses_obsolete=yes AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features]) ]) ]) AS_IF([test "x$ax_cv_header_curses_h" = xno], [ AC_MSG_WARN([could not find a working curses.h]) ]) ]) ]) AS_IF([test "x$ax_cv_curses" != xyes], [ax_cv_curses=no]) AS_IF([test "x$ax_cv_curses_enhanced" != xyes], [ax_cv_curses_enhanced=no]) AS_IF([test "x$ax_cv_curses_color" != xyes], [ax_cv_curses_color=no]) AS_IF([test "x$ax_cv_curses_obsolete" != xyes], [ax_cv_curses_obsolete=no]) LIBS=$ax_saved_LIBS CPPFLAGS=$ax_saved_CPPFLAGS unset ax_saved_LIBS unset ax_saved_CPPFLAGS ])dnl pspg-2.6.6/tools/install.sh000077500000000000000000000020411360716715600156540ustar00rootroot00000000000000#!/bin/sh # # Install data or executable file. # # Usage: $0 {data|bin} src dest # # Copyright (c) 2014 Jonas Fonseca # # 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. set -e data="$1" src="$2" dest="$3" mode=0755 trash= case "$data" in data) mode=0644 esac install -d "$dest" if [ "$V" = "@" ]; then echo "$src -> $dest" fi # Replace fake /etc-path case "$src" in doc/*) dest="$dest/$(basename "$src")" sed "s#++SYSCONFDIR++#${sysconfdir}#" < "$src" > "$src+" trash="$src+" src="$src+" esac install -p -m "$mode" "$src" "$dest" if [ -n "$trash" ]; then rm -f "$trash" fi pspg-2.6.6/tools/m4_ax_compare_version.m4000066400000000000000000000146531360716715600204100ustar00rootroot00000000000000# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_compare_version.html # =========================================================================== # # SYNOPSIS # # AX_COMPARE_VERSION(VERSION_A, OP, VERSION_B, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) # # DESCRIPTION # # This macro compares two version strings. Due to the various number of # minor-version numbers that can exist, and the fact that string # comparisons are not compatible with numeric comparisons, this is not # necessarily trivial to do in a autoconf script. This macro makes doing # these comparisons easy. # # The six basic comparisons are available, as well as checking equality # limited to a certain number of minor-version levels. # # The operator OP determines what type of comparison to do, and can be one # of: # # eq - equal (test A == B) # ne - not equal (test A != B) # le - less than or equal (test A <= B) # ge - greater than or equal (test A >= B) # lt - less than (test A < B) # gt - greater than (test A > B) # # Additionally, the eq and ne operator can have a number after it to limit # the test to that number of minor versions. # # eq0 - equal up to the length of the shorter version # ne0 - not equal up to the length of the shorter version # eqN - equal up to N sub-version levels # neN - not equal up to N sub-version levels # # When the condition is true, shell commands ACTION-IF-TRUE are run, # otherwise shell commands ACTION-IF-FALSE are run. The environment # variable 'ax_compare_version' is always set to either 'true' or 'false' # as well. # # Examples: # # AX_COMPARE_VERSION([3.15.7],[lt],[3.15.8]) # AX_COMPARE_VERSION([3.15],[lt],[3.15.8]) # # would both be true. # # AX_COMPARE_VERSION([3.15.7],[eq],[3.15.8]) # AX_COMPARE_VERSION([3.15],[gt],[3.15.8]) # # would both be false. # # AX_COMPARE_VERSION([3.15.7],[eq2],[3.15.8]) # # would be true because it is only comparing two minor versions. # # AX_COMPARE_VERSION([3.15.7],[eq0],[3.15]) # # would be true because it is only comparing the lesser number of minor # versions of the two values. # # Note: The characters that separate the version numbers do not matter. An # empty string is the same as version 0. OP is evaluated by autoconf, not # configure, so must be a string, not a variable. # # The author would like to acknowledge Guido Draheim whose advice about # the m4_case and m4_ifvaln functions make this macro only include the # portions necessary to perform the specific comparison specified by the # OP argument in the final configure script. # # LICENSE # # Copyright (c) 2008 Tim Toolan # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 13 dnl ######################################################################### AC_DEFUN([AX_COMPARE_VERSION], [ AC_REQUIRE([AC_PROG_AWK]) # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. AS_VAR_PUSHDEF([A],[ax_compare_version_A]) A=`echo "$1" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/[[^0-9]]//g'` AS_VAR_PUSHDEF([B],[ax_compare_version_B]) B=`echo "$3" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/[[^0-9]]//g'` dnl # In the case of le, ge, lt, and gt, the strings are sorted as necessary dnl # then the first line is used to determine if the condition is true. dnl # The sed right after the echo is to remove any indented white space. m4_case(m4_tolower($2), [lt],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/false/;s/x${B}/true/;1q"` ], [gt],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort | sed "s/x${A}/false/;s/x${B}/true/;1q"` ], [le],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort | sed "s/x${A}/true/;s/x${B}/false/;1q"` ], [ge],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/true/;s/x${B}/false/;1q"` ],[ dnl Split the operator from the subversion count if present. m4_bmatch(m4_substr($2,2), [0],[ # A count of zero means use the length of the shorter version. # Determine the number of characters in A and B. ax_compare_version_len_A=`echo "$A" | $AWK '{print(length)}'` ax_compare_version_len_B=`echo "$B" | $AWK '{print(length)}'` # Set A to no more than B's length and B to no more than A's length. A=`echo "$A" | sed "s/\(.\{$ax_compare_version_len_B\}\).*/\1/"` B=`echo "$B" | sed "s/\(.\{$ax_compare_version_len_A\}\).*/\1/"` ], [[0-9]+],[ # A count greater than zero means use only that many subversions A=`echo "$A" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` B=`echo "$B" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` ], [.+],[ AC_WARNING( [invalid OP numeric parameter: $2]) ],[]) # Pad zeros at end of numbers to make same length. ax_compare_version_tmp_A="$A`echo $B | sed 's/./0/g'`" B="$B`echo $A | sed 's/./0/g'`" A="$ax_compare_version_tmp_A" # Check for equality or inequality as necessary. m4_case(m4_tolower(m4_substr($2,0,2)), [eq],[ test "x$A" = "x$B" && ax_compare_version=true ], [ne],[ test "x$A" != "x$B" && ax_compare_version=true ],[ AC_WARNING([invalid OP parameter: $2]) ]) ]) AS_VAR_POPDEF([A])dnl AS_VAR_POPDEF([B])dnl dnl # Execute ACTION-IF-TRUE / ACTION-IF-FALSE. if test "$ax_compare_version" = "true" ; then m4_ifvaln([$4],[$4],[:])dnl m4_ifvaln([$5],[else $5])dnl fi ]) dnl AX_COMPARE_VERSION pspg-2.6.6/tools/m4_ax_lib_postgresql.m4000066400000000000000000000212731360716715600202420ustar00rootroot00000000000000# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_lib_postgresql.html # =========================================================================== # # SYNOPSIS # # AX_LIB_POSTGRESQL([MINIMUM-VERSION],[ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) # # DESCRIPTION # # This macro provides tests of availability of PostgreSQL 'libpq' library # of particular version or newer. # # AX_LIB_POSTGRESQL macro takes only one argument which is optional. If # there is no required version passed, then macro does not run version # test. # # The --with-postgresql option takes one of three possible values: # # no - do not check for PostgreSQL client library # # yes - do check for PostgreSQL library in standard locations (pg_config # should be in the PATH) # # path - complete path to pg_config utility, use this option if pg_config # can't be found in the PATH (You could set also PG_CONFIG variable) # # This macro calls: # # AC_SUBST(POSTGRESQL_CPPFLAGS) # AC_SUBST(POSTGRESQL_LDFLAGS) # AC_SUBST(POSTGRESQL_LIBS) # AC_SUBST(POSTGRESQL_VERSION) # # And sets: # # HAVE_POSTGRESQL # # It execute if found ACTION-IF-FOUND (empty by default) and # ACTION-IF-NOT-FOUND (AC_MSG_FAILURE by default) if not found. # # LICENSE # # Copyright (c) 2008 Mateusz Loskot # Copyright (c) 2014 Sree Harsha Totakura # Copyright (c) 2018 Bastien Roucaries # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 22 AC_DEFUN([_AX_LIB_POSTGRESQL_OLD],[ found_postgresql="no" _AX_LIB_POSTGRESQL_OLD_fail="no" while true; do AC_CACHE_CHECK([for the pg_config program], [ac_cv_path_PG_CONFIG], [AC_PATH_PROGS_FEATURE_CHECK([PG_CONFIG], [pg_config], [[ac_cv_path_PG_CONFIG="";$ac_path_PG_CONFIG --includedir > /dev/null \ && ac_cv_path_PG_CONFIG=$ac_path_PG_CONFIG ac_path_PG_CONFIG_found=:]], [ac_cv_path_PG_CONFIG=""])]) PG_CONFIG=$ac_cv_path_PG_CONFIG AS_IF([test "X$PG_CONFIG" = "X"],[break]) AC_CACHE_CHECK([for the PostgreSQL libraries CPPFLAGS],[ac_cv_POSTGRESQL_CPPFLAGS], [ac_cv_POSTGRESQL_CPPFLAGS="-I`$PG_CONFIG --includedir`" || _AX_LIB_POSTGRESQL_OLD_fail=yes]) AS_IF([test "X$_AX_LIB_POSTGRESQL_OLD_fail" = "Xyes"],[break]) POSTGRESQL_CPPFLAGS="$ac_cv_POSTGRESQL_CPPFLAGS" AC_CACHE_CHECK([for the PostgreSQL libraries LDFLAGS],[ac_cv_POSTGRESQL_LDFLAGS], [ac_cv_POSTGRESQL_LDFLAGS="-L`$PG_CONFIG --libdir`" || _AX_LIB_POSTGRESQL_OLD_fail=yes]) AS_IF([test "X$_AX_LIB_POSTGRESQL_OLD_fail" = "Xyes"],[break]) POSTGRESQL_LDFLAGS="$ac_cv_POSTGRESQL_LDFLAGS" AC_CACHE_CHECK([for the PostgreSQL libraries LIBS],[ac_cv_POSTGRESQL_LIBS], [ac_cv_POSTGRESQL_LIBS="-lpq"]) POSTGRESQL_LIBS="$ac_cv_POSTGRESQL_LIBS" AC_CACHE_CHECK([for the PostgreSQL version],[ac_cv_POSTGRESQL_VERSION], [ ac_cv_POSTGRESQL_VERSION=`$PG_CONFIG --version | sed "s/^PostgreSQL[[[:space:]]][[[:space:]]]*\([[0-9.]][[0-9.]]*\).*/\1/"` \ || _AX_LIB_POSTGRESQL_OLD_fail=yes ]) AS_IF([test "X$_AX_LIB_POSTGRESQL_OLD_fail" = "Xyes"],[break]) POSTGRESQL_VERSION="$ac_cv_POSTGRESQL_VERSION" dnl dnl Check if required version of PostgreSQL is available dnl AS_IF([test X"$postgresql_version_req" != "X"],[ AC_MSG_CHECKING([if PostgreSQL version $POSTGRESQL_VERSION is >= $postgresql_version_req]) AX_COMPARE_VERSION([$POSTGRESQL_VERSION],[ge],[$postgresql_version_req], [found_postgresql_req_version=yes],[found_postgresql_req_version=no]) AC_MSG_RESULT([$found_postgresql_req_version]) ]) AS_IF([test "Xfound_postgresql_req_version" = "Xno"],[break]) found_postgresql="yes" break done ]) AC_DEFUN([_AX_LIB_POSTGRESQL_PKG_CONFIG], [ AC_REQUIRE([PKG_PROG_PKG_CONFIG]) found_postgresql=no while true; do PKG_PROG_PKG_CONFIG AS_IF([test X$PKG_CONFIG = X],[break]) _AX_LIB_POSTGRESQL_PKG_CONFIG_fail=no; AS_IF([test "X$postgresql_version_req" = "X"], [PKG_CHECK_EXISTS([libpq],[found_postgresql_pkg_config=yes],[found_postgresql=no])], [PKG_CHECK_EXISTS([libpq >= "$postgresql_version_req"], [found_postgresql=yes],[found_postgresql=no])]) AS_IF([test "X$found_postgresql" = "no"],[break]) AC_CACHE_CHECK([for the PostgreSQL libraries CPPFLAGS],[ac_cv_POSTGRESQL_CPPFLAGS], [ac_cv_POSTGRESQL_CPPFLAGS="`$PKG_CONFIG libpq --cflags-only-I`" || _AX_LIB_POSTGRESQL_PKG_CONFIG_fail=yes]) AS_IF([test "X$_AX_LIB_POSTGRESQL_PKG_CONFIG_fail" = "Xyes"],[break]) POSTGRESQL_CPPFLAGS="$ac_cv_POSTGRESQL_CPPFLAGS" AC_CACHE_CHECK([for the PostgreSQL libraries LDFLAGS],[ac_cv_POSTGRESQL_LDFLAGS], [ac_cv_POSTGRESQL_LDFLAGS="`$PKG_CONFIG libpq --libs-only-L --libs-only-other`" || _AX_LIB_POSTGRESQL_PKG_CONFIG_fail=yes]) AS_IF([test "X$_AX_LIB_POSTGRESQL_PKG_CONFIG_fail" = "Xyes"],[break]) POSTGRESQL_LDFLAGS="$ac_cv_POSTGRESQL_LDFLAGS" AC_CACHE_CHECK([for the PostgreSQL libraries LIBS],[ac_cv_POSTGRESQL_LIBS], [ac_cv_POSTGRESQL_LIBS="`$PKG_CONFIG libpq --libs-only-l`" || _AX_LIB_POSTGRESQL_PKG_CONFIG_fail=ye]) AS_IF([test "X$_AX_LIB_POSTGRESQL_PKG_CONFIG_fail" = "Xyes"],[break]) POSTGRESQL_LIBS="$ac_cv_POSTGRESQL_LIBS" dnl already checked by exist but need to be recovered AC_CACHE_CHECK([for the PostgreSQL version],[ac_cv_POSTGRESQL_VERSION], [ac_cv_POSTGRESQL_VERSION="`$PKG_CONFIG libpq --modversion`" || _AX_LIB_POSTGRESQL_PKG_CONFIG_fail=yes]) AS_IF([test "X$_AX_LIB_POSTGRESQL_PKG_CONFIG_fail" = "Xyes"],[break]) POSTGRESQL_VERSION="$ac_cv_POSTGRESQL_VERSION" found_postgresql=yes break; done ]) AC_DEFUN([AX_LIB_POSTGRESQL], [ AC_ARG_WITH([postgresql], AS_HELP_STRING([--with-postgresql=@<:@ARG@:>@], [use PostgreSQL library @<:@default=yes@:>@, optionally specify path to pg_config] ), [ AS_CASE([$withval], [[[nN]][[oO]]],[want_postgresql="no"], [[[yY]][[eE]][[sS]]],[want_postgresql="yes"], [ want_postgresql="yes" PG_CONFIG="$withval" ]) ], [want_postgresql="yes"] ) AC_ARG_VAR([POSTGRESQL_CPPFLAGS],[cpp flags for PostgreSQL overriding detected flags]) AC_ARG_VAR([POSTGRESQL_LIBFLAGS],[libs for PostgreSQL overriding detected flags]) AC_ARG_VAR([POSTGRESQL_LDFLAGS],[linker flags for PostgreSQL overriding detected flags]) # populate cache AS_IF([test "X$POSTGRESQL_CPPFLAGS" != X],[ac_cv_POSTGRESQL_CPPFLAGS="$POSTGRESQL_CPPFLAGS"]) AS_IF([test "X$POSTGRESQL_LDFLAGS" != X],[ac_cv_POSTGRESQL_LDFLAGS="$POSTGRESQL_LDFLAGS"]) AS_IF([test "X$POSTGRESQL_LIBS" != X],[ac_cv_POSTGRESQL_LIBS="$POSTGRESQL_LIBS"]) postgresql_version_req=ifelse([$1], [], [], [$1]) found_postgresql="no" POSTGRESQL_VERSION="" dnl dnl Check PostgreSQL libraries (libpq) dnl AS_IF([test X"$want_postgresql" = "Xyes"],[ _AX_LIB_POSTGRESQL_PKG_CONFIG AS_IF([test X"$found_postgresql" = "Xno"], [_AX_LIB_POSTGRESQL_OLD]) AS_IF([test X"$found_postgresql" = Xyes],[ _AX_LIB_POSTGRESQL_OLD_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $POSTGRESQL_CPPFLAGS" _AX_LIB_POSTGRESQL_OLD_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $POSTGRESQL_LDFLAGS" _AX_LIB_POSTGRESQL_OLD_LIBS="$LIBS" LIBS="$LIBS $POSTGRESQL_LIBS" while true; do dnl try to compile AC_CHECK_HEADER([libpq-fe.h],[],[found_postgresql=no]) AS_IF([test "X$found_postgresql" = "Xno"],[break]) dnl try now to link AC_CACHE_CHECK([for the PostgreSQL library linking is working],[ac_cv_postgresql_found], [ AC_LINK_IFELSE([ AC_LANG_PROGRAM( [ #include ], [[ char conninfo[]="dbname = postgres"; PGconn *conn; conn = PQconnectdb(conninfo); ]] ) ],[ac_cv_postgresql_found=yes], [ac_cv_postgresql_found=no]) ]) found_postgresql="$ac_cv_postgresql_found" AS_IF([test "X$found_postgresql" = "Xno"],[break]) break done CPPFLAGS="$_AX_LIB_POSTGRESQL_OLD_CPPFLAGS" LDFLAGS="$_AX_LIB_POSTGRESQL_OLD_LDFLAGS" LIBS="$_AX_LIB_POSTGRESQL_OLD_LIBS" ]) AS_IF([test "x$found_postgresql" = "xyes"],[ AC_DEFINE([HAVE_POSTGRESQL], [1], [Define to 1 if PostgreSQL libraries are available])]) ]) AC_SUBST([POSTGRESQL_VERSION]) AC_SUBST([POSTGRESQL_CPPFLAGS]) AC_SUBST([POSTGRESQL_LDFLAGS]) AC_SUBST([POSTGRESQL_LIBS]) AS_IF([test "x$found_postgresql" = "xyes"], [ifelse([$2], , :, [$2])], [ifelse([$3], , AS_IF([test X"$want_postgresql" = "Xyes"],[AC_MSG_ERROR([Library requirements (PostgreSQL) not met.])],[:]), [$3])]) ]) pspg-2.6.6/tools/m4_ax_with_curses_extra.m4000066400000000000000000000240611360716715600207510ustar00rootroot00000000000000# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_with_curses_extra.html # =========================================================================== # # SYNOPSIS # # AX_WITH_CURSES_PANEL # AX_WITH_CURSES_MENU # AX_WITH_CURSES_FORM # # DESCRIPTION # # These macros try to find additional libraries that often come with # SysV-compatible Curses. In particular, the Panel, Menu and Form # libraries are searched, along with their header files. These macros # depend on AX_WITH_CURSES. # # The following preprocessor symbols may be defined by these macros: # # By AX_WITH_CURSES_PANEL: # # HAVE_PANEL - if the Panel library is present # HAVE_PANEL_H - if is present and should be used # HAVE_NCURSES_PANEL_H - if should be used # HAVE_NCURSESW_PANEL_H - if should be used # # By AX_WITH_CURSES_MENU: # # HAVE_MENU - if the Menu library is present # HAVE_MENU_H - if is present and should be used # HAVE_NCURSES_MENU_H - if should be used # HAVE_NCURSESW_MENU_H - if should be used # # By AX_WITH_CURSES_FORM: # # HAVE_FORM - if the Form library is present # HAVE_FORM_H - if is present and should be used # HAVE_NCURSES_FORM_H - if should be used # HAVE_NCURSESW_FORM_H - if should be used # # The following output variables may be defined by these macros; these are # precious and may be overridden on the ./configure command line: # # PANEL_LIBS - library to add to xxx_LDADD before CURSES_LIBS # MENU_LIBS - library to add to xxx_LDADD before CURSES_LIBS # FORM_LIBS - library to add to xxx_LDADD before CURSES_LIBS # # In previous versions of this macro, the flags PANEL_LIB, MENU_LIB and # FORM_LIB were defined. These have been renamed, in keeping with the # variable scheme of PKG_CHECK_MODULES, which should eventually supersede # the use of AX_WITH_CURSES and AX_WITH_CURSES_* macros. These libraries # are NOT added to LIBS by default. You need to add them to the # appropriate xxx_LDADD line in your Makefile.am in front of the # equivalent CURSES_LIBS incantation. For example: # # prog_LDADD = @PANEL_LIBS@ @CURSES_LIBS@ # # If one of the xxx_LIBS variables is set on the configure command line # (such as by running "./configure PANEL_LIBS=-lmypanel"), then the header # file searched must NOT contain a subpath. In this case, in other words, # only would be searched for. The user may use the CPPFLAGS # precious variable to override the standard #include search path. # # The following shell variables may be defined by these macros: # # ax_cv_panel - set to "yes" if Panels library is present # ax_cv_menu - set to "yes" if Menu library is present # ax_cv_form - set to "yes" if Form library is present # # These variables can be used in your configure.ac to determine whether a # library you require is actually present. For example: # # AX_WITH_CURSES # if test "x$ax_cv_curses" != xyes; then # AC_MSG_ERROR([requires a SysV or X/Open-compatible Curses library]) # fi # AX_WITH_CURSES_PANEL # if test "x$ax_cv_panel" != xyes; then # AC_MSG_ERROR([requires the Curses Panel library]) # fi # # To use the HAVE_xxx_H preprocessor symbols, insert the following into # your system.h (or equivalent) header file: # # For AX_WITH_CURSES_PANEL: # # #if defined HAVE_NCURSESW_PANEL_H # # include # #elif defined HAVE_NCURSES_PANEL_H # # include # #elif defined HAVE_PANEL_H # # include # #else # # error "SysV-compatible Curses Panel header file required" # #endif # # For AX_WITH_CURSES_MENU: # # #if defined HAVE_NCURSESW_MENU_H # # include # #elif defined HAVE_NCURSES_MENU_H # # include # #elif defined HAVE_MENU_H # # include # #else # # error "SysV-compatible Curses Menu header file required" # #endif # # For AX_WITH_CURSES_FORM: # # #if defined HAVE_NCURSESW_FORM_H # # include # #elif defined HAVE_NCURSES_FORM_H # # include # #elif defined HAVE_FORM_H # # include # #else # # error "SysV-compatible Curses Form header file required" # #endif # # LICENSE # # Copyright (c) 2011 John Zaitseff # # 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 3 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, see . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 5 AC_DEFUN([_AX_WITH_CURSES_CHECKEXTRA], [ dnl Parameter 1 is the variable name component, using uppercase letters only dnl Parameter 2 is the printable library name dnl Parameter 3 is the C code to try compiling and linking dnl Parameter 4 is the header filename dnl Parameter 5 is the library command line AS_VAR_PUSHDEF([_AX_WITH_CURSES_CHECKEXTRA_have_var], [HAVE_$1])dnl AS_VAR_PUSHDEF([_AX_WITH_CURSES_CHECKEXTRA_cv_var], [ax_cv_[]m4_tolower($1)])dnl AS_VAR_PUSHDEF([_AX_WITH_CURSES_CHECKEXTRA_header_var], [ax_cv_header_$4])dnl AS_VAR_PUSHDEF([_AX_WITH_CURSES_CHECKEXTRA_have_header_var], [HAVE_[]m4_toupper($4)])dnl ax_saved_LIBS=$LIBS ax_saved_CPPFLAGS=$CPPFLAGS AC_CACHE_CHECK([for Curses $2 library with $4], [_AX_WITH_CURSES_CHECKEXTRA_header_var], [ LIBS="$ax_saved_LIBS $5 $CURSES_LIBS" CPPFLAGS="$ax_saved_CPPFLAGS $CURSES_CFLAGS" AC_LINK_IFELSE([AC_LANG_PROGRAM([[ @%:@include <$4> ]], [$3])], [_AX_WITH_CURSES_CHECKEXTRA_header_var=yes], [_AX_WITH_CURSES_CHECKEXTRA_header_var=no]) ]) AS_IF([test "x$[]_AX_WITH_CURSES_CHECKEXTRA_header_var" = xyes], [ _AX_WITH_CURSES_CHECKEXTRA_cv_var=yes AS_LITERAL_IF([$5], [$1_LIBS="$5"]) AC_DEFINE([_AX_WITH_CURSES_CHECKEXTRA_have_var], [1], [Define to 1 if the Curses $2 library is present]) AC_DEFINE([_AX_WITH_CURSES_CHECKEXTRA_have_header_var], [1], [Define to 1 if <$4> is present]) ], [ AS_IF([test "x$[]_AX_WITH_CURSES_CHECKEXTRA_cv_var" = xyes], [], [_AX_WITH_CURSES_CHECKEXTRA_cv_var=no]) ]) LIBS=$ax_saved_LIBS CPPFLAGS=$ax_saved_CPPFLAGS unset ax_saved_LIBS unset ax_saved_CPPFLAGS AS_VAR_POPDEF([_AX_WITH_CURSES_CHECKEXTRA_have_header_var])dnl AS_VAR_POPDEF([_AX_WITH_CURSES_CHECKEXTRA_header_var])dnl AS_VAR_POPDEF([_AX_WITH_CURSES_CHECKEXTRA_cv_var])dnl AS_VAR_POPDEF([_AX_WITH_CURSES_CHECKEXTRA_have_var])dnl ])dnl AC_DEFUN([_AX_WITH_CURSES_EXTRA], [ dnl Parameter 1 is the variable name component, using uppercase letters only dnl Parameter 2 is the printable library name dnl Parameter 3 is the C code to try compiling and linking dnl Parameter 4 is the header filename component dnl Parameter 5 is the NCursesW library command line dnl Parameter 6 is the NCurses library command line dnl Parameter 7 is the plain Curses library command line AC_REQUIRE([AX_WITH_CURSES]) AC_ARG_VAR([$1_LIBS], [linker library for Curses $2, e.g. $7]) AS_IF([test "x$[]$1_LIBS" != x], [ _AX_WITH_CURSES_CHECKEXTRA([$1], [$2], [$3], [$4], [$[]$1_LIBS]) ], [ AS_IF([test "x$ax_cv_curses_which" = xncursesw], [ _AX_WITH_CURSES_CHECKEXTRA([$1], [$2], [$3], [ncursesw/$4], [$5]) AS_IF([test x$[]ax_cv_[]m4_tolower($1) != "xyes"], [ _AX_WITH_CURSES_CHECKEXTRA([$1], [$2], [$3], [$4], [$6]) ]) ], [test "x$ax_cv_curses_which" = xncurses], [ _AX_WITH_CURSES_CHECKEXTRA([$1], [$2], [$3], [$4], [$6]) AS_IF([test x$[]ax_cv_[]m4_tolower($1) != "xyes"], [ _AX_WITH_CURSES_CHECKEXTRA([$1], [$2], [$3], [ncurses/$4], [$6]) ]) ], [test "x$ax_cv_curses_which" = xplaincurses], [ _AX_WITH_CURSES_CHECKEXTRA([$1], [$2], [$3], [$4], [$7]) ]) ]) ])dnl AC_DEFUN([AX_WITH_CURSES_PANEL], [ _AX_WITH_CURSES_EXTRA([PANEL], [Panel], [[ WINDOW *win = newwin(0, 0, 0, 0); PANEL *pan = new_panel(win); ]], [panel.h], [-lpanelw], [-lpanel], [-lpanel]) ])dnl AC_DEFUN([AX_WITH_CURSES_MENU], [ _AX_WITH_CURSES_EXTRA([MENU], [Menu], [[ ITEM **mi; MENU *m = new_menu(mi); ]], [menu.h], [-lmenuw], [-lmenu], [-lmenu]) ])dnl AC_DEFUN([AX_WITH_CURSES_FORM], [ _AX_WITH_CURSES_EXTRA([FORM], [Form], [[ FIELD **ff; FORM *f = new_form(ff); ]], [form.h], [-lformw], [-lform], [-lform]) ])dnl