From 5c3a96977553c0d1d6e3d9b0873a16149f4b822b Mon Sep 17 00:00:00 2001 From: Brian Whitman Date: Sat, 20 Jan 2024 12:59:00 -0800 Subject: [PATCH] fixes for #166 --- .../esp32s3/components/esp_lcd/CMakeLists.txt | 31 + tulip/esp32s3/components/esp_lcd/Kconfig | 39 + tulip/esp32s3/components/esp_lcd/README.md | 83 ++ .../esp_lcd/include/esp_lcd_panel_commands.h | 54 + .../esp_lcd/include/esp_lcd_panel_io.h | 309 +++++ .../esp_lcd/include/esp_lcd_panel_ops.h | 149 +++ .../esp_lcd/include/esp_lcd_panel_rgb.h | 280 ++++ .../esp_lcd/include/esp_lcd_panel_vendor.h | 75 ++ .../esp_lcd/include/esp_lcd_types.h | 37 + .../interface/esp_lcd_panel_interface.h | 139 ++ .../interface/esp_lcd_panel_io_interface.h | 93 ++ tulip/esp32s3/components/esp_lcd/linker.lf | 12 + .../components/esp_lcd/src/esp_lcd_common.c | 106 ++ .../components/esp_lcd/src/esp_lcd_common.h | 86 ++ .../components/esp_lcd/src/esp_lcd_panel_io.c | 43 + .../esp_lcd/src/esp_lcd_panel_io_i2c_v1.c | 208 +++ .../esp_lcd/src/esp_lcd_panel_io_i2c_v2.c | 206 +++ .../esp_lcd/src/esp_lcd_panel_io_i2s.c | 787 ++++++++++++ .../esp_lcd/src/esp_lcd_panel_io_i80.c | 724 +++++++++++ .../esp_lcd/src/esp_lcd_panel_io_spi.c | 417 ++++++ .../esp_lcd/src/esp_lcd_panel_nt35510.c | 319 +++++ .../esp_lcd/src/esp_lcd_panel_ops.c | 77 ++ .../esp_lcd/src/esp_lcd_panel_rgb.c | 1141 +++++++++++++++++ .../esp_lcd/src/esp_lcd_panel_ssd1306.c | 265 ++++ .../esp_lcd/src/esp_lcd_panel_st7789.c | 317 +++++ .../esp_lcd/test_apps/.build-test-rules.yml | 47 + .../esp_lcd/test_apps/i2c_lcd/CMakeLists.txt | 8 + .../esp_lcd/test_apps/i2c_lcd/README.md | 4 + .../test_apps/i2c_lcd/main/CMakeLists.txt | 8 + .../test_apps/i2c_lcd/main/test_app_main.c | 51 + .../test_apps/i2c_lcd/main/test_i2c_board.h | 26 + .../i2c_lcd/main/test_i2c_lcd_panel.c | 71 + .../test_apps/i2c_lcd/pytest_i2c_lcd.py | 18 + .../test_apps/i2c_lcd/sdkconfig.ci.release | 3 + .../test_apps/i2c_lcd/sdkconfig.defaults | 5 + .../test_apps/i2c_lcd_legacy/CMakeLists.txt | 9 + .../test_apps/i2c_lcd_legacy/README.md | 4 + .../i2c_lcd_legacy/main/CMakeLists.txt | 8 + .../i2c_lcd_legacy/main/test_app_main.c | 51 + .../i2c_lcd_legacy/main/test_i2c_board.h | 26 + .../main/test_i2c_lcd_legacy_panel.c | 70 + .../i2c_lcd_legacy/pytest_i2c_lcd_legacy.py | 18 + .../i2c_lcd_legacy/sdkconfig.ci.release | 3 + .../i2c_lcd_legacy/sdkconfig.defaults | 5 + .../esp_lcd/test_apps/i80_lcd/CMakeLists.txt | 8 + .../esp_lcd/test_apps/i80_lcd/README.md | 4 + .../test_apps/i80_lcd/main/CMakeLists.txt | 8 + .../test_apps/i80_lcd/main/test_app_main.c | 51 + .../test_apps/i80_lcd/main/test_i80_board.h | 85 ++ .../i80_lcd/main/test_i80_lcd_panel.c | 564 ++++++++ .../test_apps/i80_lcd/pytest_i80_lcd.py | 20 + .../test_apps/i80_lcd/sdkconfig.ci.release | 5 + .../test_apps/i80_lcd/sdkconfig.defaults | 5 + .../esp_lcd/test_apps/rgb_lcd/CMakeLists.txt | 24 + .../esp_lcd/test_apps/rgb_lcd/README.md | 4 + .../test_apps/rgb_lcd/main/CMakeLists.txt | 12 + .../test_apps/rgb_lcd/main/test_app_main.c | 51 + .../test_apps/rgb_lcd/main/test_rgb_board.h | 41 + .../test_apps/rgb_lcd/main/test_rgb_panel.c | 313 +++++ .../rgb_lcd/main/test_yuv_rgb_conv.c | 103 ++ .../test_apps/rgb_lcd/pytest_rgb_lcd.py | 19 + .../test_apps/rgb_lcd/resources/README.md | 5 + .../rgb_lcd/resources/pictures/hello.png | Bin 0 -> 5356 bytes .../rgb_lcd/resources/pictures/hello.yuv | 1 + .../rgb_lcd/resources/pictures/world.png | Bin 0 -> 5984 bytes .../rgb_lcd/resources/pictures/world.yuv | 1 + .../test_apps/rgb_lcd/sdkconfig.ci.iram_safe | 10 + .../test_apps/rgb_lcd/sdkconfig.ci.release | 5 + .../test_apps/rgb_lcd/sdkconfig.defaults | 5 + .../rgb_lcd/sdkconfig.defaults.esp32s3 | 7 + .../esp_lcd/test_apps/spi_lcd/CMakeLists.txt | 8 + .../esp_lcd/test_apps/spi_lcd/README.md | 4 + .../test_apps/spi_lcd/main/CMakeLists.txt | 8 + .../test_apps/spi_lcd/main/test_app_main.c | 51 + .../test_apps/spi_lcd/main/test_spi_board.h | 51 + .../spi_lcd/main/test_spi_lcd_panel.c | 278 ++++ .../test_apps/spi_lcd/pytest_spi_lcd.py | 18 + .../test_apps/spi_lcd/sdkconfig.ci.release | 3 + .../test_apps/spi_lcd/sdkconfig.defaults | 5 + tulip/shared/editor.c | 4 +- tulip/tulipcc_r10/CMakeLists.txt | 2 +- .../boards/TULIP4_N16R8/sdkconfig.board | 9 + tulip/tulipcc_r10/main.c | 2 +- tulip/tulipcc_r10/tulipcc_r10_display.c | 44 +- 84 files changed, 8235 insertions(+), 35 deletions(-) create mode 100644 tulip/esp32s3/components/esp_lcd/CMakeLists.txt create mode 100644 tulip/esp32s3/components/esp_lcd/Kconfig create mode 100644 tulip/esp32s3/components/esp_lcd/README.md create mode 100644 tulip/esp32s3/components/esp_lcd/include/esp_lcd_panel_commands.h create mode 100644 tulip/esp32s3/components/esp_lcd/include/esp_lcd_panel_io.h create mode 100644 tulip/esp32s3/components/esp_lcd/include/esp_lcd_panel_ops.h create mode 100644 tulip/esp32s3/components/esp_lcd/include/esp_lcd_panel_rgb.h create mode 100644 tulip/esp32s3/components/esp_lcd/include/esp_lcd_panel_vendor.h create mode 100644 tulip/esp32s3/components/esp_lcd/include/esp_lcd_types.h create mode 100644 tulip/esp32s3/components/esp_lcd/interface/esp_lcd_panel_interface.h create mode 100644 tulip/esp32s3/components/esp_lcd/interface/esp_lcd_panel_io_interface.h create mode 100644 tulip/esp32s3/components/esp_lcd/linker.lf create mode 100644 tulip/esp32s3/components/esp_lcd/src/esp_lcd_common.c create mode 100644 tulip/esp32s3/components/esp_lcd/src/esp_lcd_common.h create mode 100644 tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io.c create mode 100644 tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io_i2c_v1.c create mode 100644 tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io_i2c_v2.c create mode 100644 tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io_i2s.c create mode 100644 tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io_i80.c create mode 100644 tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io_spi.c create mode 100644 tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_nt35510.c create mode 100644 tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_ops.c create mode 100644 tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_rgb.c create mode 100644 tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_ssd1306.c create mode 100644 tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_st7789.c create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/.build-test-rules.yml create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/CMakeLists.txt create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/README.md create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/main/CMakeLists.txt create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/main/test_app_main.c create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/main/test_i2c_board.h create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/main/test_i2c_lcd_panel.c create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/pytest_i2c_lcd.py create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/sdkconfig.ci.release create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/sdkconfig.defaults create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/CMakeLists.txt create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/README.md create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/main/CMakeLists.txt create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/main/test_app_main.c create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/main/test_i2c_board.h create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/main/test_i2c_lcd_legacy_panel.c create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/pytest_i2c_lcd_legacy.py create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/sdkconfig.ci.release create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/sdkconfig.defaults create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/CMakeLists.txt create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/README.md create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/main/CMakeLists.txt create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/main/test_app_main.c create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/main/test_i80_board.h create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/main/test_i80_lcd_panel.c create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/pytest_i80_lcd.py create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/sdkconfig.ci.release create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/sdkconfig.defaults create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/CMakeLists.txt create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/README.md create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/main/CMakeLists.txt create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/main/test_app_main.c create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/main/test_rgb_board.h create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/main/test_rgb_panel.c create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/main/test_yuv_rgb_conv.c create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/pytest_rgb_lcd.py create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/resources/README.md create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/resources/pictures/hello.png create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/resources/pictures/hello.yuv create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/resources/pictures/world.png create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/resources/pictures/world.yuv create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/sdkconfig.ci.iram_safe create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/sdkconfig.ci.release create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/sdkconfig.defaults create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/sdkconfig.defaults.esp32s3 create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/CMakeLists.txt create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/README.md create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/main/CMakeLists.txt create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/main/test_app_main.c create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/main/test_spi_board.h create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/main/test_spi_lcd_panel.c create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/pytest_spi_lcd.py create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/sdkconfig.ci.release create mode 100644 tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/sdkconfig.defaults diff --git a/tulip/esp32s3/components/esp_lcd/CMakeLists.txt b/tulip/esp32s3/components/esp_lcd/CMakeLists.txt new file mode 100644 index 000000000..9e1c10b13 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/CMakeLists.txt @@ -0,0 +1,31 @@ +idf_build_get_property(target IDF_TARGET) + +if(${target} STREQUAL "linux") + return() # This component is not supported by the POSIX/Linux simulator +endif() + +set(srcs "src/esp_lcd_common.c" + "src/esp_lcd_panel_io.c" + "src/esp_lcd_panel_io_i2c_v1.c" + "src/esp_lcd_panel_io_i2c_v2.c" + "src/esp_lcd_panel_io_spi.c" + "src/esp_lcd_panel_nt35510.c" + "src/esp_lcd_panel_ssd1306.c" + "src/esp_lcd_panel_st7789.c" + "src/esp_lcd_panel_ops.c") +set(includes "include" "interface") +set(priv_requires "esp_mm" "esp_psram") + +if(CONFIG_SOC_I2S_LCD_I80_VARIANT) + list(APPEND srcs "src/esp_lcd_panel_io_i2s.c") +endif() + +if(CONFIG_SOC_LCDCAM_SUPPORTED) + list(APPEND srcs "src/esp_lcd_panel_io_i80.c" "src/esp_lcd_panel_rgb.c") +endif() + +idf_component_register(SRCS ${srcs} + INCLUDE_DIRS ${includes} + PRIV_REQUIRES ${priv_requires} + REQUIRES driver + LDFRAGMENTS linker.lf) diff --git a/tulip/esp32s3/components/esp_lcd/Kconfig b/tulip/esp32s3/components/esp_lcd/Kconfig new file mode 100644 index 000000000..25a77c837 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/Kconfig @@ -0,0 +1,39 @@ +menu "LCD and Touch Panel" + comment "LCD Touch Drivers are maintained in the IDF Component Registry" + + menu "LCD Peripheral Configuration" + config LCD_PANEL_IO_FORMAT_BUF_SIZE + int "LCD panel io format buffer size" + default 32 + help + LCD driver allocates an internal buffer to transform the data into a proper format, because of + the endian order mismatch. This option is to set the size of the buffer, in bytes. + + config LCD_ENABLE_DEBUG_LOG + bool "Enable debug log" + default n + help + Wether to enable the debug log message for LCD driver. + Note that, this option only controls the LCD driver log, won't affect other drivers. + + if SOC_LCD_RGB_SUPPORTED + config LCD_RGB_ISR_IRAM_SAFE + bool "RGB LCD ISR IRAM-Safe" + default n + help + Ensure the LCD interrupt is IRAM-Safe by allowing the interrupt handler to be + executable when the cache is disabled (e.g. SPI Flash write). + If you want the LCD driver to keep flushing the screen even when cache ops disabled, + you can enable this option. Note, this will also increase the IRAM usage. + + config LCD_RGB_RESTART_IN_VSYNC + bool "Restart transmission in VSYNC" + default n + select GDMA_CTRL_FUNC_IN_IRAM # need to restart GDMA in the LCD ISR + help + Reset the GDMA channel every VBlank to stop permanent desyncs from happening. + Only need to enable it when in your application, the DMA can't deliver data + as fast as the LCD consumes it. + endif # SOC_LCD_RGB_SUPPORTED + endmenu +endmenu diff --git a/tulip/esp32s3/components/esp_lcd/README.md b/tulip/esp32s3/components/esp_lcd/README.md new file mode 100644 index 000000000..add8ed69b --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/README.md @@ -0,0 +1,83 @@ +# esp_lcd Driver Design + +## Class Diagram + +`esp_lcd` driver focuses on two parts: panel driver and IO driver. The panel driver is a bunch of operations on the **frame-buffer**, no matter where the frame-buffer is located. The IO driver is mainly consumed by the controller-based LCD panel drivers (e.g. ST7789). Usually such LCD controller can support various IO interfaces (e.g. I80, SPI, I2C, etc). So we define an abstract interface for the IO driver. + +```mermaid +classDiagram + class esp_lcd_panel_t { + <> + +reset() esp_err_t + +init() esp_err_t + +draw_bitmap(int x_start, int y_start, int x_end, int y_end, const void *color_data) esp_err_t + +mirror(bool x_axis, bool y_axis) esp_err_t + +swap_xy(bool swap_axes) esp_err_t + +set_gap(int x_gap, int y_gap) esp_err_t + +invert_color(bool invert_color_data) esp_err_t + +disp_on_off(bool on_off) esp_err_t + } + + esp_lcd_rgb_panel_t --|> esp_lcd_panel_t : Inheritance + class esp_lcd_rgb_panel_t { + -int panel_id + -size_t data_width + -int disp_gpio + -intr_handle_t intr + -uint8_t* frame_buffer + -gdma_channel_handle_t gdma_channel + -dma_descriptor_t* dma_nodes + -on_vsync(void* user_data) bool + } + + esp_lcd_panel_model_t --|> esp_lcd_panel_t : Inheritance + esp_lcd_panel_model_t "1" --> "1" esp_lcd_panel_io_t : Use + class esp_lcd_panel_model_t { + -esp_lcd_panel_io_t* io + -int reset_gpio_num + } + + class esp_lcd_panel_io_t { + <> + +rx_param(int lcd_cmd, void *param, size_t param_size) + +tx_param(int lcd_cmd, const void *param, size_t param_size) + +tx_color(int lcd_cmd, const void *color, size_t color_size) + } + + esp_lcd_panel_io_i2c_t --|> esp_lcd_panel_io_t : Inheritance + class esp_lcd_panel_io_i2c_t { + -int i2c_bus_id + -int ctrl_phase_cmd + -int ctrl_phase_data + -on_color_trans_done(void* user_data) bool + } + + esp_lcd_panel_io_spi_t --|> esp_lcd_panel_io_t : Inheritance + class esp_lcd_panel_io_spi_t { + -spi_device_handle_t spi_dev + -int dc_gpio_num + -spi_transaction_t trans_worker + -on_color_trans_done(void* user_data) bool + } + + esp_lcd_panel_io_i80_t --|> esp_lcd_panel_io_t : Inheritance + class esp_lcd_panel_io_i80_t { + -esp_lcd_i80_bus_t* bus + -int cs_gpio_num + -int dc_level + -size_t pclk_hz + -QueueHandle_t trans_queue + -QueueHandle_t done_queue + -on_color_trans_done(void* user_data) bool + } + + esp_lcd_i80_bus_t "1" --> "1..*" esp_lcd_panel_io_i80_t : Has + class esp_lcd_i80_bus_t { + -int bus_id + -size_t data_width + -intr_handle_t intr + -gdma_cannel_handle_t dma_chan + -dma_descriptor_t* dma_nodes + -list_t i80_devices + } +``` diff --git a/tulip/esp32s3/components/esp_lcd/include/esp_lcd_panel_commands.h b/tulip/esp32s3/components/esp_lcd/include/esp_lcd_panel_commands.h new file mode 100644 index 000000000..5917c3e87 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/include/esp_lcd_panel_commands.h @@ -0,0 +1,54 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +/* Common LCD panel commands */ +#define LCD_CMD_NOP 0x00 // This command is empty command +#define LCD_CMD_SWRESET 0x01 // Software reset registers (the built-in frame buffer is not affected) +#define LCD_CMD_RDDID 0x04 // Read 24-bit display ID +#define LCD_CMD_RDDST 0x09 // Read display status +#define LCD_CMD_RDDPM 0x0A // Read display power mode +#define LCD_CMD_RDD_MADCTL 0x0B // Read display MADCTL +#define LCD_CMD_RDD_COLMOD 0x0C // Read display pixel format +#define LCD_CMD_RDDIM 0x0D // Read display image mode +#define LCD_CMD_RDDSM 0x0E // Read display signal mode +#define LCD_CMD_RDDSR 0x0F // Read display self-diagnostic result +#define LCD_CMD_SLPIN 0x10 // Go into sleep mode (DC/DC, oscillator, scanning stopped, but memory keeps content) +#define LCD_CMD_SLPOUT 0x11 // Exit sleep mode +#define LCD_CMD_PTLON 0x12 // Turns on partial display mode +#define LCD_CMD_NORON 0x13 // Turns on normal display mode +#define LCD_CMD_INVOFF 0x20 // Recover from display inversion mode +#define LCD_CMD_INVON 0x21 // Go into display inversion mode +#define LCD_CMD_GAMSET 0x26 // Select Gamma curve for current display +#define LCD_CMD_DISPOFF 0x28 // Display off (disable frame buffer output) +#define LCD_CMD_DISPON 0x29 // Display on (enable frame buffer output) +#define LCD_CMD_CASET 0x2A // Set column address +#define LCD_CMD_RASET 0x2B // Set row address +#define LCD_CMD_RAMWR 0x2C // Write frame memory +#define LCD_CMD_RAMRD 0x2E // Read frame memory +#define LCD_CMD_PTLAR 0x30 // Define the partial area +#define LCD_CMD_VSCRDEF 0x33 // Vertical scrolling definition +#define LCD_CMD_TEOFF 0x34 // Turns off tearing effect +#define LCD_CMD_TEON 0x35 // Turns on tearing effect + +#define LCD_CMD_MADCTL 0x36 // Memory data access control +#define LCD_CMD_MH_BIT (1 << 2) // Display data latch order, 0: refresh left to right, 1: refresh right to left +#define LCD_CMD_BGR_BIT (1 << 3) // RGB/BGR order, 0: RGB, 1: BGR +#define LCD_CMD_ML_BIT (1 << 4) // Line address order, 0: refresh top to bottom, 1: refresh bottom to top +#define LCD_CMD_MV_BIT (1 << 5) // Row/Column order, 0: normal mode, 1: reverse mode +#define LCD_CMD_MX_BIT (1 << 6) // Column address order, 0: left to right, 1: right to left +#define LCD_CMD_MY_BIT (1 << 7) // Row address order, 0: top to bottom, 1: bottom to top + +#define LCD_CMD_VSCSAD 0x37 // Vertical scroll start address +#define LCD_CMD_IDMOFF 0x38 // Recover from IDLE mode +#define LCD_CMD_IDMON 0x39 // Fall into IDLE mode (8 color depth is displayed) +#define LCD_CMD_COLMOD 0x3A // Defines the format of RGB picture data +#define LCD_CMD_RAMWRC 0x3C // Memory write continue +#define LCD_CMD_RAMRDC 0x3E // Memory read continue +#define LCD_CMD_STE 0x44 // Set tear scan line, tearing effect output signal when display module reaches line N +#define LCD_CMD_GDCAN 0x45 // Get scan line +#define LCD_CMD_WRDISBV 0x51 // Write display brightness +#define LCD_CMD_RDDISBV 0x52 // Read display brightness value diff --git a/tulip/esp32s3/components/esp_lcd/include/esp_lcd_panel_io.h b/tulip/esp32s3/components/esp_lcd/include/esp_lcd_panel_io.h new file mode 100644 index 000000000..7fe5bc974 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/include/esp_lcd_panel_io.h @@ -0,0 +1,309 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "esp_err.h" +#include "esp_lcd_types.h" +#include "soc/soc_caps.h" +#include "hal/lcd_types.h" +#include "hal/i2c_types.h" +#include "driver/i2c_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void *esp_lcd_spi_bus_handle_t; /*!< Type of LCD SPI bus handle */ +typedef uint32_t esp_lcd_i2c_bus_handle_t; /*!< Type of LCD I2C bus handle */ +typedef struct esp_lcd_i80_bus_t *esp_lcd_i80_bus_handle_t; /*!< Type of LCD intel 8080 bus handle */ + +/** + * @brief Type of LCD panel IO event data + */ +typedef struct { +} esp_lcd_panel_io_event_data_t; + +/** + * @brief Declare the prototype of the function that will be invoked when panel IO finishes transferring color data + * + * @param[in] panel_io LCD panel IO handle, which is created by factory API like `esp_lcd_new_panel_io_spi()` + * @param[in] edata Panel IO event data, fed by driver + * @param[in] user_ctx User data, passed from `esp_lcd_panel_io_xxx_config_t` + * @return Whether a high priority task has been waken up by this function + */ +typedef bool (*esp_lcd_panel_io_color_trans_done_cb_t)(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_io_event_data_t *edata, void *user_ctx); + +/** + * @brief Type of LCD panel IO callbacks + */ +typedef struct { + esp_lcd_panel_io_color_trans_done_cb_t on_color_trans_done; /*!< Callback invoked when color data transfer has finished */ +} esp_lcd_panel_io_callbacks_t; + +/** + * @brief Transmit LCD command and receive corresponding parameters + * + * @note Commands sent by this function are short, so they are sent using polling transactions. + * The function does not return before the command transfer is completed. + * If any queued transactions sent by `esp_lcd_panel_io_tx_color()` are still pending when this function is called, + * this function will wait until they are finished and the queue is empty before sending the command(s). + * + * @param[in] io LCD panel IO handle, which is created by other factory API like `esp_lcd_new_panel_io_spi()` + * @param[in] lcd_cmd The specific LCD command, set to -1 if no command needed + * @param[out] param Buffer for the command data + * @param[in] param_size Size of `param` buffer + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_ERR_NOT_SUPPORTED if read is not supported by transport + * - ESP_OK on success + */ +esp_err_t esp_lcd_panel_io_rx_param(esp_lcd_panel_io_handle_t io, int lcd_cmd, void *param, size_t param_size); + +/** + * @brief Transmit LCD command and corresponding parameters + * + * @note Commands sent by this function are short, so they are sent using polling transactions. + * The function does not return before the command transfer is completed. + * If any queued transactions sent by `esp_lcd_panel_io_tx_color()` are still pending when this function is called, + * this function will wait until they are finished and the queue is empty before sending the command(s). + * + * @param[in] io LCD panel IO handle, which is created by other factory API like `esp_lcd_new_panel_io_spi()` + * @param[in] lcd_cmd The specific LCD command, set to -1 if no command needed + * @param[in] param Buffer that holds the command specific parameters, set to NULL if no parameter is needed for the command + * @param[in] param_size Size of `param` in memory, in bytes, set to zero if no parameter is needed for the command + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_OK on success + */ +esp_err_t esp_lcd_panel_io_tx_param(esp_lcd_panel_io_handle_t io, int lcd_cmd, const void *param, size_t param_size); + +/** + * @brief Transmit LCD RGB data + * + * @note This function will package the command and RGB data into a transaction, and push into a queue. + * The real transmission is performed in the background (DMA+interrupt). + * The caller should take care of the lifecycle of the `color` buffer. + * Recycling of color buffer should be done in the callback `on_color_trans_done()`. + * + * @param[in] io LCD panel IO handle, which is created by factory API like `esp_lcd_new_panel_io_spi()` + * @param[in] lcd_cmd The specific LCD command, set to -1 if no command needed + * @param[in] color Buffer that holds the RGB color data + * @param[in] color_size Size of `color` in memory, in bytes + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_OK on success + */ +esp_err_t esp_lcd_panel_io_tx_color(esp_lcd_panel_io_handle_t io, int lcd_cmd, const void *color, size_t color_size); + +/** + * @brief Destroy LCD panel IO handle (deinitialize panel and free all corresponding resource) + * + * @param[in] io LCD panel IO handle, which is created by factory API like `esp_lcd_new_panel_io_spi()` + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_OK on success + */ +esp_err_t esp_lcd_panel_io_del(esp_lcd_panel_io_handle_t io); + +/** + * @brief Register LCD panel IO callbacks + * + * @param[in] io LCD panel IO handle, which is created by factory API like `esp_lcd_new_panel_io_spi()` + * @param[in] cbs structure with all LCD panel IO callbacks + * @param[in] user_ctx User private data, passed directly to callback's user_ctx + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_OK on success + */ +esp_err_t esp_lcd_panel_io_register_event_callbacks(esp_lcd_panel_io_handle_t io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx); + +/** + * @brief Panel IO configuration structure, for SPI interface + */ +typedef struct { + int cs_gpio_num; /*!< GPIO used for CS line */ + int dc_gpio_num; /*!< GPIO used to select the D/C line, set this to -1 if the D/C line is not used */ + int spi_mode; /*!< Traditional SPI mode (0~3) */ + unsigned int pclk_hz; /*!< Frequency of pixel clock */ + size_t trans_queue_depth; /*!< Size of internal transaction queue */ + esp_lcd_panel_io_color_trans_done_cb_t on_color_trans_done; /*!< Callback invoked when color data transfer has finished */ + void *user_ctx; /*!< User private data, passed directly to on_color_trans_done's user_ctx */ + int lcd_cmd_bits; /*!< Bit-width of LCD command */ + int lcd_param_bits; /*!< Bit-width of LCD parameter */ + struct { + unsigned int dc_low_on_data: 1; /*!< If this flag is enabled, DC line = 0 means transfer data, DC line = 1 means transfer command; vice versa */ + unsigned int octal_mode: 1; /*!< transmit with octal mode (8 data lines), this mode is used to simulate Intel 8080 timing */ + unsigned int quad_mode: 1; /*!< transmit with quad mode (4 data lines), this mode is useful when transmitting LCD parameters (Only use one line for command) */ + unsigned int sio_mode: 1; /*!< Read and write through a single data line (MOSI) */ + unsigned int lsb_first: 1; /*!< transmit LSB bit first */ + unsigned int cs_high_active: 1; /*!< CS line is high active */ + } flags; /*!< Extra flags to fine-tune the SPI device */ +} esp_lcd_panel_io_spi_config_t; + +/** + * @brief Create LCD panel IO handle, for SPI interface + * + * @param[in] bus SPI bus handle + * @param[in] io_config IO configuration, for SPI interface + * @param[out] ret_io Returned IO handle + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_ERR_NO_MEM if out of memory + * - ESP_OK on success + */ +esp_err_t esp_lcd_new_panel_io_spi(esp_lcd_spi_bus_handle_t bus, const esp_lcd_panel_io_spi_config_t *io_config, esp_lcd_panel_io_handle_t *ret_io); + +/** + * @brief Panel IO configuration structure, for I2C interface + * + */ +typedef struct { + uint32_t dev_addr; /*!< I2C device address */ + esp_lcd_panel_io_color_trans_done_cb_t on_color_trans_done; /*!< Callback invoked when color data transfer has finished */ + void *user_ctx; /*!< User private data, passed directly to on_color_trans_done's user_ctx */ + size_t control_phase_bytes; /*!< I2C LCD panel will encode control information (e.g. D/C selection) into control phase, in several bytes */ + unsigned int dc_bit_offset; /*!< Offset of the D/C selection bit in control phase */ + int lcd_cmd_bits; /*!< Bit-width of LCD command */ + int lcd_param_bits; /*!< Bit-width of LCD parameter */ + struct { + unsigned int dc_low_on_data: 1; /*!< If this flag is enabled, DC line = 0 means transfer data, DC line = 1 means transfer command; vice versa */ + unsigned int disable_control_phase: 1; /*!< If this flag is enabled, the control phase isn't used */ + } flags; /*!< Extra flags to fine-tune the I2C device */ + uint32_t scl_speed_hz; /*!< I2C LCD SCL frequency (hz) */ +} esp_lcd_panel_io_i2c_config_t; + +/** + * @brief Create LCD panel IO handle, for I2C interface in legacy implementation + * + * @param[in] bus I2C bus handle, (in uint32_t) + * @param[in] io_config IO configuration, for I2C interface + * @param[out] ret_io Returned IO handle + * + * @note Please don't call this function in your project directly. Please call `esp_lcd_new_panel_to_i2c` instead. + * + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_ERR_NO_MEM if out of memory + * - ESP_OK on success + */ +esp_err_t esp_lcd_new_panel_io_i2c_v1(uint32_t bus, const esp_lcd_panel_io_i2c_config_t *io_config, esp_lcd_panel_io_handle_t *ret_io); + +/** + * @brief Create LCD panel IO handle, for I2C interface in new implementation + * + * @param[in] bus I2C bus handle, (in i2c_master_dev_handle_t) + * @param[in] io_config IO configuration, for I2C interface + * @param[out] ret_io Returned IO handle + * + * @note Please don't call this function in your project directly. Please call `esp_lcd_new_panel_to_i2c` instead. + * + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_ERR_NO_MEM if out of memory + * - ESP_OK on success + */ +esp_err_t esp_lcd_new_panel_io_i2c_v2(i2c_master_bus_handle_t bus, const esp_lcd_panel_io_i2c_config_t *io_config, esp_lcd_panel_io_handle_t *ret_io); + +/** + * @brief Create LCD panel IO handle + * + * @param[in] bus I2C bus handle + * @param[in] io_config IO configuration, for I2C interface + * @param[out] ret_io Returned IO handle + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_ERR_NO_MEM if out of memory + * - ESP_OK on success + */ +#define esp_lcd_new_panel_io_i2c(bus, io_config, ret_io) _Generic((bus), \ + i2c_master_bus_handle_t : esp_lcd_new_panel_io_i2c_v2, \ + default : esp_lcd_new_panel_io_i2c_v1) (bus, io_config, ret_io) \ + +#if SOC_LCD_I80_SUPPORTED +/** + * @brief LCD Intel 8080 bus configuration structure + */ +typedef struct { + int dc_gpio_num; /*!< GPIO used for D/C line */ + int wr_gpio_num; /*!< GPIO used for WR line */ + lcd_clock_source_t clk_src; /*!< Clock source for the I80 LCD peripheral */ + int data_gpio_nums[SOC_LCD_I80_BUS_WIDTH]; /*!< GPIOs used for data lines */ + size_t bus_width; /*!< Number of data lines, 8 or 16 */ + size_t max_transfer_bytes; /*!< Maximum transfer size, this determines the length of internal DMA link */ + size_t psram_trans_align; /*!< DMA transfer alignment for data allocated from PSRAM */ + size_t sram_trans_align; /*!< DMA transfer alignment for data allocated from SRAM */ +} esp_lcd_i80_bus_config_t; + +/** + * @brief Create Intel 8080 bus handle + * + * @param[in] bus_config Bus configuration + * @param[out] ret_bus Returned bus handle + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_ERR_NO_MEM if out of memory + * - ESP_ERR_NOT_FOUND if no free bus is available + * - ESP_OK on success + */ +esp_err_t esp_lcd_new_i80_bus(const esp_lcd_i80_bus_config_t *bus_config, esp_lcd_i80_bus_handle_t *ret_bus); + +/** + * @brief Destroy Intel 8080 bus handle + * + * @param[in] bus Intel 8080 bus handle, created by `esp_lcd_new_i80_bus()` + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_ERR_INVALID_STATE if there still be some device attached to the bus + * - ESP_OK on success + */ +esp_err_t esp_lcd_del_i80_bus(esp_lcd_i80_bus_handle_t bus); + +/** + * @brief Panel IO configuration structure, for intel 8080 interface + */ +typedef struct { + int cs_gpio_num; /*!< GPIO used for CS line, set to -1 will declaim exclusively use of I80 bus */ + uint32_t pclk_hz; /*!< Frequency of pixel clock */ + size_t trans_queue_depth; /*!< Transaction queue size, larger queue, higher throughput */ + esp_lcd_panel_io_color_trans_done_cb_t on_color_trans_done; /*!< Callback invoked when color data was transferred done */ + void *user_ctx; /*!< User private data, passed directly to on_color_trans_done's user_ctx */ + int lcd_cmd_bits; /*!< Bit-width of LCD command */ + int lcd_param_bits; /*!< Bit-width of LCD parameter */ + struct { + unsigned int dc_idle_level: 1; /*!< Level of DC line in IDLE phase */ + unsigned int dc_cmd_level: 1; /*!< Level of DC line in CMD phase */ + unsigned int dc_dummy_level: 1; /*!< Level of DC line in DUMMY phase */ + unsigned int dc_data_level: 1; /*!< Level of DC line in DATA phase */ + } dc_levels; /*!< Each i80 device might have its own D/C control logic */ + struct { + unsigned int cs_active_high: 1; /*!< If set, a high level of CS line will select the device, otherwise, CS line is low level active */ + unsigned int reverse_color_bits: 1; /*!< Reverse the data bits, D[N:0] -> D[0:N] */ + unsigned int swap_color_bytes: 1; /*!< Swap adjacent two color bytes */ + unsigned int pclk_active_neg: 1; /*!< The display will write data lines when there's a falling edge on WR signal (a.k.a the PCLK) */ + unsigned int pclk_idle_low: 1; /*!< The WR signal (a.k.a the PCLK) stays at low level in IDLE phase */ + } flags; /*!< Panel IO config flags */ +} esp_lcd_panel_io_i80_config_t; + +/** + * @brief Create LCD panel IO, for Intel 8080 interface + * + * @param[in] bus Intel 8080 bus handle, created by `esp_lcd_new_i80_bus()` + * @param[in] io_config IO configuration, for i80 interface + * @param[out] ret_io Returned panel IO handle + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_ERR_NOT_SUPPORTED if some configuration can't be satisfied, e.g. pixel clock out of the range + * - ESP_ERR_NO_MEM if out of memory + * - ESP_OK on success + */ +esp_err_t esp_lcd_new_panel_io_i80(esp_lcd_i80_bus_handle_t bus, const esp_lcd_panel_io_i80_config_t *io_config, esp_lcd_panel_io_handle_t *ret_io); + +#endif // SOC_LCD_I80_SUPPORTED + +#ifdef __cplusplus +} +#endif diff --git a/tulip/esp32s3/components/esp_lcd/include/esp_lcd_panel_ops.h b/tulip/esp32s3/components/esp_lcd/include/esp_lcd_panel_ops.h new file mode 100644 index 000000000..56b21a1ad --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/include/esp_lcd_panel_ops.h @@ -0,0 +1,149 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "esp_err.h" +#include "esp_lcd_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Reset LCD panel + * + * @note Panel reset must be called before attempting to initialize the panel using `esp_lcd_panel_init()`. + * + * @param[in] panel LCD panel handle, which is created by other factory API like `esp_lcd_new_panel_st7789()` + * @return + * - ESP_OK on success + */ +esp_err_t esp_lcd_panel_reset(esp_lcd_panel_handle_t panel); + +/** + * @brief Initialize LCD panel + * + * @note Before calling this function, make sure the LCD panel has finished the `reset` stage by `esp_lcd_panel_reset()`. + * + * @param[in] panel LCD panel handle, which is created by other factory API like `esp_lcd_new_panel_st7789()` + * @return + * - ESP_OK on success + */ +esp_err_t esp_lcd_panel_init(esp_lcd_panel_handle_t panel); + +/** + * @brief Deinitialize the LCD panel + * + * @param[in] panel LCD panel handle, which is created by other factory API like `esp_lcd_new_panel_st7789()` + * @return + * - ESP_OK on success + */ +esp_err_t esp_lcd_panel_del(esp_lcd_panel_handle_t panel); + +/** + * @brief Draw bitmap on LCD panel + * + * @param[in] panel LCD panel handle, which is created by other factory API like `esp_lcd_new_panel_st7789()` + * @param[in] x_start Start index on x-axis (x_start included) + * @param[in] y_start Start index on y-axis (y_start included) + * @param[in] x_end End index on x-axis (x_end not included) + * @param[in] y_end End index on y-axis (y_end not included) + * @param[in] color_data RGB color data that will be dumped to the specific window range + * @return + * - ESP_OK on success + */ +esp_err_t esp_lcd_panel_draw_bitmap(esp_lcd_panel_handle_t panel, int x_start, int y_start, int x_end, int y_end, const void *color_data); + +/** + * @brief Mirror the LCD panel on specific axis + * + * @note Combined with `esp_lcd_panel_swap_xy()`, one can realize screen rotation + * + * @param[in] panel LCD panel handle, which is created by other factory API like `esp_lcd_new_panel_st7789()` + * @param[in] mirror_x Whether the panel will be mirrored about the x axis + * @param[in] mirror_y Whether the panel will be mirrored about the y axis + * @return + * - ESP_OK on success + * - ESP_ERR_NOT_SUPPORTED if this function is not supported by the panel + */ +esp_err_t esp_lcd_panel_mirror(esp_lcd_panel_handle_t panel, bool mirror_x, bool mirror_y); + +/** + * @brief Swap/Exchange x and y axis + * + * @note Combined with `esp_lcd_panel_mirror()`, one can realize screen rotation + * + * @param[in] panel LCD panel handle, which is created by other factory API like `esp_lcd_new_panel_st7789()` + * @param[in] swap_axes Whether to swap the x and y axis + * @return + * - ESP_OK on success + * - ESP_ERR_NOT_SUPPORTED if this function is not supported by the panel + */ +esp_err_t esp_lcd_panel_swap_xy(esp_lcd_panel_handle_t panel, bool swap_axes); + +/** + * @brief Set extra gap in x and y axis + * + * The gap is the space (in pixels) between the left/top sides of the LCD panel and the first row/column respectively of the actual contents displayed. + * + * @note Setting a gap is useful when positioning or centering a frame that is smaller than the LCD. + * + * @param[in] panel LCD panel handle, which is created by other factory API like `esp_lcd_new_panel_st7789()` + * @param[in] x_gap Extra gap on x axis, in pixels + * @param[in] y_gap Extra gap on y axis, in pixels + * @return + * - ESP_OK on success + */ +esp_err_t esp_lcd_panel_set_gap(esp_lcd_panel_handle_t panel, int x_gap, int y_gap); + +/** + * @brief Invert the color (bit-wise invert the color data line) + * + * @param[in] panel LCD panel handle, which is created by other factory API like `esp_lcd_new_panel_st7789()` + * @param[in] invert_color_data Whether to invert the color data + * @return + * - ESP_OK on success + */ +esp_err_t esp_lcd_panel_invert_color(esp_lcd_panel_handle_t panel, bool invert_color_data); + +/** + * @brief Turn on or off the display + * + * @param[in] panel LCD panel handle, which is created by other factory API like `esp_lcd_new_panel_st7789()` + * @param[in] on_off True to turns on display, False to turns off display + * @return + * - ESP_OK on success + * - ESP_ERR_NOT_SUPPORTED if this function is not supported by the panel + */ +esp_err_t esp_lcd_panel_disp_on_off(esp_lcd_panel_handle_t panel, bool on_off); + +/** + * @brief Turn off the display + * + * @param[in] panel LCD panel handle, which is created by other factory API like `esp_lcd_new_panel_st7789()` + * @param[in] off Whether to turn off the screen + * @return + * - ESP_OK on success + * - ESP_ERR_NOT_SUPPORTED if this function is not supported by the panel + */ +esp_err_t esp_lcd_panel_disp_off(esp_lcd_panel_handle_t panel, bool off) +__attribute__((deprecated("use esp_lcd_panel_disp_on_off instead"))); + +/** + * @brief Enter or exit sleep mode + * + * @param[in] panel LCD panel handle, which is created by other factory API like `esp_lcd_new_panel_st7789()` + * @param[in] sleep True to enter sleep mode, False to wake up + * @return + * - ESP_OK on success + * - ESP_ERR_NOT_SUPPORTED if this function is not supported by the panel + */ +esp_err_t esp_lcd_panel_disp_sleep(esp_lcd_panel_handle_t panel, bool sleep); + +#ifdef __cplusplus +} +#endif diff --git a/tulip/esp32s3/components/esp_lcd/include/esp_lcd_panel_rgb.h b/tulip/esp32s3/components/esp_lcd/include/esp_lcd_panel_rgb.h new file mode 100644 index 000000000..a58cdd624 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/include/esp_lcd_panel_rgb.h @@ -0,0 +1,280 @@ +/* + * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include +#include "esp_err.h" +#include "esp_lcd_types.h" +#include "soc/soc_caps.h" +#include "hal/lcd_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if SOC_LCD_RGB_SUPPORTED +/** + * @brief LCD RGB timing structure + * @verbatim + * Total Width + * <---------------------------------------------------> + * HSYNC width HBP Active Width HFP + * <---><--><--------------------------------------><---> + * ____ ____|_______________________________________|____| + * |___| | | | + * | | | + * __| | | | + * /|\ /|\ | | | | + * | VSYNC| | | | | + * |Width\|/ |__ | | | + * | /|\ | | | | + * | VBP | | | | | + * | \|/_____|_________|_______________________________________| | + * | /|\ | | / / / / / / / / / / / / / / / / / / / | | + * | | | |/ / / / / / / / / / / / / / / / / / / /| | + * Total | | | |/ / / / / / / / / / / / / / / / / / / /| | + * Height | | | |/ / / / / / / / / / / / / / / / / / / /| | + * |Active| | |/ / / / / / / / / / / / / / / / / / / /| | + * |Heigh | | |/ / / / / / Active Display Area / / / /| | + * | | | |/ / / / / / / / / / / / / / / / / / / /| | + * | | | |/ / / / / / / / / / / / / / / / / / / /| | + * | | | |/ / / / / / / / / / / / / / / / / / / /| | + * | | | |/ / / / / / / / / / / / / / / / / / / /| | + * | | | |/ / / / / / / / / / / / / / / / / / / /| | + * | \|/_____|_________|_______________________________________| | + * | /|\ | | + * | VFP | | | + * \|/ \|/_____|______________________________________________________| + * @endverbatim + */ +typedef struct { + uint32_t pclk_hz; /*!< Frequency of pixel clock */ + uint32_t h_res; /*!< Horizontal resolution, i.e. the number of pixels in a line */ + uint32_t v_res; /*!< Vertical resolution, i.e. the number of lines in the frame */ + uint32_t hsync_pulse_width; /*!< Horizontal sync width, unit: PCLK period */ + uint32_t hsync_back_porch; /*!< Horizontal back porch, number of PCLK between hsync and start of line active data */ + uint32_t hsync_front_porch; /*!< Horizontal front porch, number of PCLK between the end of active data and the next hsync */ + uint32_t vsync_pulse_width; /*!< Vertical sync width, unit: number of lines */ + uint32_t vsync_back_porch; /*!< Vertical back porch, number of invalid lines between vsync and start of frame */ + uint32_t vsync_front_porch; /*!< Vertical front porch, number of invalid lines between the end of frame and the next vsync */ + struct { + uint32_t hsync_idle_low: 1; /*!< The hsync signal is low in IDLE state */ + uint32_t vsync_idle_low: 1; /*!< The vsync signal is low in IDLE state */ + uint32_t de_idle_high: 1; /*!< The de signal is high in IDLE state */ + uint32_t pclk_active_neg: 1; /*!< Whether the display data is clocked out on the falling edge of PCLK */ + uint32_t pclk_idle_high: 1; /*!< The PCLK stays at high level in IDLE phase */ + } flags; /*!< LCD RGB timing flags */ +} esp_lcd_rgb_timing_t; + +/** + * @brief Type of RGB LCD panel event data + */ +typedef struct { +} esp_lcd_rgb_panel_event_data_t; + +/** + * @brief RGB LCD VSYNC event callback prototype + * + * @param[in] panel LCD panel handle, returned from `esp_lcd_new_rgb_panel` + * @param[in] edata Panel event data, fed by driver + * @param[in] user_ctx User data, passed from `esp_lcd_rgb_panel_register_event_callbacks()` + * @return Whether a high priority task has been waken up by this function + */ +typedef bool (*esp_lcd_rgb_panel_vsync_cb_t)(esp_lcd_panel_handle_t panel, const esp_lcd_rgb_panel_event_data_t *edata, void *user_ctx); + +/** + * @brief Prototype for function to re-fill a bounce buffer, rather than copying from the frame buffer + * + * @param[in] panel LCD panel handle, returned from `esp_lcd_new_rgb_panel` + * @param[in] bounce_buf Bounce buffer to write data into + * @param[in] pos_px How many pixels already were sent to the display in this frame, in other words, + * at what pixel the routine should start putting data into bounce_buf + * @param[in] len_bytes Length, in bytes, of the bounce buffer. Routine should fill this length fully. + * @param[in] user_ctx Opaque pointer that was passed from `esp_lcd_rgb_panel_register_event_callbacks()` + * @return Whether a high priority task has been waken up by this function + */ +typedef bool (*esp_lcd_rgb_panel_bounce_buf_fill_cb_t)(esp_lcd_panel_handle_t panel, void *bounce_buf, int pos_px, int len_bytes, void *user_ctx); + +/** + * @brief Prototype for the function to be called when the bounce buffer finish copying the entire frame. + * + * @param[in] panel LCD panel handle, returned from `esp_lcd_new_rgb_panel` + * @param[in] edata Panel event data, fed by driver + * @param[in] user_ctx User data, passed from `esp_lcd_rgb_panel_register_event_callbacks()` + * @return Whether a high priority task has been waken up by this function + */ +typedef bool (*esp_lcd_rgb_panel_bounce_buf_finish_cb_t)(esp_lcd_panel_handle_t panel, const esp_lcd_rgb_panel_event_data_t *edata, void *user_ctx); + +/** + * @brief Group of supported RGB LCD panel callbacks + * @note The callbacks are all running under ISR environment + * @note When CONFIG_LCD_RGB_ISR_IRAM_SAFE is enabled, the callback itself and functions called by it should be placed in IRAM. + */ +typedef struct { + esp_lcd_rgb_panel_vsync_cb_t on_vsync; /*!< VSYNC event callback */ + esp_lcd_rgb_panel_bounce_buf_fill_cb_t on_bounce_empty; /*!< Bounce buffer empty callback. */ + esp_lcd_rgb_panel_bounce_buf_finish_cb_t on_bounce_frame_finish; /*!< Bounce buffer finish callback. */ +} esp_lcd_rgb_panel_event_callbacks_t; + +/** + * @brief LCD RGB panel configuration structure + */ +typedef struct { + lcd_clock_source_t clk_src; /*!< Clock source for the RGB LCD peripheral */ + esp_lcd_rgb_timing_t timings; /*!< RGB timing parameters, including the screen resolution */ + size_t data_width; /*!< Number of data lines */ + size_t bits_per_pixel; /*!< Frame buffer color depth, in bpp, specially, if set to zero, it will default to `data_width`. + When using a Serial RGB interface, this value could be different from `data_width` */ + size_t num_fbs; /*!< Number of screen-sized frame buffers that allocated by the driver. By default (set to either 0 or 1) only one frame buffer will be used. Maximum number of buffers are 3 */ + size_t bounce_buffer_size_px; /*!< If it's non-zero, the driver allocates two DRAM bounce buffers for DMA use. + DMA fetching from DRAM bounce buffer is much faster than PSRAM frame buffer. */ + size_t sram_trans_align; /*!< Alignment of buffers (frame buffer or bounce buffer) that allocated in SRAM */ + size_t psram_trans_align; /*!< Alignment of buffers (frame buffer) that allocated in PSRAM */ + int hsync_gpio_num; /*!< GPIO used for HSYNC signal */ + int vsync_gpio_num; /*!< GPIO used for VSYNC signal */ + int de_gpio_num; /*!< GPIO used for DE signal, set to -1 if it's not used */ + int pclk_gpio_num; /*!< GPIO used for PCLK signal, set to -1 if it's not used */ + int disp_gpio_num; /*!< GPIO used for display control signal, set to -1 if it's not used */ + int data_gpio_nums[SOC_LCD_RGB_DATA_WIDTH]; /*!< GPIOs used for data lines */ + struct { + uint32_t disp_active_low: 1; /*!< If this flag is enabled, a low level of display control signal can turn the screen on; vice versa */ + uint32_t refresh_on_demand: 1; /*!< If this flag is enabled, the host only refresh the frame buffer when `esp_lcd_panel_draw_bitmap` is called. + This is useful when the LCD screen has a GRAM and can refresh the LCD by itself. */ + uint32_t fb_in_psram: 1; /*!< If this flag is enabled, the frame buffer will be allocated from PSRAM, preferentially */ + uint32_t double_fb: 1; /*!< If this flag is enabled, the driver will allocate two screen sized frame buffer, same as num_fbs=2 */ + uint32_t no_fb: 1; /*!< If this flag is enabled, the driver won't allocate frame buffer. + Instead, user should fill in the bounce buffer manually in the `on_bounce_empty` callback */ + uint32_t bb_invalidate_cache: 1; /*!< If this flag is enabled, in bounce back mode we'll do a cache invalidate on the read data, freeing the cache. + Can be dangerous if data is written from other core(s). */ + } flags; /*!< LCD RGB panel configuration flags */ +} esp_lcd_rgb_panel_config_t; + +/** + * @brief Create RGB LCD panel + * + * @param[in] rgb_panel_config RGB panel configuration + * @param[out] ret_panel Returned LCD panel handle + * @return + * - ESP_ERR_INVALID_ARG: Create RGB LCD panel failed because of invalid argument + * - ESP_ERR_NO_MEM: Create RGB LCD panel failed because of out of memory + * - ESP_ERR_NOT_FOUND: Create RGB LCD panel failed because some mandatory hardware resources are not found + * - ESP_OK: Create RGB LCD panel successfully + */ +esp_err_t esp_lcd_new_rgb_panel(const esp_lcd_rgb_panel_config_t *rgb_panel_config, esp_lcd_panel_handle_t *ret_panel); + +/** + * @brief Register LCD RGB panel event callbacks + * + * @param[in] panel LCD panel handle, returned from `esp_lcd_new_rgb_panel` + * @param[in] callbacks Group of callback functions + * @param[in] user_ctx User data, which will be passed to the callback functions directly + * @return + * - ESP_OK: Set event callbacks successfully + * - ESP_ERR_INVALID_ARG: Set event callbacks failed because of invalid argument + * - ESP_FAIL: Set event callbacks failed because of other error + */ +esp_err_t esp_lcd_rgb_panel_register_event_callbacks(esp_lcd_panel_handle_t panel, const esp_lcd_rgb_panel_event_callbacks_t *callbacks, void *user_ctx); + +/** + * @brief Set frequency of PCLK for RGB LCD panel + * + * @note The PCLK frequency is set in the `esp_lcd_rgb_timing_t` and gets configured during LCD panel initialization. + * Usually you don't need to call this function to set the PCLK again, but in some cases, you might want to change the PCLK frequency. + * e.g. slow down the PCLK frequency to reduce power consumption or to reduce the memory throughput during OTA. + * @note This function doesn't cause the hardware to update the PCLK immediately but to record the new frequency and set a flag internally. + * Only in the next VSYNC event handler, will the driver attempt to update the PCLK frequency. + * + * @param[in] panel LCD panel handle, returned from `esp_lcd_new_rgb_panel` + * @param[in] freq_hz Frequency of pixel clock, in Hz + * @return + * - ESP_ERR_INVALID_ARG: Set PCLK frequency failed because of invalid argument + * - ESP_OK: Set PCLK frequency successfully + */ +esp_err_t esp_lcd_rgb_panel_set_pclk(esp_lcd_panel_handle_t panel, uint32_t freq_hz); + +/** + * @brief Restart the LCD transmission + * + * @note This function can be useful when the LCD controller is out of sync with the DMA because of insufficient bandwidth. + * To save the screen from a permanent shift, you can call this function to restart the LCD DMA. + * @note This function doesn't restart the DMA immediately but to set a flag internally. + * Only in the next VSYNC event handler, will the driver attempt to do the restart job. + * @note If CONFIG_LCD_RGB_RESTART_IN_VSYNC is enabled, you don't need to call this function manually, + * because the restart job will be done automatically in the VSYNC event handler. + * + * @param[in] panel panel LCD panel handle, returned from `esp_lcd_new_rgb_panel` + * @return + * - ESP_ERR_INVALID_ARG: Restart the LCD failed because of invalid argument + * - ESP_ERR_INVALID_STATE: Restart the LCD failed because the LCD diver is working in refresh-on-demand mode + * - ESP_OK: Restart the LCD successfully + */ +esp_err_t esp_lcd_rgb_panel_restart(esp_lcd_panel_handle_t panel); + +/** + * @brief Get the address of the frame buffer(s) that allocated by the driver + * + * @param[in] panel LCD panel handle, returned from `esp_lcd_new_rgb_panel` + * @param[in] fb_num Number of frame buffer(s) to get. This value must be the same as the number of the following parameters. + * @param[out] fb0 Returned address of the frame buffer 0 + * @param[out] ... List of other frame buffer addresses + * @return + * - ESP_ERR_INVALID_ARG: Get frame buffer address failed because of invalid argument + * - ESP_OK: Get frame buffer address successfully + */ +esp_err_t esp_lcd_rgb_panel_get_frame_buffer(esp_lcd_panel_handle_t panel, uint32_t fb_num, void **fb0, ...); + +/** + * @brief Manually trigger once transmission of the frame buffer to the LCD panel + * + * @note This function should only be called when the RGB panel is working under the `refresh_on_demand` mode. + * + * @param[in] panel LCD panel handle, returned from `esp_lcd_new_rgb_panel` + * @return + * - ESP_ERR_INVALID_ARG: Start a refresh failed because of invalid argument + * - ESP_ERR_INVALID_STATE: Start a refresh failed because the LCD panel is not created with the `refresh_on_demand` flag enabled. + * - ESP_OK: Start a refresh successfully + */ +esp_err_t esp_lcd_rgb_panel_refresh(esp_lcd_panel_handle_t panel); + +/** + * @brief LCD color conversion profile + */ +typedef struct { + lcd_color_space_t color_space; /*!< Color space of the image */ + lcd_color_range_t color_range; /*!< Color range of the image */ + lcd_yuv_sample_t yuv_sample; /*!< YUV sample format of the image */ +} esp_lcd_color_conv_profile_t; + +/** + * @brief Configuration of YUG-RGB conversion + */ +typedef struct { + lcd_yuv_conv_std_t std; /*!< YUV conversion standard: BT601, BT709 */ + esp_lcd_color_conv_profile_t src; /*!< Color conversion profile of the input image */ + esp_lcd_color_conv_profile_t dst; /*!< Color conversion profile of the output image */ +} esp_lcd_yuv_conv_config_t; + +/** + * @brief Configure how to convert the color format between RGB and YUV + * + * @note Pass in `config` as NULL will disable the RGB-YUV converter. + * @note The hardware converter can only parse a "packed" storage format, while "planar" and "semi-planar" format is not supported. + * + * @param[in] panel LCD panel handle, returned from `esp_lcd_new_rgb_panel` + * @param[in] config Configuration of RGB-YUV conversion + * @return + * - ESP_ERR_INVALID_ARG: Configure RGB-YUV conversion failed because of invalid argument + * - ESP_ERR_NOT_SUPPORTED: Configure RGB-YUV conversion failed because the conversion mode is not supported by the hardware + * - ESP_OK: Configure RGB-YUV conversion successfully + */ +esp_err_t esp_lcd_rgb_panel_set_yuv_conversion(esp_lcd_panel_handle_t panel, const esp_lcd_yuv_conv_config_t *config); + +#endif // SOC_LCD_RGB_SUPPORTED + +#ifdef __cplusplus +} +#endif diff --git a/tulip/esp32s3/components/esp_lcd/include/esp_lcd_panel_vendor.h b/tulip/esp32s3/components/esp_lcd/include/esp_lcd_panel_vendor.h new file mode 100644 index 000000000..2f5c8fd26 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/include/esp_lcd_panel_vendor.h @@ -0,0 +1,75 @@ +/* + * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "esp_err.h" +#include "esp_lcd_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Configuration structure for panel device + */ +typedef struct { + int reset_gpio_num; /*!< GPIO used to reset the LCD panel, set to -1 if it's not used */ + union { + lcd_rgb_element_order_t color_space; /*!< @deprecated Set RGB color space, please use rgb_ele_order instead */ + lcd_rgb_element_order_t rgb_endian; /*!< @deprecated Set RGB data endian, please use rgb_ele_order instead */ + lcd_rgb_element_order_t rgb_ele_order; /*!< Set RGB element order, RGB or BGR */ + }; + lcd_rgb_data_endian_t data_endian; /*!< Set the data endian for color data larger than 1 byte */ + unsigned int bits_per_pixel; /*!< Color depth, in bpp */ + struct { + unsigned int reset_active_high: 1; /*!< Setting this if the panel reset is high level active */ + } flags; /*!< LCD panel config flags */ + void *vendor_config; /*!< vendor specific configuration, optional, left as NULL if not used */ +} esp_lcd_panel_dev_config_t; + +/** + * @brief Create LCD panel for model ST7789 + * + * @param[in] io LCD panel IO handle + * @param[in] panel_dev_config general panel device configuration + * @param[out] ret_panel Returned LCD panel handle + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_ERR_NO_MEM if out of memory + * - ESP_OK on success + */ +esp_err_t esp_lcd_new_panel_st7789(const esp_lcd_panel_io_handle_t io, const esp_lcd_panel_dev_config_t *panel_dev_config, esp_lcd_panel_handle_t *ret_panel); + +/** + * @brief Create LCD panel for model NT35510 + * + * @param[in] io LCD panel IO handle + * @param[in] panel_dev_config general panel device configuration + * @param[out] ret_panel Returned LCD panel handle + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_ERR_NO_MEM if out of memory + * - ESP_OK on success + */ +esp_err_t esp_lcd_new_panel_nt35510(const esp_lcd_panel_io_handle_t io, const esp_lcd_panel_dev_config_t *panel_dev_config, esp_lcd_panel_handle_t *ret_panel); + +/** + * @brief Create LCD panel for model SSD1306 + * + * @param[in] io LCD panel IO handle + * @param[in] panel_dev_config general panel device configuration + * @param[out] ret_panel Returned LCD panel handle + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_ERR_NO_MEM if out of memory + * - ESP_OK on success + */ +esp_err_t esp_lcd_new_panel_ssd1306(const esp_lcd_panel_io_handle_t io, const esp_lcd_panel_dev_config_t *panel_dev_config, esp_lcd_panel_handle_t *ret_panel); + +#ifdef __cplusplus +} +#endif diff --git a/tulip/esp32s3/components/esp_lcd/include/esp_lcd_types.h b/tulip/esp32s3/components/esp_lcd/include/esp_lcd_types.h new file mode 100644 index 000000000..6f5928061 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/include/esp_lcd_types.h @@ -0,0 +1,37 @@ +/* + * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include "hal/lcd_types.h" +#include "esp_assert.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct esp_lcd_panel_io_t *esp_lcd_panel_io_handle_t; /*!< Type of LCD panel IO handle */ +typedef struct esp_lcd_panel_t *esp_lcd_panel_handle_t; /*!< Type of LCD panel handle */ + +/** @cond */ +/** + * @brief LCD color space type definition (WRONG!) + * @deprecated RGB and BGR should belong to the same color space, but this enum take them both as two different color spaces. + * If you want to use a enum to describe a color space, please use lcd_color_space_t instead. + */ +typedef enum { + ESP_LCD_COLOR_SPACE_RGB, /*!< Color space: RGB */ + ESP_LCD_COLOR_SPACE_BGR, /*!< Color space: BGR */ + ESP_LCD_COLOR_SPACE_MONOCHROME, /*!< Color space: monochrome */ +} esp_lcd_color_space_t __attribute__((deprecated)); + +// Ensure binary compatibility with lcd_color_rgb_endian_t +ESP_STATIC_ASSERT((lcd_rgb_element_order_t)ESP_LCD_COLOR_SPACE_RGB == LCD_RGB_ELEMENT_ORDER_RGB, "ESP_LCD_COLOR_SPACE_RGB is not compatible with LCD_RGB_ORDER_RGB"); +ESP_STATIC_ASSERT((lcd_rgb_element_order_t)ESP_LCD_COLOR_SPACE_BGR == LCD_RGB_ELEMENT_ORDER_BGR, "ESP_LCD_COLOR_SPACE_BGR is not compatible with LCD_RGB_ORDER_BGR"); +/** @endcond */ + +#ifdef __cplusplus +} +#endif diff --git a/tulip/esp32s3/components/esp_lcd/interface/esp_lcd_panel_interface.h b/tulip/esp32s3/components/esp_lcd/interface/esp_lcd_panel_interface.h new file mode 100644 index 000000000..ff5d289d7 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/interface/esp_lcd_panel_interface.h @@ -0,0 +1,139 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct esp_lcd_panel_t esp_lcd_panel_t; /*!< Type of LCD panel */ + +/** + * @brief LCD panel interface + */ +struct esp_lcd_panel_t { + /** + * @brief Reset LCD panel + * + * @param[in] panel LCD panel handle, which is created by other factory API like `esp_lcd_new_panel_st7789()` + * @return + * - ESP_OK on success + */ + esp_err_t (*reset)(esp_lcd_panel_t *panel); + + /** + * @brief Initialize LCD panel + * + * @param[in] panel LCD panel handle, which is created by other factory API like `esp_lcd_new_panel_st7789()` + * @return + * - ESP_OK on success + */ + esp_err_t (*init)(esp_lcd_panel_t *panel); + + /** + * @brief Destory LCD panel + * + * @param[in] panel LCD panel handle, which is created by other factory API like `esp_lcd_new_panel_st7789()` + * @return + * - ESP_OK on success + */ + esp_err_t (*del)(esp_lcd_panel_t *panel); + + /** + * @brief Draw bitmap on LCD panel + * + * @param[in] panel LCD panel handle, which is created by other factory API like `esp_lcd_new_panel_st7789()` + * @param[in] x_start Start index on x-axis (x_start included) + * @param[in] y_start Start index on y-axis (y_start included) + * @param[in] x_end End index on x-axis (x_end not included) + * @param[in] y_end End index on y-axis (y_end not included) + * @param[in] color_data RGB color data that will be dumped to the specific window range + * @return + * - ESP_OK on success + */ + esp_err_t (*draw_bitmap)(esp_lcd_panel_t *panel, int x_start, int y_start, int x_end, int y_end, const void *color_data); + + /** + * @brief Mirror the LCD panel on specific axis + * + * @note Combine this function with `swap_xy`, one can realize screen rotatation + * + * @param[in] panel LCD panel handle, which is created by other factory API like `esp_lcd_new_panel_st7789()` + * @param[in] x_axis Whether the panel will be mirrored about the x_axis + * @param[in] y_axis Whether the panel will be mirrored about the y_axis + * @return + * - ESP_OK on success + * - ESP_ERR_NOT_SUPPORTED if this function is not supported by the panel + */ + esp_err_t (*mirror)(esp_lcd_panel_t *panel, bool x_axis, bool y_axis); + + /** + * @brief Swap/Exchange x and y axis + * + * @note Combine this function with `mirror`, one can realize screen rotatation + * + * @param[in] panel LCD panel handle, which is created by other factory API like `esp_lcd_new_panel_st7789()` + * @param[in] swap_axes Whether to swap the x and y axis + * @return + * - ESP_OK on success + * - ESP_ERR_NOT_SUPPORTED if this function is not supported by the panel + */ + esp_err_t (*swap_xy)(esp_lcd_panel_t *panel, bool swap_axes); + + /** + * @brief Set extra gap in x and y axis + * + * @note The gap is only used for calculating the real coordinates. + * + * @param[in] panel LCD panel handle, which is created by other factory API like `esp_lcd_new_panel_st7789()` + * @param[in] x_gap Extra gap on x axis, in pixels + * @param[in] y_gap Extra gap on y axis, in pixels + * @return + * - ESP_OK on success + */ + esp_err_t (*set_gap)(esp_lcd_panel_t *panel, int x_gap, int y_gap); + + /** + * @brief Invert the color (bit 1 -> 0 for color data line, and vice versa) + * + * @param[in] panel LCD panel handle, which is created by other factory API like `esp_lcd_new_panel_st7789()` + * @param[in] invert_color_data Whether to invert the color data + * @return + * - ESP_OK on success + */ + esp_err_t (*invert_color)(esp_lcd_panel_t *panel, bool invert_color_data); + + /** + * @brief Turn on or off the display + * + * @param[in] panel LCD panel handle, which is created by other factory API like `esp_lcd_new_panel_st7789()` + * @param[in] on_off True to turns on display, False to turns off display + * @return + * - ESP_OK on success + * - ESP_ERR_NOT_SUPPORTED if this function is not supported by the panel + */ + esp_err_t (*disp_on_off)(esp_lcd_panel_t *panel, bool on_off); + + /** + * @brief Enter or exit sleep mode + * + * @param[in] panel LCD panel handle, which is created by other factory API like `esp_lcd_new_panel_st7789()` + * @param[in] sleep True to enter sleep mode, False to wake up + * @return + * - ESP_OK on success + * - ESP_ERR_NOT_SUPPORTED if this function is not supported by the panel + */ + esp_err_t (*disp_sleep)(esp_lcd_panel_t *panel, bool sleep); + + void *user_data; /*!< User data, used to store externally customized data */ +}; + +#ifdef __cplusplus +} +#endif diff --git a/tulip/esp32s3/components/esp_lcd/interface/esp_lcd_panel_io_interface.h b/tulip/esp32s3/components/esp_lcd/interface/esp_lcd_panel_io_interface.h new file mode 100644 index 000000000..88bf9db0d --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/interface/esp_lcd_panel_io_interface.h @@ -0,0 +1,93 @@ +/* + * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "esp_err.h" +#include "esp_lcd_panel_io.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct esp_lcd_panel_io_t esp_lcd_panel_io_t; /*!< Type of LCD panel IO */ + +/** + * @brief LCD panel IO interface + */ +struct esp_lcd_panel_io_t { + /** + * @brief Transmit LCD command and receive corresponding parameters + * + * @note This is the panel-specific interface called by function `esp_lcd_panel_io_rx_param()`. + * + * @param[in] io LCD panel IO handle, which is created by other factory API like `esp_lcd_new_panel_io_spi()` + * @param[in] lcd_cmd The specific LCD command, set to -1 if no command needed + * @param[out] param Buffer for the command data + * @param[in] param_size Size of `param` buffer + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_ERR_NOT_SUPPORTED if read is not supported by transport + * - ESP_OK on success + */ + esp_err_t (*rx_param)(esp_lcd_panel_io_t *io, int lcd_cmd, void *param, size_t param_size); + + /** + * @brief Transmit LCD command and corresponding parameters + * + * @note This is the panel-specific interface called by function `esp_lcd_panel_io_tx_param()`. + * + * @param[in] io LCD panel IO handle, which is created by other factory API like `esp_lcd_new_panel_io_spi()` + * @param[in] lcd_cmd The specific LCD command + * @param[in] param Buffer that holds the command specific parameters, set to NULL if no parameter is needed for the command + * @param[in] param_size Size of `param` in memory, in bytes, set to zero if no parameter is needed for the command + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_OK on success + */ + esp_err_t (*tx_param)(esp_lcd_panel_io_t *io, int lcd_cmd, const void *param, size_t param_size); + + /** + * @brief Transmit LCD RGB data + * + * @note This is the panel-specific interface called by function `esp_lcd_panel_io_tx_color()`. + * + * @param[in] io LCD panel IO handle, which is created by other factory API like `esp_lcd_new_panel_io_spi()` + * @param[in] lcd_cmd The specific LCD command + * @param[in] color Buffer that holds the RGB color data + * @param[in] color_size Size of `color` in memory, in bytes + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_OK on success + */ + esp_err_t (*tx_color)(esp_lcd_panel_io_t *io, int lcd_cmd, const void *color, size_t color_size); + + /** + * @brief Destory LCD panel IO handle (deinitialize all and free resource) + * + * @param[in] io LCD panel IO handle, which is created by other factory API like `esp_lcd_new_panel_io_spi()` + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_OK on success + */ + esp_err_t (*del)(esp_lcd_panel_io_t *io); + + /** + * @brief Register LCD panel IO callbacks + * + * @param[in] io LCD panel IO handle, which is created by factory API like `esp_lcd_new_panel_io_spi()` + * @param[in] cbs structure with all LCD panel IO callbacks + * @param[in] user_ctx User private data, passed directly to callback's user_ctx + * @return + * - ESP_ERR_INVALID_ARG if parameter is invalid + * - ESP_OK on success + */ + esp_err_t (*register_event_callbacks)(esp_lcd_panel_io_t *io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx); +}; + +#ifdef __cplusplus +} +#endif diff --git a/tulip/esp32s3/components/esp_lcd/linker.lf b/tulip/esp32s3/components/esp_lcd/linker.lf new file mode 100644 index 000000000..6e3aa0d3c --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/linker.lf @@ -0,0 +1,12 @@ +[mapping:esp_lcd_driver] +archive: libesp_lcd.a +entries: + if LCD_RGB_ISR_IRAM_SAFE = y: + esp_lcd_common: lcd_com_mount_dma_data (noflash) + +[mapping:esp_lcd_hal] +archive: libhal.a +entries: + if LCD_RGB_ISR_IRAM_SAFE = y: + lcd_hal: lcd_hal_cal_pclk_freq (noflash) + hal_utils: hal_utils_calc_clk_div_frac_fast (noflash) diff --git a/tulip/esp32s3/components/esp_lcd/src/esp_lcd_common.c b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_common.c new file mode 100644 index 000000000..f9716b785 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_common.c @@ -0,0 +1,106 @@ +/* + * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "freertos/FreeRTOS.h" +#include "soc/soc_caps.h" +#include "esp_lcd_common.h" +#if SOC_LCDCAM_SUPPORTED +#include "hal/lcd_ll.h" +#include "hal/lcd_hal.h" + +typedef struct esp_lcd_platform_t { + portMUX_TYPE spinlock; // spinlock used to protect platform level resources + union { + void *panels[SOC_LCD_RGB_PANELS]; // array of RGB LCD panel instances + void *buses[SOC_LCD_I80_BUSES]; // array of i80 bus instances + }; // LCD peripheral can only work under either RGB mode or intel 8080 mode +} esp_lcd_platform_t; + +esp_lcd_platform_t s_lcd_platform = { + .spinlock = (portMUX_TYPE)portMUX_INITIALIZER_UNLOCKED, + .buses = {} // initially the bus slots and panel slots are empty +}; + +int lcd_com_register_device(lcd_com_device_type_t device_type, void *device_obj) +{ + int member_id = -1; + switch (device_type) { + case LCD_COM_DEVICE_TYPE_I80: + // search for a bus slot then register to platform + for (int i = 0; (i < SOC_LCD_I80_BUSES) && (member_id == -1); i++) { + portENTER_CRITICAL(&s_lcd_platform.spinlock); + if (!s_lcd_platform.buses[i]) { + s_lcd_platform.buses[i] = device_obj; + member_id = i; + } + portEXIT_CRITICAL(&s_lcd_platform.spinlock); + } + break; + case LCD_COM_DEVICE_TYPE_RGB: + // search for a panel slot then register to platform + for (int i = 0; (i < SOC_LCD_RGB_PANELS) && (member_id == -1); i++) { + portENTER_CRITICAL(&s_lcd_platform.spinlock); + if (!s_lcd_platform.panels[i]) { + s_lcd_platform.panels[i] = device_obj; + member_id = i; + } + portEXIT_CRITICAL(&s_lcd_platform.spinlock); + } + break; + default: + break; + } + return member_id; +} + +void lcd_com_remove_device(lcd_com_device_type_t device_type, int member_id) +{ + switch (device_type) { + case LCD_COM_DEVICE_TYPE_I80: + portENTER_CRITICAL(&s_lcd_platform.spinlock); + if (s_lcd_platform.buses[member_id]) { + s_lcd_platform.buses[member_id] = NULL; + } + portEXIT_CRITICAL(&s_lcd_platform.spinlock); + break; + case LCD_COM_DEVICE_TYPE_RGB: + portENTER_CRITICAL(&s_lcd_platform.spinlock); + if (s_lcd_platform.panels[member_id]) { + s_lcd_platform.panels[member_id] = NULL; + } + portEXIT_CRITICAL(&s_lcd_platform.spinlock); + break; + default: + break; + } +} +#endif // SOC_LCDCAM_SUPPORTED + +void lcd_com_mount_dma_data(dma_descriptor_t *desc_head, const void *buffer, size_t len) +{ + size_t prepared_length = 0; + uint8_t *data = (uint8_t *)buffer; + dma_descriptor_t *desc = desc_head; + while (len > DMA_DESCRIPTOR_BUFFER_MAX_SIZE) { + desc->dw0.suc_eof = 0; // not the end of the transaction + desc->dw0.size = DMA_DESCRIPTOR_BUFFER_MAX_SIZE; + desc->dw0.length = DMA_DESCRIPTOR_BUFFER_MAX_SIZE; + desc->dw0.owner = DMA_DESCRIPTOR_BUFFER_OWNER_DMA; + desc->buffer = &data[prepared_length]; + desc = desc->next; // move to next descriptor + prepared_length += DMA_DESCRIPTOR_BUFFER_MAX_SIZE; + len -= DMA_DESCRIPTOR_BUFFER_MAX_SIZE; + } + if (len) { + desc->dw0.suc_eof = 1; // end of the transaction + desc->dw0.size = len; + desc->dw0.length = len; + desc->dw0.owner = DMA_DESCRIPTOR_BUFFER_OWNER_DMA; + desc->buffer = &data[prepared_length]; + desc = desc->next; // move to next descriptor + prepared_length += len; + } +} diff --git a/tulip/esp32s3/components/esp_lcd/src/esp_lcd_common.h b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_common.h new file mode 100644 index 000000000..f036bc5fa --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_common.h @@ -0,0 +1,86 @@ +/* + * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "sdkconfig.h" +#include "soc/soc_caps.h" +#include "hal/dma_types.h" +#include "esp_intr_alloc.h" +#include "esp_heap_caps.h" +#if SOC_LCDCAM_SUPPORTED +#include "hal/lcd_hal.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define LCD_I80_INTR_ALLOC_FLAGS ESP_INTR_FLAG_INTRDISABLED +#define LCD_I80_MEM_ALLOC_CAPS MALLOC_CAP_DEFAULT + +#define LCD_PERIPH_CLOCK_PRE_SCALE (2) // This is the minimum divider that can be applied to LCD peripheral + +#if SOC_LCDCAM_SUPPORTED + +typedef enum { + LCD_COM_DEVICE_TYPE_I80, + LCD_COM_DEVICE_TYPE_RGB +} lcd_com_device_type_t; + +/** + * @brief Register a LCD device to platform + * + * @param device_type Device type, refer to lcd_com_device_type_t + * @param device_obj Device object + * @return >=0: member_id, <0: no free lcd bus/panel slots + */ +int lcd_com_register_device(lcd_com_device_type_t device_type, void *device_obj); + +/** + * @brief Remove a device from platform + * + * @param device_type Device type, refer to lcd_com_device_type_t + * @param member_id member ID + */ +void lcd_com_remove_device(lcd_com_device_type_t device_type, int member_id); +#endif // SOC_LCDCAM_SUPPORTED + +/** + * @brief Mount data to DMA descriptors + * + * @param desc_head Point to the head of DMA descriptor chain + * @param buffer Data buffer + * @param len Size of the data buffer, in bytes + */ +void lcd_com_mount_dma_data(dma_descriptor_t *desc_head, const void *buffer, size_t len); + +/** + * @brief Reverse the bytes in the buffer + * + * @note LCD is big-endian, e.g. to send command 0x1234, byte 0x12 should appear on the bus first + * However, the low level peripheral (like i80, i2s) will send 0x34 first. + * This helper function is used to reverse the bytes order + * + * @param buf buffer address + * @param start start index of the buffer + * @param end end index of the buffer + */ +static inline void lcd_com_reverse_buffer_bytes(uint8_t *buf, int start, int end) +{ + uint8_t temp = 0; + while (start < end) { + temp = buf[start]; + buf[start] = buf[end]; + buf[end] = temp; + start++; + end--; + } +} + +#ifdef __cplusplus +} +#endif diff --git a/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io.c b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io.c new file mode 100644 index 000000000..917ca6d4c --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io.c @@ -0,0 +1,43 @@ +/* + * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "esp_check.h" +#include "esp_lcd_panel_io.h" +#include "esp_lcd_panel_io_interface.h" + +static const char *TAG = "lcd_panel.io"; + +esp_err_t esp_lcd_panel_io_rx_param(esp_lcd_panel_io_handle_t io, int lcd_cmd, void *param, size_t param_size) +{ + ESP_RETURN_ON_FALSE(io, ESP_ERR_INVALID_ARG, TAG, "invalid panel io handle"); + ESP_RETURN_ON_FALSE(io->rx_param, ESP_ERR_NOT_SUPPORTED, TAG, "rx_param is not supported yet"); + return io->rx_param(io, lcd_cmd, param, param_size); +} + +esp_err_t esp_lcd_panel_io_tx_param(esp_lcd_panel_io_handle_t io, int lcd_cmd, const void *param, size_t param_size) +{ + ESP_RETURN_ON_FALSE(io, ESP_ERR_INVALID_ARG, TAG, "invalid panel io handle"); + return io->tx_param(io, lcd_cmd, param, param_size); +} + +esp_err_t esp_lcd_panel_io_tx_color(esp_lcd_panel_io_handle_t io, int lcd_cmd, const void *color, size_t color_size) +{ + ESP_RETURN_ON_FALSE(io, ESP_ERR_INVALID_ARG, TAG, "invalid panel io handle"); + return io->tx_color(io, lcd_cmd, color, color_size); +} + +esp_err_t esp_lcd_panel_io_del(esp_lcd_panel_io_handle_t io) +{ + ESP_RETURN_ON_FALSE(io, ESP_ERR_INVALID_ARG, TAG, "invalid panel io handle"); + return io->del(io); +} + +esp_err_t esp_lcd_panel_io_register_event_callbacks(esp_lcd_panel_io_handle_t io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx) +{ + ESP_RETURN_ON_FALSE(io, ESP_ERR_INVALID_ARG, TAG, "invalid panel io handle"); + ESP_RETURN_ON_FALSE(cbs, ESP_ERR_INVALID_ARG, TAG, "invalid callbacks structure"); + return io->register_event_callbacks(io, cbs, user_ctx); +} diff --git a/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io_i2c_v1.c b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io_i2c_v1.c new file mode 100644 index 000000000..ba7731b2d --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io_i2c_v1.c @@ -0,0 +1,208 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include "sdkconfig.h" +#if CONFIG_LCD_ENABLE_DEBUG_LOG +// The local log level must be defined before including esp_log.h +// Set the maximum log level for this source file +#define LOG_LOCAL_LEVEL ESP_LOG_DEBUG +#endif +#include "esp_lcd_panel_io_interface.h" +#include "esp_lcd_panel_io.h" +#include "driver/i2c.h" +#include "driver/gpio.h" +#include "esp_log.h" +#include "esp_check.h" + +static const char *TAG = "lcd_panel.io.i2c"; + +#define CMD_HANDLER_BUFFER_SIZE I2C_LINK_RECOMMENDED_SIZE(2) // only 2 operations will be queued in the handler ATTOW +#define BYTESHIFT(VAR, IDX) (((VAR) >> ((IDX) * 8)) & 0xFF) + +static esp_err_t panel_io_i2c_del(esp_lcd_panel_io_t *io); +static esp_err_t panel_io_i2c_rx_param(esp_lcd_panel_io_t *io, int lcd_cmd, void *param, size_t param_size); +static esp_err_t panel_io_i2c_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, const void *param, size_t param_size); +static esp_err_t panel_io_i2c_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, const void *color, size_t color_size); +static esp_err_t panel_io_i2c_register_event_callbacks(esp_lcd_panel_io_handle_t io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx); + +typedef struct { + esp_lcd_panel_io_t base; // Base class of generic lcd panel io + uint32_t i2c_bus_id; // I2C bus id, indicating which I2C port + uint32_t dev_addr; // Device address + int lcd_cmd_bits; // Bit width of LCD command + int lcd_param_bits; // Bit width of LCD parameter + bool control_phase_enabled; // Is control phase enabled + uint32_t control_phase_cmd; // control byte when transferring command + uint32_t control_phase_data; // control byte when transferring data + esp_lcd_panel_io_color_trans_done_cb_t on_color_trans_done; // User register's callback, invoked when color data trans done + void *user_ctx; // User's private data, passed directly to callback on_color_trans_done() + uint8_t cmdlink_buffer[]; // pre-alloc I2C command link buffer, to be reused in all transactions +} lcd_panel_io_i2c_t; + +esp_err_t esp_lcd_new_panel_io_i2c_v1(uint32_t bus, const esp_lcd_panel_io_i2c_config_t *io_config, esp_lcd_panel_io_handle_t *ret_io) +{ +#if CONFIG_LCD_ENABLE_DEBUG_LOG + esp_log_level_set(TAG, ESP_LOG_DEBUG); +#endif + esp_err_t ret = ESP_OK; + lcd_panel_io_i2c_t *i2c_panel_io = NULL; + ESP_GOTO_ON_FALSE(io_config && ret_io, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + ESP_GOTO_ON_FALSE(io_config->control_phase_bytes * 8 > io_config->dc_bit_offset, ESP_ERR_INVALID_ARG, err, TAG, "D/C bit exceeds control bytes"); + ESP_GOTO_ON_FALSE(io_config->scl_speed_hz == 0, ESP_ERR_INVALID_ARG, err, TAG, "scl_speed_hz is not need to set in legacy i2c_lcd driver"); + i2c_panel_io = calloc(1, sizeof(lcd_panel_io_i2c_t) + CMD_HANDLER_BUFFER_SIZE); // expand zero-length array cmdlink_buffer + ESP_GOTO_ON_FALSE(i2c_panel_io, ESP_ERR_NO_MEM, err, TAG, "no mem for i2c panel io"); + + i2c_panel_io->i2c_bus_id = bus; + i2c_panel_io->lcd_cmd_bits = io_config->lcd_cmd_bits; + i2c_panel_io->lcd_param_bits = io_config->lcd_param_bits; + i2c_panel_io->on_color_trans_done = io_config->on_color_trans_done; + i2c_panel_io->user_ctx = io_config->user_ctx; + i2c_panel_io->control_phase_enabled = (!io_config->flags.disable_control_phase); + i2c_panel_io->control_phase_data = (!io_config->flags.dc_low_on_data) << (io_config->dc_bit_offset); + i2c_panel_io->control_phase_cmd = (io_config->flags.dc_low_on_data) << (io_config->dc_bit_offset); + i2c_panel_io->dev_addr = io_config->dev_addr; + i2c_panel_io->base.del = panel_io_i2c_del; + i2c_panel_io->base.rx_param = panel_io_i2c_rx_param; + i2c_panel_io->base.tx_param = panel_io_i2c_tx_param; + i2c_panel_io->base.tx_color = panel_io_i2c_tx_color; + i2c_panel_io->base.register_event_callbacks = panel_io_i2c_register_event_callbacks; + *ret_io = &(i2c_panel_io->base); + ESP_LOGD(TAG, "new i2c lcd panel io @%p", i2c_panel_io); + + return ESP_OK; +err: + return ret; +} + +static esp_err_t panel_io_i2c_del(esp_lcd_panel_io_t *io) +{ + esp_err_t ret = ESP_OK; + lcd_panel_io_i2c_t *i2c_panel_io = __containerof(io, lcd_panel_io_i2c_t, base); + + ESP_LOGD(TAG, "del lcd panel i2c @%p", i2c_panel_io); + free(i2c_panel_io); + return ret; +} + +static esp_err_t panel_io_i2c_register_event_callbacks(esp_lcd_panel_io_handle_t io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx) +{ + lcd_panel_io_i2c_t *i2c_panel_io = __containerof(io, lcd_panel_io_i2c_t, base); + + if (i2c_panel_io->on_color_trans_done != NULL) { + ESP_LOGW(TAG, "Callback on_color_trans_done was already set and now it was owerwritten!"); + } + + i2c_panel_io->on_color_trans_done = cbs->on_color_trans_done; + i2c_panel_io->user_ctx = user_ctx; + + return ESP_OK; +} + +static esp_err_t panel_io_i2c_rx_buffer(esp_lcd_panel_io_t *io, int lcd_cmd, void *buffer, size_t buffer_size) +{ + esp_err_t ret = ESP_OK; + lcd_panel_io_i2c_t *i2c_panel_io = __containerof(io, lcd_panel_io_i2c_t, base); + bool send_param = (lcd_cmd >= 0); + + i2c_cmd_handle_t cmd_link = i2c_cmd_link_create_static(i2c_panel_io->cmdlink_buffer, CMD_HANDLER_BUFFER_SIZE); + ESP_GOTO_ON_FALSE(cmd_link, ESP_ERR_NO_MEM, err, TAG, "no mem for i2c cmd link"); + ESP_GOTO_ON_ERROR(i2c_master_start(cmd_link), err, TAG, "issue start failed"); // start phase + ESP_GOTO_ON_ERROR(i2c_master_write_byte(cmd_link, (i2c_panel_io->dev_addr << 1) | I2C_MASTER_WRITE, true), err, TAG, "write address failed"); // address phase + if (send_param) { + if (i2c_panel_io->control_phase_enabled) { + ESP_GOTO_ON_ERROR(i2c_master_write_byte(cmd_link, i2c_panel_io->control_phase_cmd, true), + err, TAG, "write control phase failed"); // control phase + } + uint8_t cmds[4] = {BYTESHIFT(lcd_cmd, 3), BYTESHIFT(lcd_cmd, 2), BYTESHIFT(lcd_cmd, 1), BYTESHIFT(lcd_cmd, 0)}; + size_t cmds_size = i2c_panel_io->lcd_cmd_bits / 8; + if (cmds_size > 0 && cmds_size <= sizeof(cmds)) { + ESP_GOTO_ON_ERROR(i2c_master_write(cmd_link, cmds + (sizeof(cmds) - cmds_size), cmds_size, true), err, TAG, "write LCD cmd failed"); + } + } + + if (buffer) { + ESP_GOTO_ON_ERROR(i2c_master_start(cmd_link), err, TAG, "issue start failed"); // start phase + ESP_GOTO_ON_ERROR(i2c_master_write_byte(cmd_link, (i2c_panel_io->dev_addr << 1) | I2C_MASTER_READ, true), err, TAG, "write address failed"); // address phase + ESP_GOTO_ON_ERROR(i2c_master_read(cmd_link, buffer, buffer_size, I2C_MASTER_LAST_NACK), err, TAG, "read data failed"); + } + + ESP_GOTO_ON_ERROR(i2c_master_stop(cmd_link), err, TAG, "issue stop failed"); // stop phase + ESP_GOTO_ON_ERROR(i2c_master_cmd_begin(i2c_panel_io->i2c_bus_id, cmd_link, portMAX_DELAY), err, TAG, "i2c transaction failed"); + + i2c_cmd_link_delete_static(cmd_link); + + return ESP_OK; +err: + if (cmd_link) { + i2c_cmd_link_delete_static(cmd_link); + } + return ret; +} + +static esp_err_t panel_io_i2c_tx_buffer(esp_lcd_panel_io_t *io, int lcd_cmd, const void *buffer, size_t buffer_size, bool is_param) +{ + esp_err_t ret = ESP_OK; + lcd_panel_io_i2c_t *i2c_panel_io = __containerof(io, lcd_panel_io_i2c_t, base); + bool send_param = (lcd_cmd >= 0); + + i2c_cmd_handle_t cmd_link = i2c_cmd_link_create_static(i2c_panel_io->cmdlink_buffer, CMD_HANDLER_BUFFER_SIZE); + ESP_GOTO_ON_FALSE(cmd_link, ESP_ERR_NO_MEM, err, TAG, "no mem for i2c cmd link"); + ESP_GOTO_ON_ERROR(i2c_master_start(cmd_link), err, TAG, "issue start failed"); // start phase + ESP_GOTO_ON_ERROR(i2c_master_write_byte(cmd_link, (i2c_panel_io->dev_addr << 1) | I2C_MASTER_WRITE, true), err, TAG, "write address failed"); // address phase + if (i2c_panel_io->control_phase_enabled) { + ESP_GOTO_ON_ERROR(i2c_master_write_byte(cmd_link, is_param ? i2c_panel_io->control_phase_cmd : i2c_panel_io->control_phase_data, true), + err, TAG, "write control phase failed"); // control phase + } + + // some displays don't want any additional commands on data transfers + if (send_param) { + uint8_t cmds[4] = {BYTESHIFT(lcd_cmd, 3), BYTESHIFT(lcd_cmd, 2), BYTESHIFT(lcd_cmd, 1), BYTESHIFT(lcd_cmd, 0)}; + size_t cmds_size = i2c_panel_io->lcd_cmd_bits / 8; + if (cmds_size > 0 && cmds_size <= sizeof(cmds)) { + ESP_GOTO_ON_ERROR(i2c_master_write(cmd_link, cmds + (sizeof(cmds) - cmds_size), cmds_size, true), err, TAG, "write LCD cmd failed"); + } + } + + if (buffer) { + ESP_GOTO_ON_ERROR(i2c_master_write(cmd_link, buffer, buffer_size, true), err, TAG, "write data failed"); + } + + ESP_GOTO_ON_ERROR(i2c_master_stop(cmd_link), err, TAG, "issue stop failed"); // stop phase + ESP_GOTO_ON_ERROR(i2c_master_cmd_begin(i2c_panel_io->i2c_bus_id, cmd_link, portMAX_DELAY), err, TAG, "i2c transaction failed"); + i2c_cmd_link_delete_static(cmd_link); + + if (!is_param) { + // trans done callback + if (i2c_panel_io->on_color_trans_done) { + i2c_panel_io->on_color_trans_done(&(i2c_panel_io->base), NULL, i2c_panel_io->user_ctx); + } + } + + return ESP_OK; +err: + if (cmd_link) { + i2c_cmd_link_delete_static(cmd_link); + } + return ret; +} + +static esp_err_t panel_io_i2c_rx_param(esp_lcd_panel_io_t *io, int lcd_cmd, void *param, size_t param_size) +{ + return panel_io_i2c_rx_buffer(io, lcd_cmd, param, param_size); +} + +static esp_err_t panel_io_i2c_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, const void *param, size_t param_size) +{ + return panel_io_i2c_tx_buffer(io, lcd_cmd, param, param_size, true); +} + +static esp_err_t panel_io_i2c_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, const void *color, size_t color_size) +{ + return panel_io_i2c_tx_buffer(io, lcd_cmd, color, color_size, false); +} diff --git a/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io_i2c_v2.c b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io_i2c_v2.c new file mode 100644 index 000000000..fa2c834ad --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io_i2c_v2.c @@ -0,0 +1,206 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include "sdkconfig.h" +#if CONFIG_LCD_ENABLE_DEBUG_LOG +// The local log level must be defined before including esp_log.h +// Set the maximum log level for this source file +#define LOG_LOCAL_LEVEL ESP_LOG_DEBUG +#endif +#include "esp_lcd_panel_io_interface.h" +#include "esp_lcd_panel_io.h" +#include "driver/i2c_master.h" +#include "driver/gpio.h" +#include "esp_log.h" +#include "esp_check.h" +#include "freertos/FreeRTOS.h" +#include "esp_heap_caps.h" +static const char *TAG = "lcd_panel.io.i2c"; + +#define BYTESHIFT(VAR, IDX) (((VAR) >> ((IDX) * 8)) & 0xFF) +#define CONTROL_PHASE_LENGTH (1) +#define CMD_LENGTH (4) + +static esp_err_t panel_io_i2c_del(esp_lcd_panel_io_t *io); +static esp_err_t panel_io_i2c_rx_param(esp_lcd_panel_io_t *io, int lcd_cmd, void *param, size_t param_size); +static esp_err_t panel_io_i2c_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, const void *param, size_t param_size); +static esp_err_t panel_io_i2c_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, const void *color, size_t color_size); +static esp_err_t panel_io_i2c_register_event_callbacks(esp_lcd_panel_io_handle_t io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx); + +typedef struct { + esp_lcd_panel_io_t base; // Base class of generic lcd panel io + i2c_master_dev_handle_t i2c_handle; // I2C master driver handle. + uint32_t dev_addr; // Device address + int lcd_cmd_bits; // Bit width of LCD command + int lcd_param_bits; // Bit width of LCD parameter + bool control_phase_enabled; // Is control phase enabled + uint32_t control_phase_cmd; // control byte when transferring command + uint32_t control_phase_data; // control byte when transferring data + esp_lcd_panel_io_color_trans_done_cb_t on_color_trans_done; // User register's callback, invoked when color data trans done + void *user_ctx; // User's private data, passed directly to callback on_color_trans_done() +} lcd_panel_io_i2c_t; + +esp_err_t esp_lcd_new_panel_io_i2c_v2(i2c_master_bus_handle_t bus, const esp_lcd_panel_io_i2c_config_t *io_config, esp_lcd_panel_io_handle_t *ret_io) +{ +#if CONFIG_LCD_ENABLE_DEBUG_LOG + esp_log_level_set(TAG, ESP_LOG_DEBUG); +#endif + esp_err_t ret = ESP_OK; + lcd_panel_io_i2c_t *i2c_panel_io = NULL; + i2c_master_dev_handle_t i2c_handle = NULL; + ESP_GOTO_ON_FALSE(io_config && ret_io, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + ESP_GOTO_ON_FALSE(io_config->control_phase_bytes * 8 > io_config->dc_bit_offset, ESP_ERR_INVALID_ARG, err, TAG, "D/C bit exceeds control bytes"); + i2c_panel_io = calloc(1, sizeof(lcd_panel_io_i2c_t)); + ESP_GOTO_ON_FALSE(i2c_panel_io, ESP_ERR_NO_MEM, err, TAG, "no mem for i2c panel io"); + + i2c_device_config_t i2c_lcd_cfg = { + .device_address = io_config->dev_addr, + .scl_speed_hz = io_config->scl_speed_hz, + }; + ESP_GOTO_ON_ERROR(i2c_master_bus_add_device(bus, &i2c_lcd_cfg, &i2c_handle), err, TAG, "i2c add device fail"); + + i2c_panel_io->i2c_handle = i2c_handle; + i2c_panel_io->lcd_cmd_bits = io_config->lcd_cmd_bits; + i2c_panel_io->lcd_param_bits = io_config->lcd_param_bits; + i2c_panel_io->on_color_trans_done = io_config->on_color_trans_done; + i2c_panel_io->user_ctx = io_config->user_ctx; + i2c_panel_io->control_phase_enabled = (!io_config->flags.disable_control_phase); + i2c_panel_io->control_phase_data = (!io_config->flags.dc_low_on_data) << (io_config->dc_bit_offset); + i2c_panel_io->control_phase_cmd = (io_config->flags.dc_low_on_data) << (io_config->dc_bit_offset); + i2c_panel_io->dev_addr = io_config->dev_addr; + i2c_panel_io->base.del = panel_io_i2c_del; + i2c_panel_io->base.rx_param = panel_io_i2c_rx_param; + i2c_panel_io->base.tx_param = panel_io_i2c_tx_param; + i2c_panel_io->base.tx_color = panel_io_i2c_tx_color; + i2c_panel_io->base.register_event_callbacks = panel_io_i2c_register_event_callbacks; + *ret_io = &(i2c_panel_io->base); + ESP_LOGD(TAG, "new i2c lcd panel io @%p", i2c_panel_io); + + return ESP_OK; +err: + if (i2c_panel_io) { + free(i2c_panel_io); + } + return ret; +} + +static esp_err_t panel_io_i2c_del(esp_lcd_panel_io_t *io) +{ + esp_err_t ret = ESP_OK; + lcd_panel_io_i2c_t *i2c_panel_io = __containerof(io, lcd_panel_io_i2c_t, base); + + ESP_LOGD(TAG, "del lcd panel io i2c @%p", i2c_panel_io); + ESP_ERROR_CHECK(i2c_master_bus_rm_device(i2c_panel_io->i2c_handle)); + free(i2c_panel_io); + return ret; +} + +static esp_err_t panel_io_i2c_register_event_callbacks(esp_lcd_panel_io_handle_t io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx) +{ + lcd_panel_io_i2c_t *i2c_panel_io = __containerof(io, lcd_panel_io_i2c_t, base); + + if (i2c_panel_io->on_color_trans_done != NULL) { + ESP_LOGW(TAG, "Callback on_color_trans_done was already set and now it was owerwritten!"); + } + + i2c_panel_io->on_color_trans_done = cbs->on_color_trans_done; + i2c_panel_io->user_ctx = user_ctx; + + return ESP_OK; +} + +static esp_err_t panel_io_i2c_rx_buffer(esp_lcd_panel_io_t *io, int lcd_cmd, void *buffer, size_t buffer_size) +{ + esp_err_t ret = ESP_OK; + lcd_panel_io_i2c_t *i2c_panel_io = __containerof(io, lcd_panel_io_i2c_t, base); + bool send_param = (lcd_cmd >= 0); + + int write_size = 0; + uint8_t write_buffer[CONTROL_PHASE_LENGTH + CMD_LENGTH] = {0}; + + if (send_param) { + if (i2c_panel_io->control_phase_enabled) { + write_buffer[0] = i2c_panel_io->control_phase_cmd; + write_size += 1; + + } + uint8_t cmds[4] = {BYTESHIFT(lcd_cmd, 3), BYTESHIFT(lcd_cmd, 2), BYTESHIFT(lcd_cmd, 1), BYTESHIFT(lcd_cmd, 0)}; + size_t cmds_size = i2c_panel_io->lcd_cmd_bits / 8; + if (cmds_size > 0 && cmds_size <= sizeof(cmds)) { + memcpy(write_buffer + write_size, cmds + (sizeof(cmds) - cmds_size), cmds_size); + write_size += cmds_size; + } + } + + ESP_GOTO_ON_ERROR(i2c_master_transmit_receive(i2c_panel_io->i2c_handle, write_buffer, write_size, buffer, buffer_size, -1), err, TAG, "i2c transaction failed"); + return ESP_OK; +err: + return ret; +} + +static esp_err_t panel_io_i2c_tx_buffer(esp_lcd_panel_io_t *io, int lcd_cmd, const void *buffer, size_t buffer_size, bool is_param) +{ + esp_err_t ret = ESP_OK; + lcd_panel_io_i2c_t *i2c_panel_io = __containerof(io, lcd_panel_io_i2c_t, base); + bool send_param = (lcd_cmd >= 0); + int write_size = 0; + uint8_t *write_buffer = (uint8_t*)heap_caps_malloc(CONTROL_PHASE_LENGTH + CMD_LENGTH + buffer_size, MALLOC_CAP_8BIT); + ESP_GOTO_ON_FALSE(write_buffer, ESP_ERR_NO_MEM, err, TAG, "no mem for write buffer"); + + if (i2c_panel_io->control_phase_enabled) { + write_buffer[0] = is_param ? i2c_panel_io->control_phase_cmd : i2c_panel_io->control_phase_data; + write_size += 1; + } + + // some displays don't want any additional commands on data transfers + if (send_param) { + uint8_t cmds[4] = {BYTESHIFT(lcd_cmd, 3), BYTESHIFT(lcd_cmd, 2), BYTESHIFT(lcd_cmd, 1), BYTESHIFT(lcd_cmd, 0)}; + size_t cmds_size = i2c_panel_io->lcd_cmd_bits / 8; + if (cmds_size > 0 && cmds_size <= sizeof(cmds)) { + memcpy(write_buffer + write_size, cmds + (sizeof(cmds) - cmds_size), cmds_size); + write_size += cmds_size; + } + } + + if (buffer) { + memcpy(write_buffer + write_size, buffer, buffer_size); + write_size += buffer_size; + } + + ESP_GOTO_ON_ERROR(i2c_master_transmit(i2c_panel_io->i2c_handle, write_buffer, write_size, -1), err, TAG, "i2c transaction failed"); + free(write_buffer); + if (!is_param) { + // trans done callback + if (i2c_panel_io->on_color_trans_done) { + i2c_panel_io->on_color_trans_done(&(i2c_panel_io->base), NULL, i2c_panel_io->user_ctx); + } + } + + return ESP_OK; +err: + if (write_buffer) { + free(write_buffer); + } + return ret; +} + +static esp_err_t panel_io_i2c_rx_param(esp_lcd_panel_io_t *io, int lcd_cmd, void *param, size_t param_size) +{ + return panel_io_i2c_rx_buffer(io, lcd_cmd, param, param_size); +} + +static esp_err_t panel_io_i2c_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, const void *param, size_t param_size) +{ + return panel_io_i2c_tx_buffer(io, lcd_cmd, param, param_size, true); +} + +static esp_err_t panel_io_i2c_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, const void *color, size_t color_size) +{ + return panel_io_i2c_tx_buffer(io, lcd_cmd, color, color_size, false); +} diff --git a/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io_i2s.c b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io_i2s.c new file mode 100644 index 000000000..a835f2655 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io_i2s.c @@ -0,0 +1,787 @@ +/* + * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Although we're manipulating I2S peripheral (on esp32/s2 target), it has nothing to do with the AUDIO BUS. +// In fact, we're simulating the Intel 8080 bus with I2S peripheral, in a special parallel mode. +///////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include "sdkconfig.h" +#if CONFIG_LCD_ENABLE_DEBUG_LOG +// The local log level must be defined before including esp_log.h +// Set the maximum log level for this source file +#define LOG_LOCAL_LEVEL ESP_LOG_DEBUG +#endif +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" +#include "esp_attr.h" +#include "esp_check.h" +#include "esp_intr_alloc.h" +#include "esp_heap_caps.h" +#include "esp_pm.h" +#include "esp_lcd_panel_io_interface.h" +#include "esp_lcd_panel_io.h" +#include "esp_lcd_common.h" +#include "esp_rom_gpio.h" +#include "soc/soc_caps.h" +#include "hal/dma_types.h" +#include "hal/gpio_hal.h" +#include "driver/gpio.h" +#include "esp_clk_tree.h" +#include "esp_private/periph_ctrl.h" +#include "esp_private/i2s_platform.h" +#include "soc/lcd_periph.h" +#include "hal/i2s_hal.h" +#include "hal/i2s_ll.h" +#include "hal/i2s_types.h" + +static const char *TAG = "lcd_panel.io.i80"; + +typedef struct esp_lcd_i80_bus_t esp_lcd_i80_bus_t; +typedef struct lcd_panel_io_i80_t lcd_panel_io_i80_t; +typedef struct lcd_i80_trans_descriptor_t lcd_i80_trans_descriptor_t; + +static esp_err_t panel_io_i80_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, const void *param, size_t param_size); +static esp_err_t panel_io_i80_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, const void *color, size_t color_size); +static esp_err_t panel_io_i80_del(esp_lcd_panel_io_t *io); +static esp_err_t i2s_lcd_select_periph_clock(esp_lcd_i80_bus_handle_t bus, lcd_clock_source_t src); +static esp_err_t i2s_lcd_init_dma_link(esp_lcd_i80_bus_handle_t bus); +static esp_err_t i2s_lcd_configure_gpio(esp_lcd_i80_bus_handle_t bus, const esp_lcd_i80_bus_config_t *bus_config); +static void i2s_lcd_trigger_quick_trans_done_event(esp_lcd_i80_bus_handle_t bus); +static void lcd_i80_switch_devices(lcd_panel_io_i80_t *cur_device, lcd_panel_io_i80_t *next_device); +static void lcd_default_isr_handler(void *args); +static esp_err_t panel_io_i80_register_event_callbacks(esp_lcd_panel_io_handle_t io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx); + +struct esp_lcd_i80_bus_t { + int bus_id; // Bus ID, index from 0 + portMUX_TYPE spinlock; // spinlock used to protect i80 bus members(hal, device_list, cur_trans) + i2s_hal_context_t hal; // Hal object + size_t bus_width; // Number of data lines + int dc_gpio_num; // GPIO used for DC line + int wr_gpio_num; // GPIO used for WR line + intr_handle_t intr; // LCD peripheral interrupt handle + esp_pm_lock_handle_t pm_lock; // lock APB frequency when necessary + size_t num_dma_nodes; // Number of DMA descriptors + uint8_t *format_buffer;// The driver allocates an internal buffer for DMA to do data format transformer + unsigned long resolution_hz; // LCD_CLK resolution, determined by selected clock source + lcd_i80_trans_descriptor_t *cur_trans; // Current transaction + lcd_panel_io_i80_t *cur_device; // Current working device + LIST_HEAD(i80_device_list, lcd_panel_io_i80_t) device_list; // Head of i80 device list + struct { + unsigned int exclusive: 1; // Indicate whether the I80 bus is owned by one device (whose CS GPIO is not assigned) exclusively + } flags; + dma_descriptor_t dma_nodes[]; // DMA descriptor pool, the descriptors are shared by all i80 devices +}; + +struct lcd_i80_trans_descriptor_t { + lcd_panel_io_i80_t *i80_device; // i80 device issuing this transaction + const void *data; // Data buffer + uint32_t data_length; // Data buffer size + esp_lcd_panel_io_color_trans_done_cb_t trans_done_cb; // transaction done callback + void *user_ctx; // private data used by trans_done_cb + struct { + unsigned int dc_level: 1; // Level of DC line for this transaction + } flags; +}; + +struct lcd_panel_io_i80_t { + esp_lcd_panel_io_t base; // Base class of generic lcd panel io + esp_lcd_i80_bus_t *bus; // Which bus the device is attached to + int cs_gpio_num; // GPIO used for CS line + uint32_t pclk_hz; // PCLK clock frequency + size_t clock_prescale; // Prescaler coefficient, determined by user's configured PCLK frequency + QueueHandle_t trans_queue; // Transaction queue, transactions in this queue are pending for scheduler to dispatch + QueueHandle_t done_queue; // Transaction done queue, transactions in this queue are finished but not recycled by the caller + size_t queue_size; // Size of transaction queue + size_t num_trans_inflight; // Number of transactions that are undergoing (the descriptor not recycled yet) + int lcd_cmd_bits; // Bit width of LCD command + int lcd_param_bits; // Bit width of LCD parameter + void *user_ctx; // private data used when transfer color data + esp_lcd_panel_io_color_trans_done_cb_t on_color_trans_done; // color data trans done callback + LIST_ENTRY(lcd_panel_io_i80_t) device_list_entry; // Entry of i80 device list + struct { + unsigned int dc_cmd_level: 1; // Level of DC line in CMD phase + unsigned int dc_data_level: 1; // Level of DC line in DATA phase + } dc_levels; + struct { + unsigned int cs_active_high: 1; // Whether the CS line is active on high level + unsigned int swap_color_bytes: 1; // Swap adjacent two data bytes before sending out + unsigned int pclk_idle_low: 1; // The WR line keeps at low level in IDLE phase + } flags; + lcd_i80_trans_descriptor_t trans_pool[]; // Transaction pool +}; + +esp_err_t esp_lcd_new_i80_bus(const esp_lcd_i80_bus_config_t *bus_config, esp_lcd_i80_bus_handle_t *ret_bus) +{ +#if CONFIG_LCD_ENABLE_DEBUG_LOG + esp_log_level_set(TAG, ESP_LOG_DEBUG); +#endif + esp_err_t ret = ESP_OK; + esp_lcd_i80_bus_t *bus = NULL; + ESP_GOTO_ON_FALSE(bus_config && ret_bus, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + // although I2S bus supports up to 24 parallel data lines, we restrict users to only use 8 or 16 bit width, due to limited GPIO numbers + ESP_GOTO_ON_FALSE(bus_config->bus_width == 8 || bus_config->bus_width == 16, ESP_ERR_INVALID_ARG, err, + TAG, "invalid bus width:%d", bus_config->bus_width); + size_t max_transfer_bytes = (bus_config->max_transfer_bytes + 3) & ~0x03; // align up to 4 bytes +#if SOC_I2S_TRANS_SIZE_ALIGN_WORD + // double the size of the internal DMA buffer if bus_width is 8, + // because one I2S FIFO (4 bytes) will only contain two bytes of valid data + max_transfer_bytes = max_transfer_bytes * 16 / bus_config->bus_width + 4; +#endif + size_t num_dma_nodes = max_transfer_bytes / DMA_DESCRIPTOR_BUFFER_MAX_SIZE + 1; + // DMA descriptors must be placed in internal SRAM + bus = heap_caps_calloc(1, sizeof(esp_lcd_i80_bus_t) + num_dma_nodes * sizeof(dma_descriptor_t), MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA); + ESP_GOTO_ON_FALSE(bus, ESP_ERR_NO_MEM, err, TAG, "no mem for i80 bus"); + bus->num_dma_nodes = num_dma_nodes; + bus->bus_id = -1; +#if SOC_I2S_TRANS_SIZE_ALIGN_WORD + // transform format for LCD commands, parameters and color data, so we need a big buffer + bus->format_buffer = heap_caps_calloc(1, max_transfer_bytes, MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA); +#else + // only transform format for LCD parameters, buffer size depends on specific LCD, set at compile time + bus->format_buffer = heap_caps_calloc(1, CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE, MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA); +#endif // SOC_I2S_TRANS_SIZE_ALIGN_WORD + ESP_GOTO_ON_FALSE(bus->format_buffer, ESP_ERR_NO_MEM, err, TAG, "no mem for format buffer"); + // LCD mode can't work with other modes at the same time, we need to register the driver object to the I2S platform + int bus_id = -1; + for (int i = 0; i < SOC_LCD_I80_BUSES; i++) { + if (i2s_platform_acquire_occupation(i, "esp_lcd_panel_io_i2s") == ESP_OK) { + bus_id = i; + break; + } + } + ESP_GOTO_ON_FALSE(bus_id != -1, ESP_ERR_NOT_FOUND, err, TAG, "no free i80 bus slot"); + bus->bus_id = bus_id; + // initialize HAL layer + i2s_hal_init(&bus->hal, bus->bus_id); + // set peripheral clock resolution + ret = i2s_lcd_select_periph_clock(bus, bus_config->clk_src); + ESP_GOTO_ON_ERROR(ret, err, TAG, "select periph clock failed"); + // reset peripheral, DMA channel and FIFO + i2s_ll_tx_reset(bus->hal.dev); + i2s_ll_tx_reset_dma(bus->hal.dev); + i2s_ll_tx_reset_fifo(bus->hal.dev); + // install interrupt service, (I2S LCD mode only uses the "TX Unit", which leaves "RX Unit" for other purpose) + // So the interrupt should also be able to share with other functionality + int isr_flags = LCD_I80_INTR_ALLOC_FLAGS | ESP_INTR_FLAG_SHARED | ESP_INTR_FLAG_LOWMED; + ret = esp_intr_alloc_intrstatus(lcd_periph_signals.buses[bus->bus_id].irq_id, isr_flags, + (uint32_t)i2s_ll_get_intr_status_reg(bus->hal.dev), + I2S_LL_EVENT_TX_EOF, lcd_default_isr_handler, bus, &bus->intr); + ESP_GOTO_ON_ERROR(ret, err, TAG, "install interrupt failed"); + i2s_ll_enable_intr(bus->hal.dev, I2S_LL_EVENT_TX_EOF, false); // disable interrupt temporarily + i2s_ll_clear_intr_status(bus->hal.dev, I2S_LL_EVENT_TX_EOF); // clear pending interrupt + // initialize DMA link + i2s_lcd_init_dma_link(bus); + // enable I2S LCD master mode (refer to I2S TRM) + i2s_ll_enable_lcd(bus->hal.dev, true); + i2s_ll_tx_stop_on_fifo_empty(bus->hal.dev, true); + i2s_ll_tx_bypass_pcm(bus->hal.dev, true); + i2s_ll_tx_set_slave_mod(bus->hal.dev, false); + i2s_ll_tx_set_bits_mod(bus->hal.dev, bus_config->bus_width); + i2s_ll_tx_select_std_slot(bus->hal.dev, I2S_STD_SLOT_BOTH, true); // copy mono + bus->bus_width = bus_config->bus_width; + i2s_ll_tx_enable_right_first(bus->hal.dev, true); +#if SOC_I2S_SUPPORTS_DMA_EQUAL + i2s_ll_tx_enable_dma_equal(bus->hal.dev, true); +#endif + // enable trans done interrupt + i2s_ll_enable_intr(bus->hal.dev, I2S_LL_EVENT_TX_EOF, true); + // trigger a quick "trans done" event, and wait for the interrupt line goes active + // this could ensure we go into ISR handler next time we call `esp_intr_enable` + i2s_lcd_trigger_quick_trans_done_event(bus); + // configure GPIO + ret = i2s_lcd_configure_gpio(bus, bus_config); + ESP_GOTO_ON_ERROR(ret, err, TAG, "configure GPIO failed"); + // fill other i80 bus runtime parameters + LIST_INIT(&bus->device_list); // initialize device list head + bus->spinlock = (portMUX_TYPE)portMUX_INITIALIZER_UNLOCKED; + bus->dc_gpio_num = bus_config->dc_gpio_num; + bus->wr_gpio_num = bus_config->wr_gpio_num; + *ret_bus = bus; + ESP_LOGD(TAG, "new i80 bus(%d) @%p, %zu dma nodes, resolution %luHz", bus->bus_id, bus, bus->num_dma_nodes, bus->resolution_hz); + return ESP_OK; + +err: + if (bus) { + if (bus->intr) { + esp_intr_free(bus->intr); + } + if (bus->bus_id >= 0) { + i2s_platform_release_occupation(bus->bus_id); + } + if (bus->format_buffer) { + free(bus->format_buffer); + } + if (bus->pm_lock) { + esp_pm_lock_delete(bus->pm_lock); + } + free(bus); + } + return ret; +} + +esp_err_t esp_lcd_del_i80_bus(esp_lcd_i80_bus_handle_t bus) +{ + esp_err_t ret = ESP_OK; + ESP_GOTO_ON_FALSE(bus, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + ESP_GOTO_ON_FALSE(LIST_EMPTY(&bus->device_list), ESP_ERR_INVALID_STATE, err, TAG, "device list not empty"); + int bus_id = bus->bus_id; + i2s_platform_release_occupation(bus_id); + esp_intr_free(bus->intr); + if (bus->pm_lock) { + esp_pm_lock_delete(bus->pm_lock); + } + free(bus->format_buffer); + free(bus); + ESP_LOGD(TAG, "del i80 bus(%d)", bus_id); +err: + return ret; +} + +esp_err_t esp_lcd_new_panel_io_i80(esp_lcd_i80_bus_handle_t bus, const esp_lcd_panel_io_i80_config_t *io_config, esp_lcd_panel_io_handle_t *ret_io) +{ + esp_err_t ret = ESP_OK; + lcd_panel_io_i80_t *i80_device = NULL; + bool bus_exclusive = false; + ESP_GOTO_ON_FALSE(bus && io_config && ret_io, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + // check if the bus has been configured as exclusive + portENTER_CRITICAL(&bus->spinlock); + if (!bus->flags.exclusive) { + bus->flags.exclusive = io_config->cs_gpio_num < 0; + } else { + bus_exclusive = true; + } + portEXIT_CRITICAL(&bus->spinlock); + ESP_GOTO_ON_FALSE(!bus_exclusive, ESP_ERR_INVALID_STATE, err, TAG, "bus has been exclusively owned by device"); + // because we set the I2S's left channel data same to right channel, so f_pclk = f_i2s/pclk_div/2 + uint32_t pclk_prescale = bus->resolution_hz / 2 / io_config->pclk_hz; + ESP_GOTO_ON_FALSE(pclk_prescale > 0 && pclk_prescale <= I2S_LL_BCK_MAX_PRESCALE, ESP_ERR_NOT_SUPPORTED, err, TAG, + "prescaler can't satisfy PCLK clock %"PRIu32"Hz", io_config->pclk_hz); + i80_device = heap_caps_calloc(1, sizeof(lcd_panel_io_i80_t) + io_config->trans_queue_depth * sizeof(lcd_i80_trans_descriptor_t), LCD_I80_MEM_ALLOC_CAPS); + ESP_GOTO_ON_FALSE(i80_device, ESP_ERR_NO_MEM, err, TAG, "no mem for i80 panel io"); + // create two queues for i80 device + i80_device->trans_queue = xQueueCreate(io_config->trans_queue_depth, sizeof(lcd_i80_trans_descriptor_t *)); + ESP_GOTO_ON_FALSE(i80_device->trans_queue, ESP_ERR_NO_MEM, err, TAG, "create trans queue failed"); + i80_device->done_queue = xQueueCreate(io_config->trans_queue_depth, sizeof(lcd_i80_trans_descriptor_t *)); + ESP_GOTO_ON_FALSE(i80_device->done_queue, ESP_ERR_NO_MEM, err, TAG, "create done queue failed"); + // adding device to list + portENTER_CRITICAL(&bus->spinlock); + LIST_INSERT_HEAD(&bus->device_list, i80_device, device_list_entry); + portEXIT_CRITICAL(&bus->spinlock); + // we don't initialize the i80 bus at the memont, but initialize the bus when start a transaction for a new device + // so save these as i80 device runtime parameters + i80_device->bus = bus; + i80_device->queue_size = io_config->trans_queue_depth; + i80_device->clock_prescale = pclk_prescale; + i80_device->lcd_cmd_bits = io_config->lcd_cmd_bits; + i80_device->lcd_param_bits = io_config->lcd_param_bits; + i80_device->pclk_hz = bus->resolution_hz / pclk_prescale / 2; + i80_device->dc_levels.dc_cmd_level = io_config->dc_levels.dc_cmd_level; + i80_device->dc_levels.dc_data_level = io_config->dc_levels.dc_data_level; + i80_device->cs_gpio_num = io_config->cs_gpio_num; + i80_device->on_color_trans_done = io_config->on_color_trans_done; + i80_device->user_ctx = io_config->user_ctx; + i80_device->flags.cs_active_high = io_config->flags.cs_active_high; + i80_device->flags.swap_color_bytes = io_config->flags.swap_color_bytes; + i80_device->flags.pclk_idle_low = io_config->flags.pclk_idle_low; + // fill panel io function table + i80_device->base.del = panel_io_i80_del; + i80_device->base.tx_param = panel_io_i80_tx_param; + i80_device->base.tx_color = panel_io_i80_tx_color; + i80_device->base.register_event_callbacks = panel_io_i80_register_event_callbacks; + if (io_config->cs_gpio_num >= 0) { + // CS signal is controlled by software + gpio_set_level(io_config->cs_gpio_num, !io_config->flags.cs_active_high); // de-assert by default + gpio_set_direction(io_config->cs_gpio_num, GPIO_MODE_OUTPUT); + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[io_config->cs_gpio_num], PIN_FUNC_GPIO); + } + *ret_io = &(i80_device->base); + ESP_LOGD(TAG, "new i80 lcd panel io @%p on bus(%d), pclk=%"PRIu32"Hz", i80_device, bus->bus_id, i80_device->pclk_hz); + return ESP_OK; + +err: + if (i80_device) { + if (i80_device->trans_queue) { + vQueueDelete(i80_device->trans_queue); + } + if (i80_device->done_queue) { + vQueueDelete(i80_device->done_queue); + } + free(i80_device); + } + return ret; +} + +static esp_err_t panel_io_i80_del(esp_lcd_panel_io_t *io) +{ + lcd_panel_io_i80_t *i80_device = __containerof(io, lcd_panel_io_i80_t, base); + esp_lcd_i80_bus_t *bus = i80_device->bus; + lcd_i80_trans_descriptor_t *trans_desc = NULL; + size_t num_trans_inflight = i80_device->num_trans_inflight; + // wait all pending transaction to finish + for (size_t i = 0; i < num_trans_inflight; i++) { + ESP_RETURN_ON_FALSE(xQueueReceive(i80_device->done_queue, &trans_desc, portMAX_DELAY) == pdTRUE, + ESP_FAIL, TAG, "recycle inflight transactions failed"); + i80_device->num_trans_inflight--; + } + // remove from device list + portENTER_CRITICAL(&bus->spinlock); + LIST_REMOVE(i80_device, device_list_entry); + portEXIT_CRITICAL(&bus->spinlock); + + // reset CS GPIO + if (i80_device->cs_gpio_num >= 0) { + gpio_reset_pin(i80_device->cs_gpio_num); + } + + ESP_LOGD(TAG, "del i80 lcd panel io @%p", i80_device); + vQueueDelete(i80_device->trans_queue); + vQueueDelete(i80_device->done_queue); + free(i80_device); + return ESP_OK; +} + +static esp_err_t panel_io_i80_register_event_callbacks(esp_lcd_panel_io_handle_t io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx) +{ + lcd_panel_io_i80_t *i80_device = __containerof(io, lcd_panel_io_i80_t, base); + + if (i80_device->on_color_trans_done != NULL) { + ESP_LOGW(TAG, "Callback on_color_trans_done was already set and now it was owerwritten!"); + } + + i80_device->on_color_trans_done = cbs->on_color_trans_done; + i80_device->user_ctx = user_ctx; + + return ESP_OK; +} + +static void i2s_lcd_prepare_cmd_buffer(lcd_i80_trans_descriptor_t *trans_desc, const void *cmd) +{ + lcd_panel_io_i80_t *i80_device = trans_desc->i80_device; + esp_lcd_i80_bus_t *bus = i80_device->bus; + uint8_t *from = (uint8_t *)cmd; + // LCD is big-endian, e.g. to send command 0x1234, byte 0x12 should appear on the data bus first + // However, the I2S peripheral will send 0x34 first, so we reversed the order below + if (bus->bus_width < i80_device->lcd_cmd_bits) { + int start = 0; + int end = i80_device->lcd_cmd_bits / 8 - 1; + lcd_com_reverse_buffer_bytes(from, start, end); + } +#if SOC_I2S_TRANS_SIZE_ALIGN_WORD + uint8_t *to = bus->format_buffer; + int cmd_cycle = i80_device->lcd_cmd_bits / bus->bus_width; + if (cmd_cycle * bus->bus_width < i80_device->lcd_cmd_bits) { + cmd_cycle++; + } + int bytes_to_copy = MIN(bus->bus_width, i80_device->lcd_cmd_bits) / 8; + int cnt_from = 0; + // format command buffer + for (int i = 0; i < cmd_cycle; i++) { + for (int j = 0; j < bytes_to_copy; j++) { + to[2 + j] = from[cnt_from++]; + } + to += 4; + } + trans_desc->data = bus->format_buffer; + trans_desc->data_length = cmd_cycle * 4; +#else + trans_desc->data = cmd; + trans_desc->data_length = MAX(i80_device->lcd_cmd_bits, bus->bus_width) / 8; +#endif +} + +static void i2s_lcd_prepare_param_buffer(lcd_i80_trans_descriptor_t *trans_desc, const void *param, size_t param_num) +{ + lcd_panel_io_i80_t *i80_device = trans_desc->i80_device; + esp_lcd_i80_bus_t *bus = i80_device->bus; + uint8_t *from = (uint8_t *)param; + int param_size = i80_device->lcd_param_bits / 8; + // LCD is big-endian, e.g. to send param 0x1234, byte 0x12 should appear on the data bus first + // However, the I2S peripheral will send 0x34 first, so we reversed the order below + if (bus->bus_width < i80_device->lcd_param_bits) { + for (size_t i = 0; i < param_num; i++) { + int start = i * param_size; + int end = start + param_size - 1; + lcd_com_reverse_buffer_bytes(from, start, end); + } + } +#if SOC_I2S_TRANS_SIZE_ALIGN_WORD + uint8_t *to = bus->format_buffer; + int param_cycle = i80_device->lcd_param_bits / bus->bus_width; + if (param_cycle * bus->bus_width < i80_device->lcd_param_bits) { + param_cycle++; + } + int ele_cycles = param_cycle * param_num; + int bytes_to_copy = MIN(bus->bus_width, i80_device->lcd_param_bits) / 8; + int cnt_from = 0; + // format parameter buffer + for (int i = 0; i < ele_cycles; i++) { + for (int j = 0; j < bytes_to_copy; j++) { + to[2 + j] = from[cnt_from++]; + } + to += 4; + } + trans_desc->data = bus->format_buffer; + trans_desc->data_length = ele_cycles * 4; +#else + uint8_t *to = bus->format_buffer; + uint8_t step = bus->bus_width / 8; + int param_cycle = i80_device->lcd_param_bits / bus->bus_width; + if (param_cycle * bus->bus_width < i80_device->lcd_param_bits) { + param_cycle++; + } + int ele_cycles = param_cycle * param_num; + int bytes_to_copy = MIN(bus->bus_width, i80_device->lcd_param_bits) / 8; + int cnt_from = 0; + // format parameter buffer + for (int i = 0; i < ele_cycles; i++) { + for (int j = 0; j < bytes_to_copy; j++) { + to[j] = from[cnt_from++]; + } + to += step; + } + trans_desc->data = bus->format_buffer; + trans_desc->data_length = to - bus->format_buffer; +#endif +} + +static void i2s_lcd_prepare_color_buffer(lcd_i80_trans_descriptor_t *trans_desc, const void *color, size_t color_size) +{ +#if SOC_I2S_TRANS_SIZE_ALIGN_WORD + lcd_panel_io_i80_t *i80_device = trans_desc->i80_device; + esp_lcd_i80_bus_t *bus = i80_device->bus; + uint8_t *from = (uint8_t *)color; + uint8_t *to = bus->format_buffer; + int bytes_to_copy = bus->bus_width / 8; + int cnt_from = 0; + int first_half = i80_device->flags.swap_color_bytes ? 0 : 2; + int second_half = i80_device->flags.swap_color_bytes ? 2 : 0; + // format color buffer + while (cnt_from < color_size) { + for (int i = 0; i < bytes_to_copy; i++) { + to[first_half + i] = from[cnt_from++]; + } + for (int i = 0; i < bytes_to_copy; i++) { + to[second_half + i] = from[cnt_from++]; + } + to += 4; + } + trans_desc->data = bus->format_buffer; + trans_desc->data_length = to - bus->format_buffer; +#else + trans_desc->data = color; + trans_desc->data_length = color_size; +#endif +} + +static esp_err_t panel_io_i80_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, const void *param, size_t param_size) +{ + lcd_panel_io_i80_t *next_device = __containerof(io, lcd_panel_io_i80_t, base); + esp_lcd_i80_bus_t *bus = next_device->bus; + lcd_panel_io_i80_t *cur_device = bus->cur_device; + lcd_i80_trans_descriptor_t *trans_desc = NULL; + assert(param_size <= (bus->num_dma_nodes * DMA_DESCRIPTOR_BUFFER_MAX_SIZE) && "parameter bytes too long, enlarge max_transfer_bytes"); + assert(param_size <= CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE && "format buffer too small, increase CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE"); + size_t num_trans_inflight = next_device->num_trans_inflight; + // before issue a polling transaction, need to wait queued transactions finished + for (size_t i = 0; i < num_trans_inflight; i++) { + ESP_RETURN_ON_FALSE(xQueueReceive(next_device->done_queue, &trans_desc, portMAX_DELAY) == pdTRUE, + ESP_FAIL, TAG, "recycle inflight transactions failed"); + next_device->num_trans_inflight--; + } + + i2s_ll_clear_intr_status(bus->hal.dev, I2S_LL_EVENT_TX_EOF); + // switch devices if necessary + lcd_i80_switch_devices(cur_device, next_device); + trans_desc = &next_device->trans_pool[0]; + trans_desc->i80_device = next_device; + trans_desc->trans_done_cb = NULL; // no callback for command transfer + bus->cur_trans = trans_desc; +#if SOC_I2S_TRANS_SIZE_ALIGN_WORD + // switch to I2S 32bits mode, one WS cycle <=> one I2S FIFO + i2s_ll_tx_set_bits_mod(bus->hal.dev, 32); +#endif + i2s_lcd_prepare_cmd_buffer(trans_desc, &lcd_cmd); + lcd_com_mount_dma_data(bus->dma_nodes, trans_desc->data, trans_desc->data_length); + gpio_set_level(bus->dc_gpio_num, next_device->dc_levels.dc_cmd_level); + i2s_ll_tx_stop(bus->hal.dev); + i2s_ll_tx_reset(bus->hal.dev); // reset TX engine first + i2s_ll_start_out_link(bus->hal.dev); + // delay a while, wait for DMA data beeing feed to I2S FIFO + // in fact, this is only needed when LCD pixel clock is set too high + esp_rom_delay_us(1); + // increase the pm lock reference count before starting a new transaction + if (bus->pm_lock) { + esp_pm_lock_acquire(bus->pm_lock); + } + i2s_ll_tx_start(bus->hal.dev); + // polling the trans done event + while (!(i2s_ll_get_intr_status(bus->hal.dev) & I2S_LL_EVENT_TX_EOF)) {} + + // parameter is usually short, using polling mode + if (param && param_size) { + i2s_ll_clear_intr_status(bus->hal.dev, I2S_LL_EVENT_TX_EOF); + i2s_lcd_prepare_param_buffer(trans_desc, param, param_size * 8 / next_device->lcd_param_bits); + lcd_com_mount_dma_data(bus->dma_nodes, trans_desc->data, trans_desc->data_length); + gpio_set_level(bus->dc_gpio_num, next_device->dc_levels.dc_data_level); + i2s_ll_tx_stop(bus->hal.dev); + i2s_ll_tx_reset(bus->hal.dev); // reset TX engine first + i2s_ll_start_out_link(bus->hal.dev); + esp_rom_delay_us(1); + i2s_ll_tx_start(bus->hal.dev); + // polling the trans done event, but don't clear the event status + while (!(i2s_ll_get_intr_status(bus->hal.dev) & I2S_LL_EVENT_TX_EOF)) {} + } + // decrease pm lock reference count + if (bus->pm_lock) { + esp_pm_lock_release(bus->pm_lock); + } + bus->cur_trans = NULL; + return ESP_OK; +} + +static esp_err_t panel_io_i80_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, const void *color, size_t color_size) +{ + lcd_panel_io_i80_t *next_device = __containerof(io, lcd_panel_io_i80_t, base); + esp_lcd_i80_bus_t *bus = next_device->bus; + lcd_panel_io_i80_t *cur_device = bus->cur_device; + lcd_i80_trans_descriptor_t *trans_desc = NULL; + assert(color_size <= (bus->num_dma_nodes * DMA_DESCRIPTOR_BUFFER_MAX_SIZE) && "color bytes too long, enlarge max_transfer_bytes"); + size_t num_trans_inflight = next_device->num_trans_inflight; + // before issue a polling transaction, need to wait queued transactions finished + for (size_t i = 0; i < num_trans_inflight; i++) { + ESP_RETURN_ON_FALSE(xQueueReceive(next_device->done_queue, &trans_desc, portMAX_DELAY) == pdTRUE, + ESP_FAIL, TAG, "recycle inflight transactions failed"); + next_device->num_trans_inflight--; + } + + i2s_ll_clear_intr_status(bus->hal.dev, I2S_LL_EVENT_TX_EOF); + // switch devices if necessary + lcd_i80_switch_devices(cur_device, next_device); + trans_desc = &next_device->trans_pool[0]; + trans_desc->i80_device = next_device; + trans_desc->trans_done_cb = NULL; // no callback for command transfer + bus->cur_trans = trans_desc; +#if SOC_I2S_TRANS_SIZE_ALIGN_WORD + // switch to I2S 32bits mode, one WS cycle <=> one I2S FIFO + i2s_ll_tx_set_bits_mod(bus->hal.dev, 32); +#endif + i2s_lcd_prepare_cmd_buffer(trans_desc, &lcd_cmd); + lcd_com_mount_dma_data(bus->dma_nodes, trans_desc->data, trans_desc->data_length); + gpio_set_level(bus->dc_gpio_num, next_device->dc_levels.dc_cmd_level); + i2s_ll_tx_stop(bus->hal.dev); + i2s_ll_tx_reset(bus->hal.dev); // reset TX engine first + i2s_ll_start_out_link(bus->hal.dev); + esp_rom_delay_us(1); + // increase the pm lock reference count before starting a new transaction + if (bus->pm_lock) { + esp_pm_lock_acquire(bus->pm_lock); + } + i2s_ll_tx_start(bus->hal.dev); + // polling the trans done event + while (!(i2s_ll_get_intr_status(bus->hal.dev) & I2S_LL_EVENT_TX_EOF)) {} + // decrease pm lock reference count + if (bus->pm_lock) { + esp_pm_lock_release(bus->pm_lock); + } + bus->cur_trans = NULL; + + // sending LCD color data to queue + trans_desc->trans_done_cb = next_device->on_color_trans_done; + trans_desc->user_ctx = next_device->user_ctx; + trans_desc->flags.dc_level = next_device->dc_levels.dc_data_level; // DC level for data transaction + i2s_lcd_prepare_color_buffer(trans_desc, color, color_size); + // send transaction to trans_queue + xQueueSend(next_device->trans_queue, &trans_desc, portMAX_DELAY); + next_device->num_trans_inflight++; + // enable interrupt and go into isr handler, where we fetch the transactions from trans_queue and start it + // we will go into `lcd_default_isr_handler` almost at once, because the "trans done" event is active at the moment + esp_intr_enable(bus->intr); + return ESP_OK; +} + +static esp_err_t i2s_lcd_select_periph_clock(esp_lcd_i80_bus_handle_t bus, lcd_clock_source_t src) +{ + // get clock source frequency + uint32_t src_clk_hz = 0; + ESP_RETURN_ON_ERROR(esp_clk_tree_src_get_freq_hz((soc_module_clk_t)src, ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED, &src_clk_hz), + TAG, "get clock source frequency failed"); + + // I2S clock source is binary compatible with lcd_clock_source_t + i2s_ll_tx_clk_set_src(bus->hal.dev, (i2s_clock_src_t)src); + i2s_ll_set_raw_mclk_div(bus->hal.dev, LCD_PERIPH_CLOCK_PRE_SCALE, 1, 0); + // save the resolution of the i80 bus + bus->resolution_hz = src_clk_hz / LCD_PERIPH_CLOCK_PRE_SCALE; + + // create pm lock based on different clock source + // clock sources like PLL and XTAL will be turned off in light sleep +#if CONFIG_PM_ENABLE + ESP_RETURN_ON_ERROR(esp_pm_lock_create(ESP_PM_NO_LIGHT_SLEEP, 0, "i80_bus_lcd", &bus->pm_lock), TAG, "create pm lock failed"); +#endif + return ESP_OK; +} + +static esp_err_t i2s_lcd_init_dma_link(esp_lcd_i80_bus_handle_t bus) +{ + for (int i = 0; i < bus->num_dma_nodes; i++) { + bus->dma_nodes[i].dw0.owner = DMA_DESCRIPTOR_BUFFER_OWNER_CPU; + bus->dma_nodes[i].next = &bus->dma_nodes[i + 1]; + } + bus->dma_nodes[bus->num_dma_nodes - 1].next = NULL; // one-off DMA chain + i2s_ll_dma_enable_eof_on_fifo_empty(bus->hal.dev, true); + i2s_ll_dma_enable_owner_check(bus->hal.dev, true); + i2s_ll_dma_enable_auto_write_back(bus->hal.dev, true); + i2s_ll_set_out_link_addr(bus->hal.dev, (uint32_t)bus->dma_nodes); + i2s_ll_enable_dma(bus->hal.dev, true); + return ESP_OK; +} + +static esp_err_t i2s_lcd_configure_gpio(esp_lcd_i80_bus_handle_t bus, const esp_lcd_i80_bus_config_t *bus_config) +{ + int bus_id = bus->bus_id; + // check validation of GPIO number + bool valid_gpio = (bus_config->wr_gpio_num >= 0) && (bus_config->dc_gpio_num >= 0); + for (size_t i = 0; i < bus_config->bus_width; i++) { + valid_gpio = valid_gpio && (bus_config->data_gpio_nums[i] >= 0); + } + if (!valid_gpio) { + return ESP_ERR_INVALID_ARG; + } + // connect peripheral signals via GPIO matrix + // data line + for (size_t i = 0; i < bus_config->bus_width; i++) { + gpio_set_direction(bus_config->data_gpio_nums[i], GPIO_MODE_OUTPUT); +#if SOC_I2S_TRANS_SIZE_ALIGN_WORD + esp_rom_gpio_connect_out_signal(bus_config->data_gpio_nums[i], lcd_periph_signals.buses[bus_id].data_sigs[i + 8], false, false); +#else + esp_rom_gpio_connect_out_signal(bus_config->data_gpio_nums[i], lcd_periph_signals.buses[bus_id].data_sigs[i + SOC_LCD_I80_BUS_WIDTH - bus_config->bus_width], false, false); +#endif + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[bus_config->data_gpio_nums[i]], PIN_FUNC_GPIO); + } + // WR signal (pclk) + gpio_set_direction(bus_config->wr_gpio_num, GPIO_MODE_OUTPUT); + esp_rom_gpio_connect_out_signal(bus_config->wr_gpio_num, lcd_periph_signals.buses[bus_id].wr_sig, true, false); + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[bus_config->wr_gpio_num], PIN_FUNC_GPIO); + // DC signal is controlled by software, set as general purpose IO + gpio_set_direction(bus_config->dc_gpio_num, GPIO_MODE_OUTPUT); + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[bus_config->dc_gpio_num], PIN_FUNC_GPIO); + return ESP_OK; +} + +static void i2s_lcd_trigger_quick_trans_done_event(esp_lcd_i80_bus_handle_t bus) +{ + // trigger a quick interrupt event by a dummy transaction, wait the LCD interrupt line goes active + // next time when esp_intr_enable is invoked, we can go into interrupt handler immediately + // where we dispatch transactions for i80 devices + static uint32_t fake_trigger = 0; + lcd_com_mount_dma_data(bus->dma_nodes, &fake_trigger, 4); + i2s_ll_start_out_link(bus->hal.dev); + i2s_ll_tx_start(bus->hal.dev); + while (!(i2s_ll_get_intr_status(bus->hal.dev) & I2S_LL_EVENT_TX_EOF)) {} +} + +static void lcd_i80_switch_devices(lcd_panel_io_i80_t *cur_device, lcd_panel_io_i80_t *next_device) +{ + // the caller should make sure the next_device and cur_device are attached to the same bus + esp_lcd_i80_bus_t *bus = next_device->bus; + if (next_device != cur_device) { + // reconfigure PCLK for the new device + i2s_ll_tx_set_bck_div_num(bus->hal.dev, next_device->clock_prescale); + if (cur_device && cur_device->cs_gpio_num >= 0) { // de-assert current device + gpio_set_level(cur_device->cs_gpio_num, !cur_device->flags.cs_active_high); + } + if (next_device->cs_gpio_num >= 0) { + gpio_set_level(next_device->cs_gpio_num, next_device->flags.cs_active_high); // select the next device + } + // the WR signal (a.k.a the PCLK) generated by I2S is low level in idle stage + // but most of 8080 LCDs require the WR line to be in high level during idle stage + esp_rom_gpio_connect_out_signal(bus->wr_gpio_num, lcd_periph_signals.buses[bus->bus_id].wr_sig, !next_device->flags.pclk_idle_low, false); + } + bus->cur_device = next_device; +} + +static IRAM_ATTR void lcd_default_isr_handler(void *args) +{ + esp_lcd_i80_bus_t *bus = (esp_lcd_i80_bus_t *)args; + lcd_i80_trans_descriptor_t *trans_desc = NULL; + lcd_panel_io_i80_t *cur_device = NULL; + lcd_panel_io_i80_t *next_device = NULL; + BaseType_t high_task_woken = pdFALSE; + bool need_yield = false; + uint32_t intr_status = i2s_ll_get_intr_status(bus->hal.dev); + if (intr_status & I2S_LL_EVENT_TX_EOF) { // trans done event + // disable interrupt temporarily, only re-enable when there be remained transaction in the queue + esp_intr_disable(bus->intr); + trans_desc = bus->cur_trans; // the finished transaction + cur_device = bus->cur_device;// the working device + // process finished transaction + if (trans_desc) { + assert(trans_desc->i80_device == cur_device && "transaction device mismatch"); + // decrease pm lock reference count + if (bus->pm_lock) { + esp_pm_lock_release(bus->pm_lock); + } + // device callback + if (trans_desc->trans_done_cb) { + if (trans_desc->trans_done_cb(&cur_device->base, NULL, trans_desc->user_ctx)) { + need_yield = true; + } + } + // move transaction to done_queue + high_task_woken = pdFALSE; + xQueueSendFromISR(cur_device->done_queue, &trans_desc, &high_task_woken); + if (high_task_woken == pdTRUE) { + need_yield = true; + } + bus->cur_trans = NULL; + } + // fetch transactions from devices' trans_queue + // Note: the first registered device will have the highest priority to be scheduled + LIST_FOREACH(next_device, &bus->device_list, device_list_entry) { + high_task_woken = pdFALSE; + if (xQueueReceiveFromISR(next_device->trans_queue, &trans_desc, &high_task_woken) == pdTRUE) { + if (high_task_woken == pdTRUE) { + need_yield = true; + } + // sanity check + assert(trans_desc); + // only clear the interrupt status when we're sure there still remains transaction to handle + i2s_ll_clear_intr_status(bus->hal.dev, I2S_LL_EVENT_TX_EOF); + // switch devices if necessary + lcd_i80_switch_devices(cur_device, next_device); + bus->cur_trans = trans_desc; + gpio_set_level(bus->dc_gpio_num, trans_desc->flags.dc_level); + // mount data to DMA links + lcd_com_mount_dma_data(bus->dma_nodes, trans_desc->data, trans_desc->data_length); +#if SOC_I2S_TRANS_SIZE_ALIGN_WORD + // switch to I2S 16bits mode, two WS cycle <=> one I2S FIFO + i2s_ll_tx_set_bits_mod(bus->hal.dev, 16); +#endif + // enable interrupt again, because the new transaction can trigger new trans done event + esp_intr_enable(bus->intr); + i2s_ll_tx_stop(bus->hal.dev); + i2s_ll_tx_reset(bus->hal.dev); // reset TX engine first + i2s_ll_start_out_link(bus->hal.dev); + esp_rom_delay_us(1); + // increase the pm lock reference count before starting a new transaction + if (bus->pm_lock) { + esp_pm_lock_acquire(bus->pm_lock); + } + i2s_ll_tx_start(bus->hal.dev); + break; // exit for-each loop + } + } + } + if (need_yield) { + portYIELD_FROM_ISR(); + } +} diff --git a/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io_i80.c b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io_i80.c new file mode 100644 index 000000000..816445541 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io_i80.c @@ -0,0 +1,724 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include +#include "sdkconfig.h" +#if CONFIG_LCD_ENABLE_DEBUG_LOG +// The local log level must be defined before including esp_log.h +// Set the maximum log level for this source file +#define LOG_LOCAL_LEVEL ESP_LOG_DEBUG +#endif +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" +#include "esp_attr.h" +#include "esp_check.h" +#include "esp_pm.h" +#include "esp_lcd_panel_io_interface.h" +#include "esp_lcd_panel_io.h" +#include "esp_rom_gpio.h" +#include "soc/soc_caps.h" +#include "esp_clk_tree.h" +#include "esp_memory_utils.h" +#include "hal/dma_types.h" +#include "hal/gpio_hal.h" +#include "hal/cache_hal.h" +#include "hal/cache_ll.h" +#include "esp_private/gdma.h" +#include "driver/gpio.h" +#include "esp_private/periph_ctrl.h" +#include "esp_lcd_common.h" +#include "soc/lcd_periph.h" +#include "hal/lcd_ll.h" +#include "hal/lcd_hal.h" +#include "esp_cache.h" + +#define ALIGN_UP(size, align) (((size) + (align) - 1) & ~((align) - 1)) +#define ALIGN_DOWN(size, align) ((size) & ~((align) - 1)) + +static const char *TAG = "lcd_panel.io.i80"; + +typedef struct esp_lcd_i80_bus_t esp_lcd_i80_bus_t; +typedef struct lcd_panel_io_i80_t lcd_panel_io_i80_t; +typedef struct lcd_i80_trans_descriptor_t lcd_i80_trans_descriptor_t; + +static esp_err_t panel_io_i80_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, const void *param, size_t param_size); +static esp_err_t panel_io_i80_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, const void *color, size_t color_size); +static esp_err_t panel_io_i80_del(esp_lcd_panel_io_t *io); +static esp_err_t lcd_i80_init_dma_link(esp_lcd_i80_bus_handle_t bus); +static void lcd_periph_trigger_quick_trans_done_event(esp_lcd_i80_bus_handle_t bus); +static esp_err_t lcd_i80_select_periph_clock(esp_lcd_i80_bus_handle_t bus, lcd_clock_source_t clk_src); +static esp_err_t lcd_i80_bus_configure_gpio(esp_lcd_i80_bus_handle_t bus, const esp_lcd_i80_bus_config_t *bus_config); +static void lcd_i80_switch_devices(lcd_panel_io_i80_t *cur_device, lcd_panel_io_i80_t *next_device); +static void lcd_start_transaction(esp_lcd_i80_bus_t *bus, lcd_i80_trans_descriptor_t *trans_desc); +static void lcd_default_isr_handler(void *args); +static esp_err_t panel_io_i80_register_event_callbacks(esp_lcd_panel_io_handle_t io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx); + +struct esp_lcd_i80_bus_t { + int bus_id; // Bus ID, index from 0 + portMUX_TYPE spinlock; // spinlock used to protect i80 bus members(hal, device_list, cur_trans) + lcd_hal_context_t hal; // Hal object + size_t bus_width; // Number of data lines + intr_handle_t intr; // LCD peripheral interrupt handle + esp_pm_lock_handle_t pm_lock; // Power management lock + size_t num_dma_nodes; // Number of DMA descriptors + uint8_t *format_buffer; // The driver allocates an internal buffer for DMA to do data format transformer + size_t resolution_hz; // LCD_CLK resolution, determined by selected clock source + gdma_channel_handle_t dma_chan; // DMA channel handle + size_t psram_trans_align; // DMA transfer alignment for data allocated from PSRAM + size_t sram_trans_align; // DMA transfer alignment for data allocated from SRAM + lcd_i80_trans_descriptor_t *cur_trans; // Current transaction + lcd_panel_io_i80_t *cur_device; // Current working device + LIST_HEAD(i80_device_list, lcd_panel_io_i80_t) device_list; // Head of i80 device list + struct { + unsigned int exclusive: 1; // Indicate whether the I80 bus is owned by one device (whose CS GPIO is not assigned) exclusively + } flags; + dma_descriptor_t dma_nodes[]; // DMA descriptor pool, the descriptors are shared by all i80 devices +}; + +struct lcd_i80_trans_descriptor_t { + lcd_panel_io_i80_t *i80_device; // i80 device issuing this transaction + int cmd_value; // Command value + uint32_t cmd_cycles; // Command cycles + const void *data; // Data buffer + uint32_t data_length; // Data buffer size + void *user_ctx; // private data used by trans_done_cb + esp_lcd_panel_io_color_trans_done_cb_t trans_done_cb; // transaction done callback +}; + +struct lcd_panel_io_i80_t { + esp_lcd_panel_io_t base; // Base class of generic lcd panel io + esp_lcd_i80_bus_t *bus; // Which bus the device is attached to + int cs_gpio_num; // GPIO used for CS line + unsigned int pclk_hz; // PCLK clock frequency + size_t clock_prescale; // Prescaler coefficient, determined by user's configured PCLK frequency + QueueHandle_t trans_queue; // Transaction queue, transactions in this queue are pending for scheduler to dispatch + QueueHandle_t done_queue; // Transaction done queue, transactions in this queue are finished but not recycled by the caller + size_t queue_size; // Size of transaction queue + size_t num_trans_inflight; // Number of transactions that are undergoing (the descriptor not recycled yet) + int lcd_cmd_bits; // Bit width of LCD command + int lcd_param_bits; // Bit width of LCD parameter + void *user_ctx; // private data used when transfer color data + esp_lcd_panel_io_color_trans_done_cb_t on_color_trans_done; // color data trans done callback + LIST_ENTRY(lcd_panel_io_i80_t) device_list_entry; // Entry of i80 device list + struct { + unsigned int dc_idle_level: 1; // Level of DC line in IDLE phase + unsigned int dc_cmd_level: 1; // Level of DC line in CMD phase + unsigned int dc_dummy_level: 1; // Level of DC line in DUMMY phase + unsigned int dc_data_level: 1; // Level of DC line in DATA phase + } dc_levels; + struct { + unsigned int cs_active_high: 1; // Whether the CS line is active on high level + unsigned int reverse_color_bits: 1; // Reverse the data bits, D[N:0] -> D[0:N] + unsigned int swap_color_bytes: 1; // Swap adjacent two data bytes before sending out + unsigned int pclk_active_neg: 1; // The display will write data lines when there's a falling edge on WR line + unsigned int pclk_idle_low: 1; // The WR line keeps at low level in IDLE phase + } flags; + lcd_i80_trans_descriptor_t trans_pool[]; // Transaction pool +}; + +esp_err_t esp_lcd_new_i80_bus(const esp_lcd_i80_bus_config_t *bus_config, esp_lcd_i80_bus_handle_t *ret_bus) +{ +#if CONFIG_LCD_ENABLE_DEBUG_LOG + esp_log_level_set(TAG, ESP_LOG_DEBUG); +#endif + esp_err_t ret = ESP_OK; + esp_lcd_i80_bus_t *bus = NULL; + ESP_GOTO_ON_FALSE(bus_config && ret_bus, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + size_t num_dma_nodes = bus_config->max_transfer_bytes / DMA_DESCRIPTOR_BUFFER_MAX_SIZE + 1; + // DMA descriptors must be placed in internal SRAM + bus = heap_caps_calloc(1, sizeof(esp_lcd_i80_bus_t) + num_dma_nodes * sizeof(dma_descriptor_t), MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA); + ESP_GOTO_ON_FALSE(bus, ESP_ERR_NO_MEM, err, TAG, "no mem for i80 bus"); + bus->num_dma_nodes = num_dma_nodes; + bus->bus_id = -1; + bus->format_buffer = heap_caps_calloc(1, CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE, MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA); + ESP_GOTO_ON_FALSE(bus->format_buffer, ESP_ERR_NO_MEM, err, TAG, "no mem for format buffer"); + // register to platform + int bus_id = lcd_com_register_device(LCD_COM_DEVICE_TYPE_I80, bus); + ESP_GOTO_ON_FALSE(bus_id >= 0, ESP_ERR_NOT_FOUND, err, TAG, "no free i80 bus slot"); + bus->bus_id = bus_id; + // enable APB to access LCD registers + PERIPH_RCC_ACQUIRE_ATOMIC(lcd_periph_signals.panels[bus_id].module, ref_count) { + if (ref_count == 0) { + lcd_ll_enable_bus_clock(bus_id, true); + lcd_ll_reset_register(bus_id); + } + } + // initialize HAL layer, so we can call LL APIs later + lcd_hal_init(&bus->hal, bus_id); + // reset peripheral and FIFO + lcd_ll_reset(bus->hal.dev); + lcd_ll_fifo_reset(bus->hal.dev); + lcd_ll_enable_clock(bus->hal.dev, true); + // set peripheral clock resolution + ret = lcd_i80_select_periph_clock(bus, bus_config->clk_src); + ESP_GOTO_ON_ERROR(ret, err, TAG, "select periph clock %d failed", bus_config->clk_src); + // install interrupt service, (LCD peripheral shares the same interrupt source with Camera peripheral with different mask) + // interrupt is disabled by default + int isr_flags = LCD_I80_INTR_ALLOC_FLAGS | ESP_INTR_FLAG_SHARED | ESP_INTR_FLAG_LOWMED; + ret = esp_intr_alloc_intrstatus(lcd_periph_signals.buses[bus_id].irq_id, isr_flags, + (uint32_t)lcd_ll_get_interrupt_status_reg(bus->hal.dev), + LCD_LL_EVENT_TRANS_DONE, lcd_default_isr_handler, bus, &bus->intr); + ESP_GOTO_ON_ERROR(ret, err, TAG, "install interrupt failed"); + lcd_ll_enable_interrupt(bus->hal.dev, LCD_LL_EVENT_TRANS_DONE, false); // disable all interrupts + lcd_ll_clear_interrupt_status(bus->hal.dev, UINT32_MAX); // clear pending interrupt + // install DMA service + bus->psram_trans_align = bus_config->psram_trans_align; + bus->sram_trans_align = bus_config->sram_trans_align; + ret = lcd_i80_init_dma_link(bus); + ESP_GOTO_ON_ERROR(ret, err, TAG, "install DMA failed"); + // enable 8080 mode and set bus width + lcd_ll_enable_rgb_mode(bus->hal.dev, false); + lcd_ll_set_data_width(bus->hal.dev, bus_config->bus_width); + bus->bus_width = bus_config->bus_width; + // number of data cycles is controlled by DMA buffer size + lcd_ll_enable_output_always_on(bus->hal.dev, true); + // enable trans done interrupt + lcd_ll_enable_interrupt(bus->hal.dev, LCD_LL_EVENT_TRANS_DONE, true); + // trigger a quick "trans done" event, and wait for the interrupt line goes active + // this could ensure we go into ISR handler next time we call `esp_intr_enable` + lcd_periph_trigger_quick_trans_done_event(bus); + // configure GPIO + ret = lcd_i80_bus_configure_gpio(bus, bus_config); + ESP_GOTO_ON_ERROR(ret, err, TAG, "configure GPIO failed"); + // fill other i80 bus runtime parameters + LIST_INIT(&bus->device_list); // initialize device list head + bus->spinlock = (portMUX_TYPE)portMUX_INITIALIZER_UNLOCKED; + *ret_bus = bus; + ESP_LOGD(TAG, "new i80 bus(%d) @%p, %zu dma nodes", bus_id, bus, bus->num_dma_nodes); + return ESP_OK; + +err: + if (bus) { + if (bus->intr) { + esp_intr_free(bus->intr); + } + if (bus->dma_chan) { + gdma_disconnect(bus->dma_chan); + gdma_del_channel(bus->dma_chan); + } + if (bus->bus_id >= 0) { + PERIPH_RCC_RELEASE_ATOMIC(lcd_periph_signals.panels[bus->bus_id].module, ref_count) { + if (ref_count == 0) { + lcd_ll_enable_bus_clock(bus->bus_id, false); + } + } + lcd_com_remove_device(LCD_COM_DEVICE_TYPE_I80, bus->bus_id); + } + if (bus->format_buffer) { + free(bus->format_buffer); + } + if (bus->pm_lock) { + esp_pm_lock_delete(bus->pm_lock); + } + free(bus); + } + return ret; +} + +esp_err_t esp_lcd_del_i80_bus(esp_lcd_i80_bus_handle_t bus) +{ + esp_err_t ret = ESP_OK; + ESP_GOTO_ON_FALSE(bus, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + ESP_GOTO_ON_FALSE(LIST_EMPTY(&bus->device_list), ESP_ERR_INVALID_STATE, err, TAG, "device list not empty"); + int bus_id = bus->bus_id; + lcd_com_remove_device(LCD_COM_DEVICE_TYPE_I80, bus_id); + PERIPH_RCC_RELEASE_ATOMIC(lcd_periph_signals.panels[bus_id].module, ref_count) { + if (ref_count == 0) { + lcd_ll_enable_bus_clock(bus_id, false); + } + } + gdma_disconnect(bus->dma_chan); + gdma_del_channel(bus->dma_chan); + esp_intr_free(bus->intr); + free(bus->format_buffer); + if (bus->pm_lock) { + esp_pm_lock_delete(bus->pm_lock); + } + free(bus); + ESP_LOGD(TAG, "del i80 bus(%d)", bus_id); +err: + return ret; +} + +esp_err_t esp_lcd_new_panel_io_i80(esp_lcd_i80_bus_handle_t bus, const esp_lcd_panel_io_i80_config_t *io_config, esp_lcd_panel_io_handle_t *ret_io) +{ + esp_err_t ret = ESP_OK; + lcd_panel_io_i80_t *i80_device = NULL; + bool bus_exclusive = false; + ESP_GOTO_ON_FALSE(bus && io_config && ret_io, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + // check if the bus has been configured as exclusive + portENTER_CRITICAL(&bus->spinlock); + if (!bus->flags.exclusive) { + bus->flags.exclusive = io_config->cs_gpio_num < 0; + } else { + bus_exclusive = true; + } + portEXIT_CRITICAL(&bus->spinlock); + ESP_GOTO_ON_FALSE(!bus_exclusive, ESP_ERR_INVALID_STATE, err, TAG, "bus has been exclusively owned by device"); + // check if pixel clock setting is valid + uint32_t pclk_prescale = bus->resolution_hz / io_config->pclk_hz; + ESP_GOTO_ON_FALSE(pclk_prescale > 0 && pclk_prescale <= LCD_LL_PCLK_DIV_MAX, ESP_ERR_NOT_SUPPORTED, err, TAG, + "prescaler can't satisfy PCLK clock %"PRIu32"Hz", io_config->pclk_hz); + i80_device = heap_caps_calloc(1, sizeof(lcd_panel_io_i80_t) + io_config->trans_queue_depth * sizeof(lcd_i80_trans_descriptor_t), LCD_I80_MEM_ALLOC_CAPS); + ESP_GOTO_ON_FALSE(i80_device, ESP_ERR_NO_MEM, err, TAG, "no mem for i80 panel io"); + // create two queues for i80 device + i80_device->trans_queue = xQueueCreate(io_config->trans_queue_depth, sizeof(lcd_i80_trans_descriptor_t *)); + ESP_GOTO_ON_FALSE(i80_device->trans_queue, ESP_ERR_NO_MEM, err, TAG, "create trans queue failed"); + i80_device->done_queue = xQueueCreate(io_config->trans_queue_depth, sizeof(lcd_i80_trans_descriptor_t *)); + ESP_GOTO_ON_FALSE(i80_device->done_queue, ESP_ERR_NO_MEM, err, TAG, "create done queue failed"); + // adding device to list + portENTER_CRITICAL(&bus->spinlock); + LIST_INSERT_HEAD(&bus->device_list, i80_device, device_list_entry); + portEXIT_CRITICAL(&bus->spinlock); + // we don't initialize the i80 bus at the memont, but initialize the bus when start a transaction for a new device + // so save these as i80 device runtime parameters + i80_device->bus = bus; + i80_device->lcd_cmd_bits = io_config->lcd_cmd_bits; + i80_device->lcd_param_bits = io_config->lcd_param_bits; + i80_device->queue_size = io_config->trans_queue_depth; + i80_device->clock_prescale = pclk_prescale; + i80_device->pclk_hz = bus->resolution_hz / pclk_prescale; + i80_device->dc_levels.dc_cmd_level = io_config->dc_levels.dc_cmd_level; + i80_device->dc_levels.dc_data_level = io_config->dc_levels.dc_data_level; + i80_device->dc_levels.dc_dummy_level = io_config->dc_levels.dc_dummy_level; + i80_device->dc_levels.dc_idle_level = io_config->dc_levels.dc_idle_level; + i80_device->cs_gpio_num = io_config->cs_gpio_num; + i80_device->flags.reverse_color_bits = io_config->flags.reverse_color_bits; + i80_device->flags.swap_color_bytes = io_config->flags.swap_color_bytes; + i80_device->flags.cs_active_high = io_config->flags.cs_active_high; + i80_device->flags.pclk_idle_low = io_config->flags.pclk_idle_low; + i80_device->flags.pclk_active_neg = io_config->flags.pclk_active_neg; + i80_device->on_color_trans_done = io_config->on_color_trans_done; + i80_device->user_ctx = io_config->user_ctx; + // fill panel io function table + i80_device->base.del = panel_io_i80_del; + i80_device->base.tx_param = panel_io_i80_tx_param; + i80_device->base.tx_color = panel_io_i80_tx_color; + i80_device->base.register_event_callbacks = panel_io_i80_register_event_callbacks; + // we only configure the CS GPIO as output, don't connect to the peripheral signal at the moment + // we will connect the CS GPIO to peripheral signal when switching devices in lcd_i80_switch_devices() + if (io_config->cs_gpio_num >= 0) { + gpio_set_level(io_config->cs_gpio_num, !io_config->flags.cs_active_high); + gpio_set_direction(io_config->cs_gpio_num, GPIO_MODE_OUTPUT); + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[io_config->cs_gpio_num], PIN_FUNC_GPIO); + } + *ret_io = &(i80_device->base); + ESP_LOGD(TAG, "new i80 lcd panel io @%p on bus(%d)", i80_device, bus->bus_id); + return ESP_OK; + +err: + if (i80_device) { + if (i80_device->trans_queue) { + vQueueDelete(i80_device->trans_queue); + } + if (i80_device->done_queue) { + vQueueDelete(i80_device->done_queue); + } + free(i80_device); + } + return ret; +} + +static esp_err_t panel_io_i80_del(esp_lcd_panel_io_t *io) +{ + lcd_panel_io_i80_t *i80_device = __containerof(io, lcd_panel_io_i80_t, base); + esp_lcd_i80_bus_t *bus = i80_device->bus; + lcd_i80_trans_descriptor_t *trans_desc = NULL; + // wait all pending transaction to finish + size_t num_trans_inflight = i80_device->num_trans_inflight; + for (size_t i = 0; i < num_trans_inflight; i++) { + ESP_RETURN_ON_FALSE(xQueueReceive(i80_device->done_queue, &trans_desc, portMAX_DELAY) == pdTRUE, + ESP_FAIL, TAG, "recycle inflight transactions failed"); + i80_device->num_trans_inflight--; + } + // remove from device list + portENTER_CRITICAL(&bus->spinlock); + LIST_REMOVE(i80_device, device_list_entry); + portEXIT_CRITICAL(&bus->spinlock); + + // reset CS to normal GPIO + if (i80_device->cs_gpio_num >= 0) { + gpio_reset_pin(i80_device->cs_gpio_num); + } + + ESP_LOGD(TAG, "del i80 lcd panel io @%p", i80_device); + vQueueDelete(i80_device->trans_queue); + vQueueDelete(i80_device->done_queue); + free(i80_device); + return ESP_OK; +} + +static esp_err_t panel_io_i80_register_event_callbacks(esp_lcd_panel_io_handle_t io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx) +{ + lcd_panel_io_i80_t *i80_device = __containerof(io, lcd_panel_io_i80_t, base); + + if (i80_device->on_color_trans_done != NULL) { + ESP_LOGW(TAG, "Callback on_color_trans_done was already set and now it was overwritten!"); + } + + i80_device->on_color_trans_done = cbs->on_color_trans_done; + i80_device->user_ctx = user_ctx; + + return ESP_OK; +} + +static void i80_lcd_prepare_cmd_buffer(esp_lcd_i80_bus_t *bus, lcd_panel_io_i80_t *i80_device, void *lcd_cmd) +{ + uint8_t *from = (uint8_t *)lcd_cmd; + if (bus->bus_width < i80_device->lcd_cmd_bits) { + // LCD is big-endian, e.g. to send command 0x1234, byte 0x12 should appear on the bus first + // However, the i80 peripheral will send 0x34 first, so we reversed the order below + int start = 0; + int end = i80_device->lcd_cmd_bits / 8 - 1; + lcd_com_reverse_buffer_bytes(from, start, end); + } +} + +static uint32_t i80_lcd_prepare_param_buffer(esp_lcd_i80_bus_t *bus, lcd_panel_io_i80_t *i80_device, const void *lcd_param, size_t param_size) +{ + int param_per_size = i80_device->lcd_param_bits / 8; + int param_num = param_size / param_per_size; + const uint8_t *from = (const uint8_t *)lcd_param; + uint8_t *to = bus->format_buffer; + uint8_t step = bus->bus_width / 8; + int param_cycle = i80_device->lcd_param_bits / bus->bus_width; + // in case bus_width=16 and param_bits=8, we still need 1 param_cycle + if (param_cycle * bus->bus_width < i80_device->lcd_param_bits) { + param_cycle++; + } + int ele_cycles = param_cycle * param_num; + int bytes_to_copy = MIN(bus->bus_width, i80_device->lcd_param_bits) / 8; + int cnt_from = 0; + // expand the width of parameters when necessary + for (int i = 0; i < ele_cycles; i++) { + for (int j = 0; j < bytes_to_copy; j++) { + to[j] = from[cnt_from++]; + } + to += step; + } + return to - bus->format_buffer; +} + +static esp_err_t panel_io_i80_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, const void *param, size_t param_size) +{ + lcd_panel_io_i80_t *next_device = __containerof(io, lcd_panel_io_i80_t, base); + esp_lcd_i80_bus_t *bus = next_device->bus; + lcd_panel_io_i80_t *cur_device = bus->cur_device; + lcd_i80_trans_descriptor_t *trans_desc = NULL; + assert(param_size <= (bus->num_dma_nodes * DMA_DESCRIPTOR_BUFFER_MAX_SIZE) && "parameter bytes too long, enlarge max_transfer_bytes"); + assert(param_size <= CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE && "format buffer too small, increase CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE"); + uint32_t cmd_cycles = next_device->lcd_cmd_bits / bus->bus_width; + // in case bus_width=16 and cmd_bits=8, we still need 1 cmd_cycle + if (cmd_cycles * bus->bus_width < next_device->lcd_cmd_bits) { + cmd_cycles++; + } + i80_lcd_prepare_cmd_buffer(bus, next_device, &lcd_cmd); + uint32_t param_len = i80_lcd_prepare_param_buffer(bus, next_device, param, param_size); + // wait all pending transaction in the queue to finish + size_t num_trans_inflight = next_device->num_trans_inflight; + for (size_t i = 0; i < num_trans_inflight; i++) { + ESP_RETURN_ON_FALSE(xQueueReceive(next_device->done_queue, &trans_desc, portMAX_DELAY) == pdTRUE, + ESP_FAIL, TAG, "recycle inflight transactions failed"); + next_device->num_trans_inflight--; + } + + uint32_t intr_status = lcd_ll_get_interrupt_status(bus->hal.dev); + lcd_ll_clear_interrupt_status(bus->hal.dev, intr_status); + // switch devices if necessary + lcd_i80_switch_devices(cur_device, next_device); + // set data format + lcd_ll_reverse_bit_order(bus->hal.dev, false); + lcd_ll_swap_byte_order(bus->hal.dev, bus->bus_width, next_device->lcd_param_bits > bus->bus_width); + bus->cur_trans = NULL; + bus->cur_device = next_device; + // package a transaction + trans_desc = &next_device->trans_pool[0]; + trans_desc->i80_device = next_device; + trans_desc->cmd_cycles = cmd_cycles; + trans_desc->cmd_value = lcd_cmd; + // either the param is NULL or the param_size is zero, means there isn't a data phase in this transaction + trans_desc->data = (param && param_len) ? bus->format_buffer : NULL; + trans_desc->data_length = trans_desc->data ? param_len : 0; + trans_desc->trans_done_cb = NULL; // no callback for parameter transaction + // mount data to DMA links + lcd_com_mount_dma_data(bus->dma_nodes, trans_desc->data, trans_desc->data_length); + // increase the pm lock reference count before starting a new transaction + if (bus->pm_lock) { + esp_pm_lock_acquire(bus->pm_lock); + } + lcd_start_transaction(bus, trans_desc); + // polling the trans done event, but don't clear the event status + while (!(lcd_ll_get_interrupt_status(bus->hal.dev) & LCD_LL_EVENT_TRANS_DONE)) {} + // decrease pm lock reference count + if (bus->pm_lock) { + esp_pm_lock_release(bus->pm_lock); + } + return ESP_OK; +} + +static esp_err_t panel_io_i80_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, const void *color, size_t color_size) +{ + lcd_panel_io_i80_t *i80_device = __containerof(io, lcd_panel_io_i80_t, base); + esp_lcd_i80_bus_t *bus = i80_device->bus; + lcd_i80_trans_descriptor_t *trans_desc = NULL; + assert(color_size <= (bus->num_dma_nodes * DMA_DESCRIPTOR_BUFFER_MAX_SIZE) && "color bytes too long, enlarge max_transfer_bytes"); + // in case bus_width=16 and cmd_bits=8, we still need 1 cmd_cycle + uint32_t cmd_cycles = i80_device->lcd_cmd_bits / bus->bus_width; + if (cmd_cycles * bus->bus_width < i80_device->lcd_cmd_bits) { + cmd_cycles++; + } + i80_lcd_prepare_cmd_buffer(bus, i80_device, &lcd_cmd); + if (i80_device->num_trans_inflight < i80_device->queue_size) { + trans_desc = &i80_device->trans_pool[i80_device->num_trans_inflight]; + } else { + // transaction pool has used up, recycle one from done_queue + ESP_RETURN_ON_FALSE(xQueueReceive(i80_device->done_queue, &trans_desc, portMAX_DELAY) == pdTRUE, + ESP_FAIL, TAG, "recycle inflight transactions failed"); + i80_device->num_trans_inflight--; + } + trans_desc->i80_device = i80_device; + trans_desc->cmd_cycles = cmd_cycles; + trans_desc->cmd_value = lcd_cmd; + trans_desc->data = color; + trans_desc->data_length = color_size; + trans_desc->trans_done_cb = i80_device->on_color_trans_done; + trans_desc->user_ctx = i80_device->user_ctx; + + if (esp_ptr_external_ram(color)) { + uint32_t dcache_line_size = cache_hal_get_cache_line_size(CACHE_LL_LEVEL_EXT_MEM, CACHE_TYPE_DATA); + // flush frame buffer from cache to the physical PSRAM + // note the esp_cache_msync function will check the alignment of the address and size, make sure they're aligned to current cache line size + esp_cache_msync((void *)ALIGN_DOWN((intptr_t)color, dcache_line_size), ALIGN_UP(color_size, dcache_line_size), 0); + } + + // send transaction to trans_queue + xQueueSend(i80_device->trans_queue, &trans_desc, portMAX_DELAY); + i80_device->num_trans_inflight++; + // enable interrupt and go into isr handler, where we fetch the transactions from trans_queue and start it + // we will go into `lcd_default_isr_handler` almost at once, because the "trans done" event is active at the moment + esp_intr_enable(bus->intr); + return ESP_OK; +} + +static esp_err_t lcd_i80_select_periph_clock(esp_lcd_i80_bus_handle_t bus, lcd_clock_source_t clk_src) +{ + // get clock source frequency + uint32_t src_clk_hz = 0; + ESP_RETURN_ON_ERROR(esp_clk_tree_src_get_freq_hz((soc_module_clk_t)clk_src, ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED, &src_clk_hz), + TAG, "get clock source frequency failed"); + + // force to use integer division, as fractional division might lead to clock jitter + lcd_ll_select_clk_src(bus->hal.dev, clk_src); + lcd_ll_set_group_clock_coeff(bus->hal.dev, LCD_PERIPH_CLOCK_PRE_SCALE, 0, 0); + + // save the resolution of the i80 bus + bus->resolution_hz = src_clk_hz / LCD_PERIPH_CLOCK_PRE_SCALE; + // create pm lock based on different clock source + // clock sources like PLL and XTAL will be turned off in light sleep +#if CONFIG_PM_ENABLE + ESP_RETURN_ON_ERROR(esp_pm_lock_create(ESP_PM_NO_LIGHT_SLEEP, 0, "i80_bus_lcd", &bus->pm_lock), TAG, "create pm lock failed"); +#endif + return ESP_OK; +} + +static esp_err_t lcd_i80_init_dma_link(esp_lcd_i80_bus_handle_t bus) +{ + esp_err_t ret = ESP_OK; + // chain DMA descriptors + for (int i = 0; i < bus->num_dma_nodes; i++) { + bus->dma_nodes[i].dw0.owner = DMA_DESCRIPTOR_BUFFER_OWNER_CPU; + bus->dma_nodes[i].next = &bus->dma_nodes[i + 1]; + } + bus->dma_nodes[bus->num_dma_nodes - 1].next = NULL; // one-off DMA chain + // alloc DMA channel and connect to LCD peripheral + gdma_channel_alloc_config_t dma_chan_config = { + .direction = GDMA_CHANNEL_DIRECTION_TX, + }; +#if SOC_GDMA_TRIG_PERIPH_LCD0_BUS == SOC_GDMA_BUS_AHB + ret = gdma_new_ahb_channel(&dma_chan_config, &bus->dma_chan); +#elif SOC_GDMA_TRIG_PERIPH_LCD0_BUS == SOC_GDMA_BUS_AXI + ret = gdma_new_axi_channel(&dma_chan_config, &bus->dma_chan); +#endif + ESP_GOTO_ON_ERROR(ret, err, TAG, "alloc DMA channel failed"); + gdma_connect(bus->dma_chan, GDMA_MAKE_TRIGGER(GDMA_TRIG_PERIPH_LCD, 0)); + gdma_strategy_config_t strategy_config = { + .auto_update_desc = true, + .owner_check = true + }; + gdma_apply_strategy(bus->dma_chan, &strategy_config); + // set DMA transfer ability + gdma_transfer_ability_t ability = { + .psram_trans_align = bus->psram_trans_align, + .sram_trans_align = bus->sram_trans_align, + }; + gdma_set_transfer_ability(bus->dma_chan, &ability); + return ESP_OK; +err: + if (bus->dma_chan) { + gdma_del_channel(bus->dma_chan); + } + return ret; +} + +static esp_err_t lcd_i80_bus_configure_gpio(esp_lcd_i80_bus_handle_t bus, const esp_lcd_i80_bus_config_t *bus_config) +{ + int bus_id = bus->bus_id; + // check validation of GPIO number + bool valid_gpio = (bus_config->wr_gpio_num >= 0) && (bus_config->dc_gpio_num >= 0); + for (size_t i = 0; i < bus_config->bus_width; i++) { + valid_gpio = valid_gpio && (bus_config->data_gpio_nums[i] >= 0); + } + if (!valid_gpio) { + return ESP_ERR_INVALID_ARG; + } + // connect peripheral signals via GPIO matrix + for (size_t i = 0; i < bus_config->bus_width; i++) { + gpio_set_direction(bus_config->data_gpio_nums[i], GPIO_MODE_OUTPUT); + esp_rom_gpio_connect_out_signal(bus_config->data_gpio_nums[i], lcd_periph_signals.buses[bus_id].data_sigs[i], false, false); + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[bus_config->data_gpio_nums[i]], PIN_FUNC_GPIO); + } + gpio_set_direction(bus_config->dc_gpio_num, GPIO_MODE_OUTPUT); + esp_rom_gpio_connect_out_signal(bus_config->dc_gpio_num, lcd_periph_signals.buses[bus_id].dc_sig, false, false); + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[bus_config->dc_gpio_num], PIN_FUNC_GPIO); + gpio_set_direction(bus_config->wr_gpio_num, GPIO_MODE_OUTPUT); + esp_rom_gpio_connect_out_signal(bus_config->wr_gpio_num, lcd_periph_signals.buses[bus_id].wr_sig, false, false); + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[bus_config->wr_gpio_num], PIN_FUNC_GPIO); + return ESP_OK; +} + +static void lcd_periph_trigger_quick_trans_done_event(esp_lcd_i80_bus_handle_t bus) +{ + // trigger a quick interrupt event by a dummy transaction, wait the LCD interrupt line goes active + // next time when esp_intr_enable is invoked, we can go into interrupt handler immediately + // where we dispatch transactions for i80 devices + lcd_ll_set_phase_cycles(bus->hal.dev, 0, 1, 0); + lcd_ll_start(bus->hal.dev); + while (!(lcd_ll_get_interrupt_status(bus->hal.dev) & LCD_LL_EVENT_TRANS_DONE)) {} +} + +static void lcd_start_transaction(esp_lcd_i80_bus_t *bus, lcd_i80_trans_descriptor_t *trans_desc) +{ + // by default, the dummy phase is disabled because it's not common for most LCDs + uint32_t dummy_cycles = 0; + uint32_t cmd_cycles = trans_desc->cmd_value >= 0 ? trans_desc->cmd_cycles : 0; + // Number of data phase cycles are controlled by DMA buffer length, we only need to enable/disable the phase here + uint32_t data_cycles = trans_desc->data ? 1 : 0; + if (trans_desc->cmd_value >= 0) { + lcd_ll_set_command(bus->hal.dev, bus->bus_width, trans_desc->cmd_value); + } + lcd_ll_set_phase_cycles(bus->hal.dev, cmd_cycles, dummy_cycles, data_cycles); + lcd_ll_set_blank_cycles(bus->hal.dev, 1, 1); + + if (trans_desc->data) { // some specific LCD commands can have no parameters + gdma_start(bus->dma_chan, (intptr_t)(bus->dma_nodes)); + // delay 1us is sufficient for DMA to pass data to LCD FIFO + // in fact, this is only needed when LCD pixel clock is set too high + esp_rom_delay_us(1); + } + lcd_ll_start(bus->hal.dev); +} + +static void lcd_i80_switch_devices(lcd_panel_io_i80_t *cur_device, lcd_panel_io_i80_t *next_device) +{ + // we assume the next_device and cur_device are attached to the same bus + esp_lcd_i80_bus_t *bus = next_device->bus; + if (next_device != cur_device) { + // reconfigure PCLK for the new device + lcd_ll_set_pixel_clock_prescale(bus->hal.dev, next_device->clock_prescale); + lcd_ll_set_clock_idle_level(bus->hal.dev, !next_device->flags.pclk_idle_low); + lcd_ll_set_pixel_clock_edge(bus->hal.dev, next_device->flags.pclk_active_neg); + // configure DC line level for the new device + lcd_ll_set_dc_level(bus->hal.dev, next_device->dc_levels.dc_idle_level, next_device->dc_levels.dc_cmd_level, + next_device->dc_levels.dc_dummy_level, next_device->dc_levels.dc_data_level); + if (cur_device && cur_device->cs_gpio_num >= 0) { + // disconnect current CS GPIO from peripheral signal + esp_rom_gpio_connect_out_signal(cur_device->cs_gpio_num, SIG_GPIO_OUT_IDX, false, false); + } + if (next_device->cs_gpio_num >= 0) { + // connect CS signal to the new device + esp_rom_gpio_connect_out_signal(next_device->cs_gpio_num, lcd_periph_signals.buses[bus->bus_id].cs_sig, + next_device->flags.cs_active_high, false); + } + } +} + +IRAM_ATTR static void lcd_default_isr_handler(void *args) +{ + esp_lcd_i80_bus_t *bus = (esp_lcd_i80_bus_t *)args; + lcd_i80_trans_descriptor_t *trans_desc = NULL; + lcd_panel_io_i80_t *cur_device = NULL; + lcd_panel_io_i80_t *next_device = NULL; + BaseType_t high_task_woken = pdFALSE; + bool need_yield = false; + uint32_t intr_status = lcd_ll_get_interrupt_status(bus->hal.dev); + if (intr_status & LCD_LL_EVENT_TRANS_DONE) { + // disable interrupt temporarily, only re-enable when there be remained transaction in the queue + esp_intr_disable(bus->intr); + trans_desc = bus->cur_trans; // the finished transaction + cur_device = bus->cur_device;// the working device + // process finished transaction + if (trans_desc) { + assert(trans_desc->i80_device == cur_device && "transaction device mismatch"); + // decrease pm lock reference count + if (bus->pm_lock) { + esp_pm_lock_release(bus->pm_lock); + } + // device callback + if (trans_desc->trans_done_cb) { + if (trans_desc->trans_done_cb(&cur_device->base, NULL, trans_desc->user_ctx)) { + need_yield = true; + } + } + // move transaction to done_queue + // there won't be case that will overflow the queue, so skip checking the return value + high_task_woken = pdFALSE; + xQueueSendFromISR(cur_device->done_queue, &trans_desc, &high_task_woken); + if (high_task_woken == pdTRUE) { + need_yield = true; + } + bus->cur_trans = NULL; + } + // fetch transactions from devices' trans_queue + // Note: the first registered device will have the highest priority to be scheduled + LIST_FOREACH(next_device, &bus->device_list, device_list_entry) { + high_task_woken = pdFALSE; + if (xQueueReceiveFromISR(next_device->trans_queue, &trans_desc, &high_task_woken) == pdTRUE) { + if (high_task_woken == pdTRUE) { + need_yield = true; + } + // sanity check + assert(trans_desc); + // only clear the interrupt status when we're sure there still remains transaction to handle + lcd_ll_clear_interrupt_status(bus->hal.dev, intr_status); + // switch devices if necessary + lcd_i80_switch_devices(cur_device, next_device); + // only reverse data bit/bytes for color data + lcd_ll_reverse_bit_order(bus->hal.dev, next_device->flags.reverse_color_bits); + lcd_ll_swap_byte_order(bus->hal.dev, bus->bus_width, next_device->flags.swap_color_bytes); + bus->cur_trans = trans_desc; + bus->cur_device = next_device; + // mount data to DMA links + lcd_com_mount_dma_data(bus->dma_nodes, trans_desc->data, trans_desc->data_length); + // enable interrupt again, because the new transaction can trigger new trans done event + esp_intr_enable(bus->intr); + // increase the pm lock reference count before starting a new transaction + if (bus->pm_lock) { + esp_pm_lock_acquire(bus->pm_lock); + } + lcd_start_transaction(bus, trans_desc); + break; // exit for-each loop + } + } + } + if (need_yield) { + portYIELD_FROM_ISR(); + } +} diff --git a/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io_spi.c b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io_spi.c new file mode 100644 index 000000000..663e3f2a6 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_io_spi.c @@ -0,0 +1,417 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include "sdkconfig.h" +#if CONFIG_LCD_ENABLE_DEBUG_LOG +// The local log level must be defined before including esp_log.h +// Set the maximum log level for this source file +#define LOG_LOCAL_LEVEL ESP_LOG_DEBUG +#endif +#include "esp_lcd_panel_io_interface.h" +#include "esp_lcd_panel_io.h" +#include "driver/spi_master.h" +#include "driver/gpio.h" +#include "esp_log.h" +#include "esp_check.h" +#include "esp_lcd_common.h" + +static const char *TAG = "lcd_panel.io.spi"; + +static esp_err_t panel_io_spi_rx_param(esp_lcd_panel_io_t *io, int lcd_cmd, void *param, size_t param_size); +static esp_err_t panel_io_spi_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, const void *param, size_t param_size); +static esp_err_t panel_io_spi_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, const void *color, size_t color_size); +static esp_err_t panel_io_spi_del(esp_lcd_panel_io_t *io); +static void lcd_spi_pre_trans_cb(spi_transaction_t *trans); +static void lcd_spi_post_trans_color_cb(spi_transaction_t *trans); +static esp_err_t panel_io_spi_register_event_callbacks(esp_lcd_panel_io_handle_t io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx); + +typedef struct { + spi_transaction_t base; + struct { + unsigned int dc_gpio_level: 1; + unsigned int en_trans_done_cb: 1; + } flags; +} lcd_spi_trans_descriptor_t; + +typedef struct { + esp_lcd_panel_io_t base; // Base class of generic lcd panel io + spi_device_handle_t spi_dev; // SPI device handle + size_t spi_trans_max_bytes; // Maximum bytes that can be transmitted in one spi transaction + int dc_gpio_num; // D/C line GPIO number + esp_lcd_panel_io_color_trans_done_cb_t on_color_trans_done; // User register's callback, invoked when color data trans done + void *user_ctx; // User's private data, passed directly to callback on_color_trans_done + size_t queue_size; // Size of transaction queue + size_t num_trans_inflight; // Number of transactions that are undergoing (the descriptor not recycled yet) + int lcd_cmd_bits; // Bit width of LCD command + int lcd_param_bits; // Bit width of LCD parameter + struct { + unsigned int dc_data_level: 1; // Indicates the level of DC line when tranfering data + unsigned int octal_mode: 1; // Indicates whether the transmitting is enabled with octal mode (8 data lines) + unsigned int quad_mode: 1; // Indicates whether the transmitting is enabled with quad mode (4 data lines) + } flags; + lcd_spi_trans_descriptor_t trans_pool[]; // Transaction pool +} esp_lcd_panel_io_spi_t; + +esp_err_t esp_lcd_new_panel_io_spi(esp_lcd_spi_bus_handle_t bus, const esp_lcd_panel_io_spi_config_t *io_config, esp_lcd_panel_io_handle_t *ret_io) +{ +#if CONFIG_LCD_ENABLE_DEBUG_LOG + esp_log_level_set(TAG, ESP_LOG_DEBUG); +#endif + esp_err_t ret = ESP_OK; + esp_lcd_panel_io_spi_t *spi_panel_io = NULL; + ESP_GOTO_ON_FALSE(bus && io_config && ret_io, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + spi_panel_io = calloc(1, sizeof(esp_lcd_panel_io_spi_t) + sizeof(lcd_spi_trans_descriptor_t) * io_config->trans_queue_depth); + ESP_GOTO_ON_FALSE(spi_panel_io, ESP_ERR_NO_MEM, err, TAG, "no mem for spi panel io"); + + spi_device_interface_config_t devcfg = { + .flags = SPI_DEVICE_HALFDUPLEX | + (io_config->flags.lsb_first ? SPI_DEVICE_TXBIT_LSBFIRST : 0) | + (io_config->flags.sio_mode ? SPI_DEVICE_3WIRE : 0) | + (io_config->flags.cs_high_active ? SPI_DEVICE_POSITIVE_CS : 0), + .clock_speed_hz = io_config->pclk_hz, + .mode = io_config->spi_mode, + .spics_io_num = io_config->cs_gpio_num, + .queue_size = io_config->trans_queue_depth, + .pre_cb = lcd_spi_pre_trans_cb, // pre-transaction callback, mainly control DC gpio level + .post_cb = lcd_spi_post_trans_color_cb, // post-transaction, where we invoke user registered "on_color_trans_done()" + }; + ret = spi_bus_add_device((spi_host_device_t)bus, &devcfg, &spi_panel_io->spi_dev); + ESP_GOTO_ON_ERROR(ret, err, TAG, "adding spi device to bus failed"); + + // if the DC line is not encoded into any spi transaction phase or it's not controlled by SPI peripheral + if (io_config->dc_gpio_num >= 0) { + gpio_config_t io_conf = { + .mode = GPIO_MODE_OUTPUT, + .pin_bit_mask = 1ULL << io_config->dc_gpio_num, + }; + ESP_GOTO_ON_ERROR(gpio_config(&io_conf), err, TAG, "configure GPIO for D/C line failed"); + } + + spi_panel_io->flags.dc_data_level = !io_config->flags.dc_low_on_data; + spi_panel_io->flags.octal_mode = io_config->flags.octal_mode; + spi_panel_io->flags.quad_mode = io_config->flags.quad_mode; + spi_panel_io->on_color_trans_done = io_config->on_color_trans_done; + spi_panel_io->user_ctx = io_config->user_ctx; + spi_panel_io->lcd_cmd_bits = io_config->lcd_cmd_bits; + spi_panel_io->lcd_param_bits = io_config->lcd_param_bits; + spi_panel_io->dc_gpio_num = io_config->dc_gpio_num; + spi_panel_io->queue_size = io_config->trans_queue_depth; + spi_panel_io->base.rx_param = panel_io_spi_rx_param; + spi_panel_io->base.tx_param = panel_io_spi_tx_param; + spi_panel_io->base.tx_color = panel_io_spi_tx_color; + spi_panel_io->base.del = panel_io_spi_del; + spi_panel_io->base.register_event_callbacks = panel_io_spi_register_event_callbacks; + + size_t max_trans_bytes = 0; + ESP_GOTO_ON_ERROR(spi_bus_get_max_transaction_len((spi_host_device_t)bus, &max_trans_bytes), err, TAG, "get spi max transaction len failed"); + spi_panel_io->spi_trans_max_bytes = max_trans_bytes; + + *ret_io = &(spi_panel_io->base); + ESP_LOGD(TAG, "new spi lcd panel io @%p, max_trans_bytes: %d", spi_panel_io, (int)max_trans_bytes); + + return ESP_OK; + +err: + if (spi_panel_io) { + if (io_config->dc_gpio_num >= 0) { + gpio_reset_pin(io_config->dc_gpio_num); + } + free(spi_panel_io); + } + return ret; +} + +static esp_err_t panel_io_spi_del(esp_lcd_panel_io_t *io) +{ + esp_err_t ret = ESP_OK; + spi_transaction_t *spi_trans = NULL; + esp_lcd_panel_io_spi_t *spi_panel_io = __containerof(io, esp_lcd_panel_io_spi_t, base); + + // wait all pending transaction to finish + size_t num_trans_inflight = spi_panel_io->num_trans_inflight; + for (size_t i = 0; i < num_trans_inflight; i++) { + ret = spi_device_get_trans_result(spi_panel_io->spi_dev, &spi_trans, portMAX_DELAY); + ESP_GOTO_ON_ERROR(ret, err, TAG, "recycle spi transactions failed"); + spi_panel_io->num_trans_inflight--; + } + spi_bus_remove_device(spi_panel_io->spi_dev); + if (spi_panel_io->dc_gpio_num >= 0) { + gpio_reset_pin(spi_panel_io->dc_gpio_num); + } + ESP_LOGD(TAG, "del lcd panel io spi @%p", spi_panel_io); + free(spi_panel_io); + +err: + return ret; +} + +static esp_err_t panel_io_spi_register_event_callbacks(esp_lcd_panel_io_handle_t io, const esp_lcd_panel_io_callbacks_t *cbs, void *user_ctx) +{ + esp_lcd_panel_io_spi_t *spi_panel_io = __containerof(io, esp_lcd_panel_io_spi_t, base); + + if (spi_panel_io->on_color_trans_done != NULL) { + ESP_LOGW(TAG, "Callback on_color_trans_done was already set and now it was overwritten!"); + } + + spi_panel_io->on_color_trans_done = cbs->on_color_trans_done; + spi_panel_io->user_ctx = user_ctx; + + return ESP_OK; +} + +static void spi_lcd_prepare_cmd_buffer(esp_lcd_panel_io_spi_t *panel_io, const void *cmd) +{ + uint8_t *from = (uint8_t *)cmd; + // LCD is big-endian, e.g. to send command 0x1234, byte 0x12 should appear on the bus first + // However, the SPI peripheral will send 0x34 first, so we reversed the order below + if (panel_io->lcd_cmd_bits > 8) { + int start = 0; + int end = panel_io->lcd_cmd_bits / 8 - 1; + lcd_com_reverse_buffer_bytes(from, start, end); + } +} + +static void spi_lcd_prepare_param_buffer(esp_lcd_panel_io_spi_t *panel_io, const void *param, size_t param_size) +{ + uint8_t *from = (uint8_t *)param; + int param_width = panel_io->lcd_param_bits / 8; + size_t param_num = param_size / param_width; + // LCD is big-endian, e.g. to send command 0x1234, byte 0x12 should appear on the bus first + // However, the SPI peripheral will send 0x34 first, so we reversed the order below + if (panel_io->lcd_param_bits > 8) { + for (size_t i = 0; i < param_num; i++) { + int start = i * param_width; + int end = start + param_width - 1; + lcd_com_reverse_buffer_bytes(from, start, end); + } + } +} + +static esp_err_t panel_io_spi_tx_param(esp_lcd_panel_io_t *io, int lcd_cmd, const void *param, size_t param_size) +{ + esp_err_t ret = ESP_OK; + spi_transaction_t *spi_trans = NULL; + lcd_spi_trans_descriptor_t *lcd_trans = NULL; + esp_lcd_panel_io_spi_t *spi_panel_io = __containerof(io, esp_lcd_panel_io_spi_t, base); + bool send_cmd = (lcd_cmd >= 0); + + ESP_RETURN_ON_ERROR(spi_device_acquire_bus(spi_panel_io->spi_dev, portMAX_DELAY), TAG, "acquire spi bus failed"); + + // before issue a polling transaction, need to wait queued transactions finished + size_t num_trans_inflight = spi_panel_io->num_trans_inflight; + for (size_t i = 0; i < num_trans_inflight; i++) { + ret = spi_device_get_trans_result(spi_panel_io->spi_dev, &spi_trans, portMAX_DELAY); + ESP_GOTO_ON_ERROR(ret, err, TAG, "recycle spi transactions failed"); + spi_panel_io->num_trans_inflight--; + } + lcd_trans = &spi_panel_io->trans_pool[0]; + memset(lcd_trans, 0, sizeof(lcd_spi_trans_descriptor_t)); + + lcd_trans->base.user = spi_panel_io; + if (param && param_size) { + lcd_trans->base.flags |= SPI_TRANS_CS_KEEP_ACTIVE; + } + if (spi_panel_io->flags.octal_mode) { + // use 8 lines for transmitting command, address and data + lcd_trans->base.flags |= (SPI_TRANS_MULTILINE_CMD | SPI_TRANS_MULTILINE_ADDR | SPI_TRANS_MODE_OCT); + } + + if (send_cmd) { + spi_lcd_prepare_cmd_buffer(spi_panel_io, &lcd_cmd); + lcd_trans->flags.dc_gpio_level = !spi_panel_io->flags.dc_data_level; // set D/C line to command mode + lcd_trans->base.length = spi_panel_io->lcd_cmd_bits; + lcd_trans->base.tx_buffer = &lcd_cmd; + // command is short, using polling mode + ret = spi_device_polling_transmit(spi_panel_io->spi_dev, &lcd_trans->base); + ESP_GOTO_ON_ERROR(ret, err, TAG, "spi transmit (polling) command failed"); + } + + if (param && param_size) { + spi_lcd_prepare_param_buffer(spi_panel_io, param, param_size); + lcd_trans->flags.dc_gpio_level = spi_panel_io->flags.dc_data_level; // set D/C line to data mode + lcd_trans->base.length = param_size * 8; // transaction length is in bits + lcd_trans->base.tx_buffer = param; + lcd_trans->base.flags &= ~SPI_TRANS_CS_KEEP_ACTIVE; + // parameter is usually short, using polling mode + ret = spi_device_polling_transmit(spi_panel_io->spi_dev, &lcd_trans->base); + ESP_GOTO_ON_ERROR(ret, err, TAG, "spi transmit (polling) param failed"); + } + +err: + spi_device_release_bus(spi_panel_io->spi_dev); + + return ret; +} + +static esp_err_t panel_io_spi_rx_param(esp_lcd_panel_io_t *io, int lcd_cmd, void *param, size_t param_size) +{ + esp_err_t ret = ESP_OK; + spi_transaction_t *spi_trans = NULL; + lcd_spi_trans_descriptor_t *lcd_trans = NULL; + esp_lcd_panel_io_spi_t *spi_panel_io = __containerof(io, esp_lcd_panel_io_spi_t, base); + bool send_cmd = (lcd_cmd >= 0); + + ESP_RETURN_ON_ERROR(spi_device_acquire_bus(spi_panel_io->spi_dev, portMAX_DELAY), TAG, "acquire spi bus failed"); + + // before issue a polling transaction, need to wait queued transactions finished + size_t num_trans_inflight = spi_panel_io->num_trans_inflight; + for (size_t i = 0; i < num_trans_inflight; i++) { + ret = spi_device_get_trans_result(spi_panel_io->spi_dev, &spi_trans, portMAX_DELAY); + ESP_GOTO_ON_ERROR(ret, err, TAG, "recycle spi transactions failed"); + spi_panel_io->num_trans_inflight--; + } + lcd_trans = &spi_panel_io->trans_pool[0]; + memset(lcd_trans, 0, sizeof(lcd_spi_trans_descriptor_t)); + + lcd_trans->base.user = spi_panel_io; + lcd_trans->base.flags |= SPI_TRANS_CS_KEEP_ACTIVE; + if (spi_panel_io->flags.octal_mode) { + // use 8 lines for transmitting command, address and data + lcd_trans->base.flags |= (SPI_TRANS_MULTILINE_CMD | SPI_TRANS_MULTILINE_ADDR | SPI_TRANS_MODE_OCT); + } + + if (send_cmd) { + spi_lcd_prepare_cmd_buffer(spi_panel_io, &lcd_cmd); + lcd_trans->flags.dc_gpio_level = !spi_panel_io->flags.dc_data_level; // set D/C line to command mode + lcd_trans->base.length = spi_panel_io->lcd_cmd_bits; + lcd_trans->base.tx_buffer = &lcd_cmd; + // command is short, using polling mode + ret = spi_device_polling_transmit(spi_panel_io->spi_dev, &lcd_trans->base); + ESP_GOTO_ON_ERROR(ret, err, TAG, "spi transmit (polling) command failed"); + } + + if (param && param_size) { + lcd_trans->flags.dc_gpio_level = spi_panel_io->flags.dc_data_level; // set D/C line to data mode + lcd_trans->base.length = 0; + lcd_trans->base.tx_buffer = NULL; + lcd_trans->base.rxlength = param_size * 8; // Read length in bits + lcd_trans->base.rx_buffer = param; + lcd_trans->base.flags &= ~SPI_TRANS_CS_KEEP_ACTIVE; + // parameter is usually short, using polling mode + ret = spi_device_polling_transmit(spi_panel_io->spi_dev, &lcd_trans->base); + ESP_GOTO_ON_ERROR(ret, err, TAG, "spi transmit (polling) param failed"); + } + +err: + spi_device_release_bus(spi_panel_io->spi_dev); + + return ret; +} + +static esp_err_t panel_io_spi_tx_color(esp_lcd_panel_io_t *io, int lcd_cmd, const void *color, size_t color_size) +{ + esp_err_t ret = ESP_OK; + spi_transaction_t *spi_trans = NULL; + lcd_spi_trans_descriptor_t *lcd_trans = NULL; + esp_lcd_panel_io_spi_t *spi_panel_io = __containerof(io, esp_lcd_panel_io_spi_t, base); + + ESP_RETURN_ON_ERROR(spi_device_acquire_bus(spi_panel_io->spi_dev, portMAX_DELAY), TAG, "acquire spi bus failed"); + + bool send_cmd = (lcd_cmd >= 0); + if (send_cmd) { + // before issue a polling transaction, need to wait queued transactions finished + size_t num_trans_inflight = spi_panel_io->num_trans_inflight; + for (size_t i = 0; i < num_trans_inflight; i++) { + ret = spi_device_get_trans_result(spi_panel_io->spi_dev, &spi_trans, portMAX_DELAY); + ESP_GOTO_ON_ERROR(ret, err, TAG, "recycle spi transactions failed"); + spi_panel_io->num_trans_inflight--; + } + lcd_trans = &spi_panel_io->trans_pool[0]; + memset(lcd_trans, 0, sizeof(lcd_spi_trans_descriptor_t)); + + spi_lcd_prepare_cmd_buffer(spi_panel_io, &lcd_cmd); + lcd_trans->base.user = spi_panel_io; + lcd_trans->flags.dc_gpio_level = !spi_panel_io->flags.dc_data_level; // set D/C line to command mode + lcd_trans->base.length = spi_panel_io->lcd_cmd_bits; + lcd_trans->base.tx_buffer = &lcd_cmd; + if (color && color_size) { + lcd_trans->base.flags |= SPI_TRANS_CS_KEEP_ACTIVE; + } + if (spi_panel_io->flags.octal_mode) { + // use 8 lines for transmitting command, address and data + lcd_trans->base.flags |= (SPI_TRANS_MULTILINE_CMD | SPI_TRANS_MULTILINE_ADDR | SPI_TRANS_MODE_OCT); + } + // command is short, using polling mode + ret = spi_device_polling_transmit(spi_panel_io->spi_dev, &lcd_trans->base); + ESP_GOTO_ON_ERROR(ret, err, TAG, "spi transmit (polling) command failed"); + } + + // if the color buffer is big, we want to split it into chunks, and queue the chunks one by one + do { + size_t chunk_size = color_size; + + if (spi_panel_io->num_trans_inflight < spi_panel_io->queue_size) { + // get the next available transaction + lcd_trans = &spi_panel_io->trans_pool[spi_panel_io->num_trans_inflight]; + } else { + // transaction pool has used up, recycle one transaction + ret = spi_device_get_trans_result(spi_panel_io->spi_dev, &spi_trans, portMAX_DELAY); + ESP_GOTO_ON_ERROR(ret, err, TAG, "recycle spi transactions failed"); + lcd_trans = __containerof(spi_trans, lcd_spi_trans_descriptor_t, base); + spi_panel_io->num_trans_inflight--; + } + memset(lcd_trans, 0, sizeof(lcd_spi_trans_descriptor_t)); + + // SPI per-transfer size has its limitation, if the color buffer is too big, we need to split it into multiple chunks + if (chunk_size > spi_panel_io->spi_trans_max_bytes) { + // cap the transfer size to the maximum supported by the bus + chunk_size = spi_panel_io->spi_trans_max_bytes; + lcd_trans->base.flags |= SPI_TRANS_CS_KEEP_ACTIVE; + } else { + // mark en_trans_done_cb only at the last round to avoid premature completion callback + lcd_trans->flags.en_trans_done_cb = 1; + lcd_trans->base.flags &= ~SPI_TRANS_CS_KEEP_ACTIVE; + } + + lcd_trans->base.user = spi_panel_io; + lcd_trans->flags.dc_gpio_level = spi_panel_io->flags.dc_data_level; // set D/C line to data mode + lcd_trans->base.length = chunk_size * 8; // transaction length is in bits + lcd_trans->base.tx_buffer = color; + if (spi_panel_io->flags.octal_mode) { + // use 8 lines for transmitting command, address and data + lcd_trans->base.flags |= (SPI_TRANS_MULTILINE_CMD | SPI_TRANS_MULTILINE_ADDR | SPI_TRANS_MODE_OCT); + } else if (spi_panel_io->flags.quad_mode) { + // use 4 lines only for transmitting data + lcd_trans->base.flags |= SPI_TRANS_MODE_QIO; + } + + // color data is usually large, using queue+blocking mode + ret = spi_device_queue_trans(spi_panel_io->spi_dev, &lcd_trans->base, portMAX_DELAY); + ESP_GOTO_ON_ERROR(ret, err, TAG, "spi transmit (queue) color failed"); + spi_panel_io->num_trans_inflight++; + + // move on to the next chunk + color = (const uint8_t *)color + chunk_size; + color_size -= chunk_size; + } while (color_size > 0); // continue while we have remaining data to transmit + +err: + spi_device_release_bus(spi_panel_io->spi_dev); + return ret; +} + +static void lcd_spi_pre_trans_cb(spi_transaction_t *trans) +{ + esp_lcd_panel_io_spi_t *spi_panel_io = trans->user; + lcd_spi_trans_descriptor_t *lcd_trans = __containerof(trans, lcd_spi_trans_descriptor_t, base); + if (spi_panel_io->dc_gpio_num >= 0) { // set D/C line level if necessary + gpio_set_level(spi_panel_io->dc_gpio_num, lcd_trans->flags.dc_gpio_level); + } +} + +static void lcd_spi_post_trans_color_cb(spi_transaction_t *trans) +{ + esp_lcd_panel_io_spi_t *spi_panel_io = trans->user; + lcd_spi_trans_descriptor_t *lcd_trans = __containerof(trans, lcd_spi_trans_descriptor_t, base); + if (lcd_trans->flags.en_trans_done_cb) { + if (spi_panel_io->on_color_trans_done) { + spi_panel_io->on_color_trans_done(&spi_panel_io->base, NULL, spi_panel_io->user_ctx); + } + } +} diff --git a/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_nt35510.c b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_nt35510.c new file mode 100644 index 000000000..7fbe7ab37 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_nt35510.c @@ -0,0 +1,319 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include "sdkconfig.h" + +#if CONFIG_LCD_ENABLE_DEBUG_LOG +// The local log level must be defined before including esp_log.h +// Set the maximum log level for this source file +#define LOG_LOCAL_LEVEL ESP_LOG_DEBUG +#endif + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_lcd_panel_interface.h" +#include "esp_lcd_panel_io.h" +#include "esp_lcd_panel_vendor.h" +#include "esp_lcd_panel_ops.h" +#include "esp_lcd_panel_commands.h" +#include "driver/gpio.h" +#include "esp_log.h" +#include "esp_check.h" + +static const char *TAG = "lcd_panel.nt35510"; + +static esp_err_t panel_nt35510_del(esp_lcd_panel_t *panel); +static esp_err_t panel_nt35510_reset(esp_lcd_panel_t *panel); +static esp_err_t panel_nt35510_init(esp_lcd_panel_t *panel); +static esp_err_t panel_nt35510_draw_bitmap(esp_lcd_panel_t *panel, int x_start, int y_start, int x_end, int y_end, + const void *color_data); +static esp_err_t panel_nt35510_invert_color(esp_lcd_panel_t *panel, bool invert_color_data); +static esp_err_t panel_nt35510_mirror(esp_lcd_panel_t *panel, bool mirror_x, bool mirror_y); +static esp_err_t panel_nt35510_swap_xy(esp_lcd_panel_t *panel, bool swap_axes); +static esp_err_t panel_nt35510_set_gap(esp_lcd_panel_t *panel, int x_gap, int y_gap); +static esp_err_t panel_nt35510_disp_on_off(esp_lcd_panel_t *panel, bool off); +static esp_err_t panel_nt35510_sleep(esp_lcd_panel_t *panel, bool sleep); + +typedef struct { + esp_lcd_panel_t base; + esp_lcd_panel_io_handle_t io; + int reset_gpio_num; + bool reset_level; + int x_gap; + int y_gap; + uint8_t fb_bits_per_pixel; + uint8_t madctl_val; // save current value of LCD_CMD_MADCTL register + uint8_t colmod_val; // save current value of LCD_CMD_COLMOD register +} nt35510_panel_t; + +esp_err_t +esp_lcd_new_panel_nt35510(const esp_lcd_panel_io_handle_t io, const esp_lcd_panel_dev_config_t *panel_dev_config, + esp_lcd_panel_handle_t *ret_panel) +{ +#if CONFIG_LCD_ENABLE_DEBUG_LOG + esp_log_level_set(TAG, ESP_LOG_DEBUG); +#endif + esp_err_t ret = ESP_OK; + nt35510_panel_t *nt35510 = NULL; + ESP_GOTO_ON_FALSE(io && panel_dev_config && ret_panel, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + nt35510 = calloc(1, sizeof(nt35510_panel_t)); + ESP_GOTO_ON_FALSE(nt35510, ESP_ERR_NO_MEM, err, TAG, "no mem for nt35510 panel"); + + if (panel_dev_config->reset_gpio_num >= 0) { + gpio_config_t io_conf = { + .mode = GPIO_MODE_OUTPUT, + .pin_bit_mask = 1ULL << panel_dev_config->reset_gpio_num, + }; + ESP_GOTO_ON_ERROR(gpio_config(&io_conf), err, TAG, "configure GPIO for RST line failed"); + } + + switch (panel_dev_config->rgb_ele_order) { + case LCD_RGB_ELEMENT_ORDER_RGB: + nt35510->madctl_val = 0; + break; + case LCD_RGB_ELEMENT_ORDER_BGR: + nt35510->madctl_val |= LCD_CMD_BGR_BIT; + break; + default: + ESP_GOTO_ON_FALSE(false, ESP_ERR_NOT_SUPPORTED, err, TAG, "unsupported color space"); + break; + } + + uint8_t fb_bits_per_pixel = 0; + switch (panel_dev_config->bits_per_pixel) { + case 16: // RGB565 + nt35510->colmod_val = 0x55; + fb_bits_per_pixel = 16; + break; + case 18: // RGB666 + nt35510->colmod_val = 0x66; + // each color component (R/G/B) should occupy the 6 high bits of a byte, which means 3 full bytes are required for a pixel + fb_bits_per_pixel = 24; + break; + case 24: // RGB888 + nt35510->colmod_val = 0x77; + fb_bits_per_pixel = 24; + break; + default: + ESP_GOTO_ON_FALSE(false, ESP_ERR_NOT_SUPPORTED, err, TAG, "unsupported pixel width"); + break; + } + + nt35510->io = io; + nt35510->fb_bits_per_pixel = fb_bits_per_pixel; + nt35510->reset_gpio_num = panel_dev_config->reset_gpio_num; + nt35510->reset_level = panel_dev_config->flags.reset_active_high; + nt35510->base.del = panel_nt35510_del; + nt35510->base.reset = panel_nt35510_reset; + nt35510->base.init = panel_nt35510_init; + nt35510->base.draw_bitmap = panel_nt35510_draw_bitmap; + nt35510->base.invert_color = panel_nt35510_invert_color; + nt35510->base.set_gap = panel_nt35510_set_gap; + nt35510->base.mirror = panel_nt35510_mirror; + nt35510->base.swap_xy = panel_nt35510_swap_xy; + nt35510->base.disp_on_off = panel_nt35510_disp_on_off; + nt35510->base.disp_sleep = panel_nt35510_sleep; + *ret_panel = &(nt35510->base); + ESP_LOGD(TAG, "new nt35510 panel @%p", nt35510); + + return ESP_OK; + +err: + if (nt35510) { + if (panel_dev_config->reset_gpio_num >= 0) { + gpio_reset_pin(panel_dev_config->reset_gpio_num); + } + free(nt35510); + } + return ret; +} + +static esp_err_t panel_nt35510_del(esp_lcd_panel_t *panel) +{ + nt35510_panel_t *nt35510 = __containerof(panel, nt35510_panel_t, base); + + if (nt35510->reset_gpio_num >= 0) { + gpio_reset_pin(nt35510->reset_gpio_num); + } + ESP_LOGD(TAG, "del nt35510 panel @%p", nt35510); + free(nt35510); + return ESP_OK; +} + +static esp_err_t panel_nt35510_reset(esp_lcd_panel_t *panel) +{ + nt35510_panel_t *nt35510 = __containerof(panel, nt35510_panel_t, base); + esp_lcd_panel_io_handle_t io = nt35510->io; + + // perform hardware reset + if (nt35510->reset_gpio_num >= 0) { + gpio_set_level(nt35510->reset_gpio_num, nt35510->reset_level); + vTaskDelay(pdMS_TO_TICKS(10)); + gpio_set_level(nt35510->reset_gpio_num, !nt35510->reset_level); + vTaskDelay(pdMS_TO_TICKS(10)); + } else { + // perform software reset + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, LCD_CMD_SWRESET << 8, NULL, 0), TAG, + "io tx param failed"); + vTaskDelay(pdMS_TO_TICKS(20)); // spec, wait at least 5m before sending new command + } + + return ESP_OK; +} + +static esp_err_t panel_nt35510_init(esp_lcd_panel_t *panel) +{ + nt35510_panel_t *nt35510 = __containerof(panel, nt35510_panel_t, base); + esp_lcd_panel_io_handle_t io = nt35510->io; + // LCD goes into sleep mode and display will be turned off after power on reset, exit sleep mode first + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, LCD_CMD_SLPOUT << 8, NULL, 0), TAG, + "io tx param failed");; + vTaskDelay(pdMS_TO_TICKS(100)); + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, LCD_CMD_MADCTL << 8, (uint16_t[]) { + nt35510->madctl_val, + }, 2), TAG, "io tx param failed"); + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, LCD_CMD_COLMOD << 8, (uint16_t[]) { + nt35510->colmod_val, + }, 2), TAG, "io tx param failed"); + + return ESP_OK; +} + +static esp_err_t panel_nt35510_draw_bitmap(esp_lcd_panel_t *panel, int x_start, int y_start, int x_end, int y_end, + const void *color_data) +{ + nt35510_panel_t *nt35510 = __containerof(panel, nt35510_panel_t, base); + assert((x_start < x_end) && (y_start < y_end) && "start position must be smaller than end position"); + esp_lcd_panel_io_handle_t io = nt35510->io; + + x_start += nt35510->x_gap; + x_end += nt35510->x_gap; + y_start += nt35510->y_gap; + y_end += nt35510->y_gap; + + // define an area of frame memory where MCU can access + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_CASET << 8) + 0, (uint16_t[]) { + (x_start >> 8) & 0xFF, + }, 2), TAG, "io tx param failed"); + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_CASET << 8) + 1, (uint16_t[]) { + x_start & 0xFF, + }, 2), TAG, "io tx param failed"); + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_CASET << 8) + 2, (uint16_t[]) { + ((x_end - 1) >> 8) & 0xFF, + }, 2), TAG, "io tx param failed"); + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_CASET << 8) + 3, (uint16_t[]) { + (x_end - 1) & 0xFF, + }, 2), TAG, "io tx param failed"); + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_RASET << 8) + 0, (uint16_t[]) { + (y_start >> 8) & 0xFF, + }, 2), TAG, "io tx param failed"); + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_RASET << 8) + 1, (uint16_t[]) { + y_start & 0xFF, + }, 2), TAG, "io tx param failed"); + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_RASET << 8) + 2, (uint16_t[]) { + ((y_end - 1) >> 8) & 0xFF, + }, 2), TAG, "io tx param failed"); + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_RASET << 8) + 3, (uint16_t[]) { + (y_end - 1) & 0xFF, + }, 2), TAG, "io tx param failed"); + // transfer frame buffer + size_t len = (x_end - x_start) * (y_end - y_start) * nt35510->fb_bits_per_pixel / 8; + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_color(io, LCD_CMD_RAMWR << 8, color_data, len), TAG, "io tx color failed"); + + return ESP_OK; +} + +static esp_err_t panel_nt35510_invert_color(esp_lcd_panel_t *panel, bool invert_color_data) +{ + nt35510_panel_t *nt35510 = __containerof(panel, nt35510_panel_t, base); + esp_lcd_panel_io_handle_t io = nt35510->io; + int command = 0; + if (invert_color_data) { + command = LCD_CMD_INVON; + } else { + command = LCD_CMD_INVOFF; + } + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, command << 8, NULL, 0), TAG, + "io tx param failed"); + return ESP_OK; +} + +static esp_err_t panel_nt35510_mirror(esp_lcd_panel_t *panel, bool mirror_x, bool mirror_y) +{ + nt35510_panel_t *nt35510 = __containerof(panel, nt35510_panel_t, base); + esp_lcd_panel_io_handle_t io = nt35510->io; + if (mirror_x) { + nt35510->madctl_val |= LCD_CMD_MX_BIT; + } else { + nt35510->madctl_val &= ~LCD_CMD_MX_BIT; + } + if (mirror_y) { + nt35510->madctl_val |= LCD_CMD_MY_BIT; + } else { + nt35510->madctl_val &= ~LCD_CMD_MY_BIT; + } + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, LCD_CMD_MADCTL << 8, (uint16_t[]) { + nt35510->madctl_val + }, 2), TAG, "io tx param failed"); + return ESP_OK; +} + +static esp_err_t panel_nt35510_swap_xy(esp_lcd_panel_t *panel, bool swap_axes) +{ + nt35510_panel_t *nt35510 = __containerof(panel, nt35510_panel_t, base); + esp_lcd_panel_io_handle_t io = nt35510->io; + if (swap_axes) { + nt35510->madctl_val |= LCD_CMD_MV_BIT; + } else { + nt35510->madctl_val &= ~LCD_CMD_MV_BIT; + } + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, LCD_CMD_MADCTL << 8, (uint16_t[]) { + nt35510->madctl_val + }, 2), TAG, "io tx param failed"); + return ESP_OK; +} + +static esp_err_t panel_nt35510_set_gap(esp_lcd_panel_t *panel, int x_gap, int y_gap) +{ + nt35510_panel_t *nt35510 = __containerof(panel, nt35510_panel_t, base); + nt35510->x_gap = x_gap; + nt35510->y_gap = y_gap; + return ESP_OK; +} + +static esp_err_t panel_nt35510_disp_on_off(esp_lcd_panel_t *panel, bool on_off) +{ + nt35510_panel_t *nt35510 = __containerof(panel, nt35510_panel_t, base); + esp_lcd_panel_io_handle_t io = nt35510->io; + int command = 0; + if (on_off) { + command = LCD_CMD_DISPON; + } else { + command = LCD_CMD_DISPOFF; + } + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, command << 8, NULL, 0), TAG, + "io tx param failed"); + return ESP_OK; +} + +static esp_err_t panel_nt35510_sleep(esp_lcd_panel_t *panel, bool sleep) +{ + nt35510_panel_t *nt35510 = __containerof(panel, nt35510_panel_t, base); + esp_lcd_panel_io_handle_t io = nt35510->io; + int command = 0; + if (sleep) { + command = LCD_CMD_SLPIN; + } else { + command = LCD_CMD_SLPOUT; + } + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, command, NULL, 0), TAG, + "io tx param failed"); + vTaskDelay(pdMS_TO_TICKS(100)); + + return ESP_OK; +} diff --git a/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_ops.c b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_ops.c new file mode 100644 index 000000000..1e03be92d --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_ops.c @@ -0,0 +1,77 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "esp_check.h" +#include "esp_lcd_panel_ops.h" +#include "esp_lcd_panel_interface.h" + +static const char *TAG = "lcd_panel"; + +esp_err_t esp_lcd_panel_reset(esp_lcd_panel_handle_t panel) +{ + ESP_RETURN_ON_FALSE(panel, ESP_ERR_INVALID_ARG, TAG, "invalid panel handle"); + return panel->reset(panel); +} + +esp_err_t esp_lcd_panel_init(esp_lcd_panel_handle_t panel) +{ + ESP_RETURN_ON_FALSE(panel, ESP_ERR_INVALID_ARG, TAG, "invalid panel handle"); + return panel->init(panel); +} + +esp_err_t esp_lcd_panel_del(esp_lcd_panel_handle_t panel) +{ + ESP_RETURN_ON_FALSE(panel, ESP_ERR_INVALID_ARG, TAG, "invalid panel handle"); + return panel->del(panel); +} + +esp_err_t esp_lcd_panel_draw_bitmap(esp_lcd_panel_handle_t panel, int x_start, int y_start, int x_end, int y_end, const void *color_data) +{ + ESP_RETURN_ON_FALSE(panel, ESP_ERR_INVALID_ARG, TAG, "invalid panel handle"); + return panel->draw_bitmap(panel, x_start, y_start, x_end, y_end, color_data); +} + +esp_err_t esp_lcd_panel_mirror(esp_lcd_panel_handle_t panel, bool mirror_x, bool mirror_y) +{ + ESP_RETURN_ON_FALSE(panel, ESP_ERR_INVALID_ARG, TAG, "invalid panel handle"); + return panel->mirror(panel, mirror_x, mirror_y); +} + +esp_err_t esp_lcd_panel_swap_xy(esp_lcd_panel_handle_t panel, bool swap_axes) +{ + ESP_RETURN_ON_FALSE(panel, ESP_ERR_INVALID_ARG, TAG, "invalid panel handle"); + return panel->swap_xy(panel, swap_axes); +} + +esp_err_t esp_lcd_panel_set_gap(esp_lcd_panel_handle_t panel, int x_gap, int y_gap) +{ + ESP_RETURN_ON_FALSE(panel, ESP_ERR_INVALID_ARG, TAG, "invalid panel handle"); + return panel->set_gap(panel, x_gap, y_gap); +} + +esp_err_t esp_lcd_panel_invert_color(esp_lcd_panel_handle_t panel, bool invert_color_data) +{ + ESP_RETURN_ON_FALSE(panel, ESP_ERR_INVALID_ARG, TAG, "invalid panel handle"); + return panel->invert_color(panel, invert_color_data); +} + +esp_err_t esp_lcd_panel_disp_on_off(esp_lcd_panel_handle_t panel, bool on_off) +{ + ESP_RETURN_ON_FALSE(panel, ESP_ERR_INVALID_ARG, TAG, "invalid panel handle"); + return panel->disp_on_off(panel, on_off); +} + +esp_err_t esp_lcd_panel_disp_off(esp_lcd_panel_handle_t panel, bool off) +{ + return esp_lcd_panel_disp_on_off(panel, !off); +} + +esp_err_t esp_lcd_panel_disp_sleep(esp_lcd_panel_handle_t panel, bool sleep) +{ + ESP_RETURN_ON_FALSE(panel, ESP_ERR_INVALID_ARG, TAG, "invalid panel handle"); + ESP_RETURN_ON_FALSE(panel->disp_sleep, ESP_ERR_NOT_SUPPORTED, TAG, "sleep is not supported by this panel"); + return panel->disp_sleep(panel, sleep); +} diff --git a/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_rgb.c b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_rgb.c new file mode 100644 index 000000000..d0373b693 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_rgb.c @@ -0,0 +1,1141 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include +#include "sdkconfig.h" +#if CONFIG_LCD_ENABLE_DEBUG_LOG +// The local log level must be defined before including esp_log.h +// Set the maximum log level for this source file +#define LOG_LOCAL_LEVEL ESP_LOG_DEBUG +#endif +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "esp_attr.h" +#include "esp_check.h" +#include "esp_pm.h" +#include "esp_lcd_panel_interface.h" +#include "esp_lcd_panel_rgb.h" +#include "esp_lcd_panel_ops.h" +#include "esp_rom_gpio.h" +#include "soc/soc_caps.h" +#include "esp_clk_tree.h" +#include "hal/dma_types.h" +#include "hal/gpio_hal.h" +#include "esp_private/gdma.h" +#include "driver/gpio.h" +#include "esp_bit_defs.h" +#include "esp_private/periph_ctrl.h" +#include "esp_psram.h" +#include "esp_lcd_common.h" +#include "soc/lcd_periph.h" +#include "hal/lcd_hal.h" +#include "hal/lcd_ll.h" +#include "hal/gdma_ll.h" +#include "rom/cache.h" +#include "esp_cache.h" + + +#if CONFIG_LCD_RGB_ISR_IRAM_SAFE +#define LCD_RGB_INTR_ALLOC_FLAGS (ESP_INTR_FLAG_IRAM | ESP_INTR_FLAG_INTRDISABLED) +#else +#define LCD_RGB_INTR_ALLOC_FLAGS ESP_INTR_FLAG_INTRDISABLED +#endif + +#define RGB_LCD_PANEL_MAX_FB_NUM 3 // maximum supported frame buffer number +#define RGB_LCD_PANEL_BOUNCE_BUF_NUM 2 // bounce buffer number +#define RGB_LCD_PANEL_DMA_LINKS_REPLICA MAX(RGB_LCD_PANEL_MAX_FB_NUM, RGB_LCD_PANEL_BOUNCE_BUF_NUM) + +#define RGB_PANEL_SWAP_XY 0 +#define RGB_PANEL_MIRROR_Y 1 +#define RGB_PANEL_MIRROR_X 2 + +typedef enum { + ROTATE_MASK_SWAP_XY = BIT(RGB_PANEL_SWAP_XY), + ROTATE_MASK_MIRROR_Y = BIT(RGB_PANEL_MIRROR_Y), + ROTATE_MASK_MIRROR_X = BIT(RGB_PANEL_MIRROR_X), +} panel_rotate_mask_t; + +static const char *TAG = "lcd_panel.rgb"; + +typedef struct esp_rgb_panel_t esp_rgb_panel_t; + +static esp_err_t rgb_panel_del(esp_lcd_panel_t *panel); +static esp_err_t rgb_panel_reset(esp_lcd_panel_t *panel); +static esp_err_t rgb_panel_init(esp_lcd_panel_t *panel); +static esp_err_t rgb_panel_draw_bitmap(esp_lcd_panel_t *panel, int x_start, int y_start, int x_end, int y_end, const void *color_data); +static esp_err_t rgb_panel_invert_color(esp_lcd_panel_t *panel, bool invert_color_data); +static esp_err_t rgb_panel_mirror(esp_lcd_panel_t *panel, bool mirror_x, bool mirror_y); +static esp_err_t rgb_panel_swap_xy(esp_lcd_panel_t *panel, bool swap_axes); +static esp_err_t rgb_panel_set_gap(esp_lcd_panel_t *panel, int x_gap, int y_gap); +static esp_err_t rgb_panel_disp_on_off(esp_lcd_panel_t *panel, bool off); +static esp_err_t lcd_rgb_panel_select_clock_src(esp_rgb_panel_t *panel, lcd_clock_source_t clk_src); +static esp_err_t lcd_rgb_panel_create_trans_link(esp_rgb_panel_t *panel); +static esp_err_t lcd_rgb_panel_configure_gpio(esp_rgb_panel_t *panel, const esp_lcd_rgb_panel_config_t *panel_config); +static void lcd_rgb_panel_start_transmission(esp_rgb_panel_t *rgb_panel); +static void lcd_default_isr_handler(void *args); + +struct esp_rgb_panel_t { + esp_lcd_panel_t base; // Base class of generic lcd panel + int panel_id; // LCD panel ID + lcd_hal_context_t hal; // Hal layer object + size_t data_width; // Number of data lines + size_t fb_bits_per_pixel; // Frame buffer color depth, in bpp + size_t num_fbs; // Number of frame buffers + size_t output_bits_per_pixel; // Color depth seen from the output data line. Default to fb_bits_per_pixel, but can be changed by YUV-RGB conversion + size_t sram_trans_align; // Alignment for framebuffer that allocated in SRAM + size_t psram_trans_align; // Alignment for framebuffer that allocated in PSRAM + int disp_gpio_num; // Display control GPIO, which is used to perform action like "disp_off" + intr_handle_t intr; // LCD peripheral interrupt handle + esp_pm_lock_handle_t pm_lock; // Power management lock + size_t num_dma_nodes; // Number of DMA descriptors that used to carry the frame buffer + uint8_t *fbs[RGB_LCD_PANEL_MAX_FB_NUM]; // Frame buffers + uint8_t cur_fb_index; // Current frame buffer index + uint8_t bb_fb_index; // Current frame buffer index which used by bounce buffer + size_t fb_size; // Size of frame buffer + int data_gpio_nums[SOC_LCD_RGB_DATA_WIDTH]; // GPIOs used for data lines, we keep these GPIOs for action like "invert_color" + uint32_t src_clk_hz; // Peripheral source clock resolution + esp_lcd_rgb_timing_t timings; // RGB timing parameters (e.g. pclk, sync pulse, porch width) + size_t bb_size; // If not-zero, the driver uses two bounce buffers allocated from internal memory + int bounce_pos_px; // Position in whatever source material is used for the bounce buffer, in pixels + uint8_t *bounce_buffer[RGB_LCD_PANEL_BOUNCE_BUF_NUM]; // Pointer to the bounce buffers + size_t bb_eof_count; // record the number we received the DMA EOF event, compare with `expect_eof_count` in the VSYNC_END ISR + size_t expect_eof_count; // record the number of DMA EOF event we expected to receive + gdma_channel_handle_t dma_chan; // DMA channel handle + esp_lcd_rgb_panel_vsync_cb_t on_vsync; // VSYNC event callback + esp_lcd_rgb_panel_bounce_buf_fill_cb_t on_bounce_empty; // callback used to fill a bounce buffer rather than copying from the frame buffer + esp_lcd_rgb_panel_bounce_buf_finish_cb_t on_bounce_frame_finish; // callback used to notify when the bounce buffer finish copying the entire frame + void *user_ctx; // Reserved user's data of callback functions + int x_gap; // Extra gap in x coordinate, it's used when calculate the flush window + int y_gap; // Extra gap in y coordinate, it's used when calculate the flush window + portMUX_TYPE spinlock; // to protect panel specific resource from concurrent access (e.g. between task and ISR) + int lcd_clk_flags; // LCD clock calculation flags + int rotate_mask; // panel rotate_mask mask, Or'ed of `panel_rotate_mask_t` + struct { + uint32_t disp_en_level: 1; // The level which can turn on the screen by `disp_gpio_num` + uint32_t stream_mode: 1; // If set, the LCD transfers data continuously, otherwise, it stops refreshing the LCD when transaction done + uint32_t fb_in_psram: 1; // Whether the frame buffer is in PSRAM + uint32_t need_update_pclk: 1; // Whether to update the PCLK before start a new transaction + uint32_t need_restart: 1; // Whether to restart the LCD controller and the DMA + uint32_t bb_invalidate_cache: 1; // Whether to do cache invalidation in bounce buffer mode + } flags; + dma_descriptor_t *dma_links[RGB_LCD_PANEL_DMA_LINKS_REPLICA]; // fbs[0] <-> dma_links[0], fbs[1] <-> dma_links[1], etc + dma_descriptor_t dma_restart_node; // DMA descriptor used to restart the transfer + dma_descriptor_t dma_nodes[]; // DMA descriptors pool +}; + +static esp_err_t lcd_rgb_panel_alloc_frame_buffers(const esp_lcd_rgb_panel_config_t *rgb_panel_config, esp_rgb_panel_t *rgb_panel) +{ + bool fb_in_psram = false; + size_t psram_trans_align = rgb_panel_config->psram_trans_align ? rgb_panel_config->psram_trans_align : 64; + size_t sram_trans_align = rgb_panel_config->sram_trans_align ? rgb_panel_config->sram_trans_align : 4; + rgb_panel->psram_trans_align = psram_trans_align; + rgb_panel->sram_trans_align = sram_trans_align; + + // alloc frame buffer + if (rgb_panel->num_fbs > 0) { + // fb_in_psram is only an option, if there's no PSRAM on board, we fallback to alloc from SRAM + if (rgb_panel_config->flags.fb_in_psram) { +#if CONFIG_SPIRAM_USE_MALLOC || CONFIG_SPIRAM_USE_CAPS_ALLOC + if (esp_psram_is_initialized()) { + fb_in_psram = true; + } +#endif + } + for (int i = 0; i < rgb_panel->num_fbs; i++) { + if (fb_in_psram) { + // the low level malloc function will help check the validation of alignment + rgb_panel->fbs[i] = heap_caps_aligned_calloc(psram_trans_align, 1, rgb_panel->fb_size, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + } else { + rgb_panel->fbs[i] = heap_caps_aligned_calloc(sram_trans_align, 1, rgb_panel->fb_size, MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA); + } + ESP_RETURN_ON_FALSE(rgb_panel->fbs[i], ESP_ERR_NO_MEM, TAG, "no mem for frame buffer"); + } + } + + // alloc bounce buffer + if (rgb_panel->bb_size) { + for (int i = 0; i < RGB_LCD_PANEL_BOUNCE_BUF_NUM; i++) { + // bounce buffer must come from SRAM + rgb_panel->bounce_buffer[i] = heap_caps_aligned_calloc(sram_trans_align, 1, rgb_panel->bb_size, MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA); + ESP_RETURN_ON_FALSE(rgb_panel->bounce_buffer[i], ESP_ERR_NO_MEM, TAG, "no mem for bounce buffer"); + } + } + rgb_panel->cur_fb_index = 0; + rgb_panel->bb_fb_index = 0; + rgb_panel->flags.fb_in_psram = fb_in_psram; + + return ESP_OK; +} + +static esp_err_t lcd_rgb_panel_destory(esp_rgb_panel_t *rgb_panel) +{ + lcd_ll_enable_clock(rgb_panel->hal.dev, false); + if (rgb_panel->panel_id >= 0) { + PERIPH_RCC_RELEASE_ATOMIC(lcd_periph_signals.panels[rgb_panel->panel_id].module, ref_count) { + if (ref_count == 0) { + lcd_ll_enable_bus_clock(rgb_panel->panel_id, false); + } + } + lcd_com_remove_device(LCD_COM_DEVICE_TYPE_RGB, rgb_panel->panel_id); + } + for (size_t i = 0; i < rgb_panel->num_fbs; i++) { + if (rgb_panel->fbs[i]) { + free(rgb_panel->fbs[i]); + } + } + if (rgb_panel->bounce_buffer[0]) { + free(rgb_panel->bounce_buffer[0]); + } + if (rgb_panel->bounce_buffer[1]) { + free(rgb_panel->bounce_buffer[1]); + } + if (rgb_panel->dma_chan) { + gdma_disconnect(rgb_panel->dma_chan); + gdma_del_channel(rgb_panel->dma_chan); + } + if (rgb_panel->intr) { + esp_intr_free(rgb_panel->intr); + } + if (rgb_panel->pm_lock) { + esp_pm_lock_release(rgb_panel->pm_lock); + esp_pm_lock_delete(rgb_panel->pm_lock); + } + free(rgb_panel); + return ESP_OK; +} + +esp_err_t esp_lcd_new_rgb_panel(const esp_lcd_rgb_panel_config_t *rgb_panel_config, esp_lcd_panel_handle_t *ret_panel) +{ +#if CONFIG_LCD_ENABLE_DEBUG_LOG + esp_log_level_set(TAG, ESP_LOG_DEBUG); +#endif + esp_err_t ret = ESP_OK; + esp_rgb_panel_t *rgb_panel = NULL; + ESP_GOTO_ON_FALSE(rgb_panel_config && ret_panel, ESP_ERR_INVALID_ARG, err, TAG, "invalid parameter"); + ESP_GOTO_ON_FALSE(rgb_panel_config->data_width == 16 || rgb_panel_config->data_width == 8, + ESP_ERR_NOT_SUPPORTED, err, TAG, "unsupported data width %d", rgb_panel_config->data_width); + ESP_GOTO_ON_FALSE(!(rgb_panel_config->flags.double_fb && rgb_panel_config->flags.no_fb), + ESP_ERR_INVALID_ARG, err, TAG, "double_fb conflicts with no_fb"); + ESP_GOTO_ON_FALSE(!(rgb_panel_config->num_fbs > 0 && rgb_panel_config->num_fbs != 2 && rgb_panel_config->flags.double_fb), + ESP_ERR_INVALID_ARG, err, TAG, "num_fbs conflicts with double_fb"); + ESP_GOTO_ON_FALSE(!(rgb_panel_config->num_fbs > 0 && rgb_panel_config->flags.no_fb), + ESP_ERR_INVALID_ARG, err, TAG, "num_fbs conflicts with no_fb"); + ESP_GOTO_ON_FALSE(!(rgb_panel_config->flags.no_fb && rgb_panel_config->bounce_buffer_size_px == 0), + ESP_ERR_INVALID_ARG, err, TAG, "must set bounce buffer if there's no frame buffer"); + ESP_GOTO_ON_FALSE(!(rgb_panel_config->flags.refresh_on_demand && rgb_panel_config->bounce_buffer_size_px), + ESP_ERR_INVALID_ARG, err, TAG, "refresh on demand is not supported under bounce buffer mode"); + + // determine number of framebuffers + size_t num_fbs = 1; + if (rgb_panel_config->flags.no_fb) { + num_fbs = 0; + } else if (rgb_panel_config->flags.double_fb) { + num_fbs = 2; + } else if (rgb_panel_config->num_fbs > 0) { + num_fbs = rgb_panel_config->num_fbs; + } + ESP_GOTO_ON_FALSE(num_fbs <= RGB_LCD_PANEL_MAX_FB_NUM, ESP_ERR_INVALID_ARG, err, TAG, "too many frame buffers"); + + // bpp defaults to the number of data lines, but for serial RGB interface, they're not equal + // e.g. for serial RGB 8-bit interface, data lines are 8, whereas the bpp is 24 (RGB888) + size_t fb_bits_per_pixel = rgb_panel_config->data_width; + if (rgb_panel_config->bits_per_pixel) { // override bpp if it's set + fb_bits_per_pixel = rgb_panel_config->bits_per_pixel; + } + // calculate buffer size + size_t fb_size = rgb_panel_config->timings.h_res * rgb_panel_config->timings.v_res * fb_bits_per_pixel / 8; + size_t bb_size = rgb_panel_config->bounce_buffer_size_px * fb_bits_per_pixel / 8; + size_t expect_bb_eof_count = 0; + if (bb_size) { + // we want the bounce can always end in the second buffer + ESP_GOTO_ON_FALSE(fb_size % (2 * bb_size) == 0, ESP_ERR_INVALID_ARG, err, TAG, + "fb size must be even multiple of bounce buffer size"); + expect_bb_eof_count = fb_size / bb_size; + } + fprintf(stderr, "this is the TULIP SPECIAL esp_lcd\n"); + // calculate the number of DMA descriptors + size_t num_dma_nodes = 0; + if (bb_size) { + // in bounce buffer mode, DMA is used to convey the bounce buffer, not the frame buffer. + // frame buffer is copied to bounce buffer by CPU + num_dma_nodes = (bb_size + DMA_DESCRIPTOR_BUFFER_MAX_SIZE - 1) / DMA_DESCRIPTOR_BUFFER_MAX_SIZE; + } else { + // Not bounce buffer mode, DMA descriptors need to fit the entire frame buffer + num_dma_nodes = (fb_size + DMA_DESCRIPTOR_BUFFER_MAX_SIZE - 1) / DMA_DESCRIPTOR_BUFFER_MAX_SIZE; + } + + // DMA descriptors must be placed in internal SRAM (requested by DMA) + rgb_panel = heap_caps_calloc(1, sizeof(esp_rgb_panel_t) + num_dma_nodes * sizeof(dma_descriptor_t) * RGB_LCD_PANEL_DMA_LINKS_REPLICA, + MALLOC_CAP_DMA | MALLOC_CAP_INTERNAL); + ESP_GOTO_ON_FALSE(rgb_panel, ESP_ERR_NO_MEM, err, TAG, "no mem for rgb panel"); + rgb_panel->num_dma_nodes = num_dma_nodes; + rgb_panel->num_fbs = num_fbs; + rgb_panel->fb_size = fb_size; + rgb_panel->bb_size = bb_size; + rgb_panel->expect_eof_count = expect_bb_eof_count; + rgb_panel->panel_id = -1; + // register to platform + int panel_id = lcd_com_register_device(LCD_COM_DEVICE_TYPE_RGB, rgb_panel); + ESP_GOTO_ON_FALSE(panel_id >= 0, ESP_ERR_NOT_FOUND, err, TAG, "no free rgb panel slot"); + rgb_panel->panel_id = panel_id; + + // enable APB to access LCD registers + PERIPH_RCC_ACQUIRE_ATOMIC(lcd_periph_signals.panels[panel_id].module, ref_count) { + if (ref_count == 0) { + lcd_ll_enable_bus_clock(panel_id, true); + lcd_ll_reset_register(panel_id); + } + } + + // allocate frame buffers + bounce buffers + ESP_GOTO_ON_ERROR(lcd_rgb_panel_alloc_frame_buffers(rgb_panel_config, rgb_panel), err, TAG, "alloc frame buffers failed"); + + // initialize HAL layer, so we can call LL APIs later + lcd_hal_init(&rgb_panel->hal, panel_id); + // enable clock gating + lcd_ll_enable_clock(rgb_panel->hal.dev, true); + // set clock source + ret = lcd_rgb_panel_select_clock_src(rgb_panel, rgb_panel_config->clk_src); + ESP_GOTO_ON_ERROR(ret, err, TAG, "set source clock failed"); + // set minimal PCLK divider + // A limitation in the hardware, if the LCD_PCLK == LCD_CLK, then the PCLK polarity can't be adjustable + if (!(rgb_panel_config->timings.flags.pclk_active_neg || rgb_panel_config->timings.flags.pclk_idle_high)) { + rgb_panel->lcd_clk_flags |= LCD_HAL_PCLK_FLAG_ALLOW_EQUAL_SYSCLK; + } + // install interrupt service, (LCD peripheral shares the interrupt source with Camera by different mask) + int isr_flags = LCD_RGB_INTR_ALLOC_FLAGS | ESP_INTR_FLAG_SHARED | ESP_INTR_FLAG_LOWMED; + ret = esp_intr_alloc_intrstatus(lcd_periph_signals.panels[panel_id].irq_id, isr_flags, + (uint32_t)lcd_ll_get_interrupt_status_reg(rgb_panel->hal.dev), + LCD_LL_EVENT_VSYNC_END, lcd_default_isr_handler, rgb_panel, &rgb_panel->intr); + ESP_GOTO_ON_ERROR(ret, err, TAG, "install interrupt failed"); + lcd_ll_enable_interrupt(rgb_panel->hal.dev, LCD_LL_EVENT_VSYNC_END, false); // disable all interrupts + lcd_ll_clear_interrupt_status(rgb_panel->hal.dev, UINT32_MAX); // clear pending interrupt + + // install DMA service + rgb_panel->flags.stream_mode = !rgb_panel_config->flags.refresh_on_demand; + rgb_panel->fb_bits_per_pixel = fb_bits_per_pixel; + + ret = lcd_rgb_panel_create_trans_link(rgb_panel); + ESP_GOTO_ON_ERROR(ret, err, TAG, "install DMA failed"); + // configure GPIO + ret = lcd_rgb_panel_configure_gpio(rgb_panel, rgb_panel_config); + ESP_GOTO_ON_ERROR(ret, err, TAG, "configure GPIO failed"); + // fill other rgb panel runtime parameters + memcpy(rgb_panel->data_gpio_nums, rgb_panel_config->data_gpio_nums, SOC_LCD_RGB_DATA_WIDTH); + rgb_panel->timings = rgb_panel_config->timings; + rgb_panel->data_width = rgb_panel_config->data_width; + rgb_panel->output_bits_per_pixel = fb_bits_per_pixel; // by default, the output bpp is the same as the frame buffer bpp + rgb_panel->disp_gpio_num = rgb_panel_config->disp_gpio_num; + rgb_panel->flags.disp_en_level = !rgb_panel_config->flags.disp_active_low; + rgb_panel->flags.bb_invalidate_cache = rgb_panel_config->flags.bb_invalidate_cache; + rgb_panel->spinlock = (portMUX_TYPE)portMUX_INITIALIZER_UNLOCKED; + // fill function table + rgb_panel->base.del = rgb_panel_del; + rgb_panel->base.reset = rgb_panel_reset; + rgb_panel->base.init = rgb_panel_init; + rgb_panel->base.draw_bitmap = rgb_panel_draw_bitmap; + rgb_panel->base.disp_on_off = rgb_panel_disp_on_off; + rgb_panel->base.invert_color = rgb_panel_invert_color; + rgb_panel->base.mirror = rgb_panel_mirror; + rgb_panel->base.swap_xy = rgb_panel_swap_xy; + rgb_panel->base.set_gap = rgb_panel_set_gap; + // return base class + *ret_panel = &(rgb_panel->base); + ESP_LOGD(TAG, "new rgb panel(%d) @%p, num_fbs=%zu, fb_size=%zu, bb0 @%p, bb1 @%p, bb_size=%zu", + rgb_panel->panel_id, rgb_panel, rgb_panel->num_fbs, rgb_panel->fb_size, + rgb_panel->bounce_buffer[0], rgb_panel->bounce_buffer[1], rgb_panel->bb_size); + for (size_t i = 0; i < rgb_panel->num_fbs; i++) { + ESP_LOGD(TAG, "fb[%zu] @%p", i, rgb_panel->fbs[i]); + } + return ESP_OK; + +err: + if (rgb_panel) { + lcd_rgb_panel_destory(rgb_panel); + } + return ret; +} + +esp_err_t esp_lcd_rgb_panel_register_event_callbacks(esp_lcd_panel_handle_t panel, const esp_lcd_rgb_panel_event_callbacks_t *callbacks, void *user_ctx) +{ + ESP_RETURN_ON_FALSE(panel && callbacks, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + esp_rgb_panel_t *rgb_panel = __containerof(panel, esp_rgb_panel_t, base); +#if CONFIG_LCD_RGB_ISR_IRAM_SAFE + if (callbacks->on_vsync) { + ESP_RETURN_ON_FALSE(esp_ptr_in_iram(callbacks->on_vsync), ESP_ERR_INVALID_ARG, TAG, "on_vsync callback not in IRAM"); + } + if (callbacks->on_bounce_empty) { + ESP_RETURN_ON_FALSE(esp_ptr_in_iram(callbacks->on_bounce_empty), ESP_ERR_INVALID_ARG, TAG, "on_bounce_empty callback not in IRAM"); + } + if (callbacks->on_bounce_frame_finish) { + ESP_RETURN_ON_FALSE(esp_ptr_in_iram(callbacks->on_bounce_frame_finish), ESP_ERR_INVALID_ARG, TAG, "on_bounce_frame_finish callback not in IRAM"); + } + if (user_ctx) { + ESP_RETURN_ON_FALSE(esp_ptr_internal(user_ctx), ESP_ERR_INVALID_ARG, TAG, "user context not in internal RAM"); + } +#endif // CONFIG_LCD_RGB_ISR_IRAM_SAFE + rgb_panel->on_vsync = callbacks->on_vsync; + rgb_panel->on_bounce_empty = callbacks->on_bounce_empty; + rgb_panel->on_bounce_frame_finish = callbacks->on_bounce_frame_finish; + rgb_panel->user_ctx = user_ctx; + return ESP_OK; +} + +esp_err_t esp_lcd_rgb_panel_set_pclk(esp_lcd_panel_handle_t panel, uint32_t freq_hz) +{ + ESP_RETURN_ON_FALSE(panel, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + esp_rgb_panel_t *rgb_panel = __containerof(panel, esp_rgb_panel_t, base); + // the pclk frequency will be updated in the `LCD_LL_EVENT_VSYNC_END` event handler + portENTER_CRITICAL(&rgb_panel->spinlock); + rgb_panel->flags.need_update_pclk = true; + rgb_panel->timings.pclk_hz = freq_hz; + portEXIT_CRITICAL(&rgb_panel->spinlock); + return ESP_OK; +} + +esp_err_t esp_lcd_rgb_panel_restart(esp_lcd_panel_handle_t panel) +{ + ESP_RETURN_ON_FALSE(panel, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + esp_rgb_panel_t *rgb_panel = __containerof(panel, esp_rgb_panel_t, base); + ESP_RETURN_ON_FALSE(rgb_panel->flags.stream_mode, ESP_ERR_INVALID_STATE, TAG, "not in stream mode"); + + // the underlying restart job will be done in the `LCD_LL_EVENT_VSYNC_END` event handler + portENTER_CRITICAL(&rgb_panel->spinlock); + rgb_panel->flags.need_restart = true; + portEXIT_CRITICAL(&rgb_panel->spinlock); + return ESP_OK; +} + +esp_err_t esp_lcd_rgb_panel_get_frame_buffer(esp_lcd_panel_handle_t panel, uint32_t fb_num, void **fb0, ...) +{ + ESP_RETURN_ON_FALSE(panel, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + esp_rgb_panel_t *rgb_panel = __containerof(panel, esp_rgb_panel_t, base); + ESP_RETURN_ON_FALSE(fb_num && fb_num <= rgb_panel->num_fbs, ESP_ERR_INVALID_ARG, TAG, "invalid frame buffer number"); + void **fb_itor = fb0; + va_list args; + va_start(args, fb0); + for (int i = 0; i < fb_num; i++) { + if (fb_itor) { + *fb_itor = rgb_panel->fbs[i]; + fb_itor = va_arg(args, void **); + } + } + va_end(args); + return ESP_OK; +} + +esp_err_t esp_lcd_rgb_panel_refresh(esp_lcd_panel_handle_t panel) +{ + ESP_RETURN_ON_FALSE(panel, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + esp_rgb_panel_t *rgb_panel = __containerof(panel, esp_rgb_panel_t, base); + ESP_RETURN_ON_FALSE(!rgb_panel->flags.stream_mode, ESP_ERR_INVALID_STATE, TAG, "refresh on demand is not enabled"); + lcd_rgb_panel_start_transmission(rgb_panel); + return ESP_OK; +} + +esp_err_t esp_lcd_rgb_panel_set_yuv_conversion(esp_lcd_panel_handle_t panel, const esp_lcd_yuv_conv_config_t *config) +{ + ESP_RETURN_ON_FALSE(panel, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + esp_rgb_panel_t *rgb_panel = __containerof(panel, esp_rgb_panel_t, base); + lcd_hal_context_t *hal = &rgb_panel->hal; + bool en_conversion = config != NULL; + + // bits per pixel for different YUV sample + const uint8_t bpp_yuv[] = { + [LCD_YUV_SAMPLE_422] = 16, + [LCD_YUV_SAMPLE_420] = 12, + [LCD_YUV_SAMPLE_411] = 12, + }; + + if (en_conversion) { + if (memcmp(&config->src, &config->dst, sizeof(config->src)) == 0) { + ESP_RETURN_ON_FALSE(false, ESP_ERR_INVALID_ARG, TAG, "conversion source and destination are the same"); + } + + if (config->src.color_space == LCD_COLOR_SPACE_YUV && config->dst.color_space == LCD_COLOR_SPACE_RGB) { // YUV->RGB + lcd_ll_set_convert_mode_yuv_to_rgb(hal->dev, config->src.yuv_sample); + // Note, the RGB->YUV conversion only support RGB565 + rgb_panel->output_bits_per_pixel = 16; + } else if (config->src.color_space == LCD_COLOR_SPACE_RGB && config->dst.color_space == LCD_COLOR_SPACE_YUV) { // RGB->YUV + lcd_ll_set_convert_mode_rgb_to_yuv(hal->dev, config->dst.yuv_sample); + rgb_panel->output_bits_per_pixel = bpp_yuv[config->dst.yuv_sample]; + } else if (config->src.color_space == LCD_COLOR_SPACE_YUV && config->dst.color_space == LCD_COLOR_SPACE_YUV) { // YUV->YUV + lcd_ll_set_convert_mode_yuv_to_yuv(hal->dev, config->src.yuv_sample, config->dst.yuv_sample); + rgb_panel->output_bits_per_pixel = bpp_yuv[config->dst.yuv_sample]; + } else { + ESP_RETURN_ON_FALSE(false, ESP_ERR_NOT_SUPPORTED, TAG, "unsupported conversion mode"); + } + + // set conversion standard + lcd_ll_set_yuv_convert_std(hal->dev, config->std); + // set conversion data width + lcd_ll_set_convert_data_width(hal->dev, rgb_panel->data_width); + // set color range + lcd_ll_set_input_color_range(hal->dev, config->src.color_range); + lcd_ll_set_output_color_range(hal->dev, config->dst.color_range); + } else { + // output bpp equals to frame buffer bpp + rgb_panel->output_bits_per_pixel = rgb_panel->fb_bits_per_pixel; + } + + // enable or disable RGB-YUV conversion + lcd_ll_enable_rgb_yuv_convert(hal->dev, en_conversion); + + return ESP_OK; +} + +static esp_err_t rgb_panel_del(esp_lcd_panel_t *panel) +{ + esp_rgb_panel_t *rgb_panel = __containerof(panel, esp_rgb_panel_t, base); + int panel_id = rgb_panel->panel_id; + ESP_RETURN_ON_ERROR(lcd_rgb_panel_destory(rgb_panel), TAG, "destroy rgb panel(%d) failed", panel_id); + ESP_LOGD(TAG, "del rgb panel(%d)", panel_id); + return ESP_OK; +} + +static esp_err_t rgb_panel_reset(esp_lcd_panel_t *panel) +{ + esp_rgb_panel_t *rgb_panel = __containerof(panel, esp_rgb_panel_t, base); + lcd_ll_fifo_reset(rgb_panel->hal.dev); + lcd_ll_reset(rgb_panel->hal.dev); + return ESP_OK; +} + +static esp_err_t rgb_panel_init(esp_lcd_panel_t *panel) +{ + esp_err_t ret = ESP_OK; + esp_rgb_panel_t *rgb_panel = __containerof(panel, esp_rgb_panel_t, base); + // set pixel clock frequency + rgb_panel->timings.pclk_hz = lcd_hal_cal_pclk_freq(&rgb_panel->hal, rgb_panel->src_clk_hz, rgb_panel->timings.pclk_hz, rgb_panel->lcd_clk_flags); + // pixel clock phase and polarity + lcd_ll_set_clock_idle_level(rgb_panel->hal.dev, rgb_panel->timings.flags.pclk_idle_high); + lcd_ll_set_pixel_clock_edge(rgb_panel->hal.dev, rgb_panel->timings.flags.pclk_active_neg); + // enable RGB mode and set data width + lcd_ll_enable_rgb_mode(rgb_panel->hal.dev, true); + lcd_ll_set_data_width(rgb_panel->hal.dev, rgb_panel->data_width); + lcd_ll_set_phase_cycles(rgb_panel->hal.dev, 0, 0, 1); // enable data phase only + // number of data cycles is controlled by DMA buffer size + lcd_ll_enable_output_always_on(rgb_panel->hal.dev, true); + // configure HSYNC, VSYNC, DE signal idle state level + lcd_ll_set_idle_level(rgb_panel->hal.dev, !rgb_panel->timings.flags.hsync_idle_low, + !rgb_panel->timings.flags.vsync_idle_low, rgb_panel->timings.flags.de_idle_high); + // configure blank region timing + lcd_ll_set_blank_cycles(rgb_panel->hal.dev, 1, 1); // RGB panel always has a front and back blank (porch region) + lcd_ll_set_horizontal_timing(rgb_panel->hal.dev, rgb_panel->timings.hsync_pulse_width, + rgb_panel->timings.hsync_back_porch, rgb_panel->timings.h_res * rgb_panel->output_bits_per_pixel / rgb_panel->data_width, + rgb_panel->timings.hsync_front_porch); + lcd_ll_set_vertical_timing(rgb_panel->hal.dev, rgb_panel->timings.vsync_pulse_width, + rgb_panel->timings.vsync_back_porch, rgb_panel->timings.v_res, + rgb_panel->timings.vsync_front_porch); + // output hsync even in porch region + lcd_ll_enable_output_hsync_in_porch_region(rgb_panel->hal.dev, true); + // generate the hsync at the very beginning of line + lcd_ll_set_hsync_position(rgb_panel->hal.dev, 0); + // send next frame automatically in stream mode + lcd_ll_enable_auto_next_frame(rgb_panel->hal.dev, rgb_panel->flags.stream_mode); + // trigger interrupt on the end of frame + lcd_ll_enable_interrupt(rgb_panel->hal.dev, LCD_LL_EVENT_VSYNC_END, true); + // enable intr + esp_intr_enable(rgb_panel->intr); + // start transmission + if (rgb_panel->flags.stream_mode) { + lcd_rgb_panel_start_transmission(rgb_panel); + } + ESP_LOGD(TAG, "rgb panel(%d) start, pclk=%"PRIu32"Hz", rgb_panel->panel_id, rgb_panel->timings.pclk_hz); + return ret; +} + +__attribute__((always_inline)) +static inline void copy_pixel_8bpp(uint8_t *to, const uint8_t *from) +{ + *to++ = *from++; +} + +__attribute__((always_inline)) +static inline void copy_pixel_16bpp(uint8_t *to, const uint8_t *from) +{ + *to++ = *from++; + *to++ = *from++; +} + +__attribute__((always_inline)) +static inline void copy_pixel_24bpp(uint8_t *to, const uint8_t *from) +{ + *to++ = *from++; + *to++ = *from++; + *to++ = *from++; +} + +#define COPY_PIXEL_CODE_BLOCK(_bpp) \ + switch (rgb_panel->rotate_mask) \ + { \ + case 0: \ + { \ + uint8_t *to = fb + (y_start * h_res + x_start) * bytes_per_pixel; \ + for (int y = y_start; y < y_end; y++) \ + { \ + memcpy(to, from, copy_bytes_per_line); \ + to += bytes_per_line; \ + from += copy_bytes_per_line; \ + } \ + bytes_to_flush = (y_end - y_start) * bytes_per_line; \ + flush_ptr = fb + y_start * bytes_per_line; \ + } \ + break; \ + case ROTATE_MASK_MIRROR_X: \ + for (int y = y_start; y < y_end; y++) \ + { \ + uint32_t index = (y * h_res + (h_res - 1 - x_start)) * bytes_per_pixel; \ + for (size_t x = x_start; x < x_end; x++) \ + { \ + copy_pixel_##_bpp##bpp(to + index, from); \ + index -= bytes_per_pixel; \ + from += bytes_per_pixel; \ + } \ + } \ + bytes_to_flush = (y_end - y_start) * bytes_per_line; \ + flush_ptr = fb + y_start * bytes_per_line; \ + break; \ + case ROTATE_MASK_MIRROR_Y: \ + { \ + uint8_t *to = fb + ((v_res - 1 - y_start) * h_res + x_start) * bytes_per_pixel; \ + for (int y = y_start; y < y_end; y++) \ + { \ + memcpy(to, from, copy_bytes_per_line); \ + to -= bytes_per_line; \ + from += copy_bytes_per_line; \ + } \ + bytes_to_flush = (y_end - y_start) * bytes_per_line; \ + flush_ptr = fb + (v_res - y_end) * bytes_per_line; \ + } \ + break; \ + case ROTATE_MASK_MIRROR_X | ROTATE_MASK_MIRROR_Y: \ + for (int y = y_start; y < y_end; y++) \ + { \ + uint32_t index = ((v_res - 1 - y) * h_res + (h_res - 1 - x_start)) * bytes_per_pixel; \ + for (size_t x = x_start; x < x_end; x++) \ + { \ + copy_pixel_##_bpp##bpp(to + index, from); \ + index -= bytes_per_pixel; \ + from += bytes_per_pixel; \ + } \ + } \ + bytes_to_flush = (y_end - y_start) * bytes_per_line; \ + flush_ptr = fb + (v_res - y_end) * bytes_per_line; \ + break; \ + case ROTATE_MASK_SWAP_XY: \ + for (int y = y_start; y < y_end; y++) \ + { \ + for (int x = x_start; x < x_end; x++) \ + { \ + uint32_t j = y * copy_bytes_per_line + x * bytes_per_pixel - offset; \ + uint32_t i = (x * h_res + y) * bytes_per_pixel; \ + copy_pixel_##_bpp##bpp(to + i, from + j); \ + } \ + } \ + bytes_to_flush = (x_end - x_start) * bytes_per_line; \ + flush_ptr = fb + x_start * bytes_per_line; \ + break; \ + case ROTATE_MASK_SWAP_XY | ROTATE_MASK_MIRROR_X: \ + for (int y = y_start; y < y_end; y++) \ + { \ + for (int x = x_start; x < x_end; x++) \ + { \ + uint32_t j = y * copy_bytes_per_line + x * bytes_per_pixel - offset; \ + uint32_t i = (x * h_res + h_res - 1 - y) * bytes_per_pixel; \ + copy_pixel_##_bpp##bpp(to + i, from + j); \ + } \ + } \ + bytes_to_flush = (x_end - x_start) * bytes_per_line; \ + flush_ptr = fb + x_start * bytes_per_line; \ + break; \ + case ROTATE_MASK_SWAP_XY | ROTATE_MASK_MIRROR_Y: \ + for (int y = y_start; y < y_end; y++) \ + { \ + for (int x = x_start; x < x_end; x++) \ + { \ + uint32_t j = y * copy_bytes_per_line + x * bytes_per_pixel - offset; \ + uint32_t i = ((v_res - 1 - x) * h_res + y) * bytes_per_pixel; \ + copy_pixel_##_bpp##bpp(to + i, from + j); \ + } \ + } \ + bytes_to_flush = (x_end - x_start) * bytes_per_line; \ + flush_ptr = fb + (v_res - x_end) * bytes_per_line; \ + break; \ + case ROTATE_MASK_SWAP_XY | ROTATE_MASK_MIRROR_X | ROTATE_MASK_MIRROR_Y: \ + for (int y = y_start; y < y_end; y++) \ + { \ + for (int x = x_start; x < x_end; x++) \ + { \ + uint32_t j = y * copy_bytes_per_line + x * bytes_per_pixel - offset; \ + uint32_t i = ((v_res - 1 - x) * h_res + h_res - 1 - y) * bytes_per_pixel; \ + copy_pixel_##_bpp##bpp(to + i, from + j); \ + } \ + } \ + bytes_to_flush = (x_end - x_start) * bytes_per_line; \ + flush_ptr = fb + (v_res - x_end) * bytes_per_line; \ + break; \ + default: \ + break; \ + } + +static esp_err_t rgb_panel_draw_bitmap(esp_lcd_panel_t *panel, int x_start, int y_start, int x_end, int y_end, const void *color_data) +{ + esp_rgb_panel_t *rgb_panel = __containerof(panel, esp_rgb_panel_t, base); + ESP_RETURN_ON_FALSE(rgb_panel->num_fbs > 0, ESP_ERR_NOT_SUPPORTED, TAG, "no frame buffer installed"); + assert((x_start < x_end) && (y_start < y_end) && "start position must be smaller than end position"); + + // check if we need to copy the draw buffer (pointed by the color_data) to the driver's frame buffer + bool do_copy = false; + if (color_data == rgb_panel->fbs[0]) { + rgb_panel->cur_fb_index = 0; + } else if (color_data == rgb_panel->fbs[1]) { + rgb_panel->cur_fb_index = 1; + } else if (color_data == rgb_panel->fbs[2]) { + rgb_panel->cur_fb_index = 2; + } else { + // we do the copy only if the color_data is different from either frame buffer + do_copy = true; + } + + // adjust the flush window by adding extra gap + x_start += rgb_panel->x_gap; + y_start += rgb_panel->y_gap; + x_end += rgb_panel->x_gap; + y_end += rgb_panel->y_gap; + // round the boundary + int h_res = rgb_panel->timings.h_res; + int v_res = rgb_panel->timings.v_res; + if (rgb_panel->rotate_mask & ROTATE_MASK_SWAP_XY) { + x_start = MIN(x_start, v_res); + x_end = MIN(x_end, v_res); + y_start = MIN(y_start, h_res); + y_end = MIN(y_end, h_res); + } else { + x_start = MIN(x_start, h_res); + x_end = MIN(x_end, h_res); + y_start = MIN(y_start, v_res); + y_end = MIN(y_end, v_res); + } + + int bytes_per_pixel = rgb_panel->fb_bits_per_pixel / 8; + int pixels_per_line = rgb_panel->timings.h_res; + uint32_t bytes_per_line = bytes_per_pixel * pixels_per_line; + uint8_t *fb = rgb_panel->fbs[rgb_panel->cur_fb_index]; + size_t bytes_to_flush = v_res * h_res * bytes_per_pixel; + uint8_t *flush_ptr = fb; + + if (do_copy) { + // copy the UI draw buffer into internal frame buffer + const uint8_t *from = (const uint8_t *)color_data; + uint32_t copy_bytes_per_line = (x_end - x_start) * bytes_per_pixel; + size_t offset = y_start * copy_bytes_per_line + x_start * bytes_per_pixel; + uint8_t *to = fb; + if (1 == bytes_per_pixel) { + COPY_PIXEL_CODE_BLOCK(8) + } else if (2 == bytes_per_pixel) { + COPY_PIXEL_CODE_BLOCK(16) + } else if (3 == bytes_per_pixel) { + COPY_PIXEL_CODE_BLOCK(24) + } + } + + // Note that if we use a bounce buffer, the data gets read by the CPU as well so no need to write back + if (rgb_panel->flags.fb_in_psram && !rgb_panel->bb_size) { + // CPU writes data to PSRAM through DCache, data in PSRAM might not get updated, so write back + ESP_RETURN_ON_ERROR(esp_cache_msync(flush_ptr, bytes_to_flush, 0), TAG, "flush cache buffer failed"); + } + + if (!rgb_panel->bb_size) { + if (rgb_panel->flags.stream_mode) { + // the DMA will convey the new frame buffer next time + for (int i = 0; i < RGB_LCD_PANEL_DMA_LINKS_REPLICA; i++) { + rgb_panel->dma_nodes[rgb_panel->num_dma_nodes * (i + 1) - 1].next = rgb_panel->dma_links[rgb_panel->cur_fb_index]; + } + } + } + + return ESP_OK; +} + +static esp_err_t rgb_panel_invert_color(esp_lcd_panel_t *panel, bool invert_color_data) +{ + esp_rgb_panel_t *rgb_panel = __containerof(panel, esp_rgb_panel_t, base); + int panel_id = rgb_panel->panel_id; + // inverting the data line by GPIO matrix + for (int i = 0; i < rgb_panel->data_width; i++) { + esp_rom_gpio_connect_out_signal(rgb_panel->data_gpio_nums[i], lcd_periph_signals.panels[panel_id].data_sigs[i], + invert_color_data, false); + } + return ESP_OK; +} + +static esp_err_t rgb_panel_mirror(esp_lcd_panel_t *panel, bool mirror_x, bool mirror_y) +{ + esp_rgb_panel_t *rgb_panel = __containerof(panel, esp_rgb_panel_t, base); + rgb_panel->rotate_mask &= ~(ROTATE_MASK_MIRROR_X | ROTATE_MASK_MIRROR_Y); + rgb_panel->rotate_mask |= (mirror_x << RGB_PANEL_MIRROR_X | mirror_y << RGB_PANEL_MIRROR_Y); + return ESP_OK; +} + +static esp_err_t rgb_panel_swap_xy(esp_lcd_panel_t *panel, bool swap_axes) +{ + esp_rgb_panel_t *rgb_panel = __containerof(panel, esp_rgb_panel_t, base); + rgb_panel->rotate_mask &= ~(ROTATE_MASK_SWAP_XY); + rgb_panel->rotate_mask |= swap_axes << RGB_PANEL_SWAP_XY; + return ESP_OK; +} + +static esp_err_t rgb_panel_set_gap(esp_lcd_panel_t *panel, int x_gap, int y_gap) +{ + esp_rgb_panel_t *rgb_panel = __containerof(panel, esp_rgb_panel_t, base); + rgb_panel->x_gap = x_gap; + rgb_panel->y_gap = y_gap; + return ESP_OK; +} + +static esp_err_t rgb_panel_disp_on_off(esp_lcd_panel_t *panel, bool on_off) +{ + esp_rgb_panel_t *rgb_panel = __containerof(panel, esp_rgb_panel_t, base); + if (rgb_panel->disp_gpio_num < 0) { + return ESP_ERR_NOT_SUPPORTED; + } + if (!on_off) { // turn off screen + gpio_set_level(rgb_panel->disp_gpio_num, !rgb_panel->flags.disp_en_level); + } else { // turn on screen + gpio_set_level(rgb_panel->disp_gpio_num, rgb_panel->flags.disp_en_level); + } + return ESP_OK; +} + +static esp_err_t lcd_rgb_panel_configure_gpio(esp_rgb_panel_t *panel, const esp_lcd_rgb_panel_config_t *panel_config) +{ + int panel_id = panel->panel_id; + // check validation of GPIO number + bool valid_gpio = true; + if (panel_config->de_gpio_num < 0) { + // Hsync and Vsync are required in HV mode + valid_gpio = valid_gpio && (panel_config->hsync_gpio_num >= 0) && (panel_config->vsync_gpio_num >= 0); + } + for (size_t i = 0; i < panel_config->data_width; i++) { + valid_gpio = valid_gpio && (panel_config->data_gpio_nums[i] >= 0); + } + if (!valid_gpio) { + return ESP_ERR_INVALID_ARG; + } + // connect peripheral signals via GPIO matrix + for (size_t i = 0; i < panel_config->data_width; i++) { + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[panel_config->data_gpio_nums[i]], PIN_FUNC_GPIO); + gpio_set_direction(panel_config->data_gpio_nums[i], GPIO_MODE_OUTPUT); + esp_rom_gpio_connect_out_signal(panel_config->data_gpio_nums[i], + lcd_periph_signals.panels[panel_id].data_sigs[i], false, false); + } + if (panel_config->hsync_gpio_num >= 0) { + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[panel_config->hsync_gpio_num], PIN_FUNC_GPIO); + gpio_set_direction(panel_config->hsync_gpio_num, GPIO_MODE_OUTPUT); + esp_rom_gpio_connect_out_signal(panel_config->hsync_gpio_num, + lcd_periph_signals.panels[panel_id].hsync_sig, false, false); + } + if (panel_config->vsync_gpio_num >= 0) { + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[panel_config->vsync_gpio_num], PIN_FUNC_GPIO); + gpio_set_direction(panel_config->vsync_gpio_num, GPIO_MODE_OUTPUT); + esp_rom_gpio_connect_out_signal(panel_config->vsync_gpio_num, + lcd_periph_signals.panels[panel_id].vsync_sig, false, false); + } + // PCLK may not be necessary in some cases (i.e. VGA output) + if (panel_config->pclk_gpio_num >= 0) { + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[panel_config->pclk_gpio_num], PIN_FUNC_GPIO); + gpio_set_direction(panel_config->pclk_gpio_num, GPIO_MODE_OUTPUT); + esp_rom_gpio_connect_out_signal(panel_config->pclk_gpio_num, + lcd_periph_signals.panels[panel_id].pclk_sig, false, false); + } + // DE signal might not be necessary for some RGB LCD + if (panel_config->de_gpio_num >= 0) { + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[panel_config->de_gpio_num], PIN_FUNC_GPIO); + gpio_set_direction(panel_config->de_gpio_num, GPIO_MODE_OUTPUT); + esp_rom_gpio_connect_out_signal(panel_config->de_gpio_num, + lcd_periph_signals.panels[panel_id].de_sig, false, false); + } + // disp enable GPIO is optional + if (panel_config->disp_gpio_num >= 0) { + gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[panel_config->disp_gpio_num], PIN_FUNC_GPIO); + gpio_set_direction(panel_config->disp_gpio_num, GPIO_MODE_OUTPUT); + esp_rom_gpio_connect_out_signal(panel_config->disp_gpio_num, SIG_GPIO_OUT_IDX, false, false); + } + return ESP_OK; +} + +static esp_err_t lcd_rgb_panel_select_clock_src(esp_rgb_panel_t *panel, lcd_clock_source_t clk_src) +{ + // get clock source frequency + uint32_t src_clk_hz = 0; + ESP_RETURN_ON_ERROR(esp_clk_tree_src_get_freq_hz((soc_module_clk_t)clk_src, ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED, &src_clk_hz), + TAG, "get clock source frequency failed"); + panel->src_clk_hz = src_clk_hz; + lcd_ll_select_clk_src(panel->hal.dev, clk_src); + + // create pm lock based on different clock source + // clock sources like PLL and XTAL will be turned off in light sleep +#if CONFIG_PM_ENABLE + ESP_RETURN_ON_ERROR(esp_pm_lock_create(ESP_PM_NO_LIGHT_SLEEP, 0, "rgb_panel", &panel->pm_lock), TAG, "create pm lock failed"); + // hold the lock during the whole lifecycle of RGB panel + esp_pm_lock_acquire(panel->pm_lock); + ESP_LOGD(TAG, "installed pm lock and hold the lock during the whole panel lifecycle"); +#endif + + return ESP_OK; +} + +static IRAM_ATTR bool lcd_rgb_panel_fill_bounce_buffer(esp_rgb_panel_t *panel, uint8_t *buffer) +{ + bool need_yield = false; + int bytes_per_pixel = panel->fb_bits_per_pixel / 8; + if (panel->num_fbs == 0) { + if (panel->on_bounce_empty) { + // We don't have a frame buffer here; we need to call a callback to refill the bounce buffer + if (panel->on_bounce_empty(&panel->base, buffer, panel->bounce_pos_px, panel->bb_size, panel->user_ctx)) { + need_yield = true; + } + } + } else { + // We do have frame buffer; copy from there. + // Note: if the cache is diabled, and accessing the PSRAM by DCACHE will crash. + memcpy(buffer, &panel->fbs[panel->bb_fb_index][panel->bounce_pos_px * bytes_per_pixel], panel->bb_size); + if (panel->flags.bb_invalidate_cache) { + // We don't need the bytes we copied from the psram anymore + // Make sure that if anything happened to have changed (because the line already was in cache) we write the data back. + esp_cache_msync(&panel->fbs[panel->bb_fb_index][panel->bounce_pos_px * bytes_per_pixel], (size_t)panel->bb_size, ESP_CACHE_MSYNC_FLAG_INVALIDATE); + } + } + panel->bounce_pos_px += panel->bb_size / bytes_per_pixel; + // If the bounce pos is larger than the frame buffer size, wrap around so the next isr starts pre-loading the next frame. + if (panel->bounce_pos_px >= panel->fb_size / bytes_per_pixel) { + panel->bounce_pos_px = 0; + panel->bb_fb_index = panel->cur_fb_index; + if (panel->on_bounce_frame_finish) { + if (panel->on_bounce_frame_finish(&panel->base, NULL, panel->user_ctx)) { + need_yield = true; + } + } + } + if (panel->num_fbs > 0) { + // Preload the next bit of buffer from psram + Cache_Start_DCache_Preload((uint32_t)&panel->fbs[panel->bb_fb_index][panel->bounce_pos_px * bytes_per_pixel], + panel->bb_size, 0); + } + return need_yield; +} + +// This is called in bounce buffer mode, when one bounce buffer has been fully sent to the LCD peripheral. +static IRAM_ATTR bool lcd_rgb_panel_eof_handler(gdma_channel_handle_t dma_chan, gdma_event_data_t *event_data, void *user_data) +{ + esp_rgb_panel_t *panel = (esp_rgb_panel_t *)user_data; + dma_descriptor_t *desc = (dma_descriptor_t *)event_data->tx_eof_desc_addr; + // Figure out which bounce buffer to write to. + // Note: what we receive is the *last* descriptor of this bounce buffer. + int bb = (desc == &panel->dma_nodes[panel->num_dma_nodes - 1]) ? 0 : 1; + portENTER_CRITICAL_ISR(&panel->spinlock); + panel->bb_eof_count++; + portEXIT_CRITICAL_ISR(&panel->spinlock); + return lcd_rgb_panel_fill_bounce_buffer(panel, panel->bounce_buffer[bb]); +} + +// If we restart GDMA, many pixels already have been transferred to the LCD peripheral. +// Looks like that has 16 pixels of FIFO plus one holding register. +#define LCD_FIFO_PRESERVE_SIZE_PX (GDMA_LL_L2FIFO_BASE_SIZE + 1) + +static esp_err_t lcd_rgb_panel_create_trans_link(esp_rgb_panel_t *panel) +{ + for (int i = 0; i < RGB_LCD_PANEL_DMA_LINKS_REPLICA; i++) { + panel->dma_links[i] = &panel->dma_nodes[panel->num_dma_nodes * i]; + } + // chain DMA descriptors + for (int i = 0; i < panel->num_dma_nodes * RGB_LCD_PANEL_DMA_LINKS_REPLICA; i++) { + panel->dma_nodes[i].dw0.owner = DMA_DESCRIPTOR_BUFFER_OWNER_CPU; + panel->dma_nodes[i].next = &panel->dma_nodes[i + 1]; + } + + if (panel->bb_size) { + // loop end back to start + panel->dma_nodes[panel->num_dma_nodes * RGB_LCD_PANEL_BOUNCE_BUF_NUM - 1].next = &panel->dma_nodes[0]; + // mount the bounce buffers to the DMA descriptors + lcd_com_mount_dma_data(panel->dma_links[0], panel->bounce_buffer[0], panel->bb_size); + lcd_com_mount_dma_data(panel->dma_links[1], panel->bounce_buffer[1], panel->bb_size); + } else { + if (panel->flags.stream_mode) { + // circle DMA descriptors chain for each frame buffer + for (int i = 0; i < RGB_LCD_PANEL_DMA_LINKS_REPLICA; i++) { + panel->dma_nodes[panel->num_dma_nodes * (i + 1) - 1].next = &panel->dma_nodes[panel->num_dma_nodes * i]; + } + } else { + // one-off DMA descriptors chain + for (int i = 0; i < RGB_LCD_PANEL_DMA_LINKS_REPLICA; i++) { + panel->dma_nodes[panel->num_dma_nodes * (i + 1) - 1].next = NULL; + } + } + // mount the frame buffer to the DMA descriptors + for (size_t i = 0; i < panel->num_fbs; i++) { + lcd_com_mount_dma_data(panel->dma_links[i], panel->fbs[i], panel->fb_size); + } + } + + // On restart, the data sent to the LCD peripheral needs to start LCD_FIFO_PRESERVE_SIZE_PX pixels after the FB start + // so we use a dedicated DMA node to restart the DMA transaction + // see also `lcd_rgb_panel_try_restart_transmission` + memcpy(&panel->dma_restart_node, &panel->dma_nodes[0], sizeof(panel->dma_restart_node)); + int restart_skip_bytes = LCD_FIFO_PRESERVE_SIZE_PX * (panel->fb_bits_per_pixel/8); + uint8_t *p = (uint8_t *)panel->dma_restart_node.buffer; + panel->dma_restart_node.buffer = &p[restart_skip_bytes]; + panel->dma_restart_node.dw0.length -= restart_skip_bytes; + panel->dma_restart_node.dw0.size -= restart_skip_bytes; + + // alloc DMA channel and connect to LCD peripheral + gdma_channel_alloc_config_t dma_chan_config = { + .direction = GDMA_CHANNEL_DIRECTION_TX, + }; +#if SOC_GDMA_TRIG_PERIPH_LCD0_BUS == SOC_GDMA_BUS_AHB + ESP_RETURN_ON_ERROR(gdma_new_ahb_channel(&dma_chan_config, &panel->dma_chan), TAG, "alloc DMA channel failed"); +#elif SOC_GDMA_TRIG_PERIPH_LCD0_BUS == SOC_GDMA_BUS_AXI + ESP_RETURN_ON_ERROR(gdma_new_axi_channel(&dma_chan_config, &panel->dma_chan), TAG, "alloc DMA channel failed"); +#endif + gdma_connect(panel->dma_chan, GDMA_MAKE_TRIGGER(GDMA_TRIG_PERIPH_LCD, 0)); + gdma_transfer_ability_t ability = { + .psram_trans_align = panel->psram_trans_align, + .sram_trans_align = panel->sram_trans_align, + }; + gdma_set_transfer_ability(panel->dma_chan, &ability); + + // we need to refill the bounce buffer in the DMA EOF interrupt, so only register the callback for bounce buffer mode + if (panel->bb_size) { + gdma_tx_event_callbacks_t cbs = { + .on_trans_eof = lcd_rgb_panel_eof_handler, + }; + gdma_register_tx_event_callbacks(panel->dma_chan, &cbs, panel); + } + + return ESP_OK; +} + +// reset the GDMA channel every VBlank to stop permanent desyncs from happening. +// Note that this fix can lead to single-frame desyncs itself, as in: if this interrupt +// is late enough, the display will shift as the LCD controller already read out the +// first data bytes, and resetting DMA will re-send those. However, the single-frame +// desync this leads to is preferable to the permanent desync that could otherwise +// happen. It's also not super-likely as this interrupt has the entirety of the VBlank +// time to reset DMA. +static IRAM_ATTR void lcd_rgb_panel_try_restart_transmission(esp_rgb_panel_t *panel) +{ + int bb_size_px = panel->bb_size / (panel->fb_bits_per_pixel / 8); + bool do_restart = false; +#if CONFIG_LCD_RGB_RESTART_IN_VSYNC + do_restart = true; +#else + portENTER_CRITICAL_ISR(&panel->spinlock); + if (panel->flags.need_restart) { + panel->flags.need_restart = false; + do_restart = true; + } + if (panel->bb_eof_count < panel->expect_eof_count) { + do_restart = true; + } + panel->bb_eof_count = 0; + portEXIT_CRITICAL_ISR(&panel->spinlock); +#endif // CONFIG_LCD_RGB_RESTART_IN_VSYNC + + if (!do_restart) { + return; + } + + if (panel->bb_size) { + // Catch de-synced frame buffer and reset if needed. + if (panel->bounce_pos_px > bb_size_px*2) { + panel->bounce_pos_px = 0; + } + // Pre-fill bounce buffer 0, if the EOF ISR didn't do that already + if (panel->bounce_pos_px < bb_size_px) { + lcd_rgb_panel_fill_bounce_buffer(panel, panel->bounce_buffer[0]); + } + } + + gdma_reset(panel->dma_chan); + // restart the DMA by a special DMA node + gdma_start(panel->dma_chan, (intptr_t)&panel->dma_restart_node); + + if (panel->bb_size) { + // Fill 2nd bounce buffer while 1st is being sent out, if needed. + if (panel->bounce_pos_px < bb_size_px*2) { + lcd_rgb_panel_fill_bounce_buffer(panel, panel->bounce_buffer[1]); + } + } + +} + +static void lcd_rgb_panel_start_transmission(esp_rgb_panel_t *rgb_panel) +{ + // reset FIFO of DMA and LCD, incase there remains old frame data + gdma_reset(rgb_panel->dma_chan); + lcd_ll_stop(rgb_panel->hal.dev); + lcd_ll_fifo_reset(rgb_panel->hal.dev); + + // pre-fill bounce buffers if needed + if (rgb_panel->bb_size) { + rgb_panel->bounce_pos_px = 0; + lcd_rgb_panel_fill_bounce_buffer(rgb_panel, rgb_panel->bounce_buffer[0]); + lcd_rgb_panel_fill_bounce_buffer(rgb_panel, rgb_panel->bounce_buffer[1]); + } + + // the start of DMA should be prior to the start of LCD engine + gdma_start(rgb_panel->dma_chan, (intptr_t)rgb_panel->dma_links[rgb_panel->cur_fb_index]); + // delay 1us is sufficient for DMA to pass data to LCD FIFO + // in fact, this is only needed when LCD pixel clock is set too high + esp_rom_delay_us(1); + // start LCD engine + lcd_ll_start(rgb_panel->hal.dev); +} + +IRAM_ATTR static void lcd_rgb_panel_try_update_pclk(esp_rgb_panel_t *rgb_panel) +{ + portENTER_CRITICAL_ISR(&rgb_panel->spinlock); + if (unlikely(rgb_panel->flags.need_update_pclk)) { + rgb_panel->flags.need_update_pclk = false; + rgb_panel->timings.pclk_hz = lcd_hal_cal_pclk_freq(&rgb_panel->hal, rgb_panel->src_clk_hz, rgb_panel->timings.pclk_hz, rgb_panel->lcd_clk_flags); + } + portEXIT_CRITICAL_ISR(&rgb_panel->spinlock); +} + +IRAM_ATTR static void lcd_default_isr_handler(void *args) +{ + esp_rgb_panel_t *rgb_panel = (esp_rgb_panel_t *)args; + bool need_yield = false; + + uint32_t intr_status = lcd_ll_get_interrupt_status(rgb_panel->hal.dev); + lcd_ll_clear_interrupt_status(rgb_panel->hal.dev, intr_status); + if (intr_status & LCD_LL_EVENT_VSYNC_END) { + // call user registered callback + if (rgb_panel->on_vsync) { + if (rgb_panel->on_vsync(&rgb_panel->base, NULL, rgb_panel->user_ctx)) { + need_yield = true; + } + } + + // check whether to update the PCLK frequency, it should be safe to update the PCLK frequency in the VSYNC interrupt + lcd_rgb_panel_try_update_pclk(rgb_panel); + + if (rgb_panel->flags.stream_mode) { + // check whether to restart the transmission + lcd_rgb_panel_try_restart_transmission(rgb_panel); + } + + } + if (need_yield) { + portYIELD_FROM_ISR(); + } +} diff --git a/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_ssd1306.c b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_ssd1306.c new file mode 100644 index 000000000..d2a94aefb --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_ssd1306.c @@ -0,0 +1,265 @@ +/* + * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include "sdkconfig.h" +#if CONFIG_LCD_ENABLE_DEBUG_LOG +// The local log level must be defined before including esp_log.h +// Set the maximum log level for this source file +#define LOG_LOCAL_LEVEL ESP_LOG_DEBUG +#endif +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_lcd_panel_interface.h" +#include "esp_lcd_panel_io.h" +#include "esp_lcd_panel_vendor.h" +#include "esp_lcd_panel_ops.h" +#include "driver/gpio.h" +#include "esp_log.h" +#include "esp_check.h" + +static const char *TAG = "lcd_panel.ssd1306"; + +// SSD1306 commands +#define SSD1306_CMD_SET_MEMORY_ADDR_MODE 0x20 +#define SSD1306_CMD_SET_COLUMN_RANGE 0x21 +#define SSD1306_CMD_SET_PAGE_RANGE 0x22 +#define SSD1306_CMD_SET_CHARGE_PUMP 0x8D +#define SSD1306_CMD_MIRROR_X_OFF 0xA0 +#define SSD1306_CMD_MIRROR_X_ON 0xA1 +#define SSD1306_CMD_INVERT_OFF 0xA6 +#define SSD1306_CMD_INVERT_ON 0xA7 +#define SSD1306_CMD_DISP_OFF 0xAE +#define SSD1306_CMD_DISP_ON 0xAF +#define SSD1306_CMD_MIRROR_Y_OFF 0xC0 +#define SSD1306_CMD_MIRROR_Y_ON 0xC8 + +static esp_err_t panel_ssd1306_del(esp_lcd_panel_t *panel); +static esp_err_t panel_ssd1306_reset(esp_lcd_panel_t *panel); +static esp_err_t panel_ssd1306_init(esp_lcd_panel_t *panel); +static esp_err_t panel_ssd1306_draw_bitmap(esp_lcd_panel_t *panel, int x_start, int y_start, int x_end, int y_end, const void *color_data); +static esp_err_t panel_ssd1306_invert_color(esp_lcd_panel_t *panel, bool invert_color_data); +static esp_err_t panel_ssd1306_mirror(esp_lcd_panel_t *panel, bool mirror_x, bool mirror_y); +static esp_err_t panel_ssd1306_swap_xy(esp_lcd_panel_t *panel, bool swap_axes); +static esp_err_t panel_ssd1306_set_gap(esp_lcd_panel_t *panel, int x_gap, int y_gap); +static esp_err_t panel_ssd1306_disp_on_off(esp_lcd_panel_t *panel, bool off); + +typedef struct { + esp_lcd_panel_t base; + esp_lcd_panel_io_handle_t io; + int reset_gpio_num; + bool reset_level; + int x_gap; + int y_gap; + unsigned int bits_per_pixel; + bool swap_axes; +} ssd1306_panel_t; + +esp_err_t esp_lcd_new_panel_ssd1306(const esp_lcd_panel_io_handle_t io, const esp_lcd_panel_dev_config_t *panel_dev_config, esp_lcd_panel_handle_t *ret_panel) +{ +#if CONFIG_LCD_ENABLE_DEBUG_LOG + esp_log_level_set(TAG, ESP_LOG_DEBUG); +#endif + esp_err_t ret = ESP_OK; + ssd1306_panel_t *ssd1306 = NULL; + ESP_GOTO_ON_FALSE(io && panel_dev_config && ret_panel, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + ESP_GOTO_ON_FALSE(panel_dev_config->bits_per_pixel == 1, ESP_ERR_INVALID_ARG, err, TAG, "bpp must be 1"); + ssd1306 = calloc(1, sizeof(ssd1306_panel_t)); + ESP_GOTO_ON_FALSE(ssd1306, ESP_ERR_NO_MEM, err, TAG, "no mem for ssd1306 panel"); + + if (panel_dev_config->reset_gpio_num >= 0) { + gpio_config_t io_conf = { + .mode = GPIO_MODE_OUTPUT, + .pin_bit_mask = 1ULL << panel_dev_config->reset_gpio_num, + }; + ESP_GOTO_ON_ERROR(gpio_config(&io_conf), err, TAG, "configure GPIO for RST line failed"); + } + + ssd1306->io = io; + ssd1306->bits_per_pixel = panel_dev_config->bits_per_pixel; + ssd1306->reset_gpio_num = panel_dev_config->reset_gpio_num; + ssd1306->reset_level = panel_dev_config->flags.reset_active_high; + ssd1306->base.del = panel_ssd1306_del; + ssd1306->base.reset = panel_ssd1306_reset; + ssd1306->base.init = panel_ssd1306_init; + ssd1306->base.draw_bitmap = panel_ssd1306_draw_bitmap; + ssd1306->base.invert_color = panel_ssd1306_invert_color; + ssd1306->base.set_gap = panel_ssd1306_set_gap; + ssd1306->base.mirror = panel_ssd1306_mirror; + ssd1306->base.swap_xy = panel_ssd1306_swap_xy; + ssd1306->base.disp_on_off = panel_ssd1306_disp_on_off; + *ret_panel = &(ssd1306->base); + ESP_LOGD(TAG, "new ssd1306 panel @%p", ssd1306); + + return ESP_OK; + +err: + if (ssd1306) { + if (panel_dev_config->reset_gpio_num >= 0) { + gpio_reset_pin(panel_dev_config->reset_gpio_num); + } + free(ssd1306); + } + return ret; +} + +static esp_err_t panel_ssd1306_del(esp_lcd_panel_t *panel) +{ + ssd1306_panel_t *ssd1306 = __containerof(panel, ssd1306_panel_t, base); + if (ssd1306->reset_gpio_num >= 0) { + gpio_reset_pin(ssd1306->reset_gpio_num); + } + ESP_LOGD(TAG, "del ssd1306 panel @%p", ssd1306); + free(ssd1306); + return ESP_OK; +} + +static esp_err_t panel_ssd1306_reset(esp_lcd_panel_t *panel) +{ + ssd1306_panel_t *ssd1306 = __containerof(panel, ssd1306_panel_t, base); + + // perform hardware reset + if (ssd1306->reset_gpio_num >= 0) { + gpio_set_level(ssd1306->reset_gpio_num, ssd1306->reset_level); + vTaskDelay(pdMS_TO_TICKS(10)); + gpio_set_level(ssd1306->reset_gpio_num, !ssd1306->reset_level); + vTaskDelay(pdMS_TO_TICKS(10)); + } + + return ESP_OK; +} + +static esp_err_t panel_ssd1306_init(esp_lcd_panel_t *panel) +{ + ssd1306_panel_t *ssd1306 = __containerof(panel, ssd1306_panel_t, base); + esp_lcd_panel_io_handle_t io = ssd1306->io; + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, SSD1306_CMD_DISP_OFF, NULL, 0), TAG, + "io tx param SSD1306_CMD_DISP_OFF failed"); + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, SSD1306_CMD_SET_MEMORY_ADDR_MODE, (uint8_t[]) { + 0x00 // horizontal addressing mode + }, 1), TAG, "io tx param SSD1306_CMD_SET_MEMORY_ADDR_MODE failed"); + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, SSD1306_CMD_SET_CHARGE_PUMP, (uint8_t[]) { + 0x14 // enable charge pump + }, 1), TAG, "io tx param SSD1306_CMD_SET_CHARGE_PUMP failed"); + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, SSD1306_CMD_MIRROR_X_OFF, NULL, 0), TAG, + "io tx param SSD1306_CMD_MIRROR_X_OFF failed"); + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, SSD1306_CMD_MIRROR_Y_OFF, NULL, 0), TAG, + "io tx param SSD1306_CMD_MIRROR_Y_OFF failed"); + return ESP_OK; +} + +static esp_err_t panel_ssd1306_draw_bitmap(esp_lcd_panel_t *panel, int x_start, int y_start, int x_end, int y_end, const void *color_data) +{ + ssd1306_panel_t *ssd1306 = __containerof(panel, ssd1306_panel_t, base); + assert((x_start < x_end) && (y_start < y_end) && "start position must be smaller than end position"); + esp_lcd_panel_io_handle_t io = ssd1306->io; + + // adding extra gap + x_start += ssd1306->x_gap; + x_end += ssd1306->x_gap; + y_start += ssd1306->y_gap; + y_end += ssd1306->y_gap; + + if (ssd1306->swap_axes) { + int x = x_start; + x_start = y_start; + y_start = x; + x = x_end; + x_end = y_end; + y_end = x; + } + + // one page contains 8 rows (COMs) + uint8_t page_start = y_start / 8; + uint8_t page_end = (y_end - 1) / 8; + // define an area of frame memory where MCU can access + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, SSD1306_CMD_SET_COLUMN_RANGE, (uint8_t[]) { + (x_start & 0x7F), + ((x_end - 1) & 0x7F), + }, 2), TAG, "io tx param SSD1306_CMD_SET_COLUMN_RANGE failed"); + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, SSD1306_CMD_SET_PAGE_RANGE, (uint8_t[]) { + (page_start & 0x07), + (page_end & 0x07), + }, 2), TAG, "io tx param SSD1306_CMD_SET_PAGE_RANGE failed"); + // transfer frame buffer + size_t len = (y_end - y_start) * (x_end - x_start) * ssd1306->bits_per_pixel / 8; + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_color(io, -1, color_data, len), TAG, "io tx color failed"); + + return ESP_OK; +} + +static esp_err_t panel_ssd1306_invert_color(esp_lcd_panel_t *panel, bool invert_color_data) +{ + ssd1306_panel_t *ssd1306 = __containerof(panel, ssd1306_panel_t, base); + esp_lcd_panel_io_handle_t io = ssd1306->io; + int command = 0; + if (invert_color_data) { + command = SSD1306_CMD_INVERT_ON; + } else { + command = SSD1306_CMD_INVERT_OFF; + } + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, command, NULL, 0), TAG, + "io tx param SSD1306_CMD_INVERT_ON/OFF failed"); + return ESP_OK; +} + +static esp_err_t panel_ssd1306_mirror(esp_lcd_panel_t *panel, bool mirror_x, bool mirror_y) +{ + ssd1306_panel_t *ssd1306 = __containerof(panel, ssd1306_panel_t, base); + esp_lcd_panel_io_handle_t io = ssd1306->io; + + int command = 0; + if (mirror_x) { + command = SSD1306_CMD_MIRROR_X_ON; + } else { + command = SSD1306_CMD_MIRROR_X_OFF; + } + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, command, NULL, 0), TAG, + "io tx param SSD1306_CMD_MIRROR_X_ON/OFF failed"); + if (mirror_y) { + command = SSD1306_CMD_MIRROR_Y_ON; + } else { + command = SSD1306_CMD_MIRROR_Y_OFF; + } + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, command, NULL, 0), TAG, + "io tx param SSD1306_CMD_MIRROR_Y_ON/OFF failed"); + return ESP_OK; +} + +static esp_err_t panel_ssd1306_swap_xy(esp_lcd_panel_t *panel, bool swap_axes) +{ + ssd1306_panel_t *ssd1306 = __containerof(panel, ssd1306_panel_t, base); + ssd1306->swap_axes = swap_axes; + + return ESP_OK; +} + +static esp_err_t panel_ssd1306_set_gap(esp_lcd_panel_t *panel, int x_gap, int y_gap) +{ + ssd1306_panel_t *ssd1306 = __containerof(panel, ssd1306_panel_t, base); + ssd1306->x_gap = x_gap; + ssd1306->y_gap = y_gap; + return ESP_OK; +} + +static esp_err_t panel_ssd1306_disp_on_off(esp_lcd_panel_t *panel, bool on_off) +{ + ssd1306_panel_t *ssd1306 = __containerof(panel, ssd1306_panel_t, base); + esp_lcd_panel_io_handle_t io = ssd1306->io; + int command = 0; + if (on_off) { + command = SSD1306_CMD_DISP_ON; + } else { + command = SSD1306_CMD_DISP_OFF; + } + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, command, NULL, 0), TAG, + "io tx param SSD1306_CMD_DISP_ON/OFF failed"); + // SEG/COM will be ON/OFF after 100ms after sending DISP_ON/OFF command + vTaskDelay(pdMS_TO_TICKS(100)); + return ESP_OK; +} diff --git a/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_st7789.c b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_st7789.c new file mode 100644 index 000000000..76e26fd6d --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/src/esp_lcd_panel_st7789.c @@ -0,0 +1,317 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include "sdkconfig.h" + +#if CONFIG_LCD_ENABLE_DEBUG_LOG +// The local log level must be defined before including esp_log.h +// Set the maximum log level for this source file +#define LOG_LOCAL_LEVEL ESP_LOG_DEBUG +#endif + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_lcd_panel_interface.h" +#include "esp_lcd_panel_io.h" +#include "esp_lcd_panel_vendor.h" +#include "esp_lcd_panel_ops.h" +#include "esp_lcd_panel_commands.h" +#include "driver/gpio.h" +#include "esp_log.h" +#include "esp_check.h" + +#define ST7789_CMD_RAMCTRL 0xb0 +#define ST7789_DATA_LITTLE_ENDIAN_BIT (1 << 3) + +static const char *TAG = "lcd_panel.st7789"; + +static esp_err_t panel_st7789_del(esp_lcd_panel_t *panel); +static esp_err_t panel_st7789_reset(esp_lcd_panel_t *panel); +static esp_err_t panel_st7789_init(esp_lcd_panel_t *panel); +static esp_err_t panel_st7789_draw_bitmap(esp_lcd_panel_t *panel, int x_start, int y_start, int x_end, int y_end, + const void *color_data); +static esp_err_t panel_st7789_invert_color(esp_lcd_panel_t *panel, bool invert_color_data); +static esp_err_t panel_st7789_mirror(esp_lcd_panel_t *panel, bool mirror_x, bool mirror_y); +static esp_err_t panel_st7789_swap_xy(esp_lcd_panel_t *panel, bool swap_axes); +static esp_err_t panel_st7789_set_gap(esp_lcd_panel_t *panel, int x_gap, int y_gap); +static esp_err_t panel_st7789_disp_on_off(esp_lcd_panel_t *panel, bool off); +static esp_err_t panel_st7789_sleep(esp_lcd_panel_t *panel, bool sleep); + +typedef struct { + esp_lcd_panel_t base; + esp_lcd_panel_io_handle_t io; + int reset_gpio_num; + bool reset_level; + int x_gap; + int y_gap; + uint8_t fb_bits_per_pixel; + uint8_t madctl_val; // save current value of LCD_CMD_MADCTL register + uint8_t colmod_val; // save current value of LCD_CMD_COLMOD register + uint8_t ramctl_val_1; + uint8_t ramctl_val_2; +} st7789_panel_t; + +esp_err_t +esp_lcd_new_panel_st7789(const esp_lcd_panel_io_handle_t io, const esp_lcd_panel_dev_config_t *panel_dev_config, + esp_lcd_panel_handle_t *ret_panel) +{ +#if CONFIG_LCD_ENABLE_DEBUG_LOG + esp_log_level_set(TAG, ESP_LOG_DEBUG); +#endif + esp_err_t ret = ESP_OK; + st7789_panel_t *st7789 = NULL; + ESP_GOTO_ON_FALSE(io && panel_dev_config && ret_panel, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + st7789 = calloc(1, sizeof(st7789_panel_t)); + ESP_GOTO_ON_FALSE(st7789, ESP_ERR_NO_MEM, err, TAG, "no mem for st7789 panel"); + + if (panel_dev_config->reset_gpio_num >= 0) { + gpio_config_t io_conf = { + .mode = GPIO_MODE_OUTPUT, + .pin_bit_mask = 1ULL << panel_dev_config->reset_gpio_num, + }; + ESP_GOTO_ON_ERROR(gpio_config(&io_conf), err, TAG, "configure GPIO for RST line failed"); + } + + switch (panel_dev_config->rgb_endian) { + case LCD_RGB_ENDIAN_RGB: + st7789->madctl_val = 0; + break; + case LCD_RGB_ENDIAN_BGR: + st7789->madctl_val |= LCD_CMD_BGR_BIT; + break; + default: + ESP_GOTO_ON_FALSE(false, ESP_ERR_NOT_SUPPORTED, err, TAG, "unsupported color space"); + break; + } + + uint8_t fb_bits_per_pixel = 0; + switch (panel_dev_config->bits_per_pixel) { + case 16: // RGB565 + st7789->colmod_val = 0x55; + fb_bits_per_pixel = 16; + break; + case 18: // RGB666 + st7789->colmod_val = 0x66; + // each color component (R/G/B) should occupy the 6 high bits of a byte, which means 3 full bytes are required for a pixel + fb_bits_per_pixel = 24; + break; + default: + ESP_GOTO_ON_FALSE(false, ESP_ERR_NOT_SUPPORTED, err, TAG, "unsupported pixel width"); + break; + } + + st7789->ramctl_val_1 = 0x00; + st7789->ramctl_val_2 = 0xf0; // Use big endian by default + if ((panel_dev_config->data_endian) == LCD_RGB_DATA_ENDIAN_LITTLE) { + // Use little endian + st7789->ramctl_val_2 |= ST7789_DATA_LITTLE_ENDIAN_BIT; + } + + st7789->io = io; + st7789->fb_bits_per_pixel = fb_bits_per_pixel; + st7789->reset_gpio_num = panel_dev_config->reset_gpio_num; + st7789->reset_level = panel_dev_config->flags.reset_active_high; + st7789->base.del = panel_st7789_del; + st7789->base.reset = panel_st7789_reset; + st7789->base.init = panel_st7789_init; + st7789->base.draw_bitmap = panel_st7789_draw_bitmap; + st7789->base.invert_color = panel_st7789_invert_color; + st7789->base.set_gap = panel_st7789_set_gap; + st7789->base.mirror = panel_st7789_mirror; + st7789->base.swap_xy = panel_st7789_swap_xy; + st7789->base.disp_on_off = panel_st7789_disp_on_off; + st7789->base.disp_sleep = panel_st7789_sleep; + *ret_panel = &(st7789->base); + ESP_LOGD(TAG, "new st7789 panel @%p", st7789); + + return ESP_OK; + +err: + if (st7789) { + if (panel_dev_config->reset_gpio_num >= 0) { + gpio_reset_pin(panel_dev_config->reset_gpio_num); + } + free(st7789); + } + return ret; +} + +static esp_err_t panel_st7789_del(esp_lcd_panel_t *panel) +{ + st7789_panel_t *st7789 = __containerof(panel, st7789_panel_t, base); + + if (st7789->reset_gpio_num >= 0) { + gpio_reset_pin(st7789->reset_gpio_num); + } + ESP_LOGD(TAG, "del st7789 panel @%p", st7789); + free(st7789); + return ESP_OK; +} + +static esp_err_t panel_st7789_reset(esp_lcd_panel_t *panel) +{ + st7789_panel_t *st7789 = __containerof(panel, st7789_panel_t, base); + esp_lcd_panel_io_handle_t io = st7789->io; + + // perform hardware reset + if (st7789->reset_gpio_num >= 0) { + gpio_set_level(st7789->reset_gpio_num, st7789->reset_level); + vTaskDelay(pdMS_TO_TICKS(10)); + gpio_set_level(st7789->reset_gpio_num, !st7789->reset_level); + vTaskDelay(pdMS_TO_TICKS(10)); + } else { // perform software reset + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, LCD_CMD_SWRESET, NULL, 0), TAG, + "io tx param failed"); + vTaskDelay(pdMS_TO_TICKS(20)); // spec, wait at least 5m before sending new command + } + + return ESP_OK; +} + +static esp_err_t panel_st7789_init(esp_lcd_panel_t *panel) +{ + st7789_panel_t *st7789 = __containerof(panel, st7789_panel_t, base); + esp_lcd_panel_io_handle_t io = st7789->io; + // LCD goes into sleep mode and display will be turned off after power on reset, exit sleep mode first + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, LCD_CMD_SLPOUT, NULL, 0), TAG, + "io tx param failed"); + vTaskDelay(pdMS_TO_TICKS(100)); + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, LCD_CMD_MADCTL, (uint8_t[]) { + st7789->madctl_val, + }, 1), TAG, "io tx param failed"); + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, LCD_CMD_COLMOD, (uint8_t[]) { + st7789->colmod_val, + }, 1), TAG, "io tx param failed"); + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, ST7789_CMD_RAMCTRL, (uint8_t[]) { + st7789->ramctl_val_1, st7789->ramctl_val_2 + }, 2), TAG, "io tx param failed"); + + return ESP_OK; +} + +static esp_err_t panel_st7789_draw_bitmap(esp_lcd_panel_t *panel, int x_start, int y_start, int x_end, int y_end, + const void *color_data) +{ + st7789_panel_t *st7789 = __containerof(panel, st7789_panel_t, base); + assert((x_start < x_end) && (y_start < y_end) && "start position must be smaller than end position"); + esp_lcd_panel_io_handle_t io = st7789->io; + + x_start += st7789->x_gap; + x_end += st7789->x_gap; + y_start += st7789->y_gap; + y_end += st7789->y_gap; + + // define an area of frame memory where MCU can access + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, LCD_CMD_CASET, (uint8_t[]) { + (x_start >> 8) & 0xFF, + x_start & 0xFF, + ((x_end - 1) >> 8) & 0xFF, + (x_end - 1) & 0xFF, + }, 4), TAG, "io tx param failed"); + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, LCD_CMD_RASET, (uint8_t[]) { + (y_start >> 8) & 0xFF, + y_start & 0xFF, + ((y_end - 1) >> 8) & 0xFF, + (y_end - 1) & 0xFF, + }, 4), TAG, "io tx param failed"); + // transfer frame buffer + size_t len = (x_end - x_start) * (y_end - y_start) * st7789->fb_bits_per_pixel / 8; + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_color(io, LCD_CMD_RAMWR, color_data, len), TAG, "io tx color failed"); + + return ESP_OK; +} + +static esp_err_t panel_st7789_invert_color(esp_lcd_panel_t *panel, bool invert_color_data) +{ + st7789_panel_t *st7789 = __containerof(panel, st7789_panel_t, base); + esp_lcd_panel_io_handle_t io = st7789->io; + int command = 0; + if (invert_color_data) { + command = LCD_CMD_INVON; + } else { + command = LCD_CMD_INVOFF; + } + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, command, NULL, 0), TAG, + "io tx param failed"); + return ESP_OK; +} + +static esp_err_t panel_st7789_mirror(esp_lcd_panel_t *panel, bool mirror_x, bool mirror_y) +{ + st7789_panel_t *st7789 = __containerof(panel, st7789_panel_t, base); + esp_lcd_panel_io_handle_t io = st7789->io; + if (mirror_x) { + st7789->madctl_val |= LCD_CMD_MX_BIT; + } else { + st7789->madctl_val &= ~LCD_CMD_MX_BIT; + } + if (mirror_y) { + st7789->madctl_val |= LCD_CMD_MY_BIT; + } else { + st7789->madctl_val &= ~LCD_CMD_MY_BIT; + } + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, LCD_CMD_MADCTL, (uint8_t[]) { + st7789->madctl_val + }, 1), TAG, "io tx param failed"); + return ESP_OK; +} + +static esp_err_t panel_st7789_swap_xy(esp_lcd_panel_t *panel, bool swap_axes) +{ + st7789_panel_t *st7789 = __containerof(panel, st7789_panel_t, base); + esp_lcd_panel_io_handle_t io = st7789->io; + if (swap_axes) { + st7789->madctl_val |= LCD_CMD_MV_BIT; + } else { + st7789->madctl_val &= ~LCD_CMD_MV_BIT; + } + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, LCD_CMD_MADCTL, (uint8_t[]) { + st7789->madctl_val + }, 1), TAG, "io tx param failed"); + return ESP_OK; +} + +static esp_err_t panel_st7789_set_gap(esp_lcd_panel_t *panel, int x_gap, int y_gap) +{ + st7789_panel_t *st7789 = __containerof(panel, st7789_panel_t, base); + st7789->x_gap = x_gap; + st7789->y_gap = y_gap; + return ESP_OK; +} + +static esp_err_t panel_st7789_disp_on_off(esp_lcd_panel_t *panel, bool on_off) +{ + st7789_panel_t *st7789 = __containerof(panel, st7789_panel_t, base); + esp_lcd_panel_io_handle_t io = st7789->io; + int command = 0; + if (on_off) { + command = LCD_CMD_DISPON; + } else { + command = LCD_CMD_DISPOFF; + } + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, command, NULL, 0), TAG, + "io tx param failed"); + return ESP_OK; +} + +static esp_err_t panel_st7789_sleep(esp_lcd_panel_t *panel, bool sleep) +{ + st7789_panel_t *st7789 = __containerof(panel, st7789_panel_t, base); + esp_lcd_panel_io_handle_t io = st7789->io; + int command = 0; + if (sleep) { + command = LCD_CMD_SLPIN; + } else { + command = LCD_CMD_SLPOUT; + } + ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, command, NULL, 0), TAG, + "io tx param failed"); + vTaskDelay(pdMS_TO_TICKS(100)); + + return ESP_OK; +} diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/.build-test-rules.yml b/tulip/esp32s3/components/esp_lcd/test_apps/.build-test-rules.yml new file mode 100644 index 000000000..7067d63dd --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/.build-test-rules.yml @@ -0,0 +1,47 @@ +# Documentation: .gitlab/ci/README.md#manifest-file-to-control-the-buildtest-apps + +components/esp_lcd/test_apps/i2c_lcd: + disable: + - if: SOC_I2C_SUPPORTED != 1 + depends_components: + - esp_lcd + depends_filepatterns: + - components/driver/i2c/**/* + disable_test: + - if: IDF_TARGET not in ["esp32c3"] + temporary: true + reason: insufficient runners + +components/esp_lcd/test_apps/i2c_lcd_legacy: + disable: + - if: SOC_I2C_SUPPORTED != 1 + depends_components: + - esp_lcd + depends_filepatterns: + - components/driver/i2c/**/* + disable_test: + - if: IDF_TARGET not in ["esp32c3"] + temporary: true + reason: insufficient runners + +components/esp_lcd/test_apps/i80_lcd: + depends_components: + - esp_lcd + depends_filepatterns: + - components/driver/i2s/**/* # i80 IO driver relies on I2S on esp32 and esp32s2 + disable: + - if: SOC_LCD_I80_SUPPORTED != 1 + +components/esp_lcd/test_apps/rgb_lcd: + depends_components: + - esp_lcd + disable: + - if: SOC_LCD_RGB_SUPPORTED != 1 + +components/esp_lcd/test_apps/spi_lcd: + depends_components: + - esp_lcd + depends_filepatterns: + - components/driver/spi/**/* + disable: + - if: SOC_GPSPI_SUPPORTED != 1 diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/CMakeLists.txt b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/CMakeLists.txt new file mode 100644 index 000000000..8dd5f4d48 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/CMakeLists.txt @@ -0,0 +1,8 @@ +# This is the project CMakeLists.txt file for the test subproject +cmake_minimum_required(VERSION 3.16) + +# "Trim" the build. Include the minimal set of components, main, and anything it depends on. +set(COMPONENTS main) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(i2c_lcd_panel_test) diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/README.md b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/README.md new file mode 100644 index 000000000..10a58b277 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/README.md @@ -0,0 +1,4 @@ +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | + +This test app is used to test LCDs with I2C interface. diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/main/CMakeLists.txt b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/main/CMakeLists.txt new file mode 100644 index 000000000..aa4f3147a --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/main/CMakeLists.txt @@ -0,0 +1,8 @@ +set(srcs "test_app_main.c" + "test_i2c_lcd_panel.c") + +# In order for the cases defined by `TEST_CASE` to be linked into the final elf, +# the component can be registered as WHOLE_ARCHIVE +idf_component_register(SRCS ${srcs} + PRIV_REQUIRES esp_lcd unity driver + WHOLE_ARCHIVE) diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/main/test_app_main.c b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/main/test_app_main.c new file mode 100644 index 000000000..2c2aa076d --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/main/test_app_main.c @@ -0,0 +1,51 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: CC0-1.0 + */ + +#include "unity.h" +#include "unity_test_runner.h" +#include "esp_heap_caps.h" + +// Some resources are lazy allocated in the LCD driver, the threadhold is left for that case +#define TEST_MEMORY_LEAK_THRESHOLD (-300) + +static size_t before_free_8bit; +static size_t before_free_32bit; + +static void check_leak(size_t before_free, size_t after_free, const char *type) +{ + ssize_t delta = after_free - before_free; + printf("MALLOC_CAP_%s: Before %u bytes free, After %u bytes free (delta %d)\n", type, before_free, after_free, delta); + TEST_ASSERT_MESSAGE(delta >= TEST_MEMORY_LEAK_THRESHOLD, "memory leak"); +} + +void setUp(void) +{ + before_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); + before_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); +} + +void tearDown(void) +{ + size_t after_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); + size_t after_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); + check_leak(before_free_8bit, after_free_8bit, "8BIT"); + check_leak(before_free_32bit, after_free_32bit, "32BIT"); +} + +void app_main(void) +{ + // ___ ____ ____ _ ____ ____ _____ _ + // |_ _|___ \ / ___| | | / ___| _ \ |_ _|__ ___| |_ + // | | __) | | | | | | | | | | | |/ _ \/ __| __| + // | | / __/| |___ | |__| |___| |_| | | | __/\__ \ |_ + // |___|_____|\____| |_____\____|____/ |_|\___||___/\__| + printf(" ___ ____ ____ _ ____ ____ _____ _\r\n"); + printf("|_ _|___ \\ / ___| | | / ___| _ \\ |_ _|__ ___| |_\r\n"); + printf(" | | __) | | | | | | | | | | | |/ _ \\/ __| __|\r\n"); + printf(" | | / __/| |___ | |__| |___| |_| | | | __/\\__ \\ |_\r\n"); + printf("|___|_____|\\____| |_____\\____|____/ |_|\\___||___/\\__|\r\n"); + unity_run_menu(); +} diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/main/test_i2c_board.h b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/main/test_i2c_board.h new file mode 100644 index 000000000..c8f4150a0 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/main/test_i2c_board.h @@ -0,0 +1,26 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#define TEST_LCD_H_RES 128 +#define TEST_LCD_V_RES 64 + +#define TEST_I2C_SDA_GPIO 0 +#define TEST_I2C_SCL_GPIO 2 + +#define TEST_I2C_HOST_ID 0 + +#define TEST_I2C_DEV_ADDR 0x3C + +#define TEST_LCD_PIXEL_CLOCK_HZ (400 * 1000) + +#ifdef __cplusplus +} +#endif diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/main/test_i2c_lcd_panel.c b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/main/test_i2c_lcd_panel.c new file mode 100644 index 000000000..19884dee5 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/main/test_i2c_lcd_panel.c @@ -0,0 +1,71 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include "unity.h" +#include "driver/i2c_master.h" +#include "driver/gpio.h" +#include "esp_lcd_panel_io.h" +#include "esp_lcd_panel_vendor.h" +#include "esp_lcd_panel_ops.h" +#include "esp_system.h" +#include "test_i2c_board.h" + +TEST_CASE("lcd_panel_with_i2c_interface_(ssd1306)", "[lcd]") +{ + const uint8_t pattern[][16] = {{ + 0x00, 0x7E, 0x42, 0x42, 0x42, 0x42, 0x7E, 0x00, + 0x00, 0x7E, 0x42, 0x42, 0x42, 0x42, 0x7E, 0x00 + }, + { + 0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81, + 0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81 + } + }; + + i2c_master_bus_config_t i2c_bus_conf = { + .clk_source = I2C_CLK_SRC_DEFAULT, + .sda_io_num = TEST_I2C_SDA_GPIO, + .scl_io_num = TEST_I2C_SCL_GPIO, + .i2c_port = -1, + }; + + i2c_master_bus_handle_t bus_handle; + TEST_ESP_OK(i2c_new_master_bus(&i2c_bus_conf, &bus_handle)); + + esp_lcd_panel_io_handle_t io_handle = NULL; + esp_lcd_panel_io_i2c_config_t io_config = { + .dev_addr = TEST_I2C_DEV_ADDR, + .scl_speed_hz = TEST_LCD_PIXEL_CLOCK_HZ, + .control_phase_bytes = 1, // According to SSD1306 datasheet + .dc_bit_offset = 6, // According to SSD1306 datasheet + .lcd_cmd_bits = 8, // According to SSD1306 datasheet + .lcd_param_bits = 8, // According to SSD1306 datasheet + }; + + TEST_ESP_OK(esp_lcd_new_panel_io_i2c(bus_handle, &io_config, &io_handle)); + + esp_lcd_panel_handle_t panel_handle = NULL; + esp_lcd_panel_dev_config_t panel_config = { + .bits_per_pixel = 1, + .reset_gpio_num = -1, + }; + TEST_ESP_OK(esp_lcd_new_panel_ssd1306(io_handle, &panel_config, &panel_handle)); + TEST_ESP_OK(esp_lcd_panel_reset(panel_handle)); + TEST_ESP_OK(esp_lcd_panel_init(panel_handle)); + // turn on display + TEST_ESP_OK(esp_lcd_panel_disp_on_off(panel_handle, true)); + + for (int i = 0; i < TEST_LCD_H_RES / 16; i++) { + for (int j = 0; j < TEST_LCD_V_RES / 8; j++) { + TEST_ESP_OK(esp_lcd_panel_draw_bitmap(panel_handle, i * 16, j * 8, i * 16 + 16, j * 8 + 8, pattern[i & 0x01])); + } + } + + TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); + TEST_ESP_OK(esp_lcd_panel_io_del(io_handle)); + TEST_ESP_OK(i2c_del_master_bus(bus_handle)); +} diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/pytest_i2c_lcd.py b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/pytest_i2c_lcd.py new file mode 100644 index 000000000..610d15c48 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/pytest_i2c_lcd.py @@ -0,0 +1,18 @@ +# SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: CC0-1.0 + +import pytest +from pytest_embedded import Dut + + +@pytest.mark.esp32c3 +@pytest.mark.i2c_oled +@pytest.mark.parametrize( + 'config', + [ + 'release', + ], + indirect=True, +) +def test_i2c_lcd(dut: Dut) -> None: + dut.run_all_single_board_cases() diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/sdkconfig.ci.release b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/sdkconfig.ci.release new file mode 100644 index 000000000..3cff15d49 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/sdkconfig.ci.release @@ -0,0 +1,3 @@ +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT=y diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/sdkconfig.defaults b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/sdkconfig.defaults new file mode 100644 index 000000000..ccc43c6fd --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd/sdkconfig.defaults @@ -0,0 +1,5 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) Project Minimal Configuration +# +# CONFIG_ESP_TASK_WDT_INIT is not set +CONFIG_FREERTOS_HZ=1000 diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/CMakeLists.txt b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/CMakeLists.txt new file mode 100644 index 000000000..8c099ff31 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/CMakeLists.txt @@ -0,0 +1,9 @@ +# This is the project CMakeLists.txt file for the test subproject +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) + +# "Trim" the build. Include the minimal set of components, main, and anything it depends on. +set(COMPONENTS main) + +project(legacy_i2c_lcd_panel_test) diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/README.md b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/README.md new file mode 100644 index 000000000..10a58b277 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/README.md @@ -0,0 +1,4 @@ +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | + +This test app is used to test LCDs with I2C interface. diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/main/CMakeLists.txt b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/main/CMakeLists.txt new file mode 100644 index 000000000..a168fe90a --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/main/CMakeLists.txt @@ -0,0 +1,8 @@ +set(srcs "test_app_main.c" + "test_i2c_lcd_legacy_panel.c") + +# In order for the cases defined by `TEST_CASE` to be linked into the final elf, +# the component can be registered as WHOLE_ARCHIVE +idf_component_register(SRCS ${srcs} + PRIV_REQUIRES unity driver esp_lcd + WHOLE_ARCHIVE) diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/main/test_app_main.c b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/main/test_app_main.c new file mode 100644 index 000000000..826e43ddb --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/main/test_app_main.c @@ -0,0 +1,51 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: CC0-1.0 + */ + +#include "unity.h" +#include "unity_test_runner.h" +#include "esp_heap_caps.h" + +// Some resources are lazy allocated in the LCD driver, the threadhold is left for that case +#define TEST_MEMORY_LEAK_THRESHOLD (-300) + +static size_t before_free_8bit; +static size_t before_free_32bit; + +static void check_leak(size_t before_free, size_t after_free, const char *type) +{ + ssize_t delta = after_free - before_free; + printf("MALLOC_CAP_%s: Before %u bytes free, After %u bytes free (delta %d)\n", type, before_free, after_free, delta); + TEST_ASSERT_MESSAGE(delta >= TEST_MEMORY_LEAK_THRESHOLD, "memory leak"); +} + +void setUp(void) +{ + before_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); + before_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); +} + +void tearDown(void) +{ + size_t after_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); + size_t after_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); + check_leak(before_free_8bit, after_free_8bit, "8BIT"); + check_leak(before_free_32bit, after_free_32bit, "32BIT"); +} + +void app_main(void) +{ + // ___ ____ ____ _ ____ ____ _____ _ + // |_ _|___ \ / ___| | | / ___| _ \ |_ _|__ ___| |_ + // | | __) | | | | | | | | | | | |/ _ \/ __| __| + // | | / __/| |___ | |__| |___| |_| | | | __/\__ \ |_ + // |___|_____|\____| |_____\____|____/ |_|\___||___/\__| + printf(" ___ ____ ____ _ ____ ____ _____ _\r\n"); + printf("|_ _|___ \\ / ___| | | / ___| _ \\ |_ _|__ ___| |_\r\n"); + printf(" | | __) | | | | | | | | | | | |/ _ \\/ __| __|\r\n"); + printf(" | | / __/| |___ | |__| |___| |_| | | | __/\\__ \\ |_\r\n"); + printf("|___|_____|\\____| |_____\\____|____/ |_|\\___||___/\\__|\r\n"); + unity_run_menu(); +} diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/main/test_i2c_board.h b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/main/test_i2c_board.h new file mode 100644 index 000000000..f108031ca --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/main/test_i2c_board.h @@ -0,0 +1,26 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#define TEST_LCD_H_RES 128 +#define TEST_LCD_V_RES 64 + +#define TEST_I2C_SDA_GPIO 0 +#define TEST_I2C_SCL_GPIO 2 + +#define TEST_I2C_HOST_ID 0 + +#define TEST_I2C_DEV_ADDR 0x3C + +#define TEST_LCD_PIXEL_CLOCK_HZ (400 * 1000) + +#ifdef __cplusplus +} +#endif diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/main/test_i2c_lcd_legacy_panel.c b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/main/test_i2c_lcd_legacy_panel.c new file mode 100644 index 000000000..4a55b60b2 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/main/test_i2c_lcd_legacy_panel.c @@ -0,0 +1,70 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include "unity.h" +#include "driver/i2c.h" +#include "driver/gpio.h" +#include "esp_lcd_panel_io.h" +#include "esp_lcd_panel_vendor.h" +#include "esp_lcd_panel_ops.h" +#include "esp_system.h" +#include "test_i2c_board.h" + +TEST_CASE("lcd_panel_with_i2c_interface legacy_(ssd1306)", "[lcd]") +{ + const uint8_t pattern[][16] = {{ + 0x00, 0x7E, 0x42, 0x42, 0x42, 0x42, 0x7E, 0x00, + 0x00, 0x7E, 0x42, 0x42, 0x42, 0x42, 0x7E, 0x00 + }, + { + 0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81, + 0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81 + } + }; + + i2c_config_t conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = TEST_I2C_SDA_GPIO, + .scl_io_num = TEST_I2C_SCL_GPIO, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = TEST_LCD_PIXEL_CLOCK_HZ, + }; + TEST_ESP_OK(i2c_param_config(TEST_I2C_HOST_ID, &conf)); + TEST_ESP_OK(i2c_driver_install(TEST_I2C_HOST_ID, I2C_MODE_MASTER, 0, 0, 0)); + + esp_lcd_panel_io_handle_t io_handle = NULL; + esp_lcd_panel_io_i2c_config_t io_config = { + .dev_addr = TEST_I2C_DEV_ADDR, + .control_phase_bytes = 1, // According to SSD1306 datasheet + .dc_bit_offset = 6, // According to SSD1306 datasheet + .lcd_cmd_bits = 8, // According to SSD1306 datasheet + .lcd_param_bits = 8, // According to SSD1306 datasheet + }; + TEST_ESP_OK(esp_lcd_new_panel_io_i2c((esp_lcd_i2c_bus_handle_t)TEST_I2C_HOST_ID, &io_config, &io_handle)); + + esp_lcd_panel_handle_t panel_handle = NULL; + esp_lcd_panel_dev_config_t panel_config = { + .bits_per_pixel = 1, + .reset_gpio_num = -1, + }; + TEST_ESP_OK(esp_lcd_new_panel_ssd1306(io_handle, &panel_config, &panel_handle)); + TEST_ESP_OK(esp_lcd_panel_reset(panel_handle)); + TEST_ESP_OK(esp_lcd_panel_init(panel_handle)); + // turn on display + TEST_ESP_OK(esp_lcd_panel_disp_on_off(panel_handle, true)); + + for (int i = 0; i < TEST_LCD_H_RES / 16; i++) { + for (int j = 0; j < TEST_LCD_V_RES / 8; j++) { + TEST_ESP_OK(esp_lcd_panel_draw_bitmap(panel_handle, i * 16, j * 8, i * 16 + 16, j * 8 + 8, pattern[i & 0x01])); + } + } + + TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); + TEST_ESP_OK(esp_lcd_panel_io_del(io_handle)); + TEST_ESP_OK(i2c_driver_delete(TEST_I2C_HOST_ID)); +} diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/pytest_i2c_lcd_legacy.py b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/pytest_i2c_lcd_legacy.py new file mode 100644 index 000000000..a2e09316a --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/pytest_i2c_lcd_legacy.py @@ -0,0 +1,18 @@ +# SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: CC0-1.0 + +import pytest +from pytest_embedded import Dut + + +@pytest.mark.esp32c3 +@pytest.mark.i2c_oled +@pytest.mark.parametrize( + 'config', + [ + 'release', + ], + indirect=True, +) +def test_i2c_lcd_legacy(dut: Dut) -> None: + dut.run_all_single_board_cases() diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/sdkconfig.ci.release b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/sdkconfig.ci.release new file mode 100644 index 000000000..3cff15d49 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/sdkconfig.ci.release @@ -0,0 +1,3 @@ +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT=y diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/sdkconfig.defaults b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/sdkconfig.defaults new file mode 100644 index 000000000..ccc43c6fd --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i2c_lcd_legacy/sdkconfig.defaults @@ -0,0 +1,5 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) Project Minimal Configuration +# +# CONFIG_ESP_TASK_WDT_INIT is not set +CONFIG_FREERTOS_HZ=1000 diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/CMakeLists.txt b/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/CMakeLists.txt new file mode 100644 index 000000000..b3e6f9cf7 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/CMakeLists.txt @@ -0,0 +1,8 @@ +# This is the project CMakeLists.txt file for the test subproject +cmake_minimum_required(VERSION 3.16) + +# "Trim" the build. Include the minimal set of components, main, and anything it depends on. +set(COMPONENTS main) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(i80_lcd_panel_test) diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/README.md b/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/README.md new file mode 100644 index 000000000..c6425abb4 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/README.md @@ -0,0 +1,4 @@ +| Supported Targets | ESP32 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | + +This test app is used to test LCDs with intel 8080 interface. diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/main/CMakeLists.txt b/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/main/CMakeLists.txt new file mode 100644 index 000000000..e6bea3170 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/main/CMakeLists.txt @@ -0,0 +1,8 @@ +set(srcs "test_app_main.c" + "test_i80_lcd_panel.c") + +# In order for the cases defined by `TEST_CASE` to be linked into the final elf, +# the component can be registered as WHOLE_ARCHIVE +idf_component_register(SRCS ${srcs} + PRIV_REQUIRES esp_lcd unity driver + WHOLE_ARCHIVE) diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/main/test_app_main.c b/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/main/test_app_main.c new file mode 100644 index 000000000..c4d721ce3 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/main/test_app_main.c @@ -0,0 +1,51 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: CC0-1.0 + */ + +#include "unity.h" +#include "unity_test_runner.h" +#include "esp_heap_caps.h" + +// Some resources are lazy allocated in LCD driver, the threadhold is left for that case +#define TEST_MEMORY_LEAK_THRESHOLD (-300) + +static size_t before_free_8bit; +static size_t before_free_32bit; + +static void check_leak(size_t before_free, size_t after_free, const char *type) +{ + ssize_t delta = after_free - before_free; + printf("MALLOC_CAP_%s: Before %u bytes free, After %u bytes free (delta %d)\n", type, before_free, after_free, delta); + TEST_ASSERT_MESSAGE(delta >= TEST_MEMORY_LEAK_THRESHOLD, "memory leak"); +} + +void setUp(void) +{ + before_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); + before_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); +} + +void tearDown(void) +{ + size_t after_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); + size_t after_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); + check_leak(before_free_8bit, after_free_8bit, "8BIT"); + check_leak(before_free_32bit, after_free_32bit, "32BIT"); +} + +void app_main(void) +{ + // _ ___ ___ _ ____ ____ _____ _ + // (_)( _ ) / _ \ | | / ___| _ \ |_ _|__ ___| |_ + // | |/ _ \| | | | | | | | | | | | | |/ _ \/ __| __| + // | | (_) | |_| | | |__| |___| |_| | | | __/\__ \ |_ + // |_|\___/ \___/ |_____\____|____/ |_|\___||___/\__| + printf(" _ ___ ___ _ ____ ____ _____ _\r\n"); + printf("(_)( _ ) / _ \\ | | / ___| _ \\ |_ _|__ ___| |_r\n"); + printf("| |/ _ \\| | | | | | | | | | | | | |/ _ \\/ __| __|\r\n"); + printf("| | (_) | |_| | | |__| |___| |_| | | | __/\\__ \\ |_\r\n"); + printf("|_|\\___/ \\___/ |_____\\____|____/ |_|\\___||___/\\__|\r\n"); + unity_run_menu(); +} diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/main/test_i80_board.h b/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/main/test_i80_board.h new file mode 100644 index 000000000..0e44ac9a1 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/main/test_i80_board.h @@ -0,0 +1,85 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "sdkconfig.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define TEST_LCD_H_RES (240) +#define TEST_LCD_V_RES (280) + +#if CONFIG_IDF_TARGET_ESP32S3 +#define TEST_LCD_BK_LIGHT_GPIO (1) +#define TEST_LCD_RST_GPIO (2) +#define TEST_LCD_CS_GPIO (3) +#define TEST_LCD_DC_GPIO (4) +#define TEST_LCD_PCLK_GPIO (5) +#define TEST_LCD_DATA0_GPIO (6) +#define TEST_LCD_DATA1_GPIO (7) +#define TEST_LCD_DATA2_GPIO (8) +#define TEST_LCD_DATA3_GPIO (9) +#define TEST_LCD_DATA4_GPIO (10) +#define TEST_LCD_DATA5_GPIO (11) +#define TEST_LCD_DATA6_GPIO (12) +#define TEST_LCD_DATA7_GPIO (13) +#define TEST_LCD_DATA8_GPIO (14) +#define TEST_LCD_DATA9_GPIO (15) +#define TEST_LCD_DATA10_GPIO (16) +#define TEST_LCD_DATA11_GPIO (17) +#define TEST_LCD_DATA12_GPIO (18) +#define TEST_LCD_DATA13_GPIO (19) +#define TEST_LCD_DATA14_GPIO (20) +#define TEST_LCD_DATA15_GPIO (21) +#elif CONFIG_IDF_TARGET_ESP32S2 +#define TEST_LCD_BK_LIGHT_GPIO (0) +#define TEST_LCD_RST_GPIO (18) +#define TEST_LCD_CS_GPIO (19) +#define TEST_LCD_DC_GPIO (38) +#define TEST_LCD_PCLK_GPIO (33) +#define TEST_LCD_DATA0_GPIO (1) +#define TEST_LCD_DATA1_GPIO (10) +#define TEST_LCD_DATA2_GPIO (2) +#define TEST_LCD_DATA3_GPIO (11) +#define TEST_LCD_DATA4_GPIO (3) +#define TEST_LCD_DATA5_GPIO (12) +#define TEST_LCD_DATA6_GPIO (4) +#define TEST_LCD_DATA7_GPIO (13) +#define TEST_LCD_DATA8_GPIO (5) +#define TEST_LCD_DATA9_GPIO (14) +#define TEST_LCD_DATA10_GPIO (6) +#define TEST_LCD_DATA11_GPIO (15) +#define TEST_LCD_DATA12_GPIO (7) +#define TEST_LCD_DATA13_GPIO (16) +#define TEST_LCD_DATA14_GPIO (8) +#define TEST_LCD_DATA15_GPIO (17) +#elif CONFIG_IDF_TARGET_ESP32 +#define TEST_LCD_BK_LIGHT_GPIO (2) +#define TEST_LCD_RST_GPIO (-1) +#define TEST_LCD_CS_GPIO (4) +#define TEST_LCD_DC_GPIO (5) +#define TEST_LCD_PCLK_GPIO (18) +#define TEST_LCD_DATA0_GPIO (19) +#define TEST_LCD_DATA1_GPIO (21) +#define TEST_LCD_DATA2_GPIO (0) +#define TEST_LCD_DATA3_GPIO (22) +#define TEST_LCD_DATA4_GPIO (23) +#define TEST_LCD_DATA5_GPIO (33) +#define TEST_LCD_DATA6_GPIO (32) +#define TEST_LCD_DATA7_GPIO (27) +#define TEST_LCD_DATA8_GPIO (12) +#define TEST_LCD_DATA9_GPIO (13) +#define TEST_LCD_DATA10_GPIO (14) +#define TEST_LCD_DATA11_GPIO (15) +#define TEST_LCD_DATA12_GPIO (26) +#define TEST_LCD_DATA13_GPIO (25) +#define TEST_LCD_DATA14_GPIO (16) +#define TEST_LCD_DATA15_GPIO (17) +#endif + +#ifdef __cplusplus +} +#endif diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/main/test_i80_lcd_panel.c b/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/main/test_i80_lcd_panel.c new file mode 100644 index 000000000..e2f6e2cf1 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/main/test_i80_lcd_panel.c @@ -0,0 +1,564 @@ +/* + * SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: CC0-1.0 + */ + +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "unity.h" +#include "esp_random.h" +#include "esp_lcd_panel_io.h" +#include "esp_lcd_panel_vendor.h" +#include "esp_lcd_panel_ops.h" +#include "esp_lcd_panel_commands.h" +#include "soc/soc_caps.h" +#include "driver/gpio.h" +#include "test_i80_board.h" + +#if SOC_I2S_LCD_I80_VARIANT +#include "driver/i2s_std.h" + +TEST_CASE("i80_and_i2s_driver_co-existence", "[lcd][i2s]") +{ + esp_lcd_i80_bus_handle_t i80_bus = NULL; + esp_lcd_i80_bus_config_t bus_config = { + .dc_gpio_num = TEST_LCD_DC_GPIO, + .wr_gpio_num = TEST_LCD_PCLK_GPIO, + .clk_src = LCD_CLK_SRC_DEFAULT, + .data_gpio_nums = { + TEST_LCD_DATA0_GPIO, + TEST_LCD_DATA1_GPIO, + TEST_LCD_DATA2_GPIO, + TEST_LCD_DATA3_GPIO, + TEST_LCD_DATA4_GPIO, + TEST_LCD_DATA5_GPIO, + TEST_LCD_DATA6_GPIO, + TEST_LCD_DATA7_GPIO, + }, + .bus_width = 8, + .max_transfer_bytes = 20, + }; + TEST_ESP_OK(esp_lcd_new_i80_bus(&bus_config, &i80_bus)); + + i2s_chan_handle_t tx_handle = NULL; + i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_0, I2S_ROLE_MASTER); + // I2S driver won't be installed as the same I2S port has been used by LCD + TEST_ASSERT_EQUAL(ESP_ERR_NOT_FOUND, i2s_new_channel(&chan_cfg, &tx_handle, NULL)); + TEST_ESP_OK(esp_lcd_del_i80_bus(i80_bus)); +} +#endif // SOC_I2S_LCD_I80_VARIANT + +#if SOC_LCDCAM_SUPPORTED +TEST_CASE("lcd_i80_device_swap_color_bytes", "[lcd]") +{ + esp_lcd_i80_bus_handle_t i80_bus = NULL; + esp_lcd_i80_bus_config_t bus_config = { + .dc_gpio_num = TEST_LCD_DC_GPIO, + .wr_gpio_num = TEST_LCD_PCLK_GPIO, + .clk_src = LCD_CLK_SRC_DEFAULT, + .data_gpio_nums = { + TEST_LCD_DATA0_GPIO, + TEST_LCD_DATA1_GPIO, + TEST_LCD_DATA2_GPIO, + TEST_LCD_DATA3_GPIO, + TEST_LCD_DATA4_GPIO, + TEST_LCD_DATA5_GPIO, + TEST_LCD_DATA6_GPIO, + TEST_LCD_DATA7_GPIO, + }, + .bus_width = 8, + .max_transfer_bytes = 20, + }; + TEST_ESP_OK(esp_lcd_new_i80_bus(&bus_config, &i80_bus)); + + esp_lcd_panel_io_handle_t io_handles[4] = {}; + esp_lcd_panel_io_i80_config_t io_config = { + .cs_gpio_num = TEST_LCD_CS_GPIO, + .pclk_hz = 5000000, + .trans_queue_depth = 10, + .dc_levels = { + .dc_idle_level = 0, + .dc_cmd_level = 0, + .dc_dummy_level = 0, + .dc_data_level = 1, + }, + .lcd_cmd_bits = 8, + .lcd_param_bits = 8, + }; + + io_config.flags.reverse_color_bits = 0; + io_config.flags.swap_color_bytes = 0; + TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handles[0])); + io_config.flags.reverse_color_bits = 0; + io_config.flags.swap_color_bytes = 1; + TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handles[1])); + io_config.flags.reverse_color_bits = 1; + io_config.flags.swap_color_bytes = 0; + TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handles[2])); + io_config.flags.reverse_color_bits = 1; + io_config.flags.swap_color_bytes = 1; + TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handles[3])); + + for (int i = 0; i < 4; i++) { + esp_lcd_panel_io_tx_param(io_handles[i], 0xA5, (uint8_t[]) { + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 + }, 6); + esp_lcd_panel_io_tx_color(io_handles[i], 0x5A, (uint8_t[]) { + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 + }, 6); + TEST_ESP_OK(esp_lcd_panel_io_del(io_handles[i])); + } + + TEST_ESP_OK(esp_lcd_del_i80_bus(i80_bus)); +} + +TEST_CASE("lcd_i80_device_clock_mode", "[lcd]") +{ + esp_lcd_i80_bus_handle_t i80_bus = NULL; + esp_lcd_i80_bus_config_t bus_config = { + .dc_gpio_num = TEST_LCD_DC_GPIO, + .wr_gpio_num = TEST_LCD_PCLK_GPIO, + .clk_src = LCD_CLK_SRC_DEFAULT, + .data_gpio_nums = { + TEST_LCD_DATA0_GPIO, + TEST_LCD_DATA1_GPIO, + TEST_LCD_DATA2_GPIO, + TEST_LCD_DATA3_GPIO, + TEST_LCD_DATA4_GPIO, + TEST_LCD_DATA5_GPIO, + TEST_LCD_DATA6_GPIO, + TEST_LCD_DATA7_GPIO, + }, + .bus_width = 8, + .max_transfer_bytes = 20, + }; + TEST_ESP_OK(esp_lcd_new_i80_bus(&bus_config, &i80_bus)); + + esp_lcd_panel_io_handle_t io_handles[4] = {}; + esp_lcd_panel_io_i80_config_t io_config = { + .cs_gpio_num = TEST_LCD_CS_GPIO, + .pclk_hz = 5000000, + .trans_queue_depth = 10, + .dc_levels = { + .dc_idle_level = 0, + .dc_cmd_level = 0, + .dc_dummy_level = 0, + .dc_data_level = 1, + }, + .lcd_cmd_bits = 8, + .lcd_param_bits = 8, + }; + + io_config.flags.pclk_idle_low = 0; + io_config.flags.pclk_active_neg = 0; + TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handles[0])); + io_config.flags.pclk_idle_low = 0; + io_config.flags.pclk_active_neg = 1; + TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handles[1])); + io_config.flags.pclk_idle_low = 1; + io_config.flags.pclk_active_neg = 0; + TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handles[2])); + io_config.flags.pclk_idle_low = 1; + io_config.flags.pclk_active_neg = 1; + TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handles[3])); + + for (int i = 0; i < 4; i++) { + esp_lcd_panel_io_tx_param(io_handles[i], 0xA5, (uint8_t[]) { + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 + }, 6); + TEST_ESP_OK(esp_lcd_panel_io_del(io_handles[i])); + } + TEST_ESP_OK(esp_lcd_del_i80_bus(i80_bus)); +} +#endif // SOC_LCDCAM_SUPPORTED + +TEST_CASE("lcd_i80_bus_and_device_allocation", "[lcd]") +{ + esp_lcd_i80_bus_handle_t i80_buses[SOC_LCD_I80_BUSES] = {}; + esp_lcd_i80_bus_config_t bus_config = { + .dc_gpio_num = TEST_LCD_DC_GPIO, + .wr_gpio_num = TEST_LCD_PCLK_GPIO, + .clk_src = LCD_CLK_SRC_DEFAULT, + .data_gpio_nums = { + TEST_LCD_DATA0_GPIO, + TEST_LCD_DATA1_GPIO, + TEST_LCD_DATA2_GPIO, + TEST_LCD_DATA3_GPIO, + TEST_LCD_DATA4_GPIO, + TEST_LCD_DATA5_GPIO, + TEST_LCD_DATA6_GPIO, + TEST_LCD_DATA7_GPIO, + }, + .bus_width = 8, + .max_transfer_bytes = TEST_LCD_H_RES * 40 * sizeof(uint16_t) + }; + for (int i = 0; i < SOC_LCD_I80_BUSES; i++) { + TEST_ESP_OK(esp_lcd_new_i80_bus(&bus_config, &i80_buses[i])); + } + TEST_ASSERT_EQUAL(ESP_ERR_NOT_FOUND, esp_lcd_new_i80_bus(&bus_config, &i80_buses[0])); + esp_lcd_panel_io_handle_t io_handles[10] = {}; + esp_lcd_panel_io_i80_config_t io_config = { + .cs_gpio_num = TEST_LCD_CS_GPIO, + .pclk_hz = 5000000, + .trans_queue_depth = 4, + .lcd_cmd_bits = 8, + .lcd_param_bits = 8, + }; + for (int i = 0; i < 10; i++) { + TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_buses[0], &io_config, &io_handles[i])); + } + // can't delete bus handle before we delete all devices + TEST_ASSERT_EQUAL(ESP_ERR_INVALID_STATE, esp_lcd_del_i80_bus(i80_buses[0])); + for (int i = 0; i < 10; i++) { + TEST_ESP_OK(esp_lcd_panel_io_del(io_handles[i])); + } + for (int i = 0; i < SOC_LCD_I80_BUSES; i++) { + TEST_ESP_OK(esp_lcd_del_i80_bus(i80_buses[i])); + } +} + +TEST_CASE("lcd_i80_bus_exclusively_owned_by_one_device", "[lcd]") +{ + esp_lcd_i80_bus_handle_t i80_bus_handle = NULL; + esp_lcd_i80_bus_config_t bus_config = { + .dc_gpio_num = TEST_LCD_DC_GPIO, + .wr_gpio_num = TEST_LCD_PCLK_GPIO, + .clk_src = LCD_CLK_SRC_DEFAULT, + .data_gpio_nums = { + TEST_LCD_DATA0_GPIO, + TEST_LCD_DATA1_GPIO, + TEST_LCD_DATA2_GPIO, + TEST_LCD_DATA3_GPIO, + TEST_LCD_DATA4_GPIO, + TEST_LCD_DATA5_GPIO, + TEST_LCD_DATA6_GPIO, + TEST_LCD_DATA7_GPIO, + }, + .bus_width = 8, + .max_transfer_bytes = TEST_LCD_H_RES * 40 * sizeof(uint16_t) + }; + TEST_ESP_OK(esp_lcd_new_i80_bus(&bus_config, &i80_bus_handle)); + esp_lcd_panel_io_handle_t io_handle = NULL; + esp_lcd_panel_io_i80_config_t io_config = { + .cs_gpio_num = -1, // own the bus exclusively + .pclk_hz = 5000000, + .trans_queue_depth = 4, + .lcd_cmd_bits = 8, + .lcd_param_bits = 8, + }; + TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus_handle, &io_config, &io_handle)); + io_config.cs_gpio_num = 0; + TEST_ASSERT_EQUAL(ESP_ERR_INVALID_STATE, esp_lcd_new_panel_io_i80(i80_bus_handle, &io_config, &io_handle)); + TEST_ESP_OK(esp_lcd_panel_io_del(io_handle)); + TEST_ESP_OK(esp_lcd_del_i80_bus(i80_bus_handle)); +} + +TEST_CASE("lcd_panel_i80_io_test", "[lcd]") +{ + esp_lcd_i80_bus_handle_t i80_bus = NULL; + esp_lcd_i80_bus_config_t bus_config = { + .dc_gpio_num = TEST_LCD_DC_GPIO, + .wr_gpio_num = TEST_LCD_PCLK_GPIO, + .clk_src = LCD_CLK_SRC_DEFAULT, + .data_gpio_nums = { + TEST_LCD_DATA0_GPIO, + TEST_LCD_DATA1_GPIO, + TEST_LCD_DATA2_GPIO, + TEST_LCD_DATA3_GPIO, + TEST_LCD_DATA4_GPIO, + TEST_LCD_DATA5_GPIO, + TEST_LCD_DATA6_GPIO, + TEST_LCD_DATA7_GPIO, + TEST_LCD_DATA8_GPIO, + TEST_LCD_DATA9_GPIO, + TEST_LCD_DATA10_GPIO, + TEST_LCD_DATA11_GPIO, + TEST_LCD_DATA12_GPIO, + TEST_LCD_DATA13_GPIO, + TEST_LCD_DATA14_GPIO, + TEST_LCD_DATA15_GPIO, + }, + .bus_width = 16, + .max_transfer_bytes = 100, + }; + esp_lcd_panel_io_handle_t io_handle = NULL; + esp_lcd_panel_io_i80_config_t io_config = { + .cs_gpio_num = TEST_LCD_CS_GPIO, + .pclk_hz = 8000000, // 8MHz + .trans_queue_depth = 10, + .dc_levels = { + .dc_idle_level = 0, + .dc_cmd_level = 0, + .dc_dummy_level = 0, + .dc_data_level = 1, + }, + }; + esp_lcd_panel_handle_t panel_handle = NULL; + esp_lcd_panel_dev_config_t panel_config = { + .reset_gpio_num = TEST_LCD_RST_GPIO, + .rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB, + .bits_per_pixel = 16, + }; + + printf("testing bus-width=16bit, cmd/param bit-width=8bit\r\n"); + bus_config.bus_width = 16; + TEST_ESP_OK(esp_lcd_new_i80_bus(&bus_config, &i80_bus)); + io_config.lcd_cmd_bits = 8; + io_config.lcd_param_bits = 8; + TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handle)); + TEST_ESP_OK(esp_lcd_new_panel_st7789(io_handle, &panel_config, &panel_handle)); + + esp_lcd_panel_io_tx_param(io_handle, 0x1A, NULL, 0); + esp_lcd_panel_io_tx_param(io_handle, 0x1B, (uint8_t[]) { + 0x11, 0x22, 0x33 + }, 3); + esp_lcd_panel_io_tx_param(io_handle, 0x1C, NULL, 0); + TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); + TEST_ESP_OK(esp_lcd_panel_io_del(io_handle)); + TEST_ESP_OK(esp_lcd_del_i80_bus(i80_bus)); + + printf("testing bus-width=16bit, cmd/param bit-width=16bit\r\n"); + bus_config.bus_width = 16; + TEST_ESP_OK(esp_lcd_new_i80_bus(&bus_config, &i80_bus)); + io_config.lcd_cmd_bits = 16; + io_config.lcd_param_bits = 16; + TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handle)); + TEST_ESP_OK(esp_lcd_new_panel_nt35510(io_handle, &panel_config, &panel_handle)); + esp_lcd_panel_io_tx_param(io_handle, 0x1A01, NULL, 0); + esp_lcd_panel_io_tx_param(io_handle, 0x1B02, (uint16_t[]) { + 0x11, 0x22, 0x33 + }, 6); + esp_lcd_panel_io_tx_param(io_handle, 0x1C03, NULL, 0); + TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); + TEST_ESP_OK(esp_lcd_panel_io_del(io_handle)); + TEST_ESP_OK(esp_lcd_del_i80_bus(i80_bus)); + + printf("testing bus-width=8bit, cmd/param bit-width=8bit\r\n"); + bus_config.bus_width = 8; + TEST_ESP_OK(esp_lcd_new_i80_bus(&bus_config, &i80_bus)); + io_config.lcd_cmd_bits = 8; + io_config.lcd_param_bits = 8; + TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handle)); + TEST_ESP_OK(esp_lcd_new_panel_st7789(io_handle, &panel_config, &panel_handle)); + esp_lcd_panel_io_tx_param(io_handle, 0x1A, NULL, 0); + esp_lcd_panel_io_tx_param(io_handle, 0x1B, (uint8_t[]) { + 0x11, 0x22, 0x33 + }, 3); + esp_lcd_panel_io_tx_param(io_handle, 0x1C, NULL, 0); + TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); + TEST_ESP_OK(esp_lcd_panel_io_del(io_handle)); + TEST_ESP_OK(esp_lcd_del_i80_bus(i80_bus)); + + printf("testing bus-width=8bit, cmd/param bit-width=16bit\r\n"); + bus_config.bus_width = 8; + TEST_ESP_OK(esp_lcd_new_i80_bus(&bus_config, &i80_bus)); + io_config.lcd_cmd_bits = 16; + io_config.lcd_param_bits = 16; + TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handle)); + TEST_ESP_OK(esp_lcd_new_panel_nt35510(io_handle, &panel_config, &panel_handle)); + esp_lcd_panel_io_tx_param(io_handle, 0x1A01, NULL, 0); + esp_lcd_panel_io_tx_param(io_handle, 0x1B02, (uint16_t[]) { + 0x11, 0x22, 0x33 + }, 6); + esp_lcd_panel_io_tx_param(io_handle, 0x1C03, NULL, 0); + TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); + TEST_ESP_OK(esp_lcd_panel_io_del(io_handle)); + TEST_ESP_OK(esp_lcd_del_i80_bus(i80_bus)); +} + +TEST_CASE("lcd_panel_with_i80_interface_(st7789, 8bits)", "[lcd]") +{ +#define TEST_IMG_SIZE (100 * 100 * sizeof(uint16_t)) + uint8_t *img = heap_caps_malloc(TEST_IMG_SIZE, MALLOC_CAP_DMA); + TEST_ASSERT_NOT_NULL(img); + + gpio_config_t bk_gpio_config = { + .mode = GPIO_MODE_OUTPUT, + .pin_bit_mask = 1ULL << TEST_LCD_BK_LIGHT_GPIO + }; + TEST_ESP_OK(gpio_config(&bk_gpio_config)); + + esp_lcd_i80_bus_handle_t i80_bus = NULL; + esp_lcd_i80_bus_config_t bus_config = { + .dc_gpio_num = TEST_LCD_DC_GPIO, + .wr_gpio_num = TEST_LCD_PCLK_GPIO, + .clk_src = LCD_CLK_SRC_DEFAULT, + .data_gpio_nums = { + TEST_LCD_DATA0_GPIO, + TEST_LCD_DATA1_GPIO, + TEST_LCD_DATA2_GPIO, + TEST_LCD_DATA3_GPIO, + TEST_LCD_DATA4_GPIO, + TEST_LCD_DATA5_GPIO, + TEST_LCD_DATA6_GPIO, + TEST_LCD_DATA7_GPIO, + }, + .bus_width = 8, + .max_transfer_bytes = TEST_IMG_SIZE + 10, + }; + TEST_ESP_OK(esp_lcd_new_i80_bus(&bus_config, &i80_bus)); + esp_lcd_panel_io_handle_t io_handle = NULL; + esp_lcd_panel_io_i80_config_t io_config = { + .cs_gpio_num = TEST_LCD_CS_GPIO, + .pclk_hz = 8000000, // 8MHz + .trans_queue_depth = 10, + .dc_levels = { + .dc_idle_level = 0, + .dc_cmd_level = 0, + .dc_dummy_level = 0, + .dc_data_level = 1, + }, + .lcd_cmd_bits = 8, + .lcd_param_bits = 8, + }; + TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handle)); + + esp_lcd_panel_handle_t panel_handle = NULL; + esp_lcd_panel_dev_config_t panel_config = { + .reset_gpio_num = TEST_LCD_RST_GPIO, + .rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB, + .bits_per_pixel = 16, + }; + TEST_ESP_OK(esp_lcd_new_panel_st7789(io_handle, &panel_config, &panel_handle)); + + // turn off backlight + gpio_set_level(TEST_LCD_BK_LIGHT_GPIO, 0); + esp_lcd_panel_reset(panel_handle); + esp_lcd_panel_init(panel_handle); + esp_lcd_panel_invert_color(panel_handle, true); + // the gap is LCD panel specific, even panels with the same driver IC, can have different gap value + esp_lcd_panel_set_gap(panel_handle, 0, 20); + // turn on display + esp_lcd_panel_disp_on_off(panel_handle, true); + // turn on backlight + gpio_set_level(TEST_LCD_BK_LIGHT_GPIO, 1); + + for (int i = 0; i < 200; i++) { + uint8_t color_byte = esp_random() & 0xFF; + int x_start = esp_random() % (TEST_LCD_H_RES - 100); + int y_start = esp_random() % (TEST_LCD_V_RES - 100); + memset(img, color_byte, TEST_IMG_SIZE); + esp_lcd_panel_draw_bitmap(panel_handle, x_start, y_start, x_start + 100, y_start + 100, img); + } + // turn off screen + esp_lcd_panel_disp_on_off(panel_handle, false); + + TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); + TEST_ESP_OK(esp_lcd_panel_io_del(io_handle)); + TEST_ESP_OK(esp_lcd_del_i80_bus(i80_bus)); + TEST_ESP_OK(gpio_reset_pin(TEST_LCD_BK_LIGHT_GPIO)); + free(img); +#undef TEST_IMG_SIZE +} + +// TODO: support the test on I2S LCD (IDF-7202) +#if !SOC_I2S_LCD_I80_VARIANT +TEST_CASE("i80_lcd_send_colors_to_fixed_region", "[lcd]") +{ + int x_start = 100; + int y_start = 100; + int x_end = 200; + int y_end = 200; + size_t color_size = (x_end - x_start) * (y_end - y_start) * 2; + void *color_data = malloc(color_size); + TEST_ASSERT_NOT_NULL(color_data); + uint8_t color_byte = esp_random() & 0xFF; + memset(color_data, color_byte, color_size); + + printf("creating i80 bus and IO driver\r\n"); + esp_lcd_i80_bus_handle_t i80_bus = NULL; + esp_lcd_i80_bus_config_t bus_config = { + .dc_gpio_num = TEST_LCD_DC_GPIO, + .wr_gpio_num = TEST_LCD_PCLK_GPIO, + .clk_src = LCD_CLK_SRC_DEFAULT, + .data_gpio_nums = { + TEST_LCD_DATA0_GPIO, + TEST_LCD_DATA1_GPIO, + TEST_LCD_DATA2_GPIO, + TEST_LCD_DATA3_GPIO, + TEST_LCD_DATA4_GPIO, + TEST_LCD_DATA5_GPIO, + TEST_LCD_DATA6_GPIO, + TEST_LCD_DATA7_GPIO, + }, + .bus_width = 8, + .max_transfer_bytes = color_size * 2, + }; + esp_lcd_panel_io_handle_t io_handle = NULL; + esp_lcd_panel_io_i80_config_t io_config = { + .cs_gpio_num = TEST_LCD_CS_GPIO, + .pclk_hz = 5000000, // 5MHz + .trans_queue_depth = 10, + .dc_levels = { + .dc_idle_level = 0, + .dc_cmd_level = 0, + .dc_dummy_level = 0, + .dc_data_level = 1, + }, + .lcd_cmd_bits = 8, + .lcd_param_bits = 8, + }; + TEST_ESP_OK(esp_lcd_new_i80_bus(&bus_config, &i80_bus)); + TEST_ESP_OK(esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handle)); + + printf("creating LCD panel\r\n"); + esp_lcd_panel_handle_t panel_handle = NULL; + esp_lcd_panel_dev_config_t panel_config = { + .reset_gpio_num = TEST_LCD_RST_GPIO, + .rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB, + .bits_per_pixel = 16, + }; + TEST_ESP_OK(esp_lcd_new_panel_st7789(io_handle, &panel_config, &panel_handle)); + + // we don't use the panel handle in this test, creating the panel just for a quick initialization + printf("initialize LCD panel\r\n"); + // turn off backlight + gpio_set_level(TEST_LCD_BK_LIGHT_GPIO, 0); + esp_lcd_panel_reset(panel_handle); + esp_lcd_panel_init(panel_handle); + esp_lcd_panel_invert_color(panel_handle, true); + // the gap is LCD panel specific, even panels with the same driver IC, can have different gap value + esp_lcd_panel_set_gap(panel_handle, 0, 20); + // turn on display + esp_lcd_panel_disp_on_off(panel_handle, true); + // turn on backlight + gpio_set_level(TEST_LCD_BK_LIGHT_GPIO, 1); + + printf("set the flush window for only once\r\n"); + esp_lcd_panel_io_tx_param(io_handle, LCD_CMD_CASET, (uint8_t[]) { + (x_start >> 8) & 0xFF, + x_start & 0xFF, + ((x_end - 1) >> 8) & 0xFF, + (x_end - 1) & 0xFF, + }, 4); + esp_lcd_panel_io_tx_param(io_handle, LCD_CMD_RASET, (uint8_t[]) { + (y_start >> 8) & 0xFF, + y_start & 0xFF, + ((y_end - 1) >> 8) & 0xFF, + (y_end - 1) & 0xFF, + }, 4); + esp_lcd_panel_io_tx_param(io_handle, LCD_CMD_RAMWR, NULL, 0); + + printf("send colors to the fixed region in multiple steps\r\n"); + const int steps = 10; + int color_size_per_step = color_size / steps; + for (int i = 0; i < steps; i++) { + TEST_ESP_OK(esp_lcd_panel_io_tx_color(io_handle, -1, color_data + i * color_size_per_step, color_size_per_step)); + } + vTaskDelay(pdMS_TO_TICKS(1000)); + // change to another color + color_byte = esp_random() & 0xFF; + memset(color_data, color_byte, color_size); + for (int i = 0; i < steps; i++) { + TEST_ESP_OK(esp_lcd_panel_io_tx_color(io_handle, -1, color_data + i * color_size_per_step, color_size_per_step)); + } + + TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); + TEST_ESP_OK(esp_lcd_panel_io_del(io_handle)); + TEST_ESP_OK(esp_lcd_del_i80_bus(i80_bus)); + free(color_data); +} +#endif diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/pytest_i80_lcd.py b/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/pytest_i80_lcd.py new file mode 100644 index 000000000..718a445c4 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/pytest_i80_lcd.py @@ -0,0 +1,20 @@ +# SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: CC0-1.0 + +import pytest +from pytest_embedded import Dut + + +@pytest.mark.esp32 +@pytest.mark.esp32s2 +@pytest.mark.esp32s3 +@pytest.mark.generic +@pytest.mark.parametrize( + 'config', + [ + 'release', + ], + indirect=True, +) +def test_i80_lcd(dut: Dut) -> None: + dut.run_all_single_board_cases() diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/sdkconfig.ci.release b/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/sdkconfig.ci.release new file mode 100644 index 000000000..91d93f163 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/sdkconfig.ci.release @@ -0,0 +1,5 @@ +CONFIG_PM_ENABLE=y +CONFIG_FREERTOS_USE_TICKLESS_IDLE=y +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT=y diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/sdkconfig.defaults b/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/sdkconfig.defaults new file mode 100644 index 000000000..ccc43c6fd --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/i80_lcd/sdkconfig.defaults @@ -0,0 +1,5 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) Project Minimal Configuration +# +# CONFIG_ESP_TASK_WDT_INIT is not set +CONFIG_FREERTOS_HZ=1000 diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/CMakeLists.txt b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/CMakeLists.txt new file mode 100644 index 000000000..272f66f14 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/CMakeLists.txt @@ -0,0 +1,24 @@ +# This is the project CMakeLists.txt file for the test subproject +cmake_minimum_required(VERSION 3.16) + +# "Trim" the build. Include the minimal set of components, main, and anything it depends on. +set(COMPONENTS main) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(rgb_lcd_panel_test) + +target_add_binary_data(rgb_lcd_panel_test.elf "resources/pictures/hello.yuv" BINARY) +target_add_binary_data(rgb_lcd_panel_test.elf "resources/pictures/world.yuv" BINARY) + +if(CONFIG_COMPILER_DUMP_RTL_FILES) + add_custom_target(check_test_app_sections ALL + COMMAND ${PYTHON} $ENV{IDF_PATH}/tools/ci/check_callgraph.py + --rtl-dirs ${CMAKE_BINARY_DIR}/esp-idf/esp_lcd/,${CMAKE_BINARY_DIR}/esp-idf/hal/ + --elf-file ${CMAKE_BINARY_DIR}/rgb_lcd_panel_test.elf + find-refs + --from-sections=.iram0.text + --to-sections=.flash.text,.flash.rodata + --exit-code + DEPENDS ${elf} + ) +endif() diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/README.md b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/README.md new file mode 100644 index 000000000..47ecb029f --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/README.md @@ -0,0 +1,4 @@ +| Supported Targets | ESP32-S3 | +| ----------------- | -------- | + +This test app is used to test RGB565 interfaced LCDs. diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/main/CMakeLists.txt b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/main/CMakeLists.txt new file mode 100644 index 000000000..084940a1c --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/main/CMakeLists.txt @@ -0,0 +1,12 @@ +set(srcs "test_app_main.c" + "test_rgb_panel.c") + +if(CONFIG_SOC_LCD_SUPPORT_RGB_YUV_CONV) + list(APPEND srcs "test_yuv_rgb_conv.c") +endif() + +# In order for the cases defined by `TEST_CASE` to be linked into the final elf, +# the component can be registered as WHOLE_ARCHIVE +idf_component_register(SRCS ${srcs} + PRIV_REQUIRES esp_lcd unity driver esp_timer spi_flash + WHOLE_ARCHIVE) diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/main/test_app_main.c b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/main/test_app_main.c new file mode 100644 index 000000000..7b7ff5c86 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/main/test_app_main.c @@ -0,0 +1,51 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: CC0-1.0 + */ + +#include "unity.h" +#include "unity_test_runner.h" +#include "esp_heap_caps.h" + +// Some resources are lazy allocated in LCD driver, the threadhold is left for that case +#define TEST_MEMORY_LEAK_THRESHOLD (-500) + +static size_t before_free_8bit; +static size_t before_free_32bit; + +static void check_leak(size_t before_free, size_t after_free, const char *type) +{ + ssize_t delta = after_free - before_free; + printf("MALLOC_CAP_%s: Before %u bytes free, After %u bytes free (delta %d)\n", type, before_free, after_free, delta); + TEST_ASSERT_MESSAGE(delta >= TEST_MEMORY_LEAK_THRESHOLD, "memory leak"); +} + +void setUp(void) +{ + before_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); + before_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); +} + +void tearDown(void) +{ + size_t after_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); + size_t after_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); + check_leak(before_free_8bit, after_free_8bit, "8BIT"); + check_leak(before_free_32bit, after_free_32bit, "32BIT"); +} + +void app_main(void) +{ + // ____ ____ ____ _ ____ ____ _____ _ + // | _ \ / ___| __ ) | | / ___| _ \ |_ _|__ ___| |_ + // | |_) | | _| _ \ | | | | | | | | | |/ _ \/ __| __| + // | _ <| |_| | |_) | | |__| |___| |_| | | | __/\__ \ |_ + // |_| \_\\____|____/ |_____\____|____/ |_|\___||___/\__| + printf(" ____ ____ ____ _ ____ ____ _____ _\r\n"); + printf("| _ \\ / ___| __ ) | | / ___| _ \\ |_ _|__ ___| |_\r\n"); + printf("| |_) | | _| _ \\ | | | | | | | | | |/ _ \\/ __| __|\r\n"); + printf("| _ <| |_| | |_) | | |__| |___| |_| | | | __/\\__ \\ |_\r\n"); + printf("|_| \\_\\\\____|____/ |_____\\____|____/ |_|\\___||___/\\__|\r\n"); + unity_run_menu(); +} diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/main/test_rgb_board.h b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/main/test_rgb_board.h new file mode 100644 index 000000000..180c519e5 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/main/test_rgb_board.h @@ -0,0 +1,41 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#define TEST_LCD_H_RES 800 +#define TEST_LCD_V_RES 480 + +#define TEST_LCD_VSYNC_GPIO 3 +#define TEST_LCD_HSYNC_GPIO 46 +#define TEST_LCD_DE_GPIO 0 +#define TEST_LCD_PCLK_GPIO 9 +#define TEST_LCD_DATA0_GPIO 14 // B0 +#define TEST_LCD_DATA1_GPIO 13 // B1 +#define TEST_LCD_DATA2_GPIO 12 // B2 +#define TEST_LCD_DATA3_GPIO 11 // B3 +#define TEST_LCD_DATA4_GPIO 10 // B4 +#define TEST_LCD_DATA5_GPIO 39 // G0 +#define TEST_LCD_DATA6_GPIO 38 // G1 +#define TEST_LCD_DATA7_GPIO 45 // G2 +#define TEST_LCD_DATA8_GPIO 48 // G3 +#define TEST_LCD_DATA9_GPIO 47 // G4 +#define TEST_LCD_DATA10_GPIO 21 // G5 +#define TEST_LCD_DATA11_GPIO 1 // R0 +#define TEST_LCD_DATA12_GPIO 2 // R1 +#define TEST_LCD_DATA13_GPIO 42 // R2 +#define TEST_LCD_DATA14_GPIO 41 // R3 +#define TEST_LCD_DATA15_GPIO 40 // R4 +#define TEST_LCD_DISP_EN_GPIO -1 + +#define TEST_LCD_PIXEL_CLOCK_HZ (10 * 1000 * 1000) + +#ifdef __cplusplus +} +#endif diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/main/test_rgb_panel.c b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/main/test_rgb_panel.c new file mode 100644 index 000000000..4e1eb3edd --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/main/test_rgb_panel.c @@ -0,0 +1,313 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "unity.h" +#include "esp_lcd_panel_rgb.h" +#include "esp_lcd_panel_ops.h" +#include "esp_random.h" +#include "esp_timer.h" +#include "esp_attr.h" +#include "test_rgb_board.h" +#include "esp_private/spi_flash_os.h" + +#if CONFIG_LCD_RGB_ISR_IRAM_SAFE +#define TEST_LCD_CALLBACK_ATTR IRAM_ATTR +#else +#define TEST_LCD_CALLBACK_ATTR +#endif // CONFIG_LCD_RGB_ISR_IRAM_SAFE + +#define TEST_IMG_SIZE (100 * 100 * sizeof(uint16_t)) + +static esp_lcd_panel_handle_t test_rgb_panel_initialization(size_t data_width, size_t bpp, size_t bb_pixels, bool refresh_on_demand, + esp_lcd_rgb_panel_vsync_cb_t vsync_cb, void *user_data) +{ + esp_lcd_panel_handle_t panel_handle = NULL; + esp_lcd_rgb_panel_config_t panel_config = { + .data_width = data_width, + .psram_trans_align = 64, + .bounce_buffer_size_px = bb_pixels, + .bits_per_pixel = bpp, + .clk_src = LCD_CLK_SRC_DEFAULT, + .disp_gpio_num = TEST_LCD_DISP_EN_GPIO, + .pclk_gpio_num = TEST_LCD_PCLK_GPIO, + .vsync_gpio_num = TEST_LCD_VSYNC_GPIO, + .hsync_gpio_num = TEST_LCD_HSYNC_GPIO, + .de_gpio_num = TEST_LCD_DE_GPIO, + .data_gpio_nums = { + TEST_LCD_DATA0_GPIO, + TEST_LCD_DATA1_GPIO, + TEST_LCD_DATA2_GPIO, + TEST_LCD_DATA3_GPIO, + TEST_LCD_DATA4_GPIO, + TEST_LCD_DATA5_GPIO, + TEST_LCD_DATA6_GPIO, + TEST_LCD_DATA7_GPIO, + TEST_LCD_DATA8_GPIO, + TEST_LCD_DATA9_GPIO, + TEST_LCD_DATA10_GPIO, + TEST_LCD_DATA11_GPIO, + TEST_LCD_DATA12_GPIO, + TEST_LCD_DATA13_GPIO, + TEST_LCD_DATA14_GPIO, + TEST_LCD_DATA15_GPIO, + }, + .timings = { + .pclk_hz = TEST_LCD_PIXEL_CLOCK_HZ, + .h_res = TEST_LCD_H_RES, + .v_res = TEST_LCD_V_RES, + .hsync_back_porch = 68, + .hsync_front_porch = 20, + .hsync_pulse_width = 5, + .vsync_back_porch = 18, + .vsync_front_porch = 4, + .vsync_pulse_width = 1, + }, + .flags.fb_in_psram = 1, // allocate frame buffer in PSRAM + .flags.refresh_on_demand = refresh_on_demand, + }; + + TEST_ESP_OK(esp_lcd_new_rgb_panel(&panel_config, &panel_handle)); + + esp_lcd_rgb_panel_event_callbacks_t cbs = { + .on_vsync = vsync_cb, + }; + TEST_ESP_OK(esp_lcd_rgb_panel_register_event_callbacks(panel_handle, &cbs, user_data)); + TEST_ESP_OK(esp_lcd_panel_reset(panel_handle)); + TEST_ESP_OK(esp_lcd_panel_init(panel_handle)); + + return panel_handle; +} + +TEST_CASE("lcd_rgb_panel_stream_mode", "[lcd]") +{ + uint8_t *img = malloc(TEST_IMG_SIZE); + TEST_ASSERT_NOT_NULL(img); + + printf("initialize RGB panel with stream mode\r\n"); + esp_lcd_panel_handle_t panel_handle = test_rgb_panel_initialization(16, 16, 0, false, NULL, NULL); + printf("flush random color block\r\n"); + for (int i = 0; i < 200; i++) { + uint8_t color_byte = esp_random() & 0xFF; + int x_start = esp_random() % (TEST_LCD_H_RES - 100); + int y_start = esp_random() % (TEST_LCD_V_RES - 100); + memset(img, color_byte, TEST_IMG_SIZE); + esp_lcd_panel_draw_bitmap(panel_handle, x_start, y_start, x_start + 100, y_start + 100, img); + } + printf("delete RGB panel\r\n"); + TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); + free(img); +} + +TEST_CASE("lcd_rgb_panel_8bit_interface", "[lcd]") +{ + uint8_t *img = malloc(100 * 100 * 3); + TEST_ASSERT_NOT_NULL(img); + + printf("initialize RGB panel with stream mode\r\n"); + // bpp for RGB888 is 24 + esp_lcd_panel_handle_t panel_handle = test_rgb_panel_initialization(8, 24, 0, false, NULL, NULL); + uint8_t color_byte = esp_random() & 0xFF; + printf("flush random color block 0x%x\r\n", color_byte); + int x_start = esp_random() % (TEST_LCD_H_RES - 100); + int y_start = esp_random() % (TEST_LCD_V_RES - 100); + memset(img, color_byte, 100 * 100 * 3); + esp_lcd_panel_draw_bitmap(panel_handle, x_start, y_start, x_start + 100, y_start + 100, img); + vTaskDelay(pdMS_TO_TICKS(2000)); + printf("delete RGB panel\r\n"); + TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); + free(img); +} + +TEST_LCD_CALLBACK_ATTR static bool test_rgb_panel_trans_done(esp_lcd_panel_handle_t panel, const esp_lcd_rgb_panel_event_data_t *edata, void *user_ctx) +{ + TaskHandle_t task_to_notify = (TaskHandle_t)user_ctx; + BaseType_t high_task_wakeup; + vTaskNotifyGiveFromISR(task_to_notify, &high_task_wakeup); + return high_task_wakeup == pdTRUE; +} + +TEST_CASE("lcd_rgb_panel_refresh_on_demand", "[lcd]") +{ + uint8_t *img = malloc(TEST_IMG_SIZE); + TEST_ASSERT_NOT_NULL(img); + TaskHandle_t cur_task = xTaskGetCurrentTaskHandle(); + + printf("initialize RGB panel with non-stream mode\r\n"); + esp_lcd_panel_handle_t panel_handle = test_rgb_panel_initialization(16, 16, 0, true, test_rgb_panel_trans_done, cur_task); + printf("flush random color block\r\n"); + for (int i = 0; i < 200; i++) { + uint8_t color_byte = esp_random() & 0xFF; + int x_start = esp_random() % (TEST_LCD_H_RES - 100); + int y_start = esp_random() % (TEST_LCD_V_RES - 100); + memset(img, color_byte, TEST_IMG_SIZE); + esp_lcd_panel_draw_bitmap(panel_handle, x_start, y_start, x_start + 100, y_start + 100, img); + esp_lcd_rgb_panel_refresh(panel_handle); + // wait for flush done + TEST_ASSERT_NOT_EQUAL(0, ulTaskNotifyTake(pdFALSE, pdMS_TO_TICKS(1000))); + } + + printf("delete RGB panel\r\n"); + TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); + free(img); +} + +TEST_CASE("lcd_rgb_panel_bounce_buffer", "[lcd]") +{ + uint8_t *img = malloc(TEST_IMG_SIZE); + TEST_ASSERT_NOT_NULL(img); + TaskHandle_t cur_task = xTaskGetCurrentTaskHandle(); + + printf("initialize RGB panel with non-stream mode\r\n"); + esp_lcd_panel_handle_t panel_handle = test_rgb_panel_initialization(16, 16, 10 * TEST_LCD_H_RES, false, test_rgb_panel_trans_done, cur_task); + printf("flush random color block\r\n"); + for (int i = 0; i < 200; i++) { + uint8_t color_byte = esp_random() & 0xFF; + int x_start = esp_random() % (TEST_LCD_H_RES - 100); + int y_start = esp_random() % (TEST_LCD_V_RES - 100); + memset(img, color_byte, TEST_IMG_SIZE); + esp_lcd_panel_draw_bitmap(panel_handle, x_start, y_start, x_start + 100, y_start + 100, img); + // wait for flush done + TEST_ASSERT_NOT_EQUAL(0, ulTaskNotifyTake(pdFALSE, pdMS_TO_TICKS(1000))); + } + + printf("delete RGB panel\r\n"); + TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); + free(img); +} + +TEST_CASE("lcd_rgb_panel_update_pclk", "[lcd]") +{ + uint8_t *img = malloc(TEST_IMG_SIZE); + TEST_ASSERT_NOT_NULL(img); + + printf("initialize RGB panel with stream mode\r\n"); + esp_lcd_panel_handle_t panel_handle = test_rgb_panel_initialization(16, 16, 0, false, NULL, NULL); + printf("flush one clock block to the LCD\r\n"); + uint8_t color_byte = esp_random() & 0xFF; + int x_start = esp_random() % (TEST_LCD_H_RES - 100); + int y_start = esp_random() % (TEST_LCD_V_RES - 100); + memset(img, color_byte, TEST_IMG_SIZE); + esp_lcd_panel_draw_bitmap(panel_handle, x_start, y_start, x_start + 100, y_start + 100, img); + printf("The LCD driver should keep flushing the color block in the background (as it's in stream mode)\r\n"); + vTaskDelay(pdMS_TO_TICKS(1000)); + + printf("Update the PCLK in the background\r\n"); + const uint32_t test_pclk_freq[] = {10000000, 12000000, 8000000}; + for (size_t i = 0; i < sizeof(test_pclk_freq) / sizeof(test_pclk_freq[0]); i++) { + esp_lcd_rgb_panel_set_pclk(panel_handle, test_pclk_freq[i]); + vTaskDelay(pdMS_TO_TICKS(1000)); + } + + printf("delete RGB panel\r\n"); + TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); + free(img); +} + +TEST_CASE("lcd_rgb_panel_restart", "[lcd]") +{ + uint8_t *img = malloc(TEST_IMG_SIZE); + TEST_ASSERT_NOT_NULL(img); + + printf("initialize RGB panel with stream mode\r\n"); + esp_lcd_panel_handle_t panel_handle = test_rgb_panel_initialization(16, 16, 0, false, NULL, NULL); + printf("flush one clock block to the LCD\r\n"); + uint8_t color_byte = esp_random() & 0xFF; + int x_start = esp_random() % (TEST_LCD_H_RES - 100); + int y_start = esp_random() % (TEST_LCD_V_RES - 100); + memset(img, color_byte, TEST_IMG_SIZE); + esp_lcd_panel_draw_bitmap(panel_handle, x_start, y_start, x_start + 100, y_start + 100, img); + printf("The LCD driver should keep flushing the color block in the background (as it's in stream mode)\r\n"); + vTaskDelay(pdMS_TO_TICKS(1000)); + + printf("Restart the DMA transmission in the background\r\n"); + TEST_ESP_OK(esp_lcd_rgb_panel_restart(panel_handle)); + vTaskDelay(pdMS_TO_TICKS(1000)); + + printf("delete RGB panel\r\n"); + TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); + free(img); +} + +TEST_CASE("lcd_rgb_panel_rotate", "[lcd]") +{ + const int w = 200; + const int h = 100; + uint64_t t = 0; + uint8_t *img = malloc(w * h * sizeof(uint16_t)); + TEST_ASSERT_NOT_NULL(img); + uint8_t color_byte = esp_random() & 0xFF; + memset(img, color_byte, w * h * sizeof(uint16_t)); + + printf("initialize RGB panel with stream mode\r\n"); + esp_lcd_panel_handle_t panel_handle = test_rgb_panel_initialization(16, 16, 0, false, NULL, NULL); + + printf("Update the rotation of panel\r\n"); + for (size_t i = 0; i < 8; i++) { + esp_lcd_panel_swap_xy(panel_handle, i & 4); + esp_lcd_panel_mirror(panel_handle, i & 2, i & 1); + printf("Panel Rotation=%d\r\n", i); + t = esp_timer_get_time(); + esp_lcd_panel_draw_bitmap(panel_handle, 0, 0, w, h, img); + t = esp_timer_get_time() - t; + printf("@resolution %dx%d time per frame=%.2fMS\r\n", w, h, (float)t / 1000.0f); + vTaskDelay(pdMS_TO_TICKS(1000)); + } + + printf("delete RGB panel\r\n"); + TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); + free(img); +} + +#if CONFIG_LCD_RGB_ISR_IRAM_SAFE +TEST_LCD_CALLBACK_ATTR static bool test_rgb_panel_count_in_callback(esp_lcd_panel_handle_t panel, const esp_lcd_rgb_panel_event_data_t *edata, void *user_ctx) +{ + uint32_t *count = (uint32_t *)user_ctx; + *count = *count + 1; + return false; +} + +static void IRAM_ATTR test_disable_flash_cache(void) +{ + // disable flash cache + spi_flash_guard_get()->start(); + esp_rom_delay_us(200000); + // enable flash cache + spi_flash_guard_get()->end(); +} + +TEST_CASE("lcd_rgb_panel_iram_safe", "[lcd]") +{ + uint8_t *img = malloc(TEST_IMG_SIZE); + TEST_ASSERT_NOT_NULL(img); + + uint32_t callback_calls = 0; + + printf("initialize RGB panel with stream mode\r\n"); + esp_lcd_panel_handle_t panel_handle = test_rgb_panel_initialization(16, 16, 0, false, test_rgb_panel_count_in_callback, &callback_calls); + printf("flush one clock block to the LCD\r\n"); + uint8_t color_byte = esp_random() & 0xFF; + int x_start = esp_random() % (TEST_LCD_H_RES - 100); + int y_start = esp_random() % (TEST_LCD_V_RES - 100); + memset(img, color_byte, TEST_IMG_SIZE); + esp_lcd_panel_draw_bitmap(panel_handle, x_start, y_start, x_start + 100, y_start + 100, img); + printf("The LCD driver should keep flushing the color block in the background (as it's in stream mode)\r\n"); + + // read/write the SPI Flash by NVS APIs, the LCD driver should stay work + printf("disable the cache for a while\r\n"); + test_disable_flash_cache(); + printf("the RGB ISR handle should keep working while the flash cache is disabled\r\n"); + printf("callback calls: %"PRIu32"\r\n", callback_calls); + TEST_ASSERT(callback_calls > 2); + + printf("delete RGB panel\r\n"); + TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); + free(img); +} +#endif // CONFIG_LCD_RGB_ISR_IRAM_SAFE diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/main/test_yuv_rgb_conv.c b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/main/test_yuv_rgb_conv.c new file mode 100644 index 000000000..4bcf65dbd --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/main/test_yuv_rgb_conv.c @@ -0,0 +1,103 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "unity.h" +#include "esp_lcd_panel_rgb.h" +#include "esp_lcd_panel_ops.h" +#include "esp_random.h" +#include "esp_attr.h" +#include "test_rgb_board.h" + +#define TEST_IMG_SIZE (320 * 320 * sizeof(uint16_t)) + +// YUV images are embedded in the firmware binary +extern const uint8_t image_hello_yuv_start[] asm("_binary_hello_yuv_start"); +extern const uint8_t image_hello_yuv_end[] asm("_binary_hello_yuv_end"); +extern const uint8_t image_world_yuv_start[] asm("_binary_world_yuv_start"); +extern const uint8_t image_world_yuv_end[] asm("_binary_world_yuv_end"); + +TEST_CASE("lcd_rgb_panel_yuv422_conversion", "[lcd]") +{ + esp_lcd_panel_handle_t panel_handle = NULL; + esp_lcd_rgb_panel_config_t panel_config = { + .data_width = 16, + .psram_trans_align = 64, + .bits_per_pixel = 16, // YUV422: 16bits per pixel + .clk_src = LCD_CLK_SRC_DEFAULT, + .disp_gpio_num = TEST_LCD_DISP_EN_GPIO, + .pclk_gpio_num = TEST_LCD_PCLK_GPIO, + .vsync_gpio_num = TEST_LCD_VSYNC_GPIO, + .hsync_gpio_num = TEST_LCD_HSYNC_GPIO, + .de_gpio_num = TEST_LCD_DE_GPIO, + .data_gpio_nums = { + TEST_LCD_DATA0_GPIO, + TEST_LCD_DATA1_GPIO, + TEST_LCD_DATA2_GPIO, + TEST_LCD_DATA3_GPIO, + TEST_LCD_DATA4_GPIO, + TEST_LCD_DATA5_GPIO, + TEST_LCD_DATA6_GPIO, + TEST_LCD_DATA7_GPIO, + TEST_LCD_DATA8_GPIO, + TEST_LCD_DATA9_GPIO, + TEST_LCD_DATA10_GPIO, + TEST_LCD_DATA11_GPIO, + TEST_LCD_DATA12_GPIO, + TEST_LCD_DATA13_GPIO, + TEST_LCD_DATA14_GPIO, + TEST_LCD_DATA15_GPIO, + }, + .timings = { + .pclk_hz = TEST_LCD_PIXEL_CLOCK_HZ, + .h_res = TEST_LCD_H_RES, + .v_res = TEST_LCD_V_RES, + .hsync_back_porch = 68, + .hsync_front_porch = 20, + .hsync_pulse_width = 5, + .vsync_back_porch = 18, + .vsync_front_porch = 4, + .vsync_pulse_width = 1, + }, + .flags.fb_in_psram = 1, // allocate frame buffer in PSRAM + }; + + printf("Create RGB LCD panel\r\n"); + TEST_ESP_OK(esp_lcd_new_rgb_panel(&panel_config, &panel_handle)); + TEST_ESP_OK(esp_lcd_panel_reset(panel_handle)); + + printf("Set YUV-RGB conversion profile\r\n"); + esp_lcd_yuv_conv_config_t conv_config = { + .std = LCD_YUV_CONV_STD_BT601, + .src = { + .color_range = LCD_COLOR_RANGE_FULL, + .color_space = LCD_COLOR_SPACE_RGB, + }, + .dst = { + .color_range = LCD_COLOR_RANGE_FULL, + .color_space = LCD_COLOR_SPACE_RGB, + }, + }; + TEST_ESP_ERR(ESP_ERR_INVALID_ARG, esp_lcd_rgb_panel_set_yuv_conversion(panel_handle, &conv_config)); + + conv_config.src.color_space = LCD_COLOR_SPACE_YUV; + conv_config.src.yuv_sample = LCD_YUV_SAMPLE_422; + TEST_ESP_OK(esp_lcd_rgb_panel_set_yuv_conversion(panel_handle, &conv_config)); + + TEST_ESP_OK(esp_lcd_panel_init(panel_handle)); + + printf("Draw YUV images\r\n"); + for (int i = 0; i < 4; i++) { + TEST_ESP_OK(esp_lcd_panel_draw_bitmap(panel_handle, 0, 0, 320, 320, image_hello_yuv_start)); + vTaskDelay(pdMS_TO_TICKS(1000)); + TEST_ESP_OK(esp_lcd_panel_draw_bitmap(panel_handle, 0, 0, 320, 320, image_world_yuv_start)); + vTaskDelay(pdMS_TO_TICKS(1000)); + } + + TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); +} diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/pytest_rgb_lcd.py b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/pytest_rgb_lcd.py new file mode 100644 index 000000000..497ca91e4 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/pytest_rgb_lcd.py @@ -0,0 +1,19 @@ +# SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: CC0-1.0 + +import pytest +from pytest_embedded import Dut + + +@pytest.mark.esp32s3 +@pytest.mark.octal_psram +@pytest.mark.parametrize( + 'config', + [ + 'iram_safe', + 'release', + ], + indirect=True, +) +def test_rgb_lcd(dut: Dut) -> None: + dut.run_all_single_board_cases() diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/resources/README.md b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/resources/README.md new file mode 100644 index 000000000..3c6ead694 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/resources/README.md @@ -0,0 +1,5 @@ +# How to generate the YUV image from the PNG image + +```bash +ffmpeg -i hello.png -pix_fmt uyvy422 hello.yuv +``` diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/resources/pictures/hello.png b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/resources/pictures/hello.png new file mode 100644 index 0000000000000000000000000000000000000000..380298e8e486b2455851cd12ecfc26cc0a52b6e3 GIT binary patch literal 5356 zcmeHL`8yQs*B@kkTBs0WlC5N`M2HDt#*iM;WEo4A$QEPCHdK~x#K_XfkkSkfW#5gZ z$W9p9hB4Vqmaz}R%zUT!y51k(zuLt2z;XM};^Sdk`crU40KnNw$Q}Lr&$8D@p-*#0B0Dyh#3xdfyK7{7Yv#GBI^*Bv zSL>9d1-!j{c z%e`NUy2|*a%B}37hIQWJXpvN{2C5f7t2tN9JT9CZ9>`Fn)i3ETHMXSb&=w;c08WD+ zm`Es#o@Y!nIn@lK8t-X8P9~RQLQL_K6_Fq=NLT$th1C-h8RRp&+;Pq+&RugKh+l78 zo$kD?er0~@+1~3)kN-IEz*~yBBs;OE20!}o zKu9PmEzJm1_8eelGjYL_=)sy(h9{rsfed%<1F48VRD%VhFJtUgPw>~Z(R~boU65VN z11Hv8WUC_EGjF?~r3U`$>VC+hbx3h>`V&Q*v*A?TNU|FIw0djR&~wI7NDMJP4ZL&5@z!~OIO)|1{I{Q-*{fkC%BAc#(gi%G-eX56U^q7D{* zh&5Lxe3rmwNca?QAE`?NtTe7W8E>`0n_stI zHM&EblE+Or*v1wmEV~pbPFb{pDf5MdvAgJXM`;o>JFx6ZJtL+14Up;&YIhxSPu;ra zxv4~HJs@OXbPWDW0U{dJ5vhN)B}OT%g&vZ?K#t6c6e*{V7a``josnUz>UnBM)vWp` z7?!ORNx4oaMnNqKcAkrC-)Y#oPf3j>Tz&rXqFX1}QE!NQ?*vWGVmU?$w&?)K(Z~E9 zkox1j47_Q4_dkZOi&B}$SAkQ{D7o*;ZcuIv3PoQoQbKo((Sa?#iTJ+8nc1?~#}Vf% zwiR$xkf0+Zl#;hUHgFCzg-@bK{>hL9`(kPtHk29IQ_3sC&uDATE)m_YXJe;10u~CL zfxq4>@<7p%59ni$TOGrvZ;5`;YhnICyjesCcuJK1bvI5u)tc=4SII zw|rMU(mrLXIjz80^)K{{|2ZmMOu8897rL{VD32aRn1u1MLlIdpGjvIkaHUy0Dn~AH zwrs#h&Xe&|!%~d>c&^5x z(Flr{ZP|1&OhAt}5WYdrX^I?=1b5pJR>rs`WWHfVAzlFvNI_4z6vw#)j zaM2DYV%=1~gUJ4aNlop$6=6i{d8wJJGDoT_TdC`jG6$L0-S2>y^TcV?!dVTw6+~f{ z5yr&?9Hrjd(y!yF7vbJmu#JKu8H3U#0fXNf)f6Gd-L1*oPw6ls zyRc#&$cB1U|I8X}D^jAJYN`Z%$djzj_BC zpj%BiYvJ~A8Ims3{Rp8|-#+=bLzp9xemMtFSeUK{8fa-M7!^@H`n4UKc3;DXp+NyT zroN9FV?|1z=g54Ka>})Ldb!$}Wd3E_uXLPQBl;r*ZKt<&u)OQd4Hd2DZq=<00<%tE zmk{4tD8u(FSE$IZX{hQ+e~FtrW7ParmKO3#8wRnZ;S;W+N}S2FGO++N{Vv|EHRW~` zfBmVK(vrelD_SNd ze8%9ssE;f^wFpJaWnJxvYBeye?eSkhh7{;$Tjj@D7uX01ML+I)s<~^TJo#{BwW#fT zf81S3$zYSjfqDqOf0)w`VmCA&qYYYr1~0rBcKRajaeq3eme&)f4r$qUd6nOTkS&j?7?;^r0pcNjnoF zI>tqgx)55fm3*EJ@Nw?%_ONK-muae)hH!jW>MKjGjoSry*ueqKzP3f4L>^XfiZYvszA&UlBv(E2 z%+saY<$&{&_cRKt&FOnN%+5nTElqPBd;Ss`l6#kOeE4Jni_xI-*!Kug8kYR=VtD#@ z>L+^@Z=Rv0xCruY6#QUz?v=kV=2JRhIPqGMqW9HW+A(mCPlpdv%B|LT7DQXu2}3Y<=A&KK z$;C9PAf-EmRw-*34+cFH-=n5X)e((RM&Hm%X0`n(QaSU$OjwQ>@Ga^KKR(@fkMFCV zKoMZhYW})Yq+R*x{l^0*?Nlsb!oeVf#qJ0}84dg`e3(pul1!hm8hqYk z)F48*lA?VrU4;8laS;4qKTl|xJ*9!^==vas=7Hl+U6 z(5Dyv=@Ur=kYngSrh#@Q4|iuDg?u&x4#!7X@c5k6lMnSA+83u_aucJNZ$^}mQvYGo z%hc2G29OGP&s~!VC8RHt9jz`iHhP&ZuShw%3ak6sSh>IK2TIF+X{u5bQ1w^Aju{J0 zw6B+LM#cqhyQxGNxDMsZ!mBROH{;$A%+c+B77f)mkS{}bR7W}X^t+CM9gx;{^Mb7s zht(__Hlc)yB^>)f8vI7!?`-(3ERBf`sSSMdc@6f32vJc`&YBN?w^Dz6S=0g_sh_uZ z9I{19#7@3{J3aY3;e?sgLhE8<^tD}+yneZD+_#t5a2Oc47NEO1oDX%>z0v$T*nyyo zibHA5cCqW{f-FFjx-(f*;bt)&elxV_5CRQ-w^Mm#D$d-ZB*<&TcF$DUjj-XYa(gie zaXs6`cn8UVm)7R$MrjmWn)t%!yt{(7kTw61D6Vz>f{;Zwi+-J}D!(XI>fK3DYtceZ*Ni# zW2A+~yw;W1{{p579-EqZ0*s4;tsrT*r@N9Rk`ZC^Kbqb(6-F$`k`B#T23)k#6r@z8 z^RrZGH(#5c1qI<2?$7l`4J+27cia0s(^YKdpNt&zMJ#Un@(-*4!KX@tb+hlW+p_it z!b>!*D#Wz(3mSR&WYf*irfLEX&#+TL96h7Ojvo(mSpWb4 literal 0 HcmV?d00001 diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/resources/pictures/hello.yuv b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/resources/pictures/hello.yuv new file mode 100644 index 000000000..73582c5f7 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/resources/pictures/hello.yuv @@ -0,0 +1 @@ +¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¶†^•¥¤i²”ÁsКÞo¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¼€Z†­•c¤²nÁŒÐyÞµ^€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¶†^•¥¤i²”ÁsКÞo¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€·€]–™¸pƉÕzã€ë€ë€ë€ë€ë€ëën‡¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€§–g¸‘ÆuÕ‚ãë€ë€ë€ë€ë€ë€ë»ˆZ€¾€Y€¾€Y€¾€Y€·€]–™¸pƉÕzã€ë€ë€ë€ë€ë€ëënˆ¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ª€eÅ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë£Ûj€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€‹Åyë€ë€ë€ë€ë€ë€ë€ë€ë„ë}ܾ€Y€¾€Y€¾€Y€¾€Y€ª€eÅ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë£Üj€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€£€jÜ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëªÅe€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€„Û}ë€ë€ë€ë€ë€ë€ë€ë€ë‹ëyž€Y€¾€Y€¾€Y€¾€Y€£€jÛ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëªÅf€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€‡në€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë±®a€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¼€Z‡€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë‘ëu¯¾€Y€¾€Y€¾€Y€¾€Y€‡në€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë°¯a€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€–žrë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë·—]€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€µ€^ž€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë˜ëq˜¾€Y€¾€Y€¾€Y€¾€Y€–žrë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë·˜]€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€µvë€ë€ë€ë€ë€ë€ë€ë€ëë€è½ƒY€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¯€c´€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëžém„¾€Y€¾€Y€¾€Y€¾€Y€´vë€ë€ë€ë€ë€ë€ë€ë€ëë齄Z€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€‰Ìzë€ë€ë€ë€ë€ë€ë€ë€ë‡ë|Ô¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¨€gË€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¥Öi€¾€Y€¾€Y€¾€Y€¾€Y€‰Ëzë€ë€ë€ë€ë€ë€ë€ë€ë†ë|Ö¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€‚ã~ë€ë€ë€ë€ë€ë€ë€ë€ëëx½¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¢€kâ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¬¿d€¾€Y€¾€Y€¾€Y€¾€Y€ƒâ~ë€ë€ë€ë€ë€ë€ë€ë€ëëx¿¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€º€[Ž€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë”ës¦¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€›oë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë²¨`€¾€Y€¾€Y€¾€Y€º€[€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë“ët¨¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€³€`¥€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëšëo¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€•¤së€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¹‘\€¾€Y€¾€Y€¾€Y€³€`¤€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëšëp‘¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¬€d¼€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¡äl€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€Ž»wë€ë€ë€ë€ë€ë€ë€ë€ë‚ëå¾Y€¾€Y€¾€Y€¾€Y€­€d»€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë åk¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¦€hÓ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¨Íg€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€‡Ò{ë€ë€ë€ë€ë€ë€ë€ë€ëˆë{о€Y€¾€Y€¾€Y€¾€Y€¦€hÒ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë§Ðg€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€Ÿ‚lç€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë®¶c€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€½€Yçë€ë€ë€ë€ë€ë€ë€ë€ëëw¹¾€Y€¾€Y€¾€Y€¾€Y€ lç€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë­¹c€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€™•pë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëµŸ_€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¸€\”€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë•ës¢¾€Y€¾€Y€¾€Y€¾€Y€™”pë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë´¢_€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€’­uë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë»‰Z€¾€Y€¾€Y€µŠ^”±ša”»‰Z€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€½€Z„¦h·ÏxÚƒâ~é†ä|ÝšËp²»‹[€¾€Y€¾€Y€¾€Y€¾€Y€±€a«€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëœën‹¾€Y€¾€Y€¾€Y€¾€Y€’«të€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë»‹[€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€º€[Œ¡¥k¾ÌvÓŠÛy×–Îs¾´Ÿ_ƒ¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ŒÃyë€ë€ë€ë€ë€ë€ë€ë€ë„ë}ݾ€Y€¹€\‘’¾uÛ€ë€ë€ë€ë„ë}Ü«¸eŠ¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¹€\»vä€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëèw»½‚Y€¾€Y€¾€Y€¾€Y€«€e€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¢àk€¾€Y€¾€Y€¾€Y€¾€Y€ŒÂxë€ë€ë€ë€ë€ë€ë€ë€ëƒë~ྀY€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€±„a¨‡Ó|ë€ë€ë€ë€ë€ë€ë€ë€ëƒë~೦`€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€…Ú}ë€ë€ë€ë€ë€ë€ë€ë€ë‹ëyÆ»€[ŠÀxê€ë€ë€ë€ë€ë€ë€ë€ë‚ëå³¥`€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¼€Z…ºwé€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¨Êg€¾€Y€¾€Y€¾€Y€¤€iØ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë©Éf€¾€Y€¾€Y€¾€Y€¾€Y€†Ø}ë€ë€ë€ë€ë€ë€ë€ë€ëŠëzɾ€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€³€`¦ƒà~ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëëx¿¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¼€Z†€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë‘ëu¯š™oâ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë•ës¤¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€œ—n߀ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë’ët«¾€Y€¾€Y€¾€Y€ž…mê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¯²b€¾€Y€¾€Y€¾€Y€¼€Z…€ê€ë€ë€ë€ë€ë€ë€ë€ë€ëëv²¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€»€[Š‡Ñ{ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë­¹c€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¶€^œ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëëvµçë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëë滉[€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€³€`¦çë€ë€ë€ë€ë€ë€ë€ë€ë˜Ôq®›¤oÖ€ë€ë€ë€ë…ë}Ú¾€Y€¾€Y€¾€Y€—šqë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¶›^€¾€Y€¾€Y€¾€Y€¶€^š€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë—ëq›¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€›™oá€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë™êp”¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¯€b³€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë­ºd€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€“¨të€ë€ë€ë€ë€ë€ë€ë€ëëw¸½Y€º€\€ë€ë€ë€ë€ë€ë¼‡Z€¾€Y€¾€Y€‘±uë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¼†Z€¾€Y€¾€Y€¾€Y€°€b±€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëëm†¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¶€^›çë€ë€ë€ë€ë€ë€ë€ë€ëëxÀ·’]…˜nÚ€ë€ë€ë€ë‰ëz̾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¨€gÊ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë£Üj€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€´€_¢€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë­»d€¾€Y€¾€Y€ƒà~ë€ë€ë€ë€ë¸•]€¾€Y€¾€Y€ŠÇzë€ë€ë€ë€ë€ë€ë€ë€ë…ë}Ù¾€Y€¾€Y€¾€Y€¾€Y€©€fÇ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¤Ùi€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€™™pæ€ë€ë€ë€ë€ë€ë€ë€ëë€è´¡_€¾€Y€¹€\’€ë€ë€ë€ë€ë€ê»‰[€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¢€ká€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëœëo‹¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€Œnå€ë€ë€ë€ë€ë€ë€ë€ëˆë{оY€¾€Y€¾€Y€…Ù}ë€ë€ë€ë€ë´¢_€¾€Y€¾€Y€„Þ~ë€ë€ë€ë€ë€ë€ë€ë€ëŒëyþ€Y€¾€Y€¾€Y€¾€Y€£€jÞ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëªÃe€¾€Y€¾€Y€¾€Y€¾€Y€¼€Z‡ƒß~ë€ë€ë€ë€ë€ë€ë€ë€ë”ës¥¾€Y€¾€Y€¾€Y€†Ø|ë€ë€ë€ë€ë±«a€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€›oë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë’æu±¸‹]‰“­tè€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë™ëq–¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ˆÎ{ë€ë€ë€ë€ë€ë€ë€ë€ë›èo‘¾€Y€¾€Y€¾€Y€ƒá~ë€ë€ë€ë€ë¶œ^€¾€Y€»€[Š€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë’ët¬¾€Y€¾€Y€¾€Y€¾€Y€œŠnë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë±¬a€¾€Y€¾€Y€¾€Y€¾€Y€©€fÇ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëªÄe€¾€Y€¾€Y€¾€Y€ŠÇzë€ë€ë€ë€ë«Àe€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¶€^›·™]€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€•¤së€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëë続^€¾€Y€®€c¶€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë–ërŸ¾€Y€¾€Y€¾€Y€¾€Y€±€a­€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë­¹c€¾€Y€¾€Y€½€Y€ê€ë€ë€ë€ë€ë¹\€¾€Y€´€_¡€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë™ëp•¾€Y€¾€Y€¾€Y€¾€Y€•¡rë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¸•]€¾€Y€¾€Y€¾€Y€¾€Y€”§të€ë€ë€ë€ë€ë€ë€ë€ëƒë~ß¼†Z€¾€Y€¾€Y€¾€Y€‹Åyë€ë€ë€ë€ë¥Ôh€¾€Y€¾€Y€¾€Y€¾€Y€»€Z‰ŒÃyëªÄe€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€Žºwë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë—êr¾€Y€¾€Y€¹€\€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë—ërœ¾€Y€¾€Y€¾€Y€¾€Y€œnç€ë€ë€ë€ë€ë€ë€ë€ëë终[€¾€Y€¾€Y€¸€\”€ë€ë€ë€ë€ë€ë½„Z€¾€Y€®€c¸€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëŸçl‚¾€Y€¾€Y€¾€Y€¾€Y€¸wë€ë€ë€ë€ë€ë€ë€ë€ëë罂Y€¾€Y€¾€Y€¾€Y€º€[‚åë€ë€ë€ë€ë€ë€ë€ë€ë”ës¥¾€Y€¾€Y€¾€Y€©fÇ€ë€ë€ë€ë€ë€ë¢àk€¾€Y€¾€Y€¾€Y€»€[ˆ‘¸uå€ë€ë§Ðg€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€‡Ñ{ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¬¾d€¾€Y€¾€Y€½€Z„€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë™ëp•¾€Y€¾€Y€¾€Y€¾€Y€‹Æyë€ë€ë€ë€ë€ë€ë€ë€ëëx¼¾€Y€¾€Y€¾€Y€¯€b³€ë€ë€ë€ë…ë}Ù¾€Y€¾€Y€§€gÏ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¦Óh€¾€Y€¾€Y€¾€Y€¾€Y€ˆÏ{ë€ë€ë€ë€ë€ë€ë€ë€ë‡ë|Ó¾€Y€¾€Y€¾€Y€¾€Y€ª€eÅ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë£Ûj¾€Y€¾€Y€¾€Y€’¬uë€ë€ë€ë€ë€ë€ë æl€¾€Y€¾€Y€¸€\“¼wç€ë€ëŠëzʽ„Z€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€½€Yçë€ë€ë€ë€ë€ë€ë€ë€ë‚ë仈Z€¾€Y€¾€Y€¾€Y€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë›ëoŒ¾€Y€¾€Y€¾€Y€º€[€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë›ëoŽ¾€Y€¾€Y€¾€Y€¥€iÖ€ë€ë€ë€ëëv²¾€Y€¾€Y€¡€lå€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¬¼d€¾€Y€¾€Y€¾€Y€¾€Y€‚åë€ë€ë€ë€ë€ë€ë€ë€ëëx¼¾€Y€¾€Y€¾€Y€¾€Y€›Žoé€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë²¨`€¾€Y€¾€Y€¾€Y€†Õ|ë€ë€ë€ë€ë€ë€ëžëm‚º[¦›h·…Ú}ë€ë€ë€ë€ê­ºd¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¸€\”€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëŽëw¹¾€Y€¾€Y€¾€Y€¼€Z‡€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë æl€¾€Y€¾€Y€¾€Y€¬€d¼€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë§Ðg€¾€Y€¾€Y€¾€Y€–rë€ë€ë€ë€ë›ëo¾€Y€¾€Y€š‘pë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë³¥`€¾€Y€¾€Y€¾€Y€¹€\‘€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë”ës¥¾€Y€¾€Y€¾€Y€¾€Y€¿xë€ë€ë€ë€ë€ë€ë€ë€ëƒë~ὂY€¾€Y€¾€Y€¾€Y€‚åë€ë€ë€ë€ë€ë€ëëçè€ë€ë€ë€ë€ë€ë€ë¡Ñl”¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€±€a«€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë™ëp“¾€Y€¾€Y€¾€Y€¹€\’€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¥Öi€¾€Y€¾€Y€¾€Y€ž‡mæ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë²¨`€¾€Y€¾€Y€¾€Y€‡Ò|ë€ë€ë€ë€ë¨Êf€¾€Y€¾€Y€”§së€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëº\€¾€Y€¾€Y€¾€Y€²€`§€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë›ëo¾€Y€¾€Y€¾€Y€»€[Šçë€ë€ë€ë€ë€ë€ë€ë€ëŽëw»¾€Y€¾€Y€¾€Y€¾€Y€æë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë›×o£¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€«€e€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¢ák€¾€Y€¾€Y€¾€Y€´€_£€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë«Âe€¾€Y€¾€Y€¾€Y€²uë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê¼‡Z€¾€Y€¾€Y€°€b°€ë€ë€ë€ëëæº[€¾€Y€¾€Y€¾xë€ë€ë€ë€ë€ë€ë€ë€ë‚ëä¾€Y€¾€Y€¾€Y€¾€Y€¬€d¾€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¡äk€¾€Y€¾€Y€¾€Y€®€c·€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë™ëp”¾€Y€¾€Y€¾€Y€¾€Y€‡Ò|ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë‚ë㦽h”¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¤€iÙ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë©Éf€¾€Y€¾€Y€¾€Y€¯€bµ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë²©`€¾€Y€¾€Y€¾€Y€†Ö|ë€ë€ë€ë€ë€ë€ë€ë€ë‡ë|Ô¾€Y€¾€Y€¾€Y€™—pè€ë€ë€ë€ë‘ëu°¾€Y€¾€Y€¾€Y€†Õ|ë€ë€ë€ë€ë€ë€ë€ë€ë‰ëz;€Y€¾€Y€¾€Y€¾€Y€¥€hÕ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¨Íg€¾€Y€¾€Y€¾€Y€£€iÛ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¤Øi€¾€Y€¾€Y€¾€Y€¾€Y€™špç€ë€ë€ë€ë€ë€ë‚ëå™Íp³µ›^ƒ¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ž…mê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¯²b€¾€Y€¾€Y€¾€Y€¨€gË€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¹‘\€¾€Y€¾€Y€»€[‹€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëëw¸¾€Y€¾€Y€·€]—‚äë€ë€ë€ë€ë¨Ëg¾€Y€¾€Y€½€Yƒè€ë€ë€ë€ë€ë€ë€ë€ë€ëëv¶¾€Y€¾€Y€¾€Y€¾€Y€Ÿƒmè€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë®¶c€¾€Y€¾€Y€¾€Y€š‘pë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë®·c€¾€Y€¾€Y€¾€Y€¾€Y€»€Z‰‚äë€ë€ë€ë€ë¦Ñh¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€—›që€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¶›^€¾€Y€¾€Y€¾€Y€¡€kâ€ë€ë€ë€ë€ë€ë€ë€ë‚ëã¾€Y€¾€Y€¾€Y€±€a«€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë—ëq›¾€Y€¾€Y€–£rå€ë€ë€ë€ëˆë{н„Z€¾€Y€¾€Y€·€]—€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë–ërŸ¾€Y€¾€Y€¾€Y€¾€Y€˜—që€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëµŸ_€¾€Y€¾€Y€¾€Y€³vë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¶š^€¾€Y€¾€Y€¾€Y€¾€Y€¼€Z†€ë€ë€ë€ë€ë€ë¬¾d€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€²uë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê¼†Z€¾€Y€¾€Y€¾€Y€šoë€ë€ë€ë€ë€ë€ë€ë€ë‰ëz˾€Y€¾€Y€¾€Y€¨€gÌ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëŸçlƒ¾€Y€¦hÆ€ë€ë€ë€ë€ë€ë¥Ñi†¾€Y€¾€Y€¾€Y€±€a®€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëœën‰¾€Y€¾€Y€¾€Y€¾€Y€’®uë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë»‰Z€¾€Y€¾€Y€¾€Y€†Õ|ë€ë€ë€ë€ë€ë€ë€ë€ë‚ë潂Y€¾€Y€¾€Y€¾€Y€¾€Y€·€]™€ë€ë€ë€ë€ë€ë°¯a€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ŠÈzë€ë€ë€ë€ë€ë€ë€ë€ë…ë}Ù¾€Y€¾€Y€¾€Y€¾€Y€”§së€ë€ë€ë€ë€ë€ë€ë€ëëv²¾€Y€¾€Y€¾€Y€Ÿ‚lç€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¢Ðk‘ž¥mÉ€ê€ë€ë€ë€ë€ëëw¹½‚Y€¾€Y€¾€Y€¾€Y€ª€eÅ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë£Ýj€¾€Y€¾€Y€¾€Y€¾€Y€‹Åyë€ë€ë€ë€ë€ë€ë€ë€ë„ë}ݾ€Y€¾€Y€¾€Y€¼€Z‡€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë‰ëz̾€Y€¾€Y€¾€Y€¾€Y€¾€Y€±€a¬€ë€ë€ë€ë€ë€ëµŸ_€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ƒà~ë€ë€ë€ë€ë€ë€ë€ë€ëŒëy¾€Y€¾€Y€¾€Y€¾€Y€¿xë€ë€ë€ë€ë€ë€ë€ë€ë˜ëq™¾€Y€¾€Y€¾€Y€š’pë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëƒë~ßµž^€¾€Y€¾€Y€¾€Y€¾€Y€£€iÛ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë©Æf€¾€Y€¾€Y€¾€Y€¾€Y€…Û}ë€ë€ë€ë€ë€ë€ë€ë€ë‹ëyƾ€Y€¾€Y€¾€Y€¶€^›€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëëv·¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ª€fÅ€ë€ë€ë€ë€ë€ëº\€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€»€[‹€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë’ët¬¾€Y€¾€Y€¾€Y€¾€Y€†×|ë€ë€ë€ë€ë€ë€ë€ë€ëŸçlƒ¾€Y€¾€Y€¾€Y€”¦së€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëƒë~á°­aƒ¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€‡më€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë°°b€¾€Y€¾€Y€¾€Y€¼€Z‡€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë‘ëu°¾€Y€¾€Y€¾€Y€°€b°€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë•ës¤¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¢€ká€ë€ë€ë€ë‚ëæ½Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€´€_¢€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë™ëp”¾€Y€¾€Y€¾€Y€¼€Z…€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë§Ðg€¾€Y€¾€Y€¾€Y€Ž¹wë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëŠçzʱ¨a„¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€–rë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë·™]€¾€Y€¾€Y€¾€Y€µ€^€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë˜ëq™¾€Y€¾€Y€¾€Y€ª€eÄ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëšëp‘¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€š’pë€ë€ë€ë€ëŠëzʾ€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€­€c¹€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëŸçl‚¾€Y€¾€Y€¾€Y€¶€^›€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë®µc€¾€Y€¾€Y€¾€Y€‰Ìzë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê“ÒtÃ¥³h¢¼…Z€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€´vë€ë€ë€ë€ë€ë€ë€ë€ëë€é½„Z€¾€Y€¾€Y€¾€Y€¯€b´€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëžém„¾€Y€¾€Y€¾€Y€¤€iØ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëžëm‚¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€´vë€ë€ë€ë€ë’ëu«¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€§€gЀë€ë€ë€ë€ë€ë€ë€ë€ë€ë¦Òh€¾€Y€¾€Y€¾€Y€¯€b³€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¶›^€¾€Y€¾€Y€¾€Y€…Ù}ë€ë€ë€ë€ë€ë€ë€ë€ë‚ë~ã¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€‰Ëzë€ë€ë€ë€ë€ë€ë€ë€ë†ë|×¾€Y€¾€Y€¾€Y€¾€Y€¨€gË€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¥×i€¾€Y€¾€Y€¾€Y€¡€kâ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¡äk€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€…Û}ë€ë€ë€ë€ë›ëo¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ kå€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë­»d€¾€Y€¾€Y€¾€Y€¨€gÊ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê½„Z€¾€Y€¾€Y€¾€Y€ƒà~ë€ë€ë€ë€ë€ë€ë€ë€ë„ë}ݾ€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€»€[‹ƒá~ë€ë€ë€ë€ë€ë€ë€ë€ëŒëxÀ¾€Y€¾€Y€¾€Y€¾€Y€¢€ká€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë«Àe€¾€Y€¾€Y€¾€Y€Ÿ€lé€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë£Ýj€¾€Y€¾€Y€¾€Y€¾€Y€·€]—€ë€ë€ë€ë€ë€ë¤Ùi€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€š’pë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë³¥`€¾€Y€¾€Y€¾€Y€¢€kâ€ë€ë€ë€ë€ë€ë€ë€ë…ë}Ú¾€Y€¾€Y€¾€Y€¾€Y€çë€ë€ë€ë€ë€ë€ë€ë€ë†ë}ؾ€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ŸŒlÞ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë“ët©¾€Y€¾€Y€¾€Y€¾€Y€œŠnë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë²©`€¾€Y€¾€Y€¾€Y€†në€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¥×i€¾€Y€¾€Y€¾€Y€¾€Y€©€fÇ€ë€ë€ë€ë€ë€ë¯³b€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€“©të€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëº[€¾€Y€¾€Y€¾€Y€œŠnë€ë€ë€ë€ë€ë€ë€ë€ëŠëyǾ€Y€¾€Y€¾€Y€½€Y‚€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë†ë}×¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€»€Zˆ…Ú}ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë™ëp“¾€Y€¾€Y€¾€Y€¾€Y€•¢së€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¸“]€¾€Y€¾€Y€¾€Y€œ‹oë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¤Øi€¾€Y€¾€Y€¾€Y€¾€Y€š‘oê€ë€ë€ë€ëë漇Z€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ŒÀxë€ë€ë€ë€ë€ë€ë€ë€ëƒëâ¾€Y€¾€Y€¾€Y€¾€Y€—›që€ë€ë€ë€ë€ë€ë€ë€ëŽëw»¾€Y€¾€Y€¾€Y€¾€Y€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë„ë}ܾ€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¤…iÔ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëŸémƒ¾€Y€¾€Y€¾€Y€¾€Y€ˆÑ{ë€ë€ë€ë€ë€ë€ë€ë€ëë€é½ƒY€¾€Y€¾€Y€¾€Y€†në€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë£Ýj€¾€Y€¾€Y€¾€Y€¾€Y€ŠÉzë€ë€ë€ë€ëëw½¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€†×|ë€ë€ë€ë€ë€ë€ë€ë€ë‰ëz˾€Y€¾€Y€¾€Y€¾€Y€’«uë€ë€ë€ë€ë€ë€ë€ë€ëëv´¾€Y€¾€Y€¾€Y€³€`¦€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëëç¾Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€º€[Œ†Ö|ë‡ë|Ô€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¢ák€¾€Y€¾€Y€¾€Y€±€a­€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëƒë~á¾€Y€¾€Y€¾€Y€¾€Y€’­uë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë èl€¾€Y€¾€Y€¾€Y€´€_¤€ë€ë€ë€ë€ë€ë›êoŽ¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€½€Z„é€ë€ë€ë€ë€ë€ë€ë€ë€ëëv´¾€Y€¾€Y€¾€Y€¾€Y€³vë€ë€ë€ë€ë€ë€ë€ë€ëëx½¾€Y€¾€Y€¾€Y€Ÿ‡lâ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¹’\€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€›˜oá€ë€ëŽæwÀ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¡åk€¾€Y€¾€Y€¾€Y€š•pè€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë‚ëå¾€Y€¾€Y€¾€Y€¸€]•èë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë™ëp”¾€Y€¾€Y€¾€Y€nã€ë€ë€ë€ë€ë€ë«Àe€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¶€]™€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë–ër¾€Y€¾€Y€¾€Y€¾€Y€Žºwë€ë€ë€ë€ë€ë€ë€ë€ë„ë}ݽ‚Y€¾€Y€»€[Š‡Ô|ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë®¸c€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€±€a¬èë€ë€ë ¥l€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëšëp‘¾€Y€¾€Y€´€_£‚äë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¹‘\€¾€Y€¾€Y€—£qä€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëŒëxÀ¾€Y€¾€Y€º€[Ž„Þ~ë€ë€ë€ë€ë„ë~Þ¼†Z€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€°€b°€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëëm‡¾€Y€¾€Y€¾€Y€¾€Y€·vë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¢Ëj”º„[‰˜¥qÞ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë™çp˜¾€Y€¾€Y€¾€Y€¾€Y€µ_ž†Õ|ë€ë€ë‘ëu°­€dº€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë†ë}×´›_†¶„^—ŒÃyë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë×n›»†[„¤—iÀë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¥Âi”¸†]Ž’°tæ€ë€ë€ë€ë€ë€ë—ëqœ¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€©€fÇ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë£Ûi€¾€Y€¾€Y€¾€Y€¾€Y€’¬uë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê¤Ài™¹\ƒ·‡]£¢j»„Þ~ë€ë€ë€ë€ë­¹c€°€b°€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë„Þ~ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë„ë~Þé€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¬½d€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€£€jÞ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëªÅe€¾€Y€¾€Y€¾€Y€¾€Y€™•pë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë“ÀtÕ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëëv³¾€Y€·€]™€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë‚ë昙që€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë›æo”ŒÀxë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë‹ëyƽY€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€œ‰në€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë±­a€¾€Y€¾€Y€¾€Y€¾€Y€£jÞ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë…ë}Ù³„`¢€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëë鲧`€¾€Y€½€Y‚‚äë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë–êrŸ ‚lä€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€êµŸ_€Œmä€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë©Çf¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€– rë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë·—]€¾€Y€¾€Y€¾€Y€¾€Y€±€b®€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëán‘¾€Y€‹Æyë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëÚn—¾€Y€¾€Y€¾€Y€·wë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëë鲨`€®€c·€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë”és¨¾€Y€¶€^›è€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëŒëx½‚Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€·wë€ë€ë€ë€ë€ë€ë€ë€ëë€è½ƒY€¾€Y€¾€Y€¾€Y€¾€Y€½€Y‡Ò{ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëƒë~ß¹\€¾€Y€¥„iÓ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëŽêw»½„Z€¾€Y€¾€Y€¾€Y€¡‡kÝ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëšâo™¾€Y€¼€Z‡„Ý}ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëƒë~⶙]€¾€Y€¾€Y€˜Ÿpã€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëƒë~ßµŸ_€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ˆÎ{ë€ë€ë€ë€ë€ë€ë€ë€ë‡ë|Ô¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€£ˆjÓ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë£Ðj¾€Y€¾€Y€½€Yƒ¾xë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëŒéx¹‘\€¾€Y€¾€Y€¾€Y€¾€Y€¸€\”ƒâ~ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë‹ëyƺŒ[€¾€Y€¾€Y€œ”nâ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¦ÆhŒ¾€Y€¾€Y€¾€Y€»€[Š‹Æyé€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë‚ëã«»e†¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€‚äë€ë€ë€ë€ë€ë€ë€ë€ëëx½¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€½€Z„’³uå€ë€ë€ë€ë€ë€ë€ë€ë˜Úq©¾€Y€¾€Y€¾€Y€¾€Y€·€]˜‹Çyé€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê–Ôr¶ºŒ[€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¤ŒiÌ€ë€ë€ë€ë€ë€ë€ë€ë‹çyÇ·–]€¾€Y€¾€Y€¾€Y€º€[Œ‰Ìzë€ë€ë€ë€ë€ë€ëëç£Çj–¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€»€[‹™³pÍ‚äë€ë€ëëéŽÝwɳ¢`‚¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€½€Z„¤Ÿj»“ÆtÏ“Ïtƨ³g™¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¼€Z‡¥žh¶–ÂrÈ”ÍsÅž»m²±¤a‡¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ª’e²“ÆtÏ’ÏtǤ¸i£¼†Z€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¹€\’›²oÆÏvÏ™Çp¸²£`†¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¼€Z‡´Ž_”º‹[¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ \ No newline at end of file diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/resources/pictures/world.png b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/resources/pictures/world.png new file mode 100644 index 0000000000000000000000000000000000000000..13682f8b83869964b6a60583a7c29b296bb04a07 GIT binary patch literal 5984 zcmeHL=|2=)*dA0!(^M*HtRZCWv1MPwm{7JM#?nHJC0WB5l~O5VjmT1rHA`iQVMclE zkEOAdWk&Wf7&2p+G2@-*{rvt1@AKh&xzBxmzx!Oj`@YU~t{2zstbj+)9|ZsaK!~-4 z0|3Bd^6wHj!i@~1Vk!Xu5qXG(sZ;d3^_hp^`4RcuTSK;llAv^L+q_^!%w2yWjDxbX zX;Dw*ZPOdGD?ieBeuNH2-#=?O|4M3pr6}4mH0QA2u&5z#@dYRkPc`p_yu-;V?(Q~u z=>(OT5pCPtr9nx&XIL2Z%YJ;Xuo(-9AM8CDQfR<{6c`k;rclk>xVJ+>fMb>CR)qiw z@67dAmZ-e-9P+Ld`vB)A=t0(=oL0r;Lw0Q_?Sz>{R4x-?>k_WdRgN`M8791rT0VTDVW~d({$V5)Lamo(GM=6?mu|0wyBZ=NPMUvZ&N1e zb^1Xu=7!818Wpjf7jYK}l)MPPVigd4e`3<03yyHUOWOjeqBLqZHZ1_(TcJyk<${%{ zwP)gljg)U~1y{c0VTKAQsQs6(pG2ux9i0UD5I;gV-8DZoqbJgQyDScFV`EDu8jleh z#1sWga$Jn3o#l|gyA_vY%O?WUj*E%4B6J;2B&Y}Znv`3cgA+9PY!aMM?0+NUJ`UAl z?#sBiYO(K?%-@NCM1N_y_J$w_7-JR=O;25|wGbQ@;Sm^ltY>mOW0i_it%#VKh4-g% zGu?zOp+FfnTCxvtjLhTNe4`IU#E9MCR&a*Ekq5#7OQ&6&%a{~2H&uF!goHa#cD`ZX z$Yyj~M`&@nM|kG`cZcU|Kt`tIhnTz8tU?Px^+P-Y8J8XqwuJZ5#vVsZLZ;?%vq{bE zNuMUqlgll29-)Tf$(=eL&Omah7DTJ#-z+^71@=>E0LZ-K5(b@r5w7i3soL^{1+pf^ zyT*iH)uxU(spXHZUHokycz>kJ@^z{n$XcHPp)^6E3U85uar{?BC{k4vxZTmve8rfU&Eg~}*)<(Cquy$TAst4>Z9 z!tfaqgsb+6#ZIpA$ z0~zFs2`2_dsW^h+N#6?CgwHNyetTXTj0Ys%FR8v^ z23fuz*G!vZ66X=T1%#|a-Y0m~J4L&pj@?Xgtgc-6c}tt^G8Udu>!pec8WkXSY|r7# zF32MTOrrryviV^jSj1FCSh{A79h3ER<2~+S=+ATYsXNtkN!Us==4QnP;#v@CK47&Z z%r2D}`ie$pVdM}pM27807w&Pxex&O^!6`<*9{H?Xt=_}T^acVwDk&miVNnk;iw0a% z|9n%gPh-D?W=|R>U%SyEn&SVU3LyV>S}I=?({wtm^pi`=&MgsdzEAgS>YJcUV#t1q zq@&Vn$wd_ByMvRJR!h4rRY5b>zPYuY~eY^%DRF!L8u~djvs64B3I2 zqY7^`Ie%mQz_2!?7V zVS-amc|T6&*DSR6x@5S3ez@*Zp>b=DJ*nMv3F6#m1-l*e2M;AoR}dzQ)+V|#vuWFR z2_GzFK}ad=PKy_6<&4Io+qCNi^o zk|#U*VbkksyJ0pA)d*8}_@W-fD7JtiRdKAm_+-Lwf%ZevkFs3YIR;%onclfL9kobM z7d9npC)@@)(M zF6L0D#?}M)1=K1I+l7lR(~FUP^)_X_I{jle6L|@ z=y-@4$V3sjHksK~w^yA$nvos9uTLKIo4GF1+n^KAc)38G`ue3w_x0c$psVnV1G70k z?@`NrLH1=-m3Q@8eu{b~%p}j*bJFV;@R=IDoM>F?3r1eYMWU6VLM$U2ukBNhaQ_oQ z37LDMnH^?+ZBSR5NgA=qk=D38$$(BwdvZGy6>Z3gjoQfAh%RLuB*mS0>ZEkAV|I|f z$fXb~dpXGwCrNFIj2%2j8gM(&K%q9+t|s2e`RkT9&g>vZ-fAtNQU1c$8iV2xeV=rl zNNYT#oT+M{+bsK*W;Bxb-RQ)dCL3^M*8z)-dLGZF2N6W#2~EN>3pl2Wl6}5v{^btp zyS-LgNb-pB>|=z~v4jng%J!2Fj(R-OSwx4#IFfX+70W`$+RImc{k^Y=t^3OCw#Ns(>bVN@9YVOOk`_z4Vk8u2)HaEf6KtzB5|`rgBq)5N7utkzLJFDX z3Y2qpBzexgH`X|PYDnbz>d#LT5k`p$Dm=lYsVV5CW<@`d(pO;Rot}O&-+knHmbpz^ z=;wDNy>sGHh0#q1dj*~<)eMCS=LJ_@%77WzJ24e7J(D(VBnRAxKThxHugb)T|0Q`v zPWjc@vP@11XB~~jb^v#6mEdRH@rDnr?Vk^)WY@Fwq5^)B`sT9tQ}VP2QLjoZ0LKr> zwF{U&%5u;XbyE=+uPZWJi3#2=&9ZO02|JY_#5>6uZ-gKWzOS>;P%pgl!;8H{JDuAL zo%9-h1_l`H(tF^!jxuyJns!5-Xp=AHH?U#FlcNya=D+ph*se4HdaUYIuw!zDi*4@Z z%YjDs?(tiX{<(>G`7HRFxRULQ6}gn{J2v_^zX?$=Xm&R3iG9oE`xtJA6dphxhWO3g zuh5;1`Fyl}n3cPO%Q_R>m|WZK@^zDO@>D`z6vkfH!l1HUE=62&{9fT*e(QU&FuO%z zHU`HRND|*nwILARjGA*+Oq!g)8f~?A5wz>*w~v(8?r62^P*}{J;*KMi)V7q_kVkn9 zj!f_g-a3o%F?8zjRQgnLH?>nY*le#-jnYV8w-6L;Pf;ajWs0hFmg;mSxp~}1^-!Bw zMYNli+wNa*wYV?-vJ)(9>lpRt$*~aP&8Jd;e(q@GMK&wmgnah6{(f}tOTSla<30L3 z^S4ji3$@mh+J&0_1*_o8u`5SF7K8U{(>_uutqECeut1vE4d1TBx`v}~d3DqedB0Ew z_kj^?5%JXTl^V`j!J)$rLuU@pewy#7%zNKqn|}7jz=uOQiyirNB+yNvBkFE2B=<~R zbO5^he5SP};A};eAfjj}PH;bgpF^APn<~=7!j~;fduaNKak`jh$6_z)$^%TfgRmv0 z*3nhDYNz_6zNeYZm;=*b>z1_bMU^0=UyGC&kL#VKl6JYxk;wzIDJ*Z-IQ-n@GwaO_ zZOQRA9O#Hh;-T64(5)&v?p^0Q;Y6WBN9W}E-of4OF^Og!v<3jyJ z#A);6;6J$wkwQulB*LHe=jV&W$_#I@+e;A7!5%Z8ohLtI_vtU+QGV01{Q0fBwgaqy z<5aC#J$+CKtU7EJd#|(6Ffh;UCBUHMllEGM;X2RjqZN5^m|RAOqh3j4Mx(& ze88)T2InBLo(6wxXq1uMl3eK=(xj_9E|h6PYBKT$g!dRMrCv;S&dbPF$|%vbf{>Wc zS=2bvWZ6~}I zh5VBch^Vm!O4mECdoT6OrAB9FXtjQ>WZMr`(Iz^_Z}jfT2ycT<4G zDT2>+=aYEPDSmrFNkG14P6SsW&vgE9ZXR==X2yg@M(lcZ)Y&S8O&#mjQm$|v zwRh`YEiT4>f0EnYlaSY$3@`dYi%L&EV<1)h9@-;&5EOz1 zU#ilEptk2}JdL(=0@_G?{Hw$&5kt-^^NI>39odtmG(unpL+!Oy-s&5aH#3}AKvHxN zbeGmCYaI7Is68dx=@Cekg5Ho|1L%YAwg@TkbI1!~ga&CLZC!aDHG+F(y%M0-`R`qLXg6U1bh= zL6x)Gd*+6)$@#*TER4F>ROH4XwP(Nm{kW=i79 z(=#$bK~X{QWUmKb1k84hD)vBHSm&Dvji5q_#YdZMwfQp}ejM^Cylzv37Qu>0_6_?R zD3b1>7_^m4Ko{&#Ec_*8;C~`@p0_@H#R5>)B0IdsgCgWu@-B20(+kIVa=a(6FzUo~ zzGclGr&;UoSm#AT?W>Q6@SVS*k{|gI>}n97sfqJkO{)*9t@5p&mNmqy#;r}7i~*xS zTRrFf8Akq7#BYMcrk4aRJ`@Eve8=kp_elcY*)aeyy^G60KX9B~eTMa%7iW3!cZaDc uTW`9U|LZH-o%qja{LgUxzl~@5!9PzIKWoAu-?+{>0CLsNqQ=bo@&5qxXyqmV literal 0 HcmV?d00001 diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/resources/pictures/world.yuv b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/resources/pictures/world.yuv new file mode 100644 index 000000000..aa338e19b --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/resources/pictures/world.yuv @@ -0,0 +1 @@ +¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¶†^•¥¤i²”ÁsКÞo¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€º[©œf«˜ºqÉ’ØuÀ¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€·€]–™¸pƉÕzã€ë€ë€ë€ë€ë€ëënˆ¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¼€Z…Ÿ­l¼ŽËwÚè€ë€ë€ë€ë€ë’ëu®¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ª€eÅ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë£Üj€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€µ€^€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë˜ëq—¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€£€jÛ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëªÅf€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¯€b³€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëŸémƒ¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€‡në€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë°¯a€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¨€fÊ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¥Õi€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€–žrë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë·˜]€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¢€kà€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¬¾d€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€´vë€ë€ë€ë€ë€ë€ë€ë€ëë齄Z€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€œ‹në€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë²¨`€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€‰Ëzë€ë€ë€ë€ë€ë€ë€ë€ë†ë|Ö¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€•¢së€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¹‘\€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ƒâ~ë€ë€ë€ë€ë€ë€ë€ë€ëëx¿¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¸wë€ë€ë€ë€ë€ë€ë€ë€ë‚ëå¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€º€[€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë“ët¨¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ˆÎ{ë€ë€ë€ë€ë€ë€ë€ë€ëˆë{Ͼ€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€³€`¤€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëšëp‘¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€‚äë€ë€ë€ë€ë€ë€ë€ë€ëëw¸¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€­€d»€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë åk¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¹€\€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë•ës¢¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¦€hÒ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë§Ðg€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€³€`¦€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëœën‹¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ lç€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë­¹c€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¬€d¼€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¢àk€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¼€Z†¬—d¦³Ÿ`†¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€™”pë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë´¢_€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¦€hÒ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë©Éf€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€½€Yƒ·vç€ë€ëëæ³¥`€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€º€[Œ¡¥k¾ÌvÓŠÛy×–Îs¾´Ÿ_ƒ¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€’«të€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë»‹[€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€Ÿ‚lç€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¯²b€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€•¸sÕÕxÕÕxÕÕxÕÕxÕÕvʾ€Y€¾€Y€¾€Y€¾€Y€ÍwÕÕxÕÕxÕÕxÕÕxÕ–Õs¶¾€Y€¾€Y€­€d»€ë€ë€ë€ë€ë€ë•êr£¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€±„a¨‡Ó|ë€ë€ë€ë€ë€ë€ë€ë€ëƒë~೦`€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ŠÇzë€ë€ë€ë€ë€ë€ë€ë€ë…ë}Ú¾€Y€¾€Y€±ƒaªÇvØ„ç}à¦ÅhŽ¾€Y€¾€Y€¾€Y€ŒÂxë€ë€ë€ë€ë€ë€ë€ë€ëƒë~ྀY€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€«’e°ÉwÚƒâ~èŠàzÔ£Äj™¾€Y€™”pë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¶›^€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€…Ú}ë€ë€ë€ë€ë€ë€ë€ë€ëŠëzȾ€Y€¾€Y€¾€Y€»€[‰€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë‘ëu¯¾€Y€¾€Y€ˆnê€ë€ë€ë€ë€ë€ë„ë}ܾ€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€³€`¦ƒà~ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëëx¿¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€„Þ~ë€ë€ë€ë€ë€ë€ë€ë€ë‹ëyľ€Y€¯‚c²ƒá~ë€ë€ë€ë€ë‚ë䵟_€¾€Y€¾€Y€†Ø}ë€ë€ë€ë€ë€ë€ë€ë€ëŠëzɾ€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€›¥oÒ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë§Ìg‚“ªtë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¼†Z€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¼€Z†€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë‘ëv²¾€Y€¾€Y€¾€Y€µ€_ €ë€ë€ë€ë€ë€ë€ë€ë€ë€ë˜ëq™¾€Y€¾€Y€—›që€ë€ë€ë€ë€ë€ë€ë€ë¶™]€¾€Y€¾€Y€¾€Y€¾€Y€»€[Š‡Ñ{ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë­¹c€¾€Y€¾€Y€¾€Y€¾€Y€»€[Š€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë’ëu­¹€\‘†Ö|ë€ë€ë€ë€ë€ë€ë€ë€ëžæmŠ¾€Y€¼€Z…€ê€ë€ë€ë€ë€ë€ë€ë€ë€ëëv²¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ ”lÓ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëŽëw»ŒÁxë€ë€ë€ë€ë€ë€ë€ë€ë…ë}Ù¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¶€^›€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë—ëq›¾€Y€¾€Y€¾€Y€®€c·€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëžém„¾€Y€¾€Y€—›që€ë€ë€ë€ë€ë€ë€ë€ë¯²b€¾€Y€¾€Y€¾€Y€¾€Y€›™oá€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë™êp”¾€Y€¾€Y€¾€Y€¾€Y€´€_¡€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë˜ëq—•¦sç€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëëx¾¾€Y€¶€^š€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë—ëq›¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€´€_¤èë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë„ë}܆×}ë€ë€ë€ë€ë€ë€ë€ë€ëŒëyþ€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¯€b²€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëên†¾€Y€¾€Y€¾€Y€¨€gÍ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¥×i€¾€Y€¾€Y€ˆné€ë€ë€ë€ë€ë€ë€ë€ë¬¼d€¾€Y€¾€Y€¾€Y€¶€^›çë€ë€ë€ë€ë€ë€ë€ë€ëëxÀ·’]…˜nÚ€ë€ë€ë€ë‰ëz̾€Y€¾€Y€¾€Y€¾€Y€®€c¸€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëŽéw»€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë„ë}ܾ€Y€°€b±€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëëm†¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€’¯uê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëé€ë€ë€ë€ë€ë€ë€ë€ë€ë’ëu¬¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€©€fÉ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¤Ùi€¾€Y€¾€Y€¾€Y€¡€kä€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë«Àd€¾€Y€¾€Y€ª€eÀë€ë€ë€ë€ë€ë€ë€ëªÆf€¾€Y€¾€Y€¾€Y€™™pæ€ë€ë€ë€ë€ë€ë€ë€ëë€è´¡_€¾€Y€¹€\’€ë€ë€ë€ë€ë€ê»‰[€¾€Y€¾€Y€¾€Y€§€g΀ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê½„Z€©€fÇ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¤Ùi€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€­€dº€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëŠëzǵš^„±‡a¥‚ã~ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë™ëp•¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¢€jà€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë«Âe€¾€Y€¾€Y€¾€Y€šoë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë²©`€¾€Y€¾€Y€½€Z„ÅxåÞv‚åë€ë€ë«Âe€¾€Y€¾€Y€¼€Z‡ƒß~ë€ë€ë€ë€ë€ë€ë€ë€ë”ës¥¾€Y€¾€Y€¾€Y€†Ø|ë€ë€ë€ë€ë±«a€¾€Y€¾€Y€¾€Y€¡€kä€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëëç”Îs„Ý}ë€ë€ë€ë€ë€ë€ë€ë€ê½„Z€£€jÞ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëªÃe€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€³vë€ë€ë€ë€ë€ë€ë€ë€ëëç´£_€¾€Y€¾€Y€˜™që€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëŸçl‚¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€œ‹në€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë±¬a€¾€Y€¾€Y€¾€Y€”¦së€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¹’\€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€é€ë€ë€ë­»d€¾€Y€¾€Y€©€fÇ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëªÄe€¾€Y€¾€Y€¾€Y€ŠÇzë€ë€ë€ë€ë«Àe€¾€Y€¾€Y€¾€Y€š‘pë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê¬¸d‡¾€Y€™”pë€ë€ë€ë€ë€ë€ë„ë}ܾ€Y€œŠnë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë±¬a€¾€Y€¾€Y€¾€Y€¾€Y€·€]™€ê€ë€ë€ë€ë€ë€ë€ë€ë€ë—êr¾€Y€¾€Y€¾€Y€¤€iØ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¦Óh€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€•¢së€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¸”]€¾€Y€¾€Y€¾€Y€¼xë€ë€ë€ë€ë€ë€ë€ë€ë‚ëæ¾Y€¾€Y€¾€Y€¾€Y€¾€Y€¼€Z‡€ë€ë€ë€ë¯µb€¾€Y€¾€Y€”§të€ë€ë€ë€ë€ë€ë€ë€ëƒë~ß¼†Z€¾€Y€¾€Y€¾€Y€‹Åyë€ë€ë€ë€ë¥Ôh€¾€Y€¾€Y€¾€Y€”§së€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëšâo™¾€Y€¾€Y€¢€kâ€ë€ë€ë€ë€ë€ëŽëw¹¾€Y€•¡rë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¸•]€¾€Y€¾€Y€¾€Y€¾€Y€¡‡kÞ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë®¶c€¾€Y€¾€Y€¾€Y€¢€kà€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¬¼d€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¸wë€ë€ë€ë€ë€ë€ë€ë€ëë罂Y€¾€Y€¾€Y€¾€Y€‡Ó|ë€ë€ë€ë€ë€ë€ë€ë€ëˆë{о€Y€¾€Y€¾€Y€¾€Y€¾€Y€º€\€ë€ë€ë€ë±®b€¾€Y€º€[‚åë€ë€ë€ë€ë€ë€ë€ë€ë”ës¥¾€Y€¾€Y€¾€Y€©fÇ€ë€ë€ë€ë€ë€ë¢àk€¾€Y€¾€Y€¾€Y€¾xë€ë€ë€ë€ë€ë€ë€ë€ë‚ëäº\€¾€Y€¾€Y€©€fÆ€ë€ë€ë€ë€ë€ë âl†¾€Y€¸wë€ë€ë€ë€ë€ë€ë€ë€ëë罂Y€¾€Y€¾€Y€¾€Y€¾€Y€ŠÈzë€ë€ë€ë€ë€ë€ë€ë€ëˆë{оY€¾€Y€¾€Y€¾€Y€›Œoë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë³¦`€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ˆÏ{ë€ë€ë€ë€ë€ë€ë€ë€ë‡ë|Ò¾€Y€¾€Y€¾€Y€½€Y‚çë€ë€ë€ë€ë€ë€ë€ë€ëŽëw¹¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€µ€^ž€ë€ë€ë€ë²§`€¾€Y€ª€eÅ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë£Ûj¾€Y€¾€Y€¾€Y€’¬uë€ë€ë€ë€ë€ë€ë æl€¾€Y€¾€Y€¸€\“†Õ|ë€ë€ë€ë€ë€ë€ë€ë€ëŠëzɾ€Y€¾€Y€¾€Y€¶€^š€ë€ë€ë€ë…ë}Ú¹’\€¾€Y€ˆÏ{ë€ë€ë€ë€ë€ë€ë€ë€ë‡ë|Ó¾€Y€¾€Y€¾€Y€¾€Y€µ€^ž€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëšêp’¾€Y€¾€Y€¾€Y€¾€Y€•£së€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¹\€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€‚åë€ë€ë€ë€ë€ë€ë€ë€ëŽëw¼¾€Y€¾€Y€¾€Y€¸€]•€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë•ës£¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¯€b²€ë€ë€ë€ë·™]€¾€Y€›Žoé€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë²¨`€¾€Y€¾€Y€¾€Y€†Õ|ë€ë€ë€ë€ë€ë€ëžëm‚º[¦›h·…Ú}ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëëv²¾€Y€¾€Y€¾€Y€¾€Y€ž¡mÌŽ×wή±c…¾€Y€¾€Y€‚åë€ë€ë€ë€ë€ë€ë€ë€ëëx¼¾€Y€¾€Y€¾€Y€¾€Y€¦€hÓ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëªÅe€¾€Y€¾€Y€¾€Y€¾€Y€Ž¹wë€ë€ë€ë€ë€ë€ë€ë€ë‚ëä¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¹€\‘€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë”ës¥¾€Y€¾€Y€¾€Y€±€a¬€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë›ëoŒ¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ª€fÆ€ë€ë€ë€ë¼‡Z€¾€Y€¿xë€ë€ë€ë€ë€ë€ë€ë€ëƒë~ὂY€¾€Y€¾€Y€¾€Y€‚åë€ë€ë€ë€ë€ë€ëëçè€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë—ërœ¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¹€\‘€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë”ës¥¾€Y€¾€Y€¾€Y€¾€Y€–žrë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê¹\€¾€Y€¾€Y€¾€Y€¾€Y€ˆÑ{ë€ë€ë€ë€ë€ë€ë€ë€ë‰ë{;€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€²€`§€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë›ëo¾€Y€¾€Y€¾€Y€«€e€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¢ák€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¤€iÚ€ë€ëƒë~á¾€Y€»€[Šçë€ë€ë€ë€ë€ë€ë€ë€ëŽëw»¾€Y€¾€Y€¾€Y€¾€Y€æë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëëm†¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€²€`§€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë›ëo¾€Y€¾€Y€¾€Y€¾€Y€‡Ô|ë€ë€ë€ë€ë€ë€ë€ë€ëŠëzɾ€Y€¾€Y€¾€Y€¾€Y€½€Yæë€ë€ë€ë€ë€ë€ë€ë€ëëv¶¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¬€d¾€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¡ãk€¾€Y€¾€Y€¾€Y€¤€iÙ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¨Êg€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€‡nê€ë€ëˆë{Ͼ€Y€®€c·€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë™ëp”¾€Y€¾€Y€¾€Y€¾€Y€‡Ò|ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë‚ë㘽qÅ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¤Úi€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¬€d¾€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¡äk€¾€Y€¾€Y€¾€Y€¶€^›€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë•ës¢¾€Y€¾€Y€¾€Y€¾€Y€¸€]“€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë–ërŸ¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¥€hÕ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¨Ìg€¾€Y€¾€Y€¾€Y€†nê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¯³b€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€”¥së€ë€ëëx¼¾€Y€£€iÛ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¤Øi€¾€Y€¾€Y€¾€Y€¾€Y€™špç€ë€ë€ë€ë€ë€ë‚ëå™Íp³µ›^ƒ£€iÛ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëªÄe€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¥€hÕ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¨Íg€¾€Y€¾€Y€¾€Y€«€eÁ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë äkƒ¾€Y€¾€Y€¾€Y€¾€Y€²€aª€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëœën‰¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€Ÿƒmè€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë®¶c€¾€Y€¾€Y€¾€Y€—›që€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¶œ^€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ŒÃyë€ë€ë“ët©¾€Y€š‘pë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë®·c€¾€Y€¾€Y€¾€Y€¾€Y€»€Z‰‚äë€ë€ë€ë€ë¦Ñh¾€Y€¾€Y€‡më€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë±­a€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€Ÿƒmè€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë®¶c€¾€Y€¾€Y€¾€Y€¡‚kã€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¬¿d€¾€Y€¾€Y€¾€Y€¾€Y€«€eÁ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë£Þj€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€˜—që€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëµŸ_€¾€Y€¾€Y€¾€Y€²uë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¼‡Z€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ƒá~ë€ë€ë›ëoŒ¾€Y€³vë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¶š^€¾€Y€¾€Y€¾€Y€¾€Y€¼€Z†€ë€ë€ë€ë€ë€ë¬¾d€¾€Y€¾€Y€–rë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë·–]€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€˜—që€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëµŸ_€¾€Y€¾€Y€¾€Y€–žrë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëµ _€¾€Y€¾€Y€¾€Y€¾€Y€¤€iØ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë©Çf€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€’®uë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë»‰Z€¾€Y€¾€Y€¾€Y€ŠÈzë€ë€ë€ë€ë€ë€ë€ë€ë…ë}Ú¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¸€]•€ë€ë€ë€ë¤Ùi€¾€Y€†Õ|ë€ë€ë€ë€ë€ë€ë€ë€ë‚ë潂Y€¾€Y€¾€Y€¾€Y€¾€Y€·€]™€ë€ë€ë€ë€ë€ë°¯a€¾€Y€¾€Y€´vë€ë€ë€ë€ë€ë€ë€ë€ëë€è½ƒY€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€’®uë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë»‰Z€¾€Y€¾€Y€¾€Y€ŒÂyë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê¼†Z€¾€Y€¾€Y€¾€Y€¾€Y€ž…mê€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë°°b€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€‹Åyë€ë€ë€ë€ë€ë€ë€ë€ë„ë}ݾ€Y€¾€Y€¾€Y€¾€Y€ƒß~ë€ë€ë€ë€ë€ë€ë€ë€ë‹ëyľ€Y€¾€Y€¾€Y€¾€Y€¾€Y€¬€d¼€ë€ë€ë€ë­»d€¼€Z‡€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë‰ëz̾€Y€¾€Y€¾€Y€¾€Y€¾€Y€±€a¬€ë€ë€ë€ë€ë€ëµŸ_€¾€Y€¾€Y€‰Ëzë€ë€ë€ë€ë€ë€ë€ë€ë‡ë|Ô¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€‹Åyë€ë€ë€ë€ë€ë€ë€ë€ë„ë}ݾ€Y€¾€Y€¾€Y€¾€Y€ƒà~ë€ë€ë€ë€ë€ë€ë€ë€ë‡ë|Ó¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€—›që€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¶š^€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€…Û}ë€ë€ë€ë€ë€ë€ë€ë€ë‹ëyƾ€Y€¾€Y€¾€Y€»€[Š€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë’ëu­¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¡ƒkã€ë€ë€ë€ëµ^€¶€^›€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëëv·¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ª€fÅ€ë€ë€ë€ë€ë€ëº\€¾€Y€¾€Y€ƒâ~ë€ë€ë€ë€ë€ë€ë€ë€ëëx¾¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€…Û}ë€ë€ë€ë€ë€ë€ë€ë€ë‹ëyƾ€Y€¾€Y€¾€Y€»€[Š€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëŽëwº¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€²uë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ê¼…Z€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¼€Z‡€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë‘ëu°¾€Y€¾€Y€¾€Y€´€_¡€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë˜ëq—¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€•¤së€ë€ëë罄Z€°€b°€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë•ës¤¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¢€ká€ë€ë€ë€ë‚ëæ½Y€¾€Y€º€[€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë”ës§¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¼€Z‡€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë‘ëu°¾€Y€¾€Y€¾€Y€µ€_ €ë€ë€ë€ë€ë€ë€ë€ë€ë€ë”ët§¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ŠÈzë€ë€ë€ë€ë€ë€ë€ë€ë†ë}×¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€µ€^€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë˜ëq™¾€Y€¾€Y€¾€Y€®€c¸€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëŸèmƒ¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€‰Ìzë€ë€ëŠëzɾ€Y€ª€eÄ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëšëp‘¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€š’pë€ë€ë€ë€ëŠëzʾ€Y€¾€Y€´€_¤€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëšëp‘¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€µ€^€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë˜ëq™¾€Y€¾€Y€¾€Y€®€c·€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë™ëp•¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ƒà~ë€ë€ë€ë€ë€ë€ë€ë€ëŒëxÁ¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¯€b³€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëžêm„¾€Y€¾€Y€¾€Y€§€gÏ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¥Ôh€¾€Y€¾€Y€¾€Y€¾€Y€¸€]“€ë€ë€ë€ë–ër¾€Y€¤€iØ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëžëm‚¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€´vë€ë€ë€ë€ë’ëu«¾€Y€¾€Y€­€d»€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¡ål€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¯€b´€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëžém„¾€Y€¾€Y€¾€Y€¨€gÌ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëžëm„¾€Y€¾€Y€¾€Y€¾€Y€»€[‹€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë“ëtª¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¨€gÊ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¥×i€¾€Y€¾€Y€¾€Y€¡€lå€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¬¾d€¾€Y€¾€Y€¾€Y€¾€Y€¨€gÊ€ë€ë€ë€ë£Ûj€¾€Y€¡€kâ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¡äk€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€…Û}ë€ë€ë€ë€ë›ëo¾€Y€¾€Y€¦€hÑ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë§Ïg€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¨€gË€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¥×i€¾€Y€¾€Y€¾€Y€¥€iÖ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¡åk€¾€Y€¾€Y€¾€Y€¾€Y€´€_£€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë™ëp“¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¢€ká€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë«Àe€¾€Y€¾€Y€¾€Y€š‘pë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë²§`€¾€Y€¾€Y€¾€Y€¾€Y€˜—që€ë€ë€ë€ë±®b€¾€Y€Ÿ€lé€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë£Ýj€¾€Y€¾€Y€¾€Y€¾€Y€·€]—€ë€ë€ë€ë€ë€ë¤Ùi€¾€Y€¾€Y€ lç€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë®¸c€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¢€ká€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë«Àe€¾€Y€¾€Y€¾€Y€£€jÞ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë£Þj€¾€Y€¾€Y€¾€Y€¾€Y€­€c¹€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë çl¾€Y€¾€Y€¾€Y€¾€Y€´‘_‘·‘]†¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€œŠnë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë²©a€¾€Y€¾€Y€¾€Y€‘±uë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¹‘\€¾€Y€¾€Y€¾€Y€¾€Y€ˆÏ{ë€ë€ëë漆Z€¾€Y€†në€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¥×i€¾€Y€¾€Y€¾€Y€¾€Y€©€fÇ€ë€ë€ë€ë€ë€ë¯³b€¾€Y€¾€Y€™”pë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë´¡_€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€œŠnë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë²©`€¾€Y€¾€Y€¾€Y€¡€kå€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¤Øi€¾€Y€¾€Y€¾€Y€¾€Y€¨€gÍ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¦Ñh€¾€Y€¾€Y€¾€Y€¶€^š€ë€ëœêoŒ¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€—œrë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¸”]€¾€Y€¾€Y€¾€Y€…Ú}ë€ë€ë€ë€ë€ë€ë€ë€ë‚ëå¾€Y€¾€Y€¾€Y€¾€Y€²€a©€ë€ë€ë€ëëx¿¾€Y€¾€Y€œ‹oë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¤Øi€¾€Y€¾€Y€¾€Y€¾€Y€š‘oê€ë€ë€ë€ëë漇Z€¾€Y€¾€Y€“ªtë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë»‹[€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€–rë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¸“]€¾€Y€¾€Y€¾€Y€ž‚më€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¤Ùi€¾€Y€¾€Y€¾€Y€¾€Y€œ‹né€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë­»d€¾€Y€¾€Y€¾€Y€ª€eÀë€ë¨Ìg€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€’®uë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¼‡Z€¾€Y€¾€Y€¶€]™€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë‡ë{Ò¾€Y€¾€Y€¾€Y€¾€Y€›‘oç€ë€ë€ë€ëænŒ¾€Y€¾€Y€†në€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë£Ýj€¾€Y€¾€Y€¾€Y€¾€Y€ŠÉzë€ë€ë€ë€ëëw½¾€Y€¾€Y€¾€Y€ŒÁxë€ë€ë€ë€ë€ë€ë€ë€ëƒë~ß¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€‘¯uë€ë€ë€ë€ë€ë€ë€ë€ëë€é½ƒY€¾€Y€¾€Y€¾€Y€Ÿmë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¢ßj€¾€Y€¾€Y€¾€Y€¾€Y€´vë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë²¨`€¾€Y€¾€Y€¾€Y€ž†mæ€ë€ëµ _€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¹wë€ë€ë€ë€ë€ë€ë€ë€ëëé¾€Y€¾€Y€¾€Y€¥hÔ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëŒëyþ€Y€¾€Y€¾€Y€½€Z„†Ø}ë€ë€ë€ë€ë°¯b€¾€Y€¾€Y€ €lè€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë èl€¾€Y€¾€Y€¾€Y€´€_¤€ë€ë€ë€ë€ë€ë›êoŽ¾€Y€¾€Y€¾€Y€†Ø}ë€ë€ë€ë€ë€ë€ë€ë€ëŠëzȾ€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¹wë€ë€ë€ë€ë€ë€ë€ë€ëƒë~á¾€Y€¾€Y€¾€Y€¾€Y€’­uë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëên†¾€Y€¾€Y€¾€Y€»€[Šƒá~ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¶œ^€¾€Y€¾€Y€¾€Y€¾xë…ë}Ù¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ŒÀxë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¼…Z€¾€Y€¾€Y€’®uë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëëx¾¾€Y€¾€Y€¾€Y€§ƒgË€ë€ë€ë€ë†ë|×½Y€¾€Y€¾€Y€¢€kà€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë™ëp”¾€Y€¾€Y€¾€Y€nã€ë€ë€ë€ë€ë€ë«Àe€¾€Y€¾€Y€¼€Z…€ê€ë€ë€ë€ë€ë€ë€ë€ë€ëëu²¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ŒÀxë€ë€ë€ë€ë€ë€ë€ë€ë‚ëå¾€Y€¾€Y€¾€Y€¸€]•èë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë–ërŸ¾€Y€¾€Y€¾€Y€¥ƒhÒ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëµŸ_€¾€Y€¾€Y€·€]™€ë€ë•ës£¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ŒÂxë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë´¡_€¾€Y€²€`¨è€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë‡ë|Ó¾€Y€¾€Y€º€[Œ‡Ñ{ë€ë€ë€ë€ë™êq–¾€Y€¾€Y€¾€Y€©€fÈ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëŒëxÀ¾€Y€¾€Y€º€[Ž„Þ~ë€ë€ë€ë€ë„ë~Þ¼†Z€¾€Y€¾€Y€¶€^š€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë—ëq›¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ŒÂxë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¹‘\€¾€Y€¾€Y€—£qä€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëˆë{о€Y€¾€Y€»€ZˆŠÉzë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë®·c€¾€Y€¾€Y€ššpâ€ë€ë§Îg€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€Žºwë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë›Þo™·„]“¿xë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëª¹fŒ·„]“¹vå€ë€ë€ë€ë€ë€ë¬½d€¾€Y€¾€Y€¾€Y€±€a¬€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¥Âi”¸†]Ž’°tæ€ë€ë€ë€ë€ë€ë—ëqœ¾€Y€¾€Y€¾€Y€°€b±€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëëm†¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€Žºwë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë×n›»†[„¤—iÀë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë£Êj“¸ƒ]‘•­sâ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë“çt¬ºŠ[ƒªŽe´éëë€è¹\€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€‘°uë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë†ë|Õ½„Z€¾€Y€¾€Y€¾€Y€º€[Œé€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¬½d€¾€Y€¾€Y€¾€Y€©€fÇ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¤Ùi€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€‘°uë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë„ë~Þ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë†ë|×€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëëv´¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€˜™që€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë„ë}ÜŒÂxë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëŸßlŠ¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ŒÀxë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë‹ëyƽY€¾€Y€¾€Y€¾€Y€£€jÞ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëªÃe€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€˜™që€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë›æo”„Þ~ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¥Ài˜€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë©Çf€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ ‚lä€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëšçp”š‘pë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëƒë~ß¹‘\€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€Œmä€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë©Çf¾€Y€¾€Y€¾€Y€¾€Y€œŠnë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë±¬a€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ ‚lä€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€êµŸ_€’­uë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë†ë|×½ƒZ€ƒá~ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë‡ë|Ô½„Z€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€®€c·€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëë€é´¢_€¦€hÑ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¡ÙkŒ¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¶€^›è€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëŒëx½‚Y€¾€Y€¾€Y€¾€Y€¾€Y€•¡rë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¸•]€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€®€c·€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë”és¨¾€Y€¤„j×€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¡Ùk‹¾€Y€‘°uë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¦Ìh†¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¼€Z‡„Ý}ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë–çr£¾€Y€¹€\‘ƒâ~ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëŒëyü†Z€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€˜Ÿpã€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëƒë~ßµŸ_€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¸wë€ë€ë€ë€ë€ë€ë€ë€ëë轃Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¼€Z‡„Ý}ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëƒë~⶙]€¾€Y€º€\‚äë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë‡ë{Ѽ‡Z€¾€Y€©€fÆ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëêw¸¾Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€œ”nâ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë„ë}Û¸”]€¾€Y€¾€Y€œ’nã€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë„ë}ܵ _€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€»€[Š‹Æyé€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë‚ëã«»e†¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ˆÎ{ë€ë€ë€ë€ë€ë€ë€ë€ë‡ë|Ó¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€œ”nâ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë€ë¦ÆhŒ¾€Y€¾€Y€¾€Y€ž’mÜ€ë€ë€ë€ë€ë€ë€ë€ë€ë€ëë髾eƒ¾€Y€¾€Y€½€Z„¾xé€ë€ë€ë€ë€ë€ë€ë€ëŠëzɹ‘\€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€º€[Œ‰Ìzë€ë€ë€ë€ë€ë€ë…ë}Ú¯±bƒ¾€Y€¾€Y€¾€Y€º€[Œºvå€ë€ë€ë€ë€ë€ë€ë€ë‡ê{Ò³¤_¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€»€[‹™³pÍ‚äë€ë€ëëéŽÝwɳ¢`‚¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€‚äë€ë€ë€ë€ë€ë€ë€ë€ëëx½¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€º€[Œ‰Ìzë€ë€ë€ë€ë€ë€ëëç£Çj–¾€Y€¾€Y€¾€Y€¾€Y€¼€Z‡¹væ€ë€ë€ë€ë€ë€ë€ë€ê§Âg¾€Y€¾€Y€¾€Y€¾€Y€¹€\•¾sЄß}é†å|ÚœÈo®»‹[€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¹€\’›²oÆ‘ÏuÌ›Âoµ¸”\€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¼€Z…¤¦i´•ÁsÍ”Ìsãºj¤¼‡Z€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¼€Z‡´Ž_”º‹[¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¹€\’›²oÆÏvÏ™Çp¸²£`†¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¼€Z†¢£j½’ÈuЖÊrÁ®©cŒ¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€¾€Y€ \ No newline at end of file diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/sdkconfig.ci.iram_safe b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/sdkconfig.ci.iram_safe new file mode 100644 index 000000000..8800405f6 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/sdkconfig.ci.iram_safe @@ -0,0 +1,10 @@ +CONFIG_COMPILER_DUMP_RTL_FILES=y +CONFIG_LCD_RGB_ISR_IRAM_SAFE=y +CONFIG_GDMA_CTRL_FUNC_IN_IRAM=y +# bounce buffer mode relies on GDMA EOF interrupt to be service-able +CONFIG_GDMA_ISR_IRAM_SAFE=y +CONFIG_COMPILER_OPTIMIZATION_NONE=y +# silent the error check, as the error string are stored in rodata, causing RTL check failure +CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT=y +# place non-ISR FreeRTOS functions in Flash +CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH=y diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/sdkconfig.ci.release b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/sdkconfig.ci.release new file mode 100644 index 000000000..91d93f163 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/sdkconfig.ci.release @@ -0,0 +1,5 @@ +CONFIG_PM_ENABLE=y +CONFIG_FREERTOS_USE_TICKLESS_IDLE=y +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT=y diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/sdkconfig.defaults b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/sdkconfig.defaults new file mode 100644 index 000000000..ccc43c6fd --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/sdkconfig.defaults @@ -0,0 +1,5 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) Project Minimal Configuration +# +# CONFIG_ESP_TASK_WDT_INIT is not set +CONFIG_FREERTOS_HZ=1000 diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/sdkconfig.defaults.esp32s3 b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/sdkconfig.defaults.esp32s3 new file mode 100644 index 000000000..36a4a647e --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/rgb_lcd/sdkconfig.defaults.esp32s3 @@ -0,0 +1,7 @@ +CONFIG_SPIRAM=y +CONFIG_SPIRAM_MODE_OCT=y +CONFIG_SPIRAM_SPEED_80M=y + +# Enable the XIP-PSRAM feature, so the ext-mem cache won't be disabled when SPI1 is operating the main flash +CONFIG_SPIRAM_FETCH_INSTRUCTIONS=y +CONFIG_SPIRAM_RODATA=y diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/CMakeLists.txt b/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/CMakeLists.txt new file mode 100644 index 000000000..3265d9a8d --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/CMakeLists.txt @@ -0,0 +1,8 @@ +# This is the project CMakeLists.txt file for the test subproject +cmake_minimum_required(VERSION 3.16) + +# "Trim" the build. Include the minimal set of components, main, and anything it depends on. +set(COMPONENTS main) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(spi_lcd_panel_test) diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/README.md b/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/README.md new file mode 100644 index 000000000..d8d99fb86 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/README.md @@ -0,0 +1,4 @@ +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | + +This test app is used to test LCDs with SPI interface. diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/main/CMakeLists.txt b/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/main/CMakeLists.txt new file mode 100644 index 000000000..72a8ae1d4 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/main/CMakeLists.txt @@ -0,0 +1,8 @@ +set(srcs "test_app_main.c" + "test_spi_lcd_panel.c") + +# In order for the cases defined by `TEST_CASE` to be linked into the final elf, +# the component can be registered as WHOLE_ARCHIVE +idf_component_register(SRCS ${srcs} + PRIV_REQUIRES esp_lcd unity driver + WHOLE_ARCHIVE) diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/main/test_app_main.c b/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/main/test_app_main.c new file mode 100644 index 000000000..5c978d553 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/main/test_app_main.c @@ -0,0 +1,51 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: CC0-1.0 + */ + +#include "unity.h" +#include "unity_test_runner.h" +#include "esp_heap_caps.h" + +// Some resources are lazy allocated in the LCD driver, the threadhold is left for that case +#define TEST_MEMORY_LEAK_THRESHOLD (-300) + +static size_t before_free_8bit; +static size_t before_free_32bit; + +static void check_leak(size_t before_free, size_t after_free, const char *type) +{ + ssize_t delta = after_free - before_free; + printf("MALLOC_CAP_%s: Before %u bytes free, After %u bytes free (delta %d)\n", type, before_free, after_free, delta); + TEST_ASSERT_MESSAGE(delta >= TEST_MEMORY_LEAK_THRESHOLD, "memory leak"); +} + +void setUp(void) +{ + before_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); + before_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); +} + +void tearDown(void) +{ + size_t after_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); + size_t after_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); + check_leak(before_free_8bit, after_free_8bit, "8BIT"); + check_leak(before_free_32bit, after_free_32bit, "32BIT"); +} + +void app_main(void) +{ + // ____ ____ ___ _ ____ ____ _____ _ + // / ___|| _ \_ _| | | / ___| _ \ |_ _|__ ___| |_ + // \___ \| |_) | | | | | | | | | | | |/ _ \/ __| __| + // ___) | __/| | | |__| |___| |_| | | | __/\__ \ |_ + // |____/|_| |___| |_____\____|____/ |_|\___||___/\__| + printf(" ____ ____ ___ _ ____ ____ _____ _\r\n"); + printf("/ ___|| _ \\_ _| | | / ___| _ \\ |_ _|__ ___| |_\r\n"); + printf("\\___ \\| |_) | | | | | | | | | | | |/ _ \\/ __| __|\r\n"); + printf(" ___) | __/| | | |__| |___| |_| | | | __/\\__ \\ |_\r\n"); + printf("|____/|_| |___| |_____\\____|____/ |_|\\___||___/\\__|\r\n"); + unity_run_menu(); +} diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/main/test_spi_board.h b/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/main/test_spi_board.h new file mode 100644 index 000000000..ec4600376 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/main/test_spi_board.h @@ -0,0 +1,51 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include "sdkconfig.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define TEST_LCD_H_RES 240 +#define TEST_LCD_V_RES 280 + +#if CONFIG_IDF_TARGET_ESP32H2 +#define TEST_LCD_BK_LIGHT_GPIO 10 +#define TEST_LCD_RST_GPIO 5 +#define TEST_LCD_CS_GPIO 3 +#define TEST_LCD_DC_GPIO 4 +#define TEST_LCD_PCLK_GPIO 2 +#define TEST_LCD_DATA0_GPIO 1 +#elif CONFIG_IDF_TARGET_ESP32C2 +#define TEST_LCD_BK_LIGHT_GPIO 18 +#define TEST_LCD_RST_GPIO 5 +#define TEST_LCD_CS_GPIO 0 +#define TEST_LCD_DC_GPIO 1 +#define TEST_LCD_PCLK_GPIO 2 +#define TEST_LCD_DATA0_GPIO 4 +#else +#define TEST_LCD_BK_LIGHT_GPIO 18 +#define TEST_LCD_RST_GPIO 5 +#define TEST_LCD_CS_GPIO 0 +#define TEST_LCD_DC_GPIO 19 +#define TEST_LCD_PCLK_GPIO 2 +#define TEST_LCD_DATA0_GPIO 4 +#define TEST_LCD_DATA1_GPIO 7 +#define TEST_LCD_DATA2_GPIO 8 +#define TEST_LCD_DATA3_GPIO 9 +#define TEST_LCD_DATA4_GPIO 10 +#define TEST_LCD_DATA5_GPIO 11 +#define TEST_LCD_DATA6_GPIO 12 +#define TEST_LCD_DATA7_GPIO 13 +#endif + +#define TEST_LCD_PIXEL_CLOCK_HZ (20 * 1000 * 1000) + +#ifdef __cplusplus +} +#endif diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/main/test_spi_lcd_panel.c b/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/main/test_spi_lcd_panel.c new file mode 100644 index 000000000..eb40f3dcf --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/main/test_spi_lcd_panel.c @@ -0,0 +1,278 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include "sdkconfig.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "unity.h" +#include "driver/spi_master.h" +#include "driver/gpio.h" +#include "esp_lcd_panel_io.h" +#include "esp_lcd_panel_vendor.h" +#include "esp_lcd_panel_ops.h" +#include "esp_lcd_panel_commands.h" +#include "soc/soc_caps.h" +#include "test_spi_board.h" + +#define TEST_SPI_HOST_ID SPI2_HOST + +void test_spi_lcd_common_initialize(esp_lcd_panel_io_handle_t *io_handle, esp_lcd_panel_io_color_trans_done_cb_t on_color_trans_done, + void *user_data, int cmd_bits, int param_bits, bool oct_mode) +{ + // turn off backlight + gpio_config_t bk_gpio_config = { + .mode = GPIO_MODE_OUTPUT, + .pin_bit_mask = 1ULL << TEST_LCD_BK_LIGHT_GPIO + }; + TEST_ESP_OK(gpio_config(&bk_gpio_config)); + gpio_set_level(TEST_LCD_BK_LIGHT_GPIO, 0); + + spi_bus_config_t buscfg = { + .sclk_io_num = TEST_LCD_PCLK_GPIO, + .mosi_io_num = TEST_LCD_DATA0_GPIO, + .miso_io_num = -1, + .quadwp_io_num = -1, + .quadhd_io_num = -1, + .max_transfer_sz = 100 * 100 * sizeof(uint16_t), + }; +#if SOC_SPI_SUPPORT_OCT + if (oct_mode) { + buscfg.data1_io_num = TEST_LCD_DATA1_GPIO; + buscfg.data2_io_num = TEST_LCD_DATA2_GPIO; + buscfg.data3_io_num = TEST_LCD_DATA3_GPIO; + buscfg.data4_io_num = TEST_LCD_DATA4_GPIO; + buscfg.data5_io_num = TEST_LCD_DATA5_GPIO; + buscfg.data6_io_num = TEST_LCD_DATA6_GPIO; + buscfg.data7_io_num = TEST_LCD_DATA7_GPIO; + buscfg.flags = SPICOMMON_BUSFLAG_OCTAL; + } +#endif + TEST_ESP_OK(spi_bus_initialize(TEST_SPI_HOST_ID, &buscfg, SPI_DMA_CH_AUTO)); + + esp_lcd_panel_io_spi_config_t io_config = { + .dc_gpio_num = TEST_LCD_DC_GPIO, + .cs_gpio_num = TEST_LCD_CS_GPIO, + .pclk_hz = TEST_LCD_PIXEL_CLOCK_HZ, + .spi_mode = 0, + .trans_queue_depth = 10, + .lcd_cmd_bits = cmd_bits, + .lcd_param_bits = param_bits, + .on_color_trans_done = on_color_trans_done, + .user_ctx = user_data, + }; +#if SOC_SPI_SUPPORT_OCT + if (oct_mode) { + io_config.flags.octal_mode = 1; + io_config.spi_mode = 3; + } +#endif + TEST_ESP_OK(esp_lcd_new_panel_io_spi((esp_lcd_spi_bus_handle_t)TEST_SPI_HOST_ID, &io_config, io_handle)); +} + +#define TEST_IMG_SIZE (200 * 200 * sizeof(uint16_t)) + +static void lcd_panel_test(esp_lcd_panel_io_handle_t io_handle, esp_lcd_panel_handle_t panel_handle) +{ + uint8_t *img = heap_caps_malloc(TEST_IMG_SIZE, MALLOC_CAP_DMA); + TEST_ASSERT_NOT_NULL(img); + + esp_lcd_panel_reset(panel_handle); + esp_lcd_panel_init(panel_handle); + esp_lcd_panel_invert_color(panel_handle, true); + // the gap is LCD panel specific, even panels with the same driver IC, can have different gap value + esp_lcd_panel_set_gap(panel_handle, 0, 20); + // turn on display + esp_lcd_panel_disp_on_off(panel_handle, true); + // turn on backlight + gpio_set_level(TEST_LCD_BK_LIGHT_GPIO, 1); + + for (int i = 0; i < 100; i++) { + uint8_t color_byte = rand() & 0xFF; + int x_start = rand() % (TEST_LCD_H_RES - 200); + int y_start = rand() % (TEST_LCD_V_RES - 200); + memset(img, color_byte, TEST_IMG_SIZE); + esp_lcd_panel_draw_bitmap(panel_handle, x_start, y_start, x_start + 200, y_start + 200, img); + } + + printf("go into sleep mode\r\n"); + esp_lcd_panel_disp_sleep(panel_handle, true); + vTaskDelay(pdMS_TO_TICKS(500)); + printf("exit sleep mode\r\n"); + esp_lcd_panel_disp_sleep(panel_handle, false); + + for (int i = 0; i < 100; i++) { + uint8_t color_byte = rand() & 0xFF; + int x_start = rand() % (TEST_LCD_H_RES - 200); + int y_start = rand() % (TEST_LCD_V_RES - 200); + memset(img, color_byte, TEST_IMG_SIZE); + esp_lcd_panel_draw_bitmap(panel_handle, x_start, y_start, x_start + 200, y_start + 200, img); + } + + printf("turn off the panel\r\n"); + esp_lcd_panel_disp_on_off(panel_handle, false); + TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); + TEST_ESP_OK(esp_lcd_panel_io_del(io_handle)); + TEST_ESP_OK(spi_bus_free(TEST_SPI_HOST_ID)); + TEST_ESP_OK(gpio_reset_pin(TEST_LCD_BK_LIGHT_GPIO)); + free(img); +} + +TEST_CASE("lcd_panel_spi_io_test", "[lcd]") +{ + esp_lcd_panel_io_handle_t io_handle = NULL; + test_spi_lcd_common_initialize(&io_handle, NULL, NULL, 8, 8, false); + esp_lcd_panel_io_tx_param(io_handle, 0x1A, NULL, 0); + esp_lcd_panel_io_tx_param(io_handle, 0x1B, (uint8_t[]) { + 0x11, 0x22, 0x33 + }, 3); + esp_lcd_panel_io_tx_param(io_handle, 0x1C, NULL, 0); + TEST_ESP_OK(esp_lcd_panel_io_del(io_handle)); + TEST_ESP_OK(spi_bus_free(TEST_SPI_HOST_ID)); + + test_spi_lcd_common_initialize(&io_handle, NULL, NULL, 16, 16, false); + esp_lcd_panel_io_tx_param(io_handle, 0x1A01, NULL, 0); + esp_lcd_panel_io_tx_param(io_handle, 0x1B02, (uint16_t[]) { + 0x11, 0x22, 0x33 + }, 6); + esp_lcd_panel_io_tx_param(io_handle, 0x1C03, NULL, 0); + TEST_ESP_OK(esp_lcd_panel_io_del(io_handle)); + TEST_ESP_OK(spi_bus_free(TEST_SPI_HOST_ID)); + +#if SOC_SPI_SUPPORT_OCT + test_spi_lcd_common_initialize(&io_handle, NULL, NULL, 8, 8, true); + esp_lcd_panel_io_tx_param(io_handle, 0x1A, NULL, 0); + esp_lcd_panel_io_tx_param(io_handle, 0x1B, (uint8_t[]) { + 0x11, 0x22, 0x33 + }, 3); + esp_lcd_panel_io_tx_param(io_handle, 0x1C, NULL, 0); + TEST_ESP_OK(esp_lcd_panel_io_del(io_handle)); + TEST_ESP_OK(spi_bus_free(TEST_SPI_HOST_ID)); + + test_spi_lcd_common_initialize(&io_handle, NULL, NULL, 16, 16, true); + esp_lcd_panel_io_tx_param(io_handle, 0x1A01, NULL, 0); + esp_lcd_panel_io_tx_param(io_handle, 0x1B02, (uint16_t[]) { + 0x11, 0x22, 0x33 + }, 6); + esp_lcd_panel_io_tx_param(io_handle, 0x1C03, NULL, 0); + TEST_ESP_OK(esp_lcd_panel_io_del(io_handle)); + TEST_ESP_OK(spi_bus_free(TEST_SPI_HOST_ID)); +#endif // SOC_SPI_SUPPORT_OCT +} + +#if SOC_SPI_SUPPORT_OCT +TEST_CASE("lcd_panel_with_8-line_spi_interface_(st7789)", "[lcd]") +{ + esp_lcd_panel_io_handle_t io_handle = NULL; + esp_lcd_panel_handle_t panel_handle = NULL; + test_spi_lcd_common_initialize(&io_handle, NULL, NULL, 8, 8, true); + esp_lcd_panel_dev_config_t panel_config = { + .reset_gpio_num = TEST_LCD_RST_GPIO, + .rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB, + .bits_per_pixel = 16, + }; + TEST_ESP_OK(esp_lcd_new_panel_st7789(io_handle, &panel_config, &panel_handle)); + lcd_panel_test(io_handle, panel_handle); +} + +TEST_CASE("lcd_panel_with_8-line_spi_interface_(nt35510)", "[lcd]") +{ + esp_lcd_panel_io_handle_t io_handle = NULL; + esp_lcd_panel_handle_t panel_handle = NULL; + test_spi_lcd_common_initialize(&io_handle, NULL, NULL, 16, 16, true); + esp_lcd_panel_dev_config_t panel_config = { + .reset_gpio_num = TEST_LCD_RST_GPIO, + .rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB, + .bits_per_pixel = 16, + }; + TEST_ESP_OK(esp_lcd_new_panel_nt35510(io_handle, &panel_config, &panel_handle)); + lcd_panel_test(io_handle, panel_handle); +} +#endif // SOC_SPI_SUPPORT_OCT + +TEST_CASE("lcd_panel_with_1-line_spi_interface_(st7789)", "[lcd]") +{ + esp_lcd_panel_io_handle_t io_handle = NULL; + esp_lcd_panel_handle_t panel_handle = NULL; + test_spi_lcd_common_initialize(&io_handle, NULL, NULL, 8, 8, false); + esp_lcd_panel_dev_config_t panel_config = { + .reset_gpio_num = TEST_LCD_RST_GPIO, + .rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB, + .bits_per_pixel = 16, + }; + TEST_ESP_OK(esp_lcd_new_panel_st7789(io_handle, &panel_config, &panel_handle)); + lcd_panel_test(io_handle, panel_handle); +} + +TEST_CASE("spi_lcd_send_colors_to_fixed_region", "[lcd]") +{ + int x_start = 100; + int y_start = 100; + int x_end = 200; + int y_end = 200; + size_t color_size = (x_end - x_start) * (y_end - y_start) * 2; + void *color_data = malloc(color_size); + TEST_ASSERT_NOT_NULL(color_data); + uint8_t color_byte = rand() & 0xFF; + memset(color_data, color_byte, color_size); + + esp_lcd_panel_io_handle_t io_handle = NULL; + esp_lcd_panel_handle_t panel_handle = NULL; + test_spi_lcd_common_initialize(&io_handle, NULL, NULL, 8, 8, false); + + // we don't use the panel handle in this test, creating the panel just for a quick initialization + esp_lcd_panel_dev_config_t panel_config = { + .reset_gpio_num = TEST_LCD_RST_GPIO, + .rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB, + .bits_per_pixel = 16, + }; + TEST_ESP_OK(esp_lcd_new_panel_st7789(io_handle, &panel_config, &panel_handle)); + esp_lcd_panel_reset(panel_handle); + esp_lcd_panel_init(panel_handle); + esp_lcd_panel_invert_color(panel_handle, true); + // the gap is LCD panel specific, even panels with the same driver IC, can have different gap value + esp_lcd_panel_set_gap(panel_handle, 0, 20); + // turn on display + esp_lcd_panel_disp_on_off(panel_handle, true); + // turn on backlight + gpio_set_level(TEST_LCD_BK_LIGHT_GPIO, 1); + + printf("set the flush window for only once\r\n"); + esp_lcd_panel_io_tx_param(io_handle, LCD_CMD_CASET, (uint8_t[]) { + (x_start >> 8) & 0xFF, + x_start & 0xFF, + ((x_end - 1) >> 8) & 0xFF, + (x_end - 1) & 0xFF, + }, 4); + esp_lcd_panel_io_tx_param(io_handle, LCD_CMD_RASET, (uint8_t[]) { + (y_start >> 8) & 0xFF, + y_start & 0xFF, + ((y_end - 1) >> 8) & 0xFF, + (y_end - 1) & 0xFF, + }, 4); + esp_lcd_panel_io_tx_param(io_handle, LCD_CMD_RAMWR, NULL, 0); + + printf("send colors to the fixed region in multiple steps\r\n"); + const int steps = 10; + int color_size_per_step = color_size / steps; + for (int i = 0; i < steps; i++) { + TEST_ESP_OK(esp_lcd_panel_io_tx_color(io_handle, -1, color_data + i * color_size_per_step, color_size_per_step)); + } + vTaskDelay(pdMS_TO_TICKS(1000)); + + printf("change to another color\r\n"); + color_byte = rand() & 0xFF; + memset(color_data, color_byte, color_size); + for (int i = 0; i < steps; i++) { + TEST_ESP_OK(esp_lcd_panel_io_tx_color(io_handle, -1, color_data + i * color_size_per_step, color_size_per_step)); + } + vTaskDelay(pdMS_TO_TICKS(1000)); + + TEST_ESP_OK(esp_lcd_panel_del(panel_handle)); + TEST_ESP_OK(esp_lcd_panel_io_del(io_handle)); + TEST_ESP_OK(spi_bus_free(TEST_SPI_HOST_ID)); + free(color_data); +} diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/pytest_spi_lcd.py b/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/pytest_spi_lcd.py new file mode 100644 index 000000000..b6590fc4c --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/pytest_spi_lcd.py @@ -0,0 +1,18 @@ +# SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: CC0-1.0 + +import pytest +from pytest_embedded import Dut + + +@pytest.mark.supported_targets +@pytest.mark.generic +@pytest.mark.parametrize( + 'config', + [ + 'release', + ], + indirect=True, +) +def test_spi_lcd(dut: Dut) -> None: + dut.run_all_single_board_cases() diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/sdkconfig.ci.release b/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/sdkconfig.ci.release new file mode 100644 index 000000000..3cff15d49 --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/sdkconfig.ci.release @@ -0,0 +1,3 @@ +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT=y diff --git a/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/sdkconfig.defaults b/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/sdkconfig.defaults new file mode 100644 index 000000000..ccc43c6fd --- /dev/null +++ b/tulip/esp32s3/components/esp_lcd/test_apps/spi_lcd/sdkconfig.defaults @@ -0,0 +1,5 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) Project Minimal Configuration +# +# CONFIG_ESP_TASK_WDT_INIT is not set +CONFIG_FREERTOS_HZ=1000 diff --git a/tulip/shared/editor.c b/tulip/shared/editor.c index f992a60af..62d89a787 100644 --- a/tulip/shared/editor.c +++ b/tulip/shared/editor.c @@ -408,9 +408,9 @@ void editor_save() { } text[c++] = '\n'; } - display_stop(); + //display_stop(); write_file(fn, (uint8_t*)text, c, 0); - display_start(); + //display_start(); dirty = 0; editor_free(text); } else { diff --git a/tulip/tulipcc_r10/CMakeLists.txt b/tulip/tulipcc_r10/CMakeLists.txt index 3b64799e2..e29f25aa8 100644 --- a/tulip/tulipcc_r10/CMakeLists.txt +++ b/tulip/tulipcc_r10/CMakeLists.txt @@ -55,7 +55,7 @@ set(SDKCONFIG_DEFAULTS ${CMAKE_BINARY_DIR}/sdkconfig.combined) include($ENV{IDF_PATH}/tools/cmake/project.cmake) # Set the location of the main component for the project (one per target). -set(EXTRA_COMPONENT_DIRS main) +set(EXTRA_COMPONENT_DIRS main ../esp32s3/components) # Define the project. project(micropython) diff --git a/tulip/tulipcc_r10/boards/TULIP4_N16R8/sdkconfig.board b/tulip/tulipcc_r10/boards/TULIP4_N16R8/sdkconfig.board index ee053f54f..4805e4671 100644 --- a/tulip/tulipcc_r10/boards/TULIP4_N16R8/sdkconfig.board +++ b/tulip/tulipcc_r10/boards/TULIP4_N16R8/sdkconfig.board @@ -8,4 +8,13 @@ CONFIG_ESPTOOLPY_FLASHFREQ_120M=y CONFIG_ESPTOOLPY_FLASHFREQ="120m" CONFIG_ESPTOOLPY_OCT_FLASH=n CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="../esp32s3/boards/TULIP4_N16R8/tulip-partitions-16MB.csv" + +# These help the screen, see https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/api-reference/peripherals/lcd.html#bounce-buffer-with-single-psram-frame-buffer +CONFIG_SPIRAM_FETCH_INSTRUCTIONS=y +CONFIG_SPIRAM_RODATA=y + +CONFIG_LCD_RGB_RESTART_IN_VSYNC=y +CONFIG_LCD_RGB_ISR_IRAM_SAFE=y + +# You'd have this on if you were using native USB for a REPL #CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=y diff --git a/tulip/tulipcc_r10/main.c b/tulip/tulipcc_r10/main.c index 4a3cb2097..f03d3b52d 100644 --- a/tulip/tulipcc_r10/main.c +++ b/tulip/tulipcc_r10/main.c @@ -217,7 +217,7 @@ void mp_task(void *pvParameter) { heap_caps_register_failed_alloc_callback(esp_alloc_failed); uint32_t caps = MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM; - size_t mp_task_heap_size = 4 * 1024 * 1024; // MIN(heap_caps_get_largest_free_block(caps), heap_total / 2); + size_t mp_task_heap_size = 2 * 1024 * 1024; // MIN(heap_caps_get_largest_free_block(caps), heap_total / 2); void *mp_task_heap = heap_caps_malloc(mp_task_heap_size, caps); soft_reset: diff --git a/tulip/tulipcc_r10/tulipcc_r10_display.c b/tulip/tulipcc_r10/tulipcc_r10_display.c index b94a5eba5..284c6d9a8 100644 --- a/tulip/tulipcc_r10/tulipcc_r10_display.c +++ b/tulip/tulipcc_r10/tulipcc_r10_display.c @@ -29,47 +29,28 @@ void esp32s3_display_restart() { } bool IRAM_ATTR display_bounce_empty(esp_lcd_panel_handle_t panel, void *bounce_buf, int pos_px, int len_bytes, void *user_ctx) { - //int64_t tic=get_time_us(); // start the timer - // Which pixel row and TFB row is this - //struct display_data * dd = (struct display_data *)user_ctx; - - uint16_t starting_display_row_px = pos_px / H_RES; - uint8_t bounce_total_rows_px = len_bytes / H_RES / BYTES_PER_PIXEL; - // compute the starting TFB row offset + uint8_t bounce_total_rows_px = len_bytes / H_RES; uint8_t * b = (uint8_t*)bounce_buf; - //int16_t touch_x = last_touch_x[0]; - //int16_t touch_y = last_touch_y[0]; - //uint8_t touch_held_local = touch_held; - - - // Copy in the BG, line by line - // 208uS per call at 6 lines RGB565 - // 209uS per call at 12 lines RGB332 - // 416uS per call at 12 lines RGB565 for(uint8_t rows_relative_px=0;rows_relative_px