From 3ba2f6e5c7383c5d7a6f8a1c38b6b5403a8a5dcb Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Fri, 23 Apr 2021 11:09:49 -0400 Subject: [PATCH] Nuke all TCC77x targets: iAudio 7, Sansa C100, M200(v1-3), Logik DAX They were never finished, never saw any release ever, and haven't compiled for the better part of a decade. Given their HW capabilities [1], they are not worth trying to fix. [1] 1-2MB RAM, ~256MB onboard flash, no expandability Change-Id: I7b2a5806d687114c22156bb0458d4a10a9734190 --- apps/SOURCES | 6 - apps/keymaps/keymap-c100.c | 400 ------------------ apps/keymaps/keymap-iaudio67.c | 330 --------------- apps/keymaps/keymap-logikdax.c | 318 -------------- apps/lang/english-us.lang | 6 +- apps/lang/english.lang | 6 +- apps/lang/italiano.lang | 6 +- apps/lang/nederlands.lang | 6 +- apps/lang/polski.lang | 6 +- apps/lang/russian.lang | 6 +- apps/lang/slovak.lang | 6 +- apps/lang/srpski.lang | 6 +- apps/plugins/battery_bench.c | 7 - apps/plugins/calculator.c | 13 - apps/plugins/chessclock.c | 11 - apps/plugins/chopper.c | 6 - apps/plugins/clix.c | 8 - apps/plugins/cube.c | 10 - apps/plugins/doom/i_video.c | 10 - apps/plugins/imageviewer/imageviewer_button.h | 11 - apps/plugins/invadrox.c | 7 - apps/plugins/jewels.c | 10 - apps/plugins/lib/pluginlib_actions.c | 15 - apps/plugins/midi/midiplay.c | 8 - apps/plugins/mp3_encoder.c | 6 - apps/plugins/mpegplayer/mpeg_settings.c | 8 - apps/plugins/mpegplayer/mpegplayer.c | 9 - apps/plugins/pacbox/pacbox.h | 12 - apps/plugins/pictureflow/pictureflow.c | 8 +- apps/plugins/plugin.lds | 12 +- apps/plugins/pong.c | 8 - apps/plugins/reversi/reversi-gui.h | 9 - apps/plugins/rockblox.c | 11 - apps/plugins/sokoban.c | 14 - apps/plugins/stopwatch.c | 9 - apps/plugins/sudoku/sudoku.h | 10 - apps/plugins/text_viewer/tv_button.h | 12 - apps/plugins/xobox.c | 9 - apps/plugins/zxbox/keymaps.h | 8 - apps/plugins/zxbox/zxbox_keyb.c | 9 - bootloader/SOURCES | 2 +- firmware/SOURCES | 67 +-- firmware/drivers/rtc/rtc_tcc77x.c | 81 ---- firmware/drivers/tuner/lv24020lp.c | 10 - firmware/export/config.h | 29 +- firmware/export/config/iaudio7.h | 164 ------- firmware/export/config/logikdax.h | 152 ------- firmware/export/config/sansac100.h | 130 ------ firmware/export/config/sansam200.h | 139 ------ firmware/export/cpu.h | 3 - firmware/export/tcc77x.h | 262 ------------ firmware/target/arm/ata-nand-telechips.c | 9 +- firmware/target/arm/lcd-ssd1815.c | 75 ---- firmware/target/arm/pcm-telechips.c | 18 +- firmware/target/arm/system-arm.h | 2 +- firmware/target/arm/tcc77x/adc-tcc77x.c | 121 ------ firmware/target/arm/tcc77x/app.lds | 99 ----- firmware/target/arm/tcc77x/ata-nand-target.h | 33 -- firmware/target/arm/tcc77x/boot.lds | 63 --- firmware/target/arm/tcc77x/c100/adc-target.h | 26 -- .../target/arm/tcc77x/c100/backlight-target.h | 40 -- firmware/target/arm/tcc77x/c100/button-c100.c | 64 --- .../target/arm/tcc77x/c100/button-target.h | 45 -- firmware/target/arm/tcc77x/c100/lcd-S6B33B2.c | 286 ------------- firmware/target/arm/tcc77x/c100/power-c100.c | 43 -- firmware/target/arm/tcc77x/crt0.S | 230 ---------- firmware/target/arm/tcc77x/debug-tcc77x.c | 77 ---- firmware/target/arm/tcc77x/i2c-target.h | 39 -- .../target/arm/tcc77x/iaudio7/adc-target.h | 28 -- firmware/target/arm/tcc77x/iaudio7/ata2501.c | 110 ----- firmware/target/arm/tcc77x/iaudio7/ata2501.h | 27 -- .../target/arm/tcc77x/iaudio7/audio-iaudio7.c | 94 ---- .../arm/tcc77x/iaudio7/backlight-target.h | 48 --- .../arm/tcc77x/iaudio7/button-iaudio7.c | 93 ---- .../target/arm/tcc77x/iaudio7/button-target.h | 47 -- .../target/arm/tcc77x/iaudio7/lcd-iaudio7.c | 260 ------------ .../target/arm/tcc77x/iaudio7/power-iaudio7.c | 149 ------- .../arm/tcc77x/iaudio7/powermgmt-iaudio7.c | 84 ---- firmware/target/arm/tcc77x/kernel-tcc77x.c | 47 -- .../target/arm/tcc77x/logikdax/adc-target.h | 28 -- .../arm/tcc77x/logikdax/audio-logikdax.c | 40 -- .../arm/tcc77x/logikdax/backlight-target.h | 40 -- .../arm/tcc77x/logikdax/button-logikdax.c | 100 ----- .../arm/tcc77x/logikdax/button-target.h | 45 -- .../arm/tcc77x/logikdax/power-logikdax.c | 44 -- firmware/target/arm/tcc77x/m200/adc-target.h | 28 -- firmware/target/arm/tcc77x/m200/audio-m200.c | 38 -- .../target/arm/tcc77x/m200/backlight-target.h | 44 -- firmware/target/arm/tcc77x/m200/button-m200.c | 99 ----- .../target/arm/tcc77x/m200/button-target.h | 45 -- firmware/target/arm/tcc77x/m200/power-m200.c | 43 -- firmware/target/arm/tcc77x/powermgmt-tcc77x.c | 66 --- firmware/target/arm/tcc77x/system-target.h | 59 --- firmware/target/arm/tcc77x/system-tcc77x.c | 326 -------------- firmware/target/arm/tcc77x/timer-tcc77x.c | 69 --- firmware/target/arm/wmcodec-telechips.c | 2 - firmware/target/hosted/sdl/sim-ui-defines.h | 7 - firmware/usb.c | 2 +- firmware/usbstack/usb_storage.c | 4 +- tools/builds.pm | 16 - tools/configure | 106 +---- uisimulator/bitmaps/UI-iaudio7.bmp | Bin 422918 -> 0 bytes uisimulator/buttonmap/SOURCES | 2 - 103 files changed, 48 insertions(+), 5873 deletions(-) delete mode 100644 apps/keymaps/keymap-c100.c delete mode 100644 apps/keymaps/keymap-iaudio67.c delete mode 100644 apps/keymaps/keymap-logikdax.c delete mode 100644 firmware/drivers/rtc/rtc_tcc77x.c delete mode 100644 firmware/export/config/iaudio7.h delete mode 100644 firmware/export/config/logikdax.h delete mode 100644 firmware/export/config/sansac100.h delete mode 100644 firmware/export/config/sansam200.h delete mode 100644 firmware/export/tcc77x.h delete mode 100644 firmware/target/arm/tcc77x/adc-tcc77x.c delete mode 100644 firmware/target/arm/tcc77x/app.lds delete mode 100644 firmware/target/arm/tcc77x/ata-nand-target.h delete mode 100644 firmware/target/arm/tcc77x/boot.lds delete mode 100644 firmware/target/arm/tcc77x/c100/adc-target.h delete mode 100644 firmware/target/arm/tcc77x/c100/backlight-target.h delete mode 100644 firmware/target/arm/tcc77x/c100/button-c100.c delete mode 100644 firmware/target/arm/tcc77x/c100/button-target.h delete mode 100644 firmware/target/arm/tcc77x/c100/lcd-S6B33B2.c delete mode 100644 firmware/target/arm/tcc77x/c100/power-c100.c delete mode 100644 firmware/target/arm/tcc77x/crt0.S delete mode 100644 firmware/target/arm/tcc77x/debug-tcc77x.c delete mode 100644 firmware/target/arm/tcc77x/i2c-target.h delete mode 100644 firmware/target/arm/tcc77x/iaudio7/adc-target.h delete mode 100644 firmware/target/arm/tcc77x/iaudio7/ata2501.c delete mode 100644 firmware/target/arm/tcc77x/iaudio7/ata2501.h delete mode 100644 firmware/target/arm/tcc77x/iaudio7/audio-iaudio7.c delete mode 100644 firmware/target/arm/tcc77x/iaudio7/backlight-target.h delete mode 100644 firmware/target/arm/tcc77x/iaudio7/button-iaudio7.c delete mode 100644 firmware/target/arm/tcc77x/iaudio7/button-target.h delete mode 100644 firmware/target/arm/tcc77x/iaudio7/lcd-iaudio7.c delete mode 100644 firmware/target/arm/tcc77x/iaudio7/power-iaudio7.c delete mode 100644 firmware/target/arm/tcc77x/iaudio7/powermgmt-iaudio7.c delete mode 100644 firmware/target/arm/tcc77x/kernel-tcc77x.c delete mode 100644 firmware/target/arm/tcc77x/logikdax/adc-target.h delete mode 100644 firmware/target/arm/tcc77x/logikdax/audio-logikdax.c delete mode 100644 firmware/target/arm/tcc77x/logikdax/backlight-target.h delete mode 100644 firmware/target/arm/tcc77x/logikdax/button-logikdax.c delete mode 100644 firmware/target/arm/tcc77x/logikdax/button-target.h delete mode 100644 firmware/target/arm/tcc77x/logikdax/power-logikdax.c delete mode 100644 firmware/target/arm/tcc77x/m200/adc-target.h delete mode 100644 firmware/target/arm/tcc77x/m200/audio-m200.c delete mode 100644 firmware/target/arm/tcc77x/m200/backlight-target.h delete mode 100644 firmware/target/arm/tcc77x/m200/button-m200.c delete mode 100644 firmware/target/arm/tcc77x/m200/button-target.h delete mode 100644 firmware/target/arm/tcc77x/m200/power-m200.c delete mode 100644 firmware/target/arm/tcc77x/powermgmt-tcc77x.c delete mode 100644 firmware/target/arm/tcc77x/system-target.h delete mode 100644 firmware/target/arm/tcc77x/system-tcc77x.c delete mode 100644 firmware/target/arm/tcc77x/timer-tcc77x.c delete mode 100644 uisimulator/bitmaps/UI-iaudio7.bmp diff --git a/apps/SOURCES b/apps/SOURCES index 80133ebd27..6c13945904 100644 --- a/apps/SOURCES +++ b/apps/SOURCES @@ -231,12 +231,6 @@ keymaps/keymap-sa9200.c keymaps/keymap-hdd1630.c #elif CONFIG_KEYPAD == PHILIPS_HDD6330_PAD keymaps/keymap-hdd6330.c -#elif CONFIG_KEYPAD == IAUDIO67_PAD -keymaps/keymap-iaudio67.c -#elif CONFIG_KEYPAD == SANSA_C100_PAD -keymaps/keymap-c100.c -#elif CONFIG_KEYPAD == LOGIK_DAX_PAD -keymaps/keymap-logikdax.c #elif CONFIG_KEYPAD == SANSA_FUZE_PAD keymaps/keymap-fuze.c #elif CONFIG_KEYPAD == ONDAVX747_PAD diff --git a/apps/keymaps/keymap-c100.c b/apps/keymaps/keymap-c100.c deleted file mode 100644 index 9949f0c1c2..0000000000 --- a/apps/keymaps/keymap-c100.c +++ /dev/null @@ -1,400 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 Mark Arigo - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -/* Button Code Definitions for Sandisk c100 target */ - -#include "config.h" -#include "action.h" -#include "button.h" -#include "settings.h" - -/* {Action Code, Button code, Prereq button code } */ - -/* - * The format of the list is as follows - * { Action Code, Button code, Prereq button code } - * if there's no need to check the previous button's value, use BUTTON_NONE - * Insert LAST_ITEM_IN_LIST at the end of each mapping - */ -static const struct button_mapping button_context_standard[] = { - { ACTION_STD_PREV, BUTTON_UP, BUTTON_NONE }, - { ACTION_STD_PREVREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_STD_NEXT, BUTTON_DOWN, BUTTON_NONE }, - { ACTION_STD_NEXTREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_STD_OK, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT }, - { ACTION_STD_OK, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_STD_CANCEL, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_STD_MENU, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, - { ACTION_STD_OK, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT }, - { ACTION_STD_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT }, - - LAST_ITEM_IN_LIST -}; /* button_context_standard */ - - -static const struct button_mapping button_context_wps[] = { - { ACTION_WPS_PLAY, BUTTON_UP|BUTTON_REL, BUTTON_UP }, - { ACTION_WPS_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, - { ACTION_WPS_SKIPPREV, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT }, - { ACTION_WPS_SEEKBACK, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_WPS_STOPSEEK, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT|BUTTON_REPEAT }, - - { ACTION_WPS_SKIPNEXT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT }, - { ACTION_WPS_SEEKFWD, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_WPS_STOPSEEK, BUTTON_RIGHT|BUTTON_REL,BUTTON_RIGHT|BUTTON_REPEAT }, - - { ACTION_WPS_ABSETB_NEXTDIR,BUTTON_POWER|BUTTON_RIGHT, BUTTON_POWER }, - { ACTION_WPS_ABSETA_PREVDIR,BUTTON_POWER|BUTTON_LEFT, BUTTON_POWER }, - { ACTION_WPS_ABRESET, BUTTON_POWER|BUTTON_UP, BUTTON_POWER }, - - { ACTION_WPS_MENU, BUTTON_DOWN|BUTTON_REL, BUTTON_DOWN }, - { ACTION_WPS_BROWSE, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT }, - { ACTION_WPS_PITCHSCREEN, BUTTON_SELECT|BUTTON_VOLUP, BUTTON_SELECT }, - { ACTION_WPS_ID3SCREEN, BUTTON_SELECT|BUTTON_VOLDOWN, BUTTON_SELECT }, - { ACTION_WPS_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT }, - { ACTION_WPS_HOTKEY, BUTTON_SELECT|BUTTON_DOWN, BUTTON_NONE }, - { ACTION_WPS_QUICKSCREEN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN }, - - LAST_ITEM_IN_LIST -}; /* button_context_wps */ - -static const struct button_mapping button_context_settings[] = { - { ACTION_STD_CANCEL, BUTTON_POWER, BUTTON_NONE }, - { ACTION_SETTINGS_RESET, BUTTON_SELECT, BUTTON_NONE }, - { ACTION_SETTINGS_INC, BUTTON_VOLUP, BUTTON_NONE }, - { ACTION_SETTINGS_INCREPEAT,BUTTON_VOLUP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_SETTINGS_DEC, BUTTON_VOLDOWN, BUTTON_NONE }, - { ACTION_SETTINGS_DECREPEAT,BUTTON_VOLDOWN|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_STD_PREV, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_STD_PREVREPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_STD_NEXT, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_STD_NEXTREPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), -}; /* button_context_settings */ - -static const struct button_mapping button_context_list[] = { -#ifdef HAVE_VOLUME_IN_LIST - { ACTION_LIST_VOLUP, BUTTON_VOLUP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_LIST_VOLUP, BUTTON_VOLUP, BUTTON_NONE }, - { ACTION_LIST_VOLDOWN, BUTTON_VOLDOWN, BUTTON_NONE }, - { ACTION_LIST_VOLDOWN, BUTTON_VOLDOWN|BUTTON_REPEAT, BUTTON_NONE }, -#endif - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) -}; /* button_context_list */ - -static const struct button_mapping button_context_tree[] = { - { ACTION_TREE_WPS, BUTTON_UP|BUTTON_REL, BUTTON_UP }, - { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, - { ACTION_TREE_HOTKEY, BUTTON_SELECT|BUTTON_DOWN, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), -}; /* button_context_tree */ - -static const struct button_mapping button_context_listtree_scroll_without_combo[] = { - { ACTION_NONE, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_STD_CANCEL, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT }, - { ACTION_TREE_ROOT_INIT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT }, - { ACTION_TREE_PGLEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_NONE, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_STD_OK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT }, - { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE), -}; /* button_context_listtree_scroll_without_combo */ - -static const struct button_mapping button_context_listtree_scroll_with_combo[] = { -// { ACTION_TREE_PGLEFT, BUTTON_REC|BUTTON_LEFT, BUTTON_NONE }, -// { ACTION_TREE_ROOT_INIT, BUTTON_REC|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_REC|BUTTON_LEFT }, -// { ACTION_TREE_PGLEFT, BUTTON_REC|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, -// { ACTION_TREE_PGRIGHT, BUTTON_REC|BUTTON_RIGHT, BUTTON_NONE }, -// { ACTION_TREE_PGRIGHT, BUTTON_REC|BUTTON_RIGHT|BUTTON_REPEAT,BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE), -}; /* button_context_listtree_scroll_with_combo */ - -static const struct button_mapping button_context_yesno[] = { - { ACTION_YESNO_ACCEPT, BUTTON_SELECT, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), -}; /* button_context_settings_yesno */ - -static const struct button_mapping button_context_quickscreen[] = { - { ACTION_STD_CANCEL, BUTTON_POWER, BUTTON_NONE }, - { ACTION_QS_TOP, BUTTON_UP|BUTTON_REL, BUTTON_NONE }, - { ACTION_QS_TOP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_QS_DOWN, BUTTON_DOWN|BUTTON_REL, BUTTON_NONE }, - { ACTION_QS_DOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_QS_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_NONE }, - { ACTION_QS_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_QS_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_NONE }, - { ACTION_QS_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), -}; /* button_context_quickscreen */ - -static const struct button_mapping button_context_settings_right_is_inc[] = { - { ACTION_SETTINGS_INC, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_SETTINGS_INCREPEAT,BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_SETTINGS_DEC, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_SETTINGS_DECREPEAT,BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_STD_CANCEL, BUTTON_POWER, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), -}; /* button_context_settings_right_is_inc */ - -static const struct button_mapping button_context_pitchscreen[] = { - { ACTION_PS_INC_SMALL, BUTTON_VOLUP, BUTTON_NONE }, - { ACTION_PS_INC_BIG, BUTTON_VOLUP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_PS_DEC_SMALL, BUTTON_VOLDOWN, BUTTON_NONE }, - { ACTION_PS_DEC_BIG, BUTTON_VOLDOWN|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_PS_NUDGE_LEFT, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_PS_NUDGE_LEFTOFF, BUTTON_LEFT|BUTTON_REL, BUTTON_NONE }, - { ACTION_PS_NUDGE_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_PS_NUDGE_RIGHTOFF, BUTTON_RIGHT|BUTTON_REL, BUTTON_NONE }, - { ACTION_PS_RESET, BUTTON_SELECT, BUTTON_NONE }, - { ACTION_PS_EXIT, BUTTON_POWER, BUTTON_NONE }, - { ACTION_PS_SLOWER, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_PS_FASTER, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), -}; /* button_context_pitchscreen */ - -/** FM Radio Screen **/ -#if CONFIG_TUNER -static const struct button_mapping button_context_radio[] = { - { ACTION_STD_PREV, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_STD_PREVREPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_STD_NEXT, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_STD_NEXTREPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_FM_MENU, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_FM_PRESET, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE }, - { ACTION_FM_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_NONE }, - { ACTION_FM_MODE, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP }, - { ACTION_FM_EXIT, BUTTON_DOWN|BUTTON_REL, BUTTON_NONE }, - { ACTION_FM_PLAY, BUTTON_UP|BUTTON_REL, BUTTON_UP }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS) -}; /* button_context_radio */ -#endif - -static const struct button_mapping button_context_keyboard[] = { - { ACTION_KBD_LEFT, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_KBD_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_KBD_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - -// { ACTION_KBD_CURSOR_LEFT, BUTTON_REC|BUTTON_LEFT, BUTTON_NONE }, -// { ACTION_KBD_CURSOR_LEFT, BUTTON_REC|BUTTON_LEFT|BUTTON_REPEAT,BUTTON_NONE }, -// { ACTION_KBD_CURSOR_RIGHT, BUTTON_REC|BUTTON_RIGHT, BUTTON_NONE }, -// { ACTION_KBD_CURSOR_RIGHT, BUTTON_REC|BUTTON_RIGHT|BUTTON_REPEAT,BUTTON_NONE }, - - { ACTION_KBD_UP, BUTTON_VOLUP, BUTTON_NONE }, - { ACTION_KBD_UP, BUTTON_VOLUP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_DOWN, BUTTON_VOLDOWN, BUTTON_NONE }, - { ACTION_KBD_DOWN, BUTTON_VOLDOWN|BUTTON_REPEAT, BUTTON_NONE }, - -// { ACTION_KBD_BACKSPACE, BUTTON_REC|BUTTON_VOLDOWN, BUTTON_NONE }, -// { ACTION_KBD_BACKSPACE, BUTTON_REC|BUTTON_VOLDOWN|BUTTON_REPEAT,BUTTON_NONE }, -// { ACTION_KBD_PAGE_FLIP, BUTTON_REC|BUTTON_SELECT, BUTTON_REC }, - - { ACTION_KBD_SELECT, BUTTON_SELECT, BUTTON_NONE }, - { ACTION_KBD_DONE, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT }, - { ACTION_KBD_ABORT, BUTTON_POWER, BUTTON_NONE }, - - LAST_ITEM_IN_LIST -}; /* button_context_keyboard */ - -static const struct button_mapping button_context_bmark[] = { -// { ACTION_BMS_DELETE, BUTTON_REC, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), -}; /* button_context_bmark */ - -#ifdef USB_ENABLE_HID -static const struct button_mapping button_context_usb_hid[] = { - { ACTION_USB_HID_MODE_SWITCH_NEXT, BUTTON_MODE|BUTTON_REL, BUTTON_MODE }, - { ACTION_USB_HID_MODE_SWITCH_PREV, BUTTON_MODE|BUTTON_REPEAT, BUTTON_MODE }, - - LAST_ITEM_IN_LIST -}; /* button_context_usb_hid */ - -static const struct button_mapping button_context_usb_hid_mode_multimedia[] = { - { ACTION_USB_HID_MULTIMEDIA_VOLUME_DOWN, BUTTON_VOLUP, BUTTON_NONE }, - { ACTION_USB_HID_MULTIMEDIA_VOLUME_DOWN, BUTTON_VOLUP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_USB_HID_MULTIMEDIA_VOLUME_UP, BUTTON_VOLDOWN, BUTTON_NONE }, - { ACTION_USB_HID_MULTIMEDIA_VOLUME_UP, BUTTON_VOLDOWN|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_USB_HID_MULTIMEDIA_VOLUME_MUTE, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT }, - { ACTION_USB_HID_MULTIMEDIA_PLAYBACK_PLAY_PAUSE, BUTTON_UP|BUTTON_REL, BUTTON_UP }, - { ACTION_USB_HID_MULTIMEDIA_PLAYBACK_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, - { ACTION_USB_HID_MULTIMEDIA_PLAYBACK_TRACK_PREV, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT }, - { ACTION_USB_HID_MULTIMEDIA_PLAYBACK_TRACK_NEXT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_USB_HID) -}; /* button_context_usb_hid_mode_multimedia */ - -static const struct button_mapping button_context_usb_hid_mode_presentation[] = { - { ACTION_USB_HID_PRESENTATION_SLIDESHOW_START, BUTTON_UP|BUTTON_REL, BUTTON_UP }, - { ACTION_USB_HID_PRESENTATION_SLIDESHOW_LEAVE, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, - { ACTION_USB_HID_PRESENTATION_SLIDE_PREV, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT }, - { ACTION_USB_HID_PRESENTATION_SLIDE_NEXT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT }, - { ACTION_USB_HID_PRESENTATION_SLIDE_FIRST, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT }, - { ACTION_USB_HID_PRESENTATION_SLIDE_LAST, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT }, - { ACTION_USB_HID_PRESENTATION_SCREEN_BLACK, BUTTON_DOWN|BUTTON_REL, BUTTON_DOWN }, - { ACTION_USB_HID_PRESENTATION_SCREEN_WHITE, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN }, - { ACTION_USB_HID_PRESENTATION_LINK_PREV, BUTTON_VOLUP, BUTTON_NONE }, - { ACTION_USB_HID_PRESENTATION_LINK_PREV, BUTTON_VOLUP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_USB_HID_PRESENTATION_LINK_NEXT, BUTTON_VOLDOWN, BUTTON_NONE }, - { ACTION_USB_HID_PRESENTATION_LINK_NEXT, BUTTON_VOLDOWN|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_USB_HID_PRESENTATION_MOUSE_CLICK, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT }, - { ACTION_USB_HID_PRESENTATION_MOUSE_OVER, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_USB_HID) -}; /* button_context_usb_hid_mode_presentation */ - -static const struct button_mapping button_context_usb_hid_mode_browser[] = { - { ACTION_USB_HID_BROWSER_SCROLL_UP, BUTTON_VOLUP, BUTTON_NONE }, - { ACTION_USB_HID_BROWSER_SCROLL_UP, BUTTON_VOLUP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_USB_HID_BROWSER_SCROLL_DOWN, BUTTON_VOLDOWN, BUTTON_NONE }, - { ACTION_USB_HID_BROWSER_SCROLL_DOWN, BUTTON_VOLDOWN|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_USB_HID_BROWSER_SCROLL_PAGE_UP, BUTTON_UP|BUTTON_REL, BUTTON_UP }, - { ACTION_USB_HID_BROWSER_SCROLL_PAGE_DOWN, BUTTON_DOWN|BUTTON_REL, BUTTON_DOWN }, - { ACTION_USB_HID_BROWSER_ZOOM_IN, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP }, - { ACTION_USB_HID_BROWSER_ZOOM_OUT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN }, - { ACTION_USB_HID_BROWSER_ZOOM_RESET, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT }, - { ACTION_USB_HID_BROWSER_ZOOM_RESET, BUTTON_UP|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_UP|BUTTON_DOWN }, - { ACTION_USB_HID_BROWSER_TAB_PREV, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT }, - { ACTION_USB_HID_BROWSER_TAB_NEXT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT }, - { ACTION_USB_HID_BROWSER_TAB_CLOSE, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER }, - { ACTION_USB_HID_BROWSER_HISTORY_BACK, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT }, - { ACTION_USB_HID_BROWSER_HISTORY_FORWARD, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT }, - { ACTION_USB_HID_BROWSER_VIEW_FULL_SCREEN, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_USB_HID) -}; /* button_context_usb_hid_mode_browser */ - -#ifdef HAVE_USB_HID_MOUSE -static const struct button_mapping button_context_usb_hid_mode_mouse[] = { - { ACTION_USB_HID_MOUSE_UP, BUTTON_UP, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_UP_REP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_DOWN, BUTTON_DOWN, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_DOWN_REP, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_LEFT, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_LEFT_REP, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_RIGHT_REP, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_BUTTON_LEFT, BUTTON_SELECT, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_BUTTON_LEFT_REL, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_LDRAG_UP, BUTTON_SELECT|BUTTON_UP, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_LDRAG_UP_REP, BUTTON_SELECT|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_LDRAG_DOWN, BUTTON_SELECT|BUTTON_DOWN, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_LDRAG_DOWN_REP, BUTTON_SELECT|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_LDRAG_LEFT, BUTTON_SELECT|BUTTON_LEFT, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_LDRAG_LEFT_REP, BUTTON_SELECT|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_LDRAG_RIGHT, BUTTON_SELECT|BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_LDRAG_RIGHT_REP, BUTTON_SELECT|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_BUTTON_RIGHT, BUTTON_POWER, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_BUTTON_RIGHT_REL, BUTTON_POWER|BUTTON_REL, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_RDRAG_UP, BUTTON_POWER|BUTTON_UP, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_RDRAG_UP_REP, BUTTON_POWER|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_RDRAG_DOWN, BUTTON_POWER|BUTTON_DOWN, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_RDRAG_DOWN_REP, BUTTON_POWER|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_RDRAG_LEFT, BUTTON_POWER|BUTTON_LEFT, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_RDRAG_LEFT_REP, BUTTON_POWER|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_RDRAG_RIGHT, BUTTON_POWER|BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_RDRAG_RIGHT_REP, BUTTON_POWER|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_WHEEL_SCROLL_UP, BUTTON_VOLUP, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_WHEEL_SCROLL_UP, BUTTON_VOLUP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_WHEEL_SCROLL_DOWN, BUTTON_VOLDOWN, BUTTON_NONE }, - { ACTION_USB_HID_MOUSE_WHEEL_SCROLL_DOWN, BUTTON_VOLDOWN|BUTTON_REPEAT, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_USB_HID) -}; /* button_context_usb_hid_mode_mouse */ -#endif -#endif - -/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */ -const struct button_mapping* get_context_mapping(int context) -{ - switch (context) - { - case CONTEXT_STD: - return button_context_standard; - - case CONTEXT_WPS: - return button_context_wps; - - case CONTEXT_LIST: - return button_context_list; - case CONTEXT_TREE: - case CONTEXT_MAINMENU: - if (global_settings.hold_lr_for_scroll_in_list) - return button_context_listtree_scroll_without_combo; - else - return button_context_listtree_scroll_with_combo; - case CONTEXT_CUSTOM|CONTEXT_TREE: - return button_context_tree; - - case CONTEXT_SETTINGS: - case CONTEXT_SETTINGS_TIME: - return button_context_settings; - case CONTEXT_CUSTOM|CONTEXT_SETTINGS: - case CONTEXT_SETTINGS_COLOURCHOOSER: - case CONTEXT_SETTINGS_EQ: - return button_context_settings_right_is_inc; - - case CONTEXT_YESNOSCREEN: - return button_context_yesno; -#if CONFIG_TUNER - case CONTEXT_FM: - return button_context_radio; -#endif - case CONTEXT_BOOKMARKSCREEN: - return button_context_bmark; - case CONTEXT_QUICKSCREEN: - return button_context_quickscreen; - case CONTEXT_PITCHSCREEN: - return button_context_pitchscreen; -#ifdef HAVE_RECORDING - case CONTEXT_RECSCREEN: - return button_context_recscreen; -#endif - case CONTEXT_KEYBOARD: - return button_context_keyboard; -#ifdef USB_ENABLE_HID - case CONTEXT_USB_HID: - return button_context_usb_hid; - case CONTEXT_USB_HID_MODE_MULTIMEDIA: - return button_context_usb_hid_mode_multimedia; - case CONTEXT_USB_HID_MODE_PRESENTATION: - return button_context_usb_hid_mode_presentation; - case CONTEXT_USB_HID_MODE_BROWSER: - return button_context_usb_hid_mode_browser; -#ifdef HAVE_USB_HID_MOUSE - case CONTEXT_USB_HID_MODE_MOUSE: - return button_context_usb_hid_mode_mouse; -#endif -#endif - default: - return button_context_standard; - } - return button_context_standard; -} diff --git a/apps/keymaps/keymap-iaudio67.c b/apps/keymaps/keymap-iaudio67.c deleted file mode 100644 index 5c62a73dd0..0000000000 --- a/apps/keymaps/keymap-iaudio67.c +++ /dev/null @@ -1,330 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 Mark Arigo - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -/* Button Code Definitions for Iaudio[67] target */ - -#include "config.h" -#include "action.h" -#include "button.h" -#include "settings.h" - -/* {Action Code, Button code, Prereq button code } */ - -/* - * The format of the list is as follows - * { Action Code, Button code, Prereq button code } - * if there's no need to check the previous button's value, use BUTTON_NONE - * Insert LAST_ITEM_IN_LIST at the end of each mapping - */ -static const struct button_mapping button_context_standard[] = { - { ACTION_STD_PREV, BUTTON_RIGHT|BUTTON_REL, BUTTON_NONE }, - { ACTION_STD_PREVREPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_STD_NEXT, BUTTON_LEFT|BUTTON_REL, BUTTON_NONE }, - { ACTION_STD_NEXTREPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_STD_OK, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, - { ACTION_STD_OK, BUTTON_PLAY|BUTTON_REL, BUTTON_NONE }, - { ACTION_STD_CANCEL, BUTTON_STOP|BUTTON_REL, BUTTON_NONE }, - { ACTION_STD_CANCEL, BUTTON_POWER, BUTTON_NONE }, - - { ACTION_STD_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, - { ACTION_STD_CONTEXT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, -// { ACTION_STD_QUICKSCREEN, BUTTON_REC|BUTTON_PLAY, BUTTON_NONE }, - - LAST_ITEM_IN_LIST -}; /* button_context_standard */ - - -static const struct button_mapping button_context_wps[] = { - - { ACTION_WPS_VOLDOWN, BUTTON_VOLDOWN, BUTTON_NONE }, - { ACTION_WPS_VOLDOWN, BUTTON_VOLDOWN|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_WPS_VOLUP, BUTTON_VOLUP, BUTTON_NONE }, - { ACTION_WPS_VOLUP, BUTTON_VOLUP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, - { ACTION_WPS_CONTEXT, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, - - { ACTION_WPS_SKIPPREV, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT }, - { ACTION_WPS_SEEKBACK, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_WPS_STOPSEEK, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT|BUTTON_REPEAT }, - - { ACTION_WPS_SKIPNEXT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT }, - { ACTION_WPS_SEEKFWD, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_WPS_STOPSEEK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT }, - - { ACTION_WPS_PLAY, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, -#ifdef HAVE_HOTKEY - { ACTION_WPS_HOTKEY, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE }, -#else - { ACTION_WPS_VIEW_PLAYLIST, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE }, -#endif - { ACTION_WPS_STOP, BUTTON_STOP, BUTTON_NONE }, - - LAST_ITEM_IN_LIST -}; /* button_context_wps */ - -static const struct button_mapping button_context_settings[] = { - { ACTION_STD_CANCEL, BUTTON_MENU, BUTTON_NONE }, -// { ACTION_SETTINGS_RESET, BUTTON_PLAY, BUTTON_NONE }, - - { ACTION_SETTINGS_INC, BUTTON_VOLUP|BUTTON_REL, BUTTON_NONE }, - { ACTION_SETTINGS_INCREPEAT,BUTTON_VOLUP|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_SETTINGS_DEC, BUTTON_VOLDOWN|BUTTON_REL, BUTTON_NONE }, - { ACTION_SETTINGS_DECREPEAT,BUTTON_VOLDOWN|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_STD_PREV, BUTTON_RIGHT|BUTTON_REL, BUTTON_NONE }, - { ACTION_STD_PREVREPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_STD_NEXT, BUTTON_LEFT|BUTTON_REL, BUTTON_NONE }, - { ACTION_STD_NEXTREPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), -}; /* button_context_settings */ - -static const struct button_mapping button_context_list[] = { -#ifdef HAVE_VOLUME_IN_LIST - { ACTION_LIST_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_LIST_VOLUP, BUTTON_VOL_UP|BUTTON_REL, BUTTON_NONE }, - - { ACTION_LIST_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REL, BUTTON_NONE }, - { ACTION_LIST_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, -#endif - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) -}; /* button_context_list */ - -static const struct button_mapping button_context_tree[] = { - // { ACTION_TREE_WPS, BUTTON_REC|BUTTON_VOLUP, BUTTON_REC }, - // { ACTION_TREE_STOP, BUTTON_REC|BUTTON_VOLUP|BUTTON_REPEAT, BUTTON_REC|BUTTON_VOLUP }, -#ifdef HAVE_HOTKEY - // { ACTION_TREE_HOTKEY, BUTTON_NONE, BUTTON_NONE }, -#endif - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), -}; /* button_context_tree */ - -static const struct button_mapping button_context_listtree_scroll_without_combo[] = { -#if 0 - { ACTION_NONE, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_STD_CANCEL, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT }, - { ACTION_TREE_ROOT_INIT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT }, - { ACTION_TREE_PGLEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_NONE, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_STD_OK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT }, - { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, -#endif - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE), -}; /* button_context_listtree_scroll_without_combo */ - -static const struct button_mapping button_context_listtree_scroll_with_combo[] = { -// { ACTION_TREE_PGLEFT, BUTTON_REC|BUTTON_LEFT, BUTTON_NONE }, -// { ACTION_TREE_ROOT_INIT, BUTTON_REC|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_REC|BUTTON_LEFT }, -// { ACTION_TREE_PGLEFT, BUTTON_REC|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, -// { ACTION_TREE_PGRIGHT, BUTTON_REC|BUTTON_RIGHT, BUTTON_NONE }, -// { ACTION_TREE_PGRIGHT, BUTTON_REC|BUTTON_RIGHT|BUTTON_REPEAT,BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE), -}; /* button_context_listtree_scroll_with_combo */ - -static const struct button_mapping button_context_yesno[] = { -// { ACTION_YESNO_ACCEPT, BUTTON_PLAY, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), -}; /* button_context_settings_yesno */ - -static const struct button_mapping button_context_quickscreen[] = { -#if 0 - { ACTION_NONE, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_STD_CANCEL, BUTTON_MENU|BUTTON_REL, BUTTON_NONE }, - - { ACTION_QS_TOP, BUTTON_VOLUP|BUTTON_REL, BUTTON_NONE }, - { ACTION_QS_TOP, BUTTON_VOLUP|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_QS_DOWN, BUTTON_VOLDOWN|BUTTON_REL, BUTTON_NONE }, - { ACTION_QS_DOWN, BUTTON_VOLDOWN|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_QS_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_NONE }, - { ACTION_QS_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_QS_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_NONE }, - { ACTION_QS_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, -#endif - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), -}; /* button_context_quickscreen */ - -static const struct button_mapping button_context_settings_right_is_inc[] = { -#if 0 - { ACTION_SETTINGS_INC, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_SETTINGS_INCREPEAT,BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_SETTINGS_DEC, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_SETTINGS_DECREPEAT,BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_STD_CANCEL, BUTTON_MENU, BUTTON_NONE }, -#endif - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), -}; /* button_context_settings_right_is_inc */ - -static const struct button_mapping button_context_pitchscreen[] = { -#if 0 - { ACTION_PS_INC_SMALL, BUTTON_VOLUP, BUTTON_NONE }, - { ACTION_PS_INC_BIG, BUTTON_VOLUP|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_PS_DEC_SMALL, BUTTON_VOLDOWN, BUTTON_NONE }, - { ACTION_PS_DEC_BIG, BUTTON_VOLDOWN|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_PS_NUDGE_LEFT, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_PS_NUDGE_LEFTOFF, BUTTON_LEFT|BUTTON_REL, BUTTON_NONE }, - - { ACTION_PS_NUDGE_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_PS_NUDGE_RIGHTOFF, BUTTON_RIGHT|BUTTON_REL, BUTTON_NONE }, - - { ACTION_PS_RESET, BUTTON_PLAY, BUTTON_NONE }, - { ACTION_PS_EXIT, BUTTON_MENU, BUTTON_NONE }, - - { ACTION_PS_SLOWER, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_PS_FASTER, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - -#endif - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), -}; /* button_context_pitchscreen */ - -/** Recording Screen **/ -#ifdef HAVE_RECORDING -static const struct button_mapping button_context_recscreen[] = { - { ACTION_STD_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, - { ACTION_REC_PAUSE, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, - { ACTION_STD_CANCEL, BUTTON_MENU|BUTTON_REPEAT, BUTTON_NONE }, -// { ACTION_REC_NEWFILE, BUTTON_REC|BUTTON_REL, BUTTON_REC }, - - { ACTION_SETTINGS_INC, BUTTON_RIGHT|BUTTON_REL, BUTTON_NONE }, - { ACTION_SETTINGS_INCREPEAT,BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_SETTINGS_DEC, BUTTON_LEFT|BUTTON_REL, BUTTON_NONE }, - { ACTION_SETTINGS_DECREPEAT,BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) -}; /* button_context_recscreen */ -#endif - -/** FM Radio Screen **/ -#if CONFIG_TUNER -static const struct button_mapping button_context_radio[] = { - { ACTION_FM_MENU, BUTTON_MENU | BUTTON_REL, BUTTON_MENU }, - { ACTION_FM_MODE, BUTTON_MENU | BUTTON_REPEAT, BUTTON_MENU }, - { ACTION_FM_PRESET, BUTTON_STOP, BUTTON_NONE }, - { ACTION_FM_PLAY, BUTTON_PLAY | BUTTON_REL, BUTTON_NONE }, - { ACTION_FM_STOP, BUTTON_PLAY | BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_FM_EXIT, BUTTON_POWER, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS) -}; /* button_context_radio */ -#endif - -static const struct button_mapping button_context_keyboard[] = { - { ACTION_KBD_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_NONE }, - { ACTION_KBD_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_NONE }, - { ACTION_KBD_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - -// { ACTION_KBD_CURSOR_LEFT, BUTTON_REC|BUTTON_LEFT, BUTTON_NONE }, -// { ACTION_KBD_CURSOR_LEFT, BUTTON_REC|BUTTON_LEFT|BUTTON_REPEAT,BUTTON_NONE }, -// { ACTION_KBD_CURSOR_RIGHT, BUTTON_REC|BUTTON_RIGHT, BUTTON_NONE }, -// { ACTION_KBD_CURSOR_RIGHT, BUTTON_REC|BUTTON_RIGHT|BUTTON_REPEAT,BUTTON_NONE }, - - { ACTION_KBD_UP, BUTTON_VOLUP|BUTTON_REL, BUTTON_NONE }, - { ACTION_KBD_UP, BUTTON_VOLUP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_DOWN, BUTTON_VOLDOWN|BUTTON_REL, BUTTON_NONE }, - { ACTION_KBD_DOWN, BUTTON_VOLDOWN|BUTTON_REPEAT, BUTTON_NONE }, - -// { ACTION_KBD_BACKSPACE, BUTTON_REC|BUTTON_VOLDOWN, BUTTON_NONE }, -// { ACTION_KBD_BACKSPACE, BUTTON_REC|BUTTON_VOLDOWN|BUTTON_REPEAT,BUTTON_NONE }, - -// { ACTION_KBD_PAGE_FLIP, BUTTON_REC|BUTTON_PLAY, BUTTON_REC }, - - { ACTION_KBD_SELECT, BUTTON_PLAY|BUTTON_REL, BUTTON_NONE }, - { ACTION_KBD_DONE, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, - { ACTION_KBD_ABORT, BUTTON_MENU|BUTTON_REL, BUTTON_NONE }, - - LAST_ITEM_IN_LIST -}; /* button_context_keyboard */ - -static const struct button_mapping button_context_bmark[] = { -// { ACTION_BMS_DELETE, BUTTON_REC, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), -}; /* button_context_bmark */ - -/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */ -const struct button_mapping* get_context_mapping(int context) -{ - switch (context) - { - case CONTEXT_STD: - return button_context_standard; - case CONTEXT_WPS: - return button_context_wps; - - case CONTEXT_LIST: - return button_context_list; - case CONTEXT_TREE: - case CONTEXT_MAINMENU: - if (global_settings.hold_lr_for_scroll_in_list) - return button_context_listtree_scroll_without_combo; - else - return button_context_listtree_scroll_with_combo; - case CONTEXT_CUSTOM|CONTEXT_TREE: - return button_context_tree; - - case CONTEXT_SETTINGS: - case CONTEXT_SETTINGS_TIME: - return button_context_settings; - case CONTEXT_CUSTOM|CONTEXT_SETTINGS: - case CONTEXT_SETTINGS_COLOURCHOOSER: - case CONTEXT_SETTINGS_EQ: - return button_context_settings_right_is_inc; - - case CONTEXT_YESNOSCREEN: - return button_context_yesno; -#if CONFIG_TUNER - case CONTEXT_FM: - return button_context_radio; -#endif - case CONTEXT_BOOKMARKSCREEN: - return button_context_bmark; - case CONTEXT_QUICKSCREEN: - return button_context_quickscreen; - case CONTEXT_PITCHSCREEN: - return button_context_pitchscreen; -#ifdef HAVE_RECORDING - case CONTEXT_RECSCREEN: - return button_context_recscreen; -#endif - case CONTEXT_KEYBOARD: - return button_context_keyboard; - - default: - return button_context_standard; - } - - return button_context_standard; -} diff --git a/apps/keymaps/keymap-logikdax.c b/apps/keymaps/keymap-logikdax.c deleted file mode 100644 index 20c23031ef..0000000000 --- a/apps/keymaps/keymap-logikdax.c +++ /dev/null @@ -1,318 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2008 Dave Chapman - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -/* Button Code Definitions for Sandisk c200 target */ - -#include "config.h" -#include "action.h" -#include "button.h" -#include "settings.h" - -/* {Action Code, Button code, Prereq button code } */ - -/* - * The format of the list is as follows - * { Action Code, Button code, Prereq button code } - * if there's no need to check the previous button's value, use BUTTON_NONE - * Insert LAST_ITEM_IN_LIST at the end of each mapping - */ -static const struct button_mapping button_context_standard[] = { - { ACTION_STD_PREV, BUTTON_UP, BUTTON_NONE }, - { ACTION_STD_PREVREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_STD_NEXT, BUTTON_DOWN, BUTTON_NONE }, - { ACTION_STD_NEXTREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_STD_OK, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT }, - { ACTION_STD_OK, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_STD_CANCEL, BUTTON_LEFT, BUTTON_NONE }, - - { ACTION_STD_MENU, BUTTON_MODE|BUTTON_REL, BUTTON_MODE }, - { ACTION_STD_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT }, -// { ACTION_STD_QUICKSCREEN, BUTTON_REC|BUTTON_SELECT, BUTTON_NONE }, - - LAST_ITEM_IN_LIST -}; /* button_context_standard */ - - -static const struct button_mapping button_context_wps[] = { - { ACTION_WPS_PLAY, BUTTON_POWERPLAY|BUTTON_REL, BUTTON_POWERPLAY }, - { ACTION_WPS_STOP, BUTTON_POWERPLAY|BUTTON_REPEAT, BUTTON_POWERPLAY }, - - { ACTION_WPS_SKIPPREV, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT }, - { ACTION_WPS_SEEKBACK, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_WPS_STOPSEEK, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT|BUTTON_REPEAT }, - - { ACTION_WPS_SKIPNEXT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT }, - { ACTION_WPS_SEEKFWD, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_WPS_STOPSEEK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT }, - - { ACTION_WPS_ABSETB_NEXTDIR,BUTTON_MODE|BUTTON_RIGHT, BUTTON_MODE }, - { ACTION_WPS_ABSETA_PREVDIR,BUTTON_MODE|BUTTON_LEFT, BUTTON_MODE }, - { ACTION_WPS_ABRESET, BUTTON_MODE|BUTTON_UP, BUTTON_MODE }, - - { ACTION_WPS_MENU, BUTTON_MODE|BUTTON_REL, BUTTON_MODE }, - { ACTION_WPS_BROWSE, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT }, -#if 0 - { ACTION_WPS_PITCHSCREEN, BUTTON_SELECT|BUTTON_UP, BUTTON_SELECT }, - { ACTION_WPS_ID3SCREEN, BUTTON_SELECT|BUTTON_DOWN, BUTTON_SELECT }, - { ACTION_WPS_CONTEXT, BUTTON_VOLDOWN|BUTTON_REL, BUTTON_VOLDOWN }, - { ACTION_WPS_QUICKSCREEN, BUTTON_VOLDOWN|BUTTON_REPEAT, BUTTON_VOLDOWN }, -#endif - - LAST_ITEM_IN_LIST -}; /* button_context_wps */ - -static const struct button_mapping button_context_settings[] = { - { ACTION_STD_CANCEL, BUTTON_REC, BUTTON_NONE }, - { ACTION_SETTINGS_RESET, BUTTON_SELECT, BUTTON_NONE }, - - { ACTION_SETTINGS_INC, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_SETTINGS_INCREPEAT,BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_SETTINGS_DEC, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_SETTINGS_DECREPEAT,BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_STD_PREV, BUTTON_UP, BUTTON_NONE }, - { ACTION_STD_PREVREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_STD_NEXT, BUTTON_DOWN, BUTTON_NONE }, - { ACTION_STD_NEXTREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), -}; /* button_context_settings */ - -static const struct button_mapping button_context_list[] = { - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) -}; /* button_context_list */ - -static const struct button_mapping button_context_tree[] = { - // { ACTION_TREE_WPS, BUTTON_REC|BUTTON_VOLUP, BUTTON_REC }, - // { ACTION_TREE_STOP, BUTTON_REC|BUTTON_VOLUP|BUTTON_REPEAT, BUTTON_REC|BUTTON_VOLUP }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), -}; /* button_context_tree */ - -static const struct button_mapping button_context_listtree_scroll_without_combo[] = { - { ACTION_NONE, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_STD_CANCEL, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT }, - { ACTION_TREE_ROOT_INIT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT }, - { ACTION_TREE_PGLEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_NONE, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_STD_OK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT }, - { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE), -}; /* button_context_listtree_scroll_without_combo */ - -static const struct button_mapping button_context_listtree_scroll_with_combo[] = { -// { ACTION_TREE_PGLEFT, BUTTON_REC|BUTTON_LEFT, BUTTON_NONE }, -// { ACTION_TREE_ROOT_INIT, BUTTON_REC|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_REC|BUTTON_LEFT }, -// { ACTION_TREE_PGLEFT, BUTTON_REC|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, -// { ACTION_TREE_PGRIGHT, BUTTON_REC|BUTTON_RIGHT, BUTTON_NONE }, -// { ACTION_TREE_PGRIGHT, BUTTON_REC|BUTTON_RIGHT|BUTTON_REPEAT,BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE), -}; /* button_context_listtree_scroll_with_combo */ - -static const struct button_mapping button_context_yesno[] = { - { ACTION_YESNO_ACCEPT, BUTTON_SELECT, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), -}; /* button_context_settings_yesno */ - -static const struct button_mapping button_context_quickscreen[] = { - { ACTION_NONE, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_STD_CANCEL, BUTTON_MODE|BUTTON_REL, BUTTON_NONE }, - - { ACTION_QS_TOP, BUTTON_UP|BUTTON_REL, BUTTON_NONE }, - { ACTION_QS_TOP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_QS_DOWN, BUTTON_DOWN|BUTTON_REL, BUTTON_NONE }, - { ACTION_QS_DOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_QS_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_NONE }, - { ACTION_QS_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_QS_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_NONE }, - { ACTION_QS_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), -}; /* button_context_quickscreen */ - -static const struct button_mapping button_context_settings_right_is_inc[] = { - { ACTION_SETTINGS_INC, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_SETTINGS_INCREPEAT,BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_SETTINGS_DEC, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_SETTINGS_DECREPEAT,BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_STD_CANCEL, BUTTON_MODE, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), -}; /* button_context_settings_right_is_inc */ - -static const struct button_mapping button_context_pitchscreen[] = { - { ACTION_PS_INC_SMALL, BUTTON_UP, BUTTON_NONE }, - { ACTION_PS_INC_BIG, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_PS_DEC_SMALL, BUTTON_DOWN, BUTTON_NONE }, - { ACTION_PS_DEC_BIG, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_PS_NUDGE_LEFT, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_PS_NUDGE_LEFTOFF, BUTTON_LEFT|BUTTON_REL, BUTTON_NONE }, - - { ACTION_PS_NUDGE_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_PS_NUDGE_RIGHTOFF, BUTTON_RIGHT|BUTTON_REL, BUTTON_NONE }, - - { ACTION_PS_RESET, BUTTON_SELECT, BUTTON_NONE }, - { ACTION_PS_EXIT, BUTTON_MODE, BUTTON_NONE }, - - { ACTION_PS_SLOWER, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_PS_FASTER, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), -}; /* button_context_pitchscreen */ - -/** Recording Screen **/ -#ifdef HAVE_RECORDING -static const struct button_mapping button_context_recscreen[] = { - { ACTION_STD_MENU, BUTTON_MODE|BUTTON_REL, BUTTON_MODE }, - { ACTION_REC_PAUSE, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT }, - { ACTION_STD_CANCEL, BUTTON_MODE|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_REC_NEWFILE, BUTTON_REC|BUTTON_REL, BUTTON_REC }, - - { ACTION_SETTINGS_INC, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_SETTINGS_INCREPEAT,BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_SETTINGS_DEC, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_SETTINGS_DECREPEAT,BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) -}; /* button_context_recscreen */ -#endif - -/** FM Radio Screen **/ -#if CONFIG_TUNER -static const struct button_mapping button_context_radio[] = { - { ACTION_NONE, BUTTON_UP, BUTTON_NONE }, - { ACTION_FM_MENU, BUTTON_DOWN, BUTTON_NONE }, - { ACTION_FM_PRESET, BUTTON_SELECT, BUTTON_NONE }, - { ACTION_FM_STOP, BUTTON_POWERPLAY|BUTTON_REPEAT, BUTTON_POWERPLAY }, - { ACTION_FM_MODE, BUTTON_REC, BUTTON_NONE }, - { ACTION_FM_EXIT, BUTTON_MODE|BUTTON_REL, BUTTON_MODE }, - { ACTION_FM_PLAY, BUTTON_POWERPLAY|BUTTON_REL, BUTTON_POWERPLAY }, - { ACTION_SETTINGS_INC, BUTTON_UP, BUTTON_NONE }, - { ACTION_SETTINGS_INCREPEAT,BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_SETTINGS_DEC, BUTTON_DOWN, BUTTON_NONE }, - { ACTION_SETTINGS_DECREPEAT,BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS) -}; /* button_context_radio */ -#endif - -static const struct button_mapping button_context_keyboard[] = { - { ACTION_KBD_LEFT, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_KBD_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_KBD_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - -// { ACTION_KBD_CURSOR_LEFT, BUTTON_REC|BUTTON_LEFT, BUTTON_NONE }, -// { ACTION_KBD_CURSOR_LEFT, BUTTON_REC|BUTTON_LEFT|BUTTON_REPEAT,BUTTON_NONE }, -// { ACTION_KBD_CURSOR_RIGHT, BUTTON_REC|BUTTON_RIGHT, BUTTON_NONE }, -// { ACTION_KBD_CURSOR_RIGHT, BUTTON_REC|BUTTON_RIGHT|BUTTON_REPEAT,BUTTON_NONE }, - - { ACTION_KBD_UP, BUTTON_UP, BUTTON_NONE }, - { ACTION_KBD_UP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_DOWN, BUTTON_DOWN, BUTTON_NONE }, - { ACTION_KBD_DOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, - -// { ACTION_KBD_BACKSPACE, BUTTON_REC|BUTTON_VOLDOWN, BUTTON_NONE }, -// { ACTION_KBD_BACKSPACE, BUTTON_REC|BUTTON_VOLDOWN|BUTTON_REPEAT,BUTTON_NONE }, - -// { ACTION_KBD_PAGE_FLIP, BUTTON_REC|BUTTON_SELECT, BUTTON_REC }, - - { ACTION_KBD_SELECT, BUTTON_SELECT, BUTTON_NONE }, - { ACTION_KBD_DONE, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT }, - { ACTION_KBD_ABORT, BUTTON_MODE, BUTTON_NONE }, - - LAST_ITEM_IN_LIST -}; /* button_context_keyboard */ - -static const struct button_mapping button_context_bmark[] = { -// { ACTION_BMS_DELETE, BUTTON_REC, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), -}; /* button_context_bmark */ - -/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */ -const struct button_mapping* get_context_mapping(int context) -{ - switch (context) - { - case CONTEXT_STD: - return button_context_standard; - - case CONTEXT_WPS: - return button_context_wps; - - case CONTEXT_LIST: - return button_context_list; - case CONTEXT_TREE: - case CONTEXT_MAINMENU: - if (global_settings.hold_lr_for_scroll_in_list) - return button_context_listtree_scroll_without_combo; - else - return button_context_listtree_scroll_with_combo; - case CONTEXT_CUSTOM|CONTEXT_TREE: - return button_context_tree; - - case CONTEXT_SETTINGS: - case CONTEXT_SETTINGS_TIME: - return button_context_settings; - case CONTEXT_CUSTOM|CONTEXT_SETTINGS: - case CONTEXT_SETTINGS_COLOURCHOOSER: - case CONTEXT_SETTINGS_EQ: - return button_context_settings_right_is_inc; - - case CONTEXT_YESNOSCREEN: - return button_context_yesno; -#if CONFIG_TUNER - case CONTEXT_FM: - return button_context_radio; -#endif - case CONTEXT_BOOKMARKSCREEN: - return button_context_bmark; - case CONTEXT_QUICKSCREEN: - return button_context_quickscreen; - case CONTEXT_PITCHSCREEN: - return button_context_pitchscreen; -#ifdef HAVE_RECORDING - case CONTEXT_RECSCREEN: - return button_context_recscreen; -#endif - case CONTEXT_KEYBOARD: - return button_context_keyboard; - - default: - return button_context_standard; - } - return button_context_standard; -} diff --git a/apps/lang/english-us.lang b/apps/lang/english-us.lang index 8ddf4a82d0..b0afe443fb 100644 --- a/apps/lang/english-us.lang +++ b/apps/lang/english-us.lang @@ -15080,7 +15080,7 @@ *: "Press LEFT to cancel." android,hifietma*,zenvision: "Press BACK to cancel." - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." ihifi760,ihifi960: "Double tap RETURN to cancel." ihifi770,ihifi770c,ihifi800: "Press HOME to cancel." iriverh10,samsungyh*: "Double tap LEFT to cancel." @@ -15095,7 +15095,7 @@ *: "Press LEFT to cancel." android,hifietma*,zenvision: "Press BACK to cancel." - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." ihifi760,ihifi960: "Double tap RETURN to cancel." ihifi770,ihifi770c,ihifi800: "Press HOME to cancel." iriverh10,samsungyh*: "Double tap LEFT to cancel." @@ -15110,7 +15110,7 @@ *: "Press LEFT to cancel." android,hifietma*,zenvision: "Press BACK to cancel." - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." ihifi760,ihifi960: "Double tap RETURN to cancel." ihifi770,ihifi770c,ihifi800: "Press HOME to cancel." iriverh10,samsungyh*: "Double tap LEFT to cancel." diff --git a/apps/lang/english.lang b/apps/lang/english.lang index 9ca4c84430..fd90817130 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang @@ -15239,7 +15239,7 @@ *: "Press LEFT to cancel." android,hifietma*,zenvision: "Press BACK to cancel." - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." ihifi760,ihifi960: "Double tap RETURN to cancel." ihifi770,ihifi770c,ihifi800: "Press HOME to cancel." iriverh10,samsungyh*: "Double tap LEFT to cancel." @@ -15254,7 +15254,7 @@ *: "Press LEFT to cancel." android,hifietma*,zenvision: "Press BACK to cancel." - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." ihifi760,ihifi960: "Double tap RETURN to cancel." ihifi770,ihifi770c,ihifi800: "Press HOME to cancel." iriverh10,samsungyh*: "Double tap LEFT to cancel." @@ -15269,7 +15269,7 @@ *: "Press LEFT to cancel." android,hifietma*,zenvision: "Press BACK to cancel." - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." ihifi760,ihifi960: "Double tap RETURN to cancel." ihifi770,ihifi770c,ihifi800: "Press HOME to cancel." iriverh10,samsungyh*: "Double tap LEFT to cancel." diff --git a/apps/lang/italiano.lang b/apps/lang/italiano.lang index dc8cd4be1d..559b53127d 100644 --- a/apps/lang/italiano.lang +++ b/apps/lang/italiano.lang @@ -15031,7 +15031,7 @@ *: "Press LEFT to cancel." android,hifietma*,zenvision: "Press BACK to cancel." - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." ihifi760,ihifi960: "Double tap RETURN to cancel." ihifi770,ihifi770c,ihifi800: "Press HOME to cancel." iriverh10,samsungyh*: "Double tap LEFT to cancel." @@ -15046,7 +15046,7 @@ *: "Premere LEFT per annullare." android,hifietma*,zenvision: "Premere BACK per annullare." - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Premere POWER per annullare." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Premere POWER per annullare." ihifi760,ihifi960: "Premere due volte RETURN per annullare." ihifi770,ihifi770c,ihifi800: "Premere HOME per annullare." iriverh10,samsungyh*: "Premere due volte LEFT per annullare." @@ -15061,7 +15061,7 @@ *: "Premere LEFT per annullare." android,hifietma*,zenvision: "Premere BACK per annullare." - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Premere POWER per annullare." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Premere POWER per annullare." ihifi760,ihifi960: "Premere due volte RETURN per annullare." ihifi770,ihifi770c,ihifi800: "Premere HOME per annullare." iriverh10,samsungyh*: "Premere due volte LEFT per annullare." diff --git a/apps/lang/nederlands.lang b/apps/lang/nederlands.lang index a6a68ed1e6..3e7abc613d 100644 --- a/apps/lang/nederlands.lang +++ b/apps/lang/nederlands.lang @@ -15104,7 +15104,7 @@ *: "Press LEFT to cancel." android,hifietma*,zenvision: "Press BACK to cancel." - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." ihifi760,ihifi960: "Double tap RETURN to cancel." ihifi770,ihifi770c,ihifi800: "Press HOME to cancel." iriverh10,samsungyh*: "Double tap LEFT to cancel." @@ -15120,7 +15120,7 @@ *: "Druk op LINKS om te annuleren." android: "Druk op RECHTS om te annuleren." hifietma*,zenvision: "Druk op BACK om te annuleren." - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Druk op POWER om te annuleren." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Druk op POWER om te annuleren." ihifi760,ihifi960: "Dubbeltik op RETURN om te annuleren." ihifi770,ihifi770c,ihifi800: "Druk op HOME om te annuleren." iriverh10,samsungyh*: "Dubbeltik op LINKS om te annuleren." @@ -15136,7 +15136,7 @@ *: "Druk op LINKS om te annuleren." android: "Druk op RECHTS om te annuleren." hifietma*,zenvision: "Druk op BACK om te annuleren." - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Druk op POWER om te annuleren." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Druk op POWER om te annuleren." ihifi760,ihifi960: "Dubbeltik op RETURN om te annuleren." ihifi770,ihifi770c,ihifi800: "Druk op HOME om te annuleren." iriverh10,samsungyh*: "Dubbeltik op LINKS om te annuleren." diff --git a/apps/lang/polski.lang b/apps/lang/polski.lang index 6832ccdc87..15f6915dd1 100644 --- a/apps/lang/polski.lang +++ b/apps/lang/polski.lang @@ -15038,7 +15038,7 @@ *: "Press LEFT to cancel." android,hifietma*,zenvision: "Press BACK to cancel." - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." ihifi760,ihifi960: "Double tap RETURN to cancel." ihifi770,ihifi770c,ihifi800: "Press HOME to cancel." iriverh10,samsungyh*: "Double tap LEFT to cancel." @@ -15053,7 +15053,7 @@ *: "Wciśnij LEFT, aby anulować." android,hifietma*,zenvision: "Wciśnij BACK, aby anulować." - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Wciśnij POWER, aby anulować." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Wciśnij POWER, aby anulować." ihifi760,ihifi960: "Podwójnie stuknij RETURN, aby anulować." ihifi770,ihifi770c,ihifi800: "Wciśnij HOME, aby anulować." iriverh10,samsungyh*: "Podwójnie stuknij LEFT, aby anulować." @@ -15068,7 +15068,7 @@ *: "Wciśnij left, aby anulować." android,hifietma*,zenvision: "Wciśnij bak, aby anulować." - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Wciśnij pałer, aby anulować." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Wciśnij pałer, aby anulować." ihifi760,ihifi960: "Podwójnie stuknij ritern, aby anulować." ihifi770,ihifi770c,ihifi800: "Wciśnij hołm, aby anulować." iriverh10,samsungyh*: "Podwójnie stuknij left, aby anulować." diff --git a/apps/lang/russian.lang b/apps/lang/russian.lang index 6364c71c0b..9d71ad819c 100644 --- a/apps/lang/russian.lang +++ b/apps/lang/russian.lang @@ -15161,7 +15161,7 @@ *: "Press LEFT to cancel." android,hifietma*,zenvision: "Press BACK to cancel." - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." ihifi760,ihifi960: "Double tap RETURN to cancel." ihifi770,ihifi770c,ihifi800: "Press HOME to cancel." iriverh10,samsungyh*: "Double tap LEFT to cancel." @@ -15176,7 +15176,7 @@ *: "Нажмите ВЛЕВО для отмены." android,hifietma*,zenvision: "Нажмите НАЗАД для отмены." - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Нажмите ВКЛ. для отмены." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Нажмите ВКЛ. для отмены." ihifi760,ihifi960: "Дважды нажмите ВОЗВРАТ для отмены." ihifi770,ihifi770c,ihifi800: "Нажмите ДОМОЙ для отмены." iriverh10,samsungyh*: "Дважды нажмите ВЛЕВО для отмены." @@ -15191,7 +15191,7 @@ *: "Нажмите кнопку Влево для отмены." android,hifietma*,zenvision: "Нажмите кнопку Назад для отмены." - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Нажмите кнопку включения для отмены." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Нажмите кнопку включения для отмены." ihifi760,ihifi960: "Дважды нажмите кнопку Назад для отмены." ihifi770,ihifi770c,ihifi800: "Нажмите кнопку Домой для отмены." iriverh10,samsungyh*: "Дважды нажмите кнопку Влево для отмены." diff --git a/apps/lang/slovak.lang b/apps/lang/slovak.lang index 65015a5990..00f98ecd35 100644 --- a/apps/lang/slovak.lang +++ b/apps/lang/slovak.lang @@ -15056,7 +15056,7 @@ *: "Press LEFT to cancel." android,hifietma*,zenvision: "Press BACK to cancel." - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." ihifi760,ihifi960: "Double tap RETURN to cancel." ihifi770,ihifi770c,ihifi800: "Press HOME to cancel." iriverh10,samsungyh*: "Double tap LEFT to cancel." @@ -15071,7 +15071,7 @@ *: "Stlačte LEFT pre zrušenie" android: "Stlačte späť pre zrušenie" - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Stlačte POWER pre zrušenie" + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Stlačte POWER pre zrušenie" hifietma*,zenvision: "Stlačte BACK Pre zrušenie" ihifi760,ihifi960: "Poklepte RETURN pre zrušenie" ihifi770,ihifi770c,ihifi800: "Stlačte HOME pre zrušenie" @@ -15087,7 +15087,7 @@ *: "Stlačte LEFT pre zrušenie" android: "Stlačte späť pre zrušenie" - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Stlačte POWER pre zrušenie" + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Stlačte POWER pre zrušenie" hifietma*,zenvision: "Stlačte BACK Pre zrušenie" ihifi760,ihifi960: "Poklepte RETURN pre zrušenie" ihifi770,ihifi770c,ihifi800: "Stlačte HOME pre zrušenie" diff --git a/apps/lang/srpski.lang b/apps/lang/srpski.lang index db93124c8f..95063ca0c0 100644 --- a/apps/lang/srpski.lang +++ b/apps/lang/srpski.lang @@ -15318,7 +15318,7 @@ *: "Press LEFT to cancel." android,hifietma*,zenvision: "Press BACK to cancel." - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." ihifi760,ihifi960: "Double tap RETURN to cancel." ihifi770,ihifi770c,ihifi800: "Press HOME to cancel." iriverh10,samsungyh*: "Double tap LEFT to cancel." @@ -15333,7 +15333,7 @@ *: "Притисните LEFT за прекид." android,hifietma*,zenvision: "Притисните BACK за прекид." - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Притисните POWER за прекид." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Притисните POWER за прекид." ihifi760,ihifi960: "Дупли тап RETURN за прекид." ihifi770,ihifi770c,ihifi800: "Притисните HOME за прекид." iriverh10,samsungyh*: "Дупли тап LEFT за прекид." @@ -15348,7 +15348,7 @@ *: "Притисните LEFT за прекид." android,hifietma*,zenvision: "Притисните BACK за прекид." - cowond2,creativezenxfi2,iaudio7,ibassodx50,ibassodx90,mrobe500,ondavx747: "Притисните POWER за прекид." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Притисните POWER за прекид." ihifi760,ihifi960: "Дупли тап RETURN за прекид." ihifi770,ihifi770c,ihifi800: "Притисните HOME за прекид." iriverh10,samsungyh*: "Дупли тап LEFT за прекид." diff --git a/apps/plugins/battery_bench.c b/apps/plugins/battery_bench.c index f8269f5c3b..d9c5eae516 100644 --- a/apps/plugins/battery_bench.c +++ b/apps/plugins/battery_bench.c @@ -141,13 +141,6 @@ #define BATTERY_OFF BUTTON_POWER #define BATTERY_OFF_TXT "POWER" -#elif CONFIG_KEYPAD == IAUDIO67_PAD - -#define BATTERY_OFF BUTTON_POWER -#define BATTERY_OFF_TXT "POWER" -#define BATTERY_ON BUTTON_PLAY -#define BATTERY_ON_TXT "PLAY - start" - #elif CONFIG_KEYPAD == CREATIVEZVM_PAD #define BATTERY_ON BUTTON_PLAY #define BATTERY_ON_TXT "PLAY - start" diff --git a/apps/plugins/calculator.c b/apps/plugins/calculator.c index 4d1b6fa594..ebf7098d65 100644 --- a/apps/plugins/calculator.c +++ b/apps/plugins/calculator.c @@ -269,19 +269,6 @@ F3: equal to "=" #define CALCULATOR_QUIT BUTTON_POWER #define CALCULATOR_CLEAR BUTTON_MENU -#elif CONFIG_KEYPAD == IAUDIO67_PAD - -#define CALCULATOR_LEFT BUTTON_LEFT -#define CALCULATOR_RIGHT BUTTON_RIGHT -#define CALCULATOR_UP BUTTON_VOLUP -#define CALCULATOR_DOWN BUTTON_VOLDOWN -#define CALCULATOR_QUIT BUTTON_POWER -#define CALCULATOR_INPUT BUTTON_PLAY -#define CALCULATOR_CALC BUTTON_MENU -#define CALCULATOR_CLEAR BUTTON_STOP - -#define CALCULATOR_RC_QUIT (BUTTON_MENU|BUTTON_PLAY) - #elif (CONFIG_KEYPAD == CREATIVEZVM_PAD) #define CALCULATOR_LEFT BUTTON_LEFT diff --git a/apps/plugins/chessclock.c b/apps/plugins/chessclock.c index 9a30dee984..79daf0987c 100644 --- a/apps/plugins/chessclock.c +++ b/apps/plugins/chessclock.c @@ -157,17 +157,6 @@ #define CHC_SETTINGS_DEC BUTTON_MINUS #define CHC_SETTINGS_CANCEL BUTTON_POWER -#elif CONFIG_KEYPAD == IAUDIO67_PAD -#define CHC_QUIT BUTTON_POWER -#define CHC_STARTSTOP BUTTON_PLAY -#define CHC_RESET BUTTON_LEFT -#define CHC_MENU BUTTON_MENU -#define CHC_SETTINGS_INC BUTTON_VOLUP -#define CHC_SETTINGS_DEC BUTTON_VOLDOWN -#define CHC_SETTINGS_OK BUTTON_PLAY -#define CHC_SETTINGS_OK2 BUTTON_LEFT -#define CHC_SETTINGS_CANCEL BUTTON_POWER - #elif CONFIG_KEYPAD == CREATIVEZVM_PAD #define CHC_QUIT BUTTON_BACK #define CHC_STARTSTOP BUTTON_PLAY diff --git a/apps/plugins/chopper.c b/apps/plugins/chopper.c index ab8f7b5540..70763a1b67 100644 --- a/apps/plugins/chopper.c +++ b/apps/plugins/chopper.c @@ -108,12 +108,6 @@ Still To do: #define QUIT BUTTON_POWER #define ACTION2 BUTTON_PLUS -#elif CONFIG_KEYPAD == IAUDIO67_PAD -#define QUIT BUTTON_POWER -#define ACTION BUTTON_PLAY -#define ACTION2 BUTTON_STOP -#define ACTIONTEXT "PLAY" - #elif CONFIG_KEYPAD == CREATIVEZVM_PAD #define QUIT BUTTON_BACK #define ACTION BUTTON_UP diff --git a/apps/plugins/clix.c b/apps/plugins/clix.c index f1f21f6312..c127a300f2 100644 --- a/apps/plugins/clix.c +++ b/apps/plugins/clix.c @@ -100,14 +100,6 @@ #define CLIX_BUTTON_UP BUTTON_SCROLL_UP #define CLIX_BUTTON_DOWN BUTTON_SCROLL_DOWN -#elif CONFIG_KEYPAD == IAUDIO67_PAD -#define CLIX_BUTTON_QUIT BUTTON_POWER -#define CLIX_BUTTON_LEFT BUTTON_LEFT -#define CLIX_BUTTON_RIGHT BUTTON_RIGHT -#define CLIX_BUTTON_CLICK BUTTON_PLAY -#define CLIX_BUTTON_UP BUTTON_STOP -#define CLIX_BUTTON_DOWN BUTTON_PLAY - #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD #define CLIX_BUTTON_QUIT BUTTON_POWER #define CLIX_BUTTON_LEFT BUTTON_LEFT diff --git a/apps/plugins/cube.c b/apps/plugins/cube.c index 6587fdcb65..cb9d67ec35 100644 --- a/apps/plugins/cube.c +++ b/apps/plugins/cube.c @@ -171,16 +171,6 @@ #elif CONFIG_KEYPAD == COWON_D2_PAD #define CUBE_QUIT BUTTON_POWER -#elif (CONFIG_KEYPAD == IAUDIO67_PAD) -#define CUBE_QUIT BUTTON_POWER -#define CUBE_NEXT BUTTON_RIGHT -#define CUBE_PREV BUTTON_LEFT -#define CUBE_INC BUTTON_VOLUP -#define CUBE_DEC BUTTON_VOLDOWN -#define CUBE_MODE BUTTON_MENU -#define CUBE_PAUSE BUTTON_PLAY -#define CUBE_HIGHSPEED BUTTON_STOP - #elif CONFIG_KEYPAD == CREATIVEZVM_PAD #define CUBE_QUIT BUTTON_BACK #define CUBE_NEXT BUTTON_RIGHT diff --git a/apps/plugins/doom/i_video.c b/apps/plugins/doom/i_video.c index bb04194acc..2381a7614d 100644 --- a/apps/plugins/doom/i_video.c +++ b/apps/plugins/doom/i_video.c @@ -316,16 +316,6 @@ void I_ShutdownGraphics(void) #define DOOMBUTTON_ENTER BUTTON_MENU #define DOOMBUTTON_WEAPON BUTTON_DISPLAY -#elif CONFIG_KEYPAD == IAUDIO67_PAD -#define DOOMBUTTON_ESC BUTTON_POWER -#define DOOMBUTTON_UP BUTTON_STOP -#define DOOMBUTTON_DOWN BUTTON_PLAY -#define DOOMBUTTON_LEFT BUTTON_LEFT -#define DOOMBUTTON_RIGHT BUTTON_RIGHT -#define DOOMBUTTON_SHOOT BUTTON_VOLUP -#define DOOMBUTTON_OPEN BUTTON_VOLDOWN -#define DOOMBUTTON_ENTER BUTTON_MENU - #elif CONFIG_KEYPAD == CREATIVEZVM_PAD #define DOOMBUTTON_UP BUTTON_UP #define DOOMBUTTON_DOWN BUTTON_DOWN diff --git a/apps/plugins/imageviewer/imageviewer_button.h b/apps/plugins/imageviewer/imageviewer_button.h index cfb9a2969b..d588de95ca 100644 --- a/apps/plugins/imageviewer/imageviewer_button.h +++ b/apps/plugins/imageviewer/imageviewer_button.h @@ -207,17 +207,6 @@ #elif CONFIG_KEYPAD == COWON_D2_PAD -#elif CONFIG_KEYPAD == IAUDIO67_PAD -#define IMGVIEW_ZOOM_IN BUTTON_VOLUP -#define IMGVIEW_ZOOM_OUT BUTTON_VOLDOWN -#define IMGVIEW_UP BUTTON_STOP -#define IMGVIEW_DOWN BUTTON_PLAY -#define IMGVIEW_LEFT BUTTON_LEFT -#define IMGVIEW_RIGHT BUTTON_RIGHT -#define IMGVIEW_NEXT (BUTTON_PLAY|BUTTON_VOLUP) -#define IMGVIEW_PREVIOUS (BUTTON_PLAY|BUTTON_VOLDOWN) -#define IMGVIEW_MENU BUTTON_MENU - #elif CONFIG_KEYPAD == CREATIVEZVM_PAD #define IMGVIEW_ZOOM_IN BUTTON_PLAY diff --git a/apps/plugins/invadrox.c b/apps/plugins/invadrox.c index 8b0519d9d0..c28ab7e830 100644 --- a/apps/plugins/invadrox.c +++ b/apps/plugins/invadrox.c @@ -163,13 +163,6 @@ #define RIGHT BUTTON_PLUS #define FIRE BUTTON_MENU -#elif CONFIG_KEYPAD == IAUDIO67_PAD - -#define QUIT BUTTON_POWER -#define LEFT BUTTON_LEFT -#define RIGHT BUTTON_RIGHT -#define FIRE BUTTON_PLAY - #elif CONFIG_KEYPAD == CREATIVEZVM_PAD #define QUIT BUTTON_BACK diff --git a/apps/plugins/jewels.c b/apps/plugins/jewels.c index 83a44eea02..af0189e9db 100644 --- a/apps/plugins/jewels.c +++ b/apps/plugins/jewels.c @@ -201,16 +201,6 @@ CONFIG_KEYPAD == SANSA_M200_PAD #define JEWELS_CANCEL BUTTON_POWER #define HK_CANCEL "POWER" -#elif CONFIG_KEYPAD == IAUDIO67_PAD -#define JEWELS_UP BUTTON_STOP -#define JEWELS_DOWN BUTTON_PLAY -#define JEWELS_LEFT BUTTON_LEFT -#define JEWELS_RIGHT BUTTON_RIGHT -#define JEWELS_SELECT BUTTON_MENU -#define JEWELS_CANCEL BUTTON_POWER -#define HK_SELECT "MENU" -#define HK_CANCEL "POWER" - #elif CONFIG_KEYPAD == CREATIVEZVM_PAD #define JEWELS_UP BUTTON_UP #define JEWELS_DOWN BUTTON_DOWN diff --git a/apps/plugins/lib/pluginlib_actions.c b/apps/plugins/lib/pluginlib_actions.c index b1bcd06ee6..907cb3ee42 100644 --- a/apps/plugins/lib/pluginlib_actions.c +++ b/apps/plugins/lib/pluginlib_actions.c @@ -161,15 +161,6 @@ const struct button_mapping pla_main_ctx[] = { PLA_DOWN_REPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, { PLA_LEFT_REPEAT, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE }, { PLA_RIGHT_REPEAT, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE }, -#elif (CONFIG_KEYPAD == IAUDIO67_PAD) - { PLA_UP, BUTTON_STOP, BUTTON_NONE }, - { PLA_DOWN, BUTTON_PLAY, BUTTON_NONE }, - { PLA_LEFT, BUTTON_LEFT, BUTTON_NONE }, - { PLA_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, - { PLA_UP_REPEAT, BUTTON_STOP|BUTTON_REPEAT, BUTTON_NONE }, - { PLA_DOWN_REPEAT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE }, - { PLA_LEFT_REPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { PLA_RIGHT_REPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, #elif (CONFIG_KEYPAD == PBELL_VIBE500_PAD) { PLA_UP, BUTTON_UP, BUTTON_NONE}, { PLA_DOWN, BUTTON_DOWN, BUTTON_NONE}, @@ -394,12 +385,6 @@ const struct button_mapping pla_main_ctx[] = {PLA_SELECT, BUTTON_PLAY, BUTTON_NONE}, {PLA_SELECT_REL, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY}, {PLA_SELECT_REPEAT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE}, -#elif (CONFIG_KEYPAD == IAUDIO67_PAD) - {PLA_CANCEL, BUTTON_POWER|BUTTON_REL, BUTTON_POWER}, - {PLA_EXIT, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE}, - {PLA_SELECT, BUTTON_PLAY, BUTTON_NONE}, - {PLA_SELECT_REL, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY}, - {PLA_SELECT_REPEAT, BUTTON_PLAY|BUTTON_REPEAT BUTTON_NONE}, #elif (CONFIG_KEYPAD == CREATIVEZVM_PAD) {PLA_CANCEL, BUTTON_BACK|BUTTON_REL, BUTTON_BACK}, {PLA_EXIT, BUTTON_BACK|BUTTON_REPEAT, BUTTON_NONE}, diff --git a/apps/plugins/midi/midiplay.c b/apps/plugins/midi/midiplay.c index f07cdd4dcf..a28d1d3862 100644 --- a/apps/plugins/midi/midiplay.c +++ b/apps/plugins/midi/midiplay.c @@ -140,14 +140,6 @@ #elif CONFIG_KEYPAD == COWON_D2_PAD #define MIDI_QUIT BUTTON_POWER -#elif CONFIG_KEYPAD == IAUDIO67_PAD -#define MIDI_QUIT BUTTON_POWER -#define MIDI_FFWD BUTTON_RIGHT -#define MIDI_REWIND BUTTON_LEFT -#define MIDI_VOL_UP BUTTON_STOP -#define MIDI_VOL_DOWN BUTTON_PLAY -#define MIDI_PLAYPAUSE BUTTON_MENU - #elif CONFIG_KEYPAD == CREATIVEZVM_PAD #define MIDI_QUIT BUTTON_BACK #define MIDI_FFWD BUTTON_RIGHT diff --git a/apps/plugins/mp3_encoder.c b/apps/plugins/mp3_encoder.c index 7c5084529b..db10185c91 100644 --- a/apps/plugins/mp3_encoder.c +++ b/apps/plugins/mp3_encoder.c @@ -2443,12 +2443,6 @@ static void get_mp3_filename(const char *wav_name) #elif CONFIG_KEYPAD == COWON_D2_PAD #define MP3ENC_DONE BUTTON_POWER -#elif CONFIG_KEYPAD == IAUDIO67_PAD -#define MP3ENC_PREV BUTTON_LEFT -#define MP3ENC_NEXT BUTTON_RIGHT -#define MP3ENC_DONE BUTTON_POWER -#define MP3ENC_SELECT BUTTON_PLAY - #elif CONFIG_KEYPAD == CREATIVEZVM_PAD #define MP3ENC_PREV BUTTON_UP #define MP3ENC_NEXT BUTTON_DOWN diff --git a/apps/plugins/mpegplayer/mpeg_settings.c b/apps/plugins/mpegplayer/mpeg_settings.c index d59797eaa7..505f3aa33d 100644 --- a/apps/plugins/mpegplayer/mpeg_settings.c +++ b/apps/plugins/mpegplayer/mpeg_settings.c @@ -142,14 +142,6 @@ struct mpeg_settings settings; #elif CONFIG_KEYPAD == COWON_D2_PAD #define MPEG_START_TIME_EXIT BUTTON_POWER -#elif CONFIG_KEYPAD == IAUDIO67_PAD -#define MPEG_START_TIME_SELECT BUTTON_MENU -#define MPEG_START_TIME_LEFT BUTTON_LEFT -#define MPEG_START_TIME_RIGHT BUTTON_RIGHT -#define MPEG_START_TIME_UP BUTTON_STOP -#define MPEG_START_TIME_DOWN BUTTON_PLAY -#define MPEG_START_TIME_EXIT BUTTON_POWER - #elif CONFIG_KEYPAD == CREATIVEZVM_PAD #define MPEG_START_TIME_SELECT BUTTON_SELECT #define MPEG_START_TIME_LEFT BUTTON_LEFT diff --git a/apps/plugins/mpegplayer/mpegplayer.c b/apps/plugins/mpegplayer/mpegplayer.c index 6b18e4fa3a..34eafd5d9c 100644 --- a/apps/plugins/mpegplayer/mpegplayer.c +++ b/apps/plugins/mpegplayer/mpegplayer.c @@ -254,15 +254,6 @@ CONFIG_KEYPAD == SANSA_M200_PAD #define MPEG_VOLDOWN BUTTON_MINUS #define MPEG_VOLUP BUTTON_PLUS -#elif CONFIG_KEYPAD == IAUDIO67_PAD -#define MPEG_MENU BUTTON_MENU -#define MPEG_STOP BUTTON_STOP -#define MPEG_PAUSE BUTTON_PLAY -#define MPEG_VOLDOWN BUTTON_VOLDOWN -#define MPEG_VOLUP BUTTON_VOLUP -#define MPEG_RW BUTTON_LEFT -#define MPEG_FF BUTTON_RIGHT - #elif CONFIG_KEYPAD == CREATIVEZVM_PAD #define MPEG_MENU BUTTON_MENU #define MPEG_STOP BUTTON_BACK diff --git a/apps/plugins/pacbox/pacbox.h b/apps/plugins/pacbox/pacbox.h index c1a1c6b9e5..a3d42b099c 100644 --- a/apps/plugins/pacbox/pacbox.h +++ b/apps/plugins/pacbox/pacbox.h @@ -169,18 +169,6 @@ #define PACMAN_MENU (BUTTON_MENU|BUTTON_REL) -#elif CONFIG_KEYPAD == IAUDIO67_PAD - -#define PACMAN_UP BUTTON_STOP -#define PACMAN_DOWN BUTTON_PLAY -#define PACMAN_LEFT BUTTON_LEFT -#define PACMAN_RIGHT BUTTON_RIGHT -#define PACMAN_1UP BUTTON_VOLDOWN -#define PACMAN_2UP BUTTON_VOLUP -#define PACMAN_COIN_PRE BUTTON_MENU -#define PACMAN_COIN (BUTTON_MENU | BUTTON_PLAY) -#define PACMAN_MENU BUTTON_POWER - #elif CONFIG_KEYPAD == CREATIVEZVM_PAD #define PACMAN_UP BUTTON_UP diff --git a/apps/plugins/pictureflow/pictureflow.c b/apps/plugins/pictureflow/pictureflow.c index 42930f0ff6..8f59695127 100644 --- a/apps/plugins/pictureflow/pictureflow.c +++ b/apps/plugins/pictureflow/pictureflow.c @@ -103,10 +103,8 @@ const struct button_mapping pf_context_buttons[] = {PF_SELECT, BUTTON_CENTER, BUTTON_NONE}, {PF_BACK, BUTTON_BOTTOMRIGHT, BUTTON_NONE}, #endif -#if CONFIG_KEYPAD == SANSA_C100_PAD - {PF_QUIT, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU}, -#elif CONFIG_KEYPAD == CREATIVEZV_PAD || CONFIG_KEYPAD == CREATIVEZVM_PAD || \ - CONFIG_KEYPAD == PHILIPS_HDD1630_PAD || CONFIG_KEYPAD == IAUDIO67_PAD || \ +#if CONFIG_KEYPAD == CREATIVEZV_PAD || CONFIG_KEYPAD == CREATIVEZVM_PAD || \ + CONFIG_KEYPAD == PHILIPS_HDD1630_PAD || \ CONFIG_KEYPAD == GIGABEAT_PAD || CONFIG_KEYPAD == GIGABEAT_S_PAD || \ CONFIG_KEYPAD == MROBE100_PAD || CONFIG_KEYPAD == MROBE500_PAD || \ CONFIG_KEYPAD == PHILIPS_SA9200_PAD || CONFIG_KEYPAD == SANSA_CLIP_PAD || \ @@ -137,8 +135,6 @@ const struct button_mapping pf_context_buttons[] = || (CONFIG_KEYPAD == IPOD_4G_PAD) \ || (CONFIG_KEYPAD == MPIO_HD300_PAD) {PF_QUIT, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU}, -#elif CONFIG_KEYPAD == LOGIK_DAX_PAD - {PF_QUIT, BUTTON_POWERPLAY|BUTTON_REPEAT, BUTTON_POWERPLAY}, #elif CONFIG_KEYPAD == IAUDIO_M3_PAD {PF_QUIT, BUTTON_RC_REC, BUTTON_NONE}, #elif CONFIG_KEYPAD == MEIZU_M6SL_PAD diff --git a/apps/plugins/plugin.lds b/apps/plugins/plugin.lds index 5931b6b0a5..7033d023f3 100644 --- a/apps/plugins/plugin.lds +++ b/apps/plugins/plugin.lds @@ -54,7 +54,7 @@ OUTPUT_FORMAT(elf32-littlemips) #elif CONFIG_CPU==S3C2440 #include "cpu.h" /* must be 16Kb (0x4000) aligned */ -#define TTB_SIZE (0x4000) +#define TTB_SIZE (0x4000) #define DRAMSIZE (MEMORYSIZE * 0x100000) - STUBOFFSET - PLUGIN_BUFFER_SIZE - CODEC_SIZE - LCD_BUFFER_SIZE - TTB_SIZE #elif CONFIG_CPU==TCC7801 @@ -127,7 +127,7 @@ OUTPUT_FORMAT(elf32-littlemips) /* The bit of IRAM that is available is used in the core */ #define IRAMSIZE 0 -#elif defined(CPU_TCC780X) || defined(CPU_TCC77X) +#elif defined(CPU_TCC780X) #define DRAMORIG 0x20000000 #if CONFIG_CPU==TCC7801 #define IRAMORIG 0x1000c000 @@ -272,7 +272,7 @@ SECTIONS *(.idata) #endif } > PLUGIN_RAM - + #if NOCACHE_BASE != 0 .ncdata . + NOCACHE_BASE : { @@ -281,7 +281,7 @@ SECTIONS . = ALIGN(CACHEALIGN_SIZE); /* EABI currently needs these defined here, otherwise .iram and .bss can sometimes have an incorrect load address, breaking codecs and plugins. */ - bssaddr = . - NOCACHE_BASE; + bssaddr = . - NOCACHE_BASE; #if defined(IRAMSIZE) && IRAMSIZE != 0 iramcopy = . - NOCACHE_BASE; #endif @@ -314,7 +314,7 @@ SECTIONS *(COMMON) . = ALIGN(0x4); } > PLUGIN_RAM - + #if NOCACHE_BASE != 0 .ncbss . + NOCACHE_BASE (NOLOAD) : { @@ -354,7 +354,7 @@ SECTIONS . = ALIGN(0x4); iend = .; } > PLUGIN_IRAM - + loadendaddr = MAX(plugin_end_addr, LOADADDR(.iram) + SIZEOF(.iram)); #else loadendaddr = plugin_end_addr; diff --git a/apps/plugins/pong.c b/apps/plugins/pong.c index b06789af6b..22484d0bc9 100644 --- a/apps/plugins/pong.c +++ b/apps/plugins/pong.c @@ -139,14 +139,6 @@ #elif (CONFIG_KEYPAD == COWON_D2_PAD) #define PONG_QUIT BUTTON_POWER -#elif CONFIG_KEYPAD == IAUDIO67_PAD -#define PONG_QUIT BUTTON_POWER -#define PONG_PAUSE BUTTON_MENU -#define PONG_LEFT_UP BUTTON_VOLUP -#define PONG_LEFT_DOWN BUTTON_VOLDOWN -#define PONG_RIGHT_UP BUTTON_RIGHT -#define PONG_RIGHT_DOWN BUTTON_LEFT - #elif CONFIG_KEYPAD == CREATIVEZVM_PAD #define PONG_QUIT BUTTON_BACK #define PONG_LEFT_UP BUTTON_UP diff --git a/apps/plugins/reversi/reversi-gui.h b/apps/plugins/reversi/reversi-gui.h index fd60b23927..7e031e6103 100644 --- a/apps/plugins/reversi/reversi-gui.h +++ b/apps/plugins/reversi/reversi-gui.h @@ -136,15 +136,6 @@ #define REVERSI_BUTTON_QUIT BUTTON_POWER #define REVERSI_BUTTON_MENU BUTTON_MENU -#elif CONFIG_KEYPAD == IAUDIO67_PAD -#define REVERSI_BUTTON_QUIT BUTTON_POWER -#define REVERSI_BUTTON_UP BUTTON_STOP -#define REVERSI_BUTTON_DOWN BUTTON_PLAY -#define REVERSI_BUTTON_LEFT BUTTON_LEFT -#define REVERSI_BUTTON_RIGHT BUTTON_RIGHT -#define REVERSI_BUTTON_MAKE_MOVE BUTTON_VOLUP -#define REVERSI_BUTTON_MENU BUTTON_MENU - #elif CONFIG_KEYPAD == CREATIVEZVM_PAD #define REVERSI_BUTTON_QUIT BUTTON_BACK #define REVERSI_BUTTON_UP BUTTON_UP diff --git a/apps/plugins/rockblox.c b/apps/plugins/rockblox.c index 9c36f8f62f..e85c6a5eab 100644 --- a/apps/plugins/rockblox.c +++ b/apps/plugins/rockblox.c @@ -205,17 +205,6 @@ #define ROCKBLOX_OFF BUTTON_POWER #define ROCKBLOX_RESTART BUTTON_MENU -#elif CONFIG_KEYPAD == IAUDIO67_PAD - -#define ROCKBLOX_OFF BUTTON_POWER -#define ROCKBLOX_ROTATE_CCW BUTTON_VOLDOWN -#define ROCKBLOX_ROTATE_CW BUTTON_VOLUP -#define ROCKBLOX_DOWN BUTTON_STOP -#define ROCKBLOX_LEFT BUTTON_LEFT -#define ROCKBLOX_RIGHT BUTTON_RIGHT -#define ROCKBLOX_DROP BUTTON_PLAY -#define ROCKBLOX_RESTART BUTTON_MENU - #elif CONFIG_KEYPAD == CREATIVEZVM_PAD #define ROCKBLOX_OFF BUTTON_BACK #define ROCKBLOX_ROTATE_CCW BUTTON_UP diff --git a/apps/plugins/sokoban.c b/apps/plugins/sokoban.c index 9d57d7428c..41c671a38c 100644 --- a/apps/plugins/sokoban.c +++ b/apps/plugins/sokoban.c @@ -312,20 +312,6 @@ #define SOKOBAN_LEVEL_UP BUTTON_PLUS #define SOKOBAN_MENU_NAME "[MENU]" -#elif CONFIG_KEYPAD == IAUDIO67_PAD -#define SOKOBAN_LEFT BUTTON_LEFT -#define SOKOBAN_RIGHT BUTTON_RIGHT -#define SOKOBAN_UP BUTTON_STOP -#define SOKOBAN_DOWN BUTTON_PLAY -#define SOKOBAN_MENU BUTTON_MENU -#define SOKOBAN_UNDO BUTTON_VOLDOWN -#define SOKOBAN_REDO BUTTON_VOLUP -#define SOKOBAN_PAUSE (BUTTON_MENU|BUTTON_LEFT) -#define BUTTON_SAVE (BUTTON_MENU|BUTTON_PLAY) -#define BUTTON_SAVE_NAME "MENU+PLAY" - -#define SOKOBAN_RC_MENU (BUTTON_MENU|BUTTON_STOP) - #elif CONFIG_KEYPAD == CREATIVEZVM_PAD #define SOKOBAN_LEFT BUTTON_LEFT #define SOKOBAN_RIGHT BUTTON_RIGHT diff --git a/apps/plugins/stopwatch.c b/apps/plugins/stopwatch.c index 5259d0d616..c5ecfd7a8a 100644 --- a/apps/plugins/stopwatch.c +++ b/apps/plugins/stopwatch.c @@ -133,15 +133,6 @@ #elif CONFIG_KEYPAD == COWON_D2_PAD #define STOPWATCH_QUIT BUTTON_POWER -#elif CONFIG_KEYPAD == IAUDIO67_PAD -#define STOPWATCH_QUIT BUTTON_MENU -#define STOPWATCH_START_STOP BUTTON_PLAY -#define STOPWATCH_RESET_TIMER BUTTON_STOP -#define STOPWATCH_LAP_TIMER BUTTON_LEFT -#define STOPWATCH_SCROLL_UP BUTTON_VOLUP -#define STOPWATCH_SCROLL_DOWN BUTTON_VOLDOWN -#define STOPWATCH_RC_QUIT BUTTON_POWER - #elif CONFIG_KEYPAD == CREATIVEZVM_PAD #define STOPWATCH_QUIT BUTTON_BACK #define STOPWATCH_START_STOP BUTTON_PLAY diff --git a/apps/plugins/sudoku/sudoku.h b/apps/plugins/sudoku/sudoku.h index 6ee3eb33ee..1332a9a80f 100644 --- a/apps/plugins/sudoku/sudoku.h +++ b/apps/plugins/sudoku/sudoku.h @@ -181,16 +181,6 @@ #define SUDOKU_BUTTON_QUIT BUTTON_POWER #define SUDOKU_BUTTON_MENU BUTTON_MENU -#elif CONFIG_KEYPAD == IAUDIO67_PAD -#define SUDOKU_BUTTON_QUIT BUTTON_POWER -#define SUDOKU_BUTTON_UP BUTTON_STOP -#define SUDOKU_BUTTON_DOWN BUTTON_PLAY -#define SUDOKU_BUTTON_LEFT BUTTON_LEFT -#define SUDOKU_BUTTON_RIGHT BUTTON_RIGHT -#define SUDOKU_BUTTON_TOGGLE BUTTON_VOLUP -#define SUDOKU_BUTTON_MENU BUTTON_MENU -#define SUDOKU_BUTTON_POSSIBLE BUTTON_VOLDOWN - #elif CONFIG_KEYPAD == CREATIVEZVM_PAD #define SUDOKU_BUTTON_QUIT BUTTON_BACK #define SUDOKU_BUTTON_UP BUTTON_UP diff --git a/apps/plugins/text_viewer/tv_button.h b/apps/plugins/text_viewer/tv_button.h index bea8f829ef..26bfb7a464 100644 --- a/apps/plugins/text_viewer/tv_button.h +++ b/apps/plugins/text_viewer/tv_button.h @@ -247,18 +247,6 @@ #define TV_SCROLL_DOWN BUTTON_PLUS #define TV_BOOKMARK (BUTTON_MENU|BUTTON_PLUS) -/* Cowon iAudio 7 keys */ -#elif CONFIG_KEYPAD == IAUDIO67_PAD -#define TV_QUIT BUTTON_POWER -#define TV_SCROLL_UP BUTTON_VOLUP -#define TV_SCROLL_DOWN BUTTON_VOLDOWN -#define TV_SCREEN_LEFT BUTTON_LEFT -#define TV_SCREEN_RIGHT BUTTON_RIGHT -#define TV_MENU BUTTON_MENU -#define TV_AUTOSCROLL BUTTON_PLAY -#define TV_RC_QUIT BUTTON_STOP -#define TV_BOOKMARK (BUTTON_LEFT|BUTTON_PLAY) - /* Creative Zen Vision:M keys */ #elif CONFIG_KEYPAD == CREATIVEZVM_PAD #define TV_QUIT BUTTON_BACK diff --git a/apps/plugins/xobox.c b/apps/plugins/xobox.c index 36aae071cb..cf959ad7f5 100644 --- a/apps/plugins/xobox.c +++ b/apps/plugins/xobox.c @@ -146,15 +146,6 @@ #define QUIT BUTTON_POWER -#elif CONFIG_KEYPAD == IAUDIO67_PAD - -#define QUIT BUTTON_POWER -#define LEFT BUTTON_LEFT -#define RIGHT BUTTON_RIGHT -#define UP BUTTON_STOP -#define DOWN BUTTON_PLAY -#define PAUSE BUTTON_MENU - #elif CONFIG_KEYPAD == CREATIVEZVM_PAD #define QUIT BUTTON_BACK diff --git a/apps/plugins/zxbox/keymaps.h b/apps/plugins/zxbox/keymaps.h index dbebc3b1d9..1dcb9c9034 100644 --- a/apps/plugins/zxbox/keymaps.h +++ b/apps/plugins/zxbox/keymaps.h @@ -110,14 +110,6 @@ #elif CONFIG_KEYPAD == COWON_D2_PAD #define ZX_MENU (BUTTON_MENU|BUTTON_REL) -#elif CONFIG_KEYPAD == IAUDIO67_PAD -#define ZX_UP BUTTON_STOP -#define ZX_DOWN BUTTON_PLAY -#define ZX_LEFT BUTTON_LEFT -#define ZX_RIGHT BUTTON_RIGHT -#define ZX_SELECT BUTTON_VOLUP -#define ZX_MENU BUTTON_MENU - #elif CONFIG_KEYPAD == CREATIVEZVM_PAD #define ZX_UP BUTTON_UP #define ZX_DOWN BUTTON_DOWN diff --git a/apps/plugins/zxbox/zxbox_keyb.c b/apps/plugins/zxbox/zxbox_keyb.c index 63f74c7664..1028836351 100644 --- a/apps/plugins/zxbox/zxbox_keyb.c +++ b/apps/plugins/zxbox/zxbox_keyb.c @@ -113,15 +113,6 @@ #define KBD_ABORT BUTTON_POWER -#elif CONFIG_KEYPAD == IAUDIO67_PAD - -#define KBD_SELECT BUTTON_MENU -#define KBD_ABORT BUTTON_POWER -#define KBD_LEFT BUTTON_LEFT -#define KBD_RIGHT BUTTON_RIGHT -#define KBD_UP BUTTON_STOP -#define KBD_DOWN BUTTON_PLAY - #elif CONFIG_KEYPAD == CREATIVEZVM_PAD #define KBD_SELECT BUTTON_SELECT diff --git a/bootloader/SOURCES b/bootloader/SOURCES index 446bdac0e1..ff37971a8d 100644 --- a/bootloader/SOURCES +++ b/bootloader/SOURCES @@ -41,7 +41,7 @@ iriver_h1x0.c iriver_h300.c #elif defined(MROBE_500) mrobe500.c -#elif defined(CPU_TCC77X) || defined(CPU_TCC780X) +#elif defined(CPU_TCC780X) telechips.c show_logo.c #elif defined(MEIZU_M6SL) diff --git a/firmware/SOURCES b/firmware/SOURCES index 463933b8c5..b6f7688946 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES @@ -392,8 +392,6 @@ drivers/rtc/rtc_rx5x348ab.c drivers/rtc/rtc_mr100.c #elif (CONFIG_RTC == RTC_MC13783) drivers/rtc/rtc_mc13783.c -#elif (CONFIG_RTC == RTC_TCC77X) -drivers/rtc/rtc_tcc77x.c #elif (CONFIG_RTC == RTC_JZ4740) drivers/rtc/rtc_jz4740.c #elif (CONFIG_RTC == RTC_JZ4760) @@ -603,7 +601,7 @@ target/arm/ipod/powermgmt-ipod-pcf.c target/arm/pp/i2c-pp.c #elif CONFIG_I2C == I2C_PNX0101 target/arm/pnx0101/i2c-pnx0101.c -#elif CONFIG_I2C == I2C_TCC780X || CONFIG_I2C == I2C_TCC77X +#elif CONFIG_I2C == I2C_TCC780X target/arm/i2c-telechips.c #elif CONFIG_I2C == I2C_S3C2440 target/arm/s3c2440/i2c-s3c2440.c @@ -749,8 +747,6 @@ target/arm/pnx0101/crt0-pnx0101.S target/arm/tms320dm320/crt0.S #elif CONFIG_CPU==S3C2440 target/arm/s3c2440/crt0.S -#elif defined(CPU_TCC77X) -target/arm/tcc77x/crt0.S #elif defined(CPU_TCC780X) target/arm/tcc780x/crt0.S #elif CONFIG_CPU==IMX31L @@ -897,28 +893,8 @@ target/arm/s5l8700/ipodnano2g/adc-nano2g.c target/arm/s5l8700/adc-s5l8700.c # endif -#elif CONFIG_I2C == I2C_TCC77X -target/arm/tcc77x/adc-tcc77x.c - #endif /* CONFIG_I2C */ -#ifdef CPU_TCC77X -target/arm/usb-tcc.c -target/arm/tcc77x/kernel-tcc77x.c -target/arm/tcc77x/system-tcc77x.c -target/arm/tcc77x/timer-tcc77x.c -# ifndef IAUDIO7 -target/arm/tcc77x/powermgmt-tcc77x.c -# endif /* !IAUDIO7 */ -# ifndef BOOTLOADER -# ifndef SANSA_C100 -target/arm/wmcodec-telechips.c -# endif /* !C100 */ -target/arm/pcm-telechips.c -target/arm/tcc77x/debug-tcc77x.c -# endif /* !BOOTLOADER */ -#endif /* CPU_TCC77X */ - #if CONFIG_CPU == S5L8700 || CONFIG_CPU == S5L8701 target/arm/s5l8700/kernel-s5l8700.c target/arm/s5l8700/system-s5l8700.c @@ -1386,34 +1362,6 @@ target/arm/pnx0101/pcm-pnx0101.c #endif /* BOOTLOADER */ #endif /* IRIVER_IFP7XX */ -#ifdef LOGIK_DAX -drivers/nand_id.c -target/arm/tcc77x/logikdax/button-logikdax.c -target/arm/tcc77x/logikdax/power-logikdax.c -#ifndef BOOTLOADER -target/arm/tcc77x/logikdax/audio-logikdax.c -#endif /* BOOTLOADER */ -#endif /* LOGIK_DAX */ - -#ifdef SANSA_M200 -drivers/nand_id.c -target/arm/tcc77x/m200/button-m200.c -target/arm/tcc77x/m200/power-m200.c -#ifndef BOOTLOADER -target/arm/tcc77x/m200/audio-m200.c -#endif /* BOOTLOADER */ -#endif /* SANSA_M200 */ - -#ifdef SANSA_C100 -drivers/nand_id.c -target/arm/tcc77x/c100/lcd-S6B33B2.c -target/arm/tcc77x/c100/button-c100.c -target/arm/tcc77x/c100/power-c100.c -#ifndef BOOTLOADER -target/arm/tcc77x/c100/audio-c100.c -#endif /* BOOTLOADER */ -#endif /* SANSA_C100 */ - #ifdef SANSA_CLIPPLUS target/arm/as3525/sansa-clipplus/lcd-clip-plus.c target/arm/as3525/sansa-clipplus/button-clip.c @@ -1525,19 +1473,6 @@ target/arm/as3525/sansa-clipzip/powermgmt-clipzip.c #endif /* !BOOTLOADER */ #endif /* SANSA_CLIPZIP */ -#ifdef IAUDIO_7 -drivers/nand_id.c -drivers/pcf50606.c -target/arm/tcc77x/iaudio7/lcd-iaudio7.c -target/arm/tcc77x/iaudio7/power-iaudio7.c -target/arm/tcc77x/iaudio7/powermgmt-iaudio7.c -target/arm/tcc77x/iaudio7/button-iaudio7.c -target/arm/tcc77x/iaudio7/ata2501.c -#ifndef BOOTLOADER -target/arm/tcc77x/iaudio7/audio-iaudio7.c -#endif /* BOOTLOADER */ -#endif /* IAUDIO_7 */ - #ifdef COWON_D2 drivers/lcd-memframe.c drivers/nand_id.c diff --git a/firmware/drivers/rtc/rtc_tcc77x.c b/firmware/drivers/rtc/rtc_tcc77x.c deleted file mode 100644 index a85c93d65a..0000000000 --- a/firmware/drivers/rtc/rtc_tcc77x.c +++ /dev/null @@ -1,81 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2008 by Dave Chapman - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#include "config.h" -#include "rtc.h" -#include "system.h" -#include - -void rtc_init(void) -{ -} - -int rtc_read_datetime(struct tm *tm) -{ - (void)tm; - return 0; -} - -int rtc_write_datetime(const struct tm *tm) -{ - (void)tm; - return 1; -} - -#ifdef HAVE_RTC_ALARM -/** - * Checks to see if an alarm interrupt has triggered since last we checked. - */ -bool rtc_check_alarm_flag(void) -{ -} - -/** - * Enables or disables the alarm. - */ -void rtc_enable_alarm(bool enable) -{ -} - -/** - * Check if alarm caused unit to start. - */ -bool rtc_check_alarm_started(bool release_alarm) -{ -} - -void rtc_set_alarm(int h, int m) -{ - /* Convert to BCD */ -// pcf50605_write(0x12, ((m/10) << 4) | m%10); -// pcf50605_write(0x13, ((h/10) << 4) | h%10); -} - -void rtc_get_alarm(int *h, int *m) -{ - char buf[2]; - - /* Convert from BCD */ -// *m = ((buf[0] >> 4) & 0x7)*10 + (buf[0] & 0x0f); -// *h = ((buf[1] >> 4) & 0x3)*10 + (buf[1] & 0x0f); -} -#endif /* HAVE_RTC_ALARM */ - - diff --git a/firmware/drivers/tuner/lv24020lp.c b/firmware/drivers/tuner/lv24020lp.c index bb137d60ff..2fbf88b01b 100644 --- a/firmware/drivers/tuner/lv24020lp.c +++ b/firmware/drivers/tuner/lv24020lp.c @@ -80,16 +80,6 @@ static int fd_log = -1; #define FM_CLOCK_PIN 4 #define FM_DATA_PIN 5 -#elif defined(IAUDIO_7) -#define TUNER_GPIO_INPUT_VAL GPIOA -#define TUNER_GPIO_OUTPUT_EN_SET(mask) (GPIOA_DIR |= (mask)) -#define TUNER_GPIO_OUTPUT_EN_CLEAR(mask) (GPIOA_DIR &= ~(mask)) -#define TUNER_GPIO_OUTPUT_VAL_SET(mask) (GPIOA |= (mask)) -#define TUNER_GPIO_OUTPUT_VAL_CLEAR(mask) (GPIOA &= ~(mask)) -#define FM_CLOCK_PIN 5 -#define FM_DATA_PIN 6 -#define FM_NRW_PIN 7 - #elif defined(COWON_D2) #define TUNER_GPIO_INPUT_VAL GPIOC #define TUNER_GPIO_OUTPUT_EN_SET(mask) (GPIOC_DIR |= (mask)) diff --git a/firmware/export/config.h b/firmware/export/config.h index db1c589043..d23abfa086 100644 --- a/firmware/export/config.h +++ b/firmware/export/config.h @@ -68,9 +68,6 @@ #define DSC25 25 #define DM320 320 #define IMX31L 31 -#define TCC770 770 -#define TCC771L 771 -#define TCC773L 773 #define TCC7801 7801 #define S5L8700 8700 #define S5L8701 8701 @@ -113,15 +110,12 @@ #define MROBE100_PAD 17 #define MROBE500_PAD 18 #define GIGABEAT_S_PAD 19 -#define LOGIK_DAX_PAD 20 -#define IAUDIO67_PAD 21 #define COWON_D2_PAD 22 #define IAUDIO_M3_PAD 23 #define CREATIVEZVM_PAD 24 #define SANSA_M200_PAD 25 #define CREATIVEZV_PAD 26 #define PHILIPS_SA9200_PAD 27 -#define SANSA_C100_PAD 28 #define PHILIPS_HDD1630_PAD 29 #define MEIZU_M6SL_PAD 30 #define ONDAVX747_PAD 31 @@ -236,13 +230,11 @@ #define LCD_C200 17 /* as used by Sandisk Sansa c200 */ #define LCD_MROBE500 18 /* as used by Olympus M:Robe 500i */ #define LCD_MROBE100 19 /* as used by Olympus M:Robe 100 */ -#define LCD_LOGIKDAX 20 /* as used by Logik DAX - SSD1815 */ -#define LCD_IAUDIO67 21 /* as used by iAudio 6/7 - unknown */ #define LCD_CREATIVEZVM 22 /* as used by Creative Zen Vision:M */ #define LCD_TL0350A 23 /* as used by the iAudio M3 remote, treated as main LCD */ #define LCD_COWOND2 24 /* as used by Cowon D2 - LTV250QV, TCC7801 driver */ #define LCD_SA9200 25 /* as used by the Philips SA9200 */ -#define LCD_S6B33B2 26 /* as used by the Sansa c100 */ +#define LCD_S6B33B2 26 /* as used by the Samsumg YH820 */ #define LCD_HDD1630 27 /* as used by the Philips HDD1630 */ #define LCD_MEIZUM6 28 /* as used by the Meizu M6SP and M6SL (various models) */ #define LCD_ONDAVX747 29 /* as used by the Onda VX747 */ @@ -314,7 +306,6 @@ Lyre prototype 1 */ #define I2C_S3C2440 7 #define I2C_PP5024 8 /* PP5024 style */ #define I2C_IMX31L 9 -#define I2C_TCC77X 10 #define I2C_TCC780X 11 #define I2C_DM320 12 /* DM320 style */ #define I2C_S5L8700 13 @@ -347,7 +338,6 @@ Lyre prototype 1 */ #define RTC_DS1339_DS3231 7 /* h1x0 RTC mod */ #define RTC_IMX31L 8 #define RTC_RX5X348AB 9 -#define RTC_TCC77X 10 #define RTC_TCC780X 11 #define RTC_MR100 12 #define RTC_MC13783 13 /* Freescale MC13783 PMIC */ @@ -438,18 +428,12 @@ Lyre prototype 1 */ #include "config/sansae200.h" #elif defined(SANSA_C200) #include "config/sansac200.h" -#elif defined(SANSA_M200) -#include "config/sansam200.h" #elif defined(TATUNG_TPJ1022) #include "config/tatungtpj1022.h" #elif defined(MROBE_100) #include "config/mrobe100.h" #elif defined(MROBE_500) #include "config/mrobe500.h" -#elif defined(LOGIK_DAX) -#include "config/logikdax.h" -#elif defined(IAUDIO_7) -#include "config/iaudio7.h" #elif defined(COWON_D2) #include "config/cowond2.h" #elif defined(CREATIVE_ZVM) @@ -468,8 +452,6 @@ Lyre prototype 1 */ #include "config/gogearhdd1630.h" #elif defined(PHILIPS_HDD6330) #include "config/gogearhdd6330.h" -#elif defined(SANSA_C100) -#include "config/sansac100.h" #elif defined(MEIZU_M6SL) #include "config/meizum6sl.h" #elif defined(MEIZU_M6SP) @@ -666,11 +648,6 @@ Lyre prototype 1 */ #define CPU_S5L870X #endif -/* define for all cpus from TCC77X family */ -#if (CONFIG_CPU == TCC771L) || (CONFIG_CPU == TCC773L) || (CONFIG_CPU == TCC770) -#define CPU_TCC77X -#endif - /* define for all cpus from TCC780 family */ #if (CONFIG_CPU == TCC7801) #define CPU_TCC780X @@ -1202,7 +1179,7 @@ Lyre prototype 1 */ (CONFIG_USBOTG == USBOTG_RK27XX) #define USB_HAS_BULK #define USB_HAS_INTERRUPT -#elif defined(CPU_TCC780X) || defined(CPU_TCC77X) +#elif defined(CPU_TCC780X) #define USB_HAS_BULK #elif CONFIG_USBOTG == USBOTG_S3C6400X #define USB_HAS_BULK @@ -1219,7 +1196,7 @@ Lyre prototype 1 */ /* enable usb storage for targets that do bootloader usb */ #if defined(HAVE_BOOTLOADER_USB_MODE) || \ - defined(CREATIVE_ZVx) || defined(CPU_TCC77X) || defined(CPU_TCC780X) || \ + defined(CREATIVE_ZVx) || defined(CPU_TCC780X) || \ CONFIG_USBOTG == USBOTG_JZ4740 || CONFIG_USBOTG == USBOTG_AS3525 || \ CONFIG_USBOTG == USBOTG_S3C6400X || CONFIG_USBOTG == USBOTG_DESIGNWARE || \ CONFIG_USBOTG == USBOTG_JZ4760 diff --git a/firmware/export/config/iaudio7.h b/firmware/export/config/iaudio7.h deleted file mode 100644 index 698ff13724..0000000000 --- a/firmware/export/config/iaudio7.h +++ /dev/null @@ -1,164 +0,0 @@ -/* - * This config file is for the Iaudio7 series - */ - -/* For Rolo and boot loader */ -#define MODEL_NUMBER 32 -#define MODEL_NAME "Cowon iAudio7" - -/* define this if you have recording possibility */ -#define HAVE_RECORDING - -/* Define bitmask of input sources - recordable bitmask can be defined - explicitly if different */ -#define INPUT_SRC_CAPS (SRC_CAP_MIC | SRC_CAP_LINEIN | SRC_CAP_FMRADIO) - -/* FM Tuner */ -#define CONFIG_TUNER LV24020LP -#define HAVE_TUNER_PWR_CTRL - -/* Define this for FM radio input available */ -#define HAVE_FMRADIO_IN - -/* define hardware samples rate caps mask */ -#define HW_SAMPR_CAPS (/*SAMPR_CAP_88 | */SAMPR_CAP_44/* | SAMPR_CAP_22 | SAMPR_CAP_11*/) - -/* define the bitmask of recording sample rates */ -#define REC_SAMPR_CAPS (SAMPR_CAP_44/* | SAMPR_CAP_22 | SAMPR_CAP_11*/) - - - - -/* define this if you have a colour LCD */ -#define HAVE_LCD_COLOR - -/* define this if you can flip your LCD */ -//#define HAVE_LCD_FLIP - -/* define this if you can invert the colours on your LCD */ -//#define HAVE_LCD_INVERT - -/* define this if you want album art for this target */ -#define HAVE_ALBUMART - -/* define this to enable bitmap scaling */ -#define HAVE_BMP_SCALING - -/* define this to enable JPEG decoding */ -#define HAVE_JPEG - -/* define this if you have access to the quickscreen */ -#define HAVE_QUICKSCREEN - -/* define this if you have LCD enable function */ -#define HAVE_LCD_ENABLE - -/* define this if you would like tagcache to build on this target */ -#define HAVE_TAGCACHE - -#define HAVE_FAT16SUPPORT - -#if 0 && !defined(SIMULATOR) /* Enable for USB driver test */ -#define HAVE_USBSTACK -#define USB_VENDOR_ID 0x0e21 -#define USB_PRODUCT_ID 0x0750 -#endif - -/* define this if you have a flash memory storage */ -#define HAVE_FLASH_STORAGE - -#define CONFIG_STORAGE STORAGE_NAND - -#define CONFIG_NAND NAND_TCC - -/* LCD dimensions */ -#define LCD_WIDTH 160 -#define LCD_HEIGHT 128 -/* sqrt(160^2 + 128^2) / 1.3 = 157.6 */ -#define LCD_DPI 158 -/* 16bits for now... */ -#define LCD_DEPTH 16 /* 262144 colours */ -#define LCD_PIXELFORMAT RGB565 /*rgb565*/ - -/*#define LCD_PIXELFORMAT VERTICAL_PACKING*/ - -/* define this to indicate your device's keypad */ -#define CONFIG_KEYPAD IAUDIO67_PAD - -/* #define HAVE_BUTTON_DATA */ - -/* define this if you have a real-time clock */ -#define CONFIG_RTC RTC_PCF50606 - -/* define this if you have RTC RAM available for settings */ -//#define HAVE_RTC_RAM - -/* Define this if you have a software controlled poweroff */ -#define HAVE_SW_POWEROFF - -/* Reduce Tremor's ICODE usage */ -#define ICODE_ATTR_TREMOR_NOT_MDCT - -/* The number of bytes reserved for loadable codecs */ -#define CODEC_SIZE 0x100000 - -/* The number of bytes reserved for loadable plugins */ -#define PLUGIN_BUFFER_SIZE 0x80000 - -#define AB_REPEAT_ENABLE - - - - -/* The iaudio7 uses built-in WM8731 codec */ -#define HAVE_WM8731 -/* Codec is slave on serial bus */ -#define CODEC_SLAVE - -/* WM8731 has no tone controls, so we use the software ones */ -#define HAVE_SW_TONE_CONTROLS - -/* Define this for LCD backlight available */ -#define HAVE_BACKLIGHT - -#define CONFIG_I2C I2C_TCC77X - -#define BATTERY_CAPACITY_DEFAULT 540 /* default battery capacity */ -#define BATTERY_CAPACITY_MIN 540 /* min. capacity selectable */ -#define BATTERY_CAPACITY_MAX 540 /* max. capacity selectable */ -#define BATTERY_CAPACITY_INC 50 /* capacity increment */ -#define BATTERY_TYPES_COUNT 1 /* only one type */ - -#define CONFIG_BATTERY_MEASURE VOLTAGE_MEASURE - -#define CONFIG_CHARGING CHARGING_SIMPLE - -/* Define this if you have a TCC770 */ -#define CONFIG_CPU TCC770 - -/* Define this if you have ATA power-off control */ -#define HAVE_ATA_POWER_OFF - -/* Define this to the CPU frequency */ -#define CPU_FREQ 120000000 - -/* Offset ( in the firmware file's header ) to the file CRC */ -#define FIRMWARE_OFFSET_FILE_CRC 0 - -/* Offset ( in the firmware file's header ) to the real data */ -#define FIRMWARE_OFFSET_FILE_DATA 8 - -#define CONFIG_LCD LCD_IAUDIO67 - -#define BOOTFILE_EXT "iaudio" -#define BOOTFILE "rockbox." BOOTFILE_EXT -#define BOOTDIR "/.rockbox" - -#ifdef BOOTLOADER -#define TCCBOOT -#endif - -#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */ - -/* Define this if a programmable hotkey is mapped */ -//#define HAVE_HOTKEY diff --git a/firmware/export/config/logikdax.h b/firmware/export/config/logikdax.h deleted file mode 100644 index 47229f7a1d..0000000000 --- a/firmware/export/config/logikdax.h +++ /dev/null @@ -1,152 +0,0 @@ -/* - * This config file is for the Logik DAX MP3/DAB - */ - -/* For Rolo and boot loader */ -#define MODEL_NUMBER 33 - -#define MODEL_NAME "Logik DAX MP3/DAB" - -/* define this if you have recording possibility */ -//#define HAVE_RECORDING - -/* Define bitmask of input sources - recordable bitmask can be defined - explicitly if different */ -//#define INPUT_SRC_CAPS (SRC_CAP_MIC | SRC_CAP_LINEIN | SRC_CAP_SPDIF) - -#if 0 /* Enable for USB driver test */ -#define HAVE_USBSTACK -#define USB_VENDOR_ID 0x13d1 -#define USB_PRODUCT_ID 0x1002 -#endif - - - - - -/* define this if you can flip your LCD */ -#define HAVE_LCD_FLIP - -/* define this if you can invert the colours on your LCD */ -#define HAVE_LCD_INVERT - -/* define this if you have access to the quickscreen */ -#define HAVE_QUICKSCREEN - -/* define this if you would like tagcache to build on this target */ -#define HAVE_TAGCACHE - -#define HAVE_FAT16SUPPORT - -/* define this if you have a flash memory storage */ -#define HAVE_FLASH_STORAGE - -#define CONFIG_STORAGE STORAGE_NAND - -#define CONFIG_NAND NAND_TCC - -/* LCD dimensions */ -#define LCD_WIDTH 128 -#define LCD_HEIGHT 64 -/* sqrt(128^2 + 64^2) / 1.0 = 143.1 */ -#define LCD_DPI 143 -#define LCD_DEPTH 1 - -#define LCD_PIXELFORMAT VERTICAL_PACKING - -/* Display colours, for screenshots and sim (0xRRGGBB) */ -#define LCD_DARKCOLOR 0x000000 -#define LCD_BRIGHTCOLOR 0x5a915a -#define LCD_BL_DARKCOLOR 0x000000 -#define LCD_BL_BRIGHTCOLOR 0x82b4fa - -/* define this to indicate your device's keypad */ -#define CONFIG_KEYPAD LOGIK_DAX_PAD - -/* define this if you have a real-time clock */ -#define CONFIG_RTC RTC_TCC77X - -/* define this if you have RTC RAM available for settings */ -//#define HAVE_RTC_RAM - -/* Define this if you have a software controlled poweroff */ -#define HAVE_SW_POWEROFF - -/* The number of bytes reserved for loadable codecs */ -#define CODEC_SIZE 0x38000 - -/* The number of bytes reserved for loadable plugins */ -#define PLUGIN_BUFFER_SIZE 0x10000 - -#define AB_REPEAT_ENABLE - - - - -/* The DAX uses built-in WM8731 codec */ -#define HAVE_WM8731 -/* Codec is slave on serial bus */ -#define CODEC_SLAVE -/* WM8731 has no tone controls, so we use the software ones */ -#define HAVE_SW_TONE_CONTROLS - -/* Define this for LCD backlight available */ -#define HAVE_BACKLIGHT - -#define CONFIG_I2C I2C_TCC77X - -#define BATTERY_CAPACITY_DEFAULT 1500 /* default battery capacity */ -#define BATTERY_CAPACITY_MIN 1500 /* min. capacity selectable */ -#define BATTERY_CAPACITY_MAX 3200 /* max. capacity selectable */ -#define BATTERY_CAPACITY_INC 50 /* capacity increment */ -#define BATTERY_TYPES_COUNT 1 /* only one type */ - -#define CONFIG_BATTERY_MEASURE VOLTAGE_MEASURE - -/* define this if the unit should not shut down on low battery. */ -#define NO_LOW_BATTERY_SHUTDOWN - -/* Define this if you have a TCC773L */ -#define CONFIG_CPU TCC773L - -/* Define this if you have ATA power-off control */ -#define HAVE_ATA_POWER_OFF - -#define HAVE_FAT16SUPPORT - -/* Define this to the CPU frequency */ -#define CPU_FREQ 120000000 - -/* Offset ( in the firmware file's header ) to the file length */ -#define FIRMWARE_OFFSET_FILE_LENGTH 0 - -/* Offset ( in the firmware file's header ) to the file CRC */ -#define FIRMWARE_OFFSET_FILE_CRC 4 - -/* Offset ( in the firmware file's header ) to the real data */ -#define FIRMWARE_OFFSET_FILE_DATA 6 - -/* The start address index for ROM builds */ -/* #define ROM_START 0x11010 for behind original Archos */ -#define ROM_START 0x7010 /* for behind BootBox */ - -#define CONFIG_LCD LCD_SSD1815 - -#define BOOTFILE_EXT "logik" -#define BOOTFILE "rockbox." BOOTFILE_EXT -#define BOOTDIR "/" - -#define IBSS_ATTR_VOICE_STACK -#define ICODE_ATTR_TREMOR_NOT_MDCT -#define ICODE_ATTR_TREMOR_MDCT -#define ICODE_ATTR_FLAC -#define IBSS_ATTR_FLAC_DECODED0 -#define ICONST_ATTR_MPA_HUFFMAN -#define IBSS_ATTR_MPC_SAMPLE_BUF -#define ICODE_ATTR_ALAC -#define IBSS_ATTR_SHORTEN_DECODED0 - -#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */ - -/* Define this if a programmable hotkey is mapped */ -//#define HAVE_HOTKEY diff --git a/firmware/export/config/sansac100.h b/firmware/export/config/sansac100.h deleted file mode 100644 index c2956eed12..0000000000 --- a/firmware/export/config/sansac100.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - * This config file is for the Sansa C100 series - */ - -#define MODEL_NAME "Sandisk Sansa c100 series" - -/* For Rolo and bootloader */ -#define MODEL_NUMBER 30 - -/* define hardware samples rate caps mask */ -#define HW_SAMPR_CAPS (/*SAMPR_CAP_88 | */SAMPR_CAP_44/* | SAMPR_CAP_22 | SAMPR_CAP_11*/) - - - - -/* define this if you have a colour LCD */ -#define HAVE_LCD_COLOR - -/* define this if you can flip your LCD */ -/*#define HAVE_LCD_FLIP*/ - -/* define this if you can invert the colours on your LCD */ -/*#define HAVE_LCD_INVERT*/ - -/* define this if you have access to the quickscreen */ -#define HAVE_QUICKSCREEN - -/* define this if you would like tagcache to build on this target */ -#define HAVE_TAGCACHE - -/* define this if you have a flash memory storage */ -#define HAVE_FLASH_STORAGE - -/* Only v1 */ -#define CONFIG_STORAGE STORAGE_NAND -#define CONFIG_NAND NAND_TCC - -/* c100's with direct-to-NAND access are FAT16 */ -#define HAVE_FAT16SUPPORT - -/* LCD dimensions */ -#define LCD_WIDTH 128 -#define LCD_HEIGHT 64 -/* sqrt(128^2 + 64^2) / 1.7 = 84.2 */ -#define LCD_DPI 84 -#define LCD_DEPTH 16 /* 65536 colours */ -#define LCD_PIXELFORMAT RGB565 /*rgb565*/ - -/*#define LCD_PIXELFORMAT VERTICAL_PACKING*/ - -/* define this to indicate your device's keypad */ -#define CONFIG_KEYPAD SANSA_C100_PAD - -/* define this if you have a real-time clock */ -#define CONFIG_RTC RTC_TCC77X - -/* define this if you have RTC RAM available for settings */ -//#define HAVE_RTC_RAM - -/* Define this if you have a software controlled poweroff */ -#define HAVE_SW_POWEROFF - -/* The number of bytes reserved for loadable codecs */ -#define CODEC_SIZE 0x50000 - -/* The number of bytes reserved for loadable plugins */ -#define PLUGIN_BUFFER_SIZE 0x50000 - -#define AB_REPEAT_ENABLE - - - - -/* Define this if you have the TLV320 audio codec */ -#define HAVE_TLV320 - -/*#define CONFIG_TUNER TEA5767*/ - -/* TLV320 has no tone controls, so we use the software ones */ -#define HAVE_SW_TONE_CONTROLS - -/* Define this for LCD backlight available */ -#define HAVE_BACKLIGHT - -#define CONFIG_I2C I2C_TCC77X - -#define BATTERY_CAPACITY_DEFAULT 540 /* default battery capacity */ -#define BATTERY_CAPACITY_MIN 540 /* min. capacity selectable */ -#define BATTERY_CAPACITY_MAX 540 /* max. capacity selectable */ -#define BATTERY_CAPACITY_INC 50 /* capacity increment */ -#define BATTERY_TYPES_COUNT 1 /* only one type */ - -#define CONFIG_BATTERY_MEASURE VOLTAGE_MEASURE - -/* define this if the unit should not shut down on low battery. */ -#define NO_LOW_BATTERY_SHUTDOWN - -/* Define this if you have a TCC770 */ -#define CONFIG_CPU TCC770 - -/* Define this if you have ATA power-off control */ -#define HAVE_ATA_POWER_OFF - -/* Define this to the CPU frequency */ -#define CPU_FREQ 120000000 - -/* Offset ( in the firmware file's header ) to the file CRC */ -#define FIRMWARE_OFFSET_FILE_CRC 0 - -/* Offset ( in the firmware file's header ) to the real data */ -#define FIRMWARE_OFFSET_FILE_DATA 8 - -/* The start address index for ROM builds */ -/* #define ROM_START 0x11010 for behind original Archos */ -#define ROM_START 0x7010 /* for behind BootBox */ - -#define CONFIG_LCD LCD_S6B33B2 - -#define BOOTFILE_EXT "c100" -#define BOOTFILE "rockbox." BOOTFILE_EXT -#define BOOTDIR "/.rockbox" - -#ifdef BOOTLOADER -#define TCCBOOT -#endif - -#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */ - -/* Define this if a programmable hotkey is mapped */ -#define HAVE_HOTKEY diff --git a/firmware/export/config/sansam200.h b/firmware/export/config/sansam200.h deleted file mode 100644 index 95647013e7..0000000000 --- a/firmware/export/config/sansam200.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - * This config file is for the Sansa M200 series - */ - -/* For Rolo and boot loader */ -#define MODEL_NUMBER 29 - -#define MODEL_NAME "Sandisk Sansa m200 series" - -/* Enable FAT16 support */ -#define HAVE_FAT16SUPPORT - -/* define this if you have recording possibility */ -//#define HAVE_RECORDING - -/* Define bitmask of input sources - recordable bitmask can be defined - explicitly if different */ -//#define INPUT_SRC_CAPS (SRC_CAP_MIC | SRC_CAP_LINEIN | SRC_CAP_SPDIF) - - - - -/* define this if you can flip your LCD */ -#define HAVE_LCD_FLIP - -/* define this if you can invert the colours on your LCD */ -#define HAVE_LCD_INVERT - -/* define this if you have access to the quickscreen */ -#define HAVE_QUICKSCREEN - -/* define this if you would like tagcache to build on this target */ -#define HAVE_TAGCACHE - -/* define this if you have a flash memory storage */ -#define HAVE_FLASH_STORAGE - -#define CONFIG_STORAGE STORAGE_NAND - -#define CONFIG_NAND NAND_TCC - -/* LCD dimensions */ -#define LCD_WIDTH 128 -#define LCD_HEIGHT 64 -/* sqrt(128^2 + 64^2) / 1.8 = 79.5 */ -#define LCD_DPI 80 -#define LCD_DEPTH 1 - -#define LCD_PIXELFORMAT VERTICAL_PACKING - -/* Display colours, for screenshots and sim (0xRRGGBB) */ -#define LCD_BARKCOLOR 0x000000 -#define LCD_BRIGHTCOLOR 0x5e6854 -#define LCD_BL_DARKCOLOR 0x000000 -#define LCD_BL_BRIGHTCOLOR 0x3ca0e6 - -/* define this to indicate your device's keypad */ -#define CONFIG_KEYPAD SANSA_M200_PAD - -/* Define this to enable morse code input */ -#define HAVE_MORSE_INPUT - -/* define this if you have a real-time clock */ -#define CONFIG_RTC RTC_TCC77X - -/* define this if you have RTC RAM available for settings */ -//#define HAVE_RTC_RAM - -/* Define this if you have a software controlled poweroff */ -#define HAVE_SW_POWEROFF - -/* The number of bytes reserved for loadable codecs */ -#define CODEC_SIZE 0x38000 - -/* The number of bytes reserved for loadable plugins */ -#define PLUGIN_BUFFER_SIZE 0x10000 - -#define AB_REPEAT_ENABLE - - - - -/* Define this if you have the TLV320 audio codec */ -#define HAVE_TLV320 - -/* TLV320 has no tone controls, so we use the software ones */ -#define HAVE_SW_TONE_CONTROLS - -/* Define this for LCD backlight available */ -#define HAVE_BACKLIGHT - -#define CONFIG_I2C I2C_TCC77X - -#define BATTERY_CAPACITY_DEFAULT 1500 /* default battery capacity */ -#define BATTERY_CAPACITY_MIN 1500 /* min. capacity selectable */ -#define BATTERY_CAPACITY_MAX 3200 /* max. capacity selectable */ -#define BATTERY_CAPACITY_INC 50 /* capacity increment */ -#define BATTERY_TYPES_COUNT 1 /* only one type */ - -#define CONFIG_BATTERY_MEASURE VOLTAGE_MEASURE - -/* define this if the unit should not shut down on low battery. */ -#define NO_LOW_BATTERY_SHUTDOWN - -/* Define this if you have a TCC770 */ -#define CONFIG_CPU TCC770 - -/* Define this if you have ATA power-off control */ -#define HAVE_ATA_POWER_OFF - -/* Define this to the CPU frequency */ -#define CPU_FREQ 120000000 - -/* Offset ( in the firmware file's header ) to the file CRC */ -#define FIRMWARE_OFFSET_FILE_CRC 0 - -/* Offset ( in the firmware file's header ) to the real data */ -#define FIRMWARE_OFFSET_FILE_DATA 8 - -#define CONFIG_LCD LCD_SSD1815 - -#define BOOTFILE_EXT "m200" -#define BOOTFILE "rockbox." BOOTFILE_EXT -#define BOOTDIR "/" - -#define IBSS_ATTR_VOICE_STACK -#define ICODE_ATTR_TREMOR_NOT_MDCT -#define ICODE_ATTR_TREMOR_MDCT -#define ICODE_ATTR_FLAC -#define IBSS_ATTR_FLAC_DECODED0 -#define ICONST_ATTR_MPA_HUFFMAN -#define IBSS_ATTR_MPC_SAMPLE_BUF -#define ICODE_ATTR_ALAC -#define IBSS_ATTR_SHORTEN_DECODED0 - -#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */ - -/* Define this if a programmable hotkey is mapped */ -#define HAVE_HOTKEY diff --git a/firmware/export/cpu.h b/firmware/export/cpu.h index aade199dd2..e862cedb74 100644 --- a/firmware/export/cpu.h +++ b/firmware/export/cpu.h @@ -50,9 +50,6 @@ #if CONFIG_CPU == IMX31L #include "imx31l.h" #endif -#ifdef CPU_TCC77X -#include "tcc77x.h" -#endif #ifdef CPU_TCC780X #include "tcc780x.h" #endif diff --git a/firmware/export/tcc77x.h b/firmware/export/tcc77x.h deleted file mode 100644 index 3c457c5b38..0000000000 --- a/firmware/export/tcc77x.h +++ /dev/null @@ -1,262 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 Dave Chapman - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#ifndef __TCC77X_H__ -#define __TCC77X_H__ - -#define CACHEALIGN_BITS (5) - -/* General-purpose IO */ - -#define GPIOA (*(volatile unsigned long *)0x80000300) -#define GPIOB (*(volatile unsigned long *)0x80000310) -#define GPIOC (*(volatile unsigned long *)0x80000320) -#define GPIOD (*(volatile unsigned long *)0x80000330) -#define GPIOE (*(volatile unsigned long *)0x80000340) - -#define GPIOA_DIR (*(volatile unsigned long *)0x80000304) -#define GPIOB_DIR (*(volatile unsigned long *)0x80000314) -#define GPIOC_DIR (*(volatile unsigned long *)0x80000324) -#define GPIOD_DIR (*(volatile unsigned long *)0x80000334) -#define GPIOE_DIR (*(volatile unsigned long *)0x80000344) - -#define GPIOA_FUNC (*(volatile unsigned long *)0x80000308) -#define GPIOB_FUNC (*(volatile unsigned long *)0x80000318) -#define GPIOC_FUNC (*(volatile unsigned long *)0x80000328) -#define GPIOD_FUNC (*(volatile unsigned long *)0x80000338) -#define GPIOE_FUNC (*(volatile unsigned long *)0x80000348) - -#define BMI (*(volatile unsigned long *)0x80000364) - -/* Clock Generator */ - -#define CLKCTRL (*(volatile unsigned long *)0x80000400) -#define PLL0CFG (*(volatile unsigned long *)0x80000404) -#define CLKDIVC (*(volatile unsigned long *)0x8000040c) -#define MODECTR (*(volatile unsigned long *)0x80000410) -#define BCLKCTR (*(volatile unsigned long *)0x80000414) -#define SWRESET (*(volatile unsigned long *)0x80000418) -#define PCLKCFG0 (*(volatile unsigned long *)0x8000041c) -#define PCLKCFG1 (*(volatile unsigned long *)0x80000420) -#define PCLKCFG2 (*(volatile unsigned long *)0x80000424) -#define PCLKCFG3 (*(volatile unsigned long *)0x80000428) -#define PCLKCFG4 (*(volatile unsigned long *)0x8000042c) -#define PCLKCFG5 (*(volatile unsigned long *)0x80000430) -#define PCLKCFG6 (*(volatile unsigned long *)0x80000434) - -#define PCLK_DAI PCLKCFG6 - -/* Device bits for SWRESET & BCLKCTR */ - -#define DEV_DAI (1<<0) -#define DEV_USBD (1<<4) -#define DEV_ECC (1<<9) -#define DEV_NAND (1<<16) - -/* ADC */ - -#define ADCCON (*(volatile unsigned long *)0x80000a00) -#define ADCDATA (*(volatile unsigned long *)0x80000a04) -#define ADCCONA (*(volatile unsigned long *)0x80000a80) -#define ADCSTATUS (*(volatile unsigned long *)0x80000a84) -#define ADCCFG (*(volatile unsigned long *)0x80000a88) - - -/* Memory Controller */ -#define SDCFG (*(volatile unsigned long *)0xf0000000) -#define SDFSM (*(volatile unsigned long *)0xf0000004) -#define MCFG (*(volatile unsigned long *)0xf0000008) -#define TST (*(volatile unsigned long *)0xf000000c) -#define CSCFG0 (*(volatile unsigned long *)0xf0000010) -#define CSCFG1 (*(volatile unsigned long *)0xf0000014) -#define CSCFG2 (*(volatile unsigned long *)0xf0000018) -#define CSCFG3 (*(volatile unsigned long *)0xf000001c) -#define CLKCFG (*(volatile unsigned long *)0xf0000020) -#define SDCMD (*(volatile unsigned long *)0xf0000024) - - -/* IRQ Controller */ -#define EXT0_IRQ_MASK (1<<0) -#define EXT1_IRQ_MASK (1<<1) -#define EXT2_IRQ_MASK (1<<2) -#define EXT3_IRQ_MASK (1<<3) -#define I2SR_IRQ_MASK (1<<4) -#define I2ST_IRQ_MASK (1<<5) -#define TIMER0_IRQ_MASK (1<<6) -#define USBD_IRQ_MASK (1<<8) /* USB 2.0 device */ -#define USBH_IRQ_MASK (1<<10) /* USB 1.1 host */ -#define ADC_IRQ_MASK (1<<16) -#define USB_DMA_IRQ_MASK (1<<26) /* USB DMA */ -#define ECC_IRQ_MASK (1<<27) - -#define DAI_RX_IRQ_MASK I2SR_IRQ_MASK -#define DAI_TX_IRQ_MASK I2ST_IRQ_MASK - -#define USB_DMA_IRQ_MASK (1<<26) /* USB DMA */ - -#define IEN (*(volatile unsigned long *)0x80000100) -#define CREQ (*(volatile unsigned long *)0x80000104) -#define IREQ (*(volatile unsigned long *)0x80000108) -#define IRQSEL (*(volatile unsigned long *)0x8000010c) -#define ICFG (*(volatile unsigned long *)0x80000110) -#define MREQ (*(volatile unsigned long *)0x80000114) -#define TSTREQ (*(volatile unsigned long *)0x80000118) -#define IRQ (*(volatile unsigned long *)0x80000120) -#define FIQ (*(volatile unsigned long *)0x80000124) -#define MIRQ (*(volatile unsigned long *)0x80000128) -#define MFIQ (*(volatile unsigned long *)0x8000012c) -#define TMODE (*(volatile unsigned long *)0x80000130) -#define SYNC (*(volatile unsigned long *)0x80000134) -#define WKUP (*(volatile unsigned long *)0x80000138) - -/* Timer Controller */ - -#define TCFG0 (*(volatile unsigned long *)0x80000200) -#define TCNT0 (*(volatile unsigned long *)0x80000204) -#define TREF0 (*(volatile unsigned long *)0x80000208) -#define TMREF0 (*(volatile unsigned long *)0x8000020c) -#define TCFG1 (*(volatile unsigned long *)0x80000210) -#define TCNT1 (*(volatile unsigned long *)0x80000214) -#define TREF1 (*(volatile unsigned long *)0x80000218) -#define TMREF1 (*(volatile unsigned long *)0x8000021c) -#define TCFG2 (*(volatile unsigned long *)0x80000220) -#define TCNT2 (*(volatile unsigned long *)0x80000224) -#define TREF2 (*(volatile unsigned long *)0x80000228) -#define TMREF2 (*(volatile unsigned long *)0x8000022c) -#define TCFG3 (*(volatile unsigned long *)0x80000230) -#define TCNT3 (*(volatile unsigned long *)0x80000234) -#define TREF3 (*(volatile unsigned long *)0x80000238) -#define TMREF3 (*(volatile unsigned long *)0x8000023c) -#define TCFG4 (*(volatile unsigned long *)0x80000240) -#define TCNT4 (*(volatile unsigned long *)0x80000244) -#define TREF4 (*(volatile unsigned long *)0x80000248) -#define TCFG5 (*(volatile unsigned long *)0x80000250) -#define TCNT5 (*(volatile unsigned long *)0x80000254) -#define TREF5 (*(volatile unsigned long *)0x80000258) -#define TIREQ (*(volatile unsigned long *)0x80000260) -#define TWDCFG (*(volatile unsigned long *)0x80000270) -#define TWDCLR (*(volatile unsigned long *)0x80000274) -#define TC32EN (*(volatile unsigned long *)0x80000280) -#define TC32LDV (*(volatile unsigned long *)0x80000284) -#define TC32CMP0 (*(volatile unsigned long *)0x80000288) -#define TC32CMP1 (*(volatile unsigned long *)0x8000028c) -#define TC32PCNT (*(volatile unsigned long *)0x80000290) -#define TC32MCNT (*(volatile unsigned long *)0x80000294) -#define TC32IRQ (*(volatile unsigned long *)0x80000298) - -/* TIREQ flags */ -#define TF0 (1<<8) /* Timer 0 reference value reached */ -#define TF1 (1<<9) /* Timer 1 reference value reached */ -#define TI0 (1<<0) /* Timer 0 IRQ flag */ -#define TI1 (1<<1) /* Timer 1 IRQ flag */ - -/* NAND Flash Controller */ - -#define NFC_CMD (*(volatile unsigned long *)0x90000000) -#define NFC_SADDR (*(volatile unsigned long *)0x9000000C) -#define NFC_SDATA (*(volatile unsigned long *)0x90000040) -#define NFC_WDATA (*(volatile unsigned long *)0x90000010) -#define NFC_CTRL (*(volatile unsigned long *)0x90000050) - #define NFC_16BIT (1<<26) - #define NFC_CS0 (1<<23) - #define NFC_CS1 (1<<22) - #define NFC_READY (1<<20) -#define NFC_IREQ (*(volatile unsigned long *)0x90000060) -#define NFC_RST (*(volatile unsigned long *)0x90000064) - - -/* ECC controller */ - -#define ECC_CTRL (*(volatile unsigned long *)0x80000900) - #define ECC_DMA_REQ (1<<28) - #define ECC_ENC (1<<27) /* MLC ECC3/4 */ - #define ECC_READY (1<<26) - #define ECC_IEN (1<<25) - #define ECC_MANUAL (1<<22) - #define ECC_WCNT (1<<12) /* [21:12] */ - #define ECC_HOLD (1<<7) - #define ECC_M4EN (1<<6) - #define ECC_ZERO (1<<5) - #define ECC_M3EN (1<<4) - #define ECC_CNT_MASK (7<<1) - #define ECC_CNT (1<<1) - #define ECC_SLC (1<<0) - -#define ECC_BASE (*(volatile unsigned long *)0x80000904) -#define ECC_MASK (*(volatile unsigned long *)0x80000908) -#define ECC_CLR (*(volatile unsigned long *)0x8000090c) -#define SLC_ECC0 (*(volatile unsigned long *)0x80000910) -#define SLC_ECC1 (*(volatile unsigned long *)0x80000914) -#define SLC_ECC2 (*(volatile unsigned long *)0x80000918) -#define SLC_ECC3 (*(volatile unsigned long *)0x8000091c) -#define SLC_ECC4 (*(volatile unsigned long *)0x80000920) -#define SLC_ECC5 (*(volatile unsigned long *)0x80000924) -#define SLC_ECC6 (*(volatile unsigned long *)0x80000928) -#define SLC_ECC7 (*(volatile unsigned long *)0x8000092c) -#define MLC_ECC0W (*(volatile unsigned long *)0x80000930) -#define MLC_ECC1W (*(volatile unsigned long *)0x80000934) -#define MLC_ECC2W (*(volatile unsigned long *)0x80000938) -#define MLC_ECC0R (*(volatile unsigned long *)0x80000940) -#define MLC_ECC1R (*(volatile unsigned long *)0x80000944) -#define MLC_ECC2R (*(volatile unsigned long *)0x80000948) -#define ECC_CORR_START (*(volatile unsigned long *)0x8000094c) -#define ECC_ERRADDR(x) (*(volatile unsigned long *)(0x80000950+4*(x))) -#define ECC_ERRDATA(x) (*(volatile unsigned long *)(0x80000960+4*(x))) -#define ECC_ERR_NUM (*(volatile unsigned long *)0x80000970) - - -/* Digital Audio Interface */ -#define DADI_L0 (*(volatile unsigned long *)0x80000000) -#define DADI_R0 (*(volatile unsigned long *)0x80000004) -#define DADI_L1 (*(volatile unsigned long *)0x80000008) -#define DADI_R1 (*(volatile unsigned long *)0x8000000C) -#define DADI_L2 (*(volatile unsigned long *)0x80000010) -#define DADI_R2 (*(volatile unsigned long *)0x80000014) -#define DADI_L3 (*(volatile unsigned long *)0x80000018) -#define DADI_R3 (*(volatile unsigned long *)0x8000001c) - -#define DADO_L0 (*(volatile unsigned long *)0x80000020) -#define DADO_R0 (*(volatile unsigned long *)0x80000024) -#define DADO_L1 (*(volatile unsigned long *)0x80000028) -#define DADO_R1 (*(volatile unsigned long *)0x8000002C) -#define DADO_L2 (*(volatile unsigned long *)0x80000030) -#define DADO_R2 (*(volatile unsigned long *)0x80000034) -#define DADO_L3 (*(volatile unsigned long *)0x80000038) -#define DADO_R3 (*(volatile unsigned long *)0x8000003c) - -#define DAMR (*(volatile unsigned long *)0x80000040) -#define DAVC (*(volatile unsigned long *)0x80000044) - -#define DADI_L(x) (*(volatile unsigned long *)(0x80000000 + (x) * 8)) -#define DADI_R(x) (*(volatile unsigned long *)(0x80000004 + (x) * 8)) -#define DADO_L(x) (*(volatile unsigned long *)(0x80000020 + (x) * 8)) -#define DADO_R(x) (*(volatile unsigned long *)(0x80000024 + (x) * 8)) - -/* USB 2.0 device system MMR base address */ -#define USB_BASE 0x90000b00 - -#define USB_NUM_ENDPOINTS 3 -#define USB_DEVBSS_ATTR IBSS_ATTR - -/* Timer frequency */ -/* timers are based on XIN (12Mhz) */ -#define TIMER_FREQ (12000000) - -#endif diff --git a/firmware/target/arm/ata-nand-telechips.c b/firmware/target/arm/ata-nand-telechips.c index 73d92a5215..55f6b1f3f7 100644 --- a/firmware/target/arm/ata-nand-telechips.c +++ b/firmware/target/arm/ata-nand-telechips.c @@ -48,7 +48,7 @@ static long next_yield = 0; static struct mutex ata_mtx SHAREDBSS_ATTR; -#if defined(COWON_D2) || defined(IAUDIO_7) +#if defined(COWON_D2) #define FTL_V2 #define MAX_WRITE_CACHES 8 #else @@ -906,13 +906,6 @@ int nand_init(void) mutex_init(&ata_mtx); -#ifdef CPU_TCC77X - CSCFG2 = 0x018a8010 | tcc77x_cscfg_bw(TCC77X_CSCFG_BW8); - - GPIOC_FUNC &= ~(CS_GPIO_BIT | WE_GPIO_BIT); - GPIOC_FUNC |= 0x1; -#endif - /* Set GPIO direction for chip select & write protect */ NAND_GPIO_OUT_EN(CS_GPIO_BIT | WE_GPIO_BIT); diff --git a/firmware/target/arm/lcd-ssd1815.c b/firmware/target/arm/lcd-ssd1815.c index 891d4ef64d..028362f91c 100644 --- a/firmware/target/arm/lcd-ssd1815.c +++ b/firmware/target/arm/lcd-ssd1815.c @@ -144,81 +144,6 @@ void lcd_init_device(void) lcd_write_command(LCD_SET_NORMAL_DISPLAY); } - -#elif defined(CPU_TCC77X) - -/* TCC77x specific defines */ -#define LCD_BASE 0x50000000 -#define LCD_CMD *(volatile unsigned char*)(LCD_BASE) -#define LCD_DATA *(volatile unsigned char*)(LCD_BASE+1) - -void lcd_write_command(int byte) -{ - LCD_CMD = byte; - - asm volatile ( - "nop \n\t" - "nop \n\t" - "nop \n\t" - ); -} - -void lcd_write_data(const fb_data* p_bytes, int count) -{ - while (count--) - { - LCD_DATA = *(p_bytes++); - - asm volatile ( - "nop \n\t" - "nop \n\t" - "nop \n\t" - ); - } -} - -/* LCD init */ -void lcd_init_device(void) -{ - uint32_t bus_width; - - /* Telechips init the same as the original firmware */ - CSCFG1 &= 0xc3ffc000; - CSCFG1 |= 0x3400101a; - CSCFG1 |= (1 << 21); - CSCFG1 &= ~(1 << 21); - - bus_width = ((MCFG >> 11) & 0x3) ^ 3; - - CSCFG1 = (bus_width << 28) | - (3 << 26) | /* MTYPE = 3 */ - ((LCD_BASE >> 28) << 22) | /* CSBASE = 0x5 */ - (1 << 20) | /* Unknown */ - (3 << 11) | /* Setup time = 3 cycles */ - (3 << 3) | /* Pulse width = 3+1 cycles */ - (1 << 0); /* Hold time = 1 cycle */ - - /* SSD1815 inits like the original firmware */ - lcd_write_command(LCD_SET_DISPLAY_OFF); - lcd_set_flip(false); - lcd_write_command(LCD_SET_INTERNAL_REGULATOR_RESISTOR_RATIO | 5); - lcd_set_contrast(lcd_default_contrast()); - lcd_write_command(LCD_SET_POWER_CONTROL_REGISTER | 7); - /* power control register: op-amp=1, regulator=1, booster=1 */ - lcd_write_command(LCD_SET_BIAS_TC_OSC); - - /* 0xc2 = 110 000 10: Osc. Freq 110 - ??? - TC value 000 - "-0.01%/C (TC0, POR)" - Bias ratio 10 - "1/9, 1/7 (POR)" - */ - lcd_write_command(0xc2); - lcd_write_command(LCD_SET_DISPLAY_ON); - - lcd_clear_display(); - lcd_update(); -} - -/* End of TCC77x specific defines */ #endif diff --git a/firmware/target/arm/pcm-telechips.c b/firmware/target/arm/pcm-telechips.c index 68bae1b0a9..ff550b14d6 100644 --- a/firmware/target/arm/pcm-telechips.c +++ b/firmware/target/arm/pcm-telechips.c @@ -82,19 +82,6 @@ void pcm_play_dma_init(void) /* Enable DAI block in Master mode, 256fs->32fs, 16bit LSB */ DAMR = 0x3c8e80; -#elif defined(IAUDIO_7) - BCLKCTR &= ~DEV_DAI; - PCLK_DAI = (0x800a << 16) | (PCLK_DAI & 0xffff); - BCLKCTR |= DEV_DAI; - - /* Master mode, 256->64fs, 16bit LSB*/ - DAMR = 0x3cce20; -#elif defined(LOGIK_DAX) - /* TODO */ -#elif defined(SANSA_M200) - /* TODO */ -#elif defined(SANSA_C100) - /* TODO */ #else #error "Target isn't supported" #endif @@ -228,7 +215,7 @@ const void * pcm_rec_dma_get_peak_buffer(void) } #endif -#if defined(CPU_TCC77X) || defined(CPU_TCC780X) +#if defined(CPU_TCC780X) void fiq_handler(void) ICODE_ATTR __attribute__((naked)); void fiq_handler(void) { @@ -245,9 +232,6 @@ void fiq_handler(void) #if defined(CPU_TCC780X) "mov r8, #0xc000 \n" /* DAI_TX_IRQ_MASK | DAI_RX_IRQ_MASK */ "ldr r9, =0xf3001004 \n" /* CREQ */ -#elif defined(CPU_TCC77X) - "mov r8, #0x0030 \n" /* DAI_TX_IRQ_MASK | DAI_RX_IRQ_MASK */ - "ldr r9, =0x80000104 \n" /* CREQ */ #endif "str r8, [r9] \n" /* clear DAI IRQs */ "ldmia r11, { r8-r9 } \n" /* r8 = p, r9 = size */ diff --git a/firmware/target/arm/system-arm.h b/firmware/target/arm/system-arm.h index e5d3f35001..af16346b51 100644 --- a/firmware/target/arm/system-arm.h +++ b/firmware/target/arm/system-arm.h @@ -382,7 +382,7 @@ static inline uint32_t swaw32_hw(uint32_t value) } -#if defined(CPU_TCC780X) || defined(CPU_TCC77X) /* Single core only for now */ \ +#if defined(CPU_TCC780X) /* Single core only for now */ \ || CONFIG_CPU == IMX31L || CONFIG_CPU == DM320 || CONFIG_CPU == AS3525 \ || CONFIG_CPU == S3C2440 || CONFIG_CPU == S5L8701 || CONFIG_CPU == AS3525v2 \ || CONFIG_CPU == S5L8702 diff --git a/firmware/target/arm/tcc77x/adc-tcc77x.c b/firmware/target/arm/tcc77x/adc-tcc77x.c deleted file mode 100644 index f48528639e..0000000000 --- a/firmware/target/arm/tcc77x/adc-tcc77x.c +++ /dev/null @@ -1,121 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 by Dave Chapman - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#include "config.h" -#include "cpu.h" -#include "system.h" -#include "kernel.h" -#include "thread.h" -#include "string.h" -#include "adc.h" - -/************************************************************************** - ** The A/D conversion is done every tick, in three steps: - ** - ** 1) On the tick interrupt, the conversion of channels 0-3 is started, and - ** the A/D interrupt is enabled. - ** - ** 2) After the conversion is done, an interrupt - ** is generated at level 1, which is the same level as the tick interrupt - ** itself. This interrupt will be pending until the tick interrupt is - ** finished. - ** When the A/D interrupt is finally served, it will read the results - ** from the first conversion and start the conversion of channels 4-7. - ** - ** 3) When the conversion of channels 4-7 is finished, the interrupt is - ** triggered again, and the results are read. This time, no new - ** conversion is started, it will be done in the next tick interrupt. - ** - ** Thus, each channel will be updated HZ times per second. - ** - *************************************************************************/ - -static int channel_group; -static unsigned short adcdata[8]; - -/* Tick task */ -static void adc_tick(void) -{ - /* Start a conversion of channels 0-3. This will trigger an interrupt, - and the interrupt handler will take care of channels 4-7. */ - - int i; - - PCLKCFG6 |= (1<<15); /* Enable ADC clock */ - - channel_group = 0; - - /* Start converting the first 4 channels */ - for (i = 0; i < 4; i++) - ADCCON = i; - -} - -/* IRQ handler */ -void ADC(void) -{ - int num; - int i; - uint32_t adc_status; - - do - { - adc_status = ADCSTATUS; - num = (adc_status>>24) & 7; - if (num) adcdata[(adc_status >> 16) & 0x7] = adc_status & 0x3ff; - } while (num); - - - if (channel_group == 0) - { - /* Start conversion of channels 4-7 */ - for (i = 4; i < 8; i++) - ADCCON = i; - - channel_group = 1; - } - else - { - PCLKCFG6 &= ~(1<<15); /* Disable ADC clock */ - } -} - -unsigned short adc_read(int channel) -{ - return adcdata[channel]; -} - -void adc_init(void) -{ - /* Initialize ADC clocks */ - PCLKCFG6 = (PCLKCFG6 & 0xffff0000) | 4004; - - ADCCON = (1<<4); /* Leave standby mode */ - - /* IRQ enable, auto power-down, single-mode */ - ADCCFG |= (1<<3) | (1<<1) | (1<<0); - - /* Unmask ADC IRQ */ - IEN |= ADC_IRQ_MASK; - - tick_add_task(adc_tick); - - sleep(2); /* Ensure adc_data[] contains data before returning */ -} diff --git a/firmware/target/arm/tcc77x/app.lds b/firmware/target/arm/tcc77x/app.lds deleted file mode 100644 index 991b7156fe..0000000000 --- a/firmware/target/arm/tcc77x/app.lds +++ /dev/null @@ -1,99 +0,0 @@ -#include "config.h" - -ENTRY(start) -OUTPUT_FORMAT(elf32-littlearm) -OUTPUT_ARCH(arm) -STARTUP(target/arm/tcc77x/crt0.o) - -#define PLUGINSIZE PLUGIN_BUFFER_SIZE -#define CODECSIZE CODEC_SIZE - -#define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGINSIZE - CODECSIZE - -#define DRAMORIG 0x20000000 -#define IRAMORIG 0x00000000 -#define IRAMSIZE 64K - - -/* End of the audio buffer, where the codec buffer starts */ -#define ENDAUDIOADDR (DRAMORIG + DRAMSIZE) - -/* Where the codec buffer ends, and the plugin buffer starts */ -#define ENDADDR (ENDAUDIOADDR + CODECSIZE) - - -MEMORY -{ -#ifdef TCCBOOT - DRAM : ORIGIN = DRAMORIG + DRAMSIZE - 0x100000, LENGTH = 0x100000 -#else - DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE -#endif - IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE -} - -SECTIONS -{ - .text : { - loadaddress = .; - _loadaddress = .; - . = ALIGN(0x200); - *(.init.text) - *(.text) - *(.text*) - *(.glue_7) - *(.glue_7t) - } > DRAM - - .data : { - *(.icode) - *(.irodata) - *(.idata) - *(.data*) - *(.rodata.*) - *(.rodata) - . = ALIGN(0x4); - _dataend = . ; - } > DRAM - - .stack : - { - *(.stack) - _stackbegin = .; - stackbegin = .; - . += 0x2000; - _stackend = .; - stackend = .; - } > DRAM - - .bss : { - _edata = .; - *(.bss*); - *(.ibss); - *(COMMON) - _end = .; - } > DRAM - .audiobuf ALIGN(4) : - { - _audiobuffer = .; - audiobuffer = .; - } > DRAM - - .audiobufend ENDAUDIOADDR: - { - audiobufend = .; - _audiobufend = .; - } > DRAM - - .codec ENDAUDIOADDR: - { - codecbuf = .; - _codecbuf = .; - } - - .plugin ENDADDR: - { - _pluginbuf = .; - pluginbuf = .; - } -} diff --git a/firmware/target/arm/tcc77x/ata-nand-target.h b/firmware/target/arm/tcc77x/ata-nand-target.h deleted file mode 100644 index 93139a16d5..0000000000 --- a/firmware/target/arm/tcc77x/ata-nand-target.h +++ /dev/null @@ -1,33 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 Dave Chapman - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#ifndef ATA_TARGET_H -#define ATA_TARGET_H - -/* GPIOs */ - -#define NAND_GPIO_SET(n) GPIOC |= n -#define NAND_GPIO_CLEAR(n) GPIOC &= (~n) -#define NAND_GPIO_OUT_EN(n) GPIOC_DIR |= n - -#define CS_GPIO_BIT (1<<24) /* Chip Select */ -#define WE_GPIO_BIT (1<<25) /* Write Enable */ - -#endif diff --git a/firmware/target/arm/tcc77x/boot.lds b/firmware/target/arm/tcc77x/boot.lds deleted file mode 100644 index 6303de0c34..0000000000 --- a/firmware/target/arm/tcc77x/boot.lds +++ /dev/null @@ -1,63 +0,0 @@ -#include "config.h" - -ENTRY(start) -OUTPUT_FORMAT(elf32-littlearm) -OUTPUT_ARCH(arm) -STARTUP(target/arm/tcc77x/crt0.o) - -#define DRAMSIZE (MEMORYSIZE * 0x100000) - -#define DRAMORIG 0x20000000 -#define IRAMORIG 0x00000000 -#define IRAMSIZE 64K - - -MEMORY -{ -#ifdef TCCBOOT - DRAM : ORIGIN = DRAMORIG + DRAMSIZE - 0x100000, LENGTH = 0x100000 -#else - DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE -#endif - IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE -} - -SECTIONS -{ - .text : { - *(.init.text) - *(.text) - *(.text*) - *(.glue_7) - *(.glue_7t) - } > DRAM - - .data : { - *(.icode) - *(.irodata) - *(.idata) - *(.data*) - *(.rodata.*) - *(.rodata) - . = ALIGN(0x4); - _dataend = . ; - } > DRAM - - .stack (NOLOAD) : - { - *(.stack) - _stackbegin = .; - stackbegin = .; - . += 0x2000; - _stackend = .; - stackend = .; - } > DRAM - - .bss (NOLOAD) : { - _edata = .; - *(.bss*); - *(.ibss); - *(COMMON) - _end = .; - } > DRAM -} diff --git a/firmware/target/arm/tcc77x/c100/adc-target.h b/firmware/target/arm/tcc77x/c100/adc-target.h deleted file mode 100644 index 0990d4d62d..0000000000 --- a/firmware/target/arm/tcc77x/c100/adc-target.h +++ /dev/null @@ -1,26 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 Dave Chapman - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#ifndef _ADC_TARGET_H_ -#define _ADC_TARGET_H_ - -#define NUM_ADC_CHANNELS 8 - -#endif /* _ADC_TARGET_H_ */ diff --git a/firmware/target/arm/tcc77x/c100/backlight-target.h b/firmware/target/arm/tcc77x/c100/backlight-target.h deleted file mode 100644 index 7ae71022f0..0000000000 --- a/firmware/target/arm/tcc77x/c100/backlight-target.h +++ /dev/null @@ -1,40 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 by Dave Chapman - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#ifndef BACKLIGHT_TARGET_H -#define BACKLIGHT_TARGET_H - -#include "tcc77x.h" - -#define backlight_hw_init() true - -static inline void backlight_hw_on(void) -{ - /* Enable backlight */ - GPIOE |= 0x2; -} - -static inline void backlight_hw_off(void) -{ - /* Disable backlight */ - GPIOE &= ~0x2; -} - -#endif diff --git a/firmware/target/arm/tcc77x/c100/button-c100.c b/firmware/target/arm/tcc77x/c100/button-c100.c deleted file mode 100644 index 47b004eb61..0000000000 --- a/firmware/target/arm/tcc77x/c100/button-c100.c +++ /dev/null @@ -1,64 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 by Dave Chapman - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -#include "config.h" -#include "cpu.h" -#include "button.h" - -void button_init_device(void) -{ - GPIOA_DIR |= 0xC; -} - -int button_read_device(void) -{ - int btn = BUTTON_NONE; - - if (!button_hold()) - { - GPIOA |= 0x4; - GPIOA &= ~0x8; - - int i=20; while (i--); - - if (GPIOA & 0x10) btn |= BUTTON_UP; - if (GPIOA & 0x20) btn |= BUTTON_RIGHT; - if (GPIOA & 0x40) btn |= BUTTON_LEFT; - - GPIOA |= 0x8; - GPIOA &= ~0x4; - - i=20; while (i--); - - if (GPIOA & 0x10) btn |= BUTTON_VOLUP; - if (GPIOA & 0x20) btn |= BUTTON_VOLDOWN; - if (GPIOA & 0x40) btn |= BUTTON_DOWN; - - if (GPIOA & 0x80) btn |= BUTTON_SELECT; - if (GPIOA & 0x100) btn |= BUTTON_POWER; - } - return btn; -} - -bool button_hold(void) -{ - return (GPIOA & 0x2); -} diff --git a/firmware/target/arm/tcc77x/c100/button-target.h b/firmware/target/arm/tcc77x/c100/button-target.h deleted file mode 100644 index 0e8b7e8f1c..0000000000 --- a/firmware/target/arm/tcc77x/c100/button-target.h +++ /dev/null @@ -1,45 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 by Dave Chapman - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -#ifndef _BUTTON_TARGET_H_ -#define _BUTTON_TARGET_H_ - -#define HAS_BUTTON_HOLD - -/* Main unit's buttons */ -#define BUTTON_POWER 0x00000001 -#define BUTTON_VOLUP 0x00000002 -#define BUTTON_VOLDOWN 0x00000004 -#define BUTTON_UP 0x00000008 -#define BUTTON_DOWN 0x00000010 -#define BUTTON_LEFT 0x00000020 -#define BUTTON_RIGHT 0x00000040 -#define BUTTON_SELECT 0x00000080 - -#define BUTTON_MAIN (BUTTON_POWER|BUTTON_VOLUP|BUTTON_VOLDOWN\ - |BUTTON_UP|BUTTON_DOWN|BUTTON_LEFT\ - |BUTTON_RIGHT|BUTTON_SELECT) - -/* Software power-off */ -#define POWEROFF_BUTTON BUTTON_POWER -#define POWEROFF_COUNT 40 - -#endif /* _BUTTON_TARGET_H_ */ diff --git a/firmware/target/arm/tcc77x/c100/lcd-S6B33B2.c b/firmware/target/arm/tcc77x/c100/lcd-S6B33B2.c deleted file mode 100644 index c53aadaf30..0000000000 --- a/firmware/target/arm/tcc77x/c100/lcd-S6B33B2.c +++ /dev/null @@ -1,286 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 by Mark Arigo - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#include "config.h" -#include "cpu.h" -#include "lcd.h" -#include "kernel.h" -#include "system.h" - -/* Display status */ -static unsigned lcd_yuv_options SHAREDBSS_ATTR = 0; - -/* LCD command set for Samsung S6B33B2 */ -#define R_NOP 0x00 -#define R_OSCILLATION_MODE 0x02 -#define R_DRIVER_OUTPUT_MODE 0x10 -#define R_DCDC_SET 0x20 -#define R_BIAS_SET 0x22 -#define R_DCDC_CLOCK_DIV 0x24 -#define R_DCDC_AMP_ONOFF 0x26 -#define R_TEMP_COMPENSATION 0x28 -#define R_CONTRAST_CONTROL1 0x2a -#define R_CONTRAST_CONTROL2 0x2b -#define R_STANDBY_OFF 0x2c -#define R_STANDBY_ON 0x2d -#define R_DDRAM_BURST_OFF 0x2e -#define R_DDRAM_BURST_ON 0x2f -#define R_ADDRESSING_MODE 0x30 -#define R_ROW_VECTOR_MODE 0x32 -#define R_N_LINE_INVERSION 0x34 -#define R_FRAME_FREQ_CONTROL 0x36 -#define R_RED_PALETTE 0x38 -#define R_GREEN_PALETTE 0x3a -#define R_BLUE_PALETTE 0x3c -#define R_ENTRY_MODE 0x40 -#define R_X_ADDR_AREA 0x42 -#define R_Y_ADDR_AREA 0x43 -#define R_RAM_SKIP_AREA 0x45 -#define R_DISPLAY_OFF 0x50 -#define R_DISPLAY_ON 0x51 -#define R_SPEC_DISPLAY_PATTERN 0x53 -#define R_PARTIAL_DISPLAY_MODE 0x55 -#define R_PARTIAL_START_LINE 0x56 -#define R_PARTIAL_END_LINE 0x57 -#define R_AREA_SCROLL_MODE 0x59 -#define R_SCROLL_START_LINE 0x5a -#define R_DATA_FORMAT_SELECT 0x60 - -/* TCC77x specific defines */ -#define LCD_BASE 0x50000000 -#define LCD_CMD *(volatile unsigned char*)(LCD_BASE) -#define LCD_DATA *(volatile unsigned char*)(LCD_BASE+1) - -static void lcd_send_command(unsigned cmd) -{ - LCD_CMD = cmd; - - asm volatile ( - "nop \n\t" - "nop \n\t" - "nop \n\t" - ); -} - -static void lcd_send_data(unsigned data) -{ - LCD_DATA = (data & 0xff00) >> 8; - LCD_DATA = (data & 0x00ff); -} - -/* End of TCC77x specific defines */ - -/* LCD init */ -void lcd_init_device(void) -{ - uint32_t bus_width; - - /* Telechips init the same as the original firmware */ - bus_width = ((MCFG >> 11) & 0x3) ^ 3; - - CSCFG1 = (bus_width << 28) | - (3 << 26) | /* MTYPE = 3 */ - ((LCD_BASE >> 28) << 22) | /* CSBASE = 0x5 */ - (1 << 20) | /* Unknown */ - (2 << 11) | /* Setup time = 2 cycles */ - (2 << 3) | /* Pulse width = 2+1 cycles */ - (2 << 0); /* Hold time = 2 cycle */ - - GPIOE &= ~0x8; - sleep(HZ/100); /* 10ms */ - - GPIOE |= 0x08; - sleep(HZ/100); /* 10ms */ - - lcd_send_command(R_STANDBY_OFF); - sleep(HZ/20); /* 50ms */ - - lcd_send_command(R_OSCILLATION_MODE); - lcd_send_command(0x01); - sleep(HZ/100); /* 10ms */ - - lcd_send_command(R_DCDC_AMP_ONOFF); - lcd_send_command(0x01); - sleep(HZ/100); /* 10ms */ - - lcd_send_command(R_DCDC_AMP_ONOFF); - lcd_send_command(0x09); - sleep(HZ/100); /* 10ms */ - - lcd_send_command(R_DCDC_AMP_ONOFF); - lcd_send_command(0x0b); - sleep(HZ/100); /* 10ms */ - - lcd_send_command(R_DCDC_AMP_ONOFF); - lcd_send_command(0x0f); - sleep(HZ/100); /* 10ms */ - - lcd_send_command(R_DCDC_SET); - lcd_send_command(0x01); - sleep(HZ/100); /* 10ms */ - sleep(HZ/10); /* 100ms */ - - lcd_send_command(R_TEMP_COMPENSATION); - lcd_send_command(0x01); - sleep(HZ/100); /* 10ms */ - - lcd_send_command(R_DRIVER_OUTPUT_MODE); - lcd_send_command(0x03); - - lcd_send_command(R_ENTRY_MODE); - lcd_send_command(0x81); - - lcd_send_command(R_N_LINE_INVERSION); - lcd_send_command(0x04); - lcd_send_command(0xfa); - lcd_send_command(0x5f); - - lcd_set_contrast(0x28); - - lcd_send_command(R_SPEC_DISPLAY_PATTERN); - lcd_send_command(0x0); - sleep(HZ/100); /* 10ms */ - - lcd_send_command(R_ADDRESSING_MODE); - lcd_send_command(0x0); - sleep(HZ/100); /* 10ms */ - - lcd_send_command(R_PARTIAL_DISPLAY_MODE); - lcd_send_command(0x0); - sleep(HZ/100); /* 10ms */ - - lcd_send_command(R_X_ADDR_AREA); - lcd_send_command(0); - lcd_send_command(0x80); - - lcd_send_command(R_Y_ADDR_AREA); - lcd_send_command(0x0); - lcd_send_command(0x80); - - lcd_send_command(R_DISPLAY_ON); - - lcd_send_command(R_SPEC_DISPLAY_PATTERN); - lcd_send_command(0x0); - - /* Rockbox init */ - lcd_clear_display(); - lcd_update(); -} - -/*** hardware configuration ***/ -int lcd_default_contrast(void) -{ - return 0x28; -} - -void lcd_set_contrast(int val) -{ - //val &= 0xFF; - lcd_send_command(R_CONTRAST_CONTROL1); - lcd_send_command(val); -} - -void lcd_set_invert_display(bool yesno) -{ - /* TODO: Implement lcd_set_invert_display() */ - (void)yesno; -} - -/* turn the display upside down (call lcd_update() afterwards) */ -void lcd_set_flip(bool yesno) -{ - lcd_send_command(R_DRIVER_OUTPUT_MODE); - lcd_send_command(yesno ? 0x02 : 0x07); -} - -/*** update functions ***/ -void lcd_yuv_set_options(unsigned options) -{ - lcd_yuv_options = options; -} - -/* TODO: implement me */ -void lcd_blit_yuv(unsigned char *const src[3], - int src_x, int src_y, int stride, - int x, int y, int width, int height) -{ - (void) src; - (void) src_x; - (void) src_y; - (void) stride; - (void) x; - (void) y; - - return; - -} - -/* Update the display. - This must be called after all other LCD functions that change the display. */ -void lcd_update(void) -{ - lcd_update_rect(0, 0, LCD_WIDTH, LCD_HEIGHT); -} - -/* Update a fraction of the display. */ -void lcd_update_rect(int x, int y, int width, int height) -{ - const fb_data *addr; - - if (x + width >= LCD_WIDTH) - width = LCD_WIDTH - x; - if (y + height >= LCD_HEIGHT) - height = LCD_HEIGHT - y; - - if ((width <= 0) || (height <= 0)) - return; /* Nothing left to do. */ - - addr = FBADDR(x,y); - - if (width <= 1) { - lcd_send_command(R_ENTRY_MODE); /* The X end address must be larger */ - lcd_send_command(0x80); /* that the X start address, so we */ - lcd_send_command(R_X_ADDR_AREA); /* switch to vertical mode for */ - lcd_send_command(x); /* single column updates and set */ - lcd_send_command(x + 1); /* the window width to 2 */ - } else { - lcd_send_command(R_ENTRY_MODE); - lcd_send_command(0x82); - lcd_send_command(R_X_ADDR_AREA); - lcd_send_command(x); - lcd_send_command(x + width - 1); - } - - lcd_send_command(R_Y_ADDR_AREA); - lcd_send_command(y); - lcd_send_command(y + height - 1); - - /* NOP needed because on some c200s, the previous lcd_send_command is - interpreted as a separate command instead of part of R_Y_ADDR_AREA. */ - lcd_send_command(R_NOP); - - do { - int w = width; - do { - lcd_send_data(*addr++); - } while (--w > 0); - addr += LCD_WIDTH - width; - } while (--height > 0); -} diff --git a/firmware/target/arm/tcc77x/c100/power-c100.c b/firmware/target/arm/tcc77x/c100/power-c100.c deleted file mode 100644 index e84ff1c852..0000000000 --- a/firmware/target/arm/tcc77x/c100/power-c100.c +++ /dev/null @@ -1,43 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 Dave Chapman - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#include "config.h" -#include "cpu.h" -#include -#include "kernel.h" -#include "system.h" -#include "power.h" - -void power_init(void) -{ -} - -void ide_power_enable(bool on) -{ -} - -bool ide_powered(void) -{ - return true; -} - -void power_off(void) -{ -} diff --git a/firmware/target/arm/tcc77x/crt0.S b/firmware/target/arm/tcc77x/crt0.S deleted file mode 100644 index aebd8974da..0000000000 --- a/firmware/target/arm/tcc77x/crt0.S +++ /dev/null @@ -1,230 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2002 by Linus Nielsen Feltzing - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -/* Arm bootloader and startup code based on startup.s from the iPodLinux loader - * - * Copyright (c) 2003, Daniel Palffy (dpalffy (at) rainstorm.org) - * Copyright (c) 2005, Bernard Leach - * - */ - -#include "config.h" -#include "cpu.h" - - .section .init.text,"ax",%progbits - - .extern irq - .extern fiq - .extern UIE - .extern main - - .global start - -/* Telechips firmware files start with a 32-byte header, as part of the code. */ - -start: -#ifdef TCCBOOT - /* Add -DTCCBOOT to EXTRA_DEFINES in the bootloader Makefile to - enable building the bootloader to be appended to the end of the - original firmware, dual-booting based on a key-press. - - The following two values are filled in by mktccboot. - */ -of_entrypoint: .word 0 /* Saved entrypoint of original firmware*/ -bl_entrypoint: .word 0 /* Location in RAM of the start of our bootloader */ - -#else -// ldr pc, =start_loc /* jump to the main entry point */ - b start_loc - - .word 0xffff0601 /* Unknown magic */ - .word 0x3a726556 /* "Ver:" */ - .word 0x31373030 /* "0071" */ - .word 0 /* First CRC32 */ - .word 0 /* Unknown - always 0 */ - .word 0 /* Second CRC32 */ - .word 0 /* length of firmware file */ - -#if defined(LOGIK_DAX) || defined(SANSA_C100) - /* Some original firmwares have 0x40 bytes of zeroes here - we - don't know why, but err on the side of caution and include it - here. */ - .space 0x40 -#endif -#endif - -start_loc: - -#ifdef BOOTLOADER - -/* - If we are appended to the OF (i.e. dual-booting), do a simple GPIO - button check, and branch to the OF's entry point (saved by mktccboot) - if not active -*/ - -#ifdef TCCBOOT - mov r0, #0x80000000 -#if defined(LOGIK_DAX) || defined(SANSA_C100) - ldr r0, [r0, #0x300] /* Hold button is GPIO A, pin 0x2 */ - tst r0, #0x2 -#elif defined(SANSA_M200) - ldr r0, [r0, #0x310] /* Hold button is GPIO B, pin 0x200 */ - tst r0, #0x200 -#elif defined(IAUDIO_7) - ldr r0, [r0, #0x300] /* Hold button is !GPIO A, pin 0x2 */ - tst r0, #0x2 -#else - #error No bootup key detection implemented for this target -#endif - - ldrne pc, of_entrypoint /* Jump to OF if HOLD button not pressed */ -#endif /* TCCBOOT */ - -/* We are now definitely executing the bootloader, so we relocate to the - linked address (see boot.lds) - 1MB from the end of DRAM. -*/ - -#ifdef TCCBOOT - ldr r0, bl_entrypoint -#else - mov r0, #0x20000000 /* Otherwise, load address is the start of DRAM */ -#endif - mov r1, #0x20000000 /* Destination: 1MB from end of DRAM */ - add r1, r1, #((MEMORYSIZE - 1) * 0x100000) - - ldr r2, =_dataend -1: - cmp r2, r1 - ldrhi r3, [r0], #4 - strhi r3, [r1], #4 - bhi 1b - - ldr pc, =copied_start /* jump to the relocated start_loc: */ -copied_start: -#endif /* BOOTLOADER */ - - /* Set up stack for IRQ mode */ - mov r0,#0xd2 - msr cpsr, r0 - ldr sp, =irq_stack - - /* Set up stack for FIQ mode */ - mov r0,#0xd1 - msr cpsr, r0 - ldr sp, =fiq_stack - -#ifndef BOOTLOADER - /* Load the banked FIQ mode registers with useful values here. - These values will be used in the FIQ handler in pcm-telechips.c */ - .equ DADO_BASE, 0x80000020 - - ldr r10, =DADO_BASE - ldr r11, =dma_play_data -#endif - - /* Let svc, abort and undefined modes use irq stack */ - msr cpsr, #0xd3 - ldr sp, =irq_stack - msr cpsr, #0xd7 - ldr sp, =irq_stack - msr cpsr, #0xdb - ldr sp, =irq_stack - - /* Switch to sys mode */ - mov r0,#0xdf - msr cpsr, r0 - ldr sp, =stackend - - /* Copy exception handler code to address 0 */ - mov r2, #0x0 - ldr r3, =vectors_start - ldr r4, =vectors_end -1: - cmp r4, r3 - ldrhi r5, [r3], #4 - strhi r5, [r2], #4 - bhi 1b - - /* Initialise bss section to zero */ - ldr r2, =_edata - ldr r3, =_end - mov r4, #0 -1: - cmp r3, r2 - strhi r4, [r2], #4 - bhi 1b - - /* Set up some stack and munge it with 0xdeadbeef */ - ldr sp, =stackend - mov r3, sp - ldr r2, =stackbegin - ldr r4, =0xdeadbeef -1: - cmp r3, r2 - strhi r4, [r2], #4 - bhi 1b - - bl main - /* main() should never return */ - -/* Exception handlers. Will be copied to address 0 after memory remapping */ -vectors_start: - ldr pc, [pc, #24] - ldr pc, [pc, #24] - ldr pc, [pc, #24] - ldr pc, [pc, #24] - ldr pc, [pc, #24] - ldr pc, [pc, #24] - ldr pc, [pc, #24] - ldr pc, [pc, #24] - - /* Exception vectors */ - .global vectors -vectors: - .word start - .word undef_instr_handler - .word software_int_handler - .word prefetch_abort_handler - .word data_abort_handler - .word reserved_handler - .word irq_handler - .word fiq_handler -vectors_end: - - .text - -irq_handler: - stmfd sp!, {r0-r3, r12, lr} - bl irq - ldmfd sp!, {r0-r3, r12, lr} - subs pc, lr, #4 - -/* Align stacks to cache line boundary */ - .balign 16 - -/* 256 words of IRQ stack */ - .space 256*4 -irq_stack: - -/* 256 words of FIQ stack */ - .space 256*4 -fiq_stack: diff --git a/firmware/target/arm/tcc77x/debug-tcc77x.c b/firmware/target/arm/tcc77x/debug-tcc77x.c deleted file mode 100644 index 5a97706722..0000000000 --- a/firmware/target/arm/tcc77x/debug-tcc77x.c +++ /dev/null @@ -1,77 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 by Rob Purchase - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -#include "config.h" -#include "cpu.h" -#include "system.h" -#include "string.h" -#include -#include -#include "button.h" -#include "lcd.h" -#include "font.h" -#include "adc.h" - -bool dbg_ports(void) -{ - return false; -} - -bool dbg_hw_info(void) -{ - int line = 0, i, button, oldline; - bool done=false; - - lcd_setfont(FONT_SYSFIXED); - lcd_clear_display(); - - /* Put all the static text before the while loop */ - lcd_puts(0, line++, "[Hardware info]"); - - line++; - oldline=line; - while(!done) - { - line = oldline; - button = button_get(false); - - button &= ~BUTTON_REPEAT; -#ifdef BUTTON_SELECT - if (button == BUTTON_SELECT) -#else - if (button == BUTTON_STOP) -#endif - done=true; - - lcd_putsf(0, line++, "current tick: %08lx Seconds running: %08ld", - current_tick, current_tick/HZ); - - lcd_putsf(0, line++, "GPIOA: 0x%08lx GPIOB: 0x%08lx", GPIOA, GPIOB); - lcd_putsf(0, line++, "GPIOC: 0x%08lx GPIOD: 0x%08lx", GPIOC, GPIOD); - lcd_putsf(0, line++, "GPIOE: 0x%08lx", GPIOE); - - for (i = 0; i<4; i++) - lcd_putsf(0, line++, "ADC%d: 0x%04x", i, adc_read(i)); - - lcd_update(); - } - return false; -} diff --git a/firmware/target/arm/tcc77x/i2c-target.h b/firmware/target/arm/tcc77x/i2c-target.h deleted file mode 100644 index 9b9a74b4d2..0000000000 --- a/firmware/target/arm/tcc77x/i2c-target.h +++ /dev/null @@ -1,39 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2008 by Rob Purchase - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#ifndef I2C_TARGET_H -#define I2C_TARGET_H - -/* Definitions for the TCC77X I2C bus */ - -#define SDA_BIT (1<<10) -#define SCL_BIT (1<<11) - -#define SCL (GPIOB & SCL_BIT) -#define SCL_HI GPIOB |= SCL_BIT -#define SCL_LO GPIOB &= ~SCL_BIT - -#define SDA (GPIOB & SDA_BIT) -#define SDA_HI GPIOB |= SDA_BIT -#define SDA_LO GPIOB &= ~SDA_BIT -#define SDA_INPUT GPIOB_DIR &= ~SDA_BIT -#define SDA_OUTPUT GPIOB_DIR |= SDA_BIT - -#endif /* I2C_TARGET_H */ diff --git a/firmware/target/arm/tcc77x/iaudio7/adc-target.h b/firmware/target/arm/tcc77x/iaudio7/adc-target.h deleted file mode 100644 index 1916d93598..0000000000 --- a/firmware/target/arm/tcc77x/iaudio7/adc-target.h +++ /dev/null @@ -1,28 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 Dave Chapman - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#ifndef _ADC_TARGET_H_ -#define _ADC_TARGET_H_ - -#define NUM_ADC_CHANNELS 8 - -#define ADC_BUTTONS 0 - -#endif /* _ADC_TARGET_H_ */ diff --git a/firmware/target/arm/tcc77x/iaudio7/ata2501.c b/firmware/target/arm/tcc77x/iaudio7/ata2501.c deleted file mode 100644 index f7526b2b9a..0000000000 --- a/firmware/target/arm/tcc77x/iaudio7/ata2501.c +++ /dev/null @@ -1,110 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2008 Vitja Makarov - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -#include "config.h" -#include "system.h" -#include "cpu.h" -#include "button.h" - -#include "ata2501.h" - -#define STB (1<<5) -#define SDATA (1<<4) -#define RESET (1<<6) -#define SIFMD (1<<7) -#define STB_DELAY 200 - -static inline void ndelay(unsigned long nsecs) -{ - nsecs /= 8; - while (nsecs) - nsecs--; -} - -/* - TODO: sensitivity -*/ -void ata2501_init(void) -{ - GPIOD_DIR |= (RESET | STB | SIFMD | (1 << 8) | (1 << 9)); - GPIOD_DIR &= ~SDATA; - - GPIOD &= ~STB; - GPIOD |= (1 << 8) | SIFMD | (1 << 9); - - GPIOD &= ~RESET; - ndelay(1000); - GPIOD |= RESET; -} - -unsigned short ata2501_read(void) -{ - unsigned short ret = 0; - int i; - - for (i = 0; i < 12; i++) { - GPIOD |= STB; - ndelay(100); - ret <<= 1; - if (GPIOD & SDATA) - ret |= 1; - GPIOD &= ~STB; - ndelay(100); - } - - return ret; -} - -//#define ATA2501_TEST -#ifdef ATA2501_TEST -#include "lcd.h" - -static -void bits(char *str, unsigned short val) -{ - int i; - - for (i = 0; i < 12; i++) - str[i] = (val & (1 << i)) ? '1' : '0'; - str[i] = 0; -} - -void ata2501_test(void) -{ - char buf[100]; - ata2501_init(); - - while (1) { - unsigned short data; - int line = 0; - - data = ata2501_read(); - lcd_clear_display(); - lcd_puts(0, line++, "ATA2501 test"); - - bits(buf, data); - lcd_puts(0, line++, buf); - - lcd_update(); - sleep(HZ/10); - } -} -#endif diff --git a/firmware/target/arm/tcc77x/iaudio7/ata2501.h b/firmware/target/arm/tcc77x/iaudio7/ata2501.h deleted file mode 100644 index 465d0b199c..0000000000 --- a/firmware/target/arm/tcc77x/iaudio7/ata2501.h +++ /dev/null @@ -1,27 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2008 Vitja Makarov - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#ifndef _ATA2501_H_ -#define _ATA2501_H_ - -void ata2501_init(void); -unsigned short ata2501_read(void); - -#endif /* _ATA2501_H_ */ diff --git a/firmware/target/arm/tcc77x/iaudio7/audio-iaudio7.c b/firmware/target/arm/tcc77x/iaudio7/audio-iaudio7.c deleted file mode 100644 index bcb6843286..0000000000 --- a/firmware/target/arm/tcc77x/iaudio7/audio-iaudio7.c +++ /dev/null @@ -1,94 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 by Michael Sevakis - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#include "system.h" -#include "cpu.h" -#include "audio.h" -#include "sound.h" - -int audio_channels = 2; -int audio_output_source = AUDIO_SRC_PLAYBACK; - -void audio_set_output_source(int source) -{ - int oldmode = set_fiq_status(FIQ_DISABLED); - - if ((unsigned)source >= AUDIO_NUM_SOURCES) - source = AUDIO_SRC_PLAYBACK; - - audio_output_source = source; - set_fiq_status(oldmode); -} - -void audio_input_mux(int source, unsigned flags) -{ - static int last_source = AUDIO_SRC_PLAYBACK; - static bool last_recording = false; - bool recording = flags & SRCF_RECORDING; - - switch (source) - { - default: /* playback - no recording */ - source = AUDIO_SRC_PLAYBACK; - case AUDIO_SRC_PLAYBACK: - audio_channels = 2; - if (source != last_source) - { - audiohw_set_monitor(false); - /* audiohw_disable_recording();*/ - } - break; - - case AUDIO_SRC_MIC: /* recording only */ - GPIOD |= 0x1; - - audio_channels = 1; - if (source != last_source) - { - /*audiohw_set_monitor(false); - audiohw_enable_recording(true); /. source mic */ - } - break; - - case AUDIO_SRC_FMRADIO: /* recording and playback */ - GPIOD &= ~0x1; - - audio_channels = 2; - - if (source == last_source && recording == last_recording) - break; - - last_recording = recording; - - if (recording) - { - /*audiohw_set_monitor(false); - audiohw_enable_recording(false);*/ - } - else - { - /*audiohw_disable_recording(); */ - audiohw_set_monitor(true); /* line 1 analog audio path */ - } - break; - } /* end switch */ - - last_source = source; -} /* audio_input_mux */ diff --git a/firmware/target/arm/tcc77x/iaudio7/backlight-target.h b/firmware/target/arm/tcc77x/iaudio7/backlight-target.h deleted file mode 100644 index 0b227cd11c..0000000000 --- a/firmware/target/arm/tcc77x/iaudio7/backlight-target.h +++ /dev/null @@ -1,48 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2008 Vitja Makarov - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#ifndef BACKLIGHT_TARGET_H -#define BACKLIGHT_TARGET_H - -#include -#include "tcc77x.h" - -void power_touch_panel(bool on); - -static inline bool backlight_hw_init(void) -{ - GPIOD_DIR |= 0x2; - /* set backlight on by default, since the screen is unreadable without it */ - GPIOD |= 0x2; - return true; -} - -static inline void backlight_hw_on(void) -{ - GPIOD |= 0x2; - power_touch_panel(true); -} - -static inline void backlight_hw_off(void) -{ - GPIOD &= ~0x2; - power_touch_panel(false); -} -#endif /* BACKLIGHT_TARGET_H */ diff --git a/firmware/target/arm/tcc77x/iaudio7/button-iaudio7.c b/firmware/target/arm/tcc77x/iaudio7/button-iaudio7.c deleted file mode 100644 index abf31b4feb..0000000000 --- a/firmware/target/arm/tcc77x/iaudio7/button-iaudio7.c +++ /dev/null @@ -1,93 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2008 Vitja Makarov - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#include "config.h" -#include "cpu.h" -#include "button.h" -#include "backlight.h" -#include "adc.h" - -#include "button-target.h" -#include "ata2501.h" - -void button_init_device(void) -{ - ata2501_init(); -} - -/* - touchpad: - 0: stop - 1-8: between next & prev - 9: play - 10: next - 11: prev -*/ - -int button_read_device(void) -{ - static bool hold_button = false; - bool hold_button_old; - - int btn = BUTTON_NONE; - int adc; - int sensor; - - hold_button_old = hold_button; - hold_button = button_hold(); - -#ifndef BOOTLOADER - if (hold_button != hold_button_old) - backlight_hold_changed(hold_button); -#endif - - if (button_hold()) - return BUTTON_NONE; - - adc = adc_read(0); - sensor = ata2501_read(); - - if (0 == (GPIOA & 4)) - btn |= BUTTON_POWER; - - /* seems they can't be hold together */ - if (adc < 0x120) - btn |= BUTTON_VOLUP; - else if (adc < 0x270) - btn |= BUTTON_VOLDOWN; - else if (adc < 0x300) - btn |= BUTTON_MENU; - - if (sensor & (1 << 0)) - btn |= BUTTON_STOP; - if (sensor & (1 << 9)) - btn |= BUTTON_PLAY; - if (sensor & ((1 << 10) | 0x1c0)) - btn |= BUTTON_RIGHT; - if (sensor & ((1 << 11) | 0xe)) - btn |= BUTTON_LEFT; - - return btn; -} - -bool button_hold(void) -{ - return !(GPIOA & 0x2); -} diff --git a/firmware/target/arm/tcc77x/iaudio7/button-target.h b/firmware/target/arm/tcc77x/iaudio7/button-target.h deleted file mode 100644 index 9d232d9ae8..0000000000 --- a/firmware/target/arm/tcc77x/iaudio7/button-target.h +++ /dev/null @@ -1,47 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2008 Vitja Makarov - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#ifndef _IAUDIO7_BUTTON_TARGET_H_ -#define _IAUDIO7_BUTTON_TARGET_H_ - -#define HAS_BUTTON_HOLD - -/* Main unit's buttons */ -#define BUTTON_POWER 0x00000001 -#define BUTTON_VOLUP 0x00000002 -#define BUTTON_VOLDOWN 0x00000004 -#define BUTTON_MENU 0x00000008 - -#define BUTTON_LEFT 0x00000010 -#define BUTTON_RIGHT 0x00000020 -#define BUTTON_PLAY 0x00000040 -#define BUTTON_STOP 0x00000080 - -#define BUTTON_ON BUTTON_POWER - -#define BUTTON_MAIN (BUTTON_POWER|BUTTON_VOLUP|BUTTON_VOLDOWN| \ - BUTTON_MENU|BUTTON_LEFT|BUTTON_RIGHT| \ - BUTTON_PLAY|BUTTON_STOP) - -/* Software power-off */ -#define POWEROFF_BUTTON BUTTON_POWER -#define POWEROFF_COUNT 10 - -#endif /* _IAUDIO7_BUTTON_TARGET_H_ */ diff --git a/firmware/target/arm/tcc77x/iaudio7/lcd-iaudio7.c b/firmware/target/arm/tcc77x/iaudio7/lcd-iaudio7.c deleted file mode 100644 index e681e1eff7..0000000000 --- a/firmware/target/arm/tcc77x/iaudio7/lcd-iaudio7.c +++ /dev/null @@ -1,260 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2004 by Linus Nielsen Feltzing - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -/* - Thanks Hein-Pieter van Braam for initial work. - - Mostly based on lcd-h300.c, adapted for the iaudio 7 by Vitja Makarov - */ - -#include - -#include -#include -#include -#include -#include - -#include "hd66789r.h" - -static bool display_on = false; /* is the display turned on? */ - -static inline void lcd_write_reg(int reg, int data) -{ - GPIOA &= ~0x400; - outw(0, 0x50010000); - outw(reg << 1, 0x50010000); - GPIOA |= 0x400; - - outw((data & 0xff00) >> 7, 0x50010008); - outw((data << 24) >> 23, 0x50010008); -} - -static void lcd_write_cmd(int reg) -{ - GPIOA &= ~0x400; - outw(0, 0x50010000); - outw(reg << 1, 0x50010000); - GPIOA |= 0x400; -} - -/* Do what OF do */ -static void lcd_delay(int x) -{ - int i; - - x *= 0xc35; - for (i = 0; i < x * 8; i++) { - } -} - - -static void _display_on(void) -{ - GPIOA_DIR |= 0x8000 | 0x400; - GPIOA |= 0x8000; - - /* power setup */ - lcd_write_reg(R_START_OSC, 0x0001); - lcd_delay(0xf); - lcd_write_reg(R_DISP_CONTROL1, 0x000); - lcd_delay(0xa); - lcd_write_reg(R_POWER_CONTROL2, 0x0002); - lcd_write_reg(R_POWER_CONTROL3, 0x000a); - lcd_write_reg(R_POWER_CONTROL4, 0xc5a); - lcd_write_reg(R_POWER_CONTROL1, 0x0004); - lcd_write_reg(R_POWER_CONTROL1, 0x0134); - lcd_write_reg(R_POWER_CONTROL2, 0x0111); - lcd_write_reg(R_POWER_CONTROL3, 0x001c); - lcd_delay(0x28); - lcd_write_reg(R_POWER_CONTROL4, 0x2c40); - lcd_write_reg(R_POWER_CONTROL1, 0x0510); - lcd_delay(0x3c); - - /* lcd init 2 */ - lcd_write_reg(R_DRV_OUTPUT_CONTROL, 0x0113); - lcd_write_reg(R_DRV_WAVEFORM_CONTROL, 0x0700); - lcd_write_reg(R_ENTRY_MODE, 0x1038); - lcd_write_reg(R_DISP_CONTROL2, 0x0508); // 0x3c8, TMM - lcd_write_reg(R_DISP_CONTROL3, 0x0000); - lcd_write_reg(R_FRAME_CYCLE_CONTROL, 0x0003); - lcd_write_reg(R_RAM_ADDR_SET, 0x0000); - lcd_write_reg(R_GAMMA_FINE_ADJ_POS1, 0x0406); - lcd_write_reg(R_GAMMA_FINE_ADJ_POS2, 0x0303); - lcd_write_reg(R_GAMMA_FINE_ADJ_POS3, 0x0000); - lcd_write_reg(R_GAMMA_GRAD_ADJ_POS, 0x0305); - lcd_write_reg(R_GAMMA_FINE_ADJ_NEG1, 0x0404); - lcd_write_reg(R_GAMMA_FINE_ADJ_NEG2, 0x0000); - lcd_write_reg(R_GAMMA_FINE_ADJ_NEG3, 0x0000); - lcd_write_reg(R_GAMMA_GRAD_ADJ_NEG, 0x0503); - lcd_write_reg(R_GAMMA_AMP_ADJ_RES_POS, 0x1d05); - lcd_write_reg(R_GAMMA_AMP_AVG_ADJ_RES_NEG, 0x1d05); - lcd_write_reg(R_VERT_SCROLL_CONTROL, 0x0000); - lcd_write_reg(R_1ST_SCR_DRV_POS, 0x9f00); - lcd_write_reg(R_2ND_SCR_DRV_POS, 0x9f00); - lcd_write_reg(R_HORIZ_RAM_ADDR_POS, 0x7f00); - lcd_write_reg(R_VERT_RAM_ADDR_POS, 0x9f00); - - /* lcd init 3 */ - lcd_write_reg(R_POWER_CONTROL1, 0x4510); - lcd_write_reg(R_DISP_CONTROL1, 0x0005); - lcd_delay(0x28); - lcd_write_reg(R_DISP_CONTROL1, 0x0025); - lcd_write_reg(R_DISP_CONTROL1, 0x0027); - lcd_delay(0x28); - lcd_write_reg(R_DISP_CONTROL1, 0x0037); - - display_on = true; -} - -void lcd_init_device(void) -{ - /* Configure external memory banks */ - CSCFG1 = 0x0d500023 | tcc77x_cscfg_bw(TCC77X_CSCFG_BW16); - - /* may be reset */ - GPIOA |= 0x8000; - - _display_on(); -} - -void lcd_enable(bool on) -{ - if (display_on == on) - return; - - if (on) { - _display_on(); - send_event(LCD_EVENT_ACTIVATION, NULL); - } else { - /** Off sequence according to datasheet, p. 130 **/ - lcd_write_reg(R_FRAME_CYCLE_CONTROL, 0x0002); /* EQ=0, 18 clks/line */ - lcd_write_reg(R_DISP_CONTROL1, 0x0036); /* GON=1, DTE=1, REV=1, D1-0=10 */ - sleep(2); - - lcd_write_reg(R_DISP_CONTROL1, 0x0026); /* GON=1, DTE=0, REV=1, D1-0=10 */ - sleep(2); - - lcd_write_reg(R_DISP_CONTROL1, 0x0000); /* GON=0, DTE=0, D1-0=00 */ - - lcd_write_reg(R_POWER_CONTROL1, 0x0000); /* SAP2-0=000, AP2-0=000 */ - lcd_write_reg(R_POWER_CONTROL3, 0x0000); /* PON=0 */ - lcd_write_reg(R_POWER_CONTROL4, 0x0000); /* VCOMG=0 */ - - /* datasheet p. 131 */ - lcd_write_reg(R_POWER_CONTROL1, 0x0001); /* STB=1: standby mode */ - - display_on = false; - } -} - -bool lcd_active(void) -{ - return display_on; -} - - -#define RGB(r,g,b) ((((r)&0x3f) << 12)|(((g)&0x3f) << 6)|(((b)&0x3f))) - - -void lcd_update(void) -{ - lcd_update_rect(0, 0, LCD_WIDTH, LCD_HEIGHT); -} - -/* todo: need tests */ -void lcd_update_rect(int sx, int sy, int width, int height) -{ - int x, y; - - if (!display_on) - return; - - if (width <= 0 || height <= 0) /* nothing to do */ - return; - - width += sx; - height += sy; - - if (width > LCD_WIDTH) - width = LCD_WIDTH; - if (height > LCD_HEIGHT) - height = LCD_HEIGHT; - - lcd_write_reg(R_ENTRY_MODE, 0x1028); - /* set update window */ - lcd_write_reg(R_HORIZ_RAM_ADDR_POS, (LCD_HEIGHT - 1) << 8); - lcd_write_reg(R_VERT_RAM_ADDR_POS, ((width - 1) << 8) | sx); - lcd_write_reg(R_RAM_ADDR_SET, (sx << 8) | (LCD_HEIGHT - sy - 1)); - lcd_write_cmd(R_WRITE_DATA_2_GRAM); - - for (y = sy; y < height; y++) { - for (x = sx; x < width; x++) { - fb_data c; - unsigned long color; - - c = *FBADDR(x,y); - color = - ((c & 0x1f) << 1) | ((c & 0x7e0) << 1) | ((c & 0xf800) << - 2); - - /* TODO: our color is 18-bit */ - outw((color >> 9) & 0x1ff, 0x50010008); - outw((color) & 0x1ff, 0x50010008); - } - } -} - -void lcd_set_contrast(int val) -{ - (void) val; -} - -void lcd_set_invert_display(bool yesno) -{ - (void) yesno; -} - -void lcd_set_flip(bool yesno) -{ - (void) yesno; -} - -/* TODO: implement me */ -void lcd_blit_yuv(unsigned char *const src[3], - int src_x, int src_y, int stride, - int x, int y, int width, int height) -{ - (void) src; - (void) src_x; - (void) src_y; - (void) stride; - (void) x; - (void) y; - - if (!display_on) - return; - - width &= ~1; /* stay on the safe side */ - height &= ~1; - - panicf("%s", __func__); -} diff --git a/firmware/target/arm/tcc77x/iaudio7/power-iaudio7.c b/firmware/target/arm/tcc77x/iaudio7/power-iaudio7.c deleted file mode 100644 index baf93b73aa..0000000000 --- a/firmware/target/arm/tcc77x/iaudio7/power-iaudio7.c +++ /dev/null @@ -1,149 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2008 Vitja Makarov - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#include - -#include "config.h" -#include "cpu.h" -#include "kernel.h" -#include "system.h" -#include "power.h" -#include "backlight-target.h" - -#include "pcf50606.h" - -void power_init(void) -{ - pcf50606_write(PCF5060X_DCDC1, 0x90); - pcf50606_write(PCF5060X_DCDC2, 0x48); - pcf50606_write(PCF5060X_DCDC3, 0xfc); - pcf50606_write(PCF5060X_DCDC4, 0xb1); - - pcf50606_write(PCF5060X_IOREGC, 0xe9); - /* 3.3V, touch-panel */ - pcf50606_write(PCF5060X_D1REGC1, 0xf8); - pcf50606_write(PCF5060X_D2REGC1, 0xf2); - pcf50606_write(PCF5060X_D3REGC1, 0xf5); - - pcf50606_write(PCF5060X_LPREGC1, 0x00); - pcf50606_write(PCF5060X_LPREGC2, 0x02); - - pcf50606_write(PCF5060X_DCUDC1, 0xe6); - pcf50606_write(PCF5060X_DCUDC2, 0x30); - - pcf50606_write(PCF5060X_DCDEC1, 0xe7); - pcf50606_write(PCF5060X_DCDEC2, 0x02); - - pcf50606_write(PCF5060X_INT1M, 0x5b); - pcf50606_write(PCF5060X_INT1M, 0xaf); - pcf50606_write(PCF5060X_INT1M, 0x8f); - - pcf50606_write(PCF5060X_OOCC1, 0x40); - pcf50606_write(PCF5060X_OOCC2, 0x05); - - pcf50606_write(PCF5060X_MBCC3, 0x3a); - pcf50606_write(PCF5060X_GPOC1, 0x00); - pcf50606_write(PCF5060X_BBCC, 0xf8); -} - -/* Control leds on ata2501 board */ -void power_touch_panel(bool on) -{ - if (on) - pcf50606_write(PCF5060X_D1REGC1, 0xf8); - else - pcf50606_write(PCF5060X_D1REGC1, 0x00); -} - -void ide_power_enable(bool on) -{ - (void) on; -} - -bool ide_powered(void) -{ - return true; -} - -void power_off(void) -{ - /* Forcibly cut power to SoC & peripherals by putting the PCF to sleep */ - pcf50606_write(PCF5060X_OOCC1, GOSTDBY | CHGWAK | EXTONWAK); -} - -#if CONFIG_TUNER -#include "tuner.h" - -/** Tuner **/ -static bool powered = false; - -#define TUNNER_CLK (1 << 5) -#define TUNNER_DATA (1 << 6) -#define TUNNER_NR_W (1 << 7) - -bool tuner_power(bool status) -{ - bool old_status; - lv24020lp_lock(); - - old_status = powered; - - if (status != old_status) - { - if (status) - { - /* When power up, host should initialize the 3-wire bus - in host read mode: */ - - /* 1. Set direction of the DATA-line to input-mode. */ - GPIOA_DIR &= ~TUNNER_DATA; - - /* 2. Drive NR_W low */ - GPIOA &= ~TUNNER_NR_W; - GPIOA_DIR |= TUNNER_NR_W; - - /* 3. Drive CLOCK high */ - GPIOA |= TUNNER_CLK; - GPIOA_DIR |= TUNNER_CLK; - - lv24020lp_power(true); - } - else - { - lv24020lp_power(false); - - /* set all as inputs */ - GPIOC_DIR &= ~(TUNNER_CLK | TUNNER_DATA | TUNNER_NR_W); - } - - powered = status; - } - - lv24020lp_unlock(); - return old_status; -} - -#endif /* CONFIG_TUNER */ - -unsigned int power_input_status(void) -{ - return (GPIOA & 0x1) ? - POWER_INPUT_MAIN_CHARGER : POWER_INPUT_NONE; -} diff --git a/firmware/target/arm/tcc77x/iaudio7/powermgmt-iaudio7.c b/firmware/target/arm/tcc77x/iaudio7/powermgmt-iaudio7.c deleted file mode 100644 index bc7ead61f0..0000000000 --- a/firmware/target/arm/tcc77x/iaudio7/powermgmt-iaudio7.c +++ /dev/null @@ -1,84 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id: powermgmt-cowond2.c 17847 2008-06-28 18:10:04Z bagder $ - * - * Copyright (C) 2007 by Karl Kurbjun - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -#include "config.h" -#include "adc.h" -#include "powermgmt.h" -#include "kernel.h" -#include "pcf50606.h" - -unsigned short current_voltage = 5150; - -const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] = -{ - /* FIXME: calibrate value */ - 4400 -}; - -const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] = -{ - /* FIXME: calibrate value */ - 4600 -}; - -/* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */ -const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] = -{ - /* FIXME: calibrate values. Table is "inherited" from iPod-PCF / H100 */ - { 4500, 4810, 4910, 4970, 5030, 5070, 5120, 5140, 5170, 5250, 5400 } -}; - -#if CONFIG_CHARGING -/* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */ -const unsigned short percent_to_volt_charge[11] = -{ - /* FIXME: calibrate values. Table is "inherited" from iPod-PCF / H100 */ - 4760, 5440, 5510, 5560, 5610, 5640, 5660, 5760, 5820, 5840, 5850 /* NiMH */ -}; -#endif /* CONFIG_CHARGING */ - -#define BATTERY_SCALE_FACTOR 6000 -/* full-scale ADC readout (2^10) in millivolt */ - -/* Returns battery voltage from ADC [millivolts] */ -int _battery_voltage(void) -{ - static unsigned last_tick = 0; - - if (0 == last_tick || TIME_BEFORE(last_tick+HZ, current_tick)) - { - int adc_val, irq_status; - unsigned char buf[2]; - - irq_status = disable_irq_save(); - pcf50606_write(PCF5060X_ADCC2, 0x1); - pcf50606_read_multiple(PCF5060X_ADCS1, buf, 2); - restore_interrupt(irq_status); - - adc_val = (buf[0]<<2) | (buf[1] & 3); //ADCDAT1H+ADCDAT1L - current_voltage = (adc_val * BATTERY_SCALE_FACTOR) >> 10; - - last_tick = current_tick; - } - - return current_voltage; -} - diff --git a/firmware/target/arm/tcc77x/kernel-tcc77x.c b/firmware/target/arm/tcc77x/kernel-tcc77x.c deleted file mode 100644 index bbfc29d915..0000000000 --- a/firmware/target/arm/tcc77x/kernel-tcc77x.c +++ /dev/null @@ -1,47 +0,0 @@ -/*************************************************************************** -* __________ __ ___. -* Open \______ \ ____ ____ | | _\_ |__ _______ ___ -* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / -* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < -* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ -* \/ \/ \/ \/ \/ -* $Id$ -* -* Copyright (C) 2008 by Rob Purchase -* -* 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY -* KIND, either express or implied. -* -****************************************************************************/ - -#include "config.h" -#include "system.h" -#include "kernel.h" -#include "timer.h" -#include "thread.h" - -void tick_start(unsigned int interval_in_ms) -{ - /* configure Timer T-Clock to 2Mhz (clock source 4 (Xin) divided by 6) */ - PCLKCFG4 = (1 << 31) | (4 << 28) | (5 << 16); - - /* disable Timer0 */ - TCFG0 &= ~1; - - /* set counter reference value based on 1Mhz tick */ - TREF0 = interval_in_ms * 1000; - - /* Timer0 = reset to 0, divide=2, IRQ enable, enable (continuous) */ - TCFG0 = (1<<8) | (0<<4) | (1<<3) | 1; - - /* Unmask timer IRQ */ - IEN |= TIMER0_IRQ_MASK; -} - -/* NB: Since we are using a single timer IRQ, tick tasks are dispatched as - part of the central timer IRQ processing in timer-tcc77x.c */ diff --git a/firmware/target/arm/tcc77x/logikdax/adc-target.h b/firmware/target/arm/tcc77x/logikdax/adc-target.h deleted file mode 100644 index 1916d93598..0000000000 --- a/firmware/target/arm/tcc77x/logikdax/adc-target.h +++ /dev/null @@ -1,28 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 Dave Chapman - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#ifndef _ADC_TARGET_H_ -#define _ADC_TARGET_H_ - -#define NUM_ADC_CHANNELS 8 - -#define ADC_BUTTONS 0 - -#endif /* _ADC_TARGET_H_ */ diff --git a/firmware/target/arm/tcc77x/logikdax/audio-logikdax.c b/firmware/target/arm/tcc77x/logikdax/audio-logikdax.c deleted file mode 100644 index 90c9a68827..0000000000 --- a/firmware/target/arm/tcc77x/logikdax/audio-logikdax.c +++ /dev/null @@ -1,40 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 by Michael Sevakis - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#include "system.h" -#include "cpu.h" -#include "audio.h" -#include "sound.h" - -int audio_channels = 2; -int audio_output_source = AUDIO_SRC_PLAYBACK; - -#if INPUT_SRC_CAPS != 0 -void audio_set_output_source(int source) -{ - (void)source; -} - -void audio_input_mux(int source, unsigned flags) -{ - (void)source; - (void)flags; -} -#endif diff --git a/firmware/target/arm/tcc77x/logikdax/backlight-target.h b/firmware/target/arm/tcc77x/logikdax/backlight-target.h deleted file mode 100644 index 202e118606..0000000000 --- a/firmware/target/arm/tcc77x/logikdax/backlight-target.h +++ /dev/null @@ -1,40 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 by Dave Chapman - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#ifndef BACKLIGHT_TARGET_H -#define BACKLIGHT_TARGET_H - -#include "tcc77x.h" - -#define backlight_hw_init() true - -static inline void backlight_hw_on(void) -{ - /* Enable backlight */ - GPIOD |= 0x10; -} - -static inline void backlight_hw_off(void) -{ - /* Disable backlight */ - GPIOD &= ~0x10; -} - -#endif diff --git a/firmware/target/arm/tcc77x/logikdax/button-logikdax.c b/firmware/target/arm/tcc77x/logikdax/button-logikdax.c deleted file mode 100644 index abf939753a..0000000000 --- a/firmware/target/arm/tcc77x/logikdax/button-logikdax.c +++ /dev/null @@ -1,100 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 by Dave Chapman - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -#include "config.h" -#include "cpu.h" -#include "button.h" -#include "adc.h" - -/* - -Results of button testing: - -HOLD: GPIOA & 0x0002 (0=pressed, 0x0002 = released) -POWER: GPIOA & 0x8000 (0=pressed, 0x8000 = released) - -ADC[0]: (approx values) - -RIGHT - 0x37 -LEFT - 0x7f -JOYSTICK PRESS - 0xc7 -UP - 0x11e -DOWN - 0x184 -MODE - 0x1f0/0x1ff -PRESET - 0x268/0x269 -REC - 0x2dd - -Values of ADC[0] tested in OF disassembly: 0x50, 0x96, 0xdc, 0x208, 0x384 - -*/ - -void button_init_device(void) -{ - /* Nothing to do */ -} - -int button_read_device(void) -{ - int btn = BUTTON_NONE; - int adc; - - adc = adc_read(ADC_BUTTONS); - - if (adc < 0x384) { - if (adc < 0x140) { - if (adc < 0x96) { - if (adc < 0x50) { - btn |= BUTTON_RIGHT; /* 0x00..0x4f */ - } else { - btn |= BUTTON_LEFT; /* 0x50..0x95 */ - } - } else { - if (adc < 0xe0) { - btn |= BUTTON_SELECT; /* 0x96..0xdf */ - } else { - btn |= BUTTON_UP; /* 0xe0..0x13f */ - } - } - } else { - if (adc < 0x208) { - if (adc < 0x1b0) { - btn |= BUTTON_DOWN; /* 0x140..0x1af */ - } else { - btn |= BUTTON_MODE; /* 0x1b0..0x207 */ - } - } else { - if (adc < 0x290) { - btn |= BUTTON_PRESET; /* 0x208..0x28f */ - } else { - btn |= BUTTON_REC; /* 0x290..0x383 */ - } - } - } - } - - if (!(GPIOA & 0x2)) - btn |= BUTTON_HOLD; - - if (!(GPIOA & 0x8000)) - btn |= BUTTON_POWERPLAY; - - return btn; -} diff --git a/firmware/target/arm/tcc77x/logikdax/button-target.h b/firmware/target/arm/tcc77x/logikdax/button-target.h deleted file mode 100644 index 505fe438ed..0000000000 --- a/firmware/target/arm/tcc77x/logikdax/button-target.h +++ /dev/null @@ -1,45 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 by Dave Chapman - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -#ifndef _BUTTON_TARGET_H_ -#define _BUTTON_TARGET_H_ - -/* Main unit's buttons */ -#define BUTTON_POWERPLAY 0x00000001 -#define BUTTON_MODE 0x00000002 -#define BUTTON_HOLD 0x00000004 -#define BUTTON_REC 0x00000008 -#define BUTTON_PRESET 0x00000010 -#define BUTTON_LEFT 0x00000020 -#define BUTTON_RIGHT 0x00000040 -#define BUTTON_UP 0x00000080 -#define BUTTON_DOWN 0x00000100 -#define BUTTON_SELECT 0x00000200 - -#define BUTTON_MAIN (BUTTON_POWERPLAY|BUTTON_MODE|BUTTON_HOLD\ - |BUTTON_REC|BUTTON_PRESET|BUTTON_LEFT\ - |BUTTON_RIGHT|BUTTON_UP|BUTTON_DOWN|BUTTON_SELECT) - -/* Software power-off */ -#define POWEROFF_BUTTON BUTTON_POWERPLAY -#define POWEROFF_COUNT 40 - -#endif /* _BUTTON_TARGET_H_ */ diff --git a/firmware/target/arm/tcc77x/logikdax/power-logikdax.c b/firmware/target/arm/tcc77x/logikdax/power-logikdax.c deleted file mode 100644 index 840b02a2a5..0000000000 --- a/firmware/target/arm/tcc77x/logikdax/power-logikdax.c +++ /dev/null @@ -1,44 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 Dave Chapman - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#include "config.h" -#include "cpu.h" -#include -#include "kernel.h" -#include "system.h" -#include "power.h" - -void power_init(void) -{ -} - -void ide_power_enable(bool on) -{ - (void)on; -} - -bool ide_powered(void) -{ - return true; -} - -void power_off(void) -{ -} diff --git a/firmware/target/arm/tcc77x/m200/adc-target.h b/firmware/target/arm/tcc77x/m200/adc-target.h deleted file mode 100644 index e9640cc9da..0000000000 --- a/firmware/target/arm/tcc77x/m200/adc-target.h +++ /dev/null @@ -1,28 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 Dave Chapman - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#ifndef _ADC_TARGET_H_ -#define _ADC_TARGET_H_ - -#define NUM_ADC_CHANNELS 8 - -#define ADC_BUTTONS 1 - -#endif /* _ADC_TARGET_H_ */ diff --git a/firmware/target/arm/tcc77x/m200/audio-m200.c b/firmware/target/arm/tcc77x/m200/audio-m200.c deleted file mode 100644 index 107b2743ae..0000000000 --- a/firmware/target/arm/tcc77x/m200/audio-m200.c +++ /dev/null @@ -1,38 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 by Michael Sevakis - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#include "system.h" -#include "cpu.h" -#include "audio.h" -#include "sound.h" - -int audio_channels = 2; -int audio_output_source = AUDIO_SRC_PLAYBACK; - -void audio_set_output_source(int source) -{ - (void)source; -} - -void audio_input_mux(int source, unsigned flags) -{ - (void)source; - (void)flags; -} diff --git a/firmware/target/arm/tcc77x/m200/backlight-target.h b/firmware/target/arm/tcc77x/m200/backlight-target.h deleted file mode 100644 index d73ac78852..0000000000 --- a/firmware/target/arm/tcc77x/m200/backlight-target.h +++ /dev/null @@ -1,44 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2008 by Dave Chapman - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#ifndef BACKLIGHT_TARGET_H -#define BACKLIGHT_TARGET_H - -#include "tcc77x.h" - -static inline bool backlight_hw_init(void) -{ - GPIOA_DIR |= 0x40; - return true; -} - -static inline void backlight_hw_on(void) -{ - /* Enable backlight */ - GPIOA |= 0x40; -} - -static inline void backlight_hw_off(void) -{ - /* Disable backlight */ - GPIOA &= ~0x40; -} - -#endif diff --git a/firmware/target/arm/tcc77x/m200/button-m200.c b/firmware/target/arm/tcc77x/m200/button-m200.c deleted file mode 100644 index a37fe1302c..0000000000 --- a/firmware/target/arm/tcc77x/m200/button-m200.c +++ /dev/null @@ -1,99 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 by Dave Chapman - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -#include "config.h" -#include "cpu.h" -#include "button.h" -#include "adc.h" - -/* - -Results of button testing (viewing ADC values whilst pressing buttons): - -HOLD: GPIOB & 0x0200 (0=hold active, 0x0200 = hold inactive) - -ADC[1]: (approx values) - -Idle - 0x3ff -MENU - unknown - -REPEAT/AB - 0x03? -LEFT - 0x07?-0x08? -SELECT - 0x0c? -RIGHT - 0x11? - -PLAY/PAUSE - 0x17?-0x018? -VOL UP - 0x1e?-0x01f? -VOL DOWN - 0x26? - -*/ - -void button_init_device(void) -{ - /* Nothing to do */ -} - -int button_read_device(void) -{ - int btn = BUTTON_NONE; - int adc; - - /* TODO - determine how to detect BUTTON_MENU - it doesn't appear to - be connected to a GPIO or to an ADC - */ - - adc = adc_read(ADC_BUTTONS); - - if (adc < 0x384) { - if (adc < 0x140) { - if (adc < 0x96) { - if (adc < 0x50) { - btn |= BUTTON_REPEATAB; /* 0x00..0x4f */ - } else { - btn |= BUTTON_LEFT; /* 0x50..0x95 */ - } - } else { - if (adc < 0xe0) { - btn |= BUTTON_SELECT; /* 0x96..0xdf */ - } else { - btn |= BUTTON_RIGHT; /* 0xe0..0x13f */ - } - } - } else { - if (adc < 0x208) { - if (adc < 0x1b0) { - btn |= BUTTON_PLAYPAUSE; /* 0x140..0x1af */ - } else { - btn |= BUTTON_VOLUP; /* 0x1b0..0x207 */ - } - } else { - btn |= BUTTON_VOLDOWN; /* 0x209..0x383 */ - } - } - } - - return btn; -} - -bool button_hold(void) -{ - return (GPIOB & 0x200)?false:true; -} diff --git a/firmware/target/arm/tcc77x/m200/button-target.h b/firmware/target/arm/tcc77x/m200/button-target.h deleted file mode 100644 index b96df22edc..0000000000 --- a/firmware/target/arm/tcc77x/m200/button-target.h +++ /dev/null @@ -1,45 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 by Dave Chapman - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -#ifndef _BUTTON_TARGET_H_ -#define _BUTTON_TARGET_H_ - -#define HAS_BUTTON_HOLD - -/* Main unit's buttons */ -#define BUTTON_MENU 0x00000001 -#define BUTTON_VOLUP 0x00000002 -#define BUTTON_VOLDOWN 0x00000004 -#define BUTTON_PLAYPAUSE 0x00000008 -#define BUTTON_REPEATAB 0x00000010 -#define BUTTON_LEFT 0x00000020 -#define BUTTON_RIGHT 0x00000040 -#define BUTTON_SELECT 0x00000080 - -#define BUTTON_MAIN (BUTTON_MENU|BUTTON_VOLUP|BUTTON_VOLDOWN\ - |BUTTON_PLAYPAUSE|BUTTON_REPEATAB|BUTTON_LEFT\ - |BUTTON_RIGHT|BUTTON_SELECT) - -/* Software power-off */ -#define POWEROFF_BUTTON BUTTON_MENU -#define POWEROFF_COUNT 40 - -#endif /* _BUTTON_TARGET_H_ */ diff --git a/firmware/target/arm/tcc77x/m200/power-m200.c b/firmware/target/arm/tcc77x/m200/power-m200.c deleted file mode 100644 index e84ff1c852..0000000000 --- a/firmware/target/arm/tcc77x/m200/power-m200.c +++ /dev/null @@ -1,43 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 Dave Chapman - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#include "config.h" -#include "cpu.h" -#include -#include "kernel.h" -#include "system.h" -#include "power.h" - -void power_init(void) -{ -} - -void ide_power_enable(bool on) -{ -} - -bool ide_powered(void) -{ - return true; -} - -void power_off(void) -{ -} diff --git a/firmware/target/arm/tcc77x/powermgmt-tcc77x.c b/firmware/target/arm/tcc77x/powermgmt-tcc77x.c deleted file mode 100644 index 07a56777d0..0000000000 --- a/firmware/target/arm/tcc77x/powermgmt-tcc77x.c +++ /dev/null @@ -1,66 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 by Karl Kurbjun - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -#include "config.h" -#include "adc.h" -#include "powermgmt.h" -#include "kernel.h" -#include "pcf50606.h" - -unsigned short current_voltage = 3910; - -const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] = -{ - /* FIXME: calibrate value */ - 3380 -}; - -const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] = -{ - /* FIXME: calibrate value */ - 3300 -}; - -/* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */ -const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] = -{ - /* FIXME: calibrate values. Table is "inherited" from iPod-PCF / H100 */ - { 3370, 3650, 3700, 3740, 3780, 3820, 3870, 3930, 4000, 4080, 4160 } -}; - -#if CONFIG_CHARGING -/* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */ -const unsigned short percent_to_volt_charge[11] = -{ - /* FIXME: calibrate values. Table is "inherited" from iPod-PCF / H100 */ - 3370, 3650, 3700, 3740, 3780, 3820, 3870, 3930, 4000, 4080, 4160 -}; -#endif /* CONFIG_CHARGING */ - -#define BATTERY_SCALE_FACTOR 6000 -/* full-scale ADC readout (2^10) in millivolt */ - -/* Returns battery voltage from ADC [millivolts] */ -int _battery_voltage(void) -{ - return current_voltage; -} - diff --git a/firmware/target/arm/tcc77x/system-target.h b/firmware/target/arm/tcc77x/system-target.h deleted file mode 100644 index beeeac05c6..0000000000 --- a/firmware/target/arm/tcc77x/system-target.h +++ /dev/null @@ -1,59 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 by Dave Chapman - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#ifndef SYSTEM_TARGET_H -#define SYSTEM_TARGET_H - -#include "system-arm.h" - -#define CPUFREQ_DEFAULT 98784000 -#define CPUFREQ_NORMAL 98784000 -#define CPUFREQ_MAX 120000000 - -#define inl(a) (*(volatile unsigned long *) (a)) -#define outl(a,b) (*(volatile unsigned long *) (b) = (a)) -#define inb(a) (*(volatile unsigned char *) (a)) -#define outb(a,b) (*(volatile unsigned char *) (b) = (a)) -#define inw(a) (*(volatile unsigned short *) (a)) -#define outw(a,b) (*(volatile unsigned short *) (b) = (a)) - -/* TC32 is configured to 1MHz in clock_init() */ -#define USEC_TIMER TC32MCNT - -static inline void udelay(unsigned usecs) -{ - unsigned stop = USEC_TIMER + usecs; - while (TIME_BEFORE(USEC_TIMER, stop)); -} - - -#define TCC77X_CSCFG_BW8 0 -#define TCC77X_CSCFG_BW16 1 - -/* Due to hardware bug or "feature" this hack is needed to set bus width bits */ -static inline -unsigned long tcc77x_cscfg_bw(int bw) { - if (bw == TCC77X_CSCFG_BW8) - return (((MCFG >> 11) & 3) ^ 3) << 28; - else - return (((MCFG >> 11) & 3) ^ 2) << 28; -} - -#endif /* SYSTEM_TARGET_H */ diff --git a/firmware/target/arm/tcc77x/system-tcc77x.c b/firmware/target/arm/tcc77x/system-tcc77x.c deleted file mode 100644 index cffb4deba4..0000000000 --- a/firmware/target/arm/tcc77x/system-tcc77x.c +++ /dev/null @@ -1,326 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 by Dave Chapman - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -#include "kernel.h" -#include "system.h" -#include "panic.h" - -/* Externally defined interrupt handlers */ -extern void TIMER(void); -extern void ADC(void); -extern void USB_DEVICE(void); - -void irq(void) -{ - int irq = IREQ & 0x7fffffff; - CREQ = irq; /* Clears the corresponding IRQ status */ - - if (irq & TIMER0_IRQ_MASK) - TIMER(); - else if (irq & ADC_IRQ_MASK) - ADC(); -#ifdef HAVE_USBSTACK - else if (irq & USBD_IRQ_MASK) - USB_DEVICE(); -#endif - else - panicf("Unhandled IRQ 0x%08X", irq); -} - -void fiq_handler(void) __attribute__((interrupt ("FIQ"), naked)); - -#ifdef BOOTLOADER -void fiq_handler(void) -{ - /* TODO */ -} -#endif - -void system_reboot(void) -{ -} - -void system_exception_wait(void) -{ - while (1); -} - -/* TODO - these should live in the target-specific directories and - once we understand what all the GPIO pins do, move the init to the - specific driver for that hardware. For now, we just perform the - same GPIO init as the original firmware - this makes it easier to - investigate what the GPIO pins do. -*/ - -#ifdef LOGIK_DAX -static void gpio_init(void) -{ - /* Do what the original firmware does */ - GPIOD_FUNC = 0; - GPIOD_DIR = 0x3f0; - GPIOD = 0xe0; - - GPIOE_FUNC = 0; - GPIOE_DIR = 0xe0; - GPIOE = 0; - - GPIOA_FUNC = 0; - GPIOA_DIR = 0xffff1000; /* 0 - 0xf000 */ - GPIOA = 0x1080; - - GPIOB_FUNC = 0x16a3; - GPIOB_DIR = 0x6ffff; - GPIOB = 0; - - GPIOC_FUNC = 1; - GPIOC_DIR = 0x03ffffff; /* mvn r2, 0xfc000000 */ - GPIOC = 0; -} -#elif defined(IAUDIO_7) -static void gpio_init(void) -{ - /* Do what the original firmware does */ - GPIOA_FUNC = 0; - GPIOB_FUNC = 0x1623; - GPIOC_FUNC = 1; - GPIOD_FUNC = 0; - GPIOE_FUNC = 0; - GPIOA = 0x30; - GPIOB = 0x00c00; - GPIOC = 0; - GPIOD = 0x180; - GPIOE = 0x80; - GPIOA_DIR = 0x84b0; - GPIOB_DIR = 0x80c00; - GPIOC_DIR = 0x2000000; - GPIOD_DIR = 0x3e3; - GPIOE_DIR = 0x88; -} -#elif defined(SANSA_M200) -static void gpio_init(void) -{ - /* TODO - Implement for M200 */ -} -#elif defined(SANSA_C100) -static void gpio_init(void) -{ - /* Do what the original firmware does */ - GPIOA_FUNC = 0; - GPIOB_FUNC = 0x16A3; - GPIOC_FUNC = 1; - GPIOD_FUNC |= 2; - GPIOE_FUNC = 0; - - GPIOA_DIR = 0xFFFF0E00; - GPIOB_DIR = 0x6FFFF; - GPIOC_DIR = 0x03FFFFFF; - GPIOD_DIR = 0x3F7; - GPIOE_DIR = 0x9B; - - GPIOA = 0x80; - GPIOB = 0; - GPIOC = 0; - GPIOD |= 0xC0; - GPIOE = 0x9B; -} -#endif - -/* Second function called in the original firmware's startup code - we just - set up the clocks in the same way as the original firmware for now. */ -static void clock_init(void) -{ - unsigned int i; - - /* STP = 0x1, PW = 0x04 , HLD = 0x0 */ - CSCFG3 = (CSCFG3 &~ 0x3fff) | 0x820; - - /* XIN=External main, Fcpu=Fsys, BCKDIV=1 (Fbus = Fsys / 2) */ - CLKCTRL = (CLKCTRL & ~0xff) | 0x14; - - if (BMI & 0x20) - PCLKCFG0 = 0xc82d7000; /* EN1 = 1, XIN=Ext. main, DIV1 = 0x2d, P1 = 1 */ - else - PCLKCFG0 = 0xc8ba7000; /* EN1 = 1, XIN=Ext. main, DIV1 = 0xba, P1 = 1 */ - - MCFG |= 0x2000; - -#ifdef LOGIK_DAX - /* Only seen in the Logik DAX original firmware */ - SDCFG = (SDCFG & ~0x7000) | 0x2000; -#endif - - /* Disable PLL */ - PLL0CFG |= 0x80000000; - - /* Enable PLL, M=0xcf, P=0x13. m=M+8, p=P+2, S = 0 - Fout = (215/21)*12MHz = 122857142Hz */ - PLL0CFG = 0x0000cf13; - - i = 8000; - while (--i) {}; - - /* Enable PLL0 */ - CLKDIVC = 0x81000000; - - /* Fsys = PLL0, Fcpu = Fsys, Fbus=Fsys / 2 */ - CLKCTRL = 0x80000010; - - asm volatile ( - "nop \n\t" - "nop \n\t" - ); - - /* Enable Z-Clock */ - PCLKCFG5 |= (1<<31) | (4<<28); /* Timer Z-Clock enable, XIN direct*/ - - /* Set TC32 timer to be our USEC_TIMER (Xin divided by 12 = 1MHz) */ - TC32MCNT = 0; - TC32LDV = 0; - TC32EN = (1<<24) | 11; -} - -static void cpu_init(void) -{ - /* Memory protection - see page 48 of ARM946 TRM -http://infocenter.arm.com/help/topic/com.arm.doc.ddi0201d/DDI0201D_arm946es_r1p1_trm.pdf - */ - asm volatile ( - /* Region 0 - addr=0, size=4GB, enabled */ - "mov r0, #0x3f \n\t" - "mcr p15, 0, r0, c6, c0, 0 \n\t" - "mcr p15, 0, r0, c6, c0, 1 \n\t" - -#if defined(LOGIK_DAX) || defined(SANSA_C100) - /* Address region 1 - addr 0x2fff0000, size=64KB, enabled*/ - "ldr r0, =0x2fff001f \n\t" -#elif defined(IAUDIO_7) - /* Address region 1 - addr 0x20000000, size=8KB, enabled*/ - "mov r0, #0x19 \n\t" - "add r0, r0, #0x20000000 \n\t" -#elif defined(SANSA_M200) - /* Address region 1 - addr 0x20000000, size=256MB, enabled*/ - "mov r0, #0x37 \n\t" - "add r0, r0, #0x20000000 \n\t" -#endif - "mcr p15, 0, r0, c6, c1, 0 \n\t" - "mcr p15, 0, r0, c6, c1, 1 \n\t" - - /* Address region 2 - addr 0x30000000, size=256MB, enabled*/ - "mov r0, #0x37 \n\t" - "add r0, r0, #0x30000000 \n\t" - "mcr p15, 0, r0, c6, c2, 0 \n\t" - "mcr p15, 0, r0, c6, c2, 1 \n\t" - - /* Address region 2 - addr 0x40000000, size=512MB, enabled*/ - "mov r0, #0x39 \n\t" - "add r0, r0, #0x40000000 \n\t" - "mcr p15, 0, r0, c6, c3, 0 \n\t" - "mcr p15, 0, r0, c6, c3, 1 \n\t" - - /* Address region 4 - addr 0x60000000, size=256MB, enabled*/ - "mov r0, #0x37 \n\t" - "add r0, r0, #0x60000000 \n\t" - "mcr p15, 0, r0, c6, c4, 0 \n\t" - "mcr p15, 0, r0, c6, c4, 1 \n\t" - - /* Address region 5 - addr 0x10000000, size=256MB, enabled*/ - "mov r0, #0x37 \n\t" - "add r0, r0, #0x10000000 \n\t" - "mcr p15, 0, r0, c6, c5, 0 \n\t" - "mcr p15, 0, r0, c6, c5, 1 \n\t" - - /* Address region 6 - addr 0x80000000, size=2GB, enabled*/ - "mov r0, #0x37 \n\t" - "add r0, r0, #0x80000006 \n\t" - "mcr p15, 0, r0, c6, c6, 0 \n\t" - "mcr p15, 0, r0, c6, c6, 1 \n\t" - - /* Address region 7 - addr 0x3000f000, size=4KB, enabled*/ - "ldr r0, =0x3000f017 \n\t" - "mcr p15, 0, r0, c6, c7, 0 \n\t" - "mcr p15, 0, r0, c6, c7, 1 \n\t" - - - /* Register 5 - Access Permission Registers */ - - "ldr r0, =0xffff \n\t" - "mcr p15, 0, r0, c5, c0, 0 \n\t" /* write data access permission bits */ - "mcr p15, 0, r0, c5, c0, 1 \n\t" /* write instruction access permission bits */ - - "mov r0, #0xa7 \n\t" - "mcr p15, 0, r0, c3, c0, 0 \n\t" /* set write buffer control register */ - -#if defined(LOGIK_DAX) || defined(SANSA_C100) - "mov r0, #0xa5 \n\t" -#elif defined(IAUDIO_7) || defined(SANSA_M200) - "mov r0, #0xa7 \n\t" -#else - #error NOT DEFINED FOR THIS TARGET! -#endif - "mcr p15, 0, r0, c2, c0, 0 \n\t" - "mcr p15, 0, r0, c2, c0, 1 \n\t" - - "mov r0, #0xa0000006 \n\t" - "mcr p15, 0, r0, c9, c1, 0 \n\t" - - "ldr r1, =0x1107d \n\t" - "mov r0, #0x0 \n\t" - "mcr p15, 0, r0, c7, c5, 0 \n\t" /* Flush instruction cache */ - "mcr p15, 0, r0, c7, c6, 0 \n\t" /* Flush data cache */ - - "mcr p15, 0, r1, c1, c0, 0 \n\t" /* CPU control bits */ - : : : "r0", "r1" - ); -} - - - -void system_init(void) -{ - /* mask all interrupts */ - IEN = 0; - - /* Set all interrupts as IRQ for now - some may need to be FIQ in future */ - IRQSEL = 0xffffffff; - - /* Set master enable bit */ - IEN = 0x80000000; - - cpu_init(); - clock_init(); - gpio_init(); - - enable_irq(); -} - -int system_memory_guard(int newmode) -{ - (void)newmode; - return 0; -} - -#ifdef HAVE_ADJUSTABLE_CPU_FREQ - -void set_cpu_frequency(long frequency) -{ -} - -#endif diff --git a/firmware/target/arm/tcc77x/timer-tcc77x.c b/firmware/target/arm/tcc77x/timer-tcc77x.c deleted file mode 100644 index 6e8764d9ce..0000000000 --- a/firmware/target/arm/tcc77x/timer-tcc77x.c +++ /dev/null @@ -1,69 +0,0 @@ -/*************************************************************************** -* __________ __ ___. -* Open \______ \ ____ ____ | | _\_ |__ _______ ___ -* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / -* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < -* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ -* \/ \/ \/ \/ \/ -* $Id$ -* -* Copyright (C) 2008 by Rob Purchase -* -* 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY -* KIND, either express or implied. -* -****************************************************************************/ - -#include "config.h" -#include "cpu.h" -#include "system.h" -#include "timer.h" -#include "logf.h" - -/* Use the TC32 counter [sourced by Xin:12Mhz] for this timer, as it's the - only one that allows a 32-bit counter (Timer0-5 are 16/20 bit only). */ - -bool timer_set(long cycles, bool start) -{ - #warning function not implemented - - (void)cycles; - (void)start; - return false; -} - -bool timer_start(void) -{ - #warning function not implemented - - return false; -} - -void timer_stop(void) -{ - #warning function not implemented -} - - -/* Timer interrupt processing - all timers (inc. tick) have a single IRQ */ -void TIMER(void) -{ - if (TIREQ & TF0) /* Timer0 reached ref value */ - { - /* Run through the list of tick tasks */ - call_tick_tasks(); - - /* reset Timer 0 IRQ & ref flags */ - TIREQ |= TI0 | TF0; - } - - if (TC32IRQ & (1<<3)) /* end of TC32 prescale */ - { - /* dispatch timer */ - } -} diff --git a/firmware/target/arm/wmcodec-telechips.c b/firmware/target/arm/wmcodec-telechips.c index 8fb035bdfa..deaced2682 100644 --- a/firmware/target/arm/wmcodec-telechips.c +++ b/firmware/target/arm/wmcodec-telechips.c @@ -34,8 +34,6 @@ #if defined(COWON_D2) /* The D2's audio codec uses an I2C address of 0x34 */ #define I2C_AUDIO_ADDRESS 0x34 -#elif defined (IAUDIO_7) || defined(LOGIK_DAX) || defined(SANSA_M200) -#define I2C_AUDIO_ADDRESS 0x34 #else #error wmcodec not implemented for this target! #endif diff --git a/firmware/target/hosted/sdl/sim-ui-defines.h b/firmware/target/hosted/sdl/sim-ui-defines.h index c3ae7c0551..97562ef933 100644 --- a/firmware/target/hosted/sdl/sim-ui-defines.h +++ b/firmware/target/hosted/sdl/sim-ui-defines.h @@ -226,13 +226,6 @@ #define UI_LCD_POSX 58 /* x position of lcd */ #define UI_LCD_POSY 67 /* y position of lcd */ -#elif defined(IAUDIO_7) -#define UI_TITLE "iAudio7" -#define UI_WIDTH 494 /* width of GUI window */ -#define UI_HEIGHT 214 /* height of GUI window */ -#define UI_LCD_POSX 131 /* x position of lcd */ -#define UI_LCD_POSY 38 /* y position of lcd */ - #elif defined(CREATIVE_ZVM) || defined(CREATIVE_ZVM60GB) #ifdef CREATIVE_ZVM #define UI_TITLE "Creative Zen Vision:M 30GB" diff --git a/firmware/usb.c b/firmware/usb.c index 05597dff9b..b919fe468d 100644 --- a/firmware/usb.c +++ b/firmware/usb.c @@ -57,7 +57,7 @@ (defined(HAVE_USBSTACK) && defined(IPOD_NANO2G)) || \ (defined(HAVE_USBSTACK) && (defined(CREATIVE_ZVx))) || \ (defined(HAVE_USBSTACK) && (defined(OLYMPUS_MROBE_500))) || \ - defined(CPU_TCC77X) || defined(CPU_TCC780X) || \ + defined(CPU_TCC780X) || \ (CONFIG_USBOTG == USBOTG_JZ4740) || \ (CONFIG_USBOTG == USBOTG_JZ4760) /* TODO: condition should be reset to be only the original diff --git a/firmware/usbstack/usb_storage.c b/firmware/usbstack/usb_storage.c index c42cc830ee..39ccb9a6e5 100644 --- a/firmware/usbstack/usb_storage.c +++ b/firmware/usbstack/usb_storage.c @@ -47,7 +47,7 @@ #endif #ifndef USBSTOR_WRITE_SECTORS_FILTER -#define USBSTOR_WRITE_SECTORS_FILTER() ({ 0; }) +#define USBSTOR_WRITE_SECTORS_FILTER() ({ 0; }) #endif /* the ARC driver currently supports up to 64k USB transfers. This is @@ -433,7 +433,7 @@ void usb_storage_init_connection(void) /* prime rx endpoint. We only need room for commands */ state = WAITING_FOR_COMMAND; -#if (CONFIG_CPU == IMX31L || defined(CPU_TCC77X) || defined(CPU_TCC780X) || \ +#if (CONFIG_CPU == IMX31L || defined(CPU_TCC780X) || \ CONFIG_CPU == S5L8702 || CONFIG_CPU == S5L8701 || CONFIG_CPU == AS3525v2 || \ defined(BOOTLOADER) || CONFIG_CPU == DM320) && !defined(CPU_PP502x) static unsigned char _cbw_buffer[MAX_CBW_SIZE] diff --git a/tools/builds.pm b/tools/builds.pm index 7c4824398e..ce8b3dd0a3 100644 --- a/tools/builds.pm +++ b/tools/builds.pm @@ -103,10 +103,6 @@ $releasenotes="/wiki/ReleaseNotes315"; name => 'HiFiMAN HM-801', status => 2, }, - 'iaudio7' => { - name => 'iAudio 7', - status => 1, - }, 'iaudiom3' => { name => 'iAudio M3', status => 3, @@ -195,10 +191,6 @@ $releasenotes="/wiki/ReleaseNotes315"; name => 'iriver iFP-7xx', status => 1, }, - 'logikdax' => { - name => 'Logik DAX', - status => 1, - }, 'lyreproto1' => { name => 'Lyre Prototype 1', status => 1, @@ -271,10 +263,6 @@ $releasenotes="/wiki/ReleaseNotes315"; name => 'Samsung YP-S3', status => 1, }, - 'sansac100' => { - name => 'SanDisk Sansa c100', - status => 1, - }, 'sansac200' => { name => 'SanDisk Sansa c200', status => 3, @@ -324,10 +312,6 @@ $releasenotes="/wiki/ReleaseNotes315"; status => 3, icon => 'sansafuzeplus', }, - 'sansam200' => { - name => 'SanDisk Sansa m200', - status => 1, - }, 'sansam200v4' => { name => 'SanDisk Sansa m200 v4', status => 1, diff --git a/tools/configure b/tools/configure index b7cbfb0ba2..ee217a917d 100755 --- a/tools/configure +++ b/tools/configure @@ -1553,7 +1553,7 @@ cat <;)BRMGxfdJ(k5XxCdDCZo>LF5d^Ho=%^+4orW6lU-4=DH@UYSpS$;i+0<%rWOGWfuL<<^S_v`WK6ZV*mI5_}9Pw zFUtS%uW9`MuYbK=_CNpi@Biap&RhlmJ-lpe;nD&oY*YcCGF?;&x z5#=L${P3ac>#53zYzx@av4{5j(PPiX9^3fX6MOOKsl9ysl=8{D^%tx^XZzEK_w3oD zd$hmr?Ah1@$}zS*vT^#6y?Fe@UOu4@Ov~@Dzk2%2)vJ8{?73%8pL=Zr`;Bv~d-osO zk?+5=+V&>P&PuZNL)|uZ;dguUaLismd1ik;e{O$`kK3DZ`oLa3dup$q(ynSD@ zKgWH=I@?sf<-Gosv5)%v^W_VB>x_QrQ}))i=bUvOwEHV?-mhu@mhC!Ech0Zh+JCF$4R$^K<8@k|Ayc2HKy{v zv}e1HtK-YmR_$C{f0<{)e@0&NY>o2_z0~s(IOgkT+&`X=x8tvPX1!ym?)6ih(@UPM zaeJvg-|OE$r#G~J#WSup@7v4w>a^_EpYWVuT7Hf_W1koF`-*FL#d+y`Ug{l^vHpsC z`-0Lpo%i??-Z{O0oWI&>S?}O;-m7Qt8}IjX?3vzk>R<3)$=tPY?Dy-m{ETtopZ(d7 zKA-TuKhe0rxbcL3o>KReQg!d!W8T{*4;hOdj4?*B94H^&dtmqP-ZzyGdFRIhru7HZ z-@SF`o!z-{+iu^u<<{@qylt}EH(9@Z+p}Agw7+-zuHB}T-BLSB*Oqw7-MD(4lKrpWu^U%z2G+g$ z>sPLs%(c1d)m@|gRqFn`UAc1A)m^)C#jde@U9n()y_Z1YqYthI!c+A z{cV2f+UvTxKf15(UU8pvA8ui{Z|I(}%>B83{kq-IGIsm=4Z9;_*_ABcru`lEy{q4Z z^?U5&en+rU7{7&+!X(cay93LwXeWEaSnK)< zjIHB=@zw83{kcAcyH5?jsIZMYhg6ogn`0suTNpH_yGKceI1Tdz7Ck<80_cO zd;7aFoNIH~PhWq(2B)#Vu(xmCVwA#aN)NNaL@?jCKVQ+G&XGFVTYsCl0mqf8&0FkE zz_cuWAzrB7t^{0N{3U4vtt>0eQ?XcAS#?^;Slm_7P|E`qnvN)H&P+ z=U%uz^qW)XpR?QU9n<3pI-W2*fYY3d$00bTmf-=f!EG%IubO zyJuL>FY9VMPT$YK-*KMj7s6lOi>KhIFjv?;t~#AB=JoO;IC@yzjhjVtm4JWim}Ya@Tb!|P}4qc+0vhm3vq83TpWkHGB5 zm@r+-V{CiCHfOi**}YrfG5C1z7Rz9>Fj{!*usSf_-xYQt&Kb3cBcaOUJ{4Of*(N5)E_LJQU;I%N@;Wd~o zTz)9r#T+(+g{m6^`($oezAyD2wzCXQdgfu|BlZ=3K2bfGD?EM-EFXJ| zEzBMV--O#^_rY!7!0a*h^>F`=!|NyiADAt?b_R9{ho5qcrw?V`x>xrPRtvKo)(0@$ z$86#5J6vY@1-SPdKYUz1vh$N4a-N>AEI<3jW8Yu)u+Cw3pw9Kf{=&rZCmuF>`1qJH zMgFyi-NIgBvX8?)cB@YQl8@JZ`97v=`8mgXiaqAMbiXhE`iq_Y=D0n*d7b;I_um^U zo}e8(=30Dnd`rI{_wycF#(nOy%zF-a->JKMn`g!89Ug}p3;f3V4fR{Q-;#T*-+GK= z$xj$#OwpJlKjEoN97tS9;})j!Ip;0EMeEWzJpY2Ww3FWPNMlyOKT(_KENkrY$2jK` zxoh{vJB^LwjJ?mOlMnOUjj4>s97D%@$3b+@8K1>Ho?%Z}e=Z(EoqR3*2L3&Fz8B-W z8}GrVm*NxP%L}kbfvDk z|5^7jR{pZ{pB)AV@Rz>c$9l)x0$k1KS-Ov&Z|}8rzPtLRznAh=xn|u1ci*_Tx-ahD z_`e0~;snl5rqplbekaad?cM}1S@&vO_=}0}IDLR)ym~6XUPisz2F&Z{pWl33d|S_t zdxpHy*VMF4&z{VC<~$r0w#!#{zbmC%=KLH+^URIA=k6)*n)l4>{dDgs&$e*+*+ZUX zOq!gYQML2UaR%Dxy&c2!UP}kmdn@0``BPx@7@FbOJ>Hf3v}5_f-3Jb5?}O3zZu9

h%cNL#p?XFy8`6Bffz~~FY z@{4SP1H6aL9=_8b=b(PC`u%Cy9S59dn{U3xAU(qI6=62_QW$=Ny6a%CFkAli-2f&# z+~)eFQ3%`b(caVk@l!D7Ieos6uMKt!x5vR+VY`nH4)=Lh z9rlAGk97{h3)RUSE-}V4&P(eS7Kvv_BY(zu3AY_a!$+Szc+Za(hOw_O<#_;`9WHAb ze17Ke_OZRBe8KzTjC$etOWxsEyyLPL@>6*yUxLdoFyXQ1OABMfrG@z(wyTtRxU8|l z^KswDVc-8&osZN1z4Z2f&mY$qLce$c-AkHo>nz4`t19$e%3zRYub5l(u6 z=l0yii+1*p^Y-hxKkW2xXYJ>+zuW0EzuAw!p0U%|&%geLov~lfoV8znJ!@xZ^BZl> zoc+yy`~7$O?c6#0o&A6R-pC^q-%2TI?wub zuJbD6!Sx$=@Dc9vj@)+ph}+6%aQ*~imEM=@j49Wsm+x?kx;wlBcNwQNrrp28_{hDx z2M19M;x2ZF=jA>;TVs^>XnUV$eN24EJp*8Yo&#Zl8}oTC zcuwU{KF6fRs$Tra!w%upIM0qa4!p;;r9GwEs`UL$SJH?0k^D->Yk1zp!JOU;2YP~u zdpLc@VV#e2YL8#~*faU6;wR6Ab>Of}oJKyd{9c*()UyDu(z38m>wcZXNX}2!CCq*S zN0AmGt|ET&5{@7oceoB_t8~kphpt8Y`S(T3Ze7}I>eZ1BVR z&?>bL@11-{;k}OIwD3S153{Mm55L1ZC|y^+p>*Dx!d_?i)V#AdWniEDXkns!;H%W> zomQRG)rE)hZCQ6%$-47vDQ{xJd-=n{WZ|XSXx$mh8tXia7JhquXq)g_8v1qoYvJ}a z#=|RM{#E>Sr?FqU1eSX`xiop_ck6hV!+-Tb`%72w%P(KzoUU@doD+Jt;tAI=pC|aZ zt$XP152eOq$D1hqdUvn6ulM0Q5BRM#KD_g_`CaaDAMY}T-=}=Q`UBxM_K@*IzrFLN z9X@JY3anG_{54lEY?V)?=jBi$=ny~Pt zE76b@_q`9MV~=SoOcpkKn5%ISKA>%w^Pz>;|IPfdQ)8O^YhUaB|0{)Y&VK_xrDIF0 z7pKtj^T&!~dzkBRT|TqgxwcyNeC5}Sm9KfvUI~w}e>7~y2DMQgrF`pgac;2v`BV1C zUOeUcsh5T=dxL2l@NwKPh1>sVh2C~wlh^()83V=dz44lHnQ`V3_w^C?`vF|%9`B~! zlXJhHM@Rq7zWwPZJNo^%cIebM_W9A{w)?ANwsZeiw(W~AZ0o*#wrTHYwtmN6+qm;{ z+qmm9+qip=ZPf-*)ahXnQ_C zgdMaUY}@|Dm$vNyCAQ|Cr&s!bb{-{zB>Mm z9poAh9Xnx%+4l7}-`J6FzYW+aJNoS@JAUeWJ9g?jJMrE3_RaS{VW;hz?@rsd-~Vji z{_u;P`so+@?x!=Jo&L?fJI(UxU+u?V&e%`bX}FCzj_lX7@Eh*)ufP3azx)cn`SqOr zcIF)A?{57x3%ZB@vg&nZpgR6C%S>A>0*0~ zG4dC#%3ry52fJ(6;5gzk*Y&($;zNE6^N##3#uNE$(qZrNj^1NTQ0YuKz&6*8<$G$Q z_JR7_aL2oM$A44?a7yI^-rt9eF|r4YIr14aF1gaJGbT7p6RyGA zdH!9zSS9b{e~BIQ4*GSjonp&q*z#{5!Q~(0_xkpPZ9Yd5zPe@lcU*_}*y%)+j?Ykf zzPeXRQ-2@(ou5u0dM|x^cDStbVJr|Ikj~`i(s(gM&!6x#O>sQMs`Z~|4 zdzLA0>KRs@)5z7%Ghd^YHtyoil$XHV%g(R%uw9rfz1tm&cjhXZxHyA+a^bc!{A~H! zSMevr8Lsl4sZ{^YhgToeNlU+o-*Xv^mo_g>qB#2vuvHvFxUGBT?l<>9nC;#P?vJop zaR}#E^RBs=f^eC8>GOI0&W?Y9-{NEUz-XDUTA1zH@%}l?);pnhCGd_2pQX;b-2ww z@~vfxO*`DC4=q0vUtm8y@9z9KCof)3J9vgLUu}H6_H}Px3wLp6&V3x**78&E`3e0! z(K%z|VD>9)ocBuFmhe_FUgdJhr*?ia@9Zo1wjU>UKCtQn80@wM+Ia1Fx7kM{pY58)@KoZ{Nhfz36=A zli&Ve2alYvFTlT@2M^iCyTgUR%*1mL=bu82J3hNkI zW}U;!t$SpZbq`}BYpiGKTI*T1*7}x@TF-KpSFE<~Wvi%LZ38RT+rX;z*1K|@b+24Q zpKGjd4Q*GiwSL*EQR`d5`igb5pGq#EKjhiXA+lq}lY}J;Xwvv0ZYRh(8y@}=ZJ8T8zs?ED??Up?@x)s}o zaSzw-*kkKw zzqZf6I&S+8!fg&6bIYF}=664G(p-5M?jz$_*nbRebNrMYI{uw~eewr8iXHjpd;1#B zbK=_{?VE3ZvQu!G?|=N+emMOzoC7<38s6e@j~`A`ipRibe*XEa{qoB>N>8V8e8lk@ zw4C35clPU9xXkZ=*jY55-{B;`!*l*PcgfD5_jrgn%Gp2IcHxr!ft^FgIS)_yL;MBq za*qA9em4QAp7n3kbJ;KA_`Y;5oevZhP%HXZmnh z&Ao9kd#=-QpMXy-{^H}dc$YBP*F}WeiYW+-Se4O?< zo%o&OczUid)jM1U?|eVk*KUO0G9MS6U&%A6*y?l4Y1IL&_H(#$dt&iko*;bPlhw(mcybb7ep*hk%fHTMr$%ixGL4-H%E;E=Ts41x1Yt!Ze;>aYf^X>gEj^oz9&vClAd)Hh;o zzu^&UAA%bUEw#?2ORar)*xIx_w8FZER$BKU%d}}3Qa^*%F*M@1L<@DTBO}&E`wseS zAED&f?bNqn;u~%3+dj0MYg%e;BZKe}uU#kYx`sXLgPZiN;5f^c!9n0B%U06g3V6dR z?hEI&beVN8)%Mjavu)`LYhSj)T9?r;`*cutVcpbq(O38Km8@fMpRN)1!+O}(OMMUf z_t8%;+r(8=cFUH*c_@2EI4PkJ{38@RT)h z7ObE30XR(`Wgi?#+(_2wG4mjQAB->8f;bZ76 z*x{pEMt^~`91&;1q|Y2aank8BU!Rl~^OK$Y4h;tV<+~q$fwxF2Ib%P-MSet6`IWfP zMX>$`{-yH39y%i@=eEXQ##P2=&yQw|()-Go;BZ}jKH9kQ${ydt-~o^EpU1QhWA;6# zQ{W#no=bbZ0rybOm3+HP_=11HTYf)x(awp_z;_gzI&%iT6ENvKXMckqDXs-yIwQ@8 z^ZiZdta`YQ<4tfT^>g-jVqElb?l;A_F2IjicASbh7@E&nw4dKGaVG7j*xI=Z9G_*G z+WY4Ab1}0E@H5Uy{b)PqD$Vaa$29&@sYKzJ{cFaF5Ynd0&zX? zSaH0|if@D4UjABu_kqj8cwZCnbJpFu_>s5_Sgn}*O?aU60H$t>;VF=wiphPq0sVj^fJT=xGZacj5Fx10A`Kr>4!4fcJ91Ix;^PR8FJ}&0Wy0BRI>a=IYjpfsFJng4# z9wsY(Ee!YcafjdRtC;a~`g&*dqrU#ZZ(%aW7H$SinD#zykE4-2eat?OmFMlptUX=Z z<)DGve!bJ8Cy`r_z%CMr= zdMoT`qW=afXlY>ICaY}YyqcS>w58dqI@_$W18Zxy>W-d(by)>65$&PMaBphtM7!rf;RR8f+Qb$};!`I!&K+8g!U`miyT@upAwQeFrHA zsUJXl>BrPY`-_+Kv(Mn_4K}h)2LBj^mrxElF0;u-R&BQ7mDn0M$>>(Jm`&&}@EtUo zVff9++Rf}2;4J7b%Qi@Zfs3H6tlqo}%>|7GE;0(|*u3Wpcm^Ee%dhRruTI*DZ%%`U z7x2XtuT{R(b*Fbq3zZ4KUCxa-wZ=gA9uvzVHlX?^V7E-;uKX;$zb?<4v0b@Ix6od% z@g8434~`Ls`RS*h?VD3S+DWvKW70*Ap_Lr@#`YgNZeJdNuN)$lbnt6CaG3JzBeowd z^Cfi$&|40D{f)E3N8v8VzqMmFnv z`<8m&XsbSsa~{XP{oYP+UMJu=$G_v;PNCaScl5jOyg1bNibH)55BkAQ(dOGzr|sl7 zv_J6!`*S^TB&YAN?G($d&3Ei`N`~&Eeb9Xr%Q{K@3HnuR>m=)uxKNFu4e-Nh;Cpa%`cRA%=&bhE&{`nV2$2SMd(X;0pIdnC zo5uSG;G^<~<#P+Or7=5h$g|~gyo9gd-y^i+F??F-(we{Q<}_0;T=9HVa=(aK%f@N@ zLcS{79ahtaN^hOzz`AnPUV_)k=km2^>C&&X&Nk;W)0fL%8&k|2dvM2T>+kZ%#=v6U z1s{{&_pf~)+sAD`9_+VuI0;s|V^Y4x#5Wx0;2a!}(D}$zuR6@>()hsiHFiJP7}ecBEZ!(RURPK&C~w(up<7Fiu+k>%5D zPWcR*Q!&%#mIv9K;#oGQaJtPYV!b%Xq6%kNbn$eXUp&pCi>BJV!kHFb7-aKG!fak? zm_-$Z*zBTUn_W1I_Q7tSX!?jMnn68QJj0^ccR}eao2NcyB_TGyB%J-jEvhWkqAJ2U z4=sn={L)B^Et|vfW?OVggvC_MwguQc)s@e;`4tOnLDhWDmAc9~wxE2j#h1^s#L5Mh zusGJ@s$wj@I@S_u;w+&q){-0IEu}HZ5^57HwmJ@rx47y=i(SlmWjy;NSz=8Z?b9u( zHro=HWLXlH%5q9wrlmGyS!Q#dWn&rKx9rv&%jw9of}T>#>n>+ov1K$BSY}h6Eov=< z=j2;>MucB_TEo!T@;+{Gy>8-bd zjv6b5I~BH5c2c(0Ss~mezp2*p8)~eOGOuxo6|^;4PD{OIQJ33XV@2%^mfunf_n|%e zXg2VRE_g?mxCk1A;xwJ;9Gy#5!cj(+ zqpOIkNE;FFkVZjlhdOCBZD=VSfp#6@IsMXXw7;igxPH)MT;Fa#_7#Ug^XSBSN8kxd zH^Cb=!yhPDf&XjK9MC*$aA{Ed+E>Raj{5zZjHg3 zr{!suXyo`a&i~Q4i;cN)8Xt;x-kUItIWarY zU3QQ!BiqHgZ0G0VO9#1bFCS*dm$V^2#?xHBwtWYSCJOr^aWx&zoT26XPo^5JI|Oa z>~@+wTDtW33-Z&&v995B<6|pNKsg02N1tV1BlmK|;dIn_&jbcbLZwtfSv!<*Zn7M?c&$Mdhtx! zD<|CLr*XWeEGvK9Vf<71nZ%DNU0${@Uzi5|zl)QD;aV1U$~^4$wrknNqAA@n`+9Z4 zU*&{(n)CbEEj(8~m*zHmx#1pezozfk_{T4wO5=uqa9;0X((mcxZ}6)Xj}~Toxb4NC zh1>3!!fnpOY3=U(#4lu?PT=R|39of;h1JUGyow%n0d9R3ZmnnL2XdEA{6Ng{Tk&D( zddKZ6bif0L;rfS(V;(?5B%f>BKIN0~&X6;6`w;us!n3seu|=rFA{Tyap;;eTC~d;9@P(gX z6D)GkWSgBk)j~2SSa3RRGT5H+VPJpSv2R%BhZdTt@?#5QU3~;+e_%liKd_nE|F$43 z7z?E?IE!VD6XuThA@v{8?jsAqA_5jl8JzVYZRm?WLUUMNM4Mddb2(Q2zb&GWW9Ml< z);ZURoKG!0Tjd1Ko9oKq9xVD4n`n`_lPsJvf_o62!+pr*x^h3kw0#2g6Kr;#?$ZP~ z#3YNUnq+fIxOYWUY1P4FD%R$gC0I;p zf-NYBu|&!wo{`w%I9q_lSHxRVHQZ-$GQ23oV#<;%wJOtcYm2P7zT7I%R7#sFtgNL9 zjbyPEHdHt(sE41>Cby;(lTHKAsVT6GB}JB2TWCp(^RQe?smir<>a*)g;5((ZsJ_A$ zHB?$oeWhjAqUF?8SwS88P940ZvCeWS)2m7?r?JNJ;3|2|@RjB|w4FvPY(_U~X@%cl zjV)Ht*vxVZyhQp;tCe&%!-wE3o#;&M=sEC`>h^B58MGYql}b2ECAv%nWf{6n6`ZBI z53R=OIsHzjk?taH(E>M7Y@~hVDr;Xy%w+u<8``qbHtqY2JjfH|Br>)OV;RG*pl9E_ zde!ApyRn-2Quoo(A2^>2J(RIoewROQ%lEO}yj^0%xA5Jiy9ytK73c5)Pm@b<6pY#T zsjR z(ObHR4Jq%%<*}fh^rEXslj$WNrcb#nXfXrixhUS#Cqsi7B)4UlT$qv7Ui@d6n2xSZ z<*@jOa#j=%qHbs%+lcX~ZW-~NRU6$kbQl@;sBRoNihYHQ#oYv46rJO>R$e1vty zbJmlavR?6<-5Nv58To?P%mK#Mua4N4#9K~${{uOxr|oBap); z2XNc@$^Q+%HUC<9*vjb=cI(*kt6zcH!fnN|rCYn}R9~FmE9%rvx!-T_x22i8Z;uJX z1OB$>ljF+^x49?o+a_Fx?vwNZ#r>Ue-}T)$<$Yc!uk$>3{nMFWc}~#2!07|W$twb% zckDkv-Zr^UJK()rx1rl@wiV=7Nek>>g%-IQ-(dAh;+Kk_uHao@d06k`h}Dk_;VahJ z^!(X2BX5$0qb!?@ zzdVukN#MO~3itpnl~1>Mcpo&Ziv#9wD0VH|ald0=85 zcv%3}Q5Q*FR6cFN#`$2`d@yPb7#LkJ&7#1%*?A#0Coj~Z7vZymtF!aK|3x1La2jmZ zdM;c89FAD@iG?l_?tf^J@Qz4$#O%yZEGi4!&Y~T4Vc@uUL3oab=Mmx{;wW&0*}`}F z5nl+-q#rm)MEZyH!8SNeWX=cR`NuX3juMpiDMo+d5O9+yog3#JvFKy?!vE%aCs;H* zAtrCK#ewTloKqC%69>xSI!~54_N;W) zX&Z`#i2HC}VQHLC#wVPcu9IcXL%b^zPU3hBoF+mXg?_@hhDi1k7Yn6*2>S)mm##I0 zeZ+slu#oKkaQrMp9Ey4!TgMdt3eT8;kDhO9_inLupTP~k*k|ka5X0U_{@q@3@~}~` zYt0_U!(I4rI~hNT%?xf?X2}(aTx$^hz*n-Saz0bJw^KOYB<>&2LFN>$VX8$?7tVTU zHp`2qb5HsG7xH{9g0CzJ;rE*XKbpmJgXOB8=OQn{W-kik-iK4lSkDP(8`@4`1pJ5f z0+vgn;Un|mNb_udQ7n8Xo@X7NQjr9IiG!EKSzI|B2F?;&oMmHCZV zFOnlg4D}Lr^|ErLmFGmv^aAAt;#wEc)5z7jL>%`L^924NHhhNtfB6+{99>sFz2fqF zz?IF)eZ=SOUjweLKwlugqX}M7-!}x$7=VZLTMbs%fwdE}Y45SxPIQ#cE?e9o&eBau zOsNB1rIT1u$FS9PF0=a1rNn#`+aX5NPuxc_p-y5pUG(2Y{D(MD6US)mBX)$4gS!9 zbq=UpMotPk31itmrrZ_9hP*hBbQR^rC}z|N-|%u~;Sbbz!y*2O;c%be5z6sUd`7vl z;u8bJc={EuQLe1=TCpK`z=};<$TQt(>v^vC9XUcQ;ahb2@6q1D@1K6QGe7@ozx{H? z{k|88kH7Q1(ae?i=W@{Sr+wdAIPIH1&r6!P^c7*Yn+r-Q&0Fh=eaqk0cRdwD@idu0 z?jk;~<_i74a2u@gzs=#zRZ#Aumrvn+_X2%fI0Tl-gss9y|GQfrc1jN>uUpzV+a3Pm zTgtyw{P-o9rkw4!PafG@a8UM!K7@%c)Q0V9=lXxBV|XUN+Viz-;;8 zE=~=;O9OYYc-^bOJ@D>>$9t4FDvqsr1Lx7bejSw>f=rFDl}a!-^cbw*igM}%dxhg()h zxMg&PTPoX=I)g2#3+tF^DV?+EYnCOpvECkR$(=!LpNY+IWn%jbw#~4#jvz~I4YlNE z`fiQ1#Fh|C#WGuGTS-r{wXLqRo=q)Q+?Qbm{n@str_z$^mskeZP%=_yDb2B182g7< za!aTsQYJP9Sz_Z%OKuFZl%`-yU_HK`^Jt8)#CncV7r}a{#WjRj0__vnKdv#vVjJKq z4M7%LA7pW~kE;u2?4^$7n1)b`VR=E#EQ?+E39TsD!d8)B*S0Ns*SONrVN{x3$McBOCl`} zKYLEz6n^g{OCx@eT@}mu;1i?oFUXCs9O4LR#oYJeFpDn=wfT9o&{4q59CU)5iRcy+ zz{?465G(^c&j8<3SxyIASq@5>WNoX4Y}YqGS*1T5j(uZ0i9u#H7Tb)JiS+Rw7L@eAZC3IJHY@dGo1Tc~l8B~~_^|~i za10sCGm}2D8A)tQ{tug#f+hox2}*@Wz*U^VLxSNlp{$3d(wEw#qSaubEJx5*d@CsZ zKj1&qrT?32;n=hdPKA>t!}qYD6in;stYgxPBC_Cfa2xd-N?lkQdJ{Y?oH7g!B>ofv zuM3lAlRFVk0ADLbcY@>2E{e34wY|3U@Il_;6E5G)#eIqWDj)w8xowKse*Xh``9G55 z_7kz!ABn+!_p5z(in)cSm~+VXlf;gXpCE=zzT8*zbLeYw>(Isbl8d(qO?uVnW*Z{D z-$q_#N_mmZ%TIxiz&%RfB5;oRMTv0cc=$%V#pV+iDoC~Xf@F(_dn6R4P{+GooM{Oa zSUItw3bc=MVnQW(mRXW(ndPikEwYTo`Ifb~)G{lG|5O%P=3?SQ=qTB>6_&fC(iT-q zOR2EzC5y2dTezgo7S+~SULAT!ExJhE5;Pd}kcK8JX=t%>^pMg9Vl+)nR^HZ%_JOrg zPg&JTE(^S(T3mv%7Jg9!r>Jc2BQK`Us#?fLX@eKAUeiWQhg_9r#aqZ@sbj2Deo8Gl zCUtO@7WhCjyu;%Mx}E} zn<`+io9C|YN8I4sDa1X6+4?Syd}!a~o8QMLSE)QU;k)t_UHlp>_x*179a1!F&HHlS zrxG@UFT!Lu?+gD{xoOIOblq)m&(;zu{Zn&gbUX9=;2IwV#K%9{zg1vUF~lpL4D6FgaZu z{B`&#oE8VbygYEtmsT8|I{DhdX`KgissDO5#`hvQH)-E|Kf&dBKh^h5)P`?lg5~UiDMSl zSMxrQAJ#y8v#|-Cu#WM)6kj&MrX|f}9Au2k_`nvFOakM;)DEzyYre%c=UPy1zD3vM zT6}vfSUk%z`)68uZ?L6whgcdIoz)d?+1;U**$3|Sg2_E#WzQ^d9lY+I3C7O?|G`eM zJEfcb*f*JW$vrbHrH5ltCUj4y?-`a%|B19qqFplEQoCnZCcL0&ZK*Y^CC68ww;#P*q%0DoA} z7Gg2&p%&j2VsRZh{&d=iOTZ)G8wv1MNjr z(253G-$yRpNU06&WXu^}Y+V~#t#)~h_3!GZzR+?zlB{=ko8|Rqz?V?g6V_T5CO{oy?8v zu@&3#VOGJ7hO*#3v$@tNOK1hl;Zuolv!u2#OKO3aweWj3!Lgdcx!-V?rbz4FF>Fh} z*bG-nw1u5nRDrrd`a=sV;>l#oZkvUrL(%3Q@Du({|!bBbBUr0L8q#L#PI z=i`^dRYK7&!lZTNO$AFQqdBmQ{t*TjQT$^z%TWvACz%t$=ZWx;N%;4yr%z!0Q}7wB zhHVj9#7f{T!s`$?L5N~MY3LPbE1}X?Xg?F(VHUh57z_{1o`_~a3(|eb#fg1@&(C2&L>TU94$)~JnX+eidEMN zOSjZga#G5&;j1~8ie*&8H;BP3Tv7;+D6vI##BPY!$O_OzipZ7CCzm#-ezD~?RI^SV z2>hYA8Gg~)VkI5q$9Aza_$r3&=Znk77N*D__55iMW8@<`zn9W22XOG6CJhEY$Itc6^MO5# z*0R%!*~e+(w0nu4{pOjl@+nyP%>I+_82t_I{RKAuMfpm&{e-+V+Pw;3tm5FpUDuZ| zk$sh??Q+_{b59Q!CgUr!u3R!7w>`bv)4jF)l0Ie6#Ulc9s9y`4ITvREKl=4JeX%SY z_wicgTlw1oQyaIPYY=w3d~(jg&CBMR#aA4s0Izk9x{r$Y>zh~lPQpdvVBZnP-uEr} zV_)oItR1p)#_>h%mw2=QK(%9z0L!;F`hUL`q?Q5`D*EvE8(xFC8ac`~tp`3U`U?<9fhu#OGAR=cX&YPqKDwt3dMeX&(7&9j~z&6e94jbB!5O>FPq+GDNY zeI3}l5De`Yt+4j>mE^+3*pijplTq*(EKTJ&Y4C^qUVQdFz3_m3D;~+q4;!&$<(2O-=m@i0ob zRxH17416q>`w$PeOYVWM@EfJHhTFjIrCi@CG?IDzP8rs-v)$6$7TChRd6v^3Yq`By zw(`&#$5nE>)3_e~zRmF+R<)`QeI>%O_&pZFiPGUjsa-rH@TnxuKfW~>ZV+k-JO}Zu z+}}2~>DchIWR~MwrlAE*vsg5nSn6V0I6wADZsB>t5}VYeUIg*MgE61)~F=S%SZGF;% zSD_PYZi2L9{KKAQVDVC?B{z1FyVrqrqD!Mu*LT3}I?%J*+N`Fv)fP81*8H9dFda=}y3I&L14+P= zz~f{rMccu2`Us5&%j3{B;{P|x#847HwHfgfY%1-ivTarzIz=p+2IVZu5Xz8P^b9O0 zMkU+ThCXJo9ufBYR&obOy9wk>AOJsZlC+E zK6vBd4_N5%P<|?Pz6npkQXf;DZ!2t-k4s-Zj>^v!UVA28`iX~!f=>F*)vZ&m4UWAXPGgz@8O>)5O3iiLZA zzBq<|uY}vuFz)bsTz2!SFW8RbN3Ctcuw^u7;b(|{f-_|ymQszcNdEVNTArKg1mbHc zXxvf6*BDpGkBX@z9$f)Wkry6U1y?1{dQKI&NfqRPS4?s->{vAM=+aMYe)T67*UCQa zpDLu@G>hpJ4o`Fbeg?R! zVO^UhUxn$>Js8 zSJuFM%NdEch0Et#djD+d!83S*xJ$+AM2D$O>nm*Cv2`rxSjoGoGaXed!GvKrt^DMugSKxU#+q7{xTc>Y>>Ht zVEsU`Z9KWn77dU`556bEt8{(RMN-gNlHf&&;HmV7#CGtH-#?Y#Kea8=`u7am;GU(n zusPbw`_im?+Y-xaiDF)10`m*w;U^JR0v{O0$6q{DY1`({I<#@7u;R*D{gc zn3CT)p5HHlKBb=|w9yaiNv)GDr3H@K%rcft|H&;JtA%4X!+~1if2_wf!qM0sBZC{n z&~5?Cv7E;Ojsm$*(9R?_?2rMn2kk z1sGIdb4nF=As$~;O6&q%c_XCR4k=D#p2=i z3kq`BFPA*aG}e~1X;>0^2>c>EQOlFj5Lkw1 zL?ocOBu=rgL^J`kg3uIxizGM)?ZXq`Q}O5l3yAx~z#HPIhm!;)d`f)gQ~1p%@EqbY zDWBL(bd_nuSEdoenFgPj0gq5TC6u~ZXfHv^3n4xdK~9KrSHsCcoz0w<+I2&=Y{w?s zw0(!|AWvTN3-oOP#WcP+@RfZ*ZkzJhmAiiA1oP~eTc>$z-~aTB`wo_T^GnPvdp9o} z9M^ns`Q`q%)TGNkz`u5OpSU*uw(`-uZ*_P%Y3}b>f{pLK2Mo>#>x9L=f9=PKogNLQ zdp@jU!5)??M(n=r$-XL`_RY5UaocIt!dc-W`1nR~W9%*VQh3Ta{BunD(f;%+te0l( z*1=jAhj!b*Np}pj!Q?+X-&_58*WjHe=ZhBZaPbwN1oNnPLeojB_0mFvh2L#v;b081~hAGWeF#Pd@|n zGaz4?aTK2`opC>taa<;>c6v5t20pa>&J4zR;c^<7oeU1A^a|VXcfqezusNMF-C_7- z`cs`(pVT)2e3lervb2tXyK<8#=9h3;xBbGW2IO z-_csDT%H9k#Deu`_MAg<&m=Gzqt9f=6&RztCOKa`9n4L^65$aE@QVc6CW7_J)Fq&+ z#|f9gbYZ#LxwiP>@$?nf!~LSY?vJiFyC>Wd6z68%S{n1pvYJz0l;v^7?H6ZqmD>g?zyzYu(1Y_`Xy$ z@fI7{(*<|wAikeqjqCHRV`qyE9UQX4Ve~+-ESr3Sww>fu55&{wTzE}`<@O}l^8JHW zv%1{r_Gw&iHosHRV6?SwsaBk>Ioz$8wjF=FZcV+@^E0~exv>nmq0Up!km4kYNyxuWY9~I!wp1`U8Qe^QKP7a+ zvA}NOccOG6usW&vQ*s(U4q&&(xsn3BD*>EM;Mq@-HS;^dRpY^U)yFkY!oQ|3EV-Fy zzX_gD&vVg08(Aa#vw?Q??8~u z3*Zb3$PdlQw22E6!J1U^P8Wj73+;osF=+UiHoG#;qN`JFYD$vLOiyR5$+a-z+5c-^ zJpN`Gu{C{zq0APwVD%-;72w>-@h>L7WKn%1`ggufibapE$KN07vv%Slb^Wd6;n&;Z z0qT1Au0mG}-!tI7?QGy13QbniS4VzZqg4$y!CTQ?N;wB|1Vf9Wh67d z;9v|fltf#^^IA1nXI12URFdye+F4=c-IeIpW#o^PTX7p299GiCas%I&SX^iYHO0(x zDCB(en8UD;>sVwtb-9+en7Itu$(EcIV{ zd^dS*`i{}c^_y&sY%{s+$|c^il{t0WT|VKqy_(NBieV`L3?bMGy^POY)<9q|= z!XL~nyWoANjk!gdU!?EIy6@J4-}rvzzyS-}Axs_m|w?pTQ^B{A}OHc328F zx^IYpckjLnMxEwxX@bfptPf1q%d2)wtO+^&>85%>5TJf!s%}9 zI|&VS3jKoV;BYE9n2cX59ow}BTZOOMN4TC$pJ}ws#9zL_s_pRY#YA%+E#z{xve<3l^E_Kj)fl45BBzP9as{} zse>GQfOE$uPZPHQzjVx`L39A>Q@K9XrGib;+mrDnlfho;{249=fX|K3nFxo;=%0b^ z8)glw7TEy&p?_Tu^JZFzGY&Cdg0+=i&9SaBvRy0ZfATWJ+76UU3B7&y>Dt zmN^*0eF(MOAv9)u_AHjuz{^D=;Nsw9%Nq$t_fAH?o@?2}A&SBL@--P&vO3)|2f$62 zb1>Bw4M%d$(*396|3?rzm}>dM^Q>SX(TWBZ;0MpQioON-yJ^<7WifeUomSeL&m8kK za+2m*EMrYhRTA^a)6we};1frYr-YxGg|3s0-&-DR`5p7n>Cp!Zrd#wvv>alSDFw4_ z)t;63?Mt18-@2*X>d^W#@v$?xj%@I~YM{`z9N1$!j(lMiUCddpNww`qcUvv_dh?i@ zHkWS#Xuex)CC?F9oi2T(ZdPEPKgTbp4!t}DUL`#y#c3qqurS+UF}$zsQ~c&n9CpX! zcPF^G$27G5sbIS>9;~Hp9R7JC&%f|Hp>+cKJ3JPPZQ{MblELvLusgmHyrzr=n`4?L zVw8>e_F4w_V`Yt>I{q6=yLsUIe0=ozb?j3I7bZ8ctS8U9*Y%P=u$;La!|wU$S+UHj zTbr$hd1_sJgHXAnZtfJ{2kaQ^v+~+XOUOb)TNrQ2`N@{BD8b@#$Z5}s#XlwIJu}+o zrq0Hf46}$h^xJsK#5ooe%e;_zp*Aym7I*_z$Dm)&$6v&sjLwg=n8j%pUC9{1y`NV} z{yg6*m{XQv(N$>{SveQ%o=2`hI(4ZQRi21Om&Uw}g;rGGWOL?6TTtW-n=u=$ctMl} z&yKK9r%tsAQ)bwdU}AEaxt3U1Zixj&HajiFs=AsiG8!K`D$IgIImgIw3ksTPGlQnv zl$mJp5up}JAG7CzgPeEEV4FqH3$|I|VC3v6Ha%jBO^%vsQ=%r?G+oQw$u=`C%LPl>iU$$YmVh3_upq%u!2ow8ViY2*V@3wb#MgoNQh&X@x6qy z&MGVGs0Xqz$P6Pq;SQ~M;0cztRrd@I8y zgooLTgxT<&44XqP-h!$UG?g@T@;SuR`F_PB^Z_(^lrHAVza*9?BcVm z3wu=Wa;&u-ypxaW<}(X#@ne-Arc&4_Ki6-gxUe597Oo0I732OJ{8lLwX1jS-!e#m0 zV_vM=&8-gLu)}P&>$vLwHM+FZwskHXLw>k4bK$l6(6Wvv)A9ep{5ZA#Ua&NBt^W-+ z|HZm1S@!;3vtQy{<6rCV84Ih0*?+42EAQ_n>)L$3T+7~kbj9_>Wx#Fjhw{|)4bt=1 zuh`Q48!WUu%F9h<-c3xUbU?m$qA`Z?B!Mv^7JoUeV>aUl^J!Zddx{JPdY*iY#8$?eR>nBSwnWD01>|W=%U);;;G^-3%Zbv5@ikq% zS$=ajeg=5#a2I?PUZ=_bR!m#IcmUUhMe=VG@r6*_UPHa>T@qtC; zq43@g?pkZ5E9;4ulZ!4cfiIhakEWP>#t{D6fV6*c4e(hSFI*!P3{Iw$r8!I`4h&u= zz&Ye!CxY#2uUx#e-ViW6j2J-(`DD@f#_iU%3IC|Q*s{v=t+c*|+`q-vJ=#W$x(fX| zl=EQ!KKwx8j5Gz7J^lh;;hrV+Qim>(4&U*#2yvi^81V}3ReC?##ULDrwwau38X8F2 z0DJ;2l0lv7Q^9_BE&ML&oO>p=ko%oSKZQM!Hnh9RMt1kwfb!M14BFCdBQ`)xd-RL- zwtUBO<`-|_Z^G~mjP08kFV@(qU8`-?-W9fP-*Ub)x|zHve1nY}Z29KpHcA|P>Bc_% zgVlVWY{1rUS;x29hi&Vjy|(+C{kC%Nhz%2$U$Lv-mhNb`k!>C1yK&6T!?x-3Ew&Br z)wgCD-&q~9FNp!I-La9mI^^i})LH{$=Muh0)3UU}TCt{{3ae!fcNO!wE9=O0>&ddx zfdq%^&bJ10ld!~Qp5s>e*dOtXe+=#ldnaJ>t-1HYaF(5Z&a|8IEX%Su;WTaH8YZGOgjf;r`>Ymn^w7tpvnSQh;JZ3=ET>^M@vLy3 zgH~(bNPaSy-L!^p{;uU)d)&7rE0`O#cF?+aZm_y_qB z1jys7#NS@be1BqP^A^)*6>};1hQPe)5SE!gP)W?Uig}ug)eeoIg1*b}*;8g)X?qj= z0IXgRW<`AWuzkf+D@#6j7qMa-XPpU#?QA7RtyMp;&6A=*QZMaD&2 zKJ)s6=QEDN4N?kHEDOwyPmi(b!BcGFRB##Y5jy zU$bK^qpHFR8qglv^nFHh;FA;h$RoIW|E`_5 zbeb_c&!***k6OUk0dG$x=H@g$@HUAtBS~XOGk7lFx*g3B?J{2eMC*rO^GBX9z}TfY zt@4W!$uCL(_vItRHG}Jnb@DZmh~diLPHZB6Ubzq-o!DkO^Q6Gtq%OuZ@H!RTR=he@ z22M!(P66jq@$*vfMbq(Vg(32>lkvxs`lUaE@w86^$J41x0e@2Z*^VW-5?vGQPGNf* z7%Truxm?NUplQUmD_7@R{e~`^kr`@}B8WRh1X&2a#2oajNMd8*ndH^XpJCH@|ANDa zb0!B_??%3jv8;-?Hu^nSCX7w%3$=`aFv}hyehTKLJKq^x?`N*tAo0{et{=-7gn#sd z>1JfARI_aKCf8*SYS z;`si`d>h%d+=|;vEIvQc7G%uB7fiAw<`OR5z1~Lm?;tO?(9#$iQ%f?5foAdjwF=vG za5LX3;oEQI?B?;^l-%kvzQg{t?eFIF3&p-@vcI2)RI5c1~3=ejfSuSd``fmXLp6GMzbQ#8XT7 zhEExD|4PAj>ZM;q6_Z!bwumC)zr~;OO&{{F$hQwKV7>5D_kD!fj4@Gpd?SGGB+M(K zK}85JRc zzFy+J54;SDkp8tz<_nBTY-&6;fqHWAI5ccI;+yCIL(|0D58Mt8MZe~P?{|tRHkp2} zc5-pJpJJypGE1NboXdpQ_wwE&yY}r7@6br80t;*4FiNTOCplcyth4b9WM%@m*u%Vl z^6DD#*}G5n5<~pX+h6jjJ9H0|XJ@90tE52cTN=fcXBS((72SC`UW6Tdmun?6+bU@m z_zo-DvkEv7_yuQkmDrl?VsA}h3$NCcELQxCQnJwjr~61q67f_rI){vCv~=;*^3e05~yy{{pU|Y~wY4{2iwlz>I;rGzp!FRrgzWZUL2Y>3|3iA?=%ZaNOYI*z7(spq@f!nj9k1@B?cia)n79J7&O>N)BHEK7Qy%#PpK$407(>l?9 zz?GXhCWAVj8GO&!&-1!=v0rgr?{n=V-?qXHXAkn78%`xZ<-A~MCb@NHKRHYv*S&sn z6EN5T&gQap;}AFvR;O!T$~H@J4y;ygUGqoPq*=iygM(JQR1O_{w}Yp4az)J(4ZJ4D z*8I?}$MKqWUfW5YTsK!Hjr6-l(C1;UaMH`!PaUmS?6u8sQdRUf*NMHlQ8EgO#ZqjQ z?5Y%*qHn5}I<59+S%<;4VR%)r*ao-k0Qc;0;)>7N!}P9!kxuyOoN@4P63m_;&mJRo z80T1)jpdw<5Z6?sxW*&IIilLLP>zd`{9*Xwkyz>8YC;c|Lr=C%GK=`_7CNN7E#J6) zw;rJOI7HsXb4$jPRrP#LHYx%T>mR&@yxKypP=7#CY$Rb z_s>nr#IX+gw5-yME^p=BkW3ukFNNbN{4KmUFg%z4TMl{yh42}y^;VfXBB2ieoc{7)>TSEY7D$!DRsh9yic;=IN=#fTvAZ?iTcC?DM zA%$y9s$>;d;BC|C<4q!G?*g0BC94dLQ7-*BIpn|97JAQ^hq62@acR+F%gd3hyllyG z(kpC@mQgUw)$9cOQzSkS%{4r0DgD2PFCCQ@{P45NEO4F)l2eq!eiu1O33~flu{P3Y z>`J4C%V%6*#$(MPJqKEiT77!&UUZcFJ`|UG_7bxYTf*Dez+)?QAPe8~Ok&t9#qeHg zLVS-i(OjDKzQL_4X0wQOwT~c6bsgYyCYWvEH)iL)4L(bkgL=B1{Wg6Jp3Bk-m(iCY z`_~$&;l~kA#Y%o}l60aw%x>p*)R{;RKn-=?disQhCAYLh{7m$T1*1XE;Iqzka9ziv z#mN>-*YIqP^%*4zyW3 zu03LroHI0KxBMaSKgCtn(~`w^2@Op#{o9r05(CE^ z5Y6|pqCk9t(1n>Z(598pliek$R(LUoRgx{#?$XkwjlO8D%?HJX@xLvXeNkcT&yv6- z3tDx%_=W|^P7`{xGzYqKhXf>~OJRMjcoC~7WSj9usFSXR1-{cYl9-9VpWQ~Rkxehg zf;8eQRoh99pM^gKJa@$?GYrNCq;GLin()nw3=NSGczgfgFlyZ$GC;jKDyr0(b zQE-&Loep}>TWckkesot|jg&MrN+CLe%C=@=GG;gsLo`e=*I=TH`cplHsE>O zBrQ`t=oiSvZQ*F>BGJ{wpsT}2+8#h10i8n*K0|rLR!(@2Z2A$=x2um(3^l2Q9Q+Nl zseKUF#W|xTnL2t}A$}8O@$iaVL)xs;HrFACZl0DquO8v+@=`t{@77tXpTU)X{U!Re zZ@_N&aksYI-3w;q)UR<_XI6P|TeWCf6V|PvOXK!mG@s--swp@4X~k^=r`>hyzZpHz zXvx|B2%r6%g^FM*JZp?-!R~+VffBm1=Ix#T*`@ewk%7arc*7F*D)EuLF zHr1gk*Z!lC)4OwS&GD7@{_%C4`X|NN*E#f0;Ib~o=bygUTpGMK7VqOXy#8PL1>FAS z`|suF?|)$HUW(yA8Cd=u$A4!$N00s6YutBZHg#@d17neU|DC^2b>^yr`<}l=wRSJR z{6rep1|$*>Z!>kWEOf0}&ra+10&n5>y3lEMl+brlBGy(1xwUFu;RneFZ0L+_y-qws zipAXKA}5dKcz8ZAU9VwgaNA72u3je@XqnRB57W7hWpEu+Ew^&E%8P3+vvR{$@HC5D zK7*Vlv-dTh3(uPkerJQp4)E9lZYwXYdT`Y%XM)L@BW%GB)uLsCpSh#t<>0n*&KbOp znH7?#S3TKIix$<)bn$;;gRX~ZR9UAESyHLq5j8)3_R$2j>g zm~9({;~axW0K;w6l^ql07E`g}oQRR!aXe+fZRarW4K6*8I3Ry8Mg}%o&~@cWCp~F1 zM~_J3@F1L+Lu$rLrQ;woQfBN@jJ~{ZJdWJFSz1@{_#BLu*^`6hrVHS6BfVcO;CLbN zh6R0H8G5@~`n!tI(A(&9E|b24H8Opy7Y+TO^sJ%dSuf|aB=czx!Xb(7;HW+oBW7oZy|;QCY~ZL?!|+e}M& zx6Y8UOUF_ReF;fY-d_iQHw>rOjju+Q^i$8bw!!^1<$(Lt?m9ZTmKMq^elguseG;3I zBGv8trK+<_ocMl3Wkutc(~CcPfvg@sAT!MRm`0=1IM6EVmyc3wZ^uKuMjY^yxn(8z zXi$UfhHHT*FG6pTM_n?nuA12|cyx5SWbi;cUOV)ZYdmUvfB8P4#jvAC)ZRAr0CK<; z*_9_^zv8mi!;SAR-(g!1`*mNB;x*qx>NA;I|0d^Ft+{GOY-m6n#J@J;T|4ozgWrG^ zuH25M-9oNyY4fFKpCEnY+a&{bdK1xz_vVs6cH&u|j7NPc{dhx?+mb6CGd<#}EtK8i zXqt0Ni2n`{2QL#_&qzw=q$IVE6F*P$`<;Z7E~0*#3D)=G%LYG^9|+d^gU5anfF|0X z{LL4wnJ+ps-=uwpW=eHae(}4+Cw7N;$LQKA-qE|*lB>pYJC4WV$U|dyi*Nj1@l9YQ za!kS=F|iHMrMEeUU))Zf%P|SN#6OAWMeUY1e10bhnJE%XuDsXeLoFMdiC>YK;Nc=){QL|?28x~CORuVaR zpm^~-i_<21gS=#q-yXPYKiTES-%MS6U!cG2;&u0hhw?rX#7+#fJHT54qJqUQ8f?o* zljziBiAhV5R0sNEeE1*ugSm0!&6#Nukpz!PJXze} zl8{(x@UdRvpUD3!iEC$x4Nn<(mPC4O<9+zN`Fqf?>#TJW*w^dmHy4F9I2I`Xf2 zuE&k&g6sM0csxZt4B*{U>sUONj2>C*8>uz)_7+eh$>aFSB}w)yTWymOV9W&AAn~Jxg<2&AYYUt=O$RwAPUgE?P0`HCOyw z9*RcmZ{XH%%g90hRcrnUJ=f2ypLpKi^|>s?Y4`KVQ^7vfox2yexo^~_e|rvC4vznw z^&>g6ho@F;nc}sPH*2oUdvo6hm%(hsX*Un9*v<342dg#DR?L3A{YkO=hacRF+s1vi zzi1w=Ir#Vd9e*WmFtA&-X=u$=i%#6&$-VV`X^f%$X6o_&S%~*7 zTszEQXNG!+bZ4O#DU`@!a+)4Hc>>?@uw#nL#d++C%QrM{SVYS~cN$XrNpZ4zQNj;TXNXDG%vDPp$ai zLg$sk${kZ|Hg-h3os2cJvS!Iu)w3f_1rK^xB{WSxEMPbFsR82!ZU zl3tf3L)1~LsVnD-0^0moDV&ZI*Ce_26l;dpo+T%qirr#UZVz2T>!p9d3V(V zrq$w$VS5u#t7Pe+M?0x7iMXN*ug$Bnj^AF2%f|H!pYTRJ+{nQ@@!G4wU$3yc2~NX? zZokX$)Ee1Xmc?VIWNPCOnx8z`zuYTXwHZ>{TSwf2hUVBwyu&MHVq=E7bRYS#Ro2g+ zlXLeU%EW;+iLsyqI4~%MEe<(;{g8b4?Z@)+^Y^KTqG!K!SZapw&T1*Ao;N2`YX^uU zm>ai0AANDPSkO4PjSethWD-x_UPG%txYdS-9&wdoF5hj9Db3n@IG9b&+ep7Wd0)R7 z?jeoOg6|dI-Au*#R{AiS(K^s~?SQ9pbn<}CkcO`n^jzlfqm#Bq%5;uEEqT9!a;l}BmqK4|y z9w_p3Gg_?_UvSq4eD)EqXfN@K+$%oeyTvDLCv{(NI&6n{h3=4jp*vZ-WpBtX>b-Bu zUheM+-X(j3!NbtKvM-En*e-AojOSS69Gu6C+wT4P*lyVuu}5|U!Xxi`Lrh^|5(HKS zL`I;sR=st!gvO#LONtl&sBj4iM|TE}M??lmctV7PQs0hEPmzE)cyY96p&T0=9V0<# z(SjmFB_uLjf;m@EVjT4^&KCt1fxWxDcgc>O|0z3m{D-`;_LH4HJLNxi z{Z4-GjUTW%UHrmAsE-93e7q?%K>R~Z5*US_OA=nTnds}_Zenc-? z^kXI2@Y7{*_;r$HPm@er3iyprP_0uO71`+M=%Fac7E6u|?w`1yJi8eknR?GBq@>B- zy?f;iR;)8m>hNRBDaOl|T6s}b9)A1E3I8Co*GN@UGV!yuu?HqaqCB2dRy~jj!`@|@=?WW#ci-paa(zD z!~2x;X&$Xy_umXW)_OTLV|@+os}@bqtH=I!JhxTXtxJ2ee&fV{!)(Q5&6UZSe^5+T zEOytgl^<6;|JQQo+`sS~<;vapH^=GmirvPsyyx%Sxw>k~_3!=dGcZ02Vg)`k)y->9 z{2#ymRvv%yE?Aw%{}4?TwO-ZSm^-v@3*H*OF1tGst#3a082y@DFG|Lo_ZtA4U zIg%p}Wr5Y@5(O5SyYNffAID>G&qhvXqFxNff?+w6cDU$VFdu&|`ily|C)X%FXT3JK z<}7mYEaJvgyeH7aP?IzFXiZ#mLiEq0c%}BFOALHyAdjaq3oK_pnr1xGn&|gxIC@?Z z4!tEIn_%?D3yIu(C7~Oy!0zV~y7_{A&m?lo=y1z`S$Z?D3 z>3v~;-eRug^H}LLzsZRrnFMB@UkciM^30mv{Ssk!>*#8xi==+K zL?-Y=X_zfVC)Nipw#dQD%k(*S(?c~Pv+&|0;B@H}I_^<=vFG#f7h58iE0wvk+E>#i zs~4#&Zqx5f?r$Z}R*k%!rMmGPusfg6)QNUL^?*@@d+Dd8PR{?K6Mef+e30x8Gs!OU zqQF>i3J$w-q(ib?Sw>#t1s~}}zLc3wT>?J4eYB0gDMmt*VyQ6(@*J)eSt-&BhZ|+4 z518C!C)Z5PdE#xUGPp8Fp2+nr*Fv8Yem!QJ#KVckIOtD5NR5}=dHVRc9Jzg5F2B4E zZkNfSOWSbb^q-Lr4K1O;;s0IM*(e2QEow)~=%Jvm4?UBsxgFddLjOnq+e)3mTU+6u zvbuJlY4qZI9f#JuQ2Z=-dBSr#yWp=on#hYwnc?QZuPYRcK;J~}8IkNIk@WL~r_djq zP7Z9w%ZxtW$c#YxeEHn82bld)X8Jg?(0u8le=FJ^$O^!-!>#*@gvZFNMFZ874E|HI zfFp9^^=l)h$Y>`%z)L2T>v7XuBYXxLCUd;RbWTgc;$4Ycek>8oPbGZ$k%X>1kigZ4 z;?Fi>^`?aNq8~uBmO>v?tP5V8UgJRW>i~4sK~etT9-lcpv2U2>zU18DtcZQ!H#s%S zD+CM%pS?oB^)Obbm-vu7`iAPTA|dL*De+1xx z_o$XUJXm9F4)_f8^c8S@FK+bd1?%=(;+-fC&W>hBOwuRh2U>h|A6$; zzm;E($B_*kJ8?r^Lo2_jdH5u*)6|MwmAT>*K^|QQZ#Fh6J@b?BP53B`5Fb>;5kG{8 zUnF(?0RBJWyQq8MeN~rA4h=`pNS}W_7>*t=72Tlv_M|k>uYry*sfHO2%qvQ&;cF%w@CCW4Kp832q#`zQaeDz7Y`~EX#5rDn?=56HLnQ(I{;C3p!plW3EyThb)B3}+) z*^;fx=jnqwP2O@&7B8NWcJj^i-ZZ#qdWxxiYVBI<*vgITv37K6IemDjv}(U5^~Y|$ z*JxtXdf*(v?JSn|%{tI>9vX6+J%nGISKbn&rbTWt*71=@ ztjQq$<$3scr_`9y2k|?vu@Li8Yi;0s^%=|v&7{_wP0qZ6F0_}Llmnj!JNV_0tRnhh z%1XstRt*j~z`Yn|IaH9B4$I>CdFfeim*)8{nY*wpvlo}Z^Kx>vE^=VzD)OB2DXY}a zWy|D=AvtjKfK*QBqkF29wTp|gczs^V7U?ger`|eB?;KmLRpe2da8bK(supd;M_g#; zBV0R}31gDV;T%KHWr__I?;tmhW0kqnv6!K&**gxp~pwB<(h*eTT-YSPSgK3DY526@%8tWJ^S`a z7&>7a{Y2W2?&>v5*?2Y{FlACpeB|u2$i~$TY3ys3H1OSQFO&>>nWW{QA?hfmXN`C$ zCmg=iOLp$z+7yQ_uht^H%PsUfqR%59wNu;HUIo`6HSobQa%%e2yPDvYTJRhtHnrQy zyOPBe!z?v3ye9cjlr59L%ZfG_{cx0*ghb<=5rwZ;47eCWO*a<*K=y~nP#2D-4h-iU z4EG!oi&qzXb66a{UeVN&d0g?{Tti+??w#3A4?+ukJiXg#jpRvn^o&&mO6y#k6n9jM z2|adH`-CJc-q3t{~M!>us#=lKK#fZM*jHs3+w!(IE}lfm6R=+OPyr}(b9_HHlt+CvhHnv3B;1|;AkwoJFzG+ zi(fcez=U{-OtGO8v!b;_%K|p5HX|a2`m!}nQpmeQ4UvURu}oc$26PiQ>3w!T-k6UMsCvE1v#;m+o`p^v~d)fyvz0+rNOD ze+SpydNw!ism@IEYt@ZuzWx*2pTSPmhZ!0%w#r*;%~|o&Sm5}t`+dAB>4c4M~c(G<6pGk53R{{WwL{i2*Yuj~0cjJh`WHO5d*Uv+qfZw!C0Vzt)Y z4ZdIF4*jhDgtzI}U(3gzej_@w3K@4z0{y>)Z5JD+S;>a?ewM&6DIBCk{9nW ztMkrNIeF_X{8^sLf%^}n^VFOqQsYj856_~OmkA!Hb)#2<1JBgsd&$M9gWBMZv*4~X z;bYCcXvTYYkvI5C(*&Lw)L^@o(eEyxtyp1x&oc9WmY5YZLyyi>HJom}bS&d_vfeCB z2RiW9YNg&%M1Kexsu?`Y2KP&ttAH4{Rcgok$f2omI*ZXTyTpkHLe+2qI-XQ|lfld8 zB)o>u-(=&nlv9q+A(}XPgq`&1HZS8LcKm`wu5wMA;n zClWe-SbUvD@O>dNKEDVKm55Jjm;@#Vf*br^$*m&sS&E@f7@k9440%$7=1ulsu7}Kf zu%Y>}1fmx~_k+$inCFI~8wsJNsNRoZcs_=bhlP=Mspq3^BhCEQGehXb?WUfFr^x;W z<`0bFE76bs#7vyv!c)nHel$n?qTp1Eqw$cT){Xawlb9>BuTj#-$FtFM=S~#Bl~myk ziZ|u>0G?~b@Fvur;pHpm@EIF}e?Sjcw~!&_3)DEq(cddx8ya|WZR!nLugIZZpNl>! zcNpG(Ac@bMdIWuh)k8((6)yw~qJUl*v>n1%h6N4VH^O5yugD6PXC#0gIN1=G>N zqouNEP@@f$kVN{OohA5Fq7A?oB+6CJ_pOl6gzrg&7kTVnuzff6UN9UjRx~}&(aGfE zNz@vs^F}0r*9rJ*QVWitJ{%g0rzRL50)|JC4`a<|5ugOG=1>XC)m$xri%yHg4U-8zLtslqx`s>ytCYIK#b@}OWx}RlIENA(! zyg08PuWK@n1K0Ij+}2!Mmp99w_vpua_2+f{$j6OXz+c}FF#uaX^m+Pv`nZYb8Ltr- zz~lOw8ZVH;8|T;ePt3x5-KVhxwQ!%nKw_0(Vg-E-;uX$k@}&oy=LLspejX-o@O`$I zuk~J#UG|ijkDGcuAwqk&(rmTWa3v^t5LXn+MRZ zmXe(*1!Ycp)WOi$DB0l!$H4z0%|$Oodjr24_S>xDXC{Wvu*sWf;Ui0J_-W)yP`25~ z6_Oh9O-0L;-k6S$zEk||>Wf3a2H&658m|BK^zYK=8p`|3YOwJ<`hr@#$nWs=Eup8t zO3xXyY_f+c71~R?XSJa&7m%pLy=j9HUz6pA^^0OSQiJ3%KpBbHji0+FCDH|ImMF zycGYzQ`XPCmRlR9b!PWc-I(t4tbZE0vKx2*`NMbe&(|2NxBmeS|4I$}SJjyj11MfA zKknYLPxEiZb+ZW{wz4)geK9uA49?9nY zd(v}iUXr@-6+}~`xwhdoLB5{GQg4b(H07!jPe(tN+J~M^wYXhy1~<-|#$=#*CJAt4{94>OxtK#3(T z3AC6cv#JtbgAP2J@~H>qOIj(OPH|>WF<}o=MxKx#V;M5JpH9b zcw?(?cKy*SlDPIz!j_+qXOm;Ey_C>t^6#lf61AfF_frWSIV%1R@_IP4>G@ga51?;> zJM@mEHpcZfxdcub|Bvip`mTqy?<$TQ4XxQ=EVXoM>H~1B+}CC8N5|KP?i!CzE57SG zH^tV6FBnVv=+eOptvy(JW8p)SW%x*!6m+{}U~O17uHpT{%$H1JlZxRsJRqvTi+J%R zkJEYF`NL?^$5g*=mn7=p!Qe^`ItKelHaT*QnBbQ)+wgZ{c8YUcHSA~%#_@okpk^`Y zBYBgYV-gMBI6bj!^Cr*|@Eiwuw{?`cB4Z9d(|UTxSc3)RXoB3PN=PYk;8}sA}(FCV+eQ4mC6G*?T_VtuiRqnPQR8JwL)r?wxwOQ46hTndZOndQ+_n2la=v7b1HUYKO~W_n^G z6PdG_6)S7UxAA$Y5DV9;wyptb>lhIWwL=FzWHp^t^wbh>#nGPzSD#4Ckm^d3sa5oI zlT~1QmGr_v+nKwWg%?RhjZGIHK^FDO95l;#)bTfD)Z`O8l+s(t zwGR!Pe_V)|B6dh*0(hN-e`Wekw7%%l@!u@1$dLWr6*4^5BK-r6(vDA9T~ndt!XG7N zGOGh@599k4PwhFgFcb|GH6lD~^ZCuXnyJ4xQVZw1+>TDb!f)btU|DSQgv8I?7Ss4m zF@f3P3-=`g3=bH(Dgk4+Bo5pTY#7AbxP0nd0ETFU3s*lfhh#zx))x zSw1XpFi^46SOJRH@b&D|*Ye>!UThU-J(`ABl(C26zps|6zfBjqZedufZ>M`uoT9Nuh^HzMi7D^13q zntDYX{wwrut0oQ1cF&pqx15?h`v-7Xb>v15 zH+W_Adx5=fZd`Lq@@_CpJpT%RR+DdQ zF3r;W%58gU(;nRS=*#}KRsI^S_iNntY<1s1SpS3%*YywZ*K^ymRlGJZnaA9HU&Iox zvHMqW-Kc-_{xwF><#{h2{B~=``P+yswC`NC@#^EIbIa7bM!i*3Gw>Dbi_bsB@8$z} zj<5U$u(x}46s-YqR6QQo`>9t`2efn+qKSc@#S_{^?YC>HLasf$A(x)Kkh71U%gIOh zn6vFWbrAlA7_c7hyPkR^T)VNDg`L9x*V2Wrv}$I1>DfZhlhwT!PSH#9`=jvF%7mY7 zVCGgWwL)}M{drPM?_!c2zu}x*aTb+IIi8G;iV{gg&ym5kF&Dp+@r?z(li)4>0(o_C zJUI?}FquzmN7q?gN*`|-^L}h%DR;q9;_cN`z^n^?A9xa42Ivpwy@ux#gBIXrjPA+a zi3c*XHd>aLk#OX)q;6B+-lCqp^~&JKgQgxy$OO6`>Vwgn@Z@7B#FSHpMkPijSC*&= z+K8#?n~dK_eKgeY{VE#E#0$KT-rr$-v_}oCdgWXR{-by!Qrj+?WzNMcvsq@*Hci{9 zgIlC<22XMHWQD9eZs#wcGo7-r-ytQevgtgTJU2q`wfcoKTePoSs`~I<>aLfbxdF6R z)dolD2M-&~tg2iz;D)B1n!a-^j~D{JZ46!w{hR}hfNhl8`Xu_c3G~S5_3UWu9TRAo zC-7u378>y>>Ks#O6sE{CCrxMo$-T$W{Ex-Mof8Wb=JQ(kUG_HMOO0O|{a%h1G->(p z85yavc4$lPzyF~expkfXoCIm62A7!19I;ZDT&ExO`m0yyw)-WG9HMD|6M1Nu95{MJ zo__R+9KUg$`3;H8>+GZc8*X?^oxgoYF5S6<<~EO+#S>E3ORo={_sJ_)=}&owIos=E zDYN5QH3T=!Jk}OwtISPH%l>w7H9DRt`u9y*cq<_u8>7Id%J%oO<*Ct=?&|qV=uf?;OGtYY48VxU7I4TfD^_8PqYh z@Pc`WPT(d!t|M^i)x=_OLufaVdV5W#2Js^;v53`?4ClhEnC(rOJ*pbLMVUG>Pw)1ujIK>e z?-IVX2NvipDwaQhtMP4i^PN48{w-p-oNEXgKD z%wqO%dJP;Jyxzo_HF@WYPw3;OzWo(*!oL2>n2)Xf+a7N;kM>OYZ|$oxIB>A)H{1qa zb(V%PPeXgR(3I(ILrV=l|M(X)U*z4Y?fwmK6}Q25o&9BOi32qER(v$_U+UM&i!0x( z$NubDJg(=^UM!;@>veAJ!E4R44b1-GZ|<#;Uu$kn&dvHiaO3VA+`Z4psg1mvSVH;n z*URVu(PoEo^0s&{_-tYjmGb@k3W`o-+ND?@Jzt-AI!_{!V{$v9aw9ew1N>g9^8{lZ@rYG z_n*nettYZ|=aEdD*kEoho`@x}h87~)3eTHCozBd{2S2Tn{0uFu4IbUnr5f`+^u>5n z7o~T0vWw1TIEPJ-R)@ zyaBs3_SDJPfmQTIL-bTPimk8_&kSbP&adL3Nxs(Jgpa0$KEzzSD~Ur(=&!(A#>Tvi zO!8do05ivkX*1gK8SBacXPJ|C{IaBP!I5vilo0CKAqSpI;Ot`woF)ffd1~m%BPUML zL!&cx`(*C)aS1P=))Y?+TC8)*lBIakDuwuL^{)&_*V2>>9mJ1nZUR5A1F~`Bq%_mUc{mfptfxbNWiySoXIh>E*YSaGv(Mg> z;}2emy|JBn56s8tZo_W`4ydri@YV`~Cl8_bDI(oVN|?=a=f-LI@Yw_T_~l#j>Dy1` z%lBW%=kGo<)<<|%z4zq4Ji2~S4lGVcB^r*ki&y37qnEOM|FImpcbnhhbvbnPmTXYGVDGvw58jZ{wl5-T(x4Y;x729{Iu3ly#3L* zvsF&rjrFfFn;Nv6e+Qd6k1jo*Zr#Vd#$?W;??sn4nCpH$a2uR8@@+8L7p~hAW9Zh% z(TPViuhuxhpZ64`ygGQTJo!F80~3!0C@)}q4t!2LXCJ!s4DdE3J%P^w4xP_srx$rK z+Dj{X@;rEN6S|J*^i;gpDy6=&T|%iv`0Uv$JN9@HOWBE0d%^t_NrJB`t}a9~j%O5c zb7co!>+RIPO5lH5E6^kC0k_|jJtnk&CbT6XZ{YV1FJ7x&b>5OthtEybZtC1SC9Vd( zhrX{`G^;D8k22$XMjENXHNeC54&$RdJ5CSh5d9TH_#AG@;^7tIZ1~T%Xl6s=zginB z&D-Ph;t??$Ls$M9w>>&GqsC4w@{7h9ynhdN zdvbmQv-wOExAk-RE13P?XvB4Hs?K$}&-Lco9p>F%zb>aQUy)rAjo@{8Rvb-rlGj)-742QJdiEk3Df)%r$7_a~@$@gpi*!VC+q2P6m&)SV zBT_yzjwY*7aw{8|Q9mxrCr*Lu_yG5J;jckniRQ`C24~ssB38(x-j4SbD+AqmF#3)p za+AUyyi1n4rS9l8Nul2>6plP}{h5T&4;D;~JCqd;hDU8Ykq~(D^o{{)n}hgrorQz4 zFms8%>z-8l(K663p(n$8yL+OWUf@!xBbRCE?U2Q-bvb_bCZ1q*=uT55&Q4FJ9WS;l zyx6kfax>{^p{}iSgrm>~MNkV5Wq)W^ICF*2k>tk9+R;_`1m-K@1(}#l?2(5j1s-C3 zqrKozG1uMQVsC@j# z&97OL@a5#&&ME5H;JXW~cTV9^1BN>%nDsJEem$Qe_IdiBCX*$+SiO>|1yG0U22Uf? zsJj+1+_i**@-p>eL)&M>DAfNfmWdmUw~5jvD@H=)A<_}Lu-izYPxFB zuExj&ex;eNWHH09RPV2sf%!qat1L3QK2QB-7)*~tzvE!B$D( zb6!8WDHk6g0;%)qYw($BIAg+o;S3$gumNOy8 zBEIxm1%lZ@;7I^^n;*I}y&pght(dG!vD?6Juvv3(#c|EAO+4n#$LX7Xonvc$tr%?7 zt`)P}V|YEqZN*Ll zdlm0rFApyNYYRRT0~p*p=hye5OYiG`gY)LThj%ymYfYTUiQ-%JpC^6a`=nLTn;CYBe) zN&UPQJz^lbe!svSdHle>F(YtMZHi{ZWv-8ft2$PIlOwQG+~%{ZQO{Gyz_!QHFojQ3^K*EOEtF);gQ zczjQ;|L^&>Vz|LKfZKoh(>Hu}U&se=llR|xDi>~(S6{g(hv{$KIDT3V9zHJfo14tH zT9i8UKB_s0&8HSkZ(lZ^Ulu&E%_DL6m{4~eq+Us#R{QPaGE7olW|OwM0$CYslE-H^ zDuW&n&~E~n0)w&028qPAVu zpN_{e8IdU_J8iX@|ioD~163Tl1D)egQpBj~!Q9amYT z3tv(vb-?Hx8(N$iDQKxP<^dJKpLdUUN@aTqeM#l;l=M_EN82(@?HNq6l80uFB;qY< zCkM}EMrAhhC6}E5(kCkBX12K!WgdnqEHu zUKgR8PsNKApD$|AF-3Sg=fp@O^NZ5+)0lIpe#u4Tb#{Ci*WmC|;k(eD#c~~_H#Qv2 zS!NYA#Rfk6reJ1$v1MkerJlMs`lC$dqGr}HdxYPJ&J&$Kxkw&4A@kd_vV3GgW;Q4B z>Ry+^UbI&2_>|)3qB(IMb?5?Cq1LOx+8o8_X}FHbecZ;!gZ=pvek?G11YVtaA}#}y z!F04}PV#FP{CFX`cPaZzrm1mH5)+Jp+v8}e$-SLZKHxv~*(qN`Yo6FZUvrbq@EL6y zrLS(VN}BpB;cIG`*IX+HwpWPjs-(CoS1KD_@C5V~g1PP8tul9Dj`>L?Vz0=Oiq?GQ zQ_)w~;D89~pyYO*MC_vku|hBl+Yhxiem4qX=i!JEXJ;5FQM==d!O8mF$!ik!GAVQANih*RS6@(o5O9Gt1&Un{sB zZs2ba_3gl5FpCus0)~M{9^PDe-~e!0xmpujgA<2OH}Tm7hOxjM<-h%Sp624p8EZbP z_^uqh!K44S)#Krn6@wKMHNR!6OJ75=*BeaS=ZF5>zD@e(-zAz2ju)*s`=wjLI0i z=C#{b<^G+Ua{J09xqR-poIJiRqeFN=P&?1E!z~ee_OGr;@4-<#i7aT$nVY-VB#%DE z`xI^3*I%G1hb#XdH06KRI`_BQ$E~xe)o(>T$=y1u?+o3U`jWwq>jK{tmp#kyAqUSC z*F4y!IOkag*9cXJm>IWx8B$D z{X2FW=O=gfXwKZ{Q`}dq*7xCgFT@hOj_TEonl*pZkN?H%b56x^Ph8-6P5s-{BmKX@ z?a%q_UcB=*y!L%LbM2}efe+v0x4d%rgv=d0MDNlnI_@s|qcWKdM{NVY90z^d7S)3H z;Wa*l&)Fb;DELe`=xvU2g4@it&&Q{Gglp~fLo@Q(Ti4{vmk;C%a9Y>bZ$FYhzV}T2 z^ubH{3Vq=t9&<3aE+`YdT00(V{Y7|8Y0ot=K|fkIyfTaMc^X?B1Yi55x}^XkEB>KAHa5wv;WZ{@Z zc3zgywp$X>ej5&vx^~9{u5D;>Tdzw{`vr;V*cAV)9K4@H!Hs!5Md5je($U^0@>%ID zAGpO->gVKS0rCFmh$5)1hKYZSAHBxR3{1yI7(O-%>`uwXSGmiK=b9O>GxSvp%-fuc zp~f96MR>H7&EX%mkSt{jN%UiZTWdCHSTB&ewL)oJE0VfZ{1{f8QoU@GyeWKK=Au}5 ztIaS!Y&rlBmO#z}mV>u0a5!J<)a2L&Gk(;~@hsOZn41rdYu;_-+vMUd^6ET}&7X$r zW?M+kT}r-PO8#C1hUXLexX9gI9IF~OhhjI|Y%o1<3=VvQ9DBP}Mo#p~@bMnzZ4S!d z`Y`|FVLVW$;J#<*TkVsX^=TQH8b^ThF7BhW5PA7}R9_9*i`$LUQQMK`%DGpF&Q zX8zaM%9t!|Q`23CkG_9P&Odq#KYWpOMm8=Vr?>66Y?D);yMI%*FR<^_2|0A;lpH$C zTsLYOSD!zY6}a-XQ!8*6^Rhx+dH&EGb?a3*j7Q7d_OvW*F32qPjj{P5nIhNUx_nYD zJb5nHUcFDgeg)lbHa%U@T&MB%pavXB&J+@lE*?$AEL_jIS0Bm=IP4g668<6hUWEMt zjNc*tk@$n@{Rn0$qYF>9M#K#_R_VtxL7wUOv>id7eo* zZLrk9VdEHL4KUb)*^1Zx^r!j3bGu`Q00|{F3E_R{bM!cqVl#NFxNq?InpYe97618L zx$g~bYy4omM~zp|k_S>#(7J+tURoQ_SVggZUq~3fN6b8DE=mbKT~<3@D#R_B`Sj3? zGiP&RK?+MsrMbCUB4SOFOq`jIH&G6LcddP`%x}XJi2f}Xo>w{Ga%@}}`f|M0yK5yf zj_XMdez#nc%`S9h)F9U;aUS=Thj^0<)8v@u6;_f2=BBeCbO}sBbguJUdoxtZMwhP(4< z)t!-lgU#Awtv(~#>!seMs;5>jQo~mTTr>PfG>--MjOQ5~HyB8**|SeMZ?|U|xi7c1 zPx`0t{!HHeKkfzQY9F?8=Eee76}L5KRt)v<*B)Hetp~UDb=3RCqc=19yEvcQ4^92X zU(fV1FkE8=#cp>^U2FO3`JxeeZ zv5(5)Cc1*e!AZwI{3 z!6P-gra)pU@CE9zpiP6D;q@vzl4M3_Hl01j^?VS2%|2?sZPL%Ijy`zK;RBO+V@$zi zGJkG*Ql@5SWO;2(PTjc49EEi_`vn;~G|mhQyuc1EkYgQS=G3h8t_(91$~_}$bbW*# z<|TAtCE%1Dy;l|<=ggiQrYC$PlAM(Ib{1a~G}YaQCc({<64h}VZVI zp}}pt2X5bzfYyr=-MJwl`7V646Ud*($w$!v45U)Sgxk(UBLXJ-N0L*ZRSOFDWsaZ^ zH7Djf;9C(AwNK*lplYBtFp8Jw^eXeN$eEXp&&%|YahW^)e+4DkwPK9NhV7vm#} z_t*;B)s+GkUa2eeOs{53+mfA?Elu+_W>Y)ZI*6aL>BV#JYh1L_6J}w8h&yVhOa^>CkU5?pS}G;K7RFF-r=!3*RRNt!&@?hzxL$j zww!$WRJMs(jz4-wPCxokj^25O=k6(Hf33;d<%{SaYUGVDd|QfpB)syl1XrIDQ`Jcc zQ2eerEB=*d#jo;=gj8*de>U?~`g_4@=3d(HA7>6sD%@=VIb?w5gB=nZ*F+^pa^i1^9F}8Yco6=4j#M< z4s~NT&(Y&myQWwl00t{&8<@|2)sOkn8}1MHtUSC?BUhYOjD_1)jkxmT|Bl-p9M`Rh z_h}+eHZUFx*VoYceIR&jB5zilRovF&eaN%@(a>vrqMU%nD2nI);IW~<)4cn&?oMZf z27>(oVW9?Q`w?51^myWkJ$ydZBX}4s&+?tBmuz^9y_`P>Z=cm`*NHzj=uapyzAyWE zUI%(l! zG#!I&#&;|<)r(&3Ao{lG4Q%#h=3)$<)ztHvERxvFEK+*?W2;QkPHxmOIYutGAUAJc zm$%SMXierOddM@>yEhMS%EqBhSpz%j(QlgV7HW7|cyRU6f3qL$Qx-aNm)v;vP+qUXWoNod4xzcLn2k`Q|K z=-FyOZ;W1CXFO@2wV4`py7qGQvii8+r&=;NmIAyrN)n`rI`Kk(liWMGE}uNQE}uTT zFCU?q`Skfia&L0(cb||aaNQx_e)8^9>eBu6B;&EwO+B{LDaoz)oDHPV`-EQyUMi*3 zfjj5+)4xQ$F+Uwo%xZl5ZS)*c8z(=Fp|8fAlPNis#nj%=i)YdEQt2e$SR!xbJSACD zgcdip$imFuIQ*z$B-x4Xyf{-*=@CwGQhyEwYEQaVrEIc|~2LV9&l(CtJrg8=9+l-AM`iW;3E8@LRyOXQkb`%bjd^{8eVej=>xgXLItqt+ob7R00@%3+lQ|ok&WwYZ;{(xJH}$>weGvJ%^U)bMT@t6^$3{8{);Ezx3>+B zd-2$stejYvnTH@rH*=DE@Fp-8(UiJ}>_jU;Tg76CsiUYUt$GCj` zjJ$YomzvXk`S9s|qt^WqaqtKHrrvpikL2U~a-Zwz$>WD*9#5?O^lKHQVTvIOv;mMDe@fHx)@POfDG$wrM>!5c~=O%R<58AaKmcDHXd} z%0+8F?ZIvJ6bm5d4u~cPjS8nG6wQ5jcU@pyP#BswmSVOEZ1d+ejAOx5#aOLvE3O(G zJddgGi{`QV9K}h+ZvPO)RyQZDSnJ8FJ-M^zzL7igxPj;3w$T@+_zkuidOGk|dH6`!4I- zk3a7`K7Cwg%CqUir|yNWvSwI$#(HMrSfw3)J0YHVZSle zhK@YliI%mhj@dg^)CHL*?BM!VmM-~S`ON;Xq79)gl0m;h3jB8&u`rmO)Ub~lv=9AX zSKQ#C3E-;z*ZFsnV&03?^`|53G_^{#m@^@kqoqwV|N*t&dp?;1JxUHSCMJ!;!< z<*I{yt%3dgomc$-(B7^NNRR`s3SQg6%t-S{6nQ-QC|;{*7(SQ2q^x%4Ytf5XihgT; z`yeywCuE1OzwFZ*5WknMw*BOzN2LKSJ*UDUmGut1J_qsli<9P#N?AR1-1sj4&P(;C z=p^H#i9^v-z)R)S=99-o<4;m2^@}xP9j%doa`etM^gdD3w(n<-5E`)1tR%Ev#c-TQ z@F(AplBDs|l0JGIyx)SiK8Sv=6kWGPmM^bJ=`!&EId@nQ z*Xz^}<^jM{gVkFn;Y@Gcl}9h$kq{ql=>~awAoj^jyLCew$vZ6O3hj( zGg0tkSx=Yp+vvBC=MrGmB9DD>lDw_vo4nBSM%#uu=pO)Fna1~cqiBk^B(v?-> z3NZWTrW}Ct-Xu2Jx_OSc;|iEg{BiAqp-bDk3YUK8v~1iwFU#l75qDhUvGc?jJm=0C zw&#dRt`UD+k?k87O^UkH_K8ioeBr#@A%?qmCa_BI%EwoB)9qm$$AAxH3B5Y_y+wjNjZ$|T3ji%p1oQ;Ps-|3;l z;P*(a>_Y#RfSxI(`+y|&9h20d6U?wVD`}%AC9Zc{;=0zEH8LlmMU`+Yqj;^QNmMR5 zdUiCr46EVotvq-zI2FWiQS;tla_128;$ZMdYubvd25ys!8rTV@ny70BM={fy6%ymd zYt6p{(E;de5EGgJ&D8_JYxQ)|9M+%LG4Pn%inEH{%0rttzdldv2~zxN~`bv~sFR(|$6=Zf|M|DfI4F;6GZ{MPDoZ6;ToRiBiX|B3CGH z;{QobQr}V|5$MwV=-=|fS2ofDKBn8LdE@Qoze9GJn44y{ihr_IVjXsR!@Ol*@S75t zhIe3jG+52+1@96Q^_Tb(W~+kDiOuw-HsU!5Zl^Y}HSSZ_uID;gw^O2PBV^?K5oU@u z$}(Eo)vO!9b6PxpL6DjNUA8*wA``lZwf@{-L+Q>|fa$Jza{^EW^VLtk&LY<;)eUjXYR$ zVfJhOt@*Fc5mTMH;aGQKzv08a>jTv+igDAKE1Amj@ zp`x(~amxRG`z$_f!&t(O24oMzA}=z*0*edZGav_+E`KO0lH(r{Y@*rsGEvpN}rN z(k8XlE}0r=k;{iyZtmUFz-9x!7PLduH9|2aN-z!vzvH2Cs6yv|AjdLb2CeF^yWPo zI(0?xvHEDXn`*UO!j3`@c6U!8HmGY@u<7uY8VA%!m?xTZvbCEZ09Apmt zQCUBGLXO_J!r!=n7J3a$JUz3G#8|cE__8o_llffv^D$Dq6iqC^jFQzv@EfjpEltYT zQl zIcgNMXwkS`$o`U9G-o_kOzpdvx^@}+N@s}E=6sk)61I1lH@?u?-}&#aZ% zI4PS=V8wHveQXQZSHx#h43A$1Pw(udCIlB^FQ*SDpP3&u@lrX-{LbNQNrAVwRHosP zf^Su2qEt`YrDiURx#aF1fvh@<*yuUT1k=g~EmA#$7GWt>s#m$af|hczgr0|WdKn7P zp;t@KXrJsyC)CUTeqel9`i6UD3@>W!s|msHI}E);7+S>8IA%{4k*SStpf67KbAC{fROfM_(ug?6T zhZk?d{_P%gM$P<=_R@2JUb3;7@9QwNrL)8uFPT4cM6C7gl7!EJAG}atI=YpWS$Z$B zB-#~%e-3@Vd0F5#^E<#u1GB*{qmHe(434XR+HZAj1HakFep4v89)%_*A%Q-1_;6it zUd@q>SRjyCAQ)~SNbB61b1PnJETPW_|9P&_ zf6nvuwfr^L2CsE#|Cqi{_?BYgy%pzTFe&a z*$y;I`&hTMu&O(1;4+v663D!kAhy&vLiyZ$O?%+ge=oa(@V&LDzc}-73;!>B@7W#a zbtP?ode%GRu_cj2P7O4=(Fl#4bIutc36RK{bvHT#=)UVz?b@}gn90KR^miqc#aPY&dn0;x68+S) z%b0DxgL&z@2otd^D{i%Cw44)C&)g|`2 zXyO|i>voXL^u5gd*>mV1K9ps8O&4uu?;b0wspcG4MTT>?EnPfreKYvvsH5g~WHAqT zj~%{v*3NJqzs`R6u_xgyV8Lszy=Lz*^Yf?g(kmwK+E0Jtdc4E9E$#e|;9WS6MIJTr zZF$W9H{TXEiywO9}V?3&;I_*;6>k6A zJ|KKq&n2wZbAP4h2CrSs{A=76zXr2;pWzvs^258HF6FpV6A(uK`WN)Yk=g#spa0zX z^_1cM!TZclV|{=Y@jgGl`u2})jGp1_{$gfjbg|d&Fkg2A9&vhX=lCv41K-2UnlWa; zF}JyVN;5vv;Mei+?KC)F3%$r~^!as=*;PX?GJRpwLCbBVM#JZ9ps&UDG9UITJ-3hD zbIG1TgZ#l`_t^_iJZLZBLwp%O!^=-T4p*S(?6HTed+#6`T$EK$BvUho&(r_aOb(bb zF`Jl;(7vyo870H$)SYBU;yFVzpFVm3{gJ+)k?q!l9<+FP#g1G$N7gF7O6D&0O}0_T zUE+L8&6D1)r88%kD|L!Ki9YMXL%wTb*pAXeRogTNw!B%pvrkMRfHptO3dX{-@ z>ah)AN#jb2wH*q8N#NdEwH?0ysLfMnF6;-#`)cj#wR85$n?JIj{{GMQ#)rQp3*;yE z=<_ex)yE#EznqLrdMNi^rr&050sr+7b2aGcs-hoGEEEk{**HNxgy8)To%#` zT+R8g6@UCO-e2wb4(6xr#D_+9$2wkk-b2rcVsN_H`cITu|LJn;gFknl#j|#%)OyaA zSs$Fb?;M=^ObPpiV(U4HFJyzPGjOeQlUZV?Yr!tAV-8t2zgO=uX2PtK;|i8Hu22(M z0!NP)SobEs^QsU0#lOb9@3w>FBrQ>^US*#E{&nGHYXi?)SdHo#!<*JDOlHZ))^U{F z`c*vX{2iOgjA=$YZas>B;0U>JhxNBD<$2q|c;=@Z=6}6HcH;o^g_`MiE8$#626wQG z-Zp&Q$wBnw!g$MX&14=`95dCx;-g;n2q9lw>ni&SUZ=1pn%Z`n<<`ep4ZUt{N67@@ zcj#DUUvSjN>vMnnbjo<^U=Pu;8sKl6#rp_a`52kowPfPA(sK$wDC}d8!Cai$*-|$< zy0({nAJ5yoFN6IP&v}Tv)M@&nnq%nc!*kZ;W&etIeg>V0+v>@IZKM~jl?+AH~ zw%gF+3^l5!?U5ILV2_Y1`0_jN+FNK~FTVAS`^&yqx(}^bVF3S{j+UN#*3@Opzr>?m^i& z$9Z}s=IKLVk34^Ff_%4eyl=5+uobp;?vy?C%FFiG|Nb9)|HGf#voF5LUg8kXU4?#4 z7HU~KbJXagrynl2m3ch%cnIhzPRnM005?t*$7OlI>J&Js>)jUr2H%9KA+8I4`h|7q z3TWY3`FUs#Ij-iL3`b7}1Jys4;^znlRgRb*rz{uMs^!lXE~~FuHR$jXMmpRC_oYcI zGhDZY@zZJD;I!lV;HO75XpUaA__VA{UMHl#yX*9O;Ehj$b1UObdj~z2i^$Bz1grDG?=1B4oDt6d@LEh(_+`vsg7U zYAbi1Vn0~J%zAwB4Tg zsMNkc_`ub5mEHLV>e=F@;e5}Khg=@>fAwxVZVQHLW@cFP4%e(hJUN8j!favh7di^3 z(WU16{r$kXCFZ~nTF<^F>*75%43Zm0 z&gsbhVRY18^mLIejXq!5UP6tX&&6;n9tvhj;Hj){D<-o*vvL~fm94QsbcLY>GBW9h z>RWEJgO_H>kZvQtV~-82FOU_&euVj9&E$-zzp3d^JpEz(ZeT<|obC97E6l9iu;PJw zYwc;U!$+6xEH&2)58rKFWYyyuNe@K*Z9at8|VD%4Q}AeU(; zS#ZN-i!7nh;R$QnU%73NWJyrQSVwIe{l|;+e2;$`;HoT+rWAUe4Tlu z>#6KX;NY5qvKO%X_J%4bxjV zX}w42`@&~dfDb0WiR{svxSdUJx_YpZ@oV`D;Ro$O<`uIiV9sjm8Z$lCLb%<|-l5}g z0IcP6+77l?gWIEECi{&RFuNW6ZU?7@*=>h;Ps}s#VviEy`kDN%!S_SVsbjuTppH45 z9h#TKETlFxCjMqwmCU>wC?zXC8s7yoS9z|M!|ZAJ+f+>X$rfkN$?F!9DVX1hH)9XI z@yjec^&JPZ=*v4o-vXIwWRy3MRo>X&OwQi`v!14HkpKAreQ#ypb9rM0p5kuw<3#G) zyG!TTvBxl=yb@D#%Z*s36a!ge-&-@IKGYjZ7^Bx5~&b znkuBflEr(j-oy77pGx^`s?A&&V@}$brI2mjOpo1Fw6Sv!+(S?3llCyaqlcb;8b9Qw z^|04S&)|Gplx>SgH>|vq%;1(b`plVC)76HSPj5Qe+FmdCA?yX0Q{c?5XItD_xF^mk zjJvty%~FnFR$e~!0p@C|&JAXZ3wzPCH49VMsYfgsyFm$QWxLUWN2p7jy26tEP62 z|Ga1@&2om6fyn&VD_5+8*<;Nen3Ii09r({+UwHP1%MnuznB}x+c&)T(VP-gwEPQl&IXqaoDAKq!Q$)JA zdbFgUhk5hY`Qf@9zO6oPcjU6mP|;)I^Z%YjNayRqim-M`$ ziT?_Y{qy(VcUb-Qn{U`_WJ12m-sMNES6_L>X%Ihn;RSo?rI+kEjt@Tb6tfdrIX{vk zIaffgB{|B>0xp>%mvWA|1LE5=Da`(0#x@$bu)KPjzFx4qc8=M?^k$VWk|z((F6A6h zI)yiFgnerzzJ@AhZ_E1r(CvESw9mCsg`!4>s^cnUJ55jqS=~wJ$o-&zK zjm*ofVt(eX60{xFISI!3O_MVs3oGkSFat^5GJLFz4H99(Df*+;BYp11Ra?Dq3C(;B-}558Z=5-IBb@Jr+huSlG{XFV4U^At>dHmD z?~m9MFFtQSK9BjbGUE7{+p`;xg-w_}*zd~kek z4?Q16mPP+~?eH|-M0%Eo%D~?Wa!>P_$&wD&Z38#AbIw3#nM5bv%mcU8Ck8&RlHIZa z-v+;1*69O-|MsA_cfp6-jxr-DPRrt?bvBW3)=H%^E$U zgVcKA+x}v>iTHLEJuP^uJ=x%PQLL4swdHp5y!g>O&V0cb4FKHlgl~5pP3L{`T~E9AV7G0(YPeXrz3 zviB;2=O!008+%6?*T=xY+1IUr$zXpcT7B~hb24X{W8DZh?j{ouPiIaqIscfKj?uq%i2mO?bR*{Pj_pE+8nK}4Ox{M07$ z{wC)a$P$odUI=cJTTj-8FUWTv-0_3Esc_^Ja990X!f@fYuroO&#D5)bfwjWp%-n3} z8~4&*B5Vg5mO?>oHCn=QZ@au8*Cg_A=@<^NRB)z|;BLfk8A4N!9EWU8b23Q zmC%R5%#ntAYZw}_^kRB?3v$48G9QN1!0ZIe8o}Qn-i;TnWRe+jGw3#h?CHnrIPZAD z?g+H=Vq2mHIkQOSc{90qDzC(g4Pc-z3f?f5_s+Qqvs+P!3SJ@Vvt?b%nJvp3&) z6W)!-9B%67jQs9b)U@%EOE3Q&b#B)G>eU9b#lz(-5976tny)2n{gQmMzkUqH{so?_ zTr*vUBMZm>_7@)WXKL9T|N03${A2x0efv*varE=A>)AIkKcta|vQ~uQ!tH-w!tZe3 zn6O)Wi$6&h|4@BzWQkJ?c=xRz+Z)seUPb46{)Ol5>F1uaXP$n>zEADok;k8~haP>@ zzKd@A(BqHW+57Lo=TtzZr~l}>@1$KbM!%-ue2Q($TvJ+W7{vln=e#b?}aMsK96pG zj+xoVgJ=fS4;wwyM3{*I?&h|&l3B*wGxFp74TIoKJD-OJ^EQ&Zu(QW}HSFv7-UXOr z(R!eS+2(ncROdqr?jtJ;uEqZ{zc-WKt9&?hDq1?&yiT1Q+-^gQZbPqbC4WWQbt@R& z40g63tA>lW^M0zVWrO#$md%lT^<&HzKgNuWqa|Qq4zmK|+1qe##7h&GeTQW+-zBq> ze%BoOql(CiYGJlb8`+=CCTrNAWz`dC)#E{H-A8}@0kT9p@Y=x1Gpp&N8I#`6z6DL7 zRa!rot)6vp;8ylzZD;{4V0o)s;_lp!+dB{CF>5qv8R#K3!xPL=>oX4-=%s^YmRtir z)oe4kwmbpa4>TX3-)kD&=6(As@aMvrGTSn#m$NsXWR~Y%>MQraUC~aI2YKSsdAoG? zHM@cz_wwC%8t^%ux^T*Nj_$xqO->qKF)!YZs$S5X< zO&;Pxbb7oJsk!t}<)(t&U_mzCqulS9ulx@B8OZ2!xD8$}kWDuyO)br4&d%8VFFb8` zKm9$s`n_kEKmMFu;e2uVu_x`y<4>X;J&I572EP5f@t$9|)jRJaE8#42o7>T2N|~*U z4#%D=6@2x=hkamVD)^h?W2QK|x#Qm8nfzd0FwkY6g0t!u^ZN0d2f%h=Dj1&@q%Kj2 zz7O~I2kCd`IRm-5^u?*>4UW^_>`li5os~^}HsE--IJcWY242exC)`v$UA5!GIEmqaATHg-0`YEqXQ&@@#^&oYxTnL zaE_~R*m>IF+FmcO&+>rV%5`)50&v@D<~OllxUc6)q4w^RX749gsXEQ-hVTc?Y^NrX zN3YkE`N<+p@{)}LZYPqTGJk5_#^>j4Zeh`O&W@4AKgygL<`vhqSnu>CTK0aMUfgRX z>@$1k$;H2Lf((v%S079)uEyukhGx0P=1##=)Ni>v9?YhH8-H2_*j+N3XoWM(1;MXW zG0pc3T$fj^fPS#{!`*m6FQSPrz_~jeZr61%Uy;?0|E!7YDw~?g-eRx7`C4EWDWFiE}mYr zm*4%7{Q`dad+NdJ*LFE-V4(0>d|Q|p;Ba-*4VW-ZeMNOZ=M^!f!BNk9T{4(DAQ4k80aGhG&P! zn;ygnm5-{_@3 zdKa0U!=VhEm0gy{|GkL+bIB;#5ag&O6>qat`c1_fiYvK|8L(x{Tq>_8m%OH&nF(_$E6L&G|I7U{O5i5dnRp{}=?N{hL}nYN7Z)eq+zKn{Ti~4OFJk{) zUdB12&k~#K$Pi^VJm;js5%z7n^**S*&$Yl22Q8`;PedP@6dQIP(t;@ypS(!kOK(m<6b;qSJ!WSg`5sx&-?J;<`+;4?Bf0+A1J-|h-O_sct#JF0?ZiKnH@p)MK^J^y z7TyZBkg1YGZM&(df|*t=Ha@kJ8Bg@tpqq9uORtnn&dTNrdd<%;zljM~1$zXiFR-3m^Zp|e)P*~+uYgsHSr-fIv(UOWKaf?Kn93EsiAyTI-)FuVgVTRT5HEZ;yYJ^{X;Oar6A^bPQG0~|f>w~mvU z99bK9%;@tj9>g1iKPh&X6-#(UD|*dn@=|@Lk{yEN$n1 z*O*WCZM}K$V^xp~SER?c{$CSaO3rW!{;{k86Dtv7aB^}5ozaKuYHEA)w53n zT5pz;ff=vgf@Zys|Q zi}BWx)s~A^nN?qbu3XA|k9BLqBi1vq!&c62*tvVJ+J*bbczGV2eDH2NiBDpf&p>K0 zftoR1a^`WSWygSH(eCJFo~IA3)Qhg|WB=mUDukOC#E{8Hy%SA6mF44pUUZ81Ah=x{ zL6#x@yhXV7A~l}{bhAC^XVkl9&(6C(_8YIhW;b4b*Y11eCmi3R=ld2z{k`t%{}Z9#H&>!)-lAP z!EjzHw73s@2QAk-4lcX*1K#`6gSXU7w_4x(3d~Po2Fi7dD1?C&weJnRgIcsXkNAYvZ-&woB#S3 z@S61nyjmIJU;Yt%W&I1U|7>4<%uEol_{%^277YF!{G0ms$J}2FUah?GuUOK@LtgR_ z@0Qjc#%*D@H25&T4`-$Q3$r!XJEZTcr%fLDkMN-V?7jD0?fQqz?fLFGo&J^F zV)_fq$+@k}1$WVD%9t~ZUQg-AF?39a>#He4B^BK-Z_u_o%g@XjZ`2e+*O!fwz zd}c8hu&2e_l*MZlHp7kZ7)i>Tc9BZD%mr1H+xv=nKN;3_44%D7-GhBaEAO#gOFVqj zhYrAdWVLUy|KNRhZQxZ~$z#s2vOMWq;Qt*@?o{1Q_C0kGd^X^)Ytj+;JniSRP~#&X zs+al!v)b8PCTFB@{-kekaE$l1lNp?C^ptN{2YG%0diS%-{N$-H)4c(W3;$4gQ-Njk ze+U%A*Yo12RmM{P#ebB!jd~@S7`@aAdhz-8v3lvT<#Im%%e*e?lAZL~qA}!si;285> zk6yijm*@t4@eeSc=AxatkNw4?57=FBfpxqonFXorpO_)W_n?-&ZaTOv>{H*C>d>jG zNrQ2zV2Jv`!ZSv64FBwSF1V+e++KLD__lbv@>i6(l2d`dj=FuYxX|^4g?h2!r96kQ zSX@`VU#>Tt%R2gaeQ{?kVZ1QhdE|Hx(z)e5OHm!3rFyvI$UM$@>fqu&adNlckhhG_ zp6-LDuh$Y!*JWL&I=qMXt=Dw5ayYpMJ|3#)-+XUiyL!UH{bT9{7lwzlbZ+BvauToY zbO?Akb%sC%GmHnxDDOdM2+{`#-p1l7i}QS&9xpuLoMSq`Ud?9raW1XiF+d;d5pw+N zEG{O>BBG-$HYe9cnOQTyY-4|6rtKzgB{P#5q0F1D=pqZUufu6H^P3CSI!4d0aCwAT zU!(LJ!oP~Z?xJxx5Vg;eacWY+@?G$<(MYc6_EB>A$(3BCm+Sbw57^$-DkC7w+m`ZyjDwAr$8K6jG|cv;YUW;F{M{3Z*eVlI~6C9*+g z=vkcSx&=SASoWICHZIxC?@T`Qt3Q3+KKj*%&YR|DaifomYl~;gD;AzvEqr#pU0~^7 z!P~#VnZG~_7tVeK57rWHe+gcH1=s$Ea9bFRHXd5|!olni)=N7N;kV<@Jm2T;@mvq4 ze~r_;ekd#DH?D_F+PZSiKgN%)>=qq0|3vTmcfb0z^V+FyFWi2cTK=nOw9mn}pFrz+ znE4?0JqXXfk8H=gZrFLghZnAr!Exz|4Uv1}M|bq&S;=qnT4`S<+y&0kLyd5j-rzmd zIpGSKEFqVGS|OgJ^1)&^Te7fYz%pukSQVDn&3ud{aW$|DJnDwy zmh&0Pr&ptczV4b1W?9u#;}I$&&k5|~T$Nh{PFK-?gKwy;8C}1rhVwYNUudgc`v%a9 z$Q(p_@Ry#Fq+=&i)0dAtacoG;9`~SxP;DjvBq}7yNAHk+VggIe)1 zu3Hx#gV~#0hI4nrp*z9scJQ%v9SvF7E&W{nH16BBk$`RiW^-)a$m04w_}~OO?ijV@ zHux_&i~ZnHEA?%9Rg$u|;w7gJSIN0bxLwMu18&PDFQN&*RT_9%I>0^aK+t{S(z@WSvGy-&Sw>haodw6fo5hLg7+ zMCZmYUOxgCt0O0Hdk!AT2xf_+@pF3%M(2O%1+RR^F0j8CL^?3f;JITf1 zTv^jb57kNQ8yc`7w9N@>GW+R)IJ&VxR>cWhTwbz~=?UxJ*-vk6g8B26NgrhyHRQt1 z<}wpClPn-*zB9Y!An%7gWgR}l#+%3bCA6k}XyA)@==PJ7w8Z88c**xCG9!mQ&OY#) z`gYBJJStpYPwv9(`9aRJ_#F2#A9jM;6+WoaX7s08e3bQQ;U#1e(KFoGQ*Bip=w*1$ z7s$WLV18R-AQH_e1Fti`a}GKfoLSshdU+VH{Q<6%zYGiwYv#_cCXOw9^uoQ-m3^t` z>(sAPc)V)T{w((1g#~!*(AdCo^^B<>OV6VoGI3{NZ5X44p}MT=gu6O=$VbuAW4z-3 z-0tufEO#|;einubSH=0=a`)A9@mTR~j;=<}bLz1nj~Untm)4%aVK#W3F~n(5N^Z4d7OSupthdu;k9_)6zbvP>6w+(S9;Yi!TY9nD>fN@JZX!? zdhVbv8_lJ>%JSHs2I#NKp~l!TJ!NZfvHsy9t3;d3gX{PzD(xVe>im&qybrm|oZW4i zoNv?XD#wQ@I(6mpZrhXd(Y+0$cy&Ei!a#spJs+8HSBvHdc>~Zf4^P2_lBLh3k~iv znamf-&ANQi`u0s)auNHCDFQF+-234LO=sggGjh6_ZCqoO;Aw4BEBTnp z61jrwHh=Iiesw$=aP`J6_B_3vE@N_j^_cBCblB;)-9z2Ba&E)gcHzrHV@QW*r-3gS zaPH!&94oKJSB;+9hDKk5*SMe@&nVbl+ggF&?N0o9t=7I&MvjTRt7S7>GYZa!8pW+ScI)(@9 z1by0$+tLHRNuD`8Tln7T?koHbdCxnK(LYVUyccg%8F`zX_|v;L@MsO zdFHQ=wsyFH^QNz&IpDb~q{lU_j+!&Ip4=vSz!vJ!gwV}vsms(CvQMTD?AjUY7-pUw z*(FCVow74G?z9_EJZewB@)F+dC+z&a*KF$09yA>Gxp~p-IiswKIz`6;>iCDL;ji#n zJR}c0dr$Oz^_R6AreAV}{|lEJ>3?WApxH3gby#)q>KbwDWnZWt4c^@db~o(@+wr>3 zoZDez>pSU>9I~k+6V|%D+xE~4-nCI!Vz-79r_U-)R zJpLwbtIjP={OcOF_%qAx6Z9OsR=8g8I5$|GEWaIEzvm{eRxX=kdCi6zbD=bsN*HTd!iDzFnf#zc1N-|$f|3AXQPAG zH{<&%VD@mc4KLI4zh~Np@b31oC#>5!Xw%0xn770Eu7u1fw7y_4iO*y;n(Deu@c-?= zBeZaQKRP*mL_N|g$>rmFmDR%cY>fKic$Z~#wZV_^W0JpBIED9olG#zy?Py!w^q95c zVdMKYE}t2C5qTLk6Jypgx1H>)JgcRaT>(y4&M|L?89`O#$duEIqFGU8^W<&p>E-** zUW0RNIoMu4;{m66+@3D_6L<1B_KkCS6`vQFa0{s04$G_j?+3v{C;@w|JQ|JB;uX)VhZsNA9 zar3y(!1+(%*`J}gi*JW&>1gpcXM2VEzeD+}@}a2)FaMc(vw!>HNA}wfLOwM43|(aYh{@nki|gU5+{Zah3sLKYqmIC#8nOXqQXHe<^eb#hh_%QBvj6z*Yk8=dxq23R?rolU+vcZUl+XT|+OTHEH}wx$|KckB z2IqMHWSdhD&w~T!ms2CIXO_nFUK?0kgI^z_rr(U7Gi2N0wI%T2L&wRnJUd}MD|k3& z$k|3qsAuNbaq=HmF0R-8|odHJR|D-DG7P;%|GyPG7&O zx7Mw{!TB0N)wjz9S-Zz zVIH0ezInk;@p0j>v?}$4Dc>{&oK6N?z0{in_|vo((CvC2J-4t|xoE1H3zMaHe?2Rd z{eBw$GIu}l*5N((@$wkQ#o^&TUQ=For+dpcCLWD9OwX_932XYo*f4I3<7*G%)6$*; zj1>>pej!vh=l9Tlf#(QewD_|0e0kEre=RtANHYhcdCfR<_{3DWliMGl%li|ks|mO9 zg>|B%!)IcWBA5%u{(v0Xxa3&8tohb8K5V5`Wma5LU@e{WbPx7eExjQ_!+m(U+t5W? z@lcGQ2jWk`^S^ulC_Fsb^1$%eL~_s*=*LEnn%;nK_mxq5ini3UYoSgS>zE_sXz)Ls&TU@o<{s0?%*ba2&qW=F)G8uR1y}Xc2s8zY`m4 zTVu%&NQ8Uy-O`%9`KaFD#E*(84jn6!u)XI(?Yo9%AoeLY5P*6>eZ_w@2 z1KHG|i{Ydb%>7zAN{w@$RWR4Nm%4mA-k_3}99up$#a>Zf-*g+rZ?^Z$6ras9+jY1R zpZTcGUY&=dwUG5$Pj54Rw;jyVp$<9Bo^YOh?s>d^=kC4l|M~Ovt$oFAr%kLfPilFR`L?~butp7j*RZt>57ST7PnO@Zjn2+kNi{l9MILjh zX5o5pV(MLiVm$Q&WMI=T?#qD3W}sbzUw-Px0geITvN$sME&W_r=Lds*Xy;+v_KS~- z(}K^!>{QqHB~A=3b63#FmE&9Oadgd~;g}mkKd#xO!9n|x>m>FDXspwRNvz72-<~q%wlhaF-OTSS0o+2APPk+wp zBs17YZ2_P6p)1Q|@YBz`P;T}6s15D`d#C9ko+MKh-*_=Um&{RPq0U{7H?nLN9c`An zJz6EY+-?whjLl2iN7l(fj3mY2dZ1YYV@@Yw6}%UkTHxX@B)Gc|cLKmdek60bajvZ@!`W_3QTH zi$4UbUnJZ0S$q8ZPuZh4@%jPq`o=>K+FkJMi`Vb6b5}0gnF|-~#JNkhb{3v}idht_ z(bY5jFV-xu`?#g-IA-4dO-t$CFmKO>`TCAoYTu@%_HLTLXVbi``)zAZmEG=-p{Img z?@aclIedQL&(ZMYhyZn$z*g6vkPytWJCdo>pqY+KAW+Y-G6{09FM;w&;g#Vu%%*to7H;3-+TV!JKnwh(q=&i~ye<_l=kC3`&{21h@k^ghOBop4 zh7X2X8vSTz=u10&>5MHOS+en&5quoX8KU2O@8KCsmpx9!_&x_Y zNBEc#mWn4_9(I?}23DrRZ^K;K%_ZY`g|QB=!EI^h+6N?o*~%n!-ZJnyjJMi5q-vib zKCa6Sw?mlio;Unl9NlyA{zJGOs)4(G0M8fV>2M8rzVn;&-W+b@El;7QEgzcp8%d7q zgYjUthx4W<4WDW)y|DNWiCY=sbNWsw1$sfQP4M z>O9Bai2KI#JEoPCk;S{+@*DB@G?X!~VZ=&Gc;1pA@0Z(2ECjp}J?qHRgGeB&58`G=u-BH*N(3j)^;`N{v)H|>0BfB6_6 z`NwG5>gD3H!)>q^j;-Z*H@N*3Jlf$lSpRow*d`j>d!*nd-Fi$VXu66S|>;|jB>|`+9+kf1AU2Ev+gZ3TjK;FCzX3YgGivGrUe2$S|c_i8P zk!1PAu!l{`Mu!RJqM7HQWhYVN-bNie!lM0gTn9hS39?_z0@FQQ7sGRHC> zj`P@U(O`Wnx_v^F#U#d|o0BKiM8;zmHJ0{z_Nilb^c20+ePn?xHIN%djhAehG4i98 zA>FnwXrsrPZS&y`8>HW>X=##u;%+{_gLnbRCMwUe{*gX>WZUVdJ4-ET^BZx_zQwt3 zaqbc@!Cw+Z9&v_cw-?y%!;8#fyN?;LXKjtypPSd1i^jR+3faSVK0(gIy*KR2Ll2NE zbQXPl$@U#RV5=v|_l0*Wn>V8*4}UWJE(br9ur?DO&M_5k=y<8{*kP}@Gd!3ct~78x zP4#Oq)DH#*gf+ruVK$heUTvRpR+tUuMK{mLC%+txP1!4cYT%)Ix9Z~HJAGdAwuujW zsWXcsJKY^j^>R+~qG?NGcYWL3*Llg=Pqm?LzwkNnK%xn-c%_ptB3JqtL~<4>(>4$F7*6XM7gV`V4%2PM8nxo}({=V-@&c zxqwGwM!20|GglATkAL|-oK{&Y^k`Gl4r6z?=UU!z@o87H28-Qg@cD~Rsc*xvrIqV) z7`MZGJEWUSI~NBB!^Oe1J`F#Yv~-^5CT_c)FKP8G&HNT_Ykt|UKm5RcL4Vhq@4RI% zzV;(~=9QQ1$>)DyPdxLKJ@$QJ_M>*+Bag5iwtHE3J@9~CL$AGh4_y1sd+qea>&&RQ zWE-c?@I5;n!tC`8G_Y0cTO|8)$3F89tXfLXx+Qn6S#rmkrF4MZUGVQNa2p&?2ES9g zS1qY**uL%IbCsQ8iCMYy!UQdv{?bVH+p*;3MaFM|8*c?;=|f12f)_{Fw%Dz9N5t*6 zHHzC?=u5owg_r5ye#P#4?p3?@*_Z6bv(GV4^{N$B z7cnoA{(8Kr9r&QKsDY(}vBK_D@oadV^Ou8};;&w6-zn6-#i70Qb)<@W;~x)D)5@f8 zDT|CZAN6eEw)ncRQ%lzc(D9_bd%#xtz&+x*aBHV!3sd3j!cfg3@lsDqp%*$8%ua*j z`*}Sb#l=H-&OSl!Q`{TgExea*p8{ql^PauDr&PTzHFDPz#`Rz4s`C2kL6hG-EmPii zYUAt^uspKKa`?Na^SfkKSKB)K zttoOMvdH8a-M8Da^Xc<$tgxBWrW6-?K9QP=wYvf-!p;C^7KmP%M8&g zJ4KHf+I9(j40+>8U~m*(#v=N^2FZKG-+FX{xeiCs8c*5$>L6H7CNi33*&O{_U~<_s z+#AkaIfF-hK7*gV=;`+k@#DAb~XsfulPL=JPgNXJ&bRh{@<%) zvtPcOT$OA0*vSib+Q!KXw#FQdBbz5|Y3;Zzu5Q@u;iJ|$zhW7EOK9S&=IdFbo_*B3 z?ME%S^@yc*u7lrP2X3dp!+pJnnIqG0|AlrPlO9XW8m}7sI1-IKlHA;F@pss5VB*$< zREzWkEeZ`g%9CLc@d5BO%eEzE+Lm~~ZAnz!+GGD28EJRKgZ0T^H9ZbmQS^*$C0AgZ z7azI@oYr;8w}b27u?RfpkskFzY=t}Hb@RqB1Bbb_)V00T(zbxh+oJEl$HslQJvu4c zZjWHkuyreY_B7}HxFeSPu(ya!*+PHlR`#g$!t^t{qMw-|^PSXDy7B0c=f|Ay^8MiY zfq?a{7cw)e#_H*3C?$Whc;`;~!dm%WQUAdY-a0j5x%4@=9$2%Ik@0WDIr|phzQwmo z=(jFv#_LrWgRhiqYI1=ZC&|P=dCBg2=m~O!PubM!K^B?8$Bx=8Yi?texw#kZD*WK` zqYvTPJjcuuJgseB(RF93$8f!X5H;?}BZ`y7^rykW{U zm0vuUtQFz5W_WwR2!w@;AI zD*#Tb7v2eioj)J~Q?h(&~NMkMMgWf!padVD?V> z@<+)I+XZj!rvs27(9kZ^X zAzQzC$#&0>i$xaWc&rqFD)K_u)jRgiifB> zP6pw@${p^t68zqU6ItLkyc<7x^Tc z{rbmeU^FX?(fp;oPCQpJ29Lo26MH%1r;gaQo*U z*t_rj#NK%GEqe)l{8{wzN1uAy?tAPBxHUS~JZ}-Bt$)*oP!Hwb6aAVb{x5U9`qnHDmSwZjb1U+L*mdJ{)*<(qy zd(Bg`&l0NUEUsq8;%etDzG~dIWz^WWBH-0=^oGH!)fX1UahtH4JfLlf!fD|zxQ@=g zjlJd_;PzIoivsJTxh^s}!V)u>1%MCkHhBIWv1sbLp7-R%-xir1XSYXgWnav^9lc-p zd~8MxKKB@MIikr!L;oQMu6mwapD8l6I@-D1VHNwxej>ZM<4~r{+-^Hk2{xBmdIP=U zjpRR9qS2KyFAttkN~U_j2>Z-~3w-WIZ{hYWzWt5(3{>D1uE6)(Khbaf%xx-c?ImBh zg?_{eGLV?Z(~V!VPV-92=$R+ut-i|g=`ks;CP%24thm;CTRFZ44&>pPiluHv23`Mv z<>b;U3O81rH4SfSI(oVAT7GeN1T&?N3nRtDeQ-n7tX0bvpZ4K<(adeFB(OJBBj@=7 z(#5stGowe$&(gj?IPGfU;GHgew0N8zo5X7+vr@&gISQv$hZa`5*9D7R-5cDN#_s&@ z>OT|L=l!Ol4fyd@OD7PwcJ*&@e4ax!aB1tVW{%dKLVub3anib#mlpDxf$`km`P|UW zT^>2NCF7ZMIjFjhy@1EB=hNOpuYsSOS=#~fg-V8*??4ZA<#>R+C1%q0v3DtA#uw+X z069+!8~ZIte@|r#`4ipsR?~-X7QfBNG`WnsdaSLx$vOsFt)BdVbn4*aD^pgE|E#K^ z)Edc{ETqouAwOu>!6|Z<)2Q`xJ|!0+oxGmR9_otZ3>EHdvgmU1ImklK>SJ~xSxdQO zG!^0_kE@{fa(LF3uAH?&@V9b`e(UL8i=}@jf4B!Oolo8weO>s5YM3dO)KE(n1T#ox zi>-c^43>p#Fr0iwuCLnN%ltFd*L`HJkZU^MOAcQL8CCt@JHOvv=1juZGkck_GTms; zzyG%V_78Zs!EE(yDI@J`+?HpInzU9Jqjd~v;-P-8(9dY$pTny^2e*aY;PqGV>VMqC z?XY$(om`mxl{h-f@ptih^!d;5#(nxnWvXbt$*-un{|cS_L;HyQ(s$o~58Qs!UViyy z`~I`f+NB2{uaIXnEUC= z?zNOk=I-W}T0|1rDb!!2btUrMP!B__C&pqtezcf2%P8B0&t-zgj9Nm)kR??PnWua= zD|A_yolrSSzd*vJeeuDH<^LV zCK*~-w5qNFD{t<%;znl5v<%{5YO^$Yg_8@I)7MsMdyg+!4fDx^4d5>`gsOX6m|+sM zAlWMcd@5;p)6&2_KU%V1nlv?SSIY*c#Zfh5TbZJMIJuUvR6SIF@pR>`ftRY03(KXG z`>1Iv_cXhJ+++GXbBjuO4&4u&7p{W8ZvGg!?0Ub^xRX`O7H0EYItqW?Z9GPG>`;9h zkN3@bcpA8!%Ijp%&!)MajxTEu08R_9mC2H-%kbq;|5u1NOCwiax%6`7qAE*8GgW-z z^1@{FaxLMthq|`Qh6CfJ!R!6F=XTG}?cjDYxsG|A_^8PlSv<4M%+$lSbeg%=tMe{1 zV*Ky{+qnCR%^jSzvE>PyJTPUmT%IS(bn))Yn6RUFp0Pd4 zQ}opgGGCLK$2&T#x}(Zv?PlOvil;sqpUWzw$5)Hla~`q@eGP?{46jcv!NXXx11DR0`m_t_yJkipGwb^f(w9IkYcC$5{(T+v z_0*6L4A(w5ME>KbHBU3|v#EkvC>d71tC(y7o^ztps^Q_~`{>`^m%&UuW}o$t*S5Rd zo_^goyRU+cCFJw+Kj(ihKSY4fM*(?Y%`GiFYLf;J9s{J7Qx?$H}SX|F?D#{p+gj*}TGxkke!%4%!y7dg6JmIQp&< z_-w^er->#zH;U}s81j5#>7|a1!}rbS&x02vo?7>|NU${;-W>xrCg7n+^jV@O4ZS*r z8g~l1b~3s)89|BcLAfq2!AI|)kAB1y>f!j#c)sZPID8a%#pA$Yu5+)$YsDodSae*R z#l&-rC%2dVX$;rNQyz`aEQa^#Jmx$u2K_$PquZ!`>oWI?qK7Pk%)fYjhtSDR50vDRX|UVI@Gcef?joz7 zJ$7EHc}r@^bjSD7GD8mUJd0ek#s%uC;}%=iZgG`OWE6JTEO{M`oI{Ix$Y5&0BhuFl zuOpK<3oOnOzxKI0YZ|;YjeWkdlYD#+#bMRst!zPu*Wk49G7X&cb6rMmHhDwnTY0%) zXa@Y5g$LFHhI{a+rRJi=lb@E)j02ymd4tp7vD3Z5Re8mveWy4a=lqBd&h?Lh+rmjL z*Dub`s;>)wop+9NscQ1tKV->Y$6g|hI(HgJdC|m&b-oQPJZZvRmg?#b$H85v*YkYR zz?}~6cyd1}d->_5mok5A_u3&)8k-!hhYbO~9p=$p#h zpa(ceErGq6HwP~QHIm#W>W$q&%cka-zmr+)L#39(Jdp9T`{*}5X#0*Iu*Ks?$n@dJ ztf#%3%Qn49Ue)=dws393mNiT9^ci~C7Oj31A3QT5st=V}^?^Kk!N}9+eB3h6^LNKG z13AwgfBSj+mBVfIODiJ{+`iej?Q+JsEFZWsR{ouHhcWvfpM|j7>EdYPP8SEqh2c&+ z7gpb_Z~y%>F2l*c;`rsK(#z#D=Xv4v;`-9)wVW>vuiWoH`W5p=e{Mf{|6P0ijo0kO zS6;G5pMKI#+7!f&I&&TY}uymdc(jgj(obBv0@*Ufdp{s_Ec zTVq-1+Y!-ZqUydpHX?@0v7y)4#^dyQkzj8$7#vIgR}AkbQu_q*cOy7P#ens!c;0s` ze~U=&r`sZVtw?I<(L6qe-$z(3pJo!Dzr^%tGJlm7NRIxXW+I_OEvJLsX;wqFl=356 zmYL_c&P-=MJL%K`YX=6cunq6{^rV%OGhW?BhBlx1mOf@%AKXdC)}#doI=&I->|1>M z7T@k*#!VCacwqOSjguu^sF^ag^<*$Gm$PxiGRLo(f8-(a?|R5mNA5TO?guS(=l$m0 zal`yOuA!N(*y!4-HSQvtqg(UF;f7remI2lVT)r7TGL9M2wZTz8TssZUoerk!D2-gX zC;{~e_aPJcfD*kuM>W|=i&M^ zE(>pk(K^cC=4#gRkBgJDLYg>u%-=!0TK!?JK94U)8iBA}`ns!;YtJE{n-AYD9`e*Y zpN*2qn1-g9hxf0zp`3oZHhKZFsCgc+JT#3wu%G~qq^7ggN{aE_fD0a$dgn^%o6!vS zKz;@p6^E^)6n{T{1g{qz(i35Yb!3dTHd(xW2e*G=Kf*r8^~RwWB-6W-j9%%bFUU(@ zxyKvNBI8_tGqj9QE)M+!a3UXly(#phdD3IRe>7M)(&EV#YVc%KaeDv{v6tKq&37!W zuOmA~d5neR2eerGG`c!k{}Mjoj)@9-$P_2l*{*DtSwnV(%gyXQv_ z*$2O4wg`CnDNC87E-##X6=AA!O4ZNhykye2sby;k!~ZVK7Qe=q_D^{Ce}DFw{qyrs zUHdC~wZ*mnwcy|2^*@}JuIJHyfakrrl&7XVHt~J=(*6?0ZSqTh^4@#k_8a!XE3eqY z&pd6bmoJk8n(nx85?nMjiTN=p^aBKPtg9a_g1z$K=!#7(oUn!cXKZTjtnHpW#>}_l zHa5R$yJk0RZ0|{%IdI-)51q5|!{@BHdl@#j)h@M3b2k3x39cy~64kFg7L{Ud;8v=qPTBieiDe!gsBx z7(8yQ(9d|ydCXSsBOHza_v7WmM2Aw(Wn2=UYd)J=iPV*}Vt9WM;C2+RA*_#N@1Q+E zbR7Jg-zibw1$-9?)aR3_5&6)9ihGl&mn1WXIF*IB@n8x$kj#Tx$|BQ}EYub9t=qF) zjzK#)L<=YOv(H_%BNx|g{p=<)Vz1CYbC=CrJj@)+iCegRi*J7;J_8$PkJPbtReB6RVr)+#} z)0&4Xm?cQoVk;UcvkTJc?@XtztvLcdYTN<%aRy7iG>6sV)hyw)>fiymb}Be7EO-7j zU8ct~6|Fs)$0;|>2abz-t2ayfdbnOLZ(9m}an-NIpWXgIm@7ZH=8@rNOJ(1no^gkh zV4^Ts%W-q?-Yd@s)?1j|pSDFxz>|#kGaE;FvPdgxNZ#;!l?^ z+-0c=yTN7MPk5~*?AGrq4N%w`u5GIa&0#w}`?MVXc6fBM$;usFoZxQ8582@0cFW@2n3BY~J0r`Muiry$bQ9khbB$M*m^)I7 zw@o@e-d?;wDa?FO)}-o{NqF78ykD>0FM7UKGJ0z=_>!uYh zKZRe1XL72?%Vn&H6W^>!hcR16=OG8T9d`5cKk<~yi}v5>dVKz9f18Dt?cu} zjT6C14@W)^NgOfJ4?R3E$G2nAFd_9_@Fgz9`zEL6Idos) zegs@P#LvNca9Ucrbn$5R65DvLDE1o>+*dt}dcU#UNBaup6DDWyURB>_en}ers}=M} z){rMqI~T`(j=2l_nBBnqg=Vyw9(-v%E9KPf^6cn^H4CzDEaCjriI1&e5-qW{z}1m< z?i;6vf;#s?%QxbjeT#43;@kPmq|u(D&D4{g%KOVcO1dqIHPUEf-^VFJNcxg zOg>|&Gf!Lk>~j{F{ek)Bp0l*M?^$5zgpC~Cu*&vAe43oQ@jKOWPF63MJlOsqc$)=2 z!;dq9U{D5l3QrEG)=gboxRt@>0K8egFL}^2S?Ta*^;Wr_Z7%B=WS&tFKB@du^K8faD%AfB1>S65W==#kZF2j|1ZDpE@V>_O#-ZXx8^=|M`uOG&4;pYEZJSLQ} zEMEOD+;r|&u&9$V5rVdk~g-&!y>y`M35->YGz-RvJMvdGhXWp!*54$)_)>MzdiyR2s7arcTXU3$u{x znJHP)S8KV{(hg^boY{6fqCZs@ihN7l%?TCtsrJM7?9aC@m9%x@+53Q*Za>H0ES)*> z6Z6Zq=g?Uj-+#&`;L}rwSo`4I3#XXZdW!$+8Jk;t56^B8H_(%Pki3!{axPV)xOg~P&I;dTU%i{^1!;_6!?BJ4lD{a^Nf{^LLF zKfd)X`~Uv)KSPV3w{e>^`E722=e&-d$MJr!KAzvj$9E}>??f&$NJ`6dt*))Yb{}B= z2=i~MCZnuzKE|r&BCT{j5`RS`{F^x$2bp&>P|VDngBBnYIGa^Mt*N}1&sImZ&Fv=> za;SqD$eGlM>TcooEx!GY_za|$Gn>1FJnAC#Uc}>n!7nsFYPaDL4Ghj$@#b@uee4xW zKlVe*+bF|vou%h8r<|H|CK`4+ znPvfeW5Ve4OzGyr>kxLUw@TN!x;Fe<8hHlXJHy=<+*kG&xUU&t8O6-_#)lRx!XL%n zJ2eCR6iPULz5XD5*LO2lVcHI@uUHYdUe*M+ z=xDH=3**#0&|9fpxAwO(XQ{{btSsC1{&oxIktqt6=iyBVHnuZAZ`6+7O^)W>*Q~jz z7Ogaf_Xb|GlGqDrX&#EabxuQ&uEFo>7Qcu7Ua6`@@H^`7B7GtWjUx@;!SZS9@#8hj z4lA+wa|_hwORXNydl_Cv%~xDLd%@awPom-X!k;^B;=)N=zIe=fX9vLTCELE-#>~S( z%ju){7C(9Io(j&z%z&bLnT*&Go!r@ce&;@Bazh z{>3jpuqS@-v@Ne3u%W>L>+R{X?ye3S=;^gya=zNhh_7j+9szF0f<@xO9(uD<*%SHD zggSRk+VuJ*>z-e;p?z@dm2)<=e8wghPlD<6e{q~Ya>?e`uF%7Mf!oj9(uMo2dU(eE zD=rzVRt*`9bvVn>VJ;jOJiR@FelM1E=r}ljJYKbU`X6FF+&+N&fX|^CI9Lm(4%e%<@wkw7eiM6nPZ8Yr+jrb<|M~52 z+qZAO-M*uB+ii9mN9pLoY3&ExF;Y5t=(4aof%hv-E*_0XUX;>u=2MUECR=wu^K6s{ z5Y6W!0xd?k9l?CLZCs9JmQo%)7-e{84_GCA+Y^h6%pN~twL1o^vY{GnW5!x`G0S$K z6R*dPZ^SwK7T>gVjY}@~T_TKBi z&a3M7zx^FZNON4&ZFOz+ZuQ=aWmT(MmeqT;EL*nRTkOO&%?YFt0!c_Agft)!-as0J zklujz{2%jt$9lZ;a&azx7jWV8@x}T)yF9ySYdveMG3S_L_O{!uu>t(!2W@iSjCG9k z*v=`m<y<@=>0l%`Md1NqF#uO>Dlna|#dF9vl6b;&k(WSZWHg;rKZ zZC8E1m7$|+Xlt_J#R=;k*#ygM z@5+~dCASTBf1?5S{_3yq!NcF@F>qTsa5(vwJg0NMa_1|@Egp~m3Yzi{iP8V|?YHcn zhwrm(_+}Os=2<}|JyEkVEGH|IW0vJ)W?5!>hNa;7t{OpcVri&11hZ!*r=c9TFL|p~ z_fA;*;xT$h;z_uC$_D0-THhr3C^Tq24B`0j5|6{hhZm^tzWYJ?Hr5a)4f$y3XdUwm10}s)9~1#XLVel?Uz zgKu9KbD)}DrRDSjEk=V`K>V@i2)6MKZ+Xqihzyr+()(E$w;NvmG z%XM_v4fl@m!NncdhGz@29d4s#gQq8@W`LFPoJ+5Bu3N>(W65)?AGfeq^d5sT z+~<7hx1=vuuaqe6i_eRHx>|0>*}WXPdyLq(V~nvNd-1_$*Se(o+T=RL&Bx1jBc z&JD%S6tB}A(bl!lV;R}{o8!=)(I2z5l|H~-w*L%uLj60e9lU60tf6mk4VtxDyjSR5 z*jjJfJDRPtcZc;1@3P*pVSKliER9%WIG&TiXOYI z-G`U?A=}IS!}rrq`r=_*JGa*s&d%GyDKtZ@p$E^OwC3HV^bXF(k0sA4X0pL-dU#Gn z;pdWQskP|R;M~P{qd)mOYPkRO2fSD4<;hT<**3XEKs}@YdpV#)|_IH>J zUVHI!uo>N%i<2uJ4$gmuZtXMT=%0zRJIsf_J8c@Vc=iQ_mKmVE4b$3`M`^xN$ zbnqDuJAR`??LSqwi1(}y-KF##A>@z)(P0IG*XqL_;((jmP2bLN)n|gy+2t0OM~pb9*5auBPNB{-DZdsUm00*T+!xO4a@oYVH&8F;xHOn6 zefdWA1{=V0;kDDJ-T6P`AwlH7eaxqzNPN~J=od>y zpttkLkwNMyOW5c3(|ZKJgQ^NkNJsZU?PNtul{NNs+s@^^*TtHBgKyv9+hucGtZWL6 zF7vx+G{*YZcG{^&AGBt?$J1xlEc@&WmT~e$i{JOGC9HzkCtkATGcQ@fnHRzBpIhaz zD>i)c5V0nDK-Z&7D<)<|{wO*n0o;zIwgvv20N#Slv0%9J+Ogz5;}WGEhl7KmvC@!( z(Gg&{dWb15?X+oNp%THw0FYKQmY-e4WK^_cj#e;*JDZmZvEq>tL5yv=x!5Zmsi zKjBh`MW*0`Lfu>2#60=U8S1b5Y-nP_Qt=&6r1o05@=#&|*+uxNxt;&Yd(>?EebZF4jeh*Q8g5sw?eT5ZdwoSt`^%5u z*x>fJAAfu;Uhd_v9oGiCJuepR0f@gV=gn~WZFu~9c&xtk+t;mcYK-0&>CE|fwEbW- z-UEs=#c5B?w*wP0h+pgV!bUhe7`cghu8nw&3;V=nZ@q)Q z9$;}8eYV0Q6mP=w0K5;OCsz=8p-^29%w=&~ryUdSg1_JC!nv)-#j{nLB`x~;Yg}8{ z?Z;^y{n+hd_PkEV0P^O_w=1vi$83N8+r{(ApX zx2oG_%{yA`#M#5vPd#Ey5Bb6V;TyPpgKu9KbD&}&+WGiaOyK)W{IUP|E*r+*!&ir& z$=EE|{Gz4b^^&EnJ!|P}KPPVfOUpX>OG`TTf^9wdbK6R;t^44zm3N{MMo*qdf0CT) z0(5Rk4x1D3J&FaNUCf(xECJ3O4~ECHwuy_!a9_1wih)VHrr3E5`mtE@+OaOKF1(g^ zS}eW)=rJkGPEB#~a$ia+xWRj9P+#qEm)Ayv85&W%m-6H8J;9)8^zBjH*KqY>@JEN+ z;@8B%U5^v(8Cbit&c=h=iS#2?O`0^`9;UOlDOT);ZhLwxKX$uVH_y3zH~iD}DCNHN zYo0z`NAif|iKR7HKHhnGz$T z#s8K62fvTYC$RR%5hHhgunDo&KR;uI?K^BkPKhitz%QWpC1eCky%cg;w}>m6c8?4FZ`E|m_f-CDZ{o9Z_D5IoB`U)AJ;}{?Z+?T@%-vY9I_4T) zdwNK`d%^5rMgW{U089!C1*_qdLEw}gm)<*qIpf10FfXqRP1=$T5f|?mMoT_M?brAk zdbNW#Hh0Wsk6fbvOf4QJ?Ads~V2<)U2@XNe#n_1UELb`;a@L!`!XR!3Fch2KfELa3 zPZ1}EqX+OE(6$9oFBU+(Sb*?foR^^-xznP-vp2xyH!?g8IXEreeT`rHG24&d-(j>k zIzyQ6$8N{Nwb$UYy&)Z&_5|J#7Z2pOaC>5|n*hAnf~Z{#4yO-&_^s?cZv(eC;ayLR ze3YCvIqsZ6u$=p)!(rBlp1ggu!j?~=oo&FQudS0B?qN%()S1t26_m} zcRYMMp2rfvZXGpZ;Ni-9YltfgW23=s#k3>9>n&h=Bsr}x@Lk7P*8P|i<-OH^B+l`K z2x--MokoP>@Vc!$I=AD%@L2B0fZ1-q6UFJ>=Yr``yjHPq4e|XLVH9hv^0)F}akwm; zhX*TOEIgKWUAQk_7sbxK9J;tTIL$sF9PONL3-6^7S1q~6)xmCFqg=Nz+vBU8CteQr zh2yv4>Efd-0gZlkE4;VKXOl-}=$oDFyi98c`>5j`wYugmi!Lm){H`vm-`#7aO^udK z|ML@%J!w0J!Of;_OKa(~>9d#7F)dg@eVvsxH(6p)j%}faJFY0fN~!y+*@lm3dXj|% zZS?Bahy`eG6Ay1pfNLj$N735vT>HMtcWZy+ViC%3yW9c!cyVpz82I0{5A<0cK2-?~ z4c3acN=;9d71go7t17g#l49%Mv(F}14p~ustHtB@)wr7>W zl=$|i9}1^ct1UbhKC5OMOqPd={7pZm_KU~=b@=^GJwFz(UHR_6zU#)9+*W<}XK3Ek z>-*)mers)$Bj(FWN9)WUhqolIh5KjdE!R#KbN*6 zigSbIWk!xA5)b|eH2T_)W|1puZ|}E3wBtK=AE19F*W4(2b2#@1`{vo>_Yv=|vOx4@ zkZ)aQga4oB5lH?=pUL+KRS%qNx(sPE-2Op(2%Vu-&QU_dk_shCas6_^mTuyz7IYIyxzrl z_?|jXdm4EixWRe4{uJj4=3Hq3Hip5uHNtNPx9_x^_F&@V8^LP4Z->=Kjxi8SJUj`G zoo#ikCAPSqexJ4Fw*SNlyG%`9<*q(__#8CBHU)Z1fMk=ZtFI< zF1?m;UXN+Lay4G8-~L>T%w4ZQahl0<+}CsaN2k~Ybg0v)@Q{(lJSyFPtUXzerLxW^|$jIsMo46 zT)$@&n7x@=Jg4pFan+)$el3QY@(||HWx)bLw*y{Pa@IP&`p<`3lKEEB`4C;J(Yb|%Y5l^gaYQSQdr*W1>{dQE@CJS#3 zv(ryMXn#V&h-A7&#g@G-)59M|p13S zEdG8ms!4Ej#+w7$k11~M1E=H2dB??|7a*6B$v!kIKL?L_Jnfp>t+urXKfE@pY}jF~ zy~B7bEK~Eficc-xE9AF(#twtsYxvoou!R%%(u=(eTx5^R-cWfK7qLff^q{&H$gI~uoI7+7@jgC)R9r%fl{j_r7F~qlH z;N-F5c$pdaj-a0gKZM=d2gH!mj-$>smiJKZIhOZP4>9#5i4YdM>s)nYS{rrru7Bm# zqvO!6!5L%W^j?22Fo?(F*gJ@C>$T3OjdfN0NLnndW6rOYqjYNGpjwNxrfBH4!)1=* z*KWPjTE!ZrwNrS##o?N?*ve`D50}>3<*i>}9c!T0Id`8ufO5s^NuHEXPii=2d}FlD zoI7OIJF2O%Z^HMo!7A$Wte7=v_1sCTYNVE>uGA*ScA+b8L(|oX{%j7PEp+BR&9=QA z|L{tDX)_b34Xd^6;$jOXCJ=}>%GUA%%O}Pg&ps!J7^d@%f%{8$kd~2QY1eQ&UU=kw z8*k5|y^hvs?TaG$+v4=QxOf5g@!Lrze;yW1Y&2$*?Od9&!pdSR!=JUZA(xu9ENetJ zH!wbAP2Kck>Z!Kw2!TSz~oPb&%$cqw(y#v9JVmpi-p6%r4t9!{dny^DzE*o zF>r#Ufp}38=O!hisoI)mZO!#Iw>)LXubi{hD;MqX!;f1xde5D+C&6YkXrtt^hnB5# zc&~Mh?IUh-+y;n`_fyL;K#qF~U0PV`R(LVo9X>5xh4zPA(5FX$~5sY;B z%=~rUMI1GUT^#A!ZDF<>V6kcy#lu~n9C2s3usFPOLgLGMelwZ~{~lGk4SA$QOE020 z6rZOay}GufAC(5x??dRX|J2ddfLz;iYi=n|rXekia$NzTf%N0PncA`MlXs_Y3H?Xo zayAibf^YYuA0OOAPcM4K_HxbC@!1)H7MC7s)zz6cx;#j)oG>e^t+1i_X&c%*WmPR@ z^zWXtTzciC=Vn+Z9Q+0*-oV7`VGdL+)9-E}-0J4HSj}RTO{P<*`%JQrR!@+cBh3OTqspo&2`@{aNcheLi~` z;=7UjW?}4&2Iyx}fX_;DBRR%{_=z0BS7mY3rdMZeVs#Gv_(3~%|0!F$a?}>j&e`1A z89YE2Yyywd)$?cZP_L%{ND8%JJ}a4}=3$DO#ffNilu^`g-$_mvPZ#{MX0INxH$Nb^ z{g)5%TOs}prmD8f#m0r#(wr#{4qkuj#z*!o_r01g@9}?)k-OX1{7#*J8ZmWoZH;fZ zt=PG=Y1${eM&GZ2#aWBYARfW|OyvKT&Rox=uTDiymQC*3X)7zsHnE2q4eEu%nPVx; z<%*&L>+0>Yea8>ly-z)4kG=7%J@n@DcJa06?8MVQwXWsE*0*p3t=pROMe7>ICt( z`90C}pu>BmpPqO`QOudJnKldUsANkI-{r3tG)se$N(qvJ6^HTeCsD8 zaO5E?KB{rm3JyPPIfs8}xhH;Pm3LpYyu~>iyZeCE4whS9dklJyIC88N=$Pnr>u?+V z#XBvYk;rCvpSaRGuGwB6VOAE!v@o18P4;R70yTNJIlPTsctQUR@*JI&E>RYC`x{K$> zC$c6bfcwNV;r7B&9JDVCYad7<&{Ek|qwbrZu z3wxxlu};gbO|yiGG}}$BU@I|z+J*x9oD^G8bvZHqa@*eDM4yZXYagz)<|XRY7(2#W zY~|cBYaIc%XM9dKSvZTo>C|R)<GKo2tmz8S8>4`Sg-efO6{-{0w{0nyV$)~KMqZ7SC zAvFNKwzRfp7oT{`%{BJl@@RZ=INd*NXU^a2w8@h-XDS z_qU)gi*mRw&d2+3+Xrr|{#$x=@g3o`__jVn{7~99`J-zMaJ68>)}>!p3^xl4OUg!?jS*JXI7;sy!Wq3Wp#OdJ@;J4z%@?dxIb;ohUoyA?m zC$z@tKA!`wi&MMUyxy1fF9IF5p98t~QeHG>3%=yksCL1(hk`73EC!!Xyi4X$ zuV%bD_>Hm~n=PrZgpo&XyT*3$e`@V)wWuxRsnMBjBF0%nf9K}@ete?p>Ay8^8R*VK z=oJ!0&&~)R+IC_AfuZWfNNp@0r_RrYHCXF&JbR*e{jOR^+1DsGl7^-{8%=pKG2eLp ze&xQkFOd(W)^5cv67gQ$Okd`3VlO=t)AVf5vdw(wxQs+%GTW`Nyn?@xbE4QQByYBY zK5ES;+vrP^VUs5otYc<7eLst=aj_1*O^-(6DRJ?G)J^yBh5)w#-x zf5Pp*kVk*+^;YmN@4oq}J@d;KZU5but-5dAs>tOJ z>_1|M9)85`dHNZ9^f$k@$MB80`n#9x!8c#Bdw%(h9eU(3>)U$_ZT%_h#p`qjx^dNg z?GSFuH*NBe^`QsdIY}&il6X1ZEbHUwBNM^@KywUUEw5l3Z)epRT#fP&`~bS@T-|SNZg6 z4;#yz(f(9gPWcq*GxZtb;qLn2w!Dw@p8j}P9BV}kYla)_aqrLDV_db3+@zs=U) zc`F(=^bHBbFX*jZ-jQn^V`aAI#Jttf^KJ*Zp^n}b>)F|EljFPX;-mB_#+Sc;vd;z= zck?^;qQ@V!#RCUzd}Tjc{Ym`&#%|#D4ZeL{%z-ZEYQZ)dBhg(I%=b6nTHQfkV{*(!xzuk)n|Wb!~6TKroY72?%j`;x!Q`_@tUYe zvJ&*kajfg|=7P>}wx>lC_ZA-)Zj<-sb{r#(nqT2{1Ux%ZF>EkhadPd+ zl?PW}Zy$Sbca4Lwk*fU$k9}}z<*E~O4mcjKTsTMhl<0Z&?iOZ?7bS8|67L%i7R4#& z&7MFQub8~!?;I8Tb)MzIVAd32vWunj8u5B*YP3!{9uBsNV=L$F*SsnB?aznnwx_{S zEd1IUD&C{`Ij?cOR=DleqVYNG1Ei}@Cc8WtAHwHUF#)%?poW-zi*mJ|R)Fur|1%9fshaLA>bH~iKjt@gIKX-x z2QH`%T>Fv)YRb2;uBO*-$B(DZG8(EahB!cB2YqbTj@iKI6xuCn-$R3_$=z%_7MIb} z9m3zU(I!rhSkInzdMvhB$zU&kJHA*mymn>_wGR=zC%sLJh?Q^OWW6UQ?6vo)0|U3e zkiW_`zU_INp-Y2jOEdl@v2WF3e~%QSIpes6HM6sEnNE>hwI?Bi;e$_ zFF9OWxcvdT^+%t7#v*evOgNLqd`e-C7f?6XTUun#UA~7tp0C?EdWp15@3q?93$|lo z1>d_BJMyC^Z0*q}?aHrSwI~1hrak`0*X`lAUbefQ|B0RY$xq2|Q|GmK+&bacJE;BY z970Eq4o$eNo+9e)xr4lS7dh_ErDL`Z@3RQ%v0a>+|DAM$x?WU^;mu+4G0ZoAt%mlN znyZSDxV#egb#%E9=Djf1)l(>kgC0!za?MevLDM`1i^b!Wlh#~~B`)Rq-RgSaIenJ; z0Z6wQ#hlPJp%{*r1JbqReU`q1uvBNr1#FW^{e{1rD>eTcN{x39ay z?nIlmiJG=8>@Sn^@T6-j#P_MtcFfdT!_FF8k2gzrTnL`X@s?eXZWU#Dws3flZ6W>? zhaYee{pRw~S|p+^$l;h>UTn$v^o(uHzb@A78(j83%Vn>J-#5CdhPY#^l`rR5*`6eu zzBFNL51zNuT^;0&cG%dd!?x#Me521!+o7v#cF&{d?4h6BYqKjuR*2tpPHCo{xNyu$ z>T-$G;;lt}ZdDt-sIsz&O^b7b$>?vyw-Z^{gqJDQ%A}&v5tgfNCWYHcI+wV5Eb(a{ z9;sX4pj%i2oW2{3bY3mGrg^>dI2XTjL)SEG6Xy$WT^^kCV#!TMJC8QS$GsSNEZ4t} zb5u|6^6T8!cZ%oz<5)i&F7uo`Vw|TMI4!O%%+@+3y{l@WoL(L5mdCoQ5!aD5%G0W| zj_EwDiCT-mCI4{R8}7SY9J#%e1D>$6KLEsFZFq^fG`Tb{SI)5r18uAqh}i0_L=PPur#kJeY|2c=68-%ig; zvlMVUjnB$~-z(284|?IYkH5*s-bLIgkoZNzFtuBK4Yrkew577j($JA7Rpwdku5LSW z-&LDj-fx{f-PYF5J_H^7+?g}f*&ea($?Z0Na;Np|-DcYto6Xl+ZE1r|mN(CQn+?X> zkN5-q812Z^8I)7#_#=W4Bk&t=#q}VE20;{K+o;511tM8t{KV_eteC$a(^~`g2-|Mg0Pyh5=d+MFn z?Xf?;0`LB%o%$)by>y7Y`3dWy-m880erwxBKN5}|^xW&y&X+@ zl-rv!=g221Hm#UaG#IG)9>xDdIVfF=Itrilztud|wV=JM@l1-pY0#QZ5KP|JFDKy z$C{8pEs3yOnig^Ga6U7LetWkOC%+TS4x)Bkd9CcK467W-wW6H~)=o^Osd_ZH@i%|E;(A)3cUPpGy2H5slv<`Gv+|)1Yunpv9ji6e<+Rw{j~rxur(Z%(u@&HF znv#qEW>KmgIe&sYQ#QPqxNS-^pmd5_#OmefftAH`SNK`K+=2NdFSU+8}&ZFYe87Y>jZRIX0g98}MG|I!%kX zuht*Ejv)>%ycREX>lN!t9QXZ?CGa{I8|QJw+_er#`x-62&UaF*-1(%!J)-oz^j+K$ zOlN)a{N04r+~&UU+glUGo3-|lyCasY@2?oRi^21_s|yFmU9J&+@9wfn^2$lne|3)RvO@4ZrHtCWD!f;=*Vw@1kTq}LM!gSSFpejQ`|EEa z9>Mq4?-LImB%wh_1fP<~d8cHck9PS-{x*JFo$L9F@V9YpBKR5qwK4-`o%)4*k5TS`%3Ye zjDVaXZfKd9cXmRDAp05B_AQ9(m9rsdGz6We=JHZl}jv z16scM#zuSNnV;E@fAJh%rAP2yKWGKb)9|}~_9d%!?9s>Vo)@3BN8ftYo__Z=d+LK% z?XmY>v4`G%#g6|BUD_V{i7cMB_MwC1W%t_lfn{q2_uIhj=Kf`C;j#A7{qzCCLv8tx zt%vXG8qxk%F(c=1#B~%8XU#}wj|^U?vcE`7C58nCdO8lS1J3pKu;8Vx73RK%{Dw7$ zJxtfNq&iIYnu<#?6bElJW^5bCVb`S zN#B~qUOe0eTAJ;l$9`lZhZd}p+{>Qx)Un1Z2KauayiyUFAUq&*M4Dl|NN)q-+p5E{Ol1s z_w)t3@XRH<{FD3a!lMs(^(q&R+tQiCw(sl-JOA({ys(nN(*W{K;a1&(uLruc6fjzT zkK)`uht;W;3YSiSSL>L3Z6tx;!fu&1fw^37Fmt^@JnO3|b)55bhQ{%E|$L_vp`;Hv6JqPyM zfn#g7XKk}n<+<0ew!S0G`V!e5<>CP zh#|%u%Npx)2dwcr#`9bfd|SG!B-T-lMBV0hOLmyfZ^QbnHCcbVJk1l6`J0kMh)+gX z$MhH;Zsciq58A}iBHv@LtsL2J3u|*Wb!^s_&KIksp_DE}7?XgGRc)|Yo=XdNQuvB_6<)Fo}mDm1U@o$ED zfBEaczWL-6`{rLTT6q2UPvP2(@9>+RBGQh3jd#n}yr0X7>&W}7ru$>?{GC7liMYXe zJnb?p1N}uNIfJasWUHs9Xt|@+-hAO%d*X#>Z1fm$4)8U-VT8RB{BC%G{Pqv+%F92u z$NxZ_{N2~>srSL|cVD$f-ujiDdFE+rheLOezpm?CgfA{zd;bdiG4bsK*1B^q{adLC z8=(jHGW~LM8 zCNEdi6K;h)LDn&W=U!75ey!`#@~7Ip_n&ul3)_1dZSm+lUV~_6D>7_m?>HW5OIFy{ zNgL#%xV!>wU|nANRB+R$BXcIL^mcw!v1 z!}smCrPB*Gb8^O3&ac@lH51ctyTQpZdIXPAW3+6m#}C`7b4M*RM|oaqe`7_ z7hq8w>zBOMbacH&S#QL@W8vOjKT;2S6-$(^+{OA>D`Q=3TwL3W0ScFe(H@?AuTdV{ z>2*2&4^LN&Q2d3pOn5C$1NO(T-o*$n<-5{@hr}R#hwF%GmKETy(uEcruh(XJui-6` z*$``$y~S49o@2$$X;#{nM!%74@)g;5vt)4oRx4}EwbBm!zdK5;VtXz<)k4vtN>ku-UF15FEiadNG$U-ZQIL&CNS0;jIrLYV*%_8i z%~KZn!gTn2Iz7vhv&cc0^PQ{F9#=)kfw)fn$Eu0*o zwr#{FPY+TXHez#l2uz52zqZZb`O*Gb{Gm zyT7x);9n*zRb91m*uw13!0s=JeS5Xq#KW)Y#lHo&{}reIevNDUG27ucG4g-Fz5hY} z`&;F}h3z_z$G>8H^3nVD-iPnlk$dkkA31~U%uLJA%H+4pum*mk{oOn4?O!}^FTDB+ zd5iPbvUG%=Zo4h5s?WBO=iYbe0lWIE7wxJ4dc%JD&TsAM_kUwQeeVr>4E}wZIQb6p z+pXlXYrE#HwQJehdiD~Zz;|VE&AJ8;So<6Ilkcnbd&ml4*h z_A;D#tC*Ch<7Dm%x7|GU;!BEqxm*)-T6uBDxpgh-+G8kB=Je#ce!1=w@iJDdKyh+; zDd{yq;Pwx0yV=&SyVXMRgH2~2l3N{b1>MA?IyYIzc%c>G4RGtGTWxbN+K2c^tKU{> zEiJXSa&n)gQ4f|^o?<=IZPqe`r@;Vy-l^Xn*warB^KKhhZNGurH{#^i#T?jvAk>=n zg;@Pch{Nr{GtD-0cGUX!x7*G=eOAxhuE7^0fjXn;ByX>rp10NVz>kbf)@OP|OfC&u zMi$S}qbC%;UD~?M;?boEi-pnB94EqCx(~yQm-Yd?(MR7r0_rhSe4zU(-zV-n=_U7`%h~_)p#(>A??W zw~Zf}q|fH8O&uAxk=5Pc@RaKVGJX*JU8Cn1Ug8z~arowL25*UBPRCp6OqP{TKj(ri!4x|IOpT}LOg-cUre$_Pi_Xc zLo9#C28+XsX8VCjd-2`3?9YF`)?-_>+i+s>Y{kZv<5umLhuQFHZoB)$$G-)a{|+Yq z{bSmQ=Vt&_;>Dq^9h=Du=~BgylW>Oyl6i5IC<36l}ZPQe{3VQ zbqBgS>^*ekumARUcHrKJt^2@fJmILFZyA9X9k(NSn4sT$jEgqiFZQZRyf_@L%cMbKKU)YL9yj zUtPRNdrkI@>?5`B6h8WM&*HlN+x}x5*PZsN9(EHi=bBNhTYF$V9)AtPT|Pv6XP$HM zD;;_7NY2r|s ziitfX(d%isIyM;=S@+i50g77lpAA95sZ&+J7qt=F@xQrxu^8c$#{Bi+h9Hipz7Jc(nHLalF5{ zdwd4|ZS3Jy$1U$QtuNnsy0G3!HzRJL@m*dIj^JN^lsnY-5zo-~bN*}M9qNEQd9A0yeJ|IiqhI&tcn51=1fFBQLg~pPtzc-gCDnwY zQ-jx5)mua%F^uiuV3~YBH(S*-UQqDS(wQ)7rb4V_4*eFRXhu4&VE1^w%MFL3%?<(M z$rFzUb2|u(53mBxDWNZ174KIw5pCt;VR%M{^SQBBGK$ahc&e35X4CVv#+p_Jt#xU) zHB44o{Y)WPOaIW7VXGrI-8f%twUa*L*_+|XVU`b1E}TxJ$HP{O$CD?%iheaUsa8Fj zYn5~K_*#gy@;%X3x)=#w`*^PuYuJkhc$K<@gGpAsT4fEh1L)IsQ*(%Jm>MvB&)oI^ zi=($l#;y`O{F8_6^*_92AG{BCqa|10P1hqEY!*-chWPi_3?2WKXNzA8x4(s(J0CUi zak#kn_&>mAjejz}by~I$9pCn2{1-g_!C&9EyC1)5acGhA3(3Qml~`$cp~LNcZO!)n zi}Wdb=WV<9=g-^xl}BtFekm1r2k$<3+V(wg)h@n3ocuSh*mHjZyTRu7s(& zww+%R*O78j(v?X2q1rL!cwCHK`cUSva@_7Ycil1P`3zybFx%la*S+=y?wZ%*+L!Yg zo~D)Sm;Lk>`1}U^cfWtj&34D_H`}H=@1X82h+cNF#K@V;J)5j&hW<7Em1rW-*?{v~ z3%6QjZLw9Oz1e?q(UOXj@sTASva{Oq>T@i$G?gAU1;nS&mv2+=wY(d+eS>db7jt0y z!7bLj8fx1Zwfm!N^e*`Jv0c_QRAs$;s0q7#*^XYiYSq#yFV5TeeXT z!BR`IZDMU6U0N<4T=;~eCoiWzUOc)I&tn`;PCaWn+}QDMaMa;8*S%_p5*%mta@ykO zik*v>t0qh_Hy0;^--c@);`)siwrkBuL)VP&M^Z+nyRDww@>S96Tum8khFe$Q4a#|I zB=DT;fvi0}&ui`Q4;NDhhyA?5#lKnOoIZzjNbzpz$J}0mb;s#s!EDvLDF5r#HVccz zH^6qSW7pP4|Iy*T)=P$uIC=u-`rKz+!*3pQz0$M}>a*y35LZN;yg$P7$H3r0d~NFa z`^)&<=)G1nPCYYxwsM9&7aHq|>CFu4q-N+7174QR(w}uUl-emgoaX|mqY45`S>q;y z;N1*xyKoZjI)P8*cp$amaCSI)0hq1N+u9dwzKRXz%MY;Fl3;po;WawfYw>lp=)^n7 zGuQC`rC@xUh0;qbccca0zZGnav=a6Y`QUcJTnyg>@0A96i8eOCH+NcGX{n_*r?Zzx z1GnSg)zoA!`mA&$-g34@+SYnBk8Qlia=ta6=)>D|H~OBp~)uU*btd2bK5 zzvbL-K1H*pBd`5CxBvUIkL;h^7xsV2dwdA5zyG z!5(?*b@m}oQnwCPjbxV46Tyi-cKzUn)`A3y`fL5>EC1RGly(lOp>d? z@Nu0e9^~TTP9sSz9y$x@Co~V0$5Frd80MNV+U*^A%+rQ3-^u?-TPaU9<*mi5-Ck4Y zFjuwrRL)7cXy;?V^KPHXoE4|m{#MtD@<`s}yk5_7zSEiN$bCO<>*$Yf#c=&eJD!}T z{F!oU?B_XOHJ{oq2W$?un{TYw&AwhEtH^xq?Spb(L+PUyAyvsL#>B=x!TYp1Cg8?CY5) z-uUkSo>)Qsa-ubX*V|VktZ{$5ji2tezPS$iNTt$az8s&cQ9FF;B=sn*tQGi4PwcdT z`7!zk4p?1dxuxYL+2p<{`~wqgvoFAcQt)rVA3Kry-X!Tu$WcjemYPBh26&r@M$~a| zZl`ct*QorsNQ&P{Oh4xJLUO8jFHDx ze;z~ZBEE2o74D3({LwJt%-PmR{JLhY4NZ9-7)(xLfqd@*{2Kf&rLS8Vx!^Lq#mZ)* z!A|9d6{{u=4qlhSsmsO3iK7>aZxdTD0JFupizdN#hvD#hV(n!!QFyzcGfcgSzZv~* z+&YV@O|rW4GuD3fpf#-a@;!?AOf%sa zEAju_R%ej~)fQJ=W(l<^_?E&`=Mt@$7JToJZdL zlfT(Vr3=6vHj$}fIymtT3&F1-Ar-Ou|xL9YAZH(#@ZkNw!%#JBN88yG)gebjAtUc>B; z-Rdm@?CGQoy%4beqvRlb%hcd@p{TK7cX*toD3qv=fGjv|3!fmkE#dfG)5ROY{ zp?T@Ybj^1S=S85~%zfdu=Mn7X$vkhuYaE;BwZC?L!F-mkBVAXzRy4$+T|Aw0+_k27 zIM`|{`0<vgVTWN`isXePh^gPZK8?|Mv>bpgZ> zsY_4hnmcvwoZa=*lQ(et2H(Ce=0MRC_T@JHukO;)RqOXZ8K=iR(Ry=M%wb<=3TYS3X>PAs(G-0z;Us+`4)%%F9hT zZsi4CZjkHQ#mvPIw0^O6s5VwP_!y4jBZ?6UXH_fZ`k7Hv>hE9T@`AjFyrP_6l-5Y$ zwtFv+Lx{JF(@QJo?Gg0Z%2O&vp!{|?wW+aIGy*3btF=_Tptkn6!fDIsNgWM#hFOKf zWpI6AGu)N?bD{9<5aQ6@v5a#{7{xqR25y%VPcMOMmrOC>;|1i43*oS(GjYV-!P4F7 zRz8RyT0OsY;zsrvfvo+TEV3w$Ty>poKh$aUb9H#(5+k3bmaLB7u{gFk>{GJo1(8hs zcvh%o^`xRD&!^s@!s=E_t#&B^&b`IzW{IEol6R>Ox3vC3TYd79{rHg^PJHSM*uzqve0EeY9fY!e(8^(xka~8`rB>C(1R;^()QYhR|U9UpINU zecKOyfWP0JmRIYe9~g58O?mfRr8S~|EU3-2-6MTAv6pp=dW9X+UDV=DP&b)iE%+W> zM9W{+w!>0$b6u~S+PX@+AAhL}==g8&!G8}Qyzx8!XMe{n1>{9X!R>tsXv$MI;jC8O(HC-H>>s8n;EasYy z;#v=fUvFkDQk+eXx&5~|h1Lmj%~4>ZG&$1D2#b^XyhJeA^&w+DNFX*ZO}Vt{!gak~ zo~l0f3evvlv*Ly2tV_afaRKfB{p*ur>*BvYhMseAaIi<`dvR^v3;cGqso=TRL%r5t z`>L8KhZVJTjX|*>xkd3XTP-pTv^B8&-2k6cx;0O^ITXan#kR4_=ogZ z9p2FeU|=4fms4Lvts6Dly~Li$Sytf7SGF_H>PP5NdVJib4h+(t6pr3iY^R@p)ZThm zxc#pE4e!yE=K+j`1jvG<8g+UFGsKb@n7tBe}3Dl@b*YROJ9H=Zyw(5soCk4#eTF5|CNr4 zA{%aRvRP^{cHl9SOnqb$b3Y%9-;PiGz}TqmKXueDJn@h{^uo{V!Iz%1b3c97j{fkc z^iY4n_Fj41b{#xt+b33S`_NuuEh@e)eYx;inC$93gz2moahwy&V{zMGib_)V*=zNgFv7kX{iz8if-Zs6^I7H|Ju zzi)U(FnysmTInD>d2fbIoTCr&>X2ojd#Y=r*F%4&ZR=`=KZAeS@)x7GB-omiE}o2k z7J4*cx8vJ6aL}zjtLwrqjWtWWIT>tD60c<>ri0tOPQ4Aqvs0+iOirVoi9L2Y`RYux zW2(ta*W|C!?(!hQ`G zKjb@b+v#_N*YF~FRcK98-!UKjD8a3Z^8c1bNbyGSI~P59zt0NE8CNW%TE${MzIMc> zm#ABvCni3J7t0*jy$BXBqP1pJ(NkSqyK)YkhG!Qk$32hc9NaD^wq8zuj^asa)`&Mx z^15;M1mpB^Lo2ouUNV1{9$oa~I(^}stsOgR!*jFNIX+}9gM)Csarhtox~^QXr(S=- zCg-+Oe->kzZ4s8XeY2%D<7?VROuS`_WweGcLM^Rjvt_h|TQ*~BOO$0c$5=*ltfjOt zn$z(6LZ5#45Vht9ZE|7JhNfr0rxDveyvy40uvkehR4!2{#>nQ4y)b?} zKBqAg-g+@Ef3H8yWv35!*R%G-^6ufc;JS77n>;RDkKr0rj$62{9FzK(>snE5dN4gr z{@2alv+sl5x8HILp1d0@yEMTvs5gvAzSUaVD&P{Uc(xDN@M6CW9qgmG;Z8hO*c;uC z9)AfBz6t6g7`w@LPvP6V_uL-*ekN>eb;QPw58dF~H{#^i#Tn*x0fO?@U z8#_BdPlq8Z?JQ#dIbkao&*QUl1wDDVZ43#ZUws(;c7|-n*o0-kEz*lJZHgMmqWS_$ zD+H^l@ongCw^VAy){Z6^{>cR6ct zQ#{&nWX0j!P)r>E6|Q&TxrXyb<1xj_)%#Pm*74-O{kZRN8_d-DqFkHS8gcD7h966% zThqGau-=`^^Wq8&ac!q(V?9y5s@6ZJzv1ZoTR18w9_{u4=+3Ua-qp!h5 z4H}qT$|zrgQ-j+sJ`QFJp9}E^Er4H_@OTM%?cy<>A5#uH#1hLlS#nvJC00hGMci$B z&YeJac**X*dc}^OqqoKAh&6WaM29;Tzgx^v*cB;e6)*O;lt)5&n2G}#lH0!@-USCQ#w&y zAKI&EPpr7Rj=D~~csl1hPOkko--XX`S~$+r_38HPyk`(SzrTO;P4@lo!MAU@)dBFS@fmPwc^@zdd-zu=WLy|&eF4fVVmukZ^8eEesfdJ#3}l0 zH?gIuwNd(v?4;Luw~ZX^zb@A7e-~%F@jllFxBkEVpM04cEjEkXW#$GnP@&A-UAE_* z8QV5i#eQ|t&OP>+-T&khmX()oC8Z^nUs7TFPv32G2M<{_y_=KLqHT8XD4rbDY9s{N z7Cf>VdpqIhIbbv1Drxe=WG|iSLvO_WOt2fyoub?D_C)E?IHqxKQYt;b$aTfT!J~OR ziZwwxa^C#~WCK&pHTRG0lhzp=QFHkrIdbidBgwlS;knzn7d)2zWfK7pUwS@8Yp zRXo=w=${Nuc4pEmt->1c06Iwjj@SQ-exC1<=cYII$K<&`CExvp{K~;c?vx6(|3vaQYf%E3d75xQE>zJM0$c{*w6mN9fjm@w?Y8udbZ_b@J?uqrQDEv`^tOnlFEKOgX>oLEgu-3kk0ia z{ATVt9?ko?JuKIadiUw|-|dCr=i=YOYY(#(UuT_=-jwS@ns{kdV|g#d%HrA6-x&~K z-@Ew-@NINychG-3;10{qPqpCib;QhX=C{0!z02+R!l0v!`T<^j>nyVp@1oKW3(pC( zEot-(Pr|=1nVusBL&aL6K~-54ZeL{%z@afjc9>3S^U;Oi^&MF zw&4z&IXYwYeHHY_DYEgsD|YPs-PVEDY;bafej+P&=F(+qQ+ClqssP`tWLrEqWl39O zEF^Y=g(XqnO&^H_;)U`m)HR(3Rwrh_f5C9Y%99yMta0+UR=iyL@(gORQ^@@($E7}E zQQ%k{Yn@`_+PBBXd3rMOV#ULC&Bt(zCbkyM>tg6*k^sL+!TZ8TpQ=dK4CT*MAD%=k zQkd;DvFI;;c^(FJg<87M6I>%ZSl|-#rA^6u% z9vhBaIVDZF^kv{T@$Xt<-@@%Ga9i;kKRh{j6^3#$#>3YPv?OvULRit|@Ds z+h=1Z?l$$g>YpQzGQW+wu~sYEy~Aq9>01JiFPM!1w;Qbh56SY`9;Z7mnDtrl0=~M7 zz1FmMg6~_;_bH@r&2juo?zfW{&)f789-f16?D_pRee68_=kB(#LuYM*9PbeQsOK*~ zV#j{`bG&}$t-dYa@^(@OzSw4K4_~pzsF(irTfejS-k~?x2k*FC_b1@@7vS~h;J4GN zNw3E3uQ!qH%dxGAb#K#ATm+ziEVgt)~m{0Aq+ry$PaC5kY(CacF zESTG2ws{LZQa5iVz8vZv4++E1J~YIF$P)+iS=u)Q!(rXyoFBvp;e6fK`{?;C#M#2> z=^e&x_3zxmZS|U$79&bM$Kc}1iHnoVf86y5BUbNp>O8h3QoX?0o2Va&%ei~~@cbGN z<&>0b-z3FkurrBxcPbjQbojG!-HFPJ zvsX{eK;I<34Q6|Ty|2S~yfib253;vbzS?P272}IfhA$*q1dqw{OnxiLcuJ;h1*hTl z8O24GT99vv^m9lg9+|-V$Md;K%ANDM>gy?8xvM(`qopfP;4{>}K>Ah3Gu(avzM!0& z&gH(RRpWft5r@s-v8OrL+Cq%*+7M>TXF|Qsq~8(8ae5z~R~#@J-YxB%xQ1}s!+Q1w z;J>`x+`fS4^qK@>kx6iq1h|$D{7w>X??UGdhpmDqSD*z~3|zVE8e-RHI#tzgqrKgr&3-E8j*>#BF$%jdb9F zwqlEi4qH=CA3S#$%?`Ck;|q90(tm1X*%~L8Y?#`km2;QLxAt1qP@Tm$R$542z7_P= zSY~fLz02U;(@hqFuiMrkFntDZi)p-6h>PbAwOCTeHue{-=-A6`?($JP{iBEM(!&qg z+R>9XI=5m|tEX)F*k$S$?!klY9{i=RphY`RZ}=ze{0qOfnbo~k)yn7fms1lxZ5N+- z%$|Pn1^dmf->~=Ie#`#)K7QqRsQvZ5cU;cb3uyxcEPn*Z!9{xu;Q+-dx_PAK3?B_tl?2W%=lm6-!Fyf0(FPHQpaS zusfdH3H(pv!R`z^QDfMX1&4!|;At2*9ZsLjNN_t0OpS=3S88&G8~0@ZD&Z3J9ncnkNW}i z(-i&(^LWU$JwON^q>5t)a6d34*uud0K%NiaeS?C7soCQ1`mEn>KHNPg5gSu-<%?>+urg zShc}ot2bCeWdMEABk4PW=Wlx(^)HK7y1m)5$X^temsxQ|1zK|Q7EMjmyY8m9Y_BC% z-p15cy@d7+}W*_>bL$-R?K|6Soaq57r zp4f{o`IPNBw#Vk_;k5tEnw`3M!s63eci?MrTk)*yZiV~Omq(Zl4rZY_Q~h=dSm_3M z?r<6%S}OXr6c;=9usa1^S~AZkk*5}>s#ZG^?h(!HXx`6%xVAo5x^(pv@_L1e*DHUn$M_z6j{6MGm7Z1HT)G%Hcuf0!7YB#e>*&>j zOYi1kwy@dHlbzO_@2UIhVWJqJhtc3PSgtsr@^r#ySL4NbI@jsu*;gq4u3We@M9Cc0 zvqL?~;)$0hgWF{TanyW)$JA6;k~6L#pDhp2n#Bl4q#IRB7((NNnu97w%&kmcdEl0AfeY!~{m?kH=R-+=~dAAI|mwNbOw&^1Wy z{$4ZfuPeh-VNbk|Cv0UQi zRqP?k*&`%VCk_vvAs4<_4cdX|JY&ne}Ddo z{gc}oUVa-c{yF0d<-3WWQ}_Kb<4tO`rw*=KW=WA{uy;%&UYwGq91#D{Wc@FRGxNXR zN`Fc5$}q56yfzGe8xD3wf?dM2?1BR^n zf#9mJbyFZm-3Mbg1_auMO#$vG4Br$O2(EKKXamQMwlQ#%dyU>t=L?^M=%F4&eRTkP z0pY(se`6ruA&7H0ZVsg{Y=nBusRy|7>3Evs@f!x$jR3=g!SVpU*CyU;6W@6wV|@^N z4Ded9gJ6EAJ2!2#n{NJJcH8abw%L0GMZh=cPoGwgKY0)O%VB!(jD%R$XprTS2Pz%p zdM}NqpZhpo?7i1}RcDsSI4#ywBQU?X`v2+T$H#jyWd1wLBLb=7UB} zO`0Cvd~iE7Hrl~P7d+Ypu7-lE;po{B5iW%pj`Mib1chs3Z&*{vq_C>dvKe_jGMCzudPmQ zN6T#uwmpG8XZJZ;&D`qa=3BSx*>wWY0_`!!M@0QG2>iEsr>pFItG6f9pS6}OQ!-Ri zcZ4h3`kA|8!EQWVc)qe6+@_Cv#|npMr*B6WCx0c~a?_|Wr?FDWPfG!_Q`^wb(a7V; zTyeK70Kf68wJcTqn&o`&;RCPqCr7(YI}RPfA4cX!ON%ngs+3)`Q3)mM6koW3IVEjM zsNAgTz9Z^6e3smcRE4GlXi*fn6AKQ-Ezoj2j-kcmx73kKzCKh*>-`nK!B?>x$VP8j zLFNk>-V#BUOcZtY3~>9P#_6A(CYSrz#Vh!K$Mx*HztT@X`C1RZ`m;X&!?$|)^`G?N z*MHEjKl@5|UwcCXop>-x6Xhz2R_y9Ryykm#?9yf3eeosz;=OnE@%z8l=V;|$(;N0R z-23Z?@N8T7&A<7`baHyZSmrM`47b@|e?m9^3z%(LYkz}ddzRt%%x%xnFx`Xerl)_d zKXU(Lc=!D`ACPaxTzWWNY7)7piSf!zq4uAJFNA*XIPS-%B-0N^O$ppK-1AuiZu>3< z%gNp2GqaYt(Ce5%(zs)fntBf7A>XG)W`{I#tbuFSZ-IBWA5c>}xj?+_v@1+_@a*f!*M@ zadfU@=h$n!$QxT|oS65qYtLNA;qL4M=7GDmA6US9E(FhKlPUfTUNXCFI>18PSD*-KW&|+DvrS`Xu2BE!$Lm<7(rRXM*H)q-)>3cSp^iOA)wcgA zec;uPar-gf{$6|r47dG^YqM5F<4uEm2f@LEsd)#-E(Fh+bL%2QBiswl>#da>{ay1p z2b_S2@Dc?(J{%AJda};J zad6!*Hwe59dgMDZj5kl4qnjHKXMf@Js#6~~o*r!XZO;)3W;=75@z@*w!>fbA=OFd~ zfn3YHJ66kg{5ae;?^>wg_6C3WGrq2lbn?5KRM6Q>whDdC__8yZahcT(2k!=}chJuT z4^OA&ok|@$l^pNXHhkyp^moIn6E@JRy^g%oriJ*($wbMXui$ht%F=wuP4U)>xaDxV zbzn~`eMz~B%Sa)=xtOfTHHyw%!z`;N#pbRfYqdqWy%XBZcbz*fn)=8h&GY4ZeI+$V zf4Erid@YXlk$=iEg=G0EEQcAO8O#RDTuMIqVg=^mPtN1_lp7* zR&F-)Rx&f4J_6&}i{abLIr_pi1L2&e7j5kv)Vi(1)FznoHEP5yKQ@c`QWv;b4_rY z_nHSkescCKuzQZ?uoswTJl;6H?F;6bZV&!*zSY}Jt2dlB%wD)?iG$nT>~Ef#H;1gW zNB!HgpQ2v<3>g5k6p%ij8SnHp!nM=M5=v!eT&j6E8t6I94ndpPu6<{(X>IoaxLvJ^ zx;h85YwGFi#yilp=eXJr99J6mA9KF{Ip=%)yZYbzT?OK^42*_vgTMYU9?jgrZa0s` znAd#1e8cgqMXn^9C|AKL@mh%&Eieg>Z1PI@;0ip*U?RA^2*2i1*9!W;s=)OqaQP9p z=KIKW=?IR|cY^Vq))QuW`J-NKYT{{|;MrhyEVCD)O6Mv(W1*Haztel!(`d8kjf>~<9XVTb znSHo~d1O|9oIU$#{pgw5a%JX`fl{aFtVZUUG$<-}HF&!QkNAH2miK9eFY_MYK6BcsPx z^x!>e+`q+}_Ru)@`z*Bb_nGtgKKT8pw*3wDZNu$v(8rB)durWq?MHgK)wK**zK zZd84P<=B)spH<`8OQ`oQM?3b#lVv?yt|&LSJ*15tyVTNsfO+Z1$q+uM&AkW6{yL~l zc+gr|?Y)OMXRkK(j>91jYs1J6+U9q2 zI6mi_ChuUl{XD$SoCR~?*3{6!|v2e*Ip@0w+}&A(yp67(JX;I5(-N?uQHS_{5QR`RA5%H9x#zcvqF#Hc2( z-qo7UK9$tfst$avX{ZIe>-a2nY4|940OKc>&i%(&^uLEikAL_7^WS|yjOpamx8d0S z@NKJc`$jI1AAH+zdsP&=TEGHk=OoeJTcQ}aP)u>5;)&ecCZxOj0B$}!DL4xx5v5d0=FaZnnmN;iHrh|ImfuSVYV}? z6Fl{21%t^Uye5oUV`03`?wjAsyr$OUY1*`LXv1^MIky!7=QoaSc`QM2-2m{=Fgwt2 z+whxZHE_#$2?ArSE^W9PPBxg~wq4KoyYcNA?c3&<8Ae+T+O%-PV5gSO(atw*-Z;E@ z)6F06=}Ui9Gv^$eS!VkKd!6kALeb5`SV4H0Y)-lLyaySU*`6XEje7%Gj$4@5(n;N7 z2idaQ$U5msB!2~cynDIw;M}>?x3dhp9nMXyn;N%et|X%uCa!00Qa##r3A#y!7rij> zokg?w4xY{TJKCk!lbXHYCwiK>#sBd%xfW0TJHFk2*T2o0h3}_OAt|Ng>r|0f%F3*g zE2mC*Ej`R(7~tO*#Jq;()G2+nh-{3dX#J)GTNaKdpN?K1_A-9_oBZh`2w;B_YX5(c z%V+UKVOB##q8P0wx{noJUO1vR>v4QaAoTYbLM)2y_UW5onbe){a0|?{N;b6rfvM&9{Y~t-+vDe|AzYaH(%;o zmf`oGc+DU1oLk=N&)<1VFTe1-ZePEsn^(^3)VWh?L04GJXLcEWZ0rA8LI1XKZR_Dq zN=Q{Fx~5`=HhPCmjs$9I^iPW9q?M(1Ays_{;G}$$Gc;%E zGVm7e>I08;Fc$nZ?(5WzIfCU5?teSDmkK3AS zT-!Lj!>Or{KRVZVu@|`QIl{fc-UU2o%N{eIyuGho*Z8vS0TwP@rO4D`zCRk}&MGBe zFWkZX#m@P5Ee~EV;@@Lfno*;qxSW!zZ5jF@AFP63fuh@#rt*a}|*pp_oek zZt@qBJ4=l_d#SQ36SRST!R=$ra-sH8Sl_6W+)U+_WUIWPT1Cu1s%WYs$N7L(4-6@( zEdMcXKi0{=7oPz?%Uy{icO{Y>YVg}I+t)=#bR=^UdCV_-o)!n9gC|BRy0i?;F4i)% z?1=bSJmg_o66z!0_+^SL2nVz28wq1RNo^%wZ}J{pQQ)*;F$=Gb)vv?B<;WO%ZjEO< z7#^vpXl7G7%P^f9IFE;Nu3>f$IYt>C+V6?kcLJA-XTC~FnC?Buh6*@oMpV5ITu zFwQYPZuM;2FSu-fU_N&KzC-ChGd^oI>=5(*atwn5hl9)}8D&eh%vcOWHtY34XLJ=B(!RM#6PnXyg9OU0tR;W>x2Q2XK1@x8WFY z?sRflQt_@?#!3QnzGBzTS4=&6cs@SfSiV1fp5*%z+=dg+_nL+O=LtMNPrzZG)W7|N zT#KLlSU+LSSx8?$`wIJB^$m1!4CDVeMv+W)KD4=L;f~MD@Yeid@Lj|5x$xcj9L*zc+}QMSFFa!l&9m)r za(vqO(CoEN9h=vCYT%D>8(j7_UJTD(!0W9ZZCLGDT*Gv8@YitKj;3$hZR5<(%%6i! zjy8i=&3idsn2<>34g{mWEJKe0mzS{r1Lu8a_&b>G^9Z*sw>20aOh{Ioo?gPgh1$3e zGsl<3rOP`uoq2W1T0*|*lHe!lA7xft=xpkGvy_k)sFV!LzG06Y<*$giAY~LJYiMFj zTlWsAxV1)=9restW!7AEhCHnm0p#2=G7W@gWJZlR~lYZ@Ah+f z*2)MlJ#2wO6D*^ETnBJ9wX9J|6%F)TBq^#OM*ea19Vb}dQiuxb%M~6Uuv?|I@8CE3x~ny!|4eRqsPo}*N%qc(ROWKKa&#?0)CqQ9SZj|UT+*el%K^W?FAgs^Zf?u?zGbwV{%+cV zlLKjZZVTS;hhN+uud!vfTR*zh@h!i?GsBF36aDTXNzB1qM+PZ5}KCIyy6P_ zYHE~HRHf9?YV>SYag{PlYL!z;&o{@+(psgL*D#NrV?{lAsEy2X;C?}&qnDU>F&6%l zQ(dXNno4Dq6ws4hrlJZyKYUgKT<9~YF`Sd21Dm~>Z^L=rI+;fD=+Jv*B4y(&-CEo z$9h0^%!3a<)*Bywrq@3BR4@JRW8HuM17>#rP7gl%RIhORl@C5rLT!z_;qmj)t`~r% z^We)~Xyl7nKHT?#CmUC``mt%zwmda<>g+yv+l_M@*0M|!H_UeM8-DBsXZLbAvlsgf zU#HjFFxz^~4a2>`@EN__`oFCPVDB}vW;A%y>8&r^!`ZElZF)O=-!yTs+uQVVvS$pp zz0u9R(B2KV?J?_-OwCFo_pF`y?MZwGF_R{S{){wc%fZ`S<@I>;ytFKg+E36^%)osb zy=ON2`PuxPp(lndBtv46BHi>~Fn8qWsXfefnbN^)M|JqQ!x}u@p_aWhk8%4k-~L{F z24b1jkWd$+RmnbJw&~>bKf1wgH1d_v9vt_h_8s8DuNJXD%YwmjH@K9RN&iKWA_~&* zqfz6|ME3<_mbsRqN0s3xhhKx)k<42NBab3HhFJ@-F*3Y1u5H@5qmLVA+imbVDjF<@ zN84@F&BO4qg|aN~F(4#de$>mulkgBHC*zrmWzGfJXmD}Uq)n%GMcXpW28+R3^TUPn zd=$F5i|1`VnDJ`ES;tFmcnr2$-`R|Z&f)9ezXy{Im(9b*&(C#2*+2Z#3vbuw-)#Oh z&aqh$j#dsob!yk9f%87b-#r-;rj7F)-_e#i69oP_{o#CX8;5u5>UIRfom^OMTSiS- z3SRQ{a0Gm2nLE7b)g~W}zU@pnbv7D#PA@&&y>?vb@bN5en_h0`q~g&@Yhym=8uanh zS(?8LAFkIEdTRDldSdo0{l}9((SJPgBmLy5pXjMsJkFXm>q$NHG#ng_eD0h%dcq!? z|1_Q_YT)o3Z))ygnYoHBu2ot!-msbt%BpK&J{OB)enXpz8aI=1*2ey=MMbMy$w%F! z!lqUgt=UYj&o5EXa$0AY_jLaJC0)jwe)-%b zT{?4KSGaxc(ltGM?y{b}cvY7#U(qYCy{b>q&AI&6X6l)EdLt}ZlhWZ9HGP*~@!=oDAvsZnV+dep`&cR`F3H#OB zN$-5eb~3nInH9E0O275vTRuLOXeaY`33=p;`~vYRcrweEq2c%i^ZAY9Zzhtz zy#%rj_#0cr=iagjt=?q*5y$5a-}SOOwPEQajJ5jpQtI%QIc)QCEu+=+??t9xTW$=v zYUj+XCFHRz;ryAklzM=jWBUo~@0t&{U+C@ev-wyLyJgVWbvV!RlovWU&d*^rb8y@0 z38DNwY+T<=@8JOj<|HyZmCW}f{#MWdgYiKmG&IWFMJ6lw>>IRDE7AS@BG5Gg*{_n3 z78t$=>?SiNjQljXcV20Xwhh&3_oaSqoNQLp!AiAGuK8YkXa7(+&El#Jj3EpFy3_aFz5BAgrErKI(wL9Poq5t1>&mog-oNY( zA>@HB1G9aoV=q-6xSUT-JI{3TK5)CAH2~M{LpwJtC#yVzT=L{C^T=77r_=`WJc9oX zt@6j3=kqjtd$yBdVgBAH;N5fJJVEr^ha{OUogg>*wL39^d6eYgp=;Rh*>bVw&zp34N-JLrpI$G^K25J^;r>R}dZm>y^P`mKSlN{umBq@d+Mrx=*NVspY3m%o zH&4xj-(^fzlH&5oV#!WGSC5xFGnU0{j%@HcF9ANE#H`qK^4f}>*(N*aPa8daOb3pg z)Wp=Zj!d1@F^&@_xP9`pj-NWCsZ(cl^3*wSu53-Jd?t>#w|`H(z;GFW$MM z7w_KH?c29?>Dj9~d-aNrU%E&i`$_T?j%aM+FdnO6vQ2lWWMi{R(H_e2)z=IUs&sIl zGB$K7yS0a0y#exY2UOI%SE=|A;>pX&Y}=vy_73GWu2WT8yUM`*N_y66+uKyNl?=SL zP0C(fr#P~U6S7j347W|p%3$t5u2M>i*q>FZa7~>uYse|7!WUUxM4tiKIpwA3C?(3S z#&nIoQuBD9;$k%ok+;*jL1FCmf>PZIMUU}IcH_5LBd_R{S{Sr| z%+i%gtgcaPO+ETKb7RR&3yQ%@5V=b3!eYh4&7;W!Dr(Bm=mlo1jWwxyPrIsiZF`K{ zkNNiZ;xiCaLj9+P8gM@Rtd8&Q^d;1?z3?$FU@uFrS0dOQ4`#>B!y`4Hxsskxl`UkNZBRCN zo>#{0GO|+ZH)-px{rn%r!lf3oPl#t8XCAp#`O1QKX5bCVEYIgNR7eg$sft%u;v;XQ zKdnWZ`UlmwXI#4uozR}c$F=|HFLWho=)WKt?b?Df%4uj`Mj!$dSj#H;}Z2ByC z&YC*SWjBk)LN^AnoMwqzbAS--1L!$&o8;fhA+d*8`p{b#1t zdwg77Onm($XCy!|7=@ZNuom3C6*?IbihR+_; z;HjhPJ29cYsUzw=c}&|T$HCe`HTCvsWB-7Jp$FzOoh&CUj2mSCKu((8V zRd8q1ml_+?wC}Vk4_;QufeR`b0kxj_H9pT0$mNfSasTR{;Bu)mlZ)erjchH=`1?Cm9Kdl8z^2o(tPJ_EL5^rV%w{3+xe^0R$%tWY& zV7Zu`7^cXQVCQ~h0bVWobmPG8Rncf^=ukzqm5KnT!y>_GwCw1p7{$2b9L^mRkB=Cw z+<13<0yC7rgP0h+N8r2Rb`0FyjYb}A+PUF9ev{~w6!OpA=v!o0WM@nW4wgr-jIT#=9b2|vFdteN%lLnU@p)cjy15IyjtJwv@pqQ>iJRta z+}b#FC_Uze<@UVum_28DINDtZxE%}@8yC0P;Z|d}y14Oh$ER-mo%(hVzPcd#watSR zXthnWgP=g_-ejnnhuz-O;q&lp`&q)nJbi0nDgMgZ7z)>Zq>IC`vwEm?gVovef90Wz z=h3@eKwUc@k6Jc!x3ZZhl1&zQ7MZ4LaPH*Q)Fp$d`GwHmH6MOGZ#MN$GO?DDM;Su) zd1;}F>S|P4Q?1gfN@f?AE0@PI!PBh5d@^_7*Kx7VZ0E)N%n4Szu5AUgH^Z~(^#(7} z>^2ylUTya`DYt$L{0x3q-_GrJ<Ki$G{fW@SejOw&U)D__Ysd_`sxYz52R7`V5{8X8#Q= z{WDnmchknf*1w@~8}=Fo&tUQlZvW>uU;eYs{fKMNoM-3G+;*@V%r@QKGwy;+%ci7!81x3W$ip6cgG$jbRJYv{{*^><)m)a$s3n7dFvW8 zgRbht?OU39f!RTKFX-f*3p#b@EIm_4bn5mwP2WMQxOYpJUwcs(U%97K+@8L3S!Z6j zpkvpkI9}E1`!}6)&fUMIvoA3}oEhS$U$~`H_~=jGzpIlky{Ho}+@nA5u1?>1QRna& zoP6~aO}+fGPThY^leh0`|GkUoMEP>B4bqZ$A0@6{qpH1ERdC?8viDwB!M+=X*aYJ|5p&EOk1#IeP`;=aJE#TDf7iY466#!{PAeRdcaF zFm7yo+XW^&oE&_P1bZXFS(o8Ccx?UVj^2&79>%g<46BEm-^|g|!R}D>Zx7e!_r&X* z*F3^}^Sgy`T_?j7yfzKoxOAA+)Zy2`ESqm)o*T<)aqyqlM(|#y_gl|eP!c}!N4T8} z*Um);&%!&N*~{a7^nbDPdwkJESE$f1yvrX9$74V(JO`~jeG9yM4VfygS@?98X*OQ8 zg_e7{3_tNIdI6&GyrFI8!Ly62S#a#)iZT_Hl_d$R>e<`LGVgIPyO23vd7PWyxK+80+my4RM>~$3 zQ$cwxzk@LL4gAh?OQ~INQx$otHJiFsLvCk%YbQ9)k^Wj|ZSHjDYcx8?Zt}vq$rhs* zZELSKZs{e{d_XPR2DPbUSQ|KQBvXA;*N|Gf2I(0aRD0JjGsK3uKdkodoy;%UskR+M z)QSg~Q+rmw#_Mfbx#{CpkN!J++pzn)Z#+F;-#x-_!(gYk+n%?Yw_)%j%$~vX8O(P0 zwrS-o)65;d4K`a3xaTpvYhj(tHX-N%*MJ*C9n<4W(@1!kqG zXk)rI9jw)s@hY_(EY`XMS=zKeU7IZf#;OR{d`uDJ%0F}3J%@k-#I4V+(fNNU~af;u>zQz5S)yr#k?;cJU5G6^xdJu zdov?<{!09nLF5xvBr0z`HJG*>C9chO)(`Fb{qeu&hsn+TQ+*U!w2B@tbl+TGMVE!5 zF}cv*B9#EYjx&DE{it%dc2$^S%R?1g5`r&@tgFIM=0~Allf4pxFD)P~R100yV;gG} z5J&$um>FYrZSdMSZVZn_fygx7%vq#+9v?+eJOwRs=tf z^^2Q_-FUOjDYKu&1xJtK=L_dtn``1=GS7SJ=U_E@c^LY-Q%g5a&ULL%+c4Xflc5IJ zHvG2N1cSTA{|&ciGF^F<|aok&#r1!F5Ek-!@-NyTLsB+VGRj%L0;`Rns zOD7oLsai0;k+phbmzp+ps;L!>Z{u-R!`2?H?&ww1jvlS;0OPm9+3hio&8&5-wd@HR z+B>xcAJ`keBUkNnPd(f6(Ja5zmig1HXWMZ5pZILvG!JJsZ2nKYXfxb;=A4G%S8Ct1;=6Zi2|4oa@+GPm z3Z|aBQe`{o+Z8({{|1e`_1i$|PvxbJ2 zt8`?UN_X=4+qp`myZltLdx^?+FIDC4<*FWA!EpumS2))z+ZUknu~jM?^;7vCuDOr3 z$4^yzf>kjVqO!4IH2hV}%<-eIi#fDwH>"HZn@Q}+066(4>K+a=@o zRD9?@czzFDXMx>`UHi2(Ba!SzxI}s=S>x2vbJ^=>MakD4s0FK*YVK0{)6kioUN8&2 z34eJwJqye@2!JyzT!9CErPpJf{BeEzd+`~FE{k;fgIw7w!DV`b*JdfNIZugYF=(GL zN<=S@EscbW$ARZj+>fJ1nF+7TAg>y{%_jq`01V6uK#u|sLYAtyp<3Z!bOc;DA&L4W zw`crlF?iF=qvobJH|7y;$Aa5#d~C+OW5Mk>G+D!KcWSDV;Cd19iSTMNE#chZ_@$D~ z=TZS~=N5t8Xt=or4kr(SOPg=qeC$@o4y7I)?r>`G7)%cZJ43i10#=$1?$o+D*JX>x z4YR}1+&wjG_%r848b1d|Be_->eMt^}+jV))u+?(TjfdMFAqWjV*xr}d7ZFTM!HnihY-~5l~?SAp)5GOpHoh{$;eX}R99QW)EJXvg> zIVR?3`!nmK&p*Pz`PXfk-Jhxu#_d2?KTRJ?>fEW z_}9J3s9Qqs{3868iR)Z#?FwKTLl5L;HVSPQFS^EIg(|d;A9F69UCLV=uZgp^*J!bvn zmWAf@dV^c$gNuQ0Th6FutA$&y8GJm9b3C|j*v)mpW|!e9wQKXGoAz!!W7Z#L{bq*G z_Ikr{J3k8ikL0%Xdk2Eq{?vto`56MidgJ1DZS$-9legkeHn}}!eBW|mZ0>0Uud{5J z&}6>b+M@8A(dUIGp4G>(*H1YE%-kGYrQ*RT)sGfy>twq&jcwD|xuY68J;scqTov=0 zOma^%x6|9*5{#dW{`weZCx`gbAF~LqOFo+$PrHl$acbWy{ox#onH^!-9pq72Kd+Z% zad=x#uVs0V(ZP3Lac7T?z5b5QzVL<)9y+5zW@C5s9aJ0Hn;W<8M!VhxpCzlaYY*Al zV_MJJ)V)VrIB(aPYdUb@8X1#Ka?zW#+%H)1^n2$wZ&M+)@3J-B;Cq)!z-8+vE9dbt z=xJ~Yv>EzV79oz=1zXNlfTr}h0;HP1?;j?Mvw(S1Q<1^T9 zkNp>ne}wsV-hW^JdhX0^AT+v*7lqd{g*ah+n9r8a$2k`xgu@QU35smBOpD zcQh#lUv|xCwKg6o)V3ovXyfa&<>(HzAKj|;6OAezjaI=q=9yGW0hl9QN z%3a`h6#Bd4O~W4-1=c#gH?D1Ys#e=Jjoh=)(p~824!%F)?C9t=W7O&ChM${XEYiVd zPgbj^*ZUE#=Q_rxO_#UYwDDz|q2lZp*bBJO3L?nX2;w>8{B~XIBlBH_F983!Ge0HB zGFnU{_v{TqBYDrXK;^eGe{BaoeR{NW!R&mF1=P3msc9Ds&?D9rt@V>lYTUUIztI_u zoEX%at_&4#52hCk&taQCy+I+&=0eL)_JZ3pFNVHWzfkhiLKcD78WS%vw`P9^oGTglXl?l%X<5p@AS!^{;n^-`7^lkd;RhQ=2^b~ zncn){r+VZ4kM%ZLAwT8#7V8}zd;M1*k}2{l9XdL#(xMWr@}+NQDOs&e8`Rv#{4r|N z&G4pm;QWT(J$%ka)y!{ByZ?^<|c3tWF=ANvH>CT_PgbEK7CsI{HD zw6S+g8#!k~C$HbOQ_b5)(9B2G#JuV?>?@kKj%Y2{ZyTepYHU)y%nZHx)_eNobITYv zzqe(PKbqg^aAa~${{?d$e6~JreBd)V=KsK4&ijW(Zurghtmpf$9RJFmz;4^Q|6f>d zud_XY@omHF8QyJ~YY)G8NUeBOt|qjT)p)lykk>hQK&jNTlXqWKJRCcz_pGw}&MMb9 zH@Izho(hhq^Z&QE*Om`gReq`WQVO8Db?ha zF_Rm4{N2XQ@kh3k|3EKG#)b{58%HNUa7TIj zpI0%f9DZGV@Q(7)%8Msorndc}%F)P6;ofEN?IiwBz1(5UM_8crx;K}kpydC&AB2!|)bG$>$$xWumGA=yHqWFR(hf`P`hoaWLHG zAsdz(2cDU0Vi<0C?$op${AQoPbt4S7!QXIrxasY-!tu0u=8#bnuv{3aTyDqkb6bzNM=PfWj-GCrX)Box>g1S%*Om=u8oQJEM(x{r z-NI4~x82I^q!)}iBDp<&c*yy#MZ+xU$AdNy3YJHyd6N8&oyFRDxlbc!wu680h~j1R z!IE#9NKRB1^Saw2l(Cw5s4g<4d}otIHHVCi+2mC{O>WgwWMTeHPE=T{wA0XX%l?a`9Q+diIv? z-ngT?H}C4^HS)Qizo%F3ze0cVJx$Vk-G)~@3(drGr=MaKwzjK_o}|vb@bL_#Qou@BBD@Xp`!omuz7AA|9%%+I{hsZoT_U_8#Ci*lM|? z-%`^yf4BLd$e-;LzF)hgti?8 z9>*|SJzi7S_vyJeUe}Gc-q4M=-z01GZB0FRQH=+;;~`t4gf=qqx*Op1smdIomNSfJ zatQ8@9$vg_IXFyT$!@fwQPbnm!Qtb1JIM?OzjGW;&hxwcIX6HBV0PYUpc26CrEy+L zSiM?R`>(2S-yQ1N=1aS&vhh1Aqn=%K@V-hXUID}Js|eiAhm)5bxx@Z+Kt9pI zQddREV z%UteweBJoVZKcwO98VtynFo2bjs zo$DHY8(v!m4E{5xcO1>!jx)C%uQ|H7apRa6vbW*ok>I&yvpRKh)62nis2FNAv$Imkm>tsFE?a>T+}E7*(}!=VsEZ7ewTt9ly+F}5^na|Uza9;uaO5m~OsA=1!?kx^#p^}S z)NcIPtYUmztB>8+*7MJ4jM|GASvGKEKHF5eR{QEN8`@UL_4XJ3bN%33CsC6@&eOD5=jgJB@ZMdAbb2;37 z6}%e_eIN);C=flL&nehkgb%K0cokWHWR`Ab#@*&{W%4;q-yE#$ZK29+;kzf=TQPVl zn(5gtJMfu7vw zwqm*MU_7sl1?O#ER4jZt0z8fc(<3>@@uBm&IB+_F^PGJE_#X?F$H&6yIa=@cKlrx! z)Y09esF}xr=eFGVrhE9K&WwxR_grd8Lfa5kB#c+5A z^9{ozxE~7NHr)33;_#%Qm0LaCla)?w9E=X92h7PWx2zRzTmG91d^dgG$$=p+#<;tu zZ=BbpQOjac( ze#*%)cQR0CKS@Tp<*t$K#{S0q`{A(()I(VG^M%`<3ymZhPeOd6X&~gT**=Yxm`pAf z$4LIa+;|LKWUko0W)=C|a~H#lnl`F)Vp?5b@^<6fd%875CC#H`EP&55l3lRM6T%jigVd%&)B7yI-}#!_2VUt`5%I zvu}{>xJey9eL~02o!411+78}9|2|009XOlYzg+blp*ncHTkE^%6IK!E;rRncG&hO9mYe{m55_NM5%Z81!ll#cSFBPizQa9du4?nH zJ$M`IR9;uFlG=JWcdbgm?6T@=)ikcr=;YL6+hcs^mL5 z(eakWlbxAJCYIH)EicV*+ORnZJT~8WJm2Lpj&F_rF9*-TYA`#N$D_e#22eT+{KXa~&s-4g8LQzekxD&HQHIv7H+O?nhBucJf`UpPXg$M2&OX`A$C? z+}yI=9KH>vm=7)5cr*U7NU+y(){TRkuiDYv?Kb%B%q}zk8CY*#He05#TmGBr^LD<& z-3^QJp*elzhWngj_;3DlThi&ijDlhVw2mm6qt;!H&nKB2jso>e?pEjS1KQltr<~$Syb4V! zsKhs1fq%S|^QiGpUMc67l`>a^bIPfIvI;7=b{YAYJZ9(H>r?GD)EEQe=-X}Hq~4?FHFy}D zJvgmya#_0I(vB96p51xi7&txU!DICA{v)T<2hKakNzZYB;}B~AoqPZsA3Ai(!R~=^ zaQgr_4{i@|?S3%3Z|?~>`f2UMBX{`HP5Acny79()`uxkU;k|~P#(|9sdzPn0?cv8B z&TKu~)(2+%`u~mF4)5kUk8katJp5lV**WJ?9s5sc?SD4C-N9

A~yIExXO~S3lCn zpMId%e(|=BJ$FfMCw3}oLz+S>$Pme#uaGqKincUm52WH%<1?P+t5UFhbYeI4`#}}1 zWe&?WGTpbe=|18e){5bdiBK{dhXT*O`kcT$qN^>|K%nq+7)2up9S=(db^$|+LGoDVpIvcKCz$ya2i$>6adff6OM==>Z zOlE$%e=2;sJxWD=Zuv4_Gp3UK)8@@`uiv6*^6G<1$s=XYw}SjdcL_bF`OMEv^H*{` zeGTN~<+g8EKDjDc^z-F*_EInEQ&MLav*$bMhilTx404XMf|*el!8~EI3L>9@ORP{k zdVY1=T5a7ou7g)^s%_V9w7@zKW`o;#@a=r~w)H#KHLt^Kd**xbo&A_Y|1df9|IPoa z`G#$_pY=1&_hu%akGC^BXwedSC71>1P0vJnel{GtUX|=gSGTm0U9m%J+BT@7p-i#K zE^4$sWcHI;nZg`{Fnm*0Rf?g#%(K+zOFd9Sv(vq z4z6sy+fJ5R61UA;ZXBDwG2`wYuFcWGTCm%AH+uj#T6v7=fd%Bo!;@t@%~ohj;1CMgI*p378|}>pP2dE!mMTu)*I$p-kOue z%46Y%^XR_Dn+?Z}huit~v)c?6Pll__E%oqk!)5cd+j6eO<5tr)ANq`6F3QC<*$=pq z@a^JDE9?n?SK%M;X5JdyI}gk*+e3|WFkM5>p3?DGUf21TU)Lpk(KnfYwQsCPmCd=z z>!{YHU%si2zWF0{=SwPCzh1kp-q6L@-qdyGWnCoG>c;DD=u=5 ztU~~6j>f7UR=Lztbx^^Fr^?}z`(>5M%xIH|HPVV5g2eSuw ztY;tBVhtWR#&fU<&wL7{A-~JT7?ZH#i#~*pW!EV#LonCHmb*AR*c*@N~#$z)$ zZ9Z`0$hPcp!*<&T{Ov1v`OJ}8wQ=#kvi<@-n+MKt`%k=|`Ohq8)n=Uh{!^PV%KXuf zZRY4hW{`fM-;jBF>)luBxo*)idIM~hdTV>x+sICLw zd|kCVm{Wdqcc1QEJgzrxU(%cRuj!}coV|7LIo-W}Mf(oz(>}ED&QpgKO&{p044c^j zf93O^#q73f{=bT<$sv3pn*C>BmuOip1m0tyWxwa~;$f3`{?M*fed*(8@ zdMSBOCH(!A;5#X$?pDg*cRAk$W&G{ZlNw$ES4VRQE2dYXG(szQ?K0PFG9{L%wj)t{ zF7&E(tWO=2Cv^DM9o28^0H?w2N_aM0y9lnG&;GNjwpMkGO`4cK{}{I)^X>1&XTX=) zfByKHtv|_+ekJop1%;VMn%vSLG*Rwv?%AR7)5mn|+%aY`oY1+;=QOkn@9(B{+#^K z!>c1@Jl(;3Uh6z>oE%)X%r(Px~4R0Oo-MI}$bKf%8;<%RKbAr8}Q&WdmgX1xA zmes~{kM;yk-5cCC&E9nUc=X>`bYM5wZF;%Yx?OPb2$p5DS+0v=t&^p0+}q9pVGlAz-Rb2 z-;?Bh_Ol0i;PprE>of9AKmFaW_0eyCsfWLMPrv@vySn?%1GO9; zl5c*X{L_4x!AnM7a|0gi7Um07D!VY1%=Po?BQrdYS>_dGW!kZ2qmID6uS^}%jSI(g z_u47F#9r^^YiIS`RpzUlKCbqjPK`f%f!VJOT9QmoZ)}i!nRSzqm8}ZuURlfvNn(~q zOn#!G%A!>bk(A-mnn67oPx8-I!p2*4}v^KvKT`$@Yb*b(pSLSSCa2U zPd3;ep5ceaPTo@%Gt4u5$!l2%ZZ9B1$~^KeJesLGaASm8{dP5WcA?qq_tc8Y%|nhC z&Gwm%waTW4rjXBSRb9Of(C6@f!+9Q``M z3)X*T^T2J-5X(7noD+wp?$p6~JjyWCmetFRXY<-9mes~>?_jwyVc>X#;Wd3;F`Q@1 zICB&}I9H5ubq`KET0M_>cs568KVY-SO&{>!z3mO`=e5_EU)}2Eq13l?+rz+V{5*!& z;CE3U9-l!xxWj?eG*dNpV?vXc&#SkuMWy-Z2Ql9CqR}6~Y^0UwAR+h#lM# zxB#Uy&$^@}OBJl@vMd$S8xguGxi0y_egg zoOAH<^JH+pu7~8M{Sp88U#V|)B8Vv zS3iI6b-fE-zf3LU>Zk7^@GZapiXf%KKWnCRA>|3WS{1sW$ZSn_w@Jh~8&dvpnH!Z6Z&Roym zQgyDfw&2~~Nruk|`AuE$;#|Hb5*9P}Ybn_4%Y1n^-Zi(1_6FgHXU@^K0JQjUa(Z3L z<(RcS1iyHY;_$D^&UM|odsDYxV$Pu9cJB^lWhc=KnL;0v zH*+$W{~5f1`M!S4gIMSEUK=(hf!&73iDajwrKBl6H3JMzRB}=>D+xRS)4|Nt6wXNj zPr>m-c)7#LdCuY5;CBr8Y#z77M2_HcQlgt{yOqNEN#L$sBY~9!{wMNWobhUBp_hZP zhRNg8{Q|{d%)4{c0AXL;W^7?wdF$hw)tieV65X|x5vQcFzVhe z@Yt|77OgxQU$}8_&%85w$-!rqiXp1C^8jmiXp%U|>(ZiiP5C8`c!zYxW)!Xuwn{RdcC2)H$JPC%^^jg!Wy&?jS zFZGPF%5r67rm!clnc(EFxX3;a_b2a_6}(cbRxZ)9MP#gi)jr-{nlsn>!0@KcdRnud zWQN$2PwU4|<3A4zQwFn?ipfN+0IRFPV8i2bxN}8Qqsm#OJXQiG8$KJZ8`rJ`zwNv# zUQ+@GuUgxr8g8fN7owAI(!lX^+DUHt@HkoyI6cVi-lM0f&7aW_{Y!^#zMzY5|4jEj z_*Acc{H0#~=nK8}@#lKwlh5?>#~$5Ny()rvnWeJ=@IxOS1W`)LTn3sbvTRc7hh%cEhZ0${_H+4eCf=z z+38RJSst4CMkTg1(I3X=Z!idd+6tv@UkcvRTe{9qt`cSkr$3|gjVr)ze>~@8^^QfU zc3+|z_NS?4PZECjBvtH-Q`x>4mF|n@n1B}z@8#Y|ZoA2DiKXYvMUG2|ipfpQ9pZ0p zHTjK+bLk6X4soa#bBKbO|3z+86WaLtHO#5mL4P_kPwqUYL$^+A+p%_SKil-Z_|E>{ z;&_kW_y0foLLOOTr_N7n?9hmwMPFOfOsxk#)z!647q6ay6P2lNs8i41zOMWCZs;yE zf9|~Uyt;;WFk?4U#p~hZc`;fQ=1o8HA_bCny?go?vw_#EnD6eAnrc?E-p>3Z2JFnQu{`bUZR?%;n1{!{~nMx<~JT)~-DVFcTN+2se9?c+uy+|tijdV1A)8H-p&CNa_DFsb{ z$K$Ef$D3}zJ|v#~M?6}C;k@YxZfg5Z#w!|vUB~t&#`9wm(BxTBT*vkYrX9qhEjXM# zm3rX@7vIaqLHy{US*eWeWR`aXl06=Qe|8l;_6x~Kg~No;XDt9*=QI0jzWm|a-r>vD zFwl*U`mi=Jb1Nk?4?h@rI(Tx@O38UIEaCTA!uN6kzZ>R<@NZAy_v_A1CmS`5Ig#m# z;dc_9mX3y!%8W#Ga=x>R;n3x4(8R&%S~zyy8gQ6ZjrLi&2HXal%fR+Z9;;lv+QD1gd=k!qRrbp7^AdiJ^dx_$?|d*x02^p_9y z;iuo|{wr_m2>se4VD=zfe&8tkglT4D-J}ofjkomSXJ9dYwC|`p8*V$j)P~=Wu-fU@ z0+*fIw_!FtVjj-zscV~`%=*8aj1|LvmecnQxBiy8wZpOPHhkM=h1mKd*!?xQ{l!Ng zIJ3DQ{^nQu%`bnhpS?#N{ZxnL0uC9sN$#F6!H8Tq*Q%qa~NN z^LN;rp`w;_dgbtLZCDMSGlPfO(k>Yt;gdw$RtSk+pt9lU6s? zsiCe~>o#qmpM9T7wpXa3yIC=4+(CS1W787wa21jl-%PJoHokE_GXv#hs+OPuMT6Zo zpU#JVZZEO~$V~;m^ZLm>9bvD&wOFBb^a~E~nd^r?lhvEu54I1@2iupB2Sd(KwXgg$ zy~uE*7K9JIb9{qF&y4baGot?K9u1uDRo}@Tda#GocetN^f*$ovcB$(~xB5=+RM)9~ zt({=jdw0A_hT#S4V&$8-i2fEY_O0}`;XGSj z9ip~2dHk?Wo|~rsWLn40pVr0O&+FM2;88cO>*$$Nn!5U|uD|r6j$b&fqi2un)Kz9C zQ&T^FiQ~mHI(_q+uH3()DeCLT&Y#rb=_49HIiUl`4`>2U&Awy%=rx_x#2H&hb@cp{ zb3At8B)3_YPwOzZ4|44z7pHaT%rT8$II8h0liG7`zYboQ4av+- zs!FP=%!W99Cc0z-YjoZW$c=a?GS^rJnV)yBg+spDp}arc}y?P2ZZxx2SoZcl8R(!|y+^k}D;!)~Mx zJf+EberDG!e6NifonEKGjf3jlum-?Idgm?h!MLuOs^Y~p| zdGjOPdiN9Ee)nVDd-G%6eeFZteE7Dm+Y!GuK$xweOVKXHIi|S@TEF!b?Ad zN6S(CM~-X5{!`j@0d5|AzR$jaA7GdjzkkK;e|P+Qiyw>03NbZ07;HFZ z7R-J&$2K+guU;*dqrq?H9Cgq}KkNTKf}y@$m=x^uu@c{=0AM%{O1y zqbHAa=l)$?xp7@b`TJ}>v`-D22Nm9&CBK3Iv{O!KsPH1|EmYYsy#B6SzI%g8UtT3Y zdQ!%(x1cCjb$o|Q>A95Dmx1FY=#`6ARa>NrszR0EhnQEKtD=$uwY0Y~hnQ3INUgRV z+pURx$JDiDTD=>$Xms~JO`bdo_YAyVN6ozff2H-|)X@IQq}I+Faf09Npo}r_n0a>| zxLv^GC7aUmN+a`Nqv@xIfZ4{Ym!A51d$8M<`#ji#GFPhflTU&ZyciE{-?>56UHGxJ zxz=$m1U`AMGgI#38j;pFnJii-RUv*n`pzU zvlN-bp1CMpMV;LWC~Z{!;JD)Os}D5Xv~~FAug5EGQxcjsa_-1gd0tcg?bMXd{}zA! zZ&6)WrPF7QtBpPSA@F<4^m-i!+qycMb>{RDt>|vi)*Vy2b^nHL-npWi_pj*&-iKq8 zBlJTX)HqBo6q$;pWH<%WqxL1cK0Fp3M;sZrab8M9Kb(@_!yMX|zI7nAWEg#Dz9aPU zYRP;kZ|+e}L9UWAlU37A)+o+ z_NQ*9??xs{9yper&9MNV;{vWJw_nAZK_sH)Z=%Ik8wq+8mM84mv<-y zUUlbmzxuX!X~l2_^<@@4id^_vndDJst8a=PaaWF-JBso8>QK-61~qqajqEJc@~$F$ zI4iVzx()tJtyWCb;nP`(R|FYn`C)L5(A7mb%au8VYp||G)yhrpo7%db zYkeKZ8hYY2+-JCE)eVMo)?n#_*Mj3so$YGkHI{+x^~=%ba5S&m&<<{wl&EZFpXTsb z+kWDlW)7aP%%W!woznc-Yh*M()&w>2!N+gv(iB z`t$##Km7B*=)3>^FZ%ZX{_pzpzy7O!`XB#OfB&!lQ$PH}KkL=EKg8Q@qqb4I?>K$| z9{F+hR@CwPPFnU0a~IeLz{~sG;5K;s6YEzWQlsBC7;ahrhTGlP@la2u0D9@ExrB5>w5C!vF<&% zuj{vO>cW-FI(*`k=JvzA+d0R)xJEwtKGc-VMB?!z>ugbBZ>Q3hp;cy1U9_@^J~#Tp z_)ul$r15#gqqq*tt|^9N2v%3-lhc|*&ngRjUxw1bz`XKob@q3$|C~|t+H&^J`*iT~ z1GH!Nv~cO3c5*(&zBy}%9u&Ujnbg#oYu%N;)p13A=zQ@ zC`uJU=8Y}+A5Jdh$a~UbPe{TyrH&lVQbnc2s<1GVO!allZ0a<&c~Yr`>1aZH)Y-FK z<&BkO3c}%8vl30&Dn&I`E0W$qOih_mYVwpsPEul1xMG_86+rNp=Kt)Zt zj-NcFKEAU@;hIit7}D|6_)3nf((yBgxX#vS!M*|$CP`F{K4J*)j zG~&O2zY#Ow6f&S9i>vWo%V0)JzJ|H>#Ceiig~lwE8F<|?azv|@1fMDv|If%+`h@UX z!Z=1mI2?#aS+nj&gHm-{9yZI~%;p?Wyb0zvb276$ux&jy`xp3!aqpyKAYd zYv7XCvMS-ERihEBY6QDmsJE%{o4Y!+4E(O)w%G&JgV`ByM&KX|PD7jI}6 zxH^CE4E>Yy+I{MV4%~iSTdzFS!|#658(;pQv4m*^uvvpsqs&<;4|25sjKOqo7)DvE%R%G+u-z1@WPEx zs#yl3pViiI#lM1g2KVec=GbPI{fv9|u|EIsLw!bX{G)f@(YtTHq1VCdM-N}o-Fx?R zjb7AwF#FWGvv{Q((YC#C=(lfEK|h@DY)`qxJK_uGO&)z28M+1J@|CI%PI>3XA^Djc zEclVJa6XHxiok64M;wd!yBF~NDFCPQ%gFVEYnBPl<(C&~cxt2icdS!Qf3D^ZOwyk^ zp`GWB;dy#i^B2x(!x{K)1MI2$!R3@|l@QE$k<|Y0HF)O7rNGk27OK>v$S^CUQ*RW6}YI(i#slPMYniZIeMlAvl!~87O4y?knaHlrl`;?xA zmvUDvejq{gg`KGnm*M}x%&nRlcxXs#)~!)6UJm{tw(AaEWdrC{ z!aENz{ImpC3L0$wO_6CaU}b=Oli=yBNKj!PbL%2|a>}iEpMub0r?Jm58H09cy&T|} z!wrbGC#T7iIfDnjvh=r|@h;={dT^ZzfU{=m+<0cp#dK+_%id9TiSPo zKhaY+&$DpVOz#{n`cJ>~%`NpcGwdJG zVgKRj$G>3p2l@gX_Gcfw3s%3a_rU6RUVlw*g4eHt*RPL{_-XE&Zo8a z=n-w%vlri(d9BlPFjtx)#5e&qjTu)po+`;f3TXuPhfWc0Q{B+|Gpuk_kpuX~W*_?8B>-)$Omk!B{nnJ{NU! z(`ddb#>mZD=}k_JlTvzIm9)Ygez&s{`t0x)XAj!Tp12<$-N6$1S7s@xvs5X4@k$+H zZ#-BkpCY&uUFDp|D|x_8No!n`-0#No`JPa_7vjNRGLWwId&d;czN3H~p%riKJO)PShjDP(zieTtkL~DRWsPCl^eRWcGs}#N9g}dG%IE~+|Uwu={4E-xxkH& zLhBxnZy|XG0dPlx;J*gKJ8=mPk{$KCH9adUNBn)=7C*=B=k@k);xmw$ouzVmr%i_A zTUntpI9`qL#oD-Cg(j>3&!m}cn|1ZhWnDG6egC>{KfI+OFfqF#gY3^V<+s8!O+Y_H zu1Eyeg|t;Yiif-86$);n?KaC7eON{V{9&^4qVv-5XCpTf-1H?sGBDgpo-tr39w8AW z__RgwovWyqS9TGe%qzjZTr@8Za%O(Ja$*&8Q|gDxH0s6>HLn7E2FsbPp-V2Neheko!^;<}C6g;4 zG}NM7_w@6nrgf2vrw7Z8tX_8(=N@EOJGscy$B*ZuqvdD)LPPk!pnpdbW_(4nic&d8 zi7B>X9}ov4GXmC+KRO7glAYW?MxY|Aypkv@PkTJ2Cg>)?8mj}V#|Ar~+< zkDf*wJ-)8~KJ~2~Qa@Vy{*g86A6<3hQ=~gG6Qe7*%wUXzoq)$>`pHKh6h5v^G z`y+R?j}2;M!$x(p4@%D~QZ9H}zM_kq>g9N+pu48$SOR~rs1{GG8um-IHOvy&|A6&5 z>;=;J93+v&9Sc{_WEtnx(936jU2E!WgVT-6)VLf>Hh2woSHedur(a&q(agS^x;mLJ zbmG;sLd&SVmy!3>+|dqp!*gPfRkn7W-uwBV^w0n6|JBd*yTAJL-|K@P|Dtz){7LV8 z`JGPFFRxnGNq-w}mbt@lrgy4u5{>t!o$6<;UdK#xd`|rvcWTx6j0VUD8z38O)##Ll zHqOIIIHp~9AL_gR@xSyh|Ih!Yf8uxi;UE4}v+xp;bv|Vt;Uw`~ak6(G9yKp*g-?;_v^QLZHzox6y*ypHkkDWdVW*^qnUgrDE z=PL%+z`3fHcR`q36PcZa;W6(+o#<^x_79#TKGq6mPgYr1siu{^@=lDkV0lP*gfii& z713`lC;_v}!0!s?#$^9xfu#nw+wfECo*GtsBYH>rPEqyXa05N8274tmI&r^~5|%kC zw%L|t&vH_9qci zRCK#5i`Q#+R$_-c`DXOoyYT^B8HV<+8~?==_R-AG$uP<+%20GF+|86|738O?V_CHZ z`Rr$vrP1e4RQt4>Cj3zqHUY|)K2~1 zH8!bcX6LmdUCJ@v_l5w4;D6XSR7ZYjJoy1&TV@b_ZoD9vS%+tnE!1A7jOHr2!TpXU zm#>}cTzE8k5O*tjYez-I-UD(LaLfz1IS16 z7@F|}c)8q;0G!S6_WqH_=$#z%%SPnO#!{_iJ+BJiMgs zTDK3cw1u5;uXo{fGD{X5Ug!9nmD3}yYWsyJPCwjeu?-KclJkm2quqv^W;kka)f&L+ zMtb4~x0i$Aja^+9UYePAmy}h?KRjM7eZ$&!_>9gO&e^Fe^o7sBjf8)=iZ@<*{{2_!Lo@rK=KT)b{>NW3xc`BA+F-ZgrTr5a{j2`# zSuTi~ZJQbPGu$?FY%{|){BpDY1Xs=YsC*As-1wY*@yRFD*B^q{^uphu7ykH(Ub%N) zx3AyS^{aTJ!xubz;eyVcJIDY1v`(KqN&oAZ77iWM9Q??2^YdyL8&!BsmfQ;bWS{OR zXE>uUE(Sv(bg`ufLYBgCnt~UHQynikoZLCzhhSX0HgR&T#B%;l`Jtc`031$!D%y zovXU=G#!;Q+z&@G?=pb|NRyf1c z@Sm^VV+ME~Pvh&C=;Pf0FNV+!p|7^!b^tzFc%4#TdMEj6%jsR(c4i(<`I!2KR;ZC| zg6i5*b@z4Sk=@Jc*4mL?jiM!8Gt{d|e%GO^@QLAcPcLlJHaOeE<3n0GxJs)h`{AhI zzm)2Ye^L;=a=eJCuY(iuRY!yD$u-J7jBJ!(XKKMfvQIdV@V59yL}kV?vtkD9xL6J@ z*62YZ6kkxr>^(#7fy}AF?F>8?YdgE-<>Sk&99X9y(LBejRCHp=^rn+IPfF)8 z`gP|16nfRk8R<$wJC?{X!932-C8itQR5DyW=81!N#*zQvo#dqK)?!Vc+pW2S^!JOy z$dztWS#OcrHuRz&1&4NxvUjP4m&Y7|xxSOLgPgp`>V)Ifw+_Fj32J86*u=0#xIOyI z8sUAiob&e>99pf>P5tT^reIvU`qH~-2CVRJ$U~Eeg5=w zefjyvdTP8r;50w|@NHcpF zHyZ6qIEqzhV@-}jWs|wKQj60IH=6E7>g)PWIB96VT6?;+tcQIY_}v1YmseCPg}zE* zeW%)1uG7Gp%^Dt^)9MlU>%(xF$F{1EntBWl_$DxT^FD*eC-Gf5hbJrAG5FwSZAL>j zg~!Sk_-s>0PixyLX4uEhT6kzXj^WROkIM!;R3|s_x!f?XDPD7OVw=XO&DW8`eU2XW zSK#o^)Z3;vZprC{k7mgbF}VHjmg%9J=llg8n`QmNJ^M2?_m5!q_ZH8yr~2d5r}&+H z!VLQ(efSRAuGe4JtB)S*&h0y7o6-lrfZy!N(>ihDq>ddsuEWQUlJ|jU?V&^3h30Gf zp52<=u^m4BtlH6A$JeFHIn7<}*&zx>7a3f>Og@FJ^2%Q>_xyT!WYx+uy+)oH^ty6t z<(gV5m*`Y7g2)Bp^X(lNLSKjs_UK?mz&DRhMXyL7CAGX*5qy_jV_oDN%bX;}N^UXs za%Z{4*~vZLPHwSI77tSQ1m;5tw(>|sZ^*d^91#!prsh7^1op=)PtLs)?Br#h7jG@E zL~FhS*78hTD%Yf?^!UjRPPUh4Dw>B3Yx!m_m0zX}e(R3p&AO_3CBF8{@wl%qRtEF; zc*DEMO~bbh9%noLdsSr3F{^24sZm=;on`O3itmOKJj|r*2vxN4d0f@69_-&CwgZ5jo^-~ z+di(627`^{fd;!NFaXU{M1nOUX)#)19Gl@rcw(3{5Y2oSxbZJM`)`K3pE?+*L zwz9Ebq($`Za_C8~21iFH)`HiA&yHZV**C2n9nvtzk?|33gXbgt8XH@sqI^8z$a;xN zA~TA7^t3FpyYa5f%OD3ljy!Mj4J+tB)>q`JxjJ9<)LwNNaVmzp7H{4oFIRawGCOsm z7t5T$o^u;J-dB4#>STuJQ2&&G(G~dY)$n;S*j#D&9 zc=-51gRvG7-$J9u7G zd(erqHteEC$A@hjda-k_zX6}z^uA3_i0O@!vklk&Stj-`y>jk1ee$2cZKL!4Gr0X{ z`sAip{!HU#{Kbu5DcB7M&D7doe*6hM@%Js9vo~ISqK9zAZ`@!HOpSf=>{%T=iqGf~ z=I{s6Mjjw9a{-Ow!an+4d(m;sYs=i6*3C?7)uweSLht09i6?hmonm`7DrUt_MRaUa zc>5OlwN1*uaifB2Cl%N*Cg0{!dDV@{zr0_r@x`+Dfm2B@DT2>?p#V6UAxq>GY9oh0dpQJC+lP>25NyrjzF<4c&p7a0 zhafB2@pBG=^zMVmcIUQ3khN@i%r?*(OkK*}dWr0Lj=gy-gcZhXhb_iqV2NBJ$&-x) z%h6mXm8Y;*Ab*eyZTAp(mtGFcpKbY$;@eApp^uLj*AKXtctyk|2djvFdG|zzLg;H% zt;j}a-k{ELwBEZ;YWJmw%4_MQuU4TVW@079#q@ZJRaQZdp}XIbLDM(4Un{2PRove3 z9Jim(w|^6#f!u;zZKN-L_R?7$MI*g@S-tks7d=MZb^gj(^{r~xjvbrOf#H>Q?~-nz z0lRnqrY1LztCZPmMH9R(^cum@)Vp|p1jqVna&A5TsL{%+LT6FRESi~f?9+Ov^LEUYsxighO&7G8)O`UC? z2iGRs;I?^AwlcEm(dA|0xt)V&b2Ql>f#i1K>9Ci9O|p62zc{R)Lrmu!#EG4 zpX%q$?B3a)Tp8wpj%0b_oo2;aY_(J`FM-!?YXv93Us)A!0>J1J(#%UijXtctwN=Z(?N(MNnBB%&1}Ckly$v2AejKe`n!0dB3peh;UA_+I z`-0G|JU-9Q@8W#tiOb;pCCwcpLj^3~3ZHx*TJMX@3BLT}w_x(K+4i%3xS400 zJTJ4%x#5^$fcj>)U)*P+8tT>`$VA=YxfAofzXj!(h_Tls3Yo#TA_}+3{ z%Kg@Sm!3VoL^jOY&9dip?7YZ>^)lyZA-osM*4M11Ja@5d;BH%S+lD=YwLhP8za?@A z0Q=#gI0d2qK=1*{AscWu{ z`FJE6xJ34prD`AIdqGysj?4G)M_WO59e(Oyc0q9|Ui)a`=(F_<4x#%#sx{k=;8(Dq z3iguEYrMZ+<2`?G{&wD*+(I=DKaHmbc+7?s-AY8JH_Xj48ZBRExLT? zsxIBRq&p99>cQjN+A_Ndzk^mS<606!Ef*Bw0KbeGShR=6@eqkdr=1D!C5i8c@ot#o zy4f`{p^niBEgN2^gEwwzIeA4XXfLzrh4l^h$``-QnB08jg3meSwepFL!QZ1(vDt-i z(xRAIHNor3m2*Tg`|~upMQ6$-Ducdw3M*Nzk;&}cS&{SxSft|M`qMM zzFd8CYqa&m4!mQg>4zIlG_RW%2S*rAJG`76u3KHJyV2>bQXgFUHO#XIP2D}t0=Gv^ ztvx!T(cxh{?%)Ls;BT^qeB}Nt>Uw;%25U8ZXqUz|OsTVPjgr^{HLb=gXJAMjT({c$ zR?`Px0k-#QIgeL&cB&B0SzZ&K(#+O#;2Ec|_ev^2^TvA-$ecgBidiFgT*a!RA8yGE z!Lzj5oHNg^gKuW^Ue)m4%+buZmvK#O@9tvmV(_}18oWi#)ZdvE<;w0L_u>vdDa_pu zT)m?M_>L~XMKid){rDw%-dDk5j$rwAj@wUgZtiEzg6U>$1&?RUq9?xV+*R!+D`fZC zE85HX9*(=uU*X7Wp1#hW;3~O};P<&pmMpNNHy`QRYj5ZagTr9*Gj2Gww(&~&wI^-R> zcxM;TU7n)OKB_&;v3DIHPjer+ReRBO?AoiD`JK$FwrTw|o;RB&)xCaHxg8C1!CN@I zX-J{Xv((p9@~zw;zp7ycRE)~EcvSwyV+tr40>8oQ(zWs`9hP@imtJ)A*URj?>^$ty z4cda$;HKBhvh@TzT^Ga4!qe7%u@p8QTQ{@1kxe79onV8`Ad zn7yPM`))7z-j&N*m6Bf}pAdQk@fl=iFC*jVm}*z^xrMXZI)Xl7O{Kc$TF4Z`gLg$F z*AM&=$o?9^7jGUvy#lTwnWi_6r($s_x-J0HVvbjLbDu*Zx?>p?r66A*RO&95s2?+Bz1U@#h+tr%T_$E#?;zB2uAei zxZ}0T0{ftX#0Y1aFrLo(m_A=VY>&^|a|@X_|p<1IO_vEA^~c5NqzVOnv8XtF5lLX+plOJ-fO#f&K|gL^I-Yhsf*fo`HoKBd7`V}_ES?kgUgoe zZH`96ZL&6>)z_v+{tTzhZ2Q^bF*Dn?%(uU`WN@0<_P1!Y|A6-E%TGVTYy4e(_%>cD zuf6&Vx6ycAq24}y{v19>$F=t$nsVmZJNNCkVD|hT=Gwa!G_zx;Ho^lO-?CYQlaqYc z##KmmfLnH=BAWUX(zIFLb(3K81lT>Ifbs$P6tA{?&i#ryIA0<6qSf*&0>9JS^m`{S zEp~hvEH&6o4eUYvi!Xt-E4>u^m-V9U5{`CSWbdGtZ0+^3ojI~>?De8q*7jOrWurw_ zi?o>M+qhFZgUinFM_hw^=$Cs?FLNHqYzpp(12Zf~mN|D1GQF{9=Wg_RoPs>SXgfKh zKeVE*U&Oy<3H7-ZxW3e5DZ29zbe9gYaV4uLHVVFL1Y8fY2}9Y((hHlJ*^2jDEu76t zwe;f2*IlWeO`UkD1SzRLjJEV+*+6LczmfVpse2RRSN4xUf^A3W`f@etm%2tIYL@6jL zM1gT+WMq>80MEO3{TSE&3AGJ3lhfF&_K6boEmi6mYl45)2hS{!dbmboTefL(-6VBz zyhe_6s0o%=b1kA~ZEvJ!k*BieTJ=qg zX=w8%4Nl?NJhKrWJ9^J};?y=(z^83h=ZYpZHsbYGolSXQ!0ra-*md;H8#>SjbQ*s&bYb9lgPCp96E}VF_U;vE zwpY-n=~g2>^5r}yryO7UcJiTb+{YX3iH<#ZLs#CzN9Fy`b@uT)uiV!GwA;H*;hB5+o=$V$Rk-D5zHR){EScKW*A^cYqwo6GXt<4j+vIIOI~oi( z{-!_CBe&#was0t}pn=rt83+zSuF3=9J#a4bx5d!qt*^*tX3~LxXX%K+18ciZZLbXtibFSY!>Tf2Y3vj z32@R%;FVR%A-Y8Nk;QU~DVJkR8H;0dx$Ghez}9HJ0ERENeo1yNi@|0GIr!n>M^=p$ zwY)9gDF?n=c3#Y~LW0;IgWvE!-Gc+=42Q%ekhyhOAa%Jj{tlkh?Bv(5e^|=VihAAF zo6l`bq#T)b*?HmjgD=Xp`B+ZCmF&5%>hKC!r*+%)>^BO_xv$&6$>TK@6F$5n-v@;~Z2 z{QUPm$KwB!&p;adtK7V7Rh03WrZ1eGouPcZSjxeu;#|Cxk`pvE(5HjU-;Pj+9X+}q zFHCX}hx=5?yf`^2hFaB%UKl)4e9c^=yy1T*(^DmT3NPVkJQS1hQ_Qc$4;dWl9O>1_ z*0szfH);0tMopdApgrezYxnWJ%B?I^I$GkEwG(Pxxdtw2Dfq?QJEa)zD%!2GQMuR7 z$gh2myjpk4o8{B8Oa82o*1a6(<(W&}RiK7-XxuA}N1BhK zvjfTS2;%qpk>?Qs&$&! zCl9HCo=IboN{bV@Kb!1PSA1%06&PwuuMurtoR{*`BUN0)?5{9MX-VWEbG<7qNl_U; zQ<4{>eEg}>>5)VPddSNI-xqqS)^>KXb70nOXD>Tj=9rv&hlSDSuTTX&?n?CA2H)$z z_Ijh`HZ?b^5#G4*SuwmcgU<%L8^LI!+isyJ-pYKth4T*jl7;y66m_oD!mS7RtK8GU zn-BELXXvRv{!*`e_*9QS`a-8}-p51ynod7{Q)eH&sVi^1uM3ag0&icn)ZjmzXee}CzV?NSl zgWF$||MlH>aL3`Mee=b$d=XQ3GuM8`C;#8xE5?K68E)gV!gK#@wAx>h?Zq-R_aB~` zY_E?k*&&CAJsjYp`O3zPb7xO_+o5=o z;dQ|G%sC){UOgOAKlY`ci!Mmy-|LwYEiTHjkklU2EAtm>ME3F-E=g$qz9XF*A|u+IsTC z(JWL_YuDgQ!R;n|{nn0+qknu4Prg?*wD*WgneY6cTsxmX_c_-7M|}o19@xu_XD__k zo%BX`!3Ez#e#UP2Jqud9V_IF~Yt_1XmAdfuZKI#r*u)I8zDfBdWr|5=mh9y!TMt{b zlY9?@&3Dn+Qsa39xmmolUC~s!QGo_3A&Ub`rae*sNEyarbF_oKOoQA1$j2?x7_xuKP2C} z{R;0muJ9Gd6xDM?NvlsPuIniE_7SlAi2Rxkv-Wb`<2r=DiW_`$KX~ownOx^wJ>Zk4 zDJ93uw8<4?Wm8iZm61hOQUX@9hXJ!wvd9KwWzr{4&nK6d=cU4%F@5tQII1}X#c*5` z@Kz2`{>m6j&Sr8=09sMJO~J_Z$Iu|1A-Cl8PEDQOrs*>rkI!ppW>AHliOTAv7uX$v z-*mhxnNgSb;Rn7VQH9+Z%5I57_Z_O7eX$RJx5hCge(lA6)4)#3-0=z{;6E16&p z_}til+h}={!<2@U;4w*cXP3qqmw;e zY4k6xtl*?s>7~Vs_0pn6dI`TYx8Pv<k!TZ0av7Js`sYVKOI z40iv5+x6gfJ=(GcbcIH@ZT!kRdOB2r=S>dt#~s)2FvF(TO?`a-iyw9O)em%p>+Xdo z;4`>8&s_T;weilw)YV5WYCl+e;=yaovaeZicN3YMGibrK(KFvkkKAOG7+u%~c;;JA z-_XJ958;+y*3`mDZRP%1!!O52b%53}D`kvz-pVB9{=(eBDx8I`PHeB+XH*e}9eU6jo z&g%g6_MSsz=IkdUXYT^KuRWUG#peO-*QRao$fu{YcEbks(a$yC!@RC~a5I+KN2vmn z&{kyDz@e^CKuQ)KBe4ph_Y;j4*)BW*&z>;8cVTd}cLlA}Mq;(;9T&RqhB#MZ|H4EM%Y6rU#i`kblH zt(?JbXXe|kaNVfk?eG@1b2qQ)EPFps=H{Nvy?wdQi^uRejAg%DKo&t8{%XAmsvc=j zDI5?Vc=8VH5xjg|$nxX+!)L3ws+@gvG(E96X5+c|(X^0zyIMW##?**s(Hc0p%LZ2~ zzoD8;*|g`l{d~UtoA?ZjjrVBd)&XrhgxAW6?dXwqXvd)$?LN9g^T&2^joc0QV*tMn z@(S?MNGmB-G`-;PluQN0CCU?is(UcKFMLbg@keuIpX|;a**U)LQn`NLP0-gibBy=RoR@{D3TjwyH6eoanw1KN#+QuBAZ0efdBcY_0Y9>IxYk>bA5`05iw3qV z*U&B6`bu}Wo|8}XV8Pykvy&oF$_Vr-OH8H(RajaI-R?1Kx~0yiuSeR@5$ zNjo#s_MsuNB+z^J52$7J8jGg7ivD+DV=a7LIDF;w8H(~153fEtC57I56#Ys1l6c`6 zubOIb*^)Ve*LZC^dN1-V3^vzxg4fjCjr7Kw4G*ogjrzLF(mQX$*T>Y|jd0;w!0i%# zM;`OX-EhfwF>{`#=Y8xAa=zYss?&EL>&)x#=q&!GJK%!vI1VrE=oPX+$kD!dTW9f! zF&wlbVDc=y^DRaUdb=;o`;!>_?*yKLdGP4S#L{7?7c zaeCz5>$>{pyZYjrKj<&?!hZsrfBxg=_?JGlFl-unhe-YddiIWpMUo%ba_$BOEgu`sCd27Lg;T*jhQo)yX-oRxa^% z+^*)lhE*?@1bFNT%UJN@c#ca%v3_Uerr$4q84qCa-;uerBYbpI%X`r426L_P);D-; z=I7RKW^voxhX;}sxNHMPJ9wfabBCkuOug;2NK0H6>1CIfw8)j$<=niMQ-HyGS1ol# zV}Tyg+S!`9xQ)D$mngcL9FrdW@&`)cuvEwsZKgB*ARAXZeEhBDNKe7m$qIi%vH;?I zn2Ezp!Mi1e{dN<6fiYwm#WKSSO=8~)w>GIH?l*DG{*S8hp8wvzo&G`;z3u1(SEc6o zgE`S?pCZ7b2sBYa_-U@t&I3E}schw1O|A}e--v{GG}%#jA4k)RWks6v2z*Sqh8XP? z`(h72G61~&@m~zEEO#F~%jiqH_;H`nWN|I&8D6U$)bxk19Ads*uaR9Vl+~1~<~5x< zeCmX@!lO;eMgQE>MaEyFd@>v4T`^64eGr@mhnJsJ=<;I^`lSjuVRPIH@pJaQg`bwI7!cNB_37^b<$%qQIjC?NdxLo~r@D?BzYdCN$gB&nBxo z3p_TsZSh?}uWjbm>2THz-`wDI3izFwLtV}?=c%l8@ZS7$Y6g%)w8a&DDlWa~eN7MdrmJYRH}V ze{IyBiwl}KFo2I)Kbqq?xacElME}*gd83*)tt58^T#W{^W9<~*j9z;%LB*SD_3%$$ z>g(_S0)P3qO5mkkqpp1S=YQ1GpZ;DSe*3LH`r%Ld_`4tV`e&aqPrjk4LkoC+8=o{h zKlYR7xUdVKGIC4lE5`DFEM%5pIOEM`ZjFCwBek>9Ya3q{b8KY3ZE{4~_+1@6J#fhB ziFcvf2CrMXJJs6VP2B@Wt-D>tW#n(Sb?M;4*WsewfG>7K3$MJT$KU>>*T4QjcR&6@ zH{be5JI`Fze&*6AZof%h_5=7vkHFdwv>VOXF7S8HWoFuFzvl4S*mv~-b@pj(J;hx7 z{4H(aH4i_0NBi(4-*fF1?I5pv+oe04<4u11u}1sfm!NpYVtpU>qfV2=G#WM{rwl8k@JO@&Bu7!eDHzZefurF{@N4W zgY$RtBs1*=G}_?w>>PFVmMLx8v_0r~s=g(P@;+Il2PP zMh^A1gMPR8@5sD)84eq`Ye&5dAKhTEH8b?3)bvZ>!7X-#$Hs9fxNNx(OkU#r68F8t z?vMy;@{`Y{(`#OV7?7Jbq9ZP0^AMm)6<8$W*@j1-xn)9mF@96 z_a}EdkMDaiyp?>}g#?26wp!}&B6ES?YY}^urOfbc?U$lqq^7_}VhKI`kSO{P?0Ib1 zbJ)|Lck;s@CfxZsZa=TLe-od9pfHo!OdepU3;Z#(LvVxxlH;hO{nd=`P+kEU9C(7d zvY+>XTM`%%P9GL-2zeG^ELVDAwod3k@a3?!V?O18_LJjMt_e$RIGV+*)QV+#uQv8J zvUgy=>_sL4J->Elw<|~L(1ejKxI7>4({8o(b*c#cQ%FjvDpvI|*XzSik-V|??Ft<{ ztB8>+N*KGY#F5L29zCy+;d6={=X~OZqQc;EZfBOxcC;#K-llOGx{u?@t26rcQ_O#9Q-yFV zY4gmyHgDgf@vYk|Yl7pt&0En{;=Ka4H`602>FHG(Ip)z#%N2p2Z!j9f5IlLkz;4&z zF!smnk-hOWpkM9o>u=dZ+fkF-I-|+L6TpGm)!>zt1D@OtE^_sYXKqBz9h@u2plq<4 zV@M7-&V2^E!wd0VDF735WgnW&+&n@5)!GqG+fprZpvO&3yV!xc8{A$5J}#w}f3|px z#}}KLoX1Tsd@=aF$R5nLrN?duw)2?DyITbIFLp3L4{qCoxd!vu6D*~Mw=$SbUA_d| zUIdrM8qJtj(o%(2*($l!MY*fO*`wwvv@9MT99elRTl^8t{QhNT0cIXxWyM~CnU9@| z2lIVqg)eh$FrR;AnZh{K2O< zIBMR}VVa$vQ&CX?d63l40Y2n7_iJc+gVt`E(6Cu>oD0zfdBgqm#`nZOC_p}3FFcq- zc~V>Zkh$TCm%j^nllIPdnmLj;g{OzBD_+X3?$il^N~IR9Tv39zI6h8ke$1YhkrlBD zzY%JOC|_0etYW@9sGzdt3hmpe_$^nJFnvqO(|44#@s?sIt}1Ngf?_w^P>jLs(JP8J z7!6j3k6yCidF&>hx8=6tr*125>b?>uW|i4bj^U~lt(Y7{TinaP#b422X*|8~WVBxC z`DnJewr0~OPyeN+PNBz~2EROo+B-En?^!Mvc@4%}Et&aulF95!#XB-3fedmyP4Z*a zwHZIyhI+N{*r(O|4&bFdr$B1)w1zruId42auB&VP0R7!rbYf+y98FZwFj+2_cA{(A zg(sMqRqUYd-K?o2(^@{+rnN`bY3J45)W76nk9DbRxJQX4netEYBm=@vMU!CmWDJ_G zDE4CfT@$^@@C;U>;TLdC3-t9=9Cb-18u8=^KP5Bc$OwZc$ILN+>$(qrBS-vJOm?S@ zWl@tjz&Y~tCf}RaZlg!O(rCVW(Ba@g-`|Ia?JBKgkF}zACH(f4?7e!PVKe8;4Thru zTd{hjy3Ja{bNaf}LA{;L+@%oi;o&Fmz&kTN@pp9M&g<~SZd-iNjJL`xz3qe79?}ng zgm(KXb86~nyi;Zlozol|o^5Ed4aa;2Px4I*M>V$RkjC&;+kNAqc3&Yk`p^Zku1=xn zJ)*tW;G)0sJ{jKcf!lBC*u6KXx#6Y3dHb9``H$fCKT=o!6%@j7CS+YiMkWT$DMj8kA}0>cNj-LeMVb?VjDe`+~!3-StML~@H3=LfBV0P;c8>JcJh6;k^cb-Yb~@UkKSfp<&c0%oJh*_}(Wz$L;6!_HW`d;KMA` zH_Vy5M>6=}U!_)8D=dp1TzD{^*m#ekb&O3(ly`W5#>oXca`u=`opqpbc=8G+R62bhoco4&73U?k8x(Q2+dZx;ONwx}%Zn)u;+u$>S_%HoJO3@zXaIH**&ZzNgs9TZ$e7 zp9jt>X85wgSD#k&&_zXo-7)K~Q$PkZhx~*t%K6>kIMa+QT>!+!Iv#3QA)i~V6 zjJDI_sb*%^X?bLSSZ3E8;n!!vtxwOUPtM8(ud}nr8p|r+e(;>yJB7^g&Ctk!?c``OXK3tJQ3pP8>qeNh1yIu`!#&Sc3m#*Ir3KouuvMkh z|7rO?ct-o<<9zkExyN`}c^Da3Os!iGFHeB%S~kwh!&%1qIjYo~`d7!6*#GW&C(HgVy4X^*yN z>7w7u+M4=j2|TpLi}d@KUepUOzNp{7_yX5cE3#8!m0WXw zgu1b?fWApFd_HdH7ovTqXOYKVCm&vZDYaoEv+f4!_$vCn>8S~p&w$B)IR5&(Iz#5i z8SwkUllSope^)2&zJ>1kO&z@lrayeoQY)W&@HRE_TRML4Z5_Sy7F_W+wQ!jloW8f= zrp=$brTHs&wQw6<+5Ja4`50asKYRSv6Fgnej-d}fc=t_ko4WhK`#Syrt=aw8;ibK$ z&&U+{0o*pcG=tgy9=A=+ZSdRl$^Un)ZM0u-(Wtq9G&-=ap6Wa1+JE@;BYpNh86xyC z9^Ji#ANh5iy>?OSc5Ias`z3oXy#2saFHbLdf!hHAXbRwf_kqm=6Z0Bezf+?dcWYpD ztA@sB@f_ZdPr`1kSO*7!jI++cEovK@!RuhNih9QAYbT?}W)6(kojrRldlxcC%wnJH z%AVPH3fUX%agao^ZvT__te|f0xm!nHstCqA$vBEtk@=XZ&^z& zF8!b0GV;pu@IwzH`_GeFBj4iJ*Slp#9aCFnPk+!0KBX`3vo|XsI8^26OB?#f;Mi?I#zpBn0`&@l~w@5fYD zLfx7K=NYbNJauS1=LzxgijRw9#uP%oI8-rJ_>j*wYSYm%tzYQX;I?J>4$^NOhSP)} zTWUp_yo+iTJh)#m;BMU3drAPe<0oz^5}XbnyrA&4mlU?M;O z^BqM_-&NSm9YxIER?@_@lG`(t*OR02e)LI$Yseg`Q5IPPd1a;ak~tO^!$~8b7>|`) zxZ>Fb9MRZh=a-XlVDwkawhadjOiBZP4QI{ZSPD3m%g?42=c#;kyAI%a(y?|}c^$l$ z%!gNQ9>pWvU-1ddCDFN>9MC{`-s5|>D7_>YeY8Dwzu_GC;L%Pdw)(VmU){ua99d4q3-nSlh^aJ_=hgWkrD zUZjmJ9AGoIz-wbEJwzLhRyIrY(vlbSyO(~a7vUTI{^ghS!lIY;ci{Ek{r>m*-3u=; z=O7y@A`+cG`>w!Hyms(jkAe#olcEr6z6j>4VH|_aZIpuqH;hZzeKJn;%*4sMu=v6dhkI{?0p-Yd^jXhvb zKy7`JzWb?H*aJNJSZ5x8%5y$ukMN#uzwthPY2WI{AK;U-EScJtdK+If>T65C+|=IS zx0!GMirs&v{x<8|FPUlMxANJ?@9XYOykfR*)fC>eo7VPg1AOJRXeo^b-kqM5BRJ~D z@&UX3e7qD&Z#y|PPs8MpuARd3X6r$+d=6@Ac8{j;-<;iZg!%S@HtyW7jk^wNa{ECI z&K`i*uv?9rwkaUL1Pv7PD(X>#+fHDwv#Xn&z*u)`Yg2POIKlS@dyRjsJ$UHIZ3i&h zg4^bP>QNUk*VN(m+%{hH=K1#Ev%zR{pCikepL684`FUHT6Eu&3-3GU9c-$;omL2^W z%WF7LSA)gg^c1}O!D(MV@Y>IkN^QU=zq#T$Za=TLe-od9^3Azwo$V&~v5FcP zzkYmEe1gb>=2+TTZpqL~H8XCsLL)O9$rrhXNBK=%xpi5WZ=Bc0$zk>2je6qT5v>~R zM&E64yM}DgO}Y%mw~{}RM=v>*`ZI~Sc>=hdm_XKL0$Qo)P&jHqiYkj#`FOSZ7Y4L! zq!16oRD445HOC97sHIYg_+h)|R)fL&6+3%NakF=n0CvZ3xTPp&*%8Ck*!0N5%{ldV zB(=7gb;pcfr%!%W(Od2+9NZ2E>tkm4xz(HHnG~jkO0>~iCba(WK5b^L-GP_PF?2cf zGq>;E1qZrC74;RGn48q_?1VuBkS7Ql1@_Br)CY2ZqAI{VUa0LuUAQZjn2-&BZg&_)wCzCio zik!?kw5qWdKUOF7)Hc)|w(xBNs6E`dzS`Ou+@^k_F0%3^Gm#!&((+8SV+HVHec>NC z(BE(ZV{I+V!`GT?AoE0PW{1r57B6M?x0qSt;up0Tj5h1#MK9>ZmwvC8OpX1*i+cGb z@EgoF>vzBZokbUB=ix~fTe5Ph;Xc&0sI+yJN;?Ns*}Im%+b}%B0hKY=DDN6#{xQsZ zG^)C8@>qLDRJUrKI@ir;blYzBM-_^IQ{~8A`1T>6Op_s7Ji+!_SOo9IyMy*LuXh;Sa{2{D*J#k3W8E z!Rnu>q5mGtw&3Zo zj0ekMZJFPvnZ1X|%R9{DWR;R%I=uI&HlMzzVElD$z&=xBo8Gt!nC;?%7ZOKzH+skX zE_eFl9%v@a?=_jVZq&G@4mX(Y%DFQ?=jBBY9UlX`Uoh0nMhuo(up4Z))WhJj3(s*j zvoC}Frq)d`Ok3Mj5I8d{@@;yLH#-7C74q&gFl#;5}HC@VTfm70)sfem{dBla#^LJEA za-@dV^y!WFKGexq9?3H~75*$af~;_G+w{YB?>V63`1su7@4gPcW?Tcf-Cp~fxMu%n zsVSfTKmU4Pp?<1NEgQJ@;)hYNd^x^ML->Y8%LfckM$ed93SS!B4q@Iswt2m--@2;X z)Z3T9>?^k}YU8Fcb%EPwub$DtBlt$lZy~3n5QByay#I2 z#V4guZ^knNCetD%Ofm4Pi`RewU0w97$owXIGL=1aas}TdygQ=kue#;dDQxHyZbEqUh0=;pGDtGUHvRG+D|{r z^>E{cAGgnIKlQYJ1a|-E$3NCTv7R2sYz^mm|BP%E)HSPeaEI#2@n}WI-E){3D?Gs4 zz>yZTVP-YrgVMV5FdjR{=rJEs4I1yttq0W2Ty_pwA|dGdoC1TjsAoW*{`-IG4}ble zzWwuG^}E0PtG@lqUs>k(ulns@{!PF6%ir|N@BU5SeD|;V@=t%UuSb9Svp)YLi=RK^ z_{DdB(bwiSbNLV7>Cx}MvtR$2x%`Jev&`{3eZk|t=5>C_bA8Kee)GFO>g{*m(>-Rl zKfjOf%7eSiZ@*(-_Bk)G`xC>DHnYCzK$6GvWT zB)%YUFF}0A{cS$%Q?2s%GhCCOOpQ4O>@@RR22ba~xp=y{Dke5jTkv>m8RqjFCIbck z&E6f%nuF2J)Y}bxL-bO>Z?L=xyl&aTy!!UN;LQcb!CtWR@tQn!s=dZG9QHV{ zb3ALhxsSnI`r3xSo<5!4G(S(bWA{uucWv<7VD(t`h2y|pQ)f?x|2FG?e{OTxyoOok zHB3D}%Ad2p1n=#&_xJcc25xAaS!2*ipqrS$_h`a+zDtwFkzq5DJp@_1>_LsskNq{_ zO68^&8aUzVPcsGRX&k{WJn~FpP4}Y=8Xr$W}P^5LTApOwC8%B zzKH*G>t+?9Q$9ewU0=0ci}O?QO-<17PI8TUS~bwuspuHvKNiAVRj@+Qc7-qt90-QH z^PDcBR&=2Oimk|#b0+%Q(k#VP;PG7;MjnDqf%%zs+@2ksFVB);d9|LETiZE!Z)$F| zX4cB%Tz|x_G54xHBUjVYETV~FMu+ADR(n%tdo+XdZI|U)+@i76ygqrJ%4tc~ z`T=i71%CAXRXoeNMw8}S*UUWeO{j;Si z=~=1n{k2+OU8qFzydsjp-$XxI61?d_rYUuGoIIlE%RP?sNlUprycZ}aFI_Ds&T8km zvs%+us@k0$TG&#kg`3lrRi3VFykKJsQse=jykcNL`(OVFTIoIL2gt!*L3RgRKo(l~ zwe4Lx`sU9xc=)K|(_`e}KMS6ElAQ55U4Y(jzRP%Oyyw6QvJyF`jhl=IwVD6n9QYLc z_|tIhQ)bSTtA)OWx5dtbFK}~XuHBV-$O-Pn3C$C;__Jri@8V~P-Y{h05>@QnM@Hf~ zblP}^;&nD+*4fMWi_=#=c@ZxYlkIhuh3`0;?wuztkr#47{ahYlW_nFol~U3(@F!2x z61?l*{pD}<;L$Jb>;7lo=%Y`*)cX$~>HUwt&^@mI_?utrA?v}{ztp|2zR^97cR7A! ze*WfHT*qV0`r<3ye`Fr}iG6+a8PD_GXK;J8pKaHnf!zkT?K9g3v%zb#KH`3F;jz*?G)T`R0xtk~SRbpb za4BBkv6~xN*?g8}d3bw+jbzlBnimY60dCGkqvi=$91#@4%-3GN54Y943*VR>ht-C* zu4RZCo7LREU5)IMnz!y&eGeQutDAk%saN09baWNt(49@?IUnQbV=OgCgTZ6LOM`z# zhc=nI+JQRX!MqRq;^!Ikp6NG_2P+MBj-&n^H=Y?RYTn6H40amaHvGHMyHU@7Uvocx zJ%ib1{qL{)_&S5zPe1#t{%?9MPob4~?is#!KYmL8%;hokUJOQ?e)@B8^``%Bo?{A} zlDU2&uRWFT-Hh3ItC{bs(O&TV9nbgJ%h#0*ag%L^KEnl{Wwab#{_Ky#eAKYHQg8nJ z7ux^)EpXc(E|Dx?=2pGDYzpPG-nMg(_MEw(D|cSi=H0{c&rV`C@kt)o6KwvkgU$b^ zzeRYuFSAN1Dnvu(6b$Czx3RIQTw$3J)Q2(nmy!FCnZ%rlw>H*S)6+h!^Ow)+)Ws7z zO@F(+xk?52o9_gt>*~w3w5UKu>z0w}-Gk5dD*RCgl$0Dx{)U;W3Swpoy){}jzW_ga zq3G4Z-Q}KzFIq#qGFr)Wu8mY&1^z}Gx$knkP8Q?yl16_!CRd&tw}ZcD<=#P`+Tb>N zGhga$w++l>mmZPZCNLaLnwb-G2eaL{>Me(M zYGw0kwI3W%=|B_pd!KSEn6WA^vip=4s=%EgrJ*%}FinSCDJ|8W1UQv-Y z;n{KJgS$F)<%ZJvTY3A=KsPXfdV3N%4B)owc=W!{QeTn5xd87eYMf`yd7Sg%(^K%V zKo4w-i%}fjXQ^--X&kdSX5{D5Bgn>QH3KhF_HaCJbm8W0oxM)p$CYck_~OgD_R4Fz&bs>YE4udbtGdSd_QtEPv)<5k zj#ppede&9$d-29?9Y1#w4aOxMzj#@vuiem@=WpxMtrvBT=e~aXCGK~J``^(`?t5_0 zLES<7eeWJTIoSQ^K1Z7!*l8B&Y3?Oj(Cn-*$>SHx2Jv2UC)?FjcasiV7G^(lk#&HY6tV^r(bzn zJDGv&Va}}`ADQlvgX$u?w5|t!gZZ}lUbytW9qftDpa*yr|8VA?(E1x3HrQ>nWA<7Y zoHe~=qtiCM=$Yuo=Q^W}VBXtd9)3w^#%H1#pN2l%TsIT{?{V4K&v*HH3cl5 zLd`oB3>~ez>4C!)82mOhwpj*e|6iDGt~VI|{WA5wslUx$@mcnXW5DO9#ykh-gZIi* z!|#(X!uvCrZRgufy>9Aiu-xeBrc9s0OpDCmE;_a_+{FMf`@6^TD$3&_S> zjq}|9>0J5bwtoyv`|t2~a`l>_(3DUut;GL08!wHL5*2J(jixFGFU>^7^TzXmOZNE@3{X4&8KNVV+vso0XD`&n9}U zkZ|hlh){anf%5Y=xa}sVP*=I8;o;p-sOo*qDySkOay{DZHPKpBzg}?#newL>IwLxp zx*AWkR=96;;TC4PY|MUH>1%tTN%N%6_U5wDqq%e070h<6Iwha)IdUtw?L&Xt8;;$- zwOv8w!HTbUQEHQ$(o5at8%5vN$B|6%Me@MwIVc;C5V9^e!Xcz&g)z$%Ll##8dl+Bl zXxFHBdk1-x@mf`xp%Uuk+pA8tyODR+B04YsqIs<($G9x z(0{uqa`jsEqSfAmXUTr_U^~FulTH3qS+S$uI?F$*8=napN^-!r+d zKVEbN>C6YV_3AXbykoDui=W%`_`97z8*xBY%(2yi+jT?u5;3>F1<&@4on6c;!-t?d za4>u~^|ax-%^Jm7`p(R0Peu!FYE5@*0N(=(IbLpLbh+X^h8IYY-F%mq1mHc8s3Yv1??1TDUizq}ds@jD^O2jy%5005qCxc62p-Phrp2s+VCw21h?rEhr?Yl2NqwpR6$@=27T_>4LR~mkCkf}wRgc{`6iH+ z5RrzSe8|p|TiPzj3U2!{mu;h;?FBv?Et<6fUzJ)sR#@JR=jFxnfgks8zYN~PksD1K zeeR&yY*XGwH1or) z@ZaQiEhfjSd^x@{xmwb`QLV?fD!-O__zfGi42{6bmTDE2F2`RZL5n)u_2MUA>%_^^ z;2jy;;P&E`c#AGuq&3a0`uUgN=ou@8E@8_dad1DuMM>g zcn07p*50YM!L8~9t4#)T@5mnYjqK8vU3=BHgUj@T`-aWs-S*WxjOW-0mv`>QA9atq zS-m5BHL!EP21fSD+}^|Ek6t*h55ehAAKud!AK%y4;J1ASjJo8W@dYVBgZ**jGcnV z!E`Wt)-3!5x$iXk&5n-q735=60<(lgxl7bo->F0ApVu(_MAI-c=mWdeM4jCLSKbPz z-itR}=B7<}frHU3)3-KjG90tvw2eO8;O#g#@~QmnX`v6|>1p>job7Jrmz|mK#H+`f z|3miWCI@63_&x?a9cwU@n%Cg6;i@O2i~OH;HF!D^Ts5;{qw{6(Hl{X4yJqh57`q=| ze$1B}d^dV`vu`v!ywSheG2h^{c`fR4yAICaHJ6Ph-qiMnlb^xoXEbSMhS9;yG0vQ# zkXW0d^8A&yK30os;fU5{C`x6ooDs;wUSGfLVeV#UHf;cst&*Y#d+%4+M}(z z@XKu8MAo#K@x@<^n%m4l2Q#N(bZVABJlA3@@?J<@SnYB$y)y7DT%w37dhV;z$;pnA zKl9BVNtv1vg)h{`Az7)nZOzPZH=dJUGc`0?G)pZSbCw@IEVf#F)Eb%Z=6WA=e1#*BCGfkCasOSFu=|LQFjTGzi!D?3sZx`JMN zR)~u0E671D$MbYpYpY6?UJytAwaNI5X4ZF&)}ZB!OmLQ0@Km`5P10Q382nwx6|qew zOBEk>8*^b13pAe@v}s10i>_y?x1(HQ0+hI{0Kc2HT3U?18Q8s=*`;;mC0dQPrwBY> zylMqGojK@qy)_X%UtD#S-u(UV_0=E#sIPweTYd8FZ}stSeyjW6eyfka{hhw}{U7!9 z@BgH4(14laum1R*ev20D_vprck8bSqdmpQIEuRZB%TeihiYqEs>IQV@8>^ICTt;Tx zX7Zh?(E?U!c@-M{8uF(%Zzg-DOG5_^Y3K1%+I{?t_Ms0rWM60SR6C=+=DL$-bpQ_k zfH`v8!INinfcx(|ep-i4p3@PsxXn6v^o;hPqdRcwj9#Tb{oo!N@&}`uv@f_k%8{FT z`$I4s?)*cOIr6?9-i0Fv$M2$B`^h_RsTPiDF8>=dotbgsbDcq5JsUlMnG>FYSJ^D| z^2TSy^poenozE~lIhW0vjwWq3weqxCGpHjc@iX5i_zVm9=?|wK6B4G4<<;87JbF9Y zzP26Yrl3)48rXqejs41z(`q_?LQk_dm@ti+n0~p@of({)W@>MEb5kRa8H-Qh__6l) zHj~#huj{~?!h3MwHO&n50yk&042~KH_KpEZpM$eDb@2q&c(`hV&-OVogRx+$S*8{q zo%ezVHypRYb876zwX)&r&3iG|*>B^y$4#Mc&YFnVidm!2Yo3qSGhF#N^lRq%c^!lM zhBL5hq2F(gy2b1TTnewMK886it z)ab6ve9uPD?&Rtrt8Xw_1ped(^ZS!MJjrB;jz^=3_v;f(`^U$${|#w#o#iad!0)IKFTO`U!G%n=N8`n5&c zwP%OQsnfO(Z&d}Fkl|h1wH~f@AJ^ySWZ=CKrbxU%BO~z$4Z)k6{;_ueGnM$D`=)~9 z`QZvLNKn`!yiUsSz^;x~^cuXt7bVJ?oI;i$T>bh1aQYN=HrR~D%trm}S;q`F^|p1> zDcOwwDYIWzmN(0%0o-o6BH#8a_PX1H*)eaHAN96>b)=G-T$SDEt;pqWn(Z?kUo*T+ z@CBJicEf^5i%ReGrJ<6coU01RKUUZh+lak2$*hbD5c#7{# z>y9=&$)mKfw_9gk`w4y5mz0{DN^i0O%`kg{u-PiyfR{=U^?TG*vOwp6=RS7NnK(X2 z_q=RnbgooEd#YB{MZw!M^AhW#h4Anz+6(a!8CKoa5_t4DJWnH4*c_}=jW!7GCbMJT@+C2q(D|!xu@bQqM5lvZ;p4GqYu6})&+76rG8EdWPgHhU2cMs z(ebCVFUiPd!Hp**#VMH{djfkmPk-`PJlz$)sakLS_V@Z0EdJ&G#WpVk}tY3obU;O&l`sTOa>a&LrRaagC50j+GTr~3d(WEjXmb<3wf!Bu(E}uBf z^=EbD4A^|y%{2`I%@8F_7ac5)AaO39X@$MdybsY#al1v7x(V!(~s}z(L?HO z)|dCeZR5WJK7UNk$Y*x%G*f$1DGQGHV`wz;m6Q z<${mDhnE#yfg{+6mms)kFnta^@HzJ5eEPPIqdtT5zn!Rm9i5#xG9QVC$_Gw+Vg7Rd zrw-Zc>$aT-$WGs|; z*Bxfin?}2B$3gJat}XwbPdBys=>7rU6?o|h)6s>&0ZcZ_)bOUJ2Z!xCG>*ofWdgW5 zf%<$BYw{!($Hy3LaN6MR<6gMAJjvAl)ZF92Z*zH6Gj5*4c)Ebc)ZhlUA3w*aE^Q*Z zw5j$z#~Ah=V<(_PpTev;zG;C`9*WHIB_oHtqXIk%6VVC8Pgnl>Jk3R0YWhGHtA+C# zzReyUeDxq}6`&>L+=i`4)UO4-lspt^?JDl^M{Eq+ldlOgYh=Wq$r4tw8 zbzQ9GH5E!*lFpnF9)eMRa))QKQX|ji+_a&t0u9bNowt~sl>Qu>w)!Myp zL~HOCAKpO^vb$ZwBimHGevNj6X9eJPLNuOPQRH1d_8*Ii#)kziIfQyU$XQPG*X$DzC#^>v}@9wkt&W?QY8HaaLiMn+iKTmD%p03FJ5!LM>2*^I76i(qq+cNDpztNA;Fjo0u7y>k7wE?j?JSFhi)U%qnlMV-HK zQ|E5nVBJJxcAHGj7vN~nmtDQ43mi{T3)j^&DH$z6%%TsL40m4Kh<1X$_Q;Ww)X?YIJA%UomrtD1!NZ5O8!migcqg-X$H8UlYVi9Q z@6llPY4G~Y`71gJUY|rackAY4MaVz1H~LTzV)Qw4%9znT2X4u3gXmr9`9On1_Fieec0s+Z;Fqqqmzw@BXnD+AKZ~bGy;$&4E*x3)e84y~`}aLCl#?zaQT; zYJPkD4<9iD{}~6v^Rve=efrTp1N{SZVEWzkTJZEYSJ=nP{OX@u3*7}i?(@QX@w&<^)~#t&8+sb z3TW+AL|r5}=tx~lE+tvl?lErkw3jHle5G8Y{pAqmrR8{})O0kX|Bj#zU98fwYL%8& zYg2oNI){4g{-h=oa6@U0%F65TyJ|!`)geFfP(mX8IS;zxX=;&`oRKPe){*h}J_JrA zd(cZ+?LkT{rLGEmO779Kz}bb$A863>EnBp>zlPlH2zvkH<(TH6xEiaHIz5!qzuEwPG{wkA(jnRXLY(LyUSS_{9ftYo{CmJrNu=_jSH00G*4+QbCm;* zXEb{&q9RP;70Z;oiTV1)?1{qQ4npTEEY(jwVEJsc=M$;T#^H?Gj za@aSPpv7t+zp6zI_06imPqL<^O$}gcOJlq08XNKaYE*4olNy?vRo~JK{?y}9)u_tq z8dXy}uPP};3%5!e`+C%O7A~8*ckt*jt=U|q!qv;j?JhtsnE;2s9DV&}Z6Ir-8_e1Z zP9HgQ4&T1>;MN)N`HXh&-mTi|O8!12+O_WhJ)EmLcj2-wU%I60SMeHUPjUS!`PW>3 z^#bb>>)Lg_`R1GO*>Zw+_5!DD9xixx`Ju-|n}FtH`3AgzQ<9k>W`2V2gFiX1Sxa)Y0S#v( z``W>Cr?vI+MQy!$U4vwob{-*%91r%E?PR8Gr>Bj6u5plAux;QrdbEmeX1V)Ev>V-D z^U)KUh(>%q-Yt%<&g>7^UvV@TZt8azPxcGw++9uGNpIVOqZiAA%iheTS@8YwqVMfx zv&qw!nM@yVW&*iC%NdM!^)epC9(E4FV7lScUHD$RFyH3x!R_F^Gq3H!p2UTH%H#VR zPd^VU^U}=4S*UlteQeCZS>$RS!@k9h=XAGt@t)k7e{i?^ADcaei?_RdkKxAq^RoKb z-}_vCpXaE>pLy1J43Hs)x1YnLv3L|R_r8c#G)Iw(rYWjmhO(FoSyGvaUttj1cxrjL zfl>b$xc~7i`tV~+T@S}^vXI82*&AzqX3k>F#IgSn=jgkv-PwsfDcpie6#Uynu-cTNj0I zWFd3w)GXo7TH9NRo_sCmHT>K%^R=d=k~yq0tu851OH(cWtv(8iic|SUGFI^XT3WPJ zbq%Gm`OU+>+@C%G9^w8rS;PFbxxZDBNt~yG#w(KiqO1--C6|y37Cc7ovGgU{s696o zYe7mHJ@;ZIQa8B9j00b-O7HSfS{F0qJ#JvN3pt;zN^f-nn;n(b;Y5ZQxJ|vC*Fg>5 zVV)a}d^`8+a8^1scX~6qYK{Ed%*HGJDm;pFObywBDaEn=^ii*_%45t_oK zxyoN&K;NZ6i_oGkT~kDM=VETl%TN~~h-W%=u{^R)V;wgIl`SZHYTIo?~e5_NkK^yJ>K{>UxJ%jb~c(&`#Cj#nL*oOFNF8#p`Q7xb227@o2s5VzArJ zy*t|LX;(1Y-Hw6y@}Z@6vv}L_(gW?f!E8_a&))DY%t-lx-Rvvet>%87`04Uku+<#R z9@L5bh?561>HO@*e!$J_Ls(`u-IG0lE7uteHXco*i|fH|3(x6g-UF{`_7V2?#Pb@A z_XO8HEMPp#f;P_E*N6AOdt>g@;%Aiy@5_ND`hYOfSUt$V1{$%R; zNqD+UWKEzK@b{iipFI8vrv4D$fz+lvJni4!k7s?+$j0KUwWF1~W2R%q; z;}Sd$d{y35uTyxOUIe!b{obZG~^ zX$92t=}EClOpH|m-rb4u33#!D%ZGY?J$2c#ieh;3ndn;aNXP5Tw{WiV=-ax+Ovi6* znQD6nCMB*9C*qe$?fLC%3iZ zXU@-7bN|*;ilknSX^K-WoN{I*J{d{O+WJjZI5XXuoADM;;XIPyrSkqN`0iME@;TK0 z8&$n^7jsHmw2=9%lA1M|JWz-x2&&exx7WH?k^83lM?m)ZUy^stviyR}zD~|n3c8`y8 zyDVU~8#OhU3oo7nPG^6Q&w1=Wa^c9cJKgR1-R3@~F3*5RPwO;1xs#HqyE9uCaG!a~ z>~>LBPrSm*@?=4Om(#IO=^a7L%)2XjDOo8|p>_?`ztF>sp@x0?kAKu3{{7$er@#KI zzWXcMvOj;Pujp&<*|kdr8OaI_c84>WE03`0Xd`CPXRs(AZ}v2!X^f$#AMLL2g(=MW zF|T!;oXtI3wTj%gh$wev13lp(BFKv+m&HE_?=a5&aLVq%f$~n|Z&A2V$$a*;%x-O? zAHDxL9Qd*G^t92O9V26Vpb~A^GHo7QtHW1z>D>?C)ZGu5>H5&jZQ*Zb`qOu*snMK$ z{s0eCu=)`h+n+ulXPfo;L#}&Bz5Q^MA2%Gisk=?q_7?`Lzh93ynxBon{2o4OZ-Lu+ ztC!;SVL0RYa-z=mfoF{c8#fi^>fPHn^piJV)!x&mw5pnn*792B^n10sbBh}G9@OC3 z)7pKV{l}dfI{Y%T?JqDtck8xBZoHy_)7S8sJE%5l?Jo534L#^5I?49LAGT!+{zj}e zdfYpYpHa!yt#aTqv)9z%pfkAY;sF=VKHG5N1}EKFroJ{Bu-rn8&*Qy#Po@`b0k_RE{th;OU-rFzcCNtG$D3C&2DkA! zaim9k?$&jkzj;|3s*B|nVAJN#R-NNqbB%M%lz>NbQk0TY5*446teAN8ZmdhM+|fS#TOyKuD#;Qb{4_{J#*M7y;ZdX?K5v8^5Q*_l9#W#*9vUXVUEeGiF z9#UfK9z0dHDWrTr0UKH6L-5Rpl{a)uD|Q{Ck4!z=7_N*;FZeXL&7isR&2Uv(O(ZxT zNe_31d@|^7_t&D;Vs@OqU-3Yno~L%ZO+8mNSf#q*G6m;_sHnS9uh1WT;b%Y93i<=J z?VIEp;Gul9*jrAcalUj>>*0qJ3YRN3t57q^3yfOrue^5V?KZ+&Qh$5KIw-vbeC`WS zVPBZ?>0u|W;`|#m5uJSi7|dL6n-$#kQA#a6>>B##Ro+Uk@m6xRyD~P@)2{YbYPD6V zRTiag0^?c9>`9WVyp&V}$KL1$Z$6t^eU`lrPwk9RMqjb=w$v!Mw?G*!zKU4mgsz;tiou7Z8?fVXB**bWF#s2s^J9F-Y zJI!_CG5KmfJff2B3PmrX&yqoA==yZ^+yrZ1ybSg``R>6zCrhX`i5@5@-i7- zHOeclR1w*+C7s(;3T|(O+aH0i+WY)P9eCx2_T0XpeK)y$>m}{G@j97h&#P(YAvJE> zr3UolRW1G6+}f)KYVHnd?V8@LYJw}@kFU)J=8&hmf{Ea+8+Edo=~@6sJ>QPqrkuvDSon@}Gf{WhZwHNoX@Uu6|V7KAY&F#k1(1T@;rVe%khs|YIgNN|m z-oAeHg5cWC{lI5aQ+t5H?kt1h2D9D3MGr5Y11+~3dook&o8@j6@7II(ZE9<8UtYuJ z&HJ&EMMJ;FHvo@*fAo;PWOz=pYut_AZOWvHnvVuQk*vJLl`-2hK%0l?`#adEdrL`^f%EOZ+p&DY5A7;+R7(A~WhTzEeHqS#x_ic@GO8{j#~!Y(bq zM|>4tXbq}v!MAg1B7T&$eQQ)Fw3ZUmO!{(@n;z;V-IHiuG5&4jfiA?az6fs_bmtYFz0AsuXlU%n{a%8t{_cyas+3^zD!mZ`hV zdi=A&?Z@@@BkFBaYn$Vz_Qhpz+xV!x_rW{5`Q{z@#gVt;0WZz+q|OZhgR+AHb)=<9 z@BRFz+JEJ;GK$v1&s1w=b*IX@cBmNq9X`X1+VzV%_R=*SdF8rJzW%(9zKn;>i!W;T z%{%zA^ZG!z3FxL4dbtkUu;(|8Poi~nwl4UbOTS_ z4Tf{{pg-*8Lyj&Uwx+l2X7Cj3_V|7ojJASZK46&-nC9(EZwIXOq!;b&=V!-zgYRyp z_O^J+3ci_TG#jQr?Zxupb{qAv!9oviv-i)<{kYBxJofehhq=EqwZEy$?e(vzZ>hb_ z`*Y>JnmX7LfPZ@suSp&3#beF;vhp5$g5Y3yf6q;(A3bpldiF`obxo10<4iJcla*ey z4FCR6dFL@dS2#u10&4HHDVk#ezp3}V!D8?4pUc$RzWk0pX8H5G8Z7sNW8n2Hrk};{ z@I#z)pS;EsZ2x<|13n?%;M@kqtk|H0+G2EBIf^TfRP@?FRSh-h4qW4_@BLi6(d?eP zc1f46oY3X-hjsblDP4gtKfyd$cXtbO+ckJO^=Z!qG`!E>(4{*s>gdHYWDcTH>Tl7e zEiEdgHeH72TGRGHb?)D-0Wf=LxL1*AzbguvT+$S>L#?e{X3 zuVbD%#aBr&_2zC@_vJ~FQ zL})Eq;Q(gX-O|EUFa#&D1>JO67`(`Cci|A5Xc2i`k+)ogkL&ndIcR|VjB zOwoLM-#@XExvb_ixCM?aG1TeIZZ(rP+7O_aW-rAydn$_BI)Z+7Oe4H^y$>8ewNv~g z^l;3*nYz6j9=k6`;l+#PmYdGy6}&!k^#x>qXZx{FYE@Y~f4AN)EyMd{54!P#;Pw7n zZ&DYMfqDB4@*3{w;I(V2>|T!!AWhn60dghs5`pV(AiBU zTeq6Qu|DRYb{;sOo-N&4RnOdfog2Tiv!Yt8>NwjAZZlhb4-Zo6?MG$~`@y@^+orBI z7!G!W&E{yu&$P?0+~#`{f)5v* z0lqvo_~S5Y#zpLX&%w>S|BJUZaPpM0iz`&H0Y8~$d~EyosEFFR{qQkzzc1(%wf4C; zZ|dw%Zh_x7wfChLH3DvT9lk(*$UZgq4y&nm8?y*oRo>i(2LL{D1H;UL;ZIH-e(3To zEp6-26jyX%c0QZFGTJV8IBHWPn>AVsqm2ZY4JU0hXa>tnJ#Bi)KH#MVoyOy%6<*Dk z*=8%4W_sPD&+|RzvoEoL$);az<+;7VUn_e6A0Kd=n%!Wxd5ovQYEwH~(aG4nz(e!+ z(SEs?FSk=ud-6PHxxfvWpS`%BKRLe^aMW-B=KcCmYn%Opskg^FOu`T5IdFR-8bCbw z=}jbNq$!XY#Tm?O`WAr6`7>q99Y-!O*|pa3d=B^}vF9+a>CN*ReVh-kX)_#rPyqfB zW?#VX%Ch4&*!}mOPoF&g2`2v#-vM`DFKV0R3M?d(a%e#1yW3URmZ?Pz$toiMx&a;V zj-f6!Rg)uJk0xtHx)$Qwna?U9w`x&dpbB%~Dbs>fzqv#s>-G+XFV83Qx{y43 zvibsIobU_v*7C{%YPB})xORk0ixDy*%T(H0qMY@Mm0!9>ODgaiD_;e_o{6uSA6h#v zg{9!D8p$~(+=-bGbSxp{eupu;j1DWIDoVLc@b=67$rkd#bA|ITUZL)>uK0&HYkdQ= zNlOZqxps-xbXSsBhCZ!hv$}R~QSO?2Rc^1vpPaqK_DYp(t5WyzezGgmv~WGyYPB1c zj;~qDs>NzWYahQV4Q?CX)QTFd>FH2Pd8XzEPLVBUniA_>mDoN94%u9p9gMF zg69rY`etAJX{IWoBo<6xr}cZfl;68qi-+(Nqt8)DEt}biZxoue6nfmIo=)rapth#R z-Qh|v+#Bwio@c@&g|9)Qh88b<5Z{*meC760v-ZU)uMfVRxwxFx4AmbT(7@sSc7Kzy z_Fi3l>s_6D;~gEpMOO9muY=>SX&1g|hpt>DQ?f$KJ0i7sn~w@dn8De#OmS7K6toI2 z)_(lz2dTxu>}7+6YCE${%g9Z&w``Wg9o7Oj@cdK*8KWDxon=R_TFsPrx zV?Vf$?i)S0!R=A5oZ9(&+Z62 z+ZSHE!FSf=j5F(n208!^IU3wqf;QkLvygY+dxyN0^V)>J*|O>mX8X6QY;YgnogsSs za0WLn>FjGa$r!z*^9HwHy-5c7OB#9MHT9mnrsnNOR12?O(>8$D>lRhD_o-z7{)SZ# zU*0@8f-l|6T8M^!s2k*z5qrp~F=bD<@jyRn?KZzavdGD?4}$+;Phkz>{e<|E zLpO!Y_%V2;v9D*I&E19b0iKEptCM6|2(O;c|8~w~`Q(lvhX`!(@+tA#45jw;K`-s)GXwnye6qg-{|htNW6xuD zCs*~IZ7Q#>)@FPu%c;R5GNR=X$-Xyw9y)bAqdev?N9qg@&;LI4Ni;og<1^@szem@h z{rFhqXo2SfGPl6=CHR1@Sfw@awr-v?;Js!k7~OjV`AEY@PpgIfK}Kq*va+Jdzd-kd zNAqj+sqLZwwMs*))(7>54Z8_ViuA_K>^<`^u-#S^BE=KRQ0blfN^yLon zh;dLFbz^3$(SCa?t1(c)3thAzVmh9$0ZJ$hkW=J*#h0VeDqo`o(Fw}i)T)?OmGa3$ zyWO@*@GAX@PQU&O?Y;K0PT!;t zJ5Z*@%|Ti?;HiQwJkKz>N?YMV;1o)Bw`ooPI(70{tm|E)#-lA-x4m2iy`|bPQVvfa zqPQj>4c*?O6ZA0#*f%aigO=6NuJ`}rKlGRXkp7+5{?(uUNJb~VE`R!qzWL*y_3;;< zYtMmQ+SHBKyq@zn^KIdc77bn<(c9qbClBdIQ%iqw@7}2X49qrOXrF`6=4dju&C&R* zJfg-n-lkuDY%tq!=y2)ax80xI)a>-Q|0ix!%Ri*%eishv-0f?!;H&3JE$0I^hJb}} zocmWXpSpk$1m;BwOd-=*`ev^FFdGc zy}&+GUmAS28oUN;P0!lYt~M~x*PmJw-14Kow3(Wgy3-0@Z2G=dGzGrKPl4aV3btGM z|McZH8}+WieuIA=EHCidi`Ovs@!>YV;1JFOJP&-lADHXI^BSx-dj&gYvN!N$Pv8sR zZR%$qJ2u`9mZ6DUJc<0k39{w03dYkbVxAOztEbI__rP9&$NQmk^bPc9Pr(01K^F5N zDT)HKW9XyBB_}Yu>2LQ!{d>=+PagjSlYfZsKv1!#BGyNcf1OX3NSV@BkOh{MD)#^n z6_u@3Nkgs5nfGZyw>q$Q2YXZaGdwdrZBxK%X081k*eg50cR46yS*G@$r4HV=PeZ%* zgL7N7s3uEUbwNt6wI~$Ll8YaGTT>TAgvl)|SmF4V*zgh#1h-9=@D_YEl5%t4mdOWO zj!*iM6-vp=M9(sv*-_KCa>9qBQZ-u!;h_sS-^`=Nm}9SdR&1(K)3#xIR%SN)@I^JN z=_8&~TVJD^S~jYomDOIUdbDF@=)tRN*QpxKU0q$N8e1yR?KYvqyRLPN800| zWoWmH=ua2*dTMbmy6}N?^l|IJ%T?rc#*jZwA1-k!pO2Ta$wFT!HnVUtrbwRSa}v>v8$Tm&vI9y}m?WVDxD>-X&XQH)-A0A}t+QrZV{Sg-y)D)%mIC(l(u=zkBG!aXT-(ik|KV zfBT#M@<0AV|M_o!)gQmZGxhhs(`R4*MxT83EB*9?_cb^&q^ho^d~VK)X=8q^!J-{E z_oAJnHhy3Cu z@isLYHB*0oe4pHHu>3<_|I7=|%Z)i~gF8XsOGrqN5<`QuCN5ep?b~I~<=%1ToN_B0 zm4^@9n$CS%+BBk#ty{=P!?%dpuM4lZ#Adg4)D-%g)C{O-=1f|J?>g8D7{z4Qe=KE4Nt;zJhIrqqZ0vx50x2;&}v?n(GXNO&T|`1d~|`uV6=sOfNx+BIL+&V$M)x9A7Ea?;JuH*W;kn8!~4+R z_O;jJW*;ONz6!83ja@0iFlb)dncN65T8X5@8gF!=RSFj zC)ob?eg}$omT1$V4pkl+R6^NCImR)&gD3bj@G%^3?v3^JDrstGcC?3cYO4am(U>r6 z?QWTZ9u&^XT=vFe%YsfMFI`*r@6y1oo#YW7SLaASUX_vbj=hvt?Wo{fJh}qGZFn?) zywLrbefGwK*(t=z>={|0m#^u>t=nW>twy&NjV5dv*t}Zl@YK`E!*G~A89zd5(EP>t zUN$Oc`C{frnaP}Eauued*nV-(4F!P#@;P{-KQoV$JtzwEO* z%HQctFmn6;b~N3QTEu*L7W3t)>{U`bgS7cbrOF2@)P0bi_O@kwCi&_-y+!?Jw`$!$ zsoD;2($ba?<_3bb#ykKwc9Et59_6SpXj@P{}26-|NKw=6%7CGZ~vz6 z{`{|c^yM#gjr~IZ@D^s8i_p#C3)kXAf8SSoUOb|ogR7qy+-COc%X<&0r_Ib4GhL>Z zHnlbLUgok{cFz1hb@s=jK56#(uLq-bx5@0Z&wcTHUzqjLNA$Swg4^%wLuSk_z-xQP z1lw^eJTz2M(ezu;V6KXd)bqP{=m8!r=U;u5nXe-%tnT7{Zet(0P1WtgWTc(6Ysrt@ z`F;lM#f#ea;x+AMw!+lg9mg)IVcP*U_T!UAkGrmW8(MNQ(6;R(S7jHTKYO%&?=c;F z`86$uo0wu|tiWjdEVj{YdmHVU;kVJF8Qm9HZf>`L#YXRCbm87$nh*H^hR5~=uT1T1 zbYKQoP2btn?ml3tsZssN_cisn7kV}Ge4f;>Uew!0Z*JlF?EPc7ZXfnArfxQTy4eR< zP3_Jy^IWEm_vdvC_ieAgspb8^Y+v>T{_G_T#v2aZFT@}133ai#Z19}t^Ww1+9j551 zr|?R9`Wa20K)%_uv5HI!P-p@AxXhXCIb&qOtJed4hG!=EE%+{)oM2yS`iOAmH#j$C zWTSn76E|5$Y0SVRq$iL~5~jq=WIh95d=8)Rv7LZ4>fa84UX?QVD!$WWybGo7E zUpvsz&=2n!q<(G2tI|(doAJgj!$&H6n%t;iYR^ft!176B>3xmG!z5UF zC1uq8`Ev4^qo}L|HFvk6J)H%%li9#IZ8qMIljqFRlm*i@*^%r8{2X22(VRo@fxsuM zcGn;}qUG9%H_Q6gQhM0g>Y@Q zCAnUBo^=F(W3I}Bqt3-AC6Br`yPNv9#|Cz>?OLOHII799!c&AiHX;otu z`5D<{kC7oYmn?`$Pm?!6zJde!N&Jper;jD?X$%<>&uToE$4wtkt{3_>i;Y>-0CK;a z@LDGSi=M^Wh80>~OLjRNyqk?oZeIt*6x+~|!;N=a@t|X7D{8uuHZZf+<)s|3JE6vh zOqXnRGbixc#}9S?(IU>cW%Z$3b_BH85o>a?;cUa6ZSbmaB( zdi{fUb@Ns7u-|w~yU)YXpE#%2erEEw?$J~J2;LbT_nSY{jjK2COFKoD_7ylF_Di)c zO2LOFt~pryUOJ(-Kl(rqng9CS%yCgyKLW!)qfUMV|NR)N&C&F>AM4V-0?!R*Kh~4m zwdU~QW)95wu6%(O?F;fnKH)h(;rb6hd|Ow4@`7xMkzgD7^>DjU(b39Hir12`AYJJ1 zf@gn6uf6xKo`3(I&OG>1D-T>DdycxfkKD2o_zYgh?+vUzbo+{qymS=|zNLe&ysBMj z_507?Qpf&NYR4O`1wOo?f0*MAb#2{4e%T>y*>hY&2+n+Y_?~#8LTxuWTPcF zdT={t!;>3q9lZ^G2Uuk2RJ$L8+$GY>*yIQ__g#y^mFI~D;QIQFD4-4ZT?1T@8UrH7ndb*~Q&G78_ z=kz1~XJ>QHNnN#0De&mC(X@`4JdxfP*He!gOiW(A65rAgMK8?7dvvoFP>)X~pV*K3 z-akGWd=HfioaQ{v32u=QNC@AG4gU`PA8SxQvdw%SD;Y zXXg!&5z5?JX8mdlwSD~{N(ez6qv?bT9!q1yL+|&<_(RUI7&9?3O>Iy zZ6KR;6SHT1yU;&Y6p{UEK{x2E&3(;!{gu~r?BF3CID1wvy!*bs`O{zZ%`bngcYgYo zP8=kgv$av}c&T;`Z-WbXQ$MGN-M_O`%h2$p!)+ushv?AD;5PN}g9k>JMx9N~ZP$T= z*=A1Lj@|I)U$D&2pRtVR%A<#-rwvE`V6@gYm(9%AXubU|eEB=<0q`ehKkz9y{t@U{M%nus;}SwnLfJrk>0xdP#5ogruwUI;4!;Pr2~7_ z1#S;qIfp*~I$FOQI`tBo^4DIX$Bj<^<)3Qs(hF(_x0|=^Wkv%XTK{%t!0`5=?rz$$ z7fsqeaz*y(DA}lS%+1Zhv&_s?JCloR^kSa&n%dOcMwez5`fW4I%KjZd*kYEL{=dttS)Z{j5eTzSN zf$TNh!TRx2C+MGl^ndB;r+%cTo}=!b^fZ}A0nGTLBQ2atkDK2;9j<;M{8JA93uM{4 z+1%m#`TMXJh>wp}YI+(zh7k(KQ$9008Be}A`9=gNiusddc=MppCp`HRJpKFd^oRQV z9D~UWWX{?nB~x)5S7-(^QZu|JjZuo{o$QB%hCS-=5e&%UC2X;O;mgCrG zGa01;3v=!WjfjGK#8y2@cM|ym-j3vb9@L{xKWCoy zf$ri(xn{)@=1SnnVzV^eEr9>GVCrQ*a=AjZsH%~ylP2cELN#?BuRn#nLobVpYU!EQ zH8De*h_AT^S&4Hs%gd@|weZx;94CR_8<>$D7s6cCj{&RH|w}IDBlMs<*YGx#xXFO+yD0Kwfr{*43}m zd^|UN*wgH}ctO`+dzr}pFV~2u@ke}WRRyO;8TOAdvYv&|0ujj(ZELI zOBxe_cTKbcn2q-h3n6DAMuD;6^dHz`fgb^B=~~vNmN(Amvk?u#CJ7hFZR@qWj{ z%5Oa9XR<`XrzxR21U-6~N_Lg1=Rl8|yVj|yAx*_K@mg7tq&#@Y^gJ@d;3Bih4_#4_ z$}D@9@|Q5@7Ul|sJ=qmPM*Lg{5;scQpxn@oA>Y4t}`dqvva%J z+v*h@Xt<8KO2r$sob2sVd}NEuHmRk%PdDkQ-^C~V9sF$e_I7Ino~TQU@Xx3BzvW=N zb{wu(MHjOQE%fd?=-b1&A9?MtT{HF>e1LuK8eBHKwyC#`Pul-?eNNB%5!XMu|AD>& zW50fY=L)a+wdsR{+h%=s7w;CbL>{reFuijg^8pcPaM<8)eAa&8|;4JGTO9T zI{F5<&7Az!t1mGpc^tpAU8)}hv++l(?inV>bXZlrBh0fiztFuy$IuAIuHT?pc#j#( zbTjofM-Lx3Y*T-O(QbAvx8ch9nL69xtHEs3rylh>G4-$EyTN20Z+hbP`g)%!tD9A;2x5<5X3hNJ#Dl{_$>w9< z5E8=c<6FVe^a*~b^X`+^`NzP=|Ehl{59-on&g;qaXwzFbw``=QT#4soTns+@qdB-U zXFHMU<3!%xBt1i2`}DIvroMf=p5pS;XhzHtJfBDo-wf*8ndIU*kO?^XIr)%-l~I~1 zYrMB+I?W)@eudgM*Qv9*T8*2?m!R(y6d#8VdInx7Ie4>$X(HLd4zuPcJPOQ;P1XYD zH77ZcFX&*Nd#>UW)0B~(#s1&Zo;5tdff|*3p}3SZW#{6x6&9>0ywEcXcx=F2InYmY zE~=MT-F~^%9mKo*h&(nQkfmmyZ1sEP-?WE(&jGDJuoth83bf~gT8V!~a#4xa_Q8F( z=PCqm2bah>^sx)o&wO%fLALxdbG5RelRZM0%IOjGpXjA;8>RxI(dr@NgT8h){^AYC zYt?zOTlGge)N|?}vtyUkxuac{P*<(%ZdLuZZFXPObb9+fc(+fRgYPT-f~1^OdUIKd zNoFP;-MyIwPecowjORpB3S3_bGwWb|0^W0p{2ZH zx8gRVP2;^3cB7$!Gk2x8?rufv7cf;puAk=8I*wz4HiOBy|u*Jx1={Q3XG z-dhFNnWovAw-cwkpsNzhVrFJ$W=0DvW?7O&W(#atGBew0rZl9PlgY{GN~o;r?x^Y0 zGjnF5&$(Ljd|T;i_nDZRbJ39%;fpUe|9g9T>tEly-u14P+2lvgc$CtM_sI`3(>DsAfqSTt&4yC;0!K8dXtcu0}@s zIbYK2WR@YjzD{M0#=D$cu$neiR(J3kJm9zN)ea&m$`}70#tR0n=KUrz`dssAE!J&!^U^X7! ze0A+&Z5kTT48NiHlw^x=Lk)gM#6(zh z-bNP|n;1ur8;@H)gYiZQ=D2>;-7hYhtN-%rzt^vR^Bet^KKFvTFEa;*uC>+|U(>nh z$zM`L&0K}o&R1Z$wVa~)ZKEfj%``E40Nx92oWbTWjvL9GS%g{OwefZdW{(jH|Mp8g zPe1=$&vE|Q-@w{^%$KemK!ZG?{(b$-3TNOAu|&yeE^X+Yn#^Dy&PD$G?Ry1zTb5@a znLt4%4{+88*$ZD^lL_eU%Q-v1$D*fl=Q-~FKJ>lOw`FH*-zoGtaLQgjcxl$u;Dyqy z_KtQnx3{PUUVC(EgCeOdv#ZPG&;EA~T(D~(`g3Y_U-t2y?77|H=G-|)`Ec$F3Pa0c z>ErRaxZjn>UFpkt(-RLc+8p>i4_07us2pS6wICX9ykmnBcivIdt_KR={klTAjNE-k zaeMA5e)oMP?7l`H@{~HzQ;i+lp!TT|rP1py-PnnCtC9?oY=xHulE0ay)ia}tOAS?2 zVXiC2j$KuJ?q^G@++%L4+mCRPJMu*k7zE7z_?Ru%I{Fc9Qd;Taw0ps6z3TWr|?$ zlf8uOky@~u-bYDO2i|?7s%-2~>)^1~Z{4g`9*+!1f0PLBEygph#YNFQ?n+-Bul{5G z+I(R~2QMGg+aJG&*86jPYkbM!wSS;K{^4tQ@NdkT^3@>G-MV}GVs;-uY`b)rk;*~mo}axW=_jsw9%It&3RB{C>-~!UM!IPfYG2E zZ&EWS7D;a_%4p8P!4UA(@*0k3Fx&L5E&4OCIF!c>c3be9`=d>*3xD=hKW^&pD4rJ& zhQ@*0G1S2kQRW!4+`1p1;bohJ`rm%__xd}q`?tUQJ1tu9BKueTkkFI+m&~EYeoNl^Xt#C z@|XG>*!#*W8YPcudKWXuC-#w5)S`|x_>?nOZS7*GNK?0FQpXv;Qu;xec!wJN$e^A} zH#J>`xy_74c9wFe`Ld{+)8TQ`@-xZ5N(bBGm6{o^7V53I$RN3*H!GF=b4#~cXIj*`t5?-qz>=*UT8eIZ-PswHjnK~}kE3sOJLd&Y#ne{P z1K*%7{Je6SYczIX4fS>^I&$W)!R=x+P?WDiyrR;6H8x|T!rX`oWrf@ zM>wKc!}oM-rMz=XRoOqF>;`7ydztfIPZrr2`ns`bt!4JDWqi4E+m|wzO%~Wjc=BoH zzqjS93Qa&Fo|82j$x@+@FtB@2>yJ%qkbZbtO%r}AWPR@1sK#M(#+%F0%caXE5Dimy z4jwff{2Ou=nVJdb!v3Ukv5FVhtEjqG<+Tm`HY(w6L*)_aCBJ-kdYR;*t*O+;>qm6u zg9rNLvv>6s>&fTLSAWL5mciJssgJ3l|M-oW+5V5dD@K!MmZ`-}AKYO1Q;qqbo;+bD z?1=@lEj?~(c7xj{qr~{8{Sj@N!R}Ad=$&VFEhI0+Qr`wsuNn+AnlFQEK6rB*?R9V% zI_x0s=P_^YH+j~M=oOslg&6$y^`I9Lf?q;5Gk~q_n%TTv`;VT|!LwI%^3Gd2h)3P> z!)MgBkr}edUFv0yd)2lh+O+Q^HTs*1L*r?1+tii8V5#vxG5MDUt1S6i>>rE<&7v2N z;yU|pqX9S1jRd>QoRq=ouqbrf;I{E%G4;5mCI|CFz-gnkHjkV7IGD>Y`o)H8j^MFq z!+(Rj2DeRZZRWS5sHF`DZqb*aF^eW2&3LdG4O$%9`xx*tn!b)Xw?wc^|J&evVq&6V zGrw*A&Ftk3ZnM7#MT-!@zQW9^hof-`j%NlR?mo~`|3^Q^?dSR1e-pof z?o}H!Jhd6k^d9`Xw`iDbuxb!s3tXMKNX9BfmEOTRt zXnGTpQRon_0x}a z{q?uiHMER;jA>O4lkJW7N$CteCY!vdW5cxK)KX2ITcc(ByHvZqP0P=0z^if@=L-)F zY@cH0XNy`#S7NaPw?(vqFaARkGrz33%&==hgmEi>T2Wv83FHXa;DAPRAd~# zL+~+<8q(mJE4c0A;U;IYBt5*z$%c<|aCDSAE0F6cU`sx~+p@GgHP?5M)%hCPVYks( zyh0w`F>=w4X>#`|Z6{;Lc+ZBGl#wxKe9*vS_$D*EWjJo*fo7T20*g%@9K!vxexmT< zTo0$e9T{afapt$cY4bYMlQwhNrarg$gL53yyPlohLL1KiRfxfCFgX&uHgnO&!^P;t z!woMEc1PglA3^^kGA_cR^NNAC6gQF1~ zJDM45;|~+YXEgX~_U(%tZ1tNL{(&q{vbWJ|+SxE4f#+~^6}^E9XT{a|DvA}b1V7*k zcQ`xx+=eIT-*4HM(Blqg4;4mDV0e17hp;TOZ(v^$h$b$O_y48VSIECsFAn`>YE~+IY>u*X^0>?gCk!{6W#MN{-JJ>F zmj$k*QirGJq*0q^D2LiGhu5SrFBzK{0jKVym#xvUp@S}O?NG;Rw8)d|>48pLyv|(l zZSlj0GzX6nXD@d$ja}i=(CLEFvDDYe)YI`M_XK_|g1tlxxE;ryA%@2i!0UMG?ikJk z@yQwFLxSDOJU1ap@!49GnJsIdQs~TU3fXu~;Tvx$deePHY`mjLR{YinO51r` z14l10cf3>$GwJHyQJ|H(>ol|r|F3l&${4Lz?o_K9_l)4Ny-K-NdFbVH)HKwAo~lXt zXr?zFUa!P*@+C$SR53-q*A{=(ZemSGs%|Dy_4u)raJ_O997&Qn#7s)M>|Mwtiw;#qEgX3z*(vZ5c?Pqow~I@_XRt1VdOMAMODg-NY-YE!*hdw? zk(XCjF$3SM_K~HkBBQKss7v+utFGp=jk8~vI5nZQ%%rc}K7&{61$fb%8e(oQj*6-)O!ENi|di#}Bmk76+EpK=ckN6Zhf;pa?N8KV~u$P_sR#mXftK`t@L@=D8*XF{3+=m#V;mf=I4sddcjJwW&M@y8#b@BUCulGl<5o-G6QStCl)$rl3X!p6B8sB$DtM{Jf-+fBc zT;Fl(x{f@0UqPj1czPOtZ**d&<_DuK9^n>Vcy=bs)cPiu(~sVkSs~ziF#0mn(+*;v zF+0ySt6Q_w>FhgZy+Ms93m6Wj8?M`6xcN7j{&fVmBdLkaOtzWBHZ$I)FCCsh4~zbe zsd3GWSws}IwDC$a`vShFaE=!dWqA2;vfm6BZfbLUS-8*C^`YQ>DA;ZB6X$)*rO6_E z*=nAC|MKt9*vyp!+E*thYdnkH6_n?skP3W#`>L7aPE%NIx1u7t z0~`I-h0j<{MXv0?j#TEPax&U|E1h~g34YvYom1g$ zGmSB6F>_7yz`Hi$8G7~tevdbF`24HnWwk1`A&3mDaQdgYa-i;Z z@pe@#^>w`AzzuGL#R>3eF^LI^;4&1ymT*>VB6@1@IShU+IynVxHMpG$PY=$ACBUKc zc|GWV&-cSCw2gXu({+Vzxvj8mVD{z*3R}E2cN zqpnl$0X)yQR^s1TsVaE$@skI%e(x@&6yl3Uo!Ydbjd|%-ys?&O{J=OGJ5ME)F|R!u zg{NnjYViPFJmm*J?M?p|&rxQ&3paY;MdK@v1Q%`CN1pQJIx^8psh9J}HD<=#&W3Ym zjLOjhRMl3gYH_JbDoRvL?Ojq{sEnABRcx*)}+V(VhsB5*jFHhC$ z;1uvvDV%0jY?_>xA@)&ap-QMCA8y}9)ihVC4xgGPX8#xSo@Jani;9v}TE>iQ5m~9M zGOm{{&ebTs?pZZ?WWZ$O?~Gju8rr-=J5Qb0qj%odSD!HZ1vmZ#Y&H1$1N!i%xNUIP%wRv& zpBbz+%i#7?95+5`Kbf93zG;8{4(~LB+tk|MgWHC0f4Ud=!NQY+_u%$-)ZCwc@tGdH z_a?sh&2kSXv(k@jFtFOw8*axeFM8kH4)FF?5LsBpx6_N?zbAFJ7t0;(hzpN9FtcHB z+mCrJgDv6l$!H!M@D<*oO=qr;-tsW-L;dgJ!=)E`N^|M!ArJP$KE7r@VeUhx!oI>2uE5LRRO)jSKR53bmqkA*nrKYYov*bba35-77 z=+Hx>jJ}<@EU??miW{xC@j;*ULgzMk9>imYhYvxgX0lE!zO6hjoL<*l>jnBP{P?`N zFUiiC8DwUpgDz$gA!RPEee16eN!I7u(+%#%% zgXgL6| zcSu{w!|2_-7#()58mGI-7hOVL6*-jjr<>Lft9#=r^-jZa@0-^20Wc@c8SZT%9&k=7 zUxC(n62Fs;L3o0*@B%NP=Us>|O9>ujF|{s=E%w5jE=Wn`$z-Wehek1rho4(G{e$v4 zazE;M?_;D**lPl(ubc)=M?*ewIOKJ$PvX? zrMQn-rz{VAYRN3mjMfVLV-u51pOo4y0S=YEhCdoDFE@JTZZ>3G!dFIf&W;Y2TacSt zhT7>}=i=R#B!9FLc|(JE@+?>1X5;<7Pm|mCYB~PhgA<$CSFBO{@<}xhG4D4_FC7f; zn%=Huc#o{WcVx}+%bGs-nr^-S0sb$>pXDQbNN4Np+1YKQDK|B>skzOXt*`%Q+Urt<%J3Yd(3=v z0Q*E=`r9V!(l-F_QSjLC&!PNoJ*mCDSw7&X2er8;m(Jj=r;ji5%xNk>3(z~Z36K2? znmK!2(`T>YEq764hcD2xxvZHpm$c{XRWd~$==9r<<;H8Qon7SO%x}igiCWZ|`rTP} z>;oKJT;SlH<>csMSq{|owvP64pttVG+`qv-CnqPo8o14Cobd;6bhc#<(N50Xc5-r- zql1&>(gj}MaQlufuFQwJ%9Z8G=l5`DuVDTi{Jk0u!SD%go^S~s^Z`7b<$F1y8`5xlg-#|nL{lu6cIS1HMmoAhGSzL_+ z-FSB{lMj33RO;p;u&~oJM7VBC4b5J`=vN}pn}^0Sr%YXvfW9dfzB~jCODvB^fYpic04dBnN3!RL zhfDU04Ajeh_;PnmD{9AWMS{=KyY4A*`+dc&zop2v@aE$;l(hM>x{e*E=Im1McezFwtDFn(Z1zk0Wq zsT|y{oQzPxvM@#EIisbgrfH8;@<5@653a*MJ{J$18kG(8v3Hq56PPA%&hHkF80xUb zbrULXtVi$fMV4DD9~``?EHU+S};Qzx({LzUR2#eeof6_hVlBF$=xh)A!(* z-_z@U!g}wMkMN5*qw=OYixx8ljwr*DHJ<|4#NLu#QyjgWU^rWMQ{Pg5dr^;jm`j7< z)Vf&(WoR4rYy0K9+E4Dx;Il0_WNl{;o`c^`ZkD-98?f5e!O=21Y5MApJm1cN=W@TJ8`r^X zdu}^`aZdJ*axkw)6J`(A*|HW|TUnNkoh`?(!)JiSrMd3FvCOiux5bNTA@9v%Ce)ty z@$mHFF%MZ;*~tdXwBz-T%sSdR+VVVWS%asGxZj5NvbD8lPr>^-fTiYn>_6trpRd3B z)vxv2-=dM3L!PI-wdT@uvvzfmmGfM(4(!p^2P>wRn!dqH^8dq z@D}v6%%_^~V3D08xuA=f3two_ye;DUGV9rMK*5gYw7g32AShoxd$)k-P<&Qc5PzUj8@H%OWoP7vkxEX%-tI*Z>d-B>Q!2? zd9&JvmMbX_ukQLKTDoz)R`1z?*V7t$)xL^ICyS@KK~?yZE$ORQ%V38_XO?SdQ;Vv5 z*)JE8{X98}&nFnmY*{=woPZ`h9?f(-wR;NLJ<;@|!V{_A>0d|F?~b6(i{iTR9Es(z zgcLY(c>Qc%V?54Hy}!_YpBGMXumeq>9F(Sy3tmqf6Jtsc2QKiq_!Ky)Ho|V<~Fh+=JGL zoUuzMw1a$>8EXAKSB`7XMS7f)n$b!_DSVR?iSx+2LK?dSg_UO`zg^rR1wB}rD*)TH_+M&L}y0f*ac*t`j^ zP4cLY?AOrFA&vzHK1u%S06L+3M};?ppeu)yUsFiGzgDXcu4RuxKfSw&8Lv%bQ{GX} z;0W`5ZOW@ES44i14qv^cr6WUVdwr;#>4%i3DKH}jADuWQvA>ILsbfa&7;{`#b>QM< zJWj7`--R1G@ajz+ymX6y`z`Idd|!KSysiDW-?d=cK5*>-I_rb4-PN79-?h}dUsLx! zq2K(387+g^7K}ES4X17T(X)8{^wQ*UKby(@@1EsPb>-i)4=`S(hA+2xuNcfmpZ3>W z?w|4B)ZgFmejmfrzk2gEZP+@azJaCcYHw9X8~J+dqw1UCXX>lrBNF6j_;EDk9-dr+ z-G0=Vk&&@lKDI^sZoHu*AAC)|$Vb|G=?=fEE82JxUg7u^ZKj{S{lYDN12?ss?_~E? zGF^_Jmq$vvtiUx#YHmC5+2F5@!C^4S1}rrgWk=0y@8}9R&R7;0@zU2DT7YXR36SS5<=kYnM`Ha^1`C3`t+Z@kexLM{HW}jf@ z=jJS!$NcuM^!LB{wZ$i5j_rKCM4x-EyO*pyJhag51w0De72U;qEpe4q&`Z3hw?#Ma z2nR5a{lJTJ=IbAR|02FE_)Wa{f`0uw^y$CHe+>_*7w5mE7tp-@QqR-RKiBg;#IwHv z*U(gXM`g&?h5fkw0(#o>=~0J)!!_XW5{>O?)P@7in%du@sqJ`Z4OMCRAUMlR@t#9_ zb@b?NwKf#73e<~tW%q`4N*-FK%&}pO9!BT1cT8ZVdB&Xf6ZnV#Y?vb)(Ilz6BTtTp+T`D?@Rrb<+4Z!P-!b$rfA?K--FtkYVJ zOe|M(ca5q$3KWz{A2HQY`F$~DXfxLyZ!7Nvc;##d@Y`MS#Xi&k%=VUqvBH&DgjaY` zARKj|Qp&>6ljU%pPlvxqQguU`+FEkdu_Qx1P1$NPer5Qe=8=renwQD1%du#Q~3N~Y9yjZIA` zhgrQ)JYqxXNyedluB@-ray;DzI9A;-d!qt)|Ed7xugg(xH#v*BzI^}5XyC`_ud|=Z zNru0#)#RoP{60EVUsHgNE>l(bwomTdz|6p6dW>Fb8^Ql2KUslkQSysn#u#oszPV9{ z@Cke6=4~B&^{Nh|c{p_WmJVOJr6X5w<3)E%2d+NAo8)aB!jI(89WL*`r$cwa?rV2- z>b2|o=+lqTrG0GaahpE(ccvz`^rGR%!BmqAV)*e{?-etz&HYcf{RADkrMGQz!G5l{ z(WqJc%fV|4Zgae+y>W9ni`#gqeKWg$go8Kt8P5DmEwUc^#J6OJrJ=fOrS2a$)OHzG<7J|PHEPJ?XJL+BId1R@z!9EL~g2~P< z?%=04K8SE3;Hx8ix>;7}vdyxC6E~Q@h}SIQ_98HPk&P9v=W&D4;HsUY9azk5mMyig zWnTbBTZ4(#yvEjC8orse(8>z@=D57Znb{C)gW(*SBCXe)B8+`bB&itryD14Xyx<_@c-(ImBjYj_U&I4>!ej zkP)=R37-4~cyC(^2mT_x@s}3OqrRStwvF}D%i#8l`VE}BW&Qpi!1CW&@ch|xtX8X?P#*53aK~al;4gvHqKgE)`oQJZG_X9N9yjSF1djO-V(Q)rID~X&E!mV0Q){o(XVX>E#s~ zoSf3K)oal|l`(5(cyVfL`m>$u*0SeVp`4OjICk>Jm~~l1U(YGNQ0`UCSGAo~%)m8; z_FhzA&v^xQy{gcTOUhgGfGo?ac$H76ec38ySLTy1WHPa%@R38WI)ZMdfOBkfi?W;g znOCb;-ywpuQ@yoD5%VR~qkE}v^%Wlln<gUXBBPtDEmlQCp{kkBE^Dq*Exdlq+9rHf7n9+Zs}iu?4^L2^I5ZXX#XaFm zGWrL#_W@bn_aEvcIDG`XK6LF4`K#n?+yJ+^ec-hRI(XwP9l8x>-+hPNuXnYN%RN`` z=-|amdjFHh=)3VpqaL1J=+J(~ZVP@}YU9~CFbm#(3+6rnzb&{8W`AQeX$G$ij?XSL z`}Ie-apRL_aCsK9pT%u67shcow%He$$4%zQ6L9<+F281d#W6nr?6JiU=ESY5@C?ba z_cQ!BKH%QWEcpj2Dm2KS?OPfm@Q$w>1mOJC`Z_nP`f#=y6 zo*ayJqfRxr?quq9gZtFOHt^yLO&VzSo`@6my1D!{*!r87U($=bpF7?*Az4N8s%Vk_;s(v}w^m{`d9Gc|p)|vXhs=XJ zbdxQ6BwPCEjw~lncXAHk9o*Qv(95w#17JmOe@*wB30=~4B`49)@Iy|&=%=Ay072nmb z-Pcd*;MMagpdM^(FH$4it8bW>nuZ7T@t^;shwr|DCKMJlw8}4|jJk73 zsV&{gY8}AivqBM7b#l$7SG_Dzsmd7Xl!3Vq{N%>2X z$P&p?c_V#u*5b|*`uyaJG^VSdHj$oivI?5f`S%x+DH_c8LGD@zyn7H?sNozNT~`8G z>E7jV+3bfB;bddl>fr|JmA@Jd_sTG`t?@Ej$J|wO0)66XRk4=|3d8?wbh*06HmDQ* z_Q>Q~>b*GhWS-=|;c=0`J`2z2rqzAa{$=#5(HJMd{kJexQ*<43F{Ab`7rV)6h!pn;z1NZT;-Ay46Lky`-a=S!49l%%O+nWia2B zqVzsy5O3epnR^e(@Vup?7q97%!Rl+^_x0QKac^ti_4{z-Z|d;9cd57G%5Q_+2DdNY z)ZsH1bm!JBeen7NeT`q*lP{PDV|@p&ZTj6NFZ%~(vyIQntY_L&-?XQfPwQ+m+x_#L z7}#xa`>%`R%wo6ErvF^agV#^@1g4Iky`RUyZKGxXj>pY1UN9fR2b{foQvqlt9sSUH zqxUwtw15D-_n0THuW8g7_9a(7_*NG_`c7v){8mTb`AmCXf2`dP@nyS3zx&!7+Do5c zA9%k1)|=XK^L0(%xQ9paAet+*ZRnz%oWW(&<7U~xgnSnOYniGnu#sw@vMBYF}Hh+Q#&f;j;~HTN}&<>+CsqSo+%r`?+q< zb8RgBY%mIQ6BVa0bP$nfQ-We*;rd+I8&HF@$FR2Hy{Oww zy}iJOtUqdNM|68OZti-)&OtA`dTW7CnCt?g<-**cYc3fBc=K3Ck_lGht%Pn5#WkaU zjpAHn^zGrs$IaxGpky7h=H|GOi_VfNxc*{kiBR99H6THyPKYMO`e*HOC{!)Jf zFU+4~*;AXpS6eh5PVQ*A(So{px{wX#ji$FtBYV45u_i*Pjo$pm?a&q#>GY#V`us0{ z(GUOfzia=l?QqgjN-SiKx++KUtp((0wByG??(&vK9d^*QfvXc4oO;f5Es8Pd)9yH_Ym^)tr*GYcZ zQgT6Nc5B(@UDTTm%#tU_FP8b3Y(K>>!Ed6TIZ>kzXPzpzrcf?^4%7!WoFDDc&)RX_ z8Xr?zJYVfNe><>8vO`nL;<|^gS=P+jfYBj#3d!(ONpG%Viv0Qiu*Tbi*99$-b1p!AM*Ahmz0cDKQ{-3MfoT`FI)*(oG-)N$%Adj*OfVg+FIu1ipgV( zRc6lsweuUg^yp2UhbP~&{fNfLwrlySX^o6dXvL~YjjThbf8v4;+@k*rKYsM?`#Nqe zFW%7D7=Cbr!&=%4@9>y%phSsb68D}#IId4Dn)CI-`aUz7X!&FA#K@rJpK|9B8R zefL0e*qFC69xeXNbf+XFsJpF8ufNZ8|MlPW@&Ea6diP)dAHDZ4|F_=z%YW0GfBC<3 z|DXR4z46cgs)v96ue$rwf7P9z{zW%``in0A@Dusl>ouP}fE~DIxN-;TNC#I_&pLwT zT=IAAZ0c}oX?ug)@Zs*vjCr8%c7wAwx^pKtH@Iq7@RJ&y=i8XQJUD9M!A;!^PFt{= zp1G-sjqciD|7<<~b8j15Hu^Mso^SMIhF`Za7|(qRsgF(8fvKsTJcAUIT8KunPU(fE z%yW_#1P^Xa&0x#k!0ZvMc+Da>bt}Wuvy9d~i08S-QUg@g%7@uEPdGNO^azE~&q~I> zejXf9d;|XV1Kx`7^p2%npiSZq0a`GCv;5e${xk znXK?%>UsM4=X$<}c=k6ikH6dCm}rY;+stjH@b{2q=7Mrk(T7oY@i#HLdr%e2$;GUq z)*`?E#pY~rkqRX#e*Q@ug>*Te|XqzsfXIo7cNg^|<7xnhn zUuxM%2bwcCX1(0W0gckwiC6Rn9vPG9-QwfWo>0FBr$oUco*?u1v6kT}p2*x;F`Da% zT~lbHT;-J%p~96b-~jMHJNc@{uRhY6b9d2Q?N(yrQu*eTE1C{vyUJA~p zw#BYO?UV9t?bP`HG6S(a0fJKiF!U{5Z+$aM0O13hL3yi>i%=J3jNS74!^JhI5G zDD+b1(loNnIM)WwVOC}V-X6BpE@ZV8h2tw)ti{{1nH8tcJe;pIH2+DtXq#)h=+&P` zyBC9QZW7Nq_;7q3C(*XueEcyQ=#!c{2)DkhP9gbmT6gA@uA|T1FpZbEskfWRNn`fD zxT{Agwpv?{ol;{1xSJVEF4d5tV*=Sz;B||Zx?o8&bGwmprM9!Tr{)U?w)mvy zR+rO@@lkzOi$bZfGL|e+W=$0yE6K|0?9-l`4|Vb8U2U11(UQVCWkhBvAuL59Ueso; zrWU04U*Cd``~f}Sx2U_{*D-MW5W2PDm1FAbz?XJ087goOqia^{O)}=b`f^t9ZEEcA zsiQ6R_A|Ks^tJ`dx&P0WT6?x8H=b&S_ck23(YHN|(NC{G#r3E9^jWRC@l`eR;k<@r z^z23__c2`g^*8P+oIRg!C^O1ra|PoG7!?_zjHGyV)Ya$={<;tDKhm8?uj|emZ|kiO zKhj(8!?8d9L~ng$YWA=7!Iw|;&ez}RU}WZ>?xv|@r)^g@5#%NTV|r1_`46v z^;SkJUO?l0^tr8-+!m@8~M$|Kh3w3l21(MK7<-RQpnLxGSUZUkO!Wyq|)- z9J!2FZAFbzIk!jR6P1#{OjK2ZS~|&_T%4}@iZpdBYt}Bb)XghLwC(IkU3qX_t56gD_X^FRr8{-`obJDIUze|4)m}7O?Mr*$$o%kdKo6c2E9v{Krhab%(1w^5po_h{WYT@wx<8E z2%U^QHI9v`bLh9tb3iYPp4N_YsV$lzNBC1K@>89I95_FDE3_WHS}Q&j`OXT?^HA;p zSVq3JN8lo6V#yZ{T!=5IjiO8OLtV#=+8FzbVfy1e&1zgRrUCM_4xT-)SoUQjTc?yx z7I$2FyvjQp)H%?p*6w=Ez;_I-?N)Xbo-4hrTFZCTN^iP%br-qpMT*XfQ{VQ@%w!!v zKX^ua*>BZRZzt!(sBgm{etJ>L=Xl-Qr_oHEX3jrHN$mIhL;YnJ#a`;dWeu(x#n&EgZH`UF3-@4f&-4esI*U~u|b zto{$z!R+t9F?_mNv(GcQZLs($FaDGhpT+4}UHX5#Z}vUR>rIVsvb{|{sL`T-N$>s9 z2XB*!x{Mk8dezl4FUc%rMP<2ax$GrZXZ_fiE?;_8*Kgj`Yvh(+VO_X>&9ctF_L|OJ zzN}ZypV#4YXLW+hi6+er&s#rof6~xzbZKG40{&KfmAo=QF@5ZJ zQ(W=K#S0GH4yKk4jl|OpKeh<)Ig#I0WD5BO3C6!^*25``+0w|wgy;44bHB8|iQhm( zVl3VzDd05c&?3Au^U!aTk(q&?RY(H*q=7E=uj(Y{+F3~*UaFnQ)cS*i+6tC$q(?nI zy;|clWKOr%>kvA%gdBXg+MBhwqe)?@uf6}Q_`|(Pn{~G71y5-CC@DJbV!*9RQ z`7=k9mVgH_wRPPJe8L|;)}0UD(WY%<{Jnaqu%l6%nK8;L#%~p_H@~HUxvn)DnOTEJ z*)*6w!Q9z$HBdXpFtQ#>!0uvie8$n*BS#_Z539XQWS88cl;>C74Jn8b%RNomFOzPp(7rWX-S zHs*@W>s8xQOZIh>Dl4GdAIVQ~AB)~;BqJZg92?U##I@boP-=FEQm;cNQTUxCBsk{bFccF$rq{P-WxpgrMn zgX`$jEVvE7V?0l1G27s-(Vv0SKiAQwmpxmDoBMxWKli+UH78Sx(P0Sgs%Pxd1l5#_47|ZMbq|~ zKI3(tarxnAAM4G>AL#1cJ32>CY4?d!nmBe^9ea)_efgLoyOt}eYn>w6Rw<%og~FCB zQ&@eU!s>choeHh0XD*RmF1iG-IQ&dv@j{Eolhl0QV44Sir|!(^IrxC*Ui8ZNn{~iH z#o2hPcrzn`j?Q?mxp{Lx80^Sz*V%&k)XT15F}1ttfg2xj8}w^NlVBR9Qu)8}^M@5AJKmcdD^-Mv!*cs>P_ zdE}Ok2SI0}Dt6$LOfP6Y+Reo70Hv-*Q!*4P_cU)far)b_c)2BzPeSfjI6a-XWad1m zx0Bch#Ix5+&LGQ%?;s`-9SC!$ztsBb`R96G`#<{|2oCYF_3DR4Y2aLV2xSsva5TadIJhnQQ7rtBq&oj^q2) z)?BNPKe(fJ-o2pPxA)-RLT*BWy|Rl^bnMVhT{*c+Tb6e!7mZY8lpQ#fqbqk#>F$k# zIlwzItB0;vJnujkQQu5FS7dH^%05>3x8Di5rI z%X7sa*7WH@k}}ZV6yY6L1V>4akoj02v^4(d#nh4o^a|0k+R=CPkC0njI(0qo%k!*k z<}#bg{7blt0!n=0{i4YbOH^2ik0MIERnnh=SGPTU`#iY?ETZ3yj*wihm=dzGyUH~< zvjGp%1KN0CuO_x`P_|ksja(qj;L+pfNGa7)db$;%QlXweY95%D+aV= zxJOmXd&npoN7u)`BPm?HQ)3$6vxol|=Esj7R#inYv-L6Lm8?|?HGD!w0)2dZcpA!8 ziKe`uh8npTpS^ZGc1G|=Zy{GbD+2%Z7Uu3_$r`I=-&2L=9{;_b4sE@5P1oLkpWgOX zm9TdTjxqU+i&cUzOViW@zOv^vb@GC?qc`7s`wevE@8}rVedNaL+IRYrMg~`EF&ue9 zMw(J8N_FhURXqkPzX7lR0B%3|xxf9?XT^fs;PqcI8{9US{k?_XHe5OV?VqvOnW~3TbCOg|BlaL`7EaA&7R^3JpQ*_|C;M&eZy_@ zxY4p%@<)v~D|+==Uv#oVx&KS>{Jjr9(Dk?8#A9H$+7DmVl9O+$=HmORy7YmnUj0bb z7ayzc(nqSj_@U}AexSwY-&OhPHCH(FV5Rz0dz? zXM%h(=tm{GsjL>?LwpX4$gpW{sApf-t^Q?w>Kp8X6I-hGezXw$-!*nMqf^b2ON0l$ z@^J9!><2Qv(R#3-F2FypAVIzb_>5-z;J3rxJDGVExHE5hO1?>Cgu|72$HEH);NQl6 z!O_Q$Jt?{~I60@#Xy#XvEI9*pojn>LD=n*knEHCX>JPo5uFDV9d*eeDY~3rHNLQuw z;@z|sPHtrkxQz!}6ke(Zw=F!l$sG$;Mh5!O(n9iXjn5;R(~@Ga+~f-;T6}_^JvTnT z{v0cRslNdaKNsq4W~=xer@@gY!Cj_glL<-vZT$V)hr2brwNvFQgH=A|iv}u?9&r%5 ztVp$xnQEB8r=uEQg#-t(LW5c1 z%1I;N7<~38Um&SGPF+(qS~`O#Xm7qE@x?Cc@6wsK-_yM>zth$CKhw?6pXl;OU+L20 z&vc3Y;pO+=)A=`F*YW%JwEfa$O`W)?!7T^0cx0TuYrj(2S0pZJ!Xu3NV{*=H@TPGJ za?{W;ui=ksoZuqW4F} zRd7+OoWfJ_X|&cn8wbtviIH1wgFKURsaH6E`BT@VrNNc+KFn9;tt7W($7(XWYw=?C zVy@gpMLnDklbOQ}z~j!>3a#5BddO&V=wW9U7pr&G8m-z$_VvmkauM+u=Q!Q;{ri}k zU%9bQJuAp5?QK*y9Ct7GcXZUKt)pJc23zqaA5qV$7G*FC7?X^~VHi#L_&C0%n>4m@ zN`cc}G{?c~=K_?@}rJcyJWivDM7O4-cpZACqnTMmB@pdzlYA zfQIcbGu%hO?!#!Rcb~YRk)c`KPNI&=sj1Y7YnS!8sd=ffe=_y2;jVwi*x5^J=D*h8 zKVLVsvZ=K#Jh{QyS%VgBV6N$PKf5ekI-l|BUc$V$ z#e?-5qig$=^$E*x^}H{i$^07({u}&$1KnNMzGLdV{Gr6POL;jP9LUPx_Q z;HiSqIAyO0#8VJI`%PfvHfn&$SS79UQu<0~Wh{46+K7`I(LQiD_}lNJ~~R=Q)$9myi+(GqTb3v>KcBwpP94SrYvX}e;A#(O z`Oc#n*>P0EWC%~aazUr=zK*BM0o8T2tFo;c%~Bqm>>fPO!toaA*GfEDy7#t{qm@a1 zCN))AgtD5;G*?onmb<40cI zj6X^>y=ouLh3B)2&QwTwhwLL#m?gCaqZi7G3`)mL|a$C_2 zCFu9_7U9Q4uP-PWJZ{oF-$?y--aNgqkU3fZc)4aR0rPY9qP4vonOpHIt5;Z6tK#e1 zRkmWCHh^0rn|oE-P2N!@8yy4v_~TUL zJ>!8E$zK5xypD{qv|Re!x#Yr-FP02n7@HW6mrc6DQ}B4tPT>13u^c-Z9@Pu)Xm9*j zs_Sa$i4TyM-lmvPlh;hIkXia<_ISC)M!(mFe{F}B&?8yDWs=NnvM6hk>F1I!!v9%t zf;aO4t-LSXcuS+w>FWkj2u1y=Y_qAKv zLcP5YpOu4mnd3INjXv$r%?H|h;;dGUu2f?=TnGMmMgw>3%0+zw=6wfN8{9TnJX=qj zx_P#Ceu|d{zm4~bnc<$z@ifl|^QnbrHEFXt@gKqD|Jcu_wgy8j%kn%(ez_Mexfe{Sk@bKBJIvv_Uh#tm*8Uv*3E&Ew|ZVtVJ_as6FB%is}w6V5$U z*X?iBbMISq-}^=#V0IU)`|cmK6x{B;{|9yPSlgYiRDJrE+{@!tHjbwce)DBucg<$} z_V+GP{q9=w=?d}k%aTtHd7|h)qhdpp&3?YVB47PY6zKz(slMoRu?SuiOpz53F}l z_JmnZU_6&2{_@Ij#miv12Csjj-s|KRT>ny?H@{T(jZf8g^HUAn_*_G`zt+Ib&oq4Z zGxc5ni2FZQ*5;jZNc6!gAzZmD1K|_M5P~NUL{A<=K3Nv~%$%Y;y!y#FqEAyo4o^X0 zCf>>M$}U8YLEW7Ip63-8{!N^-f2lR#^Uw94$4@xZV@ga-Ba1T|Zk(E%IjzLPEY9h9 zicAF~=m7=rn@&ed)VON7mcnJOJ8@2{={N3r?TSjl@UU32va=(#^XxG)va-}aKC1e@ z4s^}s8r`{1Cz-w7eHstQL#H))_>9I6pVQcp3uw-7!jFEcO@|I^cs)9*wZqDUC*SnS zZtDId&dKoQc!lq|uvP726&g7(%xqS(N;=bY__br&Oud&JABg{2FZJFEbW)3X?^1R2 zWT~<$o;jjc9o~apx-4CF=%{LQNM_OL!K8tXqAJ^amF)W%AA&abPzq) zZsqk4DY?E=(G|^#ENM`9Rt5Soe2>xW+J~jfFSA~Y0%G+7I+~Yk=-pFqd#BgPItYvg zdw*~5D67zTc*iQ)1jK>Ij(X7wP95BKOD)GQJzT%Bw&C^oO$5csHKklWDY<&t30-hV zf&%mF>8Up>wz7$wG_-;H4{GH$X1FEYC3mXs_FE2Pn59V+e(ieOQ zj|-2WAbjuep2^5%&Ie7BPY|3s`t0Cva2OBP$Y>Qdw8CAFDzj_}|8MjzlCtC%5<%V0 zyn9H9{FpB`+TJ<%P5Fcck+E8%nvM>5`9Qfb%j5>0`!FNx$#aA8f^T2BN~?En)7p*j z=gib6vZsn;?mo7NEN$wcYVumbnG?uDo0VEsDL-&KqpMR}?%dP;FTT?8Bga%CgoW6ZwJ)YQBW>&LH+uPXkkV7Fx! z-0U-qZtf4%-UhqTbv*v+E3G+oLCq&`tK;SqaQO#n?mwvQ{u65LZ`E<<8})F#3oLKH z`=wfMf3AuX*W^|li;oalJLIVsjC-qWeYh5HN~G>atGF>ng=@&5&d1v)8BQl2E(>lX z9qca2OH*}mmKxC`cA)j_WPjb;Uah{iT6HlSS&LRQxr98v5`Pu0jaSZ?xAN9IDQ|-# zIPIvsNpO1HR(a!i5luKKbG@UodED~YdI#ljJ!=)-f;p}#K_{{N=7$;rs|Rmbv`u2Jd~X<@dkkzOOXO?E(H>J$F7+&elD$NgxAwAQJziAY}|i$RpK**_RM9 zL?bO3Lpepc$}V9>72M9_9G3@%XJnI43~p!8BTT}hKd(6dIc`6%xBn)70}kFUoL}+3 z$jekgNuf%r%Bi1B|0iF0oLje^J)`9Z_G#)AxxZ*wPd>b_+h}C&fBU`8bG^8N>{|Bc zVJR`%dFC{EPemGB-=~_TrAn{M)X>)TI(qfGb{#&;%+WDT9Xp{72ajsQ9%jZ4zoK)m zUDYb)x(8P-)#$2ja!E?G1HL^2j&AeL3B{qE+Db3Ge4t8ej!bB9UppQ!IjS10)UG2t z6#-Y?v94FG%j(g?mEdbqq+~ocLyKcnGE}QI`_?J50-rTzM-p@Bx1&7?iHjn4V_em1 z(p9?FU)e)}@`%H4(cea1DRA)Ag*kl#N^R>=Yy+CSnl^=(HsT|e2fpUXJ#VqRN}J@8 zT_$I4yQCH{n^Gaa!X|m=RLLzl2i=p<_`*vs=%u+YYVM-BnzL}O zMLQf67J*M5IW8<~JT4Z@pQAZ*UgY^N=_R}%UwYw1z09$#tmxO{qn$`@wk!4g+?QVB zxN|gr;R2rfvgW}rcyO%BWxZO1E-)X>eP$_IyKeY`j#g#Y7m*>_pva6^<+2A%t*nxF z3Yi-{?91MGUGIGRtxl8a(!zXhGFjWv8R!9-?=5Zbp--|I@1KM06L0J2eROFL(WE_i zUq^1fp@Y=n)8p$^z#cP+y+eNOVjX(*ydG2E8r(J*ZDzTj<*3bdbN^HPHZ}L3!1vi1 zZhX_YZt!##Qw{fxSNS&|gR6L_fvu)yxAe3*j=}e*_-vm4|HqX-#d34`Cve!j#)AFa ze)jd|7~i8mpT%uzZiDCevVQ-B>wL~1(9D_M{p7_9Y9ec80DgSwqo36K2(O_xzE}Sn zKWgC7kLrK@CoO&BkLrE+t(M*YOsQ)&l3N~+_iZK_vSg`~M^`lIM@D?0DmMnen+GUo z6*=Acc4XOklc!BiHs1d+NpVUcBPEl*a6VdwBI?v)xVfU@47j)q^sMQeJ2(eqgeblg zuL0&7^2YtZY9|$d+xg&hp22J`bH^RHZE9|3Wlg#%d)z}glju-3cq(-jIqW%Z z(3QvZu0L1nrH|G9+GES=yh6==?Msb<*~8aA)zE7nsq4~*>bdqY`FcBLL+wz|AIy9C zD}5-OzbpFm{2OAT$+=5RAg>^UzE76o(4QH<rN!($i_n6V>+ps1+H&Zij-EcFOZV>T-OoSL zmp?qwlYjnaz5e(;aGUH*JWj*Vmux5hqHSiGI=8i`b#s*(rmEFC-L8SHqw1R)(eTc# z+JE!5hBt4e*Ey_Kv@Mz`0GGU>>|YUF)~4P+UfsruWa_ky)z! zmkw!k519=++qClVB=g|gndyjD7don%24<7;5Ry6l;uS!8QGrNCw8X6Avd3z@|+bF+4C%=LIND-K6snZH5fYmFDQ9eyYdEPGdG z*U-VcattqY!q&Wg4mnHn7tFJGWEp?UdGzEh$Fno~U^AmT>)T<6&ew+ifSI{n$n(rx zk0l?{&4mo(0QECtX8Igqa4*x$HtoJ}PIWy?;6+-LP?CyQY>kqutI^uSu`lh@{!E$#dcf*ZbX=l7#{Lm9MwxM6cxBUK_=n3D`iARrh?Aq&^*vLG7 zcfT5!)GL?YZ4dKtfdBiVm#B(r12WV zksJPc7QgXM15XXUnyfLyq5ttKu$Q{`C$o6oQyhMZ#ZPhi>HSY{|Ie2O!_9rOocwG} zKl@&0Z(wpm&7$`HmVE=B>VH5p_aU|Vwo7MJfoD$VvGeLaaYr4;AE@)>L-n40q@J@6 z)qN4|+NHPEbNVLS^|*q-*_=MS?`H~CIu!|b&1?eLS-jDM<*9swpQ}UUUEru7W;a5a zp$cQxBZl6I$*?wccLqA{teiAugLm2VS~AUiLQWFAPCR@Y^XL`cDxU=3Cw*10(OE^T zg7wZ|wxi{;aDxjOIBqJKaHYofQ2rGD!Q|TJ!KG)fiNHg_nSEcECT_l?(c53D|MoW; zyz`}osHq2TeXe2ngXIst*64$8)enAm-}s8hzEphwfZVdE)$s@{Tpz5$)yxv+po@bu zh>T|M5sME#cpVo{c06;haY+f(*J+l%cP!Ua@vMla*PQ@w{v1pG*RkaJclV$7-5IaK z6mZ+*W#@q1S!OWN&4;&GP&sW(rR-8qy?7wk26?Nft9R zGcz+YqbP7?I3yyVO9sKp=Ab8)7YTJ8& z_j#xadfzDx1?oeW+cP;pwR`c_x_*mXe-2K!tr};Vl!32RLOuCkDSccQd=sqyQR{r+ zwUlR~S6WWp4PUUDIz=-(oV{yFS=0wI*>V>TE021A-aI|VUGUJS7gW59ne&-NrOqxY znajkPeM*|$$L)Q};CANpUS4CLa_0`H5dY}HT?dsn!}Hnld2ZqSK^4(QDBN>MMT_wG z_8!EW?69g1)7L(BQjI50tKs-bHF4Q`;uO7#{c?{EW!}wjW|^(WL(TX^nwfHEALD6? z$0@aio$%>gcjBGq!5j=a6Wf`|w|8^?O(V*I=Qy*Ly#xOKZ-4*y7R^aVcsj0dbX<+6 z8h&c-)DX>#j0?wu>rPL&hwyk<%N<^CZs_$m`J&I}$$RkHo}MoB#aHur9Pn~YP+|;o zW32xrjd+qJ!l9tv>ca81ZadrrgWG7FU3mOh`_U{-Ny>uT8^C-Z8g8yTwTW$`t0%nk zN=@IstNnNG>(FQSb?oLtH1=-bbu+8(zCLy0Y0@^_$Gkt9r{t@zz}WA}n|}af4NrR| zzc!Z!!&k7|T(@x1Ob!fgTYBNIaeJk|y{y4PuN>~!ucm%ZJYf3fe*r^(W&8ia=9T;Y z|1J$?FYjY|@yj}^EB$VBzj^#G)YbpVa`{T%@fjbIf6rYwz?@u|eDR_2N(q)%JawkH zF!>~)yAvP6h9)n)X{RvelLPR4F9NeivXwfX#PJMgvu7(F@brj=0~9kDK#v)Z-4^~g zv;ypzpRjYW!4uaGk6agd`_U(Z`|o3LJD3=s+%z}@>;|*_f_Bo=!jCV+R?Z2V@Ve#k zP8$Ui6NGltuLh$-I;ojc8xIA;!#lxn^6oJD+tKvDW6Av^`?e~q6)m%Xw-lNesLH+L zYCiud_3|gGzx-6SS01VM+A}p=d#dIu57lz{v6`lsq}5b@7h!s-~yjWlasi zjvAVuY~g@xrMJC(hYQCfx@vGWY>hS=^V_y;_UPT1^TC;O!^LcHJeP*6)7w9(-^=g`hhb%KGX@eLRrfb|f4%H`ep@^e}ySEIN&RI4VTF(hCmweHTt7c58Jd-K&co2<&o2<5SFRu5hr@gHlu>pQIDMt5No7-BE4NISGe&fqf+I`H`e?OnP3%kc(#UA*xuC%BZW`2;F zA-EC#A^3%H?CfO5ef_$3(LBeel0N$;xNU2;Y*2A~gQ8RL4Udnq#0?*Bv!kX_VfkIo z@I6m`_PLhORvABq4;Fq`ZRpyy!d>h-bVef=@fNxBNK53|2S0nLBex!C|JBdX*}I9J z*dsl9_DD~kKh{fn(cgl_X7=kxvw^W@TfyrU{QiCZZFuKD8ZNn|4*eRtd7a<1(ZF$o zsTN%2`afB2FW+bQZU$dh^6~#UpI*7Wg28{q>HqmT%b5N99{b93O-}w#d^S@P_yNp* z4A=d@_0#gm@t1oZ_!AHRDv8`O1%I)`^|FmaqbTYVW)IjRH^?vFLm7kl79INxW+dZ> z{3D({_DX3BRz`oea>nXZINhd#=?;7jniN@DsEF(wg^@#q7IEyS zhRQaYxvxs<z=NxClWovu=2&0rn7ZT5!|b}jZaY^;*@5M@Mkmc+IfDoOy7=ss&cAr2ORrw(`m>k1{NS06fB8fQzj~sh%$J?`>Y>8efRp+RI}nA3fFiNBB*E@AL4Z7jJ>ZJn!(A4|MRB;Y;7t0r317`yIOX zNQZgs$ipW(`S7WZ5+fYD`z1PaaQ}RaUc^rMFz4b+|IU~H(mRk#ur>eq0r-^q?-uXf&iD!;|NnG^BW9laSX15-q!-F3A?Z?`8=PAF* zGabD1Oou;5r}gp;e6&uYNrLy*i)Br6QxmsvuMJ*Xv`!6Xvr*6fiT}&8t>oL_-wMCn zXrq{UD^oK!9JQaoZG-KG&;94`OmF#_{_;KggM8YWZ39@kmR|RAy*z?ie0Z0s$*-r!zLD5r12uYUa&bH6 z#~t8={E6C_H6D463aoWOvw)g=9W$u~Ub6CMHq!8DLdcsVY_v6Ey|%^RB~olfya6W# z{12e79@=fo^Uzcapw{nUOKy!0IX*eI)PAwo)i{r;NO=qqq8Qdf&e2v=A_q#_fd6+@rf89qvE5nkIhrSznGHG6oE z4xK%ww9-_3u6)$Me6C+ru=>yK(!jArjUHZ58S}yulanecMl-D}NLhn^_+7Xt5v`Wi z!wu@+H>9Ow2Xy541@iWjXnGxoM|46bu6(BX6Bo$42bJ4Po>ycz?6Ha~tfUU_fwt!c zdfo~6QWa>e(^lrAoE19gL9NeIwR3d}h99>Ty(b$7JK4Ixiv_p6qWo1_Unu+S7_M3W#S?G-ccxaVpD7d18IKE1OO|7b+UVRYU zKK<-Dc>Pl6o`0j$&%f4%m#=i0oO@s&bKf(^HHOcm!RS+8J%TrXOqo41>NtZZ<^9Lt z&_i|M#hBVYqsAkbwHJIg7&U(QqS9L?RkwIvyFa@JPTkkU;Y-x;$5gias3yRyU3bXi z$<_B8ynX;~gWboNZ!0J*0k=KDPjB=jz+*o@`BNA7V>ZhNzKw4%Jx%yG0b$@aYpgeU z(@tgs0u8Qvf%Tq7W6azR(&{y9_4o9)*KOI1_lv=6js-MK4BsJ$>poz0NF=<6hzPJ6 zT<0}Re;<02>~?xem#tO%FOBiI98+BS=id_1#cAzf%I(7X1fR_;SR z+_xLOB*RhTc33Ak-o6$d+$Kf$Y*r-w=rC~JuaP*;>peK>=nQ4p$Tc0U+XN@s_-;cN z5FgIXpJ+3&w@t7+y)1a7zRY=rZIlc9`qlD&?XKk9?h5bVGnIRQ+vpLyE%%PLfYXMH zYBWymxZLJyPyO7$f=H9mv1& z)2=Kd=C4;!Tc@h&F&_jgPd|U5i_gim@4wKl6W25az7Fp_r6qlW`lpSb-<$L^Tg#dDqD z_dfODrA~p}NAHqve?{KSz6WmJ*3~b+)C;^a4adxQZyOIyvn}H?mnOFcr!AUg-sHnt6?%*#3&k%b5N9{_~1f+De`L&%^>tl2f-&p+*=o+EvyNU#q4|rz=HHJbb1*1o_ zJ()|~TZb(u;b@EXMGx=BO1S5{^Zs>QVZ~_Owjud%8-tT83^1^884sbpx7*`d$yD?6sBvQ)L~ zs#P4?P9aU3(0)XJ*&SU`tGB3^+bFDr{#kjcf@^Bgkmytm^KbjX?UT=6>H_)pi7y^0 zw|z

JH^Y0&nRdReD7Xj^8lY?9lwCB8=XNe!}zZ`PL79z4Cj}Uz>}$6yLmcUyc9Q5OZ19bo+XH2p9pH&aY?b@b(Bo59FoMW9krQIaFJ;N9PFl-e-d0iiN4)Qye&^Zc%^fXzR{&;-|FmRaQog<9lmG2|6?8e^pJM;V%j5fLW&%DmjjT??RSo_zF$9WA){%tO)yPG+1ZX4GXFlHxzTefSx8Y~Rf_JX;r(={h9-)*8 zG*!l2sX^PrJF_MCgs)A08{9!ZnO<`kb?PuQPJ-K+sqR4Uq;s{x2hc|ATMNEZzizZa zkCd8|+Xvv|$J$`~5j_w1A8^k?sFC}D*S_?$4WB$1&Y~|kw}TmdN58FTfq#td!&c@M zgA~?gaGTmSvt_b@LeFhzPjs!OWk9_dDQWhu1tj6Ps{+bV41O_xE5H z6R)yu%tw6u_h<_KjsE8E{zh-VgP$il!S8;+9K)LT^bha-Nq>5W*@qAQgr534vcaRk zk(k>BE!PbWAK`0*E*qK+;d$sCbf+q=EfN3tSossP#}>pZzJR%zLU=o^3DoZ66g!+M zpL+lQ5Nq}ydF{VnUi-i5Z@rb?qaX2SIBR(rIaWxF@x~2RR9uKC>|}I{&_75Vc2dTOGukH9 z)%$yN^z>CVw|B}n(pT|C(V9LwjCKp!stGR2YGp0&3Rd!fry}WXIWSw|10Qyq<9e;% zjCTi`n;vji*K=Nardy-0%o^3|Mm?Zdp$UH4367MvwJ<+6hHe)+ov}eG1}|(JY!sWB zu1V(EI>x${fJb%v?gk|^_*(L9ziMxl9#0678xz1a6b# zo_z7O&cA$4Z}|Z+#xD6+?bg~@a5t%38)HkgA){NiWz$*}RU<2d(a~UZ=76?jjp)OG zV&=XJ^hK7UfHgDaT3Db$+Ke0>7OJC#i6{g5(!7+j*&QC0ddu|cbH@JOj0 zRvbEyqo3c?AwI_ucyLF*yr<&k7W#qlYS_P5g9qWKqeB*g_EQYLC&4i(@Y4dBe_<_z zpW{aVdpr4fUQ46)pQSf3Kcx_KA3a>R$Y~D)b~W{NkXKRjhV$kP z$IToge$2po2e?y*r!NlA*p0qs3L08t^iMhlx)e+O+aFDftfnHRwq!A{ma5dcH1v8h zl+ux=#)THH7prd9q~h!A;2!qi!Pusrv!`_hp1_6sPjntkHhK41`T_U<)BmX_|K-2w z$-n%Ip8WZr(7t=DQ}hgu!{BRYf}ri_=13?%ecEdr)_d@ zOMltq-oL}`<$b~G*SNiM`!{T6-(Q*Aw&<4`T;=w^+J3|8-`C0welOp)U@_18?Y6n! zD7*y2IPeao6G%eC}he!ETHZT4XX>}UGxW}k2PE_YwuRR+IlK#jXH$0Nb* zP$f+HDPh7(38U^x7(ruYU^}x|cHr_h`ph=uw;Pz9UQZqjj=~oUC-;r&2DdHP&i(aU z&>wgkp6ONvXU5?J8;$NyketJr9|-f31A66FE}J+X={q@Xlq24?Tiuxbb47RG`7P}X z-=L&+H@IQ81-vMi)if*Q73H4N6QJF$Hp==5sOqXS)}6KMd-#>5ceef zf!lxN+y5bsfz|8RQ0EM`@O&c^qu~%oD>gX}e~1M5!rm%m_N#h)98ZvFrSw)Qc_>P$ z%v+`ptXI~kH5^rIYIN4h8n@-Rw^RJ6v!bZKMWSIIgO+*1*jDyu-Xh8lysV>Mm7(au zLRrBJkLrz7{(QDd=FleZ31;?l2mBfK8^pKS@X{hSXp`+bvc@-KlhwQ0Y)u_^^V^)W zZ?dMqO>1#dM3a;1#&h9Bc{0<1rzAb?_|$NvX2&Q3e~XIRLOJ5c>F8yrShU?@%h>8d z)w+k7??w+rHQ2xzUoVfsP56PaPFSH0QBh9qyhc9N)%49eR879U1V8LJb@DUM443R4 zTs?Fwvc~jI2(zQnrP>r)thfCt^l@B|-V7`Qi;K0|zff;`fWtwp`Uj69z2}$5maBi* zk*75wt$KsYcfB+8o^Ph!bkEoO0S)>`PxcEe)CUozdM~kFA7pmQs$xWu((5azuxtEKff8bd|L-LqFC-Z#z_e)JDsDJCsq&Tsl79 zK47ymxt0~YTwi(;8F0-GTso!sxlzT3q4VZttCHy+Rn7I_+g@+s{}qi^scNxDoy_;u zO;)I4s1jfIVr3H-MWKm%?D0K4`17B2=he45{n-~Ku zdruKRUN}c@_a1z}=eo+}{bx`04Y{e&?>2s1Mzi!UKYUBR`YpF#_qMrQ;e;6-aMRy5 zePYW-{%Wv#g?GM!+a_;b!CZscrnkL(8+-+O4R%{}&{lHf*EqeBBb&apxo+^<>~H$* z7CsvI`|A(f4{lp##=&9pIeumTW!)Eg+gxAix0}~6uVv9p_mfzROnWy*_F>SfjFCXylKUsdSn;TYoWq zY~uT}9F_HUsc>XeMH3TRPkrb;YrMkoabLB?^to;25f-VKx@Lu!a{QK+$RVDYLiig& zT$WdrYvIIUbeH__HHuNk?nb3GqxaJkqLi{wC6Q}K;&&5|hCl-IC#kt1Xf!6OzAH@y zb*bt=_xOL+{OXU-^+%5V`(wb#2cB^N+NR`FJE@r(K5$4_n1bjBr`1-gi(IOF?|`!B z8}N8Znk4j-6I<-$9PxoR*uM$K`EAbK zxAgJGH}Mwylh(i?+mW$B9tGf0<`(6*(T`3TWI&zUt)iF1{ z1Xdn>O5OJ9QyuyIAv*0H)Wiq%adeATMN;REtkoNy#d<5KQGW`m(|bYXc!gBz4Ywlw z$)j3tc-81FuVQ@wrvHs=p8n)ntv~Io(cgI%=so{py}2V_f9q1B|J|ifZ}^nxy{KBf zliaFzb9%I)YD^(hC)J8x>|XeBN5HH@4<4y?cHYu+7(dRO{Qf=4L#MsEyPg@gQUz9{ z4TI)q>qrM4T>O?H-pVD1ZkV4%H}G72M#Z zv{C%)M?=8t04~w)9rNM5^M)_J6Rz4$VrL)p$35Yu5$B?f7DC<|K47o-kr1U#rSf>R zLg9vm(u+=Lc2e_1r4C)as)b9RYyL9Zr5k9(Usm(ttTx8cUk+QXjghNl6~2moIOk08 zN7R?z)6U9`=$J0&+2QooL#WLMm>j={{yMmw3T{^oMQi9_yGr`fHMp0$4&2uIz5Vit z2|}NtNRx{Pb@a2_a4#QdM|zq*VHS1Ejve^exG+=Vu5$Dg_P}ACJas|SH?GMS{;N|g zoXPAYmABO48+%OQmGR7xp({9+BA2`^a!B1OZ?qc?x9z=E_}j0>KaX796-_^va3=-C zu|6cba(wpvf!lxN+y5bsf$j8!?U;YCvPF}68yZ(=VYoVjdtPv{sb?>qJFJ?qJk9}P z`AJ8(FV=8d)+=^=y^_G^j8T6}?>c=lSxHlIN}WnlHgninQ_;*=N3oVf;$47WM|V6u z=|E;K!{wIgql9kw%4I&PZ);}FU&MPlPT|$AMtw;k4N?Y0l} z{^mFE_@kHQ2S+9JWBfVZ$1`vZdYEnshz~_08NG=JJS5>&d4w=y92rHzx6KF+i|V>IB!HBrw!`;2z-Nm!Sl!_t;!qH+T0<15Zk7=!y5HgOsm$GO=)xU zoSb|2DRJqFhUu&CC+|P{gct(edf(y!>f?vB>)dHHV`r6>ouC~29~=XWPg^w_vF_9x ziWHj>r|s}@nh!3*Yx|0s=c^hS?3V8iIJe|WR`ws_lWwKbk$$x-?ZNBxqy^iH%L?S@ z<;1bzsM3xmJhnUKl$K5(v`#TKc!Z4&YWU<~Eu2R)XK9z>;PkswPxUJ(l3RW*GsDDU zW0}eut42pI2|Q^~3i)>KWUHEHr{stCrwyKC5C8ImzWC}cT0RFfF*Btudg2|kiJQ z;g$_-w#;*b&&$2=<+}P$;J(=mhFdV7*R}M?>0=w7y5YS2h-UatgMCV+($e-t^}kBjVp~1x9a#duBLj>zK(}OHca~Hq%$9r`55Qc-fKInOgQ@gVH-9)HqqHq2u@i z9oYqb`YNX+Tl(01Zv$L$};&2^o6`f6FP z+~vr5n1N^RH1Ta&NuDYjDplXtri%J1b<=;!C`zY~3Aez{880RHE}3vmD?;D|Y}O}^ zZ_3GQmHd;?o=JC>SB4wCN;mmrddMdmZha1OB-v=)<@n1t3%*M+{jOp-sf9dV;H`lC zVEX(C=m%fcMb4uOufEr%mp?G$`lBwgUHaNw{-E>Re~{kQBC|64;Fc`Gkv#-gbo|qM zO6Z(aWPQIPs(V<&JJIs!mS07?>@urll~kmS5h-}Z#o*nWrilDJ%NCMJPmj1PEISRp z0iF{%sq|*h3`%!ZSUG+#@GT>IBUF2|SA`30{O*Nl?8GZ=lG@UEl=3Fi)x57BALa$6 zQ6CKqhl>*$u0%MtdDIoNa;TvcNlRFKrQhlj1@Zm*%UbrADp9fy1nm{rDZ$k*Bn^G^xF{0WaGUdBt+B4YnzBsY5YS zz6u{ki(u#@xYBDBH@r#l8ixYo!dZ|B#uJw3mOiyLKk+V6KW;+YIJ-;v@L4-SzSMkMX;IOCNmnuHJt0 zZN2fv8+zyMxAo4u@9O=JK9U1*ZimU0#`6@%Y)8W2MkNi93lDGMGi;^)=BA206%7*(KSj$B|Ilsl zPqz3o2L`Wt8<*RtuWj{ao}0~<8T73#^t*iA6_P*=J8R zb-rk2d&)M6o;g?-T3w~!x&~@})OJst(|&OK6r8m4FTc@=$6sss`j=|BcuNIGugkMz zuRMB=gRR$9e&)7{4qa#d<)Hk>&MJQKvZ^k8u6%qQcC_x6&-fXI%wJI9>02tpmoT7b zzd~j&D|Fvgm7c$&>eF`=KYKwD^Viv~@Z9_Ay#7D~%zQ6ChD-kBg^n?McKH57O`JWe z{hxiRL$|JK{`^s8Rc5PcstZ1SG3R}YLUWRpQB$U>?hg0>N%)NK*SUvZ>a+W3!OV`y z-(!omZ>I-g_o3D}+Ncs8yrJ{dyxI01*{_OfdVuf@3+gLW+1;$@j6}3@rj*uDt$@Th z)xz~#V0}NuXE=O#zv2?mC=GU|ewnJ|iCT`)IPfD#dFb#I?JH9Tp6yw46>=#^V!bU> zVn-D-xE^}-pMTYV{~!ND-~IT#uHX4g$F5w|?8&2Ax^h8Je*Qs^o9=SF+&PApZ;X;UgH=e}TsVVP$z+nUSl=?I;)$~pz@S8Bj>RZ_ID}bDj{i}#fCudr zgBMuxXr)}xFNx}_B<4;Epwo*Zuou#MyPjSRHtr!t_xq? z)8g$<6;{a1W@@xDs*2Rq+o=N=&#Hm7rfQZR&1{>}!1FTJ+ljO1nEQ^93pK?ccraBB z^*WEI~O-}~|VY>8cmPta<7itsCP`jE>Hw8n|r7TabvJJ+?u z8O=(eU*yc%=9w0Pry4$s3Diz1iqtkW2o^`+n}@eDnC(U_YbQSEU9&xM47QbBu$6pE z{p6BO9U^VJTr=_9<+?)_TLv14X->@2Il}XW+meFTYofDU;1Ibc?~n`J-|dEjl*nUA zaC5UG&~ds9R)3?5FMrad7eDF3^Bjnfs5~ERhbvW)m!r;xDmB-ZsDv7BPGgqJ=kt|0 z53gjzR{mM)b}K6yHgIn4Wg*0Pj0u#pl_Imyo+U_tvV4*{;Zl z?aD0hRg#J8g0{=qWi=kz*31W6$;pX)){B`i^cW*k{m`q%i>ohG?iqMWW-(t>Qm!53 zUJjWy=of?AebnpFJ@U)hhWB%}lC!h2tM(E3GAj zJU2=iy;0y&2w3gG8e*rIz8%!Z@$#ChSIVABg^mW3b9<^_G)ZGeW{8?PB34=I^SV9ZfKDAYyq$FBLSmB3~u$nJ?n#)&dhjdFZFovIuu-w=-o&> zzDY^+*NY|sRXj}{ZorqG2|SbeTow0a(x3KId3}xcojI?|#?j}w&#d4>O<%dBpzL%-!AHwNZ=quVo!ifDs9~&2wS#r|2Dd0MAy5g) zQED0JP;73h!cx$uND5VbW2L4z59+Bm#Fj9Tf?B$(IPcYp99|m~*Tg-V}3a*rKuD0jv*ymSuo@4ne7=7V|*}l`6m*48#H{a{bQ}hC! zJkhB~kH}db>Bxfzmd)r{oMV>bJa~Wp)puO~PG`A1&GSyZ_(rFQX-~uBJ;~Z-*36U7 z$ay$#PZJX#fBaO_m#%62>;>(+eO&`*rj$Doi`Iu7yh>|&ub#@~*a+^blxuC7QmM6t zR5GU$vkpBiTjjua?VRdlEt}S$y=iFL5fdIR4Q7J z;cchO#VKVPJ#Id4%m~;x;iCFuWjg)%1ir*))w!=#m2;)a+LfSa`d5iF zoQreON*Xb<(R|NAj*;?pXbQb2zdS2Ef9&C#;F~xE#?sGcS6qvXB_SiFlkiVQ?GgJGeSw z$9uc0b+J(ixk++B&%`I%pS(F;{)tJ{-M7jL?X9);w$yC0&?PKV0`bf?bd~xKwJUct zN-6zea?b|ilWgT#uwBu;j?@`86B}@z5PxL0!fz)QO-RgAfN!iE9d>GiwY{tyykzYX zBCoJiW-vqa;U{ZkYwv`|w4@(t4bKp2A}K?qYFil7 z(z#Q5N{(wZ!p-cKg_HdnGYx*OY(H7*-TxZ1f6KQG)|=iqo5_n!P22K3o@01tD>Gdd z?0=n48}8f6YcF%$Oda05KJWQE%r^U2^5>P$1TLHY^qM`g6w$tuda%(phkM4_V&=I*=xZ6ScqBZuX!1?7=EP7(4hPpmEt=un?%hJZ zVW-r=?W|42=EM%!oa2 z!NVCI9MLUi0zd!ZXYKp)j>3v_lu(qZ)bc!y%#7*ASJbwu3sh8Jtl}Xw5YiLy298Dd zJW&Z{8A^t`nNY}_Lv5aNh8k2b)4*Djs%Ubzrh{$Z20ny4j~(0q ze`ho66EO(2g(&9f!tqN9XD&UG?;qZWPfH)XygqOn9d?s{NAz({5wnC5zeEtrMD?%7 z)5YXIyv`6lY{T2Bi^9i)_n%7rGI3ywhdAR?SC6kiMC*$gxc=qV%?k#j~n6S({9clzbO{a4M9qjk>C zXn^myaE{t-a2Wny(aI+7$j(h8uAuHlogpbbSs~2q8r-g#E>cXF1IHWuaP%9JhV6+N z?1|r9RI@-|prb^A^k*W;>zWt#D7n5x>+QD7&e>6`9UPS3Kcw!(C8bsu$syDM+#ZDM zR!2@cuBwAo)ZT*>H3Dab8bTDf9X+rOZvZEJAJNqe*`ZQ;sR3~@TD@_TK3s+O)W`2@ z?S>87xXD@{eY8q%z0G{c2Wyz^w4%PhRqwCfs<%J3(tB$*<5#to{nu%my)(UBJFQ!{ zS|6?XNUJtk$t5(5`EanDy6tv0r{WYj5O;VNSApd<3MStU>+Vs_@w4Q{U@y3NmN@kM z^Y6h>byk1q=3qzuTCnv)K+W z*zRrOtar2(AH|sF02TDcacplR&-sA)@^x~|hu2n&p9nnT*v=AsrSPxF*)E5WkK`U= z&F{FKH6u_B)GNl09o8_lufCB!)x%4#1jozkE7iv%dgdy8f+x-Xg;2v`}ENCoWX5V zA78;tgO@9FUccch_3q#DZ1B8rzNAis2+V*n3Y@YY8X1(B{8BDj}IQ#yV ztDE;V?`O8x_`H&9n@dyQHu!6)d4tUs-kc@xCQf*b-^+dN6>b|?&ugu0zsGP>XSdW6 zOq^or)$^Ho{gwAN-e=#vg0n_`^Ucd=dhzm!9=?36>rZaszdNkR+6ZzyUoaw^es=); z6xN4vXL?;|uMC-5+E(=beUwj(p2>_r-<~5{!smSP+HLK-{+Z@Jy{7gvv*5KaIONFw z)c>ew#-L*yJwnVqjGqU!Kf_Ot9U`8ib{INrs}OF7G4B=K=T4p8-ST)?|8}s>f&80U zu>KwLZ{2~H82LtOfG%A=tFM3gi(dX8|BOaap0=VvYK@kebAS(e0pV(CYSd%Sum9`6 z|3A7!jV2gQMd*)??k%dF=~Ef??dshn@Ept0Zm3t! zp($?9sbFke4SPn^xVKqNhbk4<>xPya>*)aVDucFY%MoXc?|{=oe__}WZRKr>8fKm9 zH@Lip*oWV360YvJJNuA_GY=otw~l%S-e}-+^dS8D0kqobB}7sKjp|>`^YJcY&5oqj z9z$(0h8QRkjE@+kPe`s6Gi(i~&{~nBJT?k;gXQtOck(#=q6zbPwo{9Rr!Yp|&hH#E z%4`mCSQPt4@;^lKe@2a>Z^7>$Nlq8dT5TSS;`t%OOOdR#k-T0E|9||5BYc1zs+b8< z{hnBIezYz2rW0Q?x49=p6}#hY z`<^7~1qtd}Ojq|(mO2)*G;j#b4`z3I59F(NAGa4vG=FA53m2Iwo-bATSTL{Q%{&Ch zA$8nn_|CEX4oRb%lrnAub`#S~84VC0aC;4&kDF9qnV~sivi%eNIx;<=qccM~I6bO4 z@|cmq9<_8ds-mt!h438HsEvmt2FN~OgM2f=n6eN#MET(_jAv9%5xrQvoGZW@6FU({ zdS!2tXBhLw-Y(3$G8;vGF}Ea9@d-i7$d06+Lq1a!hE^#3{Nf_z^fb_OPoxhOu94%d z8l3AT4&qpxf}^v4PAT-m^O<$6XZE#yc0nOoCCV9ZRor+m-`B)%94ExMK@~Q#g|8Ky zP22_-EVDhHUT3jR9-h~?PtcJ(epH>kJ!NvHYv($o4z5uUH-RJptIswL-TzL<=oBPR+kC8KdIR1Q8?-fcy|%=x=aSn=o8^Nac^vC{c(DhZnzeG_{-8Do z1+$hVjZ%y0Z-8^&rSh2?C3h{)&^abaunKujNGG;s4Ep`g8 zK|h1~Y-G2eGAFaO`{t6q{PsTiCOv03VLy;_np(KQN(<(4X|VgR_>C_ZymR9VX7XIa z`TD`a34fi38!R^1Yr%3J=hBjUv(L|#4SpHVv*gbvN9S=XESwu^PZOPV|v@{OI_T|wf&hq+wkUo z;XX^=P42&v|C>uwTUhQ1JVih5iN1e9KLHHC4Zcm$Z-{L|H@GcQIisnplhh=~=y{I? zQ8)8f;=oS+Uk`GX2%f)v2ENRYlA6)YEp)(N#abS$ zxo#)Fw2BvNl|EYrz6OK$ z;JTSn2QL%H@Nk$w+lBnu)F+}%O@bbH%pmy>b&g1Wn{aZWsGd)##lr*WWBo(#B5oYt z1u!|0_#nxWm)ntlk}pk?hmGTLKfZ;>H-gLbOowfh0zSur-w~!BFtUNy;I()xZUp@2 z`LU)>Itph9EQ}l8%;&eEw!2NKljQglTfjtf8;qP{mUqg|vLzeLoUp;ikk2vZM7)4^ z`=k?ml`Y_uHRqu{oMY+*6Sh3hRR#2O(?-#7;`8Ordc(7DQ}(1Y+7em(ei>kuhq9^D z=EK)2WuF3KkqmyvRN|VXA$;KJ0Y}q^jTv0Wf3S}44!3KBe()HzS85R{gK!-1%<%~2 z{ZgY&E0$}bhqiX znsqH7jlldcZHwjq9t6+$PHE=1KbimH#ZAI4i8ihR^vn`bF!tBM6ORa{tr>Z&gxrEF)$}qyL!5>+f)*&a#F7 zGoD@;wf(d#xGBtS2gHObnx2t=bc7oEn$@+d1&xAGYM|aqYJ<Jw`{f?pMIdW}!8XL2LHr!UEP&zI#IvSGb3DfkMk&6` zTRQ^b1H|IP*k((9z#3#~c)M8hN1L<*ue8+BT(ohBkEsFfC^23VRqEQiN3{*qSextc z#O_tk5M0EO5zXw`r31(JlSiG<#3<|WaKFBIa8IA!y`>`;PpEZrj2S&<<%+vp18@ie*m*gzP((3{%alk zHyj2NEgUp*YYWdD95wxFi!V2L{-fDU4sO{G+yv_^JaBUCU+8C>nQ6;BHIJLx_KM%O z!PeiN_Zx=u9O8);-4uiCE7)!Dex?4sl5d+>!xCc{y#B_-A4aS7sRjED7tQpvm-k)9 z>fiUuEwO}&6->+kXYFT`fAe}j@|i7~uP^ah;X6F%eeb^DxVm(lymDG?_}h2D5p6m! zg1_yMs`k)tS)i7;t69~%TGfxwzyUOE4&KC*?$bNka~&_X>o+uT>JXkk#nec$;k#wP z>rG|thUYVCwscEumqdR&WfV@_IQ*c|XmlMC(P7O|>7FKPial`Uiop$PdV}=lhUh~w ziis9-zIcqn}UYm%E7x!no0zFYw5+cbNqCpQIic;(Dz3ZHiq0ShIKZcnqM;OZ^G_m z@WCBiBflMnKL^%U%~dM8Gy*PWu*P-|sj$5Q%;&q$W-5*zeH54zOFUaS&wKQAzy7j7lmp)&dNiEp@E%}%>Zm8azI^_rDy0xh#1JQ$xFHh$ZX)Mz9=TKET!8{d;O-4= z;yi}iY+?YuW6B&{^g;TU)DObR^CQ9Wgz-Qn?@r?JFxCRrS@_FIV0;=psw{HmlsPy6 zV0G+-6a85H8F$my+FhVRa^A z0P$P>5}dAiuw~SX<6{f6!5b`bLLzm6IA(^Ec#nAErKka74`Q8o;)-POES|U{ew?*z z94*{I_U*&_g7(W_VdA3A{LaiT581-O_EgjUMh%^r0pEr>PSN&0 zK8b(wFfkJEMNFEv;G>FT@G2Ig`8{2TNqo@2+AM3df#Xw?b@tMEow;yYH4U}ef*!tI zpp$ZURV(*!i86Nw5DVGxAAdsbOKoQ86SzLiR-5~}H!IxY3xxJx=_c*W-=yFIva0^{F+HKO6eXY$ zm{5?2R|NISl1x<$G&3u5NQ0+l)OTu39fyb2ynk4&2Zz`O)qQk|bz%a()T~;M@8;Y; z42SeAxNOB>roY%g6UnE6s#|;f$vc@0Cm4!<+os)6Y|H zuZEks-4-rkher1K#3s=tQ!nL!O>sPOy z(ZR)Cii^buIy_uEqC#aKznS_7^BVrE(3DuE_!4+~dH8SFw~^xwtN!R&&BKE^{N(vE zHw^!;v7;9>xCbBX$>aEnPBKd}gx1?W)lZ&K)!-6+sD8QTci}fSr^?aeaAl6rub(C_ zU`~Sj%Epc}qkKS_jWfgu{p1ES=!flNt`*Pj<~ey356Y{4ium;~Yu;(KpSuBXjhvtQ z`e{DLIp(*E>iA#E%g|9-&;q=LOlk^t+cwAsu7TAyJRH%s%AvMBu+*-q9(sT^a2zY~ zhN_^)UF4;d>Ja5OlXsN_D1n|$G+Y+ffKTKcO`i@e^9O@dmYnskxNWd-1rJy9@8$cJao+T|P2JpZ)eL4@>e%Me;52w{aC@az zZ7%-;4jXM!%j1?yFqZu+nyDuL1}~R$W#R+&H#llGi`I(4e1ogzGx3-uXJ>y4N1Xf2 zZA;Cbn!(R(%b356{f2XHX1$l^y_a9-xBT4X^Z(Q1=CL2Se>ooExqLsP!TJO5`<(Ce z`BOCi@RnV|t7h+=2b#mjW{Mf@nTub7%Xc+LO?>wijv$+>oP6Kpz4QZ8r>LLLCo7HrHLgEKt{HIf=$l0(`74_BA_{zt zOM^cKe<2aqELu>}+>T<41job4w?oKNox_=1EU;F_lskP5dITIZDYML!&4K&V zysw#Y=Dm}M71H1qOq{0&IS{AOvt8;u(52xM^p?Tx$^~$eUP&skMJnIL#5*bUJTl2S zT{E}J#>Y;ZwlFJgdgn1=vfaK7Po-`6&DtwtGMc)Dsh7YPA6!KZVLivndV0^F@Ly6N z8D?IKxGRZXaSSz*7~)XV!!rFEQ{Re#V-{Rz$NV3ht?jE7nm`PZ17|J`U*355l8MZZ zz`YA*=GW+3yZdo`78k3mvx`~)Glo4wto^mjM2^B!rr!=9xTm*V#RY-HJZ|V+d#j*4 zOvP29!~<|t%juo;CMmBpSS97j+IMzI#Sni!4P1CC&DMyg!n9OW3a0WYlg^oh+{<}D)d zFX5brS02$dtOhW8?>#&&z{}Irs1MwJO8;TE0!xPFklw~D4I1S6ZL%vKmLs#-+f!TR zkkhWs*&W)NKcwwB1Kigvm)s_8$v|^FV?g$qL)505nAvF2mh?{9WDd(NXIR!LE!vvZ zrj0pmT3^(sEmdRM(J`mA0~a;^6~2~F&~0No3#YTT9o{=}M?et1n$E8OFI(^ZT~)T- z`TiAeyz%_pJ?!?aTe*s=qKcez&Isk4a|8*HL=ZuMNJ2RakdOpOBq0Qd3?gSJk_biJ zw*BnU?&luv*KObL`^>d@N&53}uaRs-g32Y76_ZT`25hl9(GcD{a!Sgt84IhvV-c4Ng7 zMUYPot(c)O?8xxyan$urarL}wTQ{n{?>IihS^B(QaJ7;CDe-8h%|%a&I!`oy76dFt z8+fJm96<~2#8KsUmV%}8h|l74!r2MIx6Ro(SBH<5sj7Yt^(YhIhK!`n9DYD@f|h{` z8N`+n%5zwIiBS>nkE-%h&cQtVu4MAgGr`}VuycoD6X4fWuL6_dy)|ZQ3Ha+zp4;m1 zqH41>Yr|^%tu^?15yT2uoA-=Wd|d|p2lL4H=iygpIvfkxGaf!NT;_7t4`RV#H7m(2 zU}v+Yo3ENd?sytCOtV-YgKOiolsvZi&`C8BQ8O~Ay+`FKP`3kHc=UB5?h5I&Z zEF7lD?fHtX##bZe9a#ylinwW5VV)MGr>VHLNte;pUAZ0G1AY48Q%Aw2Mt`y(Q)|oe z(S=P0y92cPK%w>=Ya!lNkM0A#mA1!d>!F=W+Kg6XEE+!b#pE~e#ap)FPZG}~9&B;> z*qsxInFnZhZ#}+kwK5v$3s3wns1z(9ULTGxpIw&%XZN^Px9o;jy%PTN1ne-*A9ZU{ zXhKC$-xW=MHG{(zDaE#KFwYHrQ#~5h*M%FKX;za)V9>%8$++i^{_^&(?BhL<{gaI@pmd2sK%4qODU8EqHNs`YHI+WOAw;5pud^S%GvIdJ(raddofM%y{^ z9*hIT(+}{O1AXUo@X{s56}6v7|Lo#*wC<=MLaVp+68L@z?8mNdyUhDn!0t;|>9KxQ z^_P3`{n9lhi#p>NYQ?Fo9T!f&u$5DZway{8N)1iL6#OG{f0bkLpQaI8k5=W$b{!&q zaQxC;b<@XvOC|aQFL~UkT6jNIaPEkohS1l= ze5&wDVyP`5N^3(~nD{_2{I3Y&#NlkC$vGvr=P7D`3Nd$V5d7T`?1rf7WyuwHb%)!o3KkZtE{aazvr~7 z8f&y9K32)Z(2~{_YF)`I96=rDdo zpVtK%IfvieozHa(!A5~cM=m1}n?H`6NKQ399hOBZxoiW+u!OkBByumDBmDp6*gMf{ z3ek!&{U+>(VEVL1z!M|ho01-{G;lgSJ5A|mC1>a7D7%1x{jz*ro^s$;E-%d0ih^8a z7G&dR#-NEE#(v3tm&cHITSe|=4|RkotdZM1U)cO;*1cr#XUD-TC2pDlhawOCz*IFK zuTptuv69IVgpz*`-tjq@3NH~&6|=>1JM*;yU6Pr(@x*VbN1i>Ac+F(=W~i}ejf<=( z!p3R-3VH(Vf)|PX6$B3>g4jjOF7n~{+y3ju!y_I|4`+B4#8Qiix6Y+s z+00qf=@o6YNMq0yrhX4ze0xWS>dCJjBsSN3?vze5dd^r}+#4r*kE-YNaUD5vSY2pp z?%A~!&I0~6wQiyD(HcDw?G|jLZ-4r|J|Fs-zMecrqwvLNuUd=F>2`EZkE;1DzApLg z&IgZKYwpp%Y`cDlD%K|Ax(rZJxe~SgS8W*XTblME`W*YW>CH zmHISdojwm+qrYCT9L>|^`cJd-^jRo6sbOpNSBvxY7jp~s7ku{9*dl$Nx>;Xj?b25( zDl{D24&2wJ-S|lRoWBjv{MIdPY*??zm3|t%bgaIeGfdykMu#SnnA>jj-pe-9d(8A6 zu^V^rKX;5_kf-K6hr&G#z_+j({2*#}B6#ldI^eTE`6WN_Iskt=m^o}5mN4c}BpOBG z+jEszv{8HZmnv=Rd^j9)wV8Ni#>Vx^B9D`|X|2|B4{zFDtgWRb+FesdePxq6j~>?f zOYjhHP*a39Y6i6m(}?Ns*juC6%qa3t)SRX)Q1$sX-JquFIsUItV;B4>ZW|{JeYB_d;k1!=w(l9P z;y2sYeArj`+%6^!raKHae0CUZ7;0E*!|VtTckR0ln?Lfs|NOXp&;NYu^VNUh|Gfj# z-?=T1-Tpma{tdtPc5qlu-lsWZxNZ6TC)gzxEAOQD+5xmpTEOqNYq!Ah8{p|BaPNW+ zGY(P%Z5ZAPhVMV$hyQ$5d(ZSz?*j+pEP5>D?ix=XQ+@X_w$xgjq)xJj!FKPdlhpm4 zqW-%F>^==<_j%(2`vt=fUAf8t$H8rTe(=f_;wxbI75sNzue;bo{5u8zVwz?b(xWJo zd|Baid`#+f$U_I?-v;AvhnB-JhNl(1XF6+Xq;?%_QrqdP>LPxyt#PkrTFi{tTm&4Z z__Rp)G34Mg;NDX6vU$fg9V8df2rfmElMVm}gNT*;G1vV|X6Q%%5$IBl((G9iU5#ZE zHPdbF`_&AmcM^Hk=q)LVuZaSi7vQInZ>pZG$Xb4@dM5m)S@69WJdUojI50Ys#Cv1F z_qb|~mpFmd{6;sR{nQ9osAf9(Z}1=cBccZG7J1X8hPjI6wMhKJDB{JjRbU+Zk84<@ z@EU51@r^^lTEp$c+Nnxuny-XaqL|HW0^^*yyhn`^ZTb!zGIk&=&6Lx_!;?tM;n6x{{ie0$Cg* zbRBij6<{Eo@il#wTGd;rm}Y82;2LC*E0`GgmHztsPw=t6)>q$=x5f9GA4^YFVtzA2 zs0|Jrqs4L9VLR6zjZDAYGQlj6}I7v?WlxLj-Et$edUKy+EB%OsD;~c3SHduD#P}yJa@)DUQ7Nn zuCzfrdwY~g+#&*AWhCog47~Q#O0E}q^)%w&so+u$*Lr!?eByy{g~W2{Q(>QBKTO|T&m)FaxU57 z3eQU?-qoj)swzdo_e(2ULwqSiwa0o?*}7NB*dhtk_-`S1>5rCOq~lIv>r#&p0Y^O) zTRI$@H4IK_z$R?h<>;NwfJ=}MC#j~KynBGd?aw~{RKv%Qh10f9HBC+Gz^-UyUNs-s zk57FZ%qFLek9`X4?jb&Y^!Q<&=sBt`;^>FaDcJ)zDk3(LxEHw-YVsybAFUB+iu{N^ z%vboU^Ed|+6NxjxOA9F8p#rYM-h1eaq8V@;KH9-+_t8@;)sX0|^#0hW-$jCvi97WB z$nE;ez#{!6So{~k_|37q^l40q{_mhQ`ajV!{XhKI>Tlw<>i1}){+0g*{pEu7Zu?2} z7JU+L-`$}9YiXhWDr|#3P1+7-SL@5wH5$6PL5ubt*H(CJjSujT9>O!fbyayy8VFr2ywsF#N<-ZMV0@sPw`(po|s{&7q1?`2eo=HA6CD8`NBQ6=f2mRuM39#M|kJ(`Df3+_WWjxcYC$k zhR5b#|M@U&QyZ_J7`My#XMDzRp5d^Ut>wNwtrl;87Nhp%pM8&QYksgDmk+ny@z{R@ zzwLF`2jwFy_hGc}eeb#X^5%oT1hfBiyyvxFI43?VH-4I{Cui&9s=dZ`cuqXv_Txu7 zdF>i~&gq$YjozvFrbl_+dF7H$T)(FFzB4*}`6BQ2<9mapr_ZXU^N8vWqseoCo`AJ= z+DLwE-L?`HZ7tE7jm0Y1u$el)66*eU!bjYr-4(U)8o;@ZLux&C0u8fXu=}Dq@TU)5 zN6+@g4f?9zp*IdOEbNDa{rzsVUhaoud0GjT_(yx@upYn_Bla9#;SXOcUzv^D;71jK zlW-)NlcDgNqZmnL3$>Y^AT1nw)9K4f*|uFnW=y7^4)w79^QjNZR^i4x<+0vJr^TsY z%Vr%oMgIQMb**4c3?>&G2ye=t+NdRPyMBlttIx)NqY-1_NcqiDP4P+{qlS6s?k)6A znL*uDHaHrC{$DWh)-a{R6-%v+C#Q|RW);3E{%w*Qu}Z6tQyT9l8;_1$Z$fP(_>JBN zkK^Hc#qm6;4lQ+J;VIl>Dfr@Uz)_B`TB_J;dMwnUy?|y%bRG5g4WVEdSX{jX+kpIR z-BR*bOO!w#^%zE^<*};4mpXJ2>WR&gzYVK{zf})LHqBE!yzj*NK6JD)vWO zGra*Th~h12uSPt!ub0iWipy{%52UF|vsSL*1|c6A*) zr0$+$I&&x)GPP45zD%%W49il$46f3{s8qvKdYr5zwef5a~P-iA$9Keb>{9pYHRLs zKc0tQ9fgks4{;Ctz%qK@Bhng54rd5R*+PZCxDz+Drqs-9u{4}jE$kdjyB5bgDErBaw z{kQfslxjx_{P>XR3Z$MrjCgcYOS3j?&PQ*~4;|XY@Ktvx8NIZ`a_mTA3<>DR#8!ag z71QCwPX*86h;E`UZ`yQ?m<^W$U6IU&&o^=nks+(4}|eKx`4 z{T*%KwfWm;bovY&YkY$faG{PK>w*W>sRIXzrSX~F+_!OY#4A$am##>r&-e(m9X{6& z<3B@ll{$lsXc4bmLv2b4wK2Q3z67c2MiyiF6gw`)w{etnTdkI$@H4cpePu{#fHOwoRQm0YSX z(keA#(;-dY*`+b-_Tpy~YhT%@VOu*ix$Lm!RvuO?eDl(Nc6sd0(KM-ImZjK*G1Yat%jFrT?be5{1|#(R-)!=sp=QTW)A%#*MZ<|^^Q zDC$TeiPwegf@i_!qlmXfP=_1Jdm+To!m6lm*q=l$FQ4@(l<$rwmo*pN+Dfg#e=)7A z;_{u^Ud_5qtzs$ncoi{{{lvmgU_q}C@sRDLmYsr}rh zOOJ0m&2hu+mzHnF&$isPPiNfKErWBG-?s4@-_i}kJeLQyE#Kj}#}(tb`QvcUjh|&4 zFvkM}GhNJ_t>N2C;^42yYuhmVe)V{egN8rt`g!shhxg`lGt8dwYziN4TTFn@J~yA- z8$OP=%U5%pK6}D2+cyl4eUEMH;WNj|>%Px_y!FKr44;1)0K*5zuWa8B`228c#fY=p zxw7q_K87Ozem~;>TFl(W1ODrMu>8*BhtzvNR6jZyHy&B-7#s?4*7cmrM6W6(l{F%Y z+R$L^d`3VZ^{opvZUVgwCeYt?);!Io4s+f-dciMRq#%EPC1L;P=jLg{x*}CpG8bA8 z(m&?3j+`M^ezI2`r_SgEzJK@4duV>3cTNBGrb}nRIJl4GI>TANA}Z6sQg5W$1leB~IE-UC??s)7ZS!fd#;kUP69&R`Fzd?0%^)Cx5H4)5d7g!s)DM z^U!&ksAak6_BE{}t{bD6_5NC2nnfK8IwZ&UQU|h+*km1javHR!t4U=?_p0K=Uh=>7 z@b#*+{Sf@zwo=e zEvJvfHf65PM4J<>t{n2g#BhUl5|^X4E2!Md$@*IkcI^Z$$euy`n;tZ1uYZAd#E=O; z=$nZ{^v$GU=v$7~ceBP~TaDs1^tmRZr8Q|3b^7qGmyXnoWHbOak{^Ie9$N*!pL|Fn zb75W#wRAz_b>dK?ZeKmCJN*}Q`}#%Qxp`R+ZeQ2qyVQo>yQ^mp?&;~hJ9^4oe){kZ z_WOes8<#p_)-sh^$(nsPfH9vii?&~}; zt_u&I>HH%!WU2Q(!F)dfKgl#Wj9=W@->3AQ;q=ABr{edcsP~x?g{EOLx?>>=U7!2$ z%)_zxmlHWx-+cSIKL7q}`fa0wm_Y3|vGGL#X#PcpfWeWjC)nDp>&f?UkH$@-citTA zqVeP|Mxtp8Z!Bg4y(LyD3+_Sa+9ZXqPN3c*1MOk>0OTrDOR-Bgr6{GCTtN{v1RGP) zKStA`YbUlEb|f_fQN+c=r~?coCKSp459756bdn>ACMp!IkJ0$sQPhQ}tXrko{tKyx zpQx|C{tW%YFwq^KjGA2%B?7;kML&BBOLKvmDFvW)&cZX zjyy)=^zkz^PJdQ8F~-g0>T=-XE^Fvk)S-T*bYIn)3%6Bp>X!1)JyA~I6Qv&O*TxGE z&=2UKLGpOzm?#rF3j z_rQ5&PJ}YYLh!jmET0B$TTU$i+zvIa2=S>H)~rZ;?r3c2aIQzF`P!Cig6AJw2Je74 zT4V+BJM!TXP77jz)*are-SB~vauO@8&q!aJmg| z*{|b%yM24V;qAlo-91}@eej(Rc+6+bX82QF2BX39k8#`Tv@Or=<+{-^=l?mJX6s_% zV6|;s-xRY0$Zh+^dmh{8-+|xn(0KP@wPClXNn>`5?Z?wdeS>fAi(kAUmSLY6;5@#v zEyrqkihI~F4fx7I*?H(GWuYgPOs+VDzODh9z69?7{Q3H6+&KNG-+h9v(dYEn`Uy_w zPx|8fZ}i0v#I1&YrEiAPL*V;wHT*lYyhe`I!s)Z=p^2}DPml~RDvNmQw(VQhcI=qC z`)}wleo({JJ~-1ktOv|9{O!mJYG!KiCF-;2=Rpp%aV!2K+GoU~Ly5~pz}t$$N6xQ| zSJUxYbm9(xk$d5x2kWaT)K!2PlhA-z4EJWyqNxhQcc|}bfsc1tE9x51M9WinZ3g`C z`RLG~t3nQX5o_|)b<_2A82!kXjHKroc_?@!(=w@3t0GraO3#uF@v3bt)#V%K^zh+r zJ$`i0jYkjf>LGT|6VBgb=GLPpkFbp%x^bVajeCzC=mD=k9DMH{@w3|x@9EmT+qy{K zpR+fwVb5GZ!|bpY!P}e&#?6>H68`B}YGBX?@kO0~9d{A=qsDyszhU>zKgA@SrgoO0DpO86z}*A$pSYW@5*TL)!~H-9s*wczC$Q>nh;FVcRd=h}{F8 z&!Wb70=-m6`NL6&nm~;RnyXpZc4<70CI1nRR%OZzO^uzYi9s_pV!;#*;lF%08$W#R zc={qu(j@<}TAE8;5phDxVT8dop9E)i&eEaUjHcu5z79RReL+v}5~I6+O+P=l&i00$ zb1hyxy5qLbAKucPtMD-3#vZ#!4h7rr2(hIT*RH6Wc+>Izn>s zfBlr6#7}hhdO)zzPhmwj-zXR1k64HRv)=@N8NChj?!o1aQ|s#lo78cPiY#j zNpSz?hKcv8+>Bh$ojX~=dUfMFa)j8h%DJ_h~ryYXtR?;akc3 ztfZI7bn-aMu_K9bOV2lvy@xkcOIxWy+>dzy;vn!ieu;Gqp2_qo0v`zc)Pq1wTI zRyWiurMz76@8voL9#PO?N+V2he+van- zTsOYD!?fqb!HIWUjg|T59?tXFj@8)+rm-^U!)MDlod3;tcX$qF zf5##g0C3P8W2WKIJ^>{yAC~%hCuQ@)FJMR2E*a% zkavt_o<@NehTRFQB{{@|a^P7dl`o*SdKNWU)Zi@nQD05{R^QJUqH+GjG`FA$)|^J) zyBzeCsFh})p~N{uEyrwgp8RYuwyN>C0?VkGtd1b>il&rtjvKQ1opfqn)A0}5>2Gse z&z|049z4(hcs#&5{fez=`k0Qr>Dj-q0Y2N@@&@+NQ|cFgwt2!evte9Ivm2i<@4@_^ zA3o4S*7{SIF48Y-34I#T;}|(i!$(kOG-{;APN7%QD7Zf(e$@DJBeiyUx~>veeB6Io z4{!GCG5G)N!F@NLVGeyq2tOat*_fG|I9_i z6o{u&C+EL4NJAsW=+pT_^vO(k((^c<5%gUuCNEALBp95Ft|Vs;Z!UNZ`k^Va&<>wY z{u)ia^hNSpJr6F}A}uKhq_)#vvodGG#Tl=0;PiMu?2p6+nwCVLiX`H1aZ5FF*%YqR zD7egHHE!M<^cdM!(rkKFkR#YSM^nN+)f_+Kh9MKRCe>eEB&ia^HvkdNKhl7y+OD+f zIx~)FApuJ#q@15H^O&s9V-Mcz@=dMn}l{$$}-qnAW7z%g2MDc%l*hJWl^8MTB-H)n%Y~WRR`87xiXx(qF`bYa8I_N zvy?YaKT$&&o}H+K+zd@yXt+I5-+Y5+_V_WbPxQ8Ga_{(fEofr5cOFs~T$!G;J#f-` zboN}2PM<|vsrMMU?L*WN)3f48hton#U!IIDli_;yPMkRgp4;!i?%(UXv0rKR)_m>W zSD}?bSNB&VEm6TbR46> z?np2^o}5NP`BLs}`cdT5523D2yP8`Sk(H)gIBMG~%e1Ek{$)kE_LOYX+6*`!i<6s5rADChOw)N>W?zrKn!);!-n7GA=&Chne zEw5R;+I-;;TyL<)^3E=n&Ffx1+wkZ&4!RGwO`GIH4jVl8;kL!e&F}VnaEp8Y76Uho zwS9gVV4kbf#-?ySwqYipasD-1r`N(~9IwreYY?}+8ZPszeVjVWga1~qZT&re0k@5V z_RFhRZg`KMJ3ROK*e*A2xK7Udt@F2id2YjJ^Up1>Zn<&8doPA=`0dW2;X3Eke0Z}< ztQOvUZu7w(JbSJt>ar554{6rgDvi(Gq4D{UY7(a4plQominCW7lXDH4(!zHtWZVUnc=x$1$@_b zYPzdx9Phk^+b1$i#@8|rEuTi+NmLm*+bVx}mW!C% zQ{ggCAhu++DQGg2AN6P6&fPdp(+kn@Sw9PoE;=vde#7yX!YYX^RgNSlOh2SLbR()v zzXi?)@v3O{8)@++a_BMqc0%nUWi^D6gN!C8v;v;>8Tk1&N0~D(7|ai|H_gs8`|riG zhu&+v|B7pG=hfmHFPY0PiTw<4ZeO#8SP#3mFH8fE`OI9mVRa3L--g|nuU*z0|Hb-t z7A&(4k1(R1*U zsUPU>$CqOqCtiLQd_93))xpch(Cfx;X3Yz)V2xyi5O)b>xY#5y0|H`WAPrGvmbqEzY+>1seG5Is-y`Q;#QRj&d zoW6yY`|Ydh;kBdJj*{=757f?4{3d)Z=HT>%k(!;b2)(W=y3BpOxr)3BT(^?;Ln`Sw zsL^xL+XyFLnMCgs_(Dtk;e{`t)-N!Sd@}t{>20^NY9nL2qH@rD-32cM-#dIK+B!Ap zpf#-2id`ENm5~(fDN!! zg|)eAhl^KspqN@Say88v%5BP0^d|aF6h+cg8%=%UqU^YB*;zY;0!SiDW)qeD_4t5>V&h4AX+mk<9 zMUTt1xx|5nYuH3^dosPzCVryHv(aIhjo$mxsmew_v;x25IGnU|+-v84ey(#*U+63t zeFmKE!H+%#p7wyr$H3%cJnz9THtq3l9{1X3@S{(V@94Sn5N-X(^tXM+oOz_PF28XL z-TnK#4~D~&IC{(CDYtc$>)dtY7LV@{V*#ttTsd(UJ^uT|SFqWR&_AIF-Q{q2UB(B? zC5A9N++Q1aY~);}3Xk z-{ZOO^FG}6`P(1z*Z9}27dP1b#trs^|NPe3DZc-V-2%?~FyGs<_8Vpo4)e=D=B*ir z&$w*HU9&j3i@Af>E>6L3zQbR4zYA_#9>VM!6K<3f2nDmZ#3`tFPgUR zwtgr&pszB^^-~6X&fwJ=GBa5rsoSVcIH``a7qoi&Hq{@a-V$DW(cw1b?rl~Eb;gm^ zA;jW{-&VlQhGQIQu^{-XQ9MtjKWt`OG5TWb$b%C*htnF&+H3k%!MlxrNsN^oWLPEZ zPYYVi%~{w1e#AS`Y(|eD6b^MLpNW8%9tuW>Qy-q(OuvyPdOc$ggjAv}LT)I&3f}|V zD%hT>i&swLKbvjo%}Ljb&fy^Ej%#Cc)-dr6cZ_ zd<&*K>}G56p6755Zm|X|2_fD;>?e8(jL^I~EtNhVyw* zuUHob@UvgDR=s-c9ixji**#!3f!#w47Z2ioFrWXW9jiO;r_Kkz$DBTN?wA6y&?DJ| z57tDT8CE;31H)%)1T``N z(FtfSHjw8{(1Nr8Eli)M@k_qb1oRw7&H9~2&Y;ip?5~NJeoc?Guc!e)n|an(Hw<|y;O<~&76szjaExPu&AMKI7#8=CeT^|k~j~cW(c=a{Z zV3AXgt7eU?vfB31*o*YpsDlI9zz-%(3xvFNsVmL3b3ph zU!HXx-scK5#dE-zJxwL>AU05wm8Qy$WRpsBObybKOhToN_8Sxmjr?QD}LE zDkz@Xu>|tl*pzedx0fu%{v7%}F}A5HBsW%4S4}*&g__J3b#+;tSG#(;kEr(~IkV%P zI&q>?M^7Bq(UWk~h@*5JYu8RVk?Y_3v(U4d0@rcU=lXu^Cz?h*)%Yo2 zYuKc(&^n)}Jn9YV+gsJjzFWZl7VM{E{daW;UQG!cm+koEb@=3_8-4(7sg2vv`7A3X zhtxsN?mpM7RRsn4TDNtZN)8;+LHd1_QCq!oCA~vSid9rk4LbSjQhe6sE8&e~B`Gf_ zQF(CYRu|-;9h$36a0074_NWqWOLZrDP8~bQBSdQ%{WSOVbfbB3PHQ%7bR5GNYE+k3 zY*yyJLUf8Ei0w_Gt^oZ8*0W?{9&u<7B-YMUQuQqCsd>ai$XRd?Cf3g48qI|xI~Pvt z0x+EQlKB*0u?QSzUfKK9o5a`6Vk||2I9b63$(k9xO!MM`uoarv8y?mh=KEs$ALF*uPx;6nHhaT-U$a#VOWzun zy8+IE-|w-zfAi1nH5*{MVfIT8uYV!G{R_{%0VaUeRu67Ix7CKfx99BNv|>Ch7vsA7 zhGB|_F?Y!a)q>k$Rb3jHU#styS7`jk7ELcbtGSK$wDiQ^Dfr6&R{Z@xYQvj55-os@it? zN21G8Tv4N{wk{pG)DISPXl70UT$fGMGbLj)&I7aYv*EGER8mU??j}_RqSvuSfra_R zhPF~mltZkNTsZOVDDXQLERF-`v z12$(hWuVhnNgY#}viIWWVKXE(1+gZ@(g$>j!2VLOK3<2pG6JeDlAZsGLNH2rBMg4iQ~#H-l7@d$>_AA9f!Yd zwR=(396xg?jvDSbc#pAQX*_*nlJR9S>d*?P<-bwS7hgYBY5V3YsgayQ-F&TTh*RbU zdhaEKtC)Vt?Qq&#E}RF)N;Ewx1pUky;>|g%uR%(0T!Q6`a!BYE%)@3{UA>j#1BV-zQWFuTHBB27n4YTC&2S=WHfh!VP1IkOQ>&Jzl{Hz^ z7VXv=V)L2n(F=&CjsfkqK&$7l`NsIr z$4{S9WbjhOtVmZLe&y!sMr{U9=P#P3z>GwC#&lwD5gV-7N$*SIa%qWZqgJS*vr`rD zCl>J9^yxon?p*p`&Hs_!qiEAEq*em^Gi@EYxdt=_&@;>cGpDAYow#NdntZ2KbNHAF zw(igZ_=Ka;G?}|9iTK}g?zs@^2m|T!gwAlqLO7%JPO71PlUPYw6|a{EP^%aUeupZF zc@*Ceg!UinRYN%TB|6H~rzGQBClV)2|HQUn zxcTC)XBfv~m}@*Y^SjMYvGMUbIDr4;-gCH(A3yjx^Xtt%Fx@rNGBceN=VP-jn(yuN zv%P*HgRye+!C3RX{vr0iJ)JbK7Tn_Be_H?b=g$q(KOR1x-sRCb28%hk-!r>_=O6S_ z!EMKTcdrx6Sv|Df=z|F5EN{fma}Ije71)@yiv74?#mEu1(|xQh$HA!i$1xs0`QwPvr+ zMGI^*IqyvH7~PHvbTP`{w!+0oB$l2;PA|QFji#?&NpI{;_)4qszo~Pnf=h%pip7{> zSd(L@%}r@crDtazz3iqbl<)ZFv(2wpVD}wz+<|cTzZ-3Ot7G)TPe19?Z@$r& z-+iZH!$)ZBX!>qXnW%Esv9}Lyfzzhj|AfIDHNTxXZn+=tcsv{7Pk+zD?E$X;0CUaF z53u|Nzkm11U2Ut!E4y;f{%W|dcqwoAa zY{9*$ifu$Uttpwcj4gPaye}DyMWdxTp8r72U2}@kJBpRif}T}fjnb$GNJ0BOsX3N) z4-J@_aAns=D2JRtI(&+ZeKGhz(aPEzLA_hBQd?Oc_XateF85HfHl9Ue>NGt=vO`&u z(LJFasi2A6WmSWgq1`n)K18GNO>(IDNv%VxpPKjl!)U^^=PIk6JVF<}>W&sF|HwM! zavoM3UW2whHOQ-|-$ehqu$Y;Lgjs|%f~mV@Z@IYpWLW|p3Pdl|riNu~%EEO!^z_JiAx*ms+*;Xqjp* z9?-$7M^#C!ecEzr+L8kmkU(x}^>XUXleLbzv~svl%c4Tb9qb}z&`b=WPL+&m;GQ5BeJT3!3_lWTde8SHl4wF6Bm%twj4=-cf{BMcvpc5K2NjZh7DuRc)623!dG#ree$tt8auDWc!w&kNo5I$W? z65!ITjzJGBSjq8=wIB%oXZRGYC`?kpsyJn&`)P6LBrT4iKU`)sePcP6oKP)Bb9EN6 zpqWd**L1(1G-=5&O<7ET^2KoYqvp~NZ-@3?YgJKuk>+G9)k1n6#cnHA>{j}76clL+ z=jcbY_7@Sa+4uMY{JB2$KI+zyestl_l&k(ijq3ZV(G!LTezFw)Zj)-y*RozVaPId} z8-9`;dXL)g9;HXw5wtMd=yTjbjNq`E&sC}N_!fFHG3U@b52H?RSrR$KXln3t>HV^X zdezODTF$x2$b}Dr?UGNNBrS>g6-i&D0P;5QUnk9*pz++hYzzv4`2e43O(){5fXZ^N%sx9y`uDziSxnVYm75 z9+ueF#})8#^4)pn_g*pXy?CXn-fQGjj%Z|Foqk+itI0(j)GC784fi$w@E^4F)ITfw z%D*c2;U873QCI&#A!q&ow*Nm0z4p)gvErh>&flxC8}@2Q_706k zyFaP8Q4O7aItTZ%;phqUUC>R1Gqk#^Mj3~GV&GA@&(vM-6i=b&ura;%kW&S?zNTTpZ%*IVZO(#o;m;6X zGL4i-az3%}-ePMPv&P3Mr5zu?WxJAESYs27|1B^5=EY0q zoQL5y-+UPD<#c#XEX4TzE_dOs*(>)Q`=0sa=CgZP?`_?j9h|4e@3>B^JSsbrUKQgs za_m@o4~#@_V}yo{ps()ev6?)Q^<&;#wbWMWHMwci=rz2zJi5(G$EjpLzTfcOAHL@{ zXWkH}8F2Oo^MU_mF?@?{yrG=x& zY0gpbYJ89)@@(d-630luE=nZ-om4wR=?(a?)Ygqy_%#~K^hBZmRKzxXAaZe8O>^;g z7rM_y!O1o)iSY6vaBql*M|`F)hW(AcABo0D%p!21L%k1iB2TNU3RGCLPWkog(S0vc;r=c7i^VFer>Ax;e5(3lEw9;1U!8Jd z+~|TeZlsQ`fcm*L=&KacrxV>rY?1ZEbT*K$+0wez`H~ypVimV^PkhfeD3yU>j4O(z{IU1Wm?Rg6Gc5^!Qds*7hutA5f93xkHN!OlV zqX)w|YRl30q)+1cJ7?8>?S%Sx@5q%C+E87@ZC{5sJgtrs?b=VR`;F(+#KFNo0f*tr-CmvJx2`?8 zN*&KN^9q<8q=?!rm&eUo0CkODsc4|dU37UyV(4xMo zTMy9`zuBvc{8sNZG-r0_DH~kO+?j2#o*%97 z6~S7zJb>B*YEzfP!2m=3xCQ~(P(dq*|6uEc7otT|kf5XuY04$E1mj_obB{e+fz)v zC+BMSTIEnDw|v_QtspL!y?vE3x8^Bp6ZNy1=$^o#T(y-xB6VxEej8f*nRC%W3DLNf zxf;7_16ypnoCJ+YB{#J>jd*^$&Z0kc;oJ%8;kwX^Yom_6RVT^!pXffU!$%H~KY*)u zvJD=7i#kuVQ2XAgKE~Ozhtzxe5IS>*bn=uvMkBWOF#BlLfljc#rBWr#q5Sey%7K@% z5}Rdt$to4@+06Ajrz71RN=XV*p#OAY2G*OC_!TuC6X$`~b4P339C)$RfsO&UXJOZz zxqA^ka(rFGwLyQ>;fdjl^H+TSf|sB3{9b%yFxcXX4wpZ|X}6BD23g-r(<65n?$$)( zbsN@tm~J^f$L+NkIsUeBf(*OOSGM7LV}iZjUu9zZ_uhSt7|n9UwLX#o9663 zqq+5WH22UuEj;<(6n5c%D)a8YYW=G}YWv^gYyUxtd-yL}dgfOxIX0jrU9S{%?w>TS z{F=TmXwi(#2en{p7xB~+)M53|qwkU~q9=6t?0Ixq&{Mm4o!DLt_`DKd2ffO@tOI+^ z$4XZ!{?zhj>X94i=}x{n3m+-BwUD}G<{+P0u^*l({?>|SVqN>Pd7OzKn1nx;q8xf_ z=d{tcqXo@OdQ@fN^Q1QtyWAJ2>{jAet%*uIfdAIUZ&C}B(^#N&b(?hR!YTZ0>_N`i zOXiQ||6M%9&Ktwx{;_&J}kJjT0M1H5Nrur9!CGus#2e-}IF+#6@@ zF{9!5QB95v)lYDU$1IwU?=T;|@cEj)XrbmW^HWjrCf$J#ZuJ1(er*57ckr&WUDuEC z+IPKe>m4t+jUDld-}2_B#meE>F$W%V-(0-a&)Sx$aAJLF^^w>(Z~!ZbnZt9j+Rz|$ z7{kyzUX(XRbJOAZmCS*&iZ%^#j9B_Z#gveXSTja`iPWq`PS7&yx~<<<7`cq-8V0fF zxH|OYzHm*Imtt;@xc5Pjwgy;q6gHO@? zq($@^i_!%0mt$6-4U$Rk>X|K3(K{SNV;5aEzZ|o85gx-z3HjxJ$P< zhMT6Lz%VU^%XhE4YjB?Ha1s8(1vu~*?_Ae~+x_a}wez=cFs}02Rb72}L)RbO)K%WQ za^teD!FjuW=bEmeD|7AMP4M@wuHWM`%$I&%>t{c=IF?)Yc@IA0^;_3;`Q{a!<-2F# z&7He>RX6TZOGkaeja%1sh4;_U$FYx`%w_g*mzu}>9P>Sn`S!zGoWonXbpN`}am;<} zyYKD|U9kUf|CY}8Ur~PkDlMEnLpjucW+q1|BAgs-O0Z(G;uQ(^JdRvK1b%vIUaF4v zo#D6O^1&PIy?RNf;BQ>u82b55yAD_Q-OF5yi;N45OI*WC_MG=G^S+I%jB8xG>%4B) z%D#J@=l1<;ymo_ge}j2(!>%uVt8UnJb+6xJ-qK2-nm!F77f{+#nwNfIR90 zc+C%)Pxo!hc*5hyZ11wKJ8U1Zua>$Rh59W~I`NU+dp0UOc(!JNeG>!d;guZZ=E_83 z2g4GUY2BfExN_IAhaPe7{p{6LF=wCQ&pzcip4nrL_c^%oGnn%;nDXcu$HK7f&)}zh z_8EEIr;JBW?=kM`3CHo+u9aPDuJe^!*oWLFec<#N=HoH^k`w1ntF*EVEu%L2b{5Hh z*;GxRJ%$=o2KAYS+Y{!F!Pg$G@jM>20Dn7anR>zP$E+8|zx83H&(C#!FF0%1YkDiD zID{we%{th_Ke|k*}(lGmD+_v|eUEetFQ;uaWX>J{uf4~1-pv0t-`?Y^{Q{1-eLMUx z{5Cv#uAjm5lXoAgpyQNgZ>-bAf*Q@-(5l(HPibD`Z7u2iMZu^3yAm${Z>_lZM-{&K zH*Ne|DfgWeb^Cv4(TTTO(EhU)?R%u41J5<3%IEmu6p2H9wIJn^)X%O>>WXu;voLO!OPThp6^jxUpJcQXsn*?Qv4Yv-3TpExJp`2iQ<8oV8_`Do|V=A>u$xV$&l%lF*l6?)Gt zzG1`ka=iBkZ6-GdymRm7EZ4xByDxR0`F-pvJzCD3=D#vdon#Q3IDJw_(EPu_z4*#q zXY4fQ_j``T_1)pv%sw+NgNvisHRrdTt;l0fC%~}U8+Ok)o0F}}yYsr)DL*q`dg0H< z;X@_vh$YS&?s%!OU~WP!dTP~Uz-M}T7UM@3(mQ+uy@vL{A%wTQWHo(2GA3wg_B41n z)M9Ty7h)?~Tf2?-N*o;?SUfzhqz3%*8b%e`tX0Ixw~f)vIB?S0$Y9OanoxES6(?f-k@HODw$=fuWB!=kD5zk*@&sm=*?;LWDZ9ldy+c{#m+!3#t?PG!hU@Hj{ozT>%wm{Y=1Uh z*&O8_^X^6N7585ZA6Rn-??sP;%Y5gv<_j9GSe>i;F8g@R{=D;tKg4yn`_|^a)iBwx z+7S1goYN~}u`i#1qvTRw+Hrvw_8Gfp+-L2)@!Vou_8rSJzTh6S=TFhs*;KGbQNh#; zgaj(kZ>i=l@zbnj%QP#LxOn_BdYhxIlN6@PW1aX*%me16#q@k!C(9K(yfDld9PTw< zcmLV01;gq|-(q8Yz&HEf;Ja7rVp|W}UVwAYu`z7?j6LuO`{Wrm$$8e5f)(%^=x-QK zd}}g(^>}pe#$#uUn`78L2Hg(&%d#E2Xgs-_Wz;nqZa;Ey@>k%b8~mo7bHiQ7p&_zS=RwqDw?d&g*g?cjMFJl}Ty?7aRqy#MUgd4r?;2WKDfxdD7`vjJS44FAdFr`cx) zhxy;^*W<4Fw%{<=)YYlkF@n#wKd+X@>;P}L?{F@C@p4z^&AE3rhs`s)4qRj78T)eG zwzaygk6-&($JDp>zvI6BkK*OtIkNNQt<#<##bfZ>>pSAD;U10{ht1}Sw}#nzXSRdg zhYvZf9_o>@YMZoRb+P8J-mW=oYv_H@Nxb>GVh`L`V&~6Ve)_dG-1u8nzy4>fz4wob zKlMt1%{Sy%aY25&d(j#{3NPq@0ygeteQ$uPQ=^ia7J9q(qp#zw70TDime(FK?qjFkcUu>_j_8D#u5Xp7{%{FY(%e`WmPEtvbpH=hizJuEi-cE+DJU%-2Jtb_l{ zcfCI3W9%GY*E^f#we8pbqy2Y&%UxH)S?@X<#`^Hk%||<5Hg^mMm^X%(FPRrsyXeh1 z@4UFj{Jyg{IBws0b!(FE8Vt@M`z^aCUT|;L)l@5qnxnX+B>J~y;a`)JPfVnD8~Ljg z^xAS)Xz$VEdPr>Q7609A54+diaL&zkvg2{Fp~35Feuw>k&sO0x?jG>A79%qs#MVE% zhAw|)Yb)RVmFw^;=lKr|TmS4B4byGd8ffRlh@-QeCbUa-YT?YFKGFW9`HND0(g1xBGoOYL5Ge2mkQk4#9_GJ2-xm+vNTa!1dw zvFy9HZrJa;b;50J?Y946SYyM(5a)ApUaeNz4c4s>@m)UW`c$x{IX*4;`kG<pg3t6x1+T~8V~@n=9z&db?A%e*APy%MMt(ePsZQM^ zzs-I4-0c^r5f7v-@`0(1k?}lNk4fB7o zGmIbZo^w5%jbzx(u$a5mgnhv5LF{&)<@*+6|M; z{cgn;SE1F|sHiQKiYVTLW+MHd*PyinS8`o#J-uGroW6N`H+o1H`gDsrnHONRT~n)@ zaDz}aoA9X|WbR|9S9ha0^2mf>;wY`%EIn=d@J`;g(y1-tJ&TiLF? z$3^hgCHuVPuI)S;X4*Y%nEf$sdzi+2aq9ushVx{@`2cQydh^s?Gk*Wa*U8}~ue-I3 z-*EnvJNJe!R4(=N3neN^C84 z`3?B*$CeW_MG7`opWfPb@QJ04I>>6y8p`>4rV)^J?GeM?fUb1!z8-~9zOntvoERB zx=C#G7`ivs^LFpqv#LMYqq-9(;Ts=O?a?DT0=N7DbMmDf54ii@#xMBX@9@3f@cTX= z+Ff(+nBKp6tM}mhJHu(VzrKCP_ujhC+VTFv@xC`Z1Kjk6_t^I3_UDe5H=Gwesj@bHX{-Ui%?`=+*{ldNC*^xGfI4A7WzVnOyz8wp5dG=grrD#QwT3(4Xi8F|s3_sy=*JW$g#FyRB7aorln~Iis7bxzAXC z-rBvxcYb-pwR_9`h>i35^-H%O+n3o2=JQ)Dz_TB`>*KRc+{!jlFk8Xyd5edd z?PRfzSM2*P`gq4qcB|7KvF(F%`O7QfDGall-8$`l z+v5&fjqzI>;EJnTwrgTIV;Ez@@P_v-&g%vkZCGvhjKe2hcUy4NVLICvy!MXwpY~tU zrqwyFNA3)`Xd~d`j{~pA&mKo^d%TN}dpJ&xdolW#$}-GzTu1S*xKvkpEcei^ zx>{@7GWTq_SSRPjx5nDmtaq$Sl`oVSkxA#B(zUL$QKI1T+b7eT-d<{3>2izQf z&THnI-oYljNF2NO2D%Y9(4D$)L5KRzqNjNhZOtBao$u38^v+ISzp9h0UniN5*N79{ zCBAeQZU5V7JU&H7=s7l)#n~KQ8-Cgv!F3;?ZvC|lj@>Zv73a`hTduFGD`(v^Y_{*3 z&26uJ7;atRIuE|)KI8Vy=Rf?0?bm+K=8*lq%@eyn4RgKw)MAsihB-_eyvNTA{ z_VI!>$#ju6R&7z#I=I%2#^**KyWV<;&4xRO&KA8(lE_uZ)}VP(H%C#_lSZMz6-zIz z#2R>6)znSZppl1$M{?a_@Sg90-O1FYrcgg0oR59)|E*?)Q^Sp>LqdLl(sxh~QxUDu z++1b{EWH$oMEq-uV8U5y9ez!48wl;|NA=A z=Ff`ij=w1@m8zIP4B>$>5=LNv6q`DTf&;_MFaw0hB7(EP1dPT?U?>9;!J;xrEECMa zCLksxD9SSbWp?r|Za$yy>2rT~{!)3+)%W)8<@D+9^X+qbxtlBgl#Qh3327^6HePJ@ z`1M`9D;M1r8lm%EjZJbcfzGP|d)C?EU-MMELGK^ydsX_ZcddOFujTj3wLG$qE58_H z&Mim2u}i?e?!)>u&e}J<-^;0w+b7*W;Qlq|jm}Y>tJ|N`x5ZPi?*sCE5BtOi+(Wd6 z+r%E?`j_iES$B**Nj%p6WE}Y_|FqqVHpGuz30~EF-ge|0c?XYujvYjPLL<(2+J?H_ zGY6&&`$=>JZ6>Cp?Ok87Z&*h93pC}OxIJGHvx2{lPccr%_^-Jx@Zn`&kcuob#&KuJO=3BlGo<(`N?$irMPI zAA!UFd**E6F=2*BKPG;7O*z3-=xaZ8j`I7t+kfs8_DSg>-rO&w0hfG+-|6SF#CPaA zJ+NAw4c3nL#_w+b;*+>hxHk6>#(vvAW3LxS##k|pxNKgHjpCQj>YqN({gimx{WIr* zwmjQb@Y1!XT90R(qr>JN3c}73zvng07wKElDCRj1dcC99N-}2{b#0pT9n;NQ^RbN3 zs|?NeqF>up_5o2B`&!|)@(H;TdEr*Uzuh^$ePo-Yj#a1H zZ&d4K+L5Y{uVlKme%Fq*g~TQu9b{micqbO(wB?sQA6jQTSmAYJNUfo}7aZN{^?#oZ zaR%TE`?gOPT=&W8xBvJPoc&^7+Mis=o;2=Sx#S}L5y(G!!S4&NxBz|IeQB>u?=hFy zjGY#_6j>;bgVl(&%x|k&n|ts@VsIdSMuI{Q#`Ci<`AsQXy8xpPI^PCPCdmwEJ}FLu1(esE6R zUQDn2O_#J8tE=)lUH4&q>CZY6Z6>A`RvAuPj&Docb}TIWSo$4x*ACupX(M+nBYQ^d z3!~nRXMS@JN$ppV4$IU@OJQF7EB#u$rhcQY%J9hPg&&@ZgYs5f3~m&b%`^;JvR;_y z=Jg5}P2bKunueAk`i;B#OPu$))3&b+jjT$W+wSG&w9*M5Ez2~WhjmQegmqq9{i-AL z0@}wleCN>X=(@i?zA?S{)~oz0>b7a`cW;~Sf8oCA&L492ii@!@rAvk?owW{&V(kaUa?Z_uf41 zID9jA=J4;cr_kx2=Ir$MI3vqBfv?_w{q!>X5>IV9PM|66g)F2F)+aI@e#FiwrXr7n zas6%hv2pO+-(7vV337JsU?>m{Q+XIA%KY>p5l7QTQRIm0n6;8axc$ zJezJ+W?@m+$u@Dmau29;ZJPl z$|uW#&KbMyCt@Z1b8ZnwoTg1*9<)uO@m1ND`8fSQcHJRMVw-dR%=ejQ=?-r!SNtws zl*}x7S#jmtcsD(1OxN?Vj8VpFbQJNt;jmTj|{50$2iWzw_q5PKS@|o4)kGpK|{T|MA`R$?4NOe`ormTYq=D=oa+tTYi7K zXy=98bHsfuyDsLR1lO}BFK&aA=BrFbcDFpwxoB{wY@*8anpfnzdL8aOj2=8T%x}7r z$n<%y*wA^!;GFr;HeNdN!dI8pu8wmJK`dU`%2)RD!syB)dbjf;=Le+o z{+770zMxIK*RRtqt_!H|rv5c=$yz1-COjwHb6#Ti$Kkg9A#=NopBiV4TaDW_U!>2G zXZodlcJ3I*d;#C};aV?L7U<}cV0gw5W6HU^W7mEgT(^JGR@n!ot{Z*YzEX84eOQbe z{b|^~rLF1MIzMcgah^|qZTznNoCDkK%fkh)TNkH%^PhR}8@Njy#NgDe><_6g{A-!J z#Imgz+H;x4*~mBKhI)49{_v&K|3=z@$);V(pyhMP%fi)8-}&i_2ik0d+iCNXx1mS8 z9xihOo;$61aarw2KccmK0{IY-TT*#~c$e#+Tm_wW~PI}V)B z+Lx;i(WBITbhaaya88^Py9STso385{JyuyecwjtbdD4=u`$FXVh?DQ+8(X(}w)(bl zNBopU+~j3hI3!=u;}eP8@Fj#`Uy`PhzYd&LVt|RkNgKGqO%nZ&L^ZXbPhi> zjk@)GqkVaxJ-_j$X~~)qbcc4*8ejUg3)h|ic&i?ytEVeU0Ofa6@}rH@@aU4EFmupa%=^ve5h zV0%TkRqs^BGmpr=dhpG>v;K)Kx$MdnC%Saxv^v)L*uBK;*j1yO7e=cOw{GqID|H8p zzWOyfxH>kvcDvHC3$F{CeRka&et}u>rE}nP?B_h!S~nOkmc=$Nc8mGw-LB(n8>gP0 z)#-g_nfuUI;&3_fv9NooZ&#Rdzv87|+DB>sgxMbkZWV49mR7sl55>{qXW3D-(}TbC ztK4O7zRCn#bZ=z$nUnU@nlonJXdeQ9^Y1C{_Nx8xVn6lCyu>C@1df4UCFZ2ujm^m=rcE^O=k$9&JB zYoxRQHjw{f@ZWz+ueTru7G?aN8KZQAqo>!w$K_98OTdQoSb`+?Pko9@V9 z$G{fc2p%<$N1f%7_SMz}Yp&&ZQqB*Y*pg4eGY=?yiS9UT;f+)J(v$YbPa49+xy&cP z4Cx6L4(t!z#67R=jX&yEc4p_!+KruuNMGTRxMY}k>KdzS?5?}(&vOFeXK$O~p?`(% z;@_O-sC#r^o|_liahEoP*3qRqG=tmLx9i;Pu}WVUo^nXjet6S)Ecl-KSU%sn4E+u_ z{|*nY9d9iM@s~0&dWQU#XYw09#hD*2dkvU-oq}KTFLM~;+b_CLwB8(fgo;PRw4<0qIY*$_CV;m$n2cC8B;=e+OYX6t+4 zw&#kxztjIfpWZ}9bI0)+bkjA?#6SMsBhyXXL9_j#>!-^OTt02*|3FtA+BRKz0RJ%m z3Ournf6{X=CFe@^{MG*HjrV>wd6s;gGQ?>26uZW*E#Ln&=vp5w>=t*B@xje{_I-)h zjmhWvVDcK++B6+%f(b&@DEIMK2?}XyAPeQbwI<< zcVeOOtL;l)muF(R80wsixdc3}yUfKrao>FGL-tMa#j@yY_6wXe>ie&BU7uT!7tUSW z=eYb=TCE#YKT}86p5PoZdHIa%z1`xA_u*vU_!iuD4~lxN^o2&!wQZvNYt`Q|QR5;q zrDY4gW2Ifqce|b?uN;g0z40>h_Q4CwmyWoB#TlD~d)C(RxWrrY*y_}0;w(#9fnWP# z>pgm!-wY?eINO2uSyqsT8%@6&(2{~BlU|K`AS!y|X`568XJb+{eeFZIPo_D-LFWY2W%q1)M8 zeg|{&-F&;1^V{6-_}ISb`h&Zs?GN0{IkB6jtG|BZbmODkVRd-t^!bC_ZFT4?(=`w8 zn65p@|Esu{@rL_$@DHiGrnlG^bz<-%G9B3{ru6)#b>sF8_c?m_;7PZE{h@8EB|ob_ zG(N;9Z7>W!`~~A$=WD#{cfXsa@kIVC^P1a>@U73y+fK7JpWr<8w9dp4mp{jTIGtEF^G6<~eT#PUt$JFnyd*sR!G5uFkps~MOJ=p~QkN(_ zxA47jz3VS+&BtY(`?>4d{8{?O>3lMekTz(H8|5|~@~`IrrZeBpTR%1s`3C>Q>(+lW zHXXMMdD`+tJQcgM2hIGuUCE>82!=Jy>2Hp?j7wz~`7)2r_dKuUMe7?|F}m@%aay_} zGr_%Jp)z#Hlxz-Gfu)u>-zU5*xqSQ zg4>11&>1WqcnsaGXRDj*+>f69`Rdx@Bfjeih3|x+lUkp`p3+UlaPLmb-URl1Ri76} z#W%559Cp66Y75)3+r0Z)x4nMuPGz2zc8g6z`Q2@_us!oU`^6&9=+nG+-tm?B zBVK&#F?f*q33a#r&5NANmzTp<(etjJ1NEM0ai#3u&^K_q*LE^LP;N+z_&?@u=2i8P zN6oVu8~t8jF+{&mjjd%or*I+F7gwn6Z{!EW6R>^Rea^Kx>Vv9kIv&)x7U!prs;gd z{Kl@v=dFHlP#lm3F_AQ}S@YhQ*gRbFufv*FzjfbC9t(bJCyu_1-|_W(exjegWg6;X zU9%Q0U3^O&e8wfcbixz&vY*DCB0Tdp(r0c6PmE`}Zy?%{>?vz>MFVbNDjw=ApEW~_}g znLCqa*%m#Hlr@c;${62QI(N|!TIAJm-Or?_$8*=uw(dF^ug9!)$=TDEZ=+nxZW>yq z_q*8KZi(B$Zqj=meKpQ~7RSK>?6_h<{*R=NjBfe?_m{lG-GJT|=YM_wi@W6B<{r6U zaCX`|;{F@|f7tK!YjEv7z8&X`k^k_ly>iNRu?*b|3}}5j{*38kT^mdlU)RN0@N=ne z_p^J&kAu~X+lfc~V7GhEz-VpbzKiL`U1RRCKJdKk=+Hqv&Jlv$JhyE=daHH;FD zUh9``t&UlCbKmoS@ct&ofx)Hwirr)W!(O%6#g(J*y>w;gE%Mub)2?_QoyxH?+PmAi z(pDZz+%|sZVgt8bC(PP8ePEf^{AL$CqTTHWTU_^>=7sfamwNyPe{#lAZtHu?3FX|Z zulXF_3|wn@F=UG4a_JghEu+W!$N4>$J8jEg-+K--=RsM^y2U0TA4i>AMno=9cZ3ub#8Nt^ry%#^tfkSdU3P; zBK6`sg*?pHZy%R`(-<5wf9lY9lXTXt>jbT_m5ULBmZbB$-*CZy^N>F2F+Jhxm?sE# zjl1_tbls9a-;L9*c@>N#e{E-;p$+Cc4(MC$>|ge)rrUgbO!;iM&gZ$l(v0gqsGm3^ zu9%%Y|06Hs&UsO{w86+T>G&R8Cw}T<{yayorp}oY;Wu4fw&SnHpmiu0d(^TKUu*tlPB7}!^|G8e`{5X;e#?A^JZrA4OmpsyoKxmz4qkJH$a=pKUbK{) z_dT**S!f#ZdCbR+S27aZ0YkE%eCTrOjh@AE?LAnj{Tp{&ADmhTr#=)*@sA_B#q8r? z`5JneXLj8OS9a&2KdEB|XIh^sKlTE!Iyg*zttKjll5ei|W4OFWA($-I(Qj-D6JN zf%)F+lDl2-6Q-VMorx=Mt9v_V2}TFU4VTZu@f=+{^CfW`%vDDkeaki$57XAR_i)<5 z%Zd4;AEYmgJPe!Ts_W~-wCWG~u_@BWf(xU+EitzD4mKX^r=8%PzPRpuChHFPwYRX& z&aZ11H*fITvp#j-!Ab@wW7FrC<)Vv6*HtH{PX|k(**scy==yb(d&x-8ubyP@PtLJ|$B}cEOFHqy^Uj;>586DXPh8@=mqOofr#HntF&mul4vtgu zgLa_&v^nKvJ<|GuTam@eaGrz3#FhT8LvTJc7N#{8iDy3hJv@iDw28j;!*%`5D|k#f zv5ks{=&w4lqixnRZjL;g2E!XWEn^NJ@w)u9J7tC6q_J)0vW+W0Pmxy~@!+9uu19FE zvZ9BNc|!Q&^T6=%1pdwCn76!uhwiniGuxb9qMUQIRn{oX8`^Bc%wLFaKk(UpXCKTx zK|F7U*5arA%|0;O0(j0iF`WFYd)gIx^lisD;`u$iB2M?)=2gPY3)f-RK|Xi7*b#U) zPS2~1+kM{Wr8_U2dh{GYx%H_A4@6T^j z@!DfNn5{hKn>bvUUh-Qx9qbmP!G+wDX&%h4ORkCIrT5hyr^1R^&jl|Fx7C};AKX!A z_Bnfq#qeNy*~r(F@nWKQh|~TV3<`a&eU|L+{DaS8G)`P?Jhn{j;)WaMTJ{F_uWIvN W(;hDtn=awt_^+5xfZgiY?fwr1@G(UI diff --git a/uisimulator/buttonmap/SOURCES b/uisimulator/buttonmap/SOURCES index fec71b5b09..b372407b4a 100644 --- a/uisimulator/buttonmap/SOURCES +++ b/uisimulator/buttonmap/SOURCES @@ -33,8 +33,6 @@ mrobe500.c mrobe100.c #elif CONFIG_KEYPAD == COWON_D2_PAD cowon-d2.c -#elif CONFIG_KEYPAD == IAUDIO67_PAD -iaudio-6_7.c #elif CONFIG_KEYPAD == CREATIVEZVM_PAD creative-zvm.c #elif CONFIG_KEYPAD == MEIZU_M6SL_PAD