From e34abce4e1959f63034dc50319def2b6d420014b Mon Sep 17 00:00:00 2001 From: "lishuang.xie" Date: Thu, 12 Oct 2023 10:28:46 +0800 Subject: [PATCH] update New Feature#1113 1. update component to week40 2. add new function smart_no_idle_sw_init 3. change name of smart_ddr_spinlock_init 4. change type of smart_task_del and smart_enable_q_nempty 5. if call smart_enable_q_nempty return faild, we'll call 8 times 6. if call smart_task_del return faild, we'll record 7. smart_reclaim_init_res() don't be called!!! 8. test: 8.1 SPU(case14)+ARM(case3) :PASS 8.2 SPU(case20)+ARM(case20):PASS 8.3 SPU(case21)+ARM(case21):PASS 8.4 SPU(case34)+ARM(case5) :PASS 8.5 SPU(case44)+ARM(case5) :PASS --- public/ape_spu/driver/src/ape_mtimer.s.c | 2 +- public/ape_spu/driver/src/ape_stc_timer.s.c | 2 +- public/ape_spu/osp/inc/err_num.h | 23 ++-- public/ape_spu/osp/src/osp_init.s.c | 8 +- public/ape_spu/osp/src/osp_msg.s.c | 32 +++-- public/ape_spu/osp/src/osp_sem.s.c | 12 +- public/ape_spu/osp/src/osp_task.s.c | 50 ++++++-- public/common/driver/src/ctc_intr.s.c | 2 +- public/common/platform/src/lib_debug_init.s.c | 2 +- public/common/platform/src/spu_hw_queue.s.c | 29 ++++- public/common/utility/inc/ucp_utility.h | 5 +- public/rtos/ape_spu/libsmartos.a | Bin 66746 -> 68628 bytes public/rtos/common/libhwque.a | Bin 8252 -> 10002 bytes public/rtos/common/libspinlock.a | Bin 4496 -> 4498 bytes public/rtos/inc/hwque.h | 7 +- public/rtos/inc/inter_vector.h | 114 +++++++++--------- public/rtos/inc/smartos.h | 41 +++++-- public/rtos/inc/spinlock.h | 77 +++++++++--- public/rtos/rfm_spu/libinterrupt.a | Bin 10398 -> 10418 bytes 19 files changed, 281 insertions(+), 125 deletions(-) diff --git a/public/ape_spu/driver/src/ape_mtimer.s.c b/public/ape_spu/driver/src/ape_mtimer.s.c index 15cf056..b613c71 100644 --- a/public/ape_spu/driver/src/ape_mtimer.s.c +++ b/public/ape_spu/driver/src/ape_mtimer.s.c @@ -79,7 +79,7 @@ void ape_mtimer_sync(int32_t nScsId) } gSpinLockBuildCell.lock_addr = 0xB7FD1440; gSpinLockBuildCell.flag_addr = 0xB7FD1444; - smart_ddr_spin_lock_init(&gSpinLockBuildCell); + smart_ddr_spinlock_init(&gSpinLockBuildCell); smart_ddr_spinlock(&gSpinLockBuildCell); ape_mtimer_int_init(nTimerId); // mtimer int attach diff --git a/public/ape_spu/driver/src/ape_stc_timer.s.c b/public/ape_spu/driver/src/ape_stc_timer.s.c index b8bc1ad..a07119a 100644 --- a/public/ape_spu/driver/src/ape_stc_timer.s.c +++ b/public/ape_spu/driver/src/ape_stc_timer.s.c @@ -137,7 +137,7 @@ void stc_timer_ctwint_init() //gSpinLockCtwInit.lock_loop_addr = 0xB7FD1410; //gSpinLockCtwInit.unlock_loop_addr = 0xB7FD1410; //gSpinLockCtwInit.unlock_addr = 0xB7FD1418; - smart_ddr_spin_lock_init(&gSpinLockCtwInit); + smart_ddr_spinlock_init(&gSpinLockCtwInit); uint32_t intNum = APC_STC_INTR0 + apeId; // attach interrupt func diff --git a/public/ape_spu/osp/inc/err_num.h b/public/ape_spu/osp/inc/err_num.h index a366a4a..c771719 100644 --- a/public/ape_spu/osp/inc/err_num.h +++ b/public/ape_spu/osp/inc/err_num.h @@ -1,17 +1,18 @@ #ifndef __ERR_NUM_H__ #define __ERR_NUM_H__ -#define OSP_OK (0) /* 正常返回 */ -#define OSP_PAR_ILL (1) /* 入参错误 */ -#define OSP_PAR_REP (2) /* 入参重复 */ -#define OSP_QUE_FULL (3) /* 软队列满 */ -#define OSP_QUE_EMPT (4) /* 软队列空 */ -#define OSP_MEM_FULL (5) /* 内存申请失败 */ -#define OSP_NO_FILE (6) /* 无对应配置文件 */ -#define OSP_ERROR (7) /* 失败返回 */ -#define OSP_HW_BAND (8) /* 硬件队列绑定失败 */ -#define OSP_HW_VECT (9) /* 硬件队列获取中断号失败 */ -#define OSP_HW_IRQ (10) /* 硬件队列注册中断服务失败 */ +#define OSP_OK (0) /* 正常返回 */ +#define OSP_PAR_ILL (1) /* 入参错误 */ +#define OSP_PAR_REP (2) /* 入参重复 */ +#define OSP_QUE_FULL (3) /* 软队列满 */ +#define OSP_QUE_EMPT (4) /* 软队列空 */ +#define OSP_MEM_FULL (5) /* 内存申请失败 */ +#define OSP_NO_FILE (6) /* 无对应配置文件 */ +#define OSP_ERROR (7) /* 失败返回 */ +#define OSP_HW_BAND (8) /* 硬件队列绑定失败 */ +#define OSP_HW_VECT (9) /* 硬件队列获取中断号失败 */ +#define OSP_HW_IRQ (10) /* 硬件队列注册中断服务失败 */ +#define OSP_HW_EMPTY_ERR (11) /* 硬件队列非空中断使能失败 */ #endif diff --git a/public/ape_spu/osp/src/osp_init.s.c b/public/ape_spu/osp/src/osp_init.s.c index f398d9e..16ca957 100644 --- a/public/ape_spu/osp/src/osp_init.s.c +++ b/public/ape_spu/osp/src/osp_init.s.c @@ -269,12 +269,18 @@ void osp_start() g_ape_id = get_core_id(); g_que_id = g_ape_id; - ret = smart_os_debug_init((DBG_DDR_OS_ADDR_BASE + core_id*DBG_DDR_OS_LEN), DBG_DDR_OS_LEN); // 推荐768, 实际1024 + ret = smart_os_debug_init((DBG_DDR_OS_ADDR_BASE + core_id*DBG_DDR_OS_LEN), DBG_DDR_OS_LEN); // 推荐0x40, 实际0x100 if (0 != ret) { debug_write(DBG_DDR_ERR_IDX(core_id, 31), ret); // ape0: 0xb7e2407c } + ret = smart_no_idle_sw_init((DBG_DDR_OS_NO_IDLE_BASE + core_id*DBG_DDR_OS_NO_IDLE_LEN), DBG_DDR_OS_NO_IDLE_LEN); // 推荐0x40, 实际0x100 + if (0 != ret) + { + debug_write(DBG_DDR_ERR_IDX(core_id, 47), ret); + } + smart_kernel_init(osp_init_start_hook, g_ape_id); } diff --git a/public/ape_spu/osp/src/osp_msg.s.c b/public/ape_spu/osp/src/osp_msg.s.c index 83c0ad9..624ee14 100644 --- a/public/ape_spu/osp/src/osp_msg.s.c +++ b/public/ape_spu/osp/src/osp_msg.s.c @@ -636,6 +636,7 @@ int osp_hw_que_init(uint8_t ape_id, uint8_t que_id) int que_used = -1; int que_cpuid = -1; int apeId = get_core_id(); + uint8_t u8_loop = 0; /* communication init */ do @@ -652,7 +653,7 @@ int osp_hw_que_init(uint8_t ape_id, uint8_t que_id) if (0 != ret) { UCP_PRINT_ERROR("[osp_hw_que_init]: smart_que_bind(ape_id = %x, que_id = %x) retunr error\r\n", ape_id, que_id); - //debug_write(OSP_DEBUG_POT(g_ape_id, 52), 0xffff); + //debug_write(OSP_DEBUG_POT(g_ape_id, 52), 0xff01); debug_write(DBG_DDR_ERR_IDX(apeId, 22), ret); return -OSP_HW_BAND; } @@ -661,6 +662,7 @@ int osp_hw_que_init(uint8_t ape_id, uint8_t que_id) ret = smart_get_que_info(g_que_id, &que_dep, &que_width, &que_used, &que_cpuid); if (0 != ret) { + //debug_write(OSP_DEBUG_POT(g_ape_id, 52), 0xff02); debug_write(DBG_DDR_ERR_IDX(apeId, 20), ret); } UCP_PRINT_LOG("[osp_hw_que_init]: que_id(0x%08x),dep(0x%08x),width(0x%08x),used(0x%08x),cpuid(0x%08x) \r\n", g_que_id, que_dep,que_width,que_used,que_cpuid); @@ -670,32 +672,48 @@ int osp_hw_que_init(uint8_t ape_id, uint8_t que_id) if (0 >= g_hq_vector) { UCP_PRINT_ERROR("[osp_hw_que_init]: smart_get_hq_vector error!!!!!(ape_id = 0x%08x)....\r\n", ape_id); - //debug_write(OSP_DEBUG_POT(g_ape_id, 53), 0xffff); + //debug_write(OSP_DEBUG_POT(g_ape_id, 52), 0xff03); debug_write(DBG_DDR_ERR_IDX(apeId, 16), g_hq_vector); return -OSP_HW_VECT; } UCP_PRINT_LOG("[osp_hw_que_init]: hq_vector = 0x%x (apeid = 0x%x, queid = 0x%x)\r\n", g_hq_vector, ape_id, que_id); - debug_write(OSP_DEBUG_POT(g_ape_id, 54), g_hq_vector); + debug_write(OSP_DEBUG_POT(g_ape_id, 55), g_hq_vector); /* Set req */ ret = smart_irq_request(g_hq_vector, osp_hw_que_irq); if (0 != ret) { UCP_PRINT_ERROR("[osp_hw_que_init]: smart_irq_request error!!!!!(ape_id = 0x%08x)....\r\n", ape_id); - //debug_write(OSP_DEBUG_POT(g_ape_id, 55), 0xffff); + //debug_write(OSP_DEBUG_POT(g_ape_id, 52), 0xff04); debug_write(DBG_DDR_ERR_IDX(apeId, 5), ret); return -OSP_HW_IRQ; } - smart_enable_q_nempty(que_id); + + /* enable no-empty irq */ + for (u8_loop = 0; u8_loop < 8; u8_loop++) + { + ret = smart_enable_q_nempty(que_id); + if (OSP_OK == ret) + { + break; + } + } + debug_write(OSP_DEBUG_POT(g_ape_id, 53), u8_loop); + if (OSP_OK != ret) + { + debug_write(OSP_DEBUG_POT(g_ape_id, 52), 0xff05); + debug_write(OSP_DEBUG_POT(g_ape_id, 54), ret); + return -OSP_HW_EMPTY_ERR; + } ret = osp_msg_que_init(que_id); if (OSP_OK != ret) { UCP_PRINT_ERROR("[osp_hw_que_init]: osp_msg_que_init error!!!!!(ape_id = 0x%08x)....\r\n", ape_id); - debug_write(OSP_DEBUG_POT(g_ape_id, 56), 0xffff); + debug_write(OSP_DEBUG_POT(g_ape_id, 52), 0xff06); return -OSP_PAR_ILL; } - debug_write(OSP_DEBUG_POT(g_ape_id, 57), 0x0101); + debug_write(OSP_DEBUG_POT(g_ape_id, 56), 0x0101); UCP_PRINT_LOG("[osp_hw_que_init]: OK \r\n"); diff --git a/public/ape_spu/osp/src/osp_sem.s.c b/public/ape_spu/osp/src/osp_sem.s.c index 7a21b82..d97da37 100644 --- a/public/ape_spu/osp/src/osp_sem.s.c +++ b/public/ape_spu/osp/src/osp_sem.s.c @@ -59,15 +59,15 @@ void osp_post_sem(sem_t *sem) void osp_delete_sem(sem_t *sem) { - int ret = 0; - int apeId = get_core_id(); + int ret = 0; + int apeId = get_core_id(); if (NULL != sem) { ret = smart_sem_del(sem); - if (0 != ret) - { - debug_write(DBG_DDR_ERR_IDX(apeId, 30), ret); - } + if (0 != ret) + { + debug_write(DBG_DDR_ERR_IDX(apeId, 30), ret); + } } else { diff --git a/public/ape_spu/osp/src/osp_task.s.c b/public/ape_spu/osp/src/osp_task.s.c index 18ccf42..584e2f2 100644 --- a/public/ape_spu/osp/src/osp_task.s.c +++ b/public/ape_spu/osp/src/osp_task.s.c @@ -25,6 +25,8 @@ int g_prio_array[TASK_MAX] = {0}; int g_task_id_array[TASK_MAX] = {0}; int *g_tcb_handler_tbl[TASK_MAX] = {NULL}; +static uint8_t su8_del_task_err_idx = 0; + #ifdef UCP_TICK_ENABLE extern osp_msg_tick_info st_tick_info; #endif @@ -726,8 +728,9 @@ alloc_stack_failed: void osp_del_timer_task(int task_id) { - uint8_t u8_loop = 0; - int task_prio = 0; + uint8_t u8_loop = 0; + int task_prio = 0; + int ret = 0; osp_tcb *tcb_handle = NULL; /* 通过任务ID找到任务控制块信息 */ @@ -747,7 +750,14 @@ void osp_del_timer_task(int task_id) return ; } - smart_task_del(task_prio); /* 删除任务 */ + ret = smart_task_del(task_prio); /* 删除任务 */ + if (OSP_OK != ret) + { + debug_write(DBG_DDR_ERR_IDX(g_ape_id, 47), ret); + debug_write(DBG_DDR_ERR_IDX(g_ape_id, 112+su8_del_task_err_idx), task_prio); + su8_del_task_err_idx = (su8_del_task_err_idx+1)&0xF; + } + g_task_id_array[task_prio] = 0; /* 通过优先级清任务列表 */ g_prio_array[task_id] = 0; /* 通过任务ID清优先级列表 */ FREE((char*)((tcb_handle->stack_down)-4)); /* 释放栈空间 */ @@ -788,6 +798,7 @@ void osp_del_task(int prio, int scsId) uint8_t u8_loop = 0; int task_id = 0; + int ret = 0; osp_tcb *tcb_handle = NULL; task_id = g_task_id_array[prio]; @@ -816,7 +827,13 @@ void osp_del_task(int prio, int scsId) if (OSP_EVENT_TYPE == tcb_handle->task_type) { /* 删除任务 */ - smart_task_del(prio); + ret = smart_task_del(prio); + if (OSP_OK != ret) + { + debug_write(DBG_DDR_ERR_IDX(g_ape_id, 47), ret); + debug_write(DBG_DDR_ERR_IDX(g_ape_id, 112+su8_del_task_err_idx), prio); + su8_del_task_err_idx = (su8_del_task_err_idx+1)&0xF; + } /* 事件任务,删除事件信号量和软件队列 */ osp_delete_sem(tcb_handle->event_sem); @@ -825,12 +842,24 @@ void osp_del_task(int prio, int scsId) else if (OSP_NORMAL_TYPE == tcb_handle->task_type) { /* 删除任务 */ - smart_task_del(prio); + ret = smart_task_del(prio); + if (OSP_OK != ret) + { + debug_write(DBG_DDR_ERR_IDX(g_ape_id, 47), ret); + debug_write(DBG_DDR_ERR_IDX(g_ape_id, 112+su8_del_task_err_idx), prio); + su8_del_task_err_idx = (su8_del_task_err_idx+1)&0xF; + } } else { /* 删除任务 */ - smart_task_del(prio); + ret = smart_task_del(prio); + if (OSP_OK != ret) + { + debug_write(DBG_DDR_ERR_IDX(g_ape_id, 47), ret); + debug_write(DBG_DDR_ERR_IDX(g_ape_id, 112+su8_del_task_err_idx), prio); + su8_del_task_err_idx = (su8_del_task_err_idx+1)&0xF; + } /* 其他任务,删除信号量 */ osp_delete_sem(tcb_handle->sem); @@ -873,6 +902,7 @@ void osp_del_task_all(int scs_id) uint8_t u8_task_id = 0; uint8_t u8_timer_falg = 0; /*0: no timer task; 1: timer task*/ osp_tcb *tcb_handle = NULL; + int ret = 0; for (u8_task_loop = 0; u8_task_loop < TASK_MAX; u8_task_loop++) { @@ -926,7 +956,13 @@ void osp_del_task_all(int scs_id) g_tcb_handler_tbl[u8_task_id] = NULL; - smart_task_del(u8_task_loop); /* 删除任务 */ + ret = smart_task_del(u8_task_loop); /* 删除任务 */ + if (OSP_OK != ret) + { + debug_write(DBG_DDR_ERR_IDX(g_ape_id, 47), ret); + debug_write(DBG_DDR_ERR_IDX(g_ape_id, 112+su8_del_task_err_idx), u8_task_loop); + su8_del_task_err_idx = (su8_del_task_err_idx+1)&0xF; + } debug_write(OSP_DEBUG_POT(g_ape_id, 33), u8_task_id); } diff --git a/public/common/driver/src/ctc_intr.s.c b/public/common/driver/src/ctc_intr.s.c index 67d19ac..f8f3663 100644 --- a/public/common/driver/src/ctc_intr.s.c +++ b/public/common/driver/src/ctc_intr.s.c @@ -37,7 +37,7 @@ int32_t ctc_cal_intr_init(void) //gSpinLockCtcInit.lock_loop_addr = 0xB7FD1430; //gSpinLockCtcInit.unlock_loop_addr = 0xB7FD1434; //gSpinLockCtcInit.unlock_addr = 0xB7FD1438; - smart_ddr_spin_lock_init(&gSpinLockCtcInit); + smart_ddr_spinlock_init(&gSpinLockCtcInit); int32_t ctcIntNum = CTC_CAL_INT_APE0 + apeId; smart_ddr_spinlock(&gSpinLockCtcInit); diff --git a/public/common/platform/src/lib_debug_init.s.c b/public/common/platform/src/lib_debug_init.s.c index 27d5c3e..6736e89 100644 --- a/public/common/platform/src/lib_debug_init.s.c +++ b/public/common/platform/src/lib_debug_init.s.c @@ -42,7 +42,7 @@ int32_t spu_lib_debug_init(uint8_t core_id) ret = smart_hq_debug_init((DBG_DDR_HW_ADDR_BASE + core_id*DBG_DDR_HW_LEN), DBG_DDR_HW_LEN); // 推荐384,实际512 if (0 != ret) { - debug_write(DBG_DDR_ERR_IDX(core_id, 32), ret); // ape0: 0xb7e24080 + debug_write(DBG_DDR_ERR_IDX(core_id, 46), ret); // ape0: 0xb7e24080 ret_val += 1 << 1; } diff --git a/public/common/platform/src/spu_hw_queue.s.c b/public/common/platform/src/spu_hw_queue.s.c index 49d0b45..a59d15c 100644 --- a/public/common/platform/src/spu_hw_queue.s.c +++ b/public/common/platform/src/spu_hw_queue.s.c @@ -28,7 +28,7 @@ typedef struct ECS_DEBUG_INFO_STRUCT uint32_t ecs_msg_QutQue_ok; uint32_t ecs_msg_QueIsEmpty_num; }ecs_debug_info; -ecs_debug_info g_ecs_debug_info; /* ECS */ +ecs_debug_info g_ecs_debug_info; /* ecs/pet rfm debug info */ #endif #ifdef UCP_OSP_DBG_HW_CNT_ENABLE @@ -46,15 +46,16 @@ static uint32_t gu32_app_recv_que10 = 0; static uint32_t gu32_app_recv_que11 = 0; #endif -ecs_hw_que_info_withirq_t g_ecs_hw_que_info; /* ECS */ -ecs_hw_que_info_noirq_t gst_ecs_hw_que_info_noirq; /* ECS */ +ecs_hw_que_info_withirq_t g_ecs_hw_que_info; /* ecs/pet rfm hw_que info with irq */ +ecs_hw_que_info_noirq_t gst_ecs_hw_que_info_noirq; /* ecs/pet rfm hw_que info without irq*/ extern void ecs_hw_que_irq(void); void ecs_hw_que_init(uint8_t core_id) { int32_t i32ret = 0; - /* communication init */ + + /* communication init */ do { i32ret = smart_hq_init(core_id); @@ -71,7 +72,8 @@ void ecs_hw_que_init_withirq(uint8_t core_id, uint8_t que_id) int32_t que_width = -1; int32_t que_used = -1; int32_t que_cpuid = -1; - int32_t apeId = (int32_t)core_id; + int32_t apeId = (int32_t)core_id; + uint8_t u8_loop = 0; memset(&g_ecs_hw_que_info, 0, sizeof(g_ecs_hw_que_info)); g_ecs_hw_que_info.ecs_hq_id = que_id; @@ -126,7 +128,22 @@ void ecs_hw_que_init_withirq(uint8_t core_id, uint8_t que_id) return ; } debug_write(DBG_DDR_COMMON_IDX(core_id, 30), 0x2); - smart_enable_q_nempty(que_id); + + /* enable no-empty irq */ + for (u8_loop = 0; u8_loop < 8; u8_loop++) + { + ret = smart_enable_q_nempty(que_id); + if (0 == ret) + { + break; + } + } + debug_write(DBG_DDR_ERR_IDX(core_id, 48), u8_loop); + if (0 != ret) + { + debug_write(DBG_DDR_ERR_IDX(core_id, 49), ret); + return ; + } debug_write(DBG_DDR_COMMON_IDX(core_id, 30), 0x3); //ecs_msg_que_init(que_id); //debug_write(DBG_DDR_COMMON_IDX(core_id, 10), 0x4); diff --git a/public/common/utility/inc/ucp_utility.h b/public/common/utility/inc/ucp_utility.h index b7633a7..4ba845a 100644 --- a/public/common/utility/inc/ucp_utility.h +++ b/public/common/utility/inc/ucp_utility.h @@ -74,7 +74,10 @@ void ucp_nop(uint32_t cycleCnt); #define DBG_DDR_IRQ_ADDR_BASE (0xB7FC0000) #define DBG_DDR_IRQ_LEN (0x1000) #define DBG_DDR_OS_ADDR_BASE (0xB7FCD000) -#define DBG_DDR_OS_LEN (0x400) +#define DBG_DDR_OS_LEN (0x100) //(0x400) +#define DBG_DDR_OS_NO_IDLE_BASE (0xB7FCD800) +#define DBG_DDR_OS_NO_IDLE_LEN (0x100) + #define DBG_DDR_HW_ADDR_BASE (0xB7FD0400) #define DBG_DDR_HW_LEN (0x200) #define DBG_DDR_SPIN_ADDR_BASE (0xB7FD1400) diff --git a/public/rtos/ape_spu/libsmartos.a b/public/rtos/ape_spu/libsmartos.a index d2a500daa44ab0b76f01e61490cbee7ccf59b275..25e7609407d80d3bc9cb1a719901c478f592f77a 100644 GIT binary patch delta 13139 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 ypM)&+kic6U`Vvzb3If@WS0>7))*kGG> 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 diff --git a/public/rtos/common/libhwque.a b/public/rtos/common/libhwque.a index 243408a98912f445a9c5e0573a3df34f2def7a82..8752bd57760e713f701a8d95f7287c6bac814965 100644 GIT binary patch literal 10002 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 literal 8252 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 delta 3052 zcma)8UuaWT7(e&sk2il>uT84AHi@n6$n_6W;;fnY&_;&^^Po;4xc<{vxiVpqZctbu zt;Roy8+WF-taPIfg;h3LS!Hz4hq}(T4;d8ZgAc;e*1&}cOP#QcWw76uoGX3U!w!6W zzweyi`M&Rb=esBQ?&Oyzr+#p#p||3FEv=!}{Rj5%Z#@_ew;sIM+7ge4&c7MI7`g~> zuDj8LWQ(SYhcvx5r0I-V$Hf6nkA!0jB4atm*ow#oq5{|!d$A-UibYaNR$0@9 zCT&C*&}30k@)kwY8^f_hp=mwaZq?^4PF1G8g1wj(Bn1LK$B3+3!kT{W*68D%r(+9A z3M3*ei?=vhI2P!~6>i#nY1h+lB7@JtW`-;RXoemG1l{ z*e=-8n&!7*Lk%`m!O^D;#VDQZ(f!UjF*SN@ctsm)tej-=b;VXR-!Oc%v4%BK*JP(v z`LTT_wjki3?}(Xxc`_kCz2DhJeugtiluqiJ+d0#VvS;RZ&YaU5M|<@KY^LiN&Y;Bo zfqdiC=wqR#az#}3Ycv;*9TQP{fhDp6le4s6kW^jVjw^LejtB@YAIco*Kb!eOxKT-< zd@bXed^M`%DQ;6z>y_K5M&FKj|0y(o{B*&JEK@nnACbD+;!;;3($Fhg*8}-@0}^y+ zj$B*O{N%)%)4sSM$IAS8EVgJ36`~R8OktvFOEx0w^P;Tkk<)`6#I@uMANKjv}& z=&?BZC6!U-q=hA-w)*vw1t+j5s-E(GIG2*n%*Ej(?uDc6s@!fvb0M+z-00&*G!0>@ zl8J>Fs&p793TOJMd4;pE!J*(+bH*429rkD=R80%<=y2iKpQw7=EW2#MhHD^GH=na2 zQNkc{QV=)H1qR)vr1yz2tm&#i+L@0{QDXZOlTQ9iqU+EL~k)&hR^4?#PR~ zr#rXowhDXFH*0s;jz1Xv$(8=Pwm#`Tp~+RvO8$;N)BnI9TXdg-jU3!)Xvxu4sPg=k zbu%Sf-K*(KjhT7rKxW<*(R8T;0=@*U1Rt&zB@h0b2F~z*tUGD_)W&^@ti)tTR%%oA z>k)Ni`s~)vZ2$YAO0PI-r}y~=1fetim48oCw=;GJwWwhtdj>7J85`&JC0x`qCu4h| zY5gPUSqEbc+)jWO#+fg0{`b(6*pHW}%>NlWgN`h6ehX~hCiutYlD`{_rB4PvPaeiP zgLn{&h8x(+aTwSQeg||f#09Lv=LKMotHK{5%=sz8b(Q&Bgu$h8hj2{=qYs#;x`Iap zmSi3zO(R1KTPk>rFb+p!oUpBeCxN}3KSh`annj_2;S|ZGoctV)_Hwc%LNLDK3 z<-x2tp_gYW5$1vElb}kpKvW1-g799B6$I(v*b5zlR6~{_RB^LH6Tq*N19s6HPNXau z5Ze60#Q3b})2f2q0quhjrw#frgc3Rd-3c)RTmUu$q=1P(1JO6&u?;x+5C%D#g`VLH zov@$t`2;Y->C6BUuo-|#OMA;4REmO0&{mFRXg3Mw!{~Lg%|1|pQEAj4qlFfDQw$JB za2f?7@p%~zynOx}U=Ny^#thAKyaY^16rh)h!}mTT4#%%H%opv5Z!U!4#N5ycY|bZu z$>|WjzQGN6i1^zoNu-F+@yG^FhB&;RCWyoF6z3R8fMsq_fSkDi{hZ?^Xaiz?1+Re3 z#&qK;qvR6Mmm$L)2>l9D?l~v!pC-(*mk8s|X-G)GyaG32KED^30^fnY z1tCXM&=S6XnwO#794pZDE)d6nCfkhVBW$bmA5&qN!S)j7!SGL}?DQe@6oec-gAU^n zqF`;%hdJ(mJ_;dD3i>p}EPISFlBCf|7?q@yYXvr6PYIYfyXfU3XXbNDzoX`BsL?!sG85CkH@_ze zf%Ln