From 1f388afcf29a0e6e998c9e9f04dabc39e1ec609c Mon Sep 17 00:00:00 2001 From: forum_service Date: Mon, 28 Aug 2023 19:47:37 +0800 Subject: [PATCH] u-boot: version release v4.1.0.3 fa813205bd Merge "[eth] change rxterm and vcm to link DianXin router" into v4.1.0 956d3a3198 [eth] change rxterm and vcm to link DianXin router 9e6d7e0dd8 [audio][uboot] add play Change-Id: I6a23283cc4033f4032f0161d4ba5b9339e8f9952 --- u-boot-2021.10/cmd/Kconfig | 6 + u-boot-2021.10/cmd/Makefile | 1 + u-boot-2021.10/cmd/cvisound.c | 51 ++ u-boot-2021.10/drivers/Kconfig | 1 + u-boot-2021.10/drivers/Makefile | 3 +- u-boot-2021.10/drivers/cvi_sound/Kconfig | 13 + u-boot-2021.10/drivers/cvi_sound/Makefile | 10 + .../drivers/cvi_sound/cvi-dac-uclass.c | 34 + u-boot-2021.10/drivers/cvi_sound/cvi-dac.c | 370 ++++++++ u-boot-2021.10/drivers/cvi_sound/cvi-dac.h | 806 ++++++++++++++++++ .../drivers/cvi_sound/cvi-i2s-uclass.c | 27 + u-boot-2021.10/drivers/cvi_sound/cvi-i2s.c | 591 +++++++++++++ u-boot-2021.10/drivers/cvi_sound/cvi-i2s.h | 316 +++++++ .../drivers/cvi_sound/cvi-sound-uclass.c | 8 + u-boot-2021.10/drivers/cvi_sound/cvi-sound.c | 97 +++ u-boot-2021.10/drivers/cvi_sound/cvi-src.h | 9 + u-boot-2021.10/drivers/mmc/Makefile | 1 + u-boot-2021.10/drivers/net/phy/cvitek.c | 35 +- u-boot-2021.10/include/audio_codec.h | 4 + 19 files changed, 2365 insertions(+), 18 deletions(-) create mode 100644 u-boot-2021.10/cmd/cvisound.c create mode 100644 u-boot-2021.10/drivers/cvi_sound/Kconfig create mode 100644 u-boot-2021.10/drivers/cvi_sound/Makefile create mode 100644 u-boot-2021.10/drivers/cvi_sound/cvi-dac-uclass.c create mode 100644 u-boot-2021.10/drivers/cvi_sound/cvi-dac.c create mode 100644 u-boot-2021.10/drivers/cvi_sound/cvi-dac.h create mode 100644 u-boot-2021.10/drivers/cvi_sound/cvi-i2s-uclass.c create mode 100644 u-boot-2021.10/drivers/cvi_sound/cvi-i2s.c create mode 100644 u-boot-2021.10/drivers/cvi_sound/cvi-i2s.h create mode 100644 u-boot-2021.10/drivers/cvi_sound/cvi-sound-uclass.c create mode 100644 u-boot-2021.10/drivers/cvi_sound/cvi-sound.c create mode 100644 u-boot-2021.10/drivers/cvi_sound/cvi-src.h diff --git a/u-boot-2021.10/cmd/Kconfig b/u-boot-2021.10/cmd/Kconfig index 152a86f8a..102d5d7c9 100644 --- a/u-boot-2021.10/cmd/Kconfig +++ b/u-boot-2021.10/cmd/Kconfig @@ -2418,6 +2418,12 @@ config CMD_CVI_JPEG and decode jpg file to yuv format to the destination address +config CMD_CVISOUND + bool "CVI sound" + help + Support for the audio play + + config CMD_CVI_UPDATE bool "cvitek update command" default y diff --git a/u-boot-2021.10/cmd/Makefile b/u-boot-2021.10/cmd/Makefile index fa9ad76f9..bf3fc33a2 100644 --- a/u-boot-2021.10/cmd/Makefile +++ b/u-boot-2021.10/cmd/Makefile @@ -206,6 +206,7 @@ obj-$(CONFIG_CMD_AVB) += avb.o obj-$(CONFIG_CMD_SCP03) += scp03.o obj-y += efuse.o +obj-$(CONFIG_CMD_CVISOUND) += cvisound.o obj-$(CONFIG_ARM) += arm/ obj-$(CONFIG_RISCV) += riscv/ diff --git a/u-boot-2021.10/cmd/cvisound.c b/u-boot-2021.10/cmd/cvisound.c new file mode 100644 index 000000000..afe27e99e --- /dev/null +++ b/u-boot-2021.10/cmd/cvisound.c @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * (C) Copyright 2023 bitmain, Inc + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include "../drivers/cvi_sound/cvi-src.h" + +static int do_play(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) +{ + int ret = 0; + struct udevice *dev; + const struct sound_ops *ops; + + printf("enter cviplay\n"); + ret = uclass_get_device_by_driver(UCLASS_SOUND, DM_DRIVER_GET(cvitekub_sound), &dev); + if (ret) { + printf("[error][%s]no cvitekub_sound device ret:%d\n", __func__, ret); + return -1; + } + ops = dev->driver->ops; + if (!ops->setup || !ops->play || !ops->stop_play) { + printf("[error][%s]setup:%p, play:%p, stop_play:%p\n", + __func__, ops->setup, ops->play, ops->stop_play); + return -1; + } + ops->setup(dev); + ret = ops->play(dev, src_tx_data, SRC_BUFF_SIZE); + //printf("UPDATE_ADDR:%ld\n", (uintptr_t)UPDATE_ADDR); + //ret = ops->play(dev, (void *)(uintptr_t)UPDATE_ADDR, 726904); + if (ret) { + printf("[error][%s]play error:%d\n", __func__, ret); + return -1; + } + + ops->stop_play(dev); + + return 0; +} + +U_BOOT_CMD(cviplay, 1, 1, do_play, + "perform cviplay", + "play sound\n" +); diff --git a/u-boot-2021.10/drivers/Kconfig b/u-boot-2021.10/drivers/Kconfig index 417d6f88c..19901778e 100644 --- a/u-boot-2021.10/drivers/Kconfig +++ b/u-boot-2021.10/drivers/Kconfig @@ -109,6 +109,7 @@ source "drivers/serial/Kconfig" source "drivers/smem/Kconfig" source "drivers/sound/Kconfig" +source "drivers/cvi_sound/Kconfig" source "drivers/soc/Kconfig" diff --git a/u-boot-2021.10/drivers/Makefile b/u-boot-2021.10/drivers/Makefile index 53952292e..3cc03cbc4 100644 --- a/u-boot-2021.10/drivers/Makefile +++ b/u-boot-2021.10/drivers/Makefile @@ -72,9 +72,10 @@ ifdef CONFIG_TPL_BUILD obj-$(CONFIG_TPL_BOOTCOUNT_LIMIT) += bootcount/ obj-$(CONFIG_TPL_MPC8XXX_INIT_DDR_SUPPORT) += ddr/fsl/ - endif +obj-y += cvi_sound/ + ifeq ($(CONFIG_SPL_BUILD)$(CONFIG_TPL_BUILD),) obj-y += adc/ diff --git a/u-boot-2021.10/drivers/cvi_sound/Kconfig b/u-boot-2021.10/drivers/cvi_sound/Kconfig new file mode 100644 index 000000000..94849cc00 --- /dev/null +++ b/u-boot-2021.10/drivers/cvi_sound/Kconfig @@ -0,0 +1,13 @@ +menu "Cvitek Sound support" + +config CVI_SOUND_DRIVERS + bool "Enable cvitek sound support" + help + Support making sounds through an audio codec. This is normally a + beep at a chosen frequency for a selected length of time. However + the drivers support playing arbitrary sound samples using a + PCM interface. + + +endmenu + diff --git a/u-boot-2021.10/drivers/cvi_sound/Makefile b/u-boot-2021.10/drivers/cvi_sound/Makefile new file mode 100644 index 000000000..8f026dd5f --- /dev/null +++ b/u-boot-2021.10/drivers/cvi_sound/Makefile @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: GPL-2.0+ +# +# Copyright (C) 2023 Bitmain +# +obj-$(CONFIG_CVI_SOUND_DRIVERS) += cvi-sound.o +obj-$(CONFIG_CVI_SOUND_DRIVERS) += cvi-sound-uclass.o +obj-$(CONFIG_CVI_SOUND_DRIVERS) += cvi-dac-uclass.o +obj-$(CONFIG_CVI_SOUND_DRIVERS) += cvi-dac.o +obj-$(CONFIG_CVI_SOUND_DRIVERS) += cvi-i2s-uclass.o +obj-$(CONFIG_CVI_SOUND_DRIVERS) += cvi-i2s.o diff --git a/u-boot-2021.10/drivers/cvi_sound/cvi-dac-uclass.c b/u-boot-2021.10/drivers/cvi_sound/cvi-dac-uclass.c new file mode 100644 index 000000000..35a024223 --- /dev/null +++ b/u-boot-2021.10/drivers/cvi_sound/cvi-dac-uclass.c @@ -0,0 +1,34 @@ +#define LOG_CATEGORY UCLASS_AUDIO_CODEC + +#include +#include +#include "cvi-dac.h" +#include +#include + +int audio_codec_set_params(struct udevice *dev, int interface, int rate, + int mclk_freq, int bits_per_sample, uint channels) +{ + struct audio_codec_ops *ops = audio_codec_get_ops(dev); + + if (!ops->set_params) + return -ENOSYS; + + return ops->set_params(dev, interface, rate, mclk_freq, bits_per_sample, + channels); +} + +int audio_codec_close(struct udevice *dev) +{ + struct audio_codec_ops *ops = audio_codec_get_ops(dev); + + if (!ops->codec_close) + return -ENOSYS; + + return ops->codec_close(dev); +} + +UCLASS_DRIVER(audio_codec) = { + .id = UCLASS_AUDIO_CODEC, + .name = "audio-codec", +}; diff --git a/u-boot-2021.10/drivers/cvi_sound/cvi-dac.c b/u-boot-2021.10/drivers/cvi_sound/cvi-dac.c new file mode 100644 index 000000000..1daa80128 --- /dev/null +++ b/u-boot-2021.10/drivers/cvi_sound/cvi-dac.c @@ -0,0 +1,370 @@ +#include +#include "cvi-dac.h" +#include +#include + +struct cvitekdac_priv { + //enum maxim_codec_type devtype; + unsigned int sysclk; + unsigned int rate; + unsigned int fmt; + struct udevice *dev; +}; + +static struct cv182xdac g_dac; +static struct cv182xdac *dac; + +static int cv182xdac_hw_params(struct cv182xdac *dac, u32 chan_nr, u32 rate) +{ + + u32 ctrl1 = dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_CTRL1) & ~AUDIO_PHY_REG_TXDAC_CIC_OPT_MASK; + u32 tick = dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_AFE0) & ~AUDIO_PHY_REG_TXDAC_INIT_DLY_CNT_MASK; + u32 ana2 = dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_ANA2); + + switch (chan_nr) { + case 1: + ana2 &= AUDIO_PHY_REG_DA_DEMR_TXDAC_OW_EN_OFF; /* turn R-channel on */ + dac_write_reg(dac->dac_base, AUDIO_PHY_TXDAC_ANA2, ana2); + break; + default: + ana2 &= AUDIO_PHY_REG_DA_DEMR_TXDAC_OW_EN_OFF; /* turn R-channel on */ + dac_write_reg(dac->dac_base, AUDIO_PHY_TXDAC_ANA2, ana2); + break; + } + + if (rate >= 8000 && rate <= 48000) { + debug("%s, set rate to %d\n", __func__, rate); + + switch (rate) { + case 8000: + ctrl1 |= TXDAC_CIC_DS_512; + tick |= 0x21; + break; + case 11025: + ctrl1 |= TXDAC_CIC_DS_256; + tick |= 0x17; + break; + case 16000: + ctrl1 |= TXDAC_CIC_DS_256; + tick |= 0x21; + break; + case 22050: + ctrl1 |= TXDAC_CIC_DS_128; + tick |= 0x17; + break; + case 32000: + ctrl1 |= TXDAC_CIC_DS_128; + tick |= 0x21; + break; + case 44100: + ctrl1 &= TXDAC_CIC_DS_64; + tick |= 0x17; + break; + case 48000: + ctrl1 &= TXDAC_CIC_DS_64; + tick |= 0x19; + break; + default: + ctrl1 |= TXDAC_CIC_DS_256; + tick |= 0x21; + debug("%s, set sample rate with default 16KHz\n", __func__); + break; + } + } else { + printf("%s, unsupported sample rate\n", __func__); + return 0; + } + debug("%s, ctrl1=0x%x\n", __func__, ctrl1); + dac_write_reg(dac->dac_base, AUDIO_PHY_TXDAC_CTRL1, ctrl1); + dac_write_reg(dac->dac_base, AUDIO_PHY_TXDAC_AFE0, tick); + + return 0; +} + +static void cv182xdac_on(struct cv182xdac *dac) +{ + + u32 val = dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_CTRL0); + + debug("%s, before ctrl0_reg val=0x%08x\n", __func__, val); + + if ((val & AUDIO_PHY_REG_TXDAC_EN_ON) | (val & AUDIO_PHY_REG_I2S_RX_EN_ON)) + printf("DAC already switched ON!!, val=0x%08x\n", val); + + val |= AUDIO_PHY_REG_TXDAC_EN_ON | AUDIO_PHY_REG_I2S_RX_EN_ON; + dac_write_reg(dac->dac_base, AUDIO_PHY_TXDAC_CTRL0, val); + + debug("%s, after ctrl0_reg val=0x%08x\n", + __func__, dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_CTRL0)); +} + +static void cv182xdac_off(struct cv182xdac *dac) +{ + u32 val = dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_CTRL0); + + debug("%s, before ctrl_reg val=0x%08x\n", + __func__, dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_CTRL0)); + + val &= AUDIO_PHY_REG_TXDAC_EN_OFF & AUDIO_PHY_REG_I2S_RX_EN_OFF; + dac_write_reg(dac->dac_base, AUDIO_PHY_TXDAC_CTRL0, val); + + debug("%s, after ctrl_reg val=0x%08x\n", + __func__, dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_CTRL0)); + +} + +static void cv182xdac_shutdown(void) +{ + cv182x_reset_dac(); + cv182xdac_off(dac); + printf("%s\n", __func__); +} + + +int cv182xdac_ioctl(u32 cmd, struct cvi_vol_ctrl vol, u32 val) +{ + + u32 temp = 0; + + dac->dac_base = (volatile u32 *)(0x0300A000); + switch (cmd) { + case ACODEC_SOFT_RESET_CTRL: + cv182x_reset_dac(); + break; + + case ACODEC_SET_OUTPUT_VOL: + debug("dac: ACODEC_SET_OUTPUT_VOL with val=%d\n", val); + + if ((val < 0) | (val > 32)) + printf("Only support range 0 [mute] ~ 32 [maximum]\n"); + else { + temp = dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_AFE1) + & ~(AUDIO_PHY_REG_TXDAC_GAIN_UB_0_MASK | AUDIO_PHY_REG_TXDAC_GAIN_UB_1_MASK); + temp |= DAC_VOL_L(val) | DAC_VOL_R(val); + dac_write_reg(dac->dac_base, AUDIO_PHY_TXDAC_AFE1, temp); + } + break; + + case ACODEC_GET_OUTPUT_VOL: + debug("dac: ACODEC_GET_OUTPUT_VOL\n"); + temp = ((dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_AFE1) + & AUDIO_PHY_REG_TXDAC_GAIN_UB_0_MASK) + 1) / CV182x_DAC_VOL_STEP; + debug("dac: return val=%d\n", temp); + //_/ if (copy_to_user(argp, &temp, sizeof(temp))) + //_/ printf("dac, failed to return output vol\n"); + break; + + case ACODEC_SET_I2S1_FS: + debug("dac: ACODEC_SET_I2S1_FS is not support\n"); + break; + + case ACODEC_SET_DACL_VOL: + debug("dac: ACODEC_SET_DACL_VOL\n"); + + if (vol.vol_ctrl_mute == 1) { + temp = dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_ANA2); + temp |= AUDIO_PHY_REG_DA_DEML_TXDAC_OW_EN_ON; + dac_write_reg(dac->dac_base, AUDIO_PHY_TXDAC_ANA2, temp); + } else if ((vol.vol_ctrl < 0) | (vol.vol_ctrl > 32)) + printf("dac-L: Only support range 0 [mute] ~ 32 [maximum]\n"); + else { + temp = dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_AFE1) & ~AUDIO_PHY_REG_TXDAC_GAIN_UB_0_MASK; + temp |= DAC_VOL_L(vol.vol_ctrl); + dac_write_reg(dac->dac_base, AUDIO_PHY_TXDAC_AFE1, temp); + + temp = dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_ANA2); + temp &= AUDIO_PHY_REG_DA_DEML_TXDAC_OW_EN_OFF; + dac_write_reg(dac->dac_base, AUDIO_PHY_TXDAC_ANA2, temp); + } + break; + + case ACODEC_SET_DACR_VOL: + debug("dac: ACODEC_SET_DACR_VOL\n"); + + if (vol.vol_ctrl_mute == 1) { + temp = dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_ANA2); + temp |= AUDIO_PHY_REG_DA_DEMR_TXDAC_OW_EN_ON; + dac_write_reg(dac->dac_base, AUDIO_PHY_TXDAC_ANA2, temp); + } else if ((vol.vol_ctrl < 0) | (vol.vol_ctrl > 32)) + printf("dac-R: Only support range 0 [mute] ~ 32 [maximum]\n"); + else { + temp = dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_AFE1) & ~AUDIO_PHY_REG_TXDAC_GAIN_UB_1_MASK; + temp |= DAC_VOL_R(vol.vol_ctrl); + dac_write_reg(dac->dac_base, AUDIO_PHY_TXDAC_AFE1, temp); + + temp = dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_ANA2); + temp &= AUDIO_PHY_REG_DA_DEMR_TXDAC_OW_EN_OFF; + dac_write_reg(dac->dac_base, AUDIO_PHY_TXDAC_ANA2, temp); + } + break; + + case ACODEC_SET_DACL_MUTE: + debug("dac: ACODEC_SET_DACL_MUTE, val=%d\n", val); + temp = dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_ANA2); + if (val == 0) + temp &= AUDIO_PHY_REG_DA_DEML_TXDAC_OW_EN_OFF; + else + temp |= AUDIO_PHY_REG_DA_DEML_TXDAC_OW_EN_ON; + + dac_write_reg(dac->dac_base, AUDIO_PHY_TXDAC_ANA2, temp); + break; + case ACODEC_SET_DACR_MUTE: + debug("dac: ACODEC_SET_DACR_MUTE, val=%d\n", val); + temp = dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_ANA2); + if (val == 0) + temp &= AUDIO_PHY_REG_DA_DEMR_TXDAC_OW_EN_OFF; + else + temp |= AUDIO_PHY_REG_DA_DEMR_TXDAC_OW_EN_ON; + dac_write_reg(dac->dac_base, AUDIO_PHY_TXDAC_ANA2, temp); + break; + + case ACODEC_GET_DACL_VOL: + debug("dac: ACODEC_GET_DACL_VOL\n"); + temp = dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_ANA2); + if (temp & AUDIO_PHY_REG_DA_DEML_TXDAC_OW_EN_MASK) { + vol.vol_ctrl = 0; + vol.vol_ctrl_mute = 1; + } else { + temp = ((dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_AFE1) + & AUDIO_PHY_REG_TXDAC_GAIN_UB_0_MASK) + 1) / CV182x_DAC_VOL_STEP; + vol.vol_ctrl = temp; + vol.vol_ctrl_mute = 0; + } + //_/ if (copy_to_user(argp, &vol, sizeof(vol))) + //_/ printf("failed to return DACL vol\n"); + break; + case ACODEC_GET_DACR_VOL: + temp = dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_ANA2); + debug("dac: ACODEC_GET_DACR_VOL, txdac_ana2=0x%x\n", temp); + if (temp & AUDIO_PHY_REG_DA_DEMR_TXDAC_OW_EN_MASK) { + vol.vol_ctrl = 0; + vol.vol_ctrl_mute = 1; + } else { + temp = (((dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_AFE1) + & AUDIO_PHY_REG_TXDAC_GAIN_UB_1_MASK) >> 16) + 1) / CV182x_DAC_VOL_STEP; + vol.vol_ctrl = temp; + vol.vol_ctrl_mute = 0; + } + //_/ if (copy_to_user(argp, &vol, sizeof(vol))) + //_/ printf("failed to return DACR vol\n"); + break; + + case ACODEC_SET_PD_DACL: + debug("dac: ACODEC_SET_PD_DACL, val=%d\n", val); + if (val == 0) { + temp = dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_CTRL0); + temp &= AUDIO_PHY_REG_TXDAC_EN_ON | AUDIO_PHY_REG_I2S_RX_EN_ON; + dac_write_reg(dac->dac_base, AUDIO_PHY_TXDAC_CTRL0, temp); + } else { + temp = dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_CTRL0); + temp &= AUDIO_PHY_REG_TXDAC_EN_OFF & AUDIO_PHY_REG_I2S_RX_EN_OFF; + dac_write_reg(dac->dac_base, AUDIO_PHY_TXDAC_CTRL0, temp); + } + break; + case ACODEC_SET_PD_DACR: + debug("dac: ACODEC_SET_PD_DACR, val=%d\n", val); + if (val == 0) { + temp = dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_CTRL0); + temp &= AUDIO_PHY_REG_TXDAC_EN_ON | AUDIO_PHY_REG_I2S_RX_EN_ON; + dac_write_reg(dac->dac_base, AUDIO_PHY_TXDAC_CTRL0, temp); + } else { + temp = dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_CTRL0); + temp &= AUDIO_PHY_REG_TXDAC_EN_OFF & AUDIO_PHY_REG_I2S_RX_EN_OFF; + dac_write_reg(dac->dac_base, AUDIO_PHY_TXDAC_CTRL0, temp); + } + break; + case ACODEC_SET_DAC_DE_EMPHASIS: + debug("dac: ACODEC_SET_DAC_DE_EMPHASIS is not support\n"); + break; + default: + printf("%s, received unsupported cmd=%u\n", __func__, cmd); + break; + } + + return 0; +} + +static void dump_182xdac_reg(struct cv182xdac *dac) +{ +#ifdef __DEBUG__ +printf("AUDIO_PHY_TXDAC_CTRL0 = 0x%x \n", dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_CTRL0)); +printf("AUDIO_PHY_TXDAC_CTRL1 = 0x%x \n", dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_CTRL1)); +printf("AUDIO_PHY_TXDAC_AFE0 = 0x%x \n", dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_AFE0)); +printf("AUDIO_PHY_TXDAC_AFE1 = 0x%x \n", dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_AFE1)); +printf("AUDIO_PHY_TXDAC_ANA0 = 0x%x \n", dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_ANA0)); +printf("AUDIO_PHY_TXDAC_ANA1 = 0x%x \n", dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_ANA1)); +printf("AUDIO_PHY_TXDAC_ANA2 = 0x%x \n", dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_ANA2)); + +printf("status : \n"); +printf("AUDIO_PHY_TXDAC_ANA3 = 0x%x \n", dac_read_reg(dac->dac_base, AUDIO_PHY_TXDAC_ANA3)); +printf("AUDIO_PHY_RXADC_STATUS = 0x%x \n", dac_read_reg(dac->dac_base, AUDIO_PHY_RXADC_STATUS)); +printf("AUDIO_PHY_RXADC_ANA1 = 0x%x \n", dac_read_reg(dac->dac_base, AUDIO_PHY_RXADC_ANA1)); +printf("AUDIO_PHY_RXADC_ANA4 = 0x%x \n", dac_read_reg(dac->dac_base, AUDIO_PHY_RXADC_ANA4)); +#endif + +} + +int cvitekdac_device_init(struct cvitekdac_priv *priv) +{ + return 0; +} + +int cvitekdac_init(struct cvitekdac_priv *priv, int sample_rate, int channel) +{ + dac = &g_dac; + dac->dac_base = (volatile u32 *)(0x0300A000); + cv182xdac_shutdown(); + cv182xdac_hw_params(dac, channel, sample_rate); + cv182xdac_on(dac); + dump_182xdac_reg(dac); + + return 0; +} + +int cvitekub_dac_close(struct udevice *dev) +{ + cv182xdac_shutdown(); + return 0; +} + +static int cvitekub_dac_set_params(struct udevice *dev, int interface, int rate, + int mclk_freq, int bits_per_sample, uint channels) +{ + struct cvitekdac_priv *priv = dev_get_priv(dev); + + return cvitekdac_init(priv, rate, channels); +} + +static int cvitekub_dac_probe(struct udevice *dev) +{ + struct cvitekdac_priv *priv = dev_get_priv(dev); + int ret = 0; + + priv->dev = dev; + ret = cvitekdac_device_init(priv); + if (ret < 0) { + printf("%s:codec chip init failed\n", __func__); + return ret; + } + printf("%s\n", __func__); + return 0; +} + +static const struct audio_codec_ops cvitekub_dac_ops = { + .set_params = cvitekub_dac_set_params, + .codec_close = cvitekub_dac_close, +}; + +static const struct udevice_id cvitekub_dac_ids[] = { + { .compatible = "cvitek,cv182xadac" }, + { } +}; + +U_BOOT_DRIVER(cvitekub_dac) = { + .name = "cvitekub_dac", + .id = UCLASS_AUDIO_CODEC, + .of_match = cvitekub_dac_ids, + .probe = cvitekub_dac_probe, + .ops = &cvitekub_dac_ops, + .priv_auto = sizeof(struct cvitekdac_priv), +}; diff --git a/u-boot-2021.10/drivers/cvi_sound/cvi-dac.h b/u-boot-2021.10/drivers/cvi_sound/cvi-dac.h new file mode 100644 index 000000000..6abcc5e35 --- /dev/null +++ b/u-boot-2021.10/drivers/cvi_sound/cvi-dac.h @@ -0,0 +1,806 @@ +#ifndef __CVI_DAC_H__ +#define __CVI_DAC_H__ + +#include +#include +#include +#include + +#define CV182X_ADC_BASE_OFFSET 0x100 + +#define AUDIO_PHY_TXDAC_CTRL0 0x0 +#define AUDIO_PHY_TXDAC_CTRL1 0x4 +#define AUDIO_PHY_TXDAC_STATUS 0x8 +#define AUDIO_PHY_TXDAC_AFE0 0xc +#define AUDIO_PHY_TXDAC_AFE1 0x10 +#define AUDIO_PHY_TXDAC_ANA0 0x20 +#define AUDIO_PHY_TXDAC_ANA1 0x24 +#define AUDIO_PHY_TXDAC_ANA2 0x28 +#define AUDIO_PHY_TXDAC_ANA3 0x2c +#define AUDIO_PHY_TXDAC_TEST 0x30 +#define AUDIO_PHY_RXADC_CTRL0 (0x100 - CV182X_ADC_BASE_OFFSET) +#define AUDIO_PHY_RXADC_CTRL1 (0x104 - CV182X_ADC_BASE_OFFSET) +#define AUDIO_PHY_RXADC_STATUS (0x108 - CV182X_ADC_BASE_OFFSET) +#define AUDIO_PHY_RXADC_CLK (0x10c - CV182X_ADC_BASE_OFFSET) +#define AUDIO_PHY_RXADC_ANA0 (0x110 - CV182X_ADC_BASE_OFFSET) +#define AUDIO_PHY_RXADC_ANA1 (0x114 - CV182X_ADC_BASE_OFFSET) +#define AUDIO_PHY_RXADC_ANA2 (0x118 - CV182X_ADC_BASE_OFFSET) +#define AUDIO_PHY_RXADC_ANA3 (0x11c - CV182X_ADC_BASE_OFFSET) +#define AUDIO_PHY_RXADC_ANA4 (0x120 - CV182X_ADC_BASE_OFFSET) +#define AUDIO_PHY_RXADC_ANA5 (0x124 - CV182X_ADC_BASE_OFFSET) +#define AUDIO_PHY_RXADC_ANA6 (0x128 - CV182X_ADC_BASE_OFFSET) +#define AUDIO_PHY_GPIO_ANA (0x12c - CV182X_ADC_BASE_OFFSET) +#define AUDIO_PHY_SPARE_0 (0xff0 - CV182X_ADC_BASE_OFFSET) +#define AUDIO_PHY_SPARE_1 (0xff4 - CV182X_ADC_BASE_OFFSET) +#define AUDIO_PHY_SPARE_RO (0xff8 - CV182X_ADC_BASE_OFFSET) +#define AUDIO_PHY_DATE_CODE (0xffc - CV182X_ADC_BASE_OFFSET) + +#define AUDIO_PHY_REG_TXDAC_EN 0x0 +#define AUDIO_PHY_REG_TXDAC_EN_OFFSET 0 +#define AUDIO_PHY_REG_TXDAC_EN_MASK 0x1 +#define AUDIO_PHY_REG_TXDAC_EN_BITS 0x1 +#define AUDIO_PHY_REG_I2S_RX_EN 0x0 +#define AUDIO_PHY_REG_I2S_RX_EN_OFFSET 1 +#define AUDIO_PHY_REG_I2S_RX_EN_MASK 0x2 +#define AUDIO_PHY_REG_I2S_RX_EN_BITS 0x1 +#define AUDIO_PHY_REG_TXDAC_EN_ON 0x1 +#define AUDIO_PHY_REG_TXDAC_EN_OFF 0xFFFFFFFE +#define AUDIO_PHY_REG_I2S_RX_EN_ON 0x2 +#define AUDIO_PHY_REG_I2S_RX_EN_OFF 0xFFFFFFFD + +#define AUDIO_PHY_REG_TXDAC_CIC_OPT 0x4 +#define AUDIO_PHY_REG_TXDAC_CIC_OPT_OFFSET 0 +#define AUDIO_PHY_REG_TXDAC_CIC_OPT_MASK 0x1 +#define AUDIO_PHY_REG_TXDAC_CIC_OPT_BITS 0x1 +#define TXDAC_CIC_DS_64 0xFFFFFFFE +#define TXDAC_CIC_DS_128 0x00000001 +#define TXDAC_CIC_DS_256 0x00000002 +#define TXDAC_CIC_DS_512 0x00000003 +#define AUDIO_PHY_REG_TXDAC_FSM_SRC_SEL 0x4 +#define AUDIO_PHY_REG_TXDAC_FSM_SRC_SEL_OFFSET 1 +#define AUDIO_PHY_REG_TXDAC_FSM_SRC_SEL_MASK 0x2 +#define AUDIO_PHY_REG_TXDAC_FSM_SRC_SEL_BITS 0x1 +#define AUDIO_PHY_REG_TXDAC_INIT_DLY_CNT_MASK 0x3f +#define AUDIO_PHY_REG_TXDAC_DEM_TYPE 0x4 +#define AUDIO_PHY_REG_TXDAC_DEM_TYPE_OFFSET 4 +#define AUDIO_PHY_REG_TXDAC_DEM_TYPE_MASK 0x30 +#define AUDIO_PHY_REG_TXDAC_DEM_TYPE_BITS 0x2 +#define AUDIO_PHY_REG_TXDAC_DSM_OPT 0x4 +#define AUDIO_PHY_REG_TXDAC_DSM_OPT_OFFSET 8 +#define AUDIO_PHY_REG_TXDAC_DSM_OPT_MASK 0x100 +#define AUDIO_PHY_REG_TXDAC_DSM_OPT_BITS 0x1 +#define AUDIO_PHY_REG_TXDAC_DITHER_OPT 0x4 +#define AUDIO_PHY_REG_TXDAC_DITHER_OPT_OFFSET 12 +#define AUDIO_PHY_REG_TXDAC_DITHER_OPT_MASK 0x7000 +#define AUDIO_PHY_REG_TXDAC_DITHER_OPT_BITS 0x3 + +#define AUDIO_PHY_REG_TXDAC_FSM 0x8 +#define AUDIO_PHY_REG_TXDAC_FSM_OFFSET 0 +#define AUDIO_PHY_REG_TXDAC_FSM_MASK 0x7 +#define AUDIO_PHY_REG_TXDAC_FSM_BITS 0x3 +#define AUDIO_PHY_REG_TXDAC_AFE_FSM 0x8 +#define AUDIO_PHY_REG_TXDAC_AFE_FSM_OFFSET 4 +#define AUDIO_PHY_REG_TXDAC_AFE_FSM_MASK 0x70 +#define AUDIO_PHY_REG_TXDAC_AFE_FSM_BITS 0x3 +#define AUDIO_PHY_REG_TXDAC_GAIN0 0x8 +#define AUDIO_PHY_REG_TXDAC_GAIN0_OFFSET 8 +#define AUDIO_PHY_REG_TXDAC_GAIN0_MASK 0x1ff00 +#define AUDIO_PHY_REG_TXDAC_GAIN0_BITS 0x9 +#define AUDIO_PHY_REG_TXDAC_GAIN1 0x8 +#define AUDIO_PHY_REG_TXDAC_GAIN1_OFFSET 20 +#define AUDIO_PHY_REG_TXDAC_GAIN1_MASK 0x1ff00000 +#define AUDIO_PHY_REG_TXDAC_GAIN1_BITS 0x9 +#define AUDIO_PHY_REG_TXDAC_TICK_NUM 0xc +#define AUDIO_PHY_REG_TXDAC_TICK_NUM_OFFSET 0 +#define AUDIO_PHY_REG_TXDAC_TICK_NUM_MASK 0xff +#define AUDIO_PHY_REG_TXDAC_TICK_NUM_BITS 0x8 + +#define AUDIO_PHY_REG_TXDAC_GAIN_UB_0 0x10 +#define AUDIO_PHY_REG_TXDAC_GAIN_UB_0_OFFSET 0 +#define AUDIO_PHY_REG_TXDAC_GAIN_UB_0_MASK 0x1ff +#define AUDIO_PHY_REG_TXDAC_GAIN_UB_0_BITS 0x9 +#define AUDIO_PHY_REG_TXDAC_GAIN_UB_1 0x10 +#define AUDIO_PHY_REG_TXDAC_GAIN_UB_1_OFFSET 16 +#define AUDIO_PHY_REG_TXDAC_GAIN_UB_1_MASK 0x1ff0000 +#define AUDIO_PHY_REG_TXDAC_GAIN_UB_1_BITS 0x9 +#define AUDIO_PHY_REG_TXDAC_RAMP_BP 0x10 +#define AUDIO_PHY_REG_TXDAC_RAMP_BP_OFFSET 28 +#define AUDIO_PHY_REG_TXDAC_RAMP_BP_MASK 0x10000000 +#define AUDIO_PHY_REG_TXDAC_RAMP_BP_BITS 0x1 + +#define AUDIO_PHY_REG_ADDI_TXDAC 0x20 +#define AUDIO_PHY_REG_ADDI_TXDAC_OFFSET 0 +#define AUDIO_PHY_REG_ADDI_TXDAC_MASK 0x1 +#define AUDIO_PHY_REG_ADDI_TXDAC_BITS 0x1 +#define ADDI_TXDAC_GAIN_RATIO_1 0xFFFFFFFE +#define ADDI_TXDAC_GAIN_RATIO_2_5 0x00000001 +#define AUDIO_PHY_REG_TSEL_TXDAC 0x20 +#define AUDIO_PHY_REG_TSEL_TXDAC_OFFSET 4 +#define AUDIO_PHY_REG_TSEL_TXDAC_MASK 0x30 +#define AUDIO_PHY_REG_TSEL_TXDAC_BITS 0x2 +#define AUDIO_PHY_REG_VSEL_TXDAC 0x20 +#define AUDIO_PHY_REG_VSEL_TXDAC_OFFSET 8 +#define AUDIO_PHY_REG_VSEL_TXDAC_MASK 0x300 +#define AUDIO_PHY_REG_VSEL_TXDAC_BITS 0x2 + +#define AUDIO_PHY_REG_DA_EN_TXDAC_OW_VAL 0x24 +#define AUDIO_PHY_REG_DA_EN_TXDAC_OW_VAL_OFFSET 0 +#define AUDIO_PHY_REG_DA_EN_TXDAC_OW_VAL_MASK 0x1 +#define AUDIO_PHY_REG_DA_EN_TXDAC_OW_VAL_BITS 0x1 +#define AUDIO_PHY_REG_DA_END2US_TXDAC_OW_VAL 0x24 +#define AUDIO_PHY_REG_DA_END2US_TXDAC_OW_VAL_OFFSET 1 +#define AUDIO_PHY_REG_DA_END2US_TXDAC_OW_VAL_MASK 0x2 +#define AUDIO_PHY_REG_DA_END2US_TXDAC_OW_VAL_BITS 0x1 +#define AUDIO_PHY_REG_DA_EN_TXDAC_OW_EN 0x24 +#define AUDIO_PHY_REG_DA_EN_TXDAC_OW_EN_OFFSET 16 +#define AUDIO_PHY_REG_DA_EN_TXDAC_OW_EN_MASK 0x10000 +#define AUDIO_PHY_REG_DA_EN_TXDAC_OW_EN_BITS 0x1 +#define AUDIO_PHY_REG_DA_END2US_TXDAC_OW_EN 0x24 +#define AUDIO_PHY_REG_DA_END2US_TXDAC_OW_EN_OFFSET 17 +#define AUDIO_PHY_REG_DA_END2US_TXDAC_OW_EN_MASK 0x20000 +#define AUDIO_PHY_REG_DA_END2US_TXDAC_OW_EN_BITS 0x1 +#define AUDIO_PHY_REG_DA_DEML_TXDAC_OW_VAL 0x28 +#define AUDIO_PHY_REG_DA_DEML_TXDAC_OW_VAL_OFFSET 0 +#define AUDIO_PHY_REG_DA_DEML_TXDAC_OW_VAL_MASK 0xff +#define AUDIO_PHY_REG_DA_DEML_TXDAC_OW_VAL_BITS 0x8 + +#define AUDIO_PHY_REG_DA_DEMR_TXDAC_OW_VAL 0x28 +#define AUDIO_PHY_REG_DA_DEMR_TXDAC_OW_VAL_OFFSET 8 +#define AUDIO_PHY_REG_DA_DEMR_TXDAC_OW_VAL_MASK 0xff00 +#define AUDIO_PHY_REG_DA_DEMR_TXDAC_OW_VAL_BITS 0x8 +#define AUDIO_PHY_REG_DA_DEML_TXDAC_OW_EN 0x28 +#define AUDIO_PHY_REG_DA_DEML_TXDAC_OW_EN_OFFSET 16 +#define AUDIO_PHY_REG_DA_DEML_TXDAC_OW_EN_MASK 0x10000 +#define AUDIO_PHY_REG_DA_DEML_TXDAC_OW_EN_BITS 0x1 +#define AUDIO_PHY_REG_DA_DEMR_TXDAC_OW_EN 0x28 +#define AUDIO_PHY_REG_DA_DEMR_TXDAC_OW_EN_OFFSET 17 +#define AUDIO_PHY_REG_DA_DEMR_TXDAC_OW_EN_MASK 0x20000 +#define AUDIO_PHY_REG_DA_DEMR_TXDAC_OW_EN_BITS 0x1 +#define AUDIO_PHY_REG_DA_DEML_TXDAC_OW_EN_ON 0x10000 +#define AUDIO_PHY_REG_DA_DEML_TXDAC_OW_EN_OFF 0xFFFEFFFF +#define AUDIO_PHY_REG_DA_DEMR_TXDAC_OW_EN_ON 0x20000 +#define AUDIO_PHY_REG_DA_DEMR_TXDAC_OW_EN_OFF 0xFFFDFFFF + +#define AUDIO_PHY_REG_DA_EN_TXDAAUDIO_PHY_RXADC_ANA2C_STATUS 0x2c +#define AUDIO_PHY_REG_DA_EN_TXDAC_STATUS_OFFSET 0 +#define AUDIO_PHY_REG_DA_EN_TXDAC_STATUS_MASK 0x1 +#define AUDIO_PHY_REG_DA_EN_TXDAC_STATUS_BITS 0x1 +#define AUDIO_PHY_REG_DA_END2US_TXDAC_STATUS 0x2c +#define AUDIO_PHY_REG_DA_END2US_TXDAC_STATUS_OFFSET 1 +#define AUDIO_PHY_REG_DA_END2US_TXDAC_STATUS_MASK 0x2 +#define AUDIO_PHY_REG_DA_END2US_TXDAC_STATUS_BITS 0x1 +#define AUDIO_PHY_REG_DA_DEML_TXDAC_STATUS 0x2c +#define AUDIO_PHY_REG_DA_DEML_TXDAC_STATUS_OFFSET 16 +#define AUDIO_PHY_REG_DA_DEML_TXDAC_STATUS_MASK 0xff0000 +#define AUDIO_PHY_REG_DA_DEML_TXDAC_STATUS_BITS 0x8 +#define AUDIO_PHY_REG_DA_DEMR_TXDAC_STATUS 0x2c +#define AUDIO_PHY_REG_DA_DEMR_TXDAC_STATUS_OFFSET 24 +#define AUDIO_PHY_REG_DA_DEMR_TXDAC_STATUS_MASK 0xff000000 +#define AUDIO_PHY_REG_DA_DEMR_TXDAC_STATUS_BITS 0x8 +#define AUDIO_PHY_REG_TXDAC_I2S_BP 0x30 +#define AUDIO_PHY_REG_TXDAC_I2S_BP_OFFSET 0 +#define AUDIO_PHY_REG_TXDAC_I2S_BP_MASK 0x1 +#define AUDIO_PHY_REG_TXDAC_I2S_BP_BITS 0x1 +#define AUDIO_PHY_REG_RXADC_TO_TXDAC 0x30 +#define AUDIO_PHY_REG_RXADC_TO_TXDAC_OFFSET 1 +#define AUDIO_PHY_REG_RXADC_TO_TXDAC_MASK 0x2 +#define AUDIO_PHY_REG_RXADC_TO_TXDAC_BITS 0x1 + +#define AUDIO_PHY_REG_RXADC_EN 0x100 +#define AUDIO_PHY_REG_RXADC_EN_OFFSET 0 +#define AUDIO_PHY_REG_RXADC_EN_MASK 0x1 +#define AUDIO_PHY_REG_RXADC_EN_BITS 0x1 +#define AUDIO_PHY_REG_I2S_TX_EN 0x100 +#define AUDIO_PHY_REG_I2S_TX_EN_OFFSET 1 +#define AUDIO_PHY_REG_I2S_TX_EN_MASK 0x2 +#define AUDIO_PHY_REG_I2S_TX_EN_BITS 0x1 +#define AUDIO_PHY_REG_RXADC_EN_ON 0x1 +#define AUDIO_PHY_REG_RXADC_EN_OFF 0xFFFFFFFE +#define AUDIO_PHY_REG_I2S_TX_EN_ON 0x2 +#define AUDIO_PHY_REG_I2S_TX_EN_OFF 0xFFFFFFFD + +#define AUDIO_PHY_REG_RXADC_CIC_OPT 0x104 +#define AUDIO_PHY_REG_RXADC_CIC_OPT_OFFSET 0 +#define AUDIO_PHY_REG_RXADC_CIC_OPT_MASK 0x1 +#define AUDIO_PHY_REG_RXADC_CIC_OPT_BITS 0x1 +#define RXADC_CIC_DS_64 0xFFFFFFFE +#define RXADC_CIC_DS_128 0x00000001 +#define RXADC_CIC_DS_256 0x00000002 +#define RXADC_CIC_DS_512 0x00000003 +#define AUDIO_PHY_REG_RXADC_FSM_SRC_SEL 0x104 +#define AUDIO_PHY_REG_RXADC_FSM_SRC_SEL_OFFSET 1 +#define AUDIO_PHY_REG_RXADC_FSM_SRC_SEL_MASK 0x2 +#define AUDIO_PHY_REG_RXADC_FSM_SRC_SEL_BITS 0x1 +#define AUDIO_PHY_REG_RXADC_CHN_SWAP 0x104 +#define AUDIO_PHY_REG_RXADC_CHN_SWAP_OFFSET 2 +#define AUDIO_PHY_REG_RXADC_CHN_SWAP_MASK 0x4 +#define AUDIO_PHY_REG_RXADC_CHN_SWAP_BITS 0x1 +#define AUDIO_PHY_REG_RXADC_SINGLE 0x104 +#define AUDIO_PHY_REG_RXADC_SINGLE_OFFSET 3 +#define AUDIO_PHY_REG_RXADC_SINGLE_MASK 0x8 +#define AUDIO_PHY_REG_RXADC_SINGLE_BITS 0x1 +#define AUDIO_PHY_REG_RXADC_DCB_OPT 0x104 +#define AUDIO_PHY_REG_RXADC_DCB_OPT_OFFSET 4 +#define AUDIO_PHY_REG_RXADC_DCB_OPT_MASK 0x70 +#define AUDIO_PHY_REG_RXADC_DCB_OPT_BITS 0x3 +#define AUDIO_PHY_REG_RXADC_IGR_INIT 0x104 +#define AUDIO_PHY_REG_RXADC_IGR_INIT_OFFSET 8 +#define AUDIO_PHY_REG_RXADC_IGR_INIT_MASK 0x100 +#define AUDIO_PHY_REG_RXADC_IGR_INIT_BITS 0x1 +#define AUDIO_ADC_IGR_INIT_EN 0x100 +#define AUDIO_ADC_IGR_INIT_OFF 0xFFFFFEFF +#define AUDIO_PHY_REG_RXADC_CLK_FORCE_EN 0x104 +#define AUDIO_PHY_REG_RXADC_CLK_FORCE_EN_OFFSET 9 +#define AUDIO_PHY_REG_RXADC_CLK_FORCE_EN_MASK 0x200 +#define AUDIO_PHY_REG_RXADC_CLK_FORCE_EN_BITS 0x1 +#define AUDIO_PHY_REG_RXADC_CIC0_INIT_DONE 0x108 +#define AUDIO_PHY_REG_RXADC_CIC0_INIT_DONE_OFFSET 0 +#define AUDIO_PHY_REG_RXADC_CIC0_INIT_DONE_MASK 0x1 +#define AUDIO_PHY_REG_RXADC_CIC0_INIT_DONE_BITS 0x1 +#define AUDIO_PHY_REG_RXADC_FIR1_0_INIT_DONE 0x108 +#define AUDIO_PHY_REG_RXADC_FIR1_0_INIT_DONE_OFFSET 1 +#define AUDIO_PHY_REG_RXADC_FIR1_0_INIT_DONE_MASK 0x2 +#define AUDIO_PHY_REG_RXADC_FIR1_0_INIT_DONE_BITS 0x1 +#define AUDIO_PHY_REG_RXADC_FIR2_0_INIT_DONE 0x108 +#define AUDIO_PHY_REG_RXADC_FIR2_0_INIT_DONE_OFFSET 2 +#define AUDIO_PHY_REG_RXADC_FIR2_0_INIT_DONE_MASK 0x4 +#define AUDIO_PHY_REG_RXADC_FIR2_0_INIT_DONE_BITS 0x1 +#define AUDIO_PHY_REG_RXADC_CIC1_INIT_DONE 0x108 +#define AUDIO_PHY_REG_RXADC_CIC1_INIT_DONE_OFFSET 4 +#define AUDIO_PHY_REG_RXADC_CIC1_INIT_DONE_MASK 0x10 +#define AUDIO_PHY_REG_RXADC_CIC1_INIT_DONE_BITS 0x1 +#define AUDIO_PHY_REG_RXADC_FIR1_1_INIT_DONE 0x108 +#define AUDIO_PHY_REG_RXADC_FIR1_1_INIT_DONE_OFFSET 5 +#define AUDIO_PHY_REG_RXADC_FIR1_1_INIT_DONE_MASK 0x20 +#define AUDIO_PHY_REG_RXADC_FIR1_1_INIT_DONE_BITS 0x1 +#define AUDIO_PHY_REG_RXADC_FIR2_1_INIT_DONE 0x108 +#define AUDIO_PHY_REG_RXADC_FIR2_1_INIT_DONE_OFFSET 6 +#define AUDIO_PHY_REG_RXADC_FIR2_1_INIT_DONE_MASK 0x40 +#define AUDIO_PHY_REG_RXADC_FIR2_1_INIT_DONE_BITS 0x1 +#define AUDIO_PHY_REG_RXADC_FSM 0x108 +#define AUDIO_PHY_REG_RXADC_FSM_OFFSET 8 +#define AUDIO_PHY_REG_RXADC_FSM_MASK 0x700 +#define AUDIO_PHY_REG_RXADC_FSM_BITS 0x3 + +#define AUDIO_RXADC_SCK_DIV_MASK 0x0000FF00 +#define RXADC_SCK_DIV(l) ((l-1) << 8) +#define AUDIO_RXADC_DLYEN_MASK 0x00FF0000 +#define RXADC_DLYEN(l) (l << 16) + +#define AUDIO_PHY_REG_GSTEPL_RXPGA 0x110 +#define AUDIO_PHY_REG_GSTEPL_RXPGA_OFFSET 0 +#define AUDIO_PHY_REG_GSTEPL_RXPGA_MASK 0x1fff +#define AUDIO_PHY_REG_GSTEPL_RXPGA_BITS 0xd +#define AUDIO_PHY_REG_G6DBL_RXPGA 0x110 +#define AUDIO_PHY_REG_G6DBL_RXPGA_OFFSET 13 +#define AUDIO_PHY_REG_G6DBL_RXPGA_MASK 0x2000 +#define AUDIO_PHY_REG_G6DBL_RXPGA_BITS 0x1 +#define AUDIO_PHY_REG_GAINL_RXADC 0x110 +#define AUDIO_PHY_REG_GAINL_RXADC_OFFSET 14 +#define AUDIO_PHY_REG_GAINL_RXADC_MASK 0xc000 +#define AUDIO_PHY_REG_GAINL_RXADC_BITS 0x2 +#define AUDIO_PHY_REG_GSTEPR_RXPGA 0x110 +#define AUDIO_PHY_REG_GSTEPR_RXPGA_OFFSET 16 +#define AUDIO_PHY_REG_GSTEPR_RXPGA_MASK 0x1fff0000 +#define AUDIO_PHY_REG_GSTEPR_RXPGA_BITS 0xd +#define AUDIO_PHY_REG_G6DBR_RXPGA 0x110 +#define AUDIO_PHY_REG_G6DBR_RXPGA_OFFSET 29 +#define AUDIO_PHY_REG_G6DBR_RXPGA_MASK 0x20000000 +#define AUDIO_PHY_REG_G6DBR_RXPGA_BITS 0x1 +#define AUDIO_PHY_REG_GAINR_RXADC 0x110 +#define AUDIO_PHY_REG_GAINR_RXADC_OFFSET 30 +#define AUDIO_PHY_REG_GAINR_RXADC_MASK 0xc0000000 +#define AUDIO_PHY_REG_GAINR_RXADC_BITS 0x2 +#define AUDIO_PHY_REG_ADC_VOLL_MASK 0xffff +#define AUDIO_PHY_REG_ADC_VOLR_MASK 0xffff0000 + +#define DAC_VOL_L_MASK 0x000001FF +#define CV182x_DAC_VOL_STEP 0x8 +#define DAC_VOL_L(V) (V == 0 ? 0 : (V * CV182x_DAC_VOL_STEP) - 1) +#define DAC_VOL_R(V) ((V == 0 ? 0 : (V * CV182x_DAC_VOL_STEP) - 1) << 16) + +#define ADC_VOL_GAIN_0 0x0001 /* 0dB */ +#define ADC_VOL_GAIN_1 0x0002 /* 2dB */ +#define ADC_VOL_GAIN_2 0x0004 /* 4dB */ +#define ADC_VOL_GAIN_3 0x0008 /* 6dB */ +#define ADC_VOL_GAIN_4 0x0010 /* 8dB */ +#define ADC_VOL_GAIN_5 0x0020 /* 10dB */ +#define ADC_VOL_GAIN_6 0x0040 /* 12dB */ +#define ADC_VOL_GAIN_7 0x0080 /* 14dB */ +#define ADC_VOL_GAIN_8 0x0100 /* 16dB */ +#define ADC_VOL_GAIN_9 0x0200 /* 18dB */ +#define ADC_VOL_GAIN_10 0x0400 /* 20dB */ +#define ADC_VOL_GAIN_11 0x0800 /* 22dB */ +#define ADC_VOL_GAIN_12 0x1000 /* 24dB */ +#define ADC_VOL_GAIN_13 0x2400 /* 26dB */ +#define ADC_VOL_GAIN_14 0x2800 /* 28dB */ +#define ADC_VOL_GAIN_15 0x3000 /* 30dB */ +#define ADC_VOL_GAIN_16 0x6400 /* 32dB */ +#define ADC_VOL_GAIN_17 0x6800 /* 34dB */ +#define ADC_VOL_GAIN_18 0x7000 /* 36dB */ +#define ADC_VOL_GAIN_19 0xA400 /* 38dB */ +#define ADC_VOL_GAIN_20 0xA800 /* 40dB */ +#define ADC_VOL_GAIN_21 0xB000 /* 42dB */ +#define ADC_VOL_GAIN_22 0xE400 /* 44dB */ +#define ADC_VOL_GAIN_23 0xE800 /* 46dB */ +#define ADC_VOL_GAIN_24 0xF000 /* 48dB */ + +#define ADC_VOL_L(V) (ADC_VOL_GAIN_##V) +#define ADC_VOL_R(V) (ADC_VOL_GAIN_##V << 16) + +#define AUDIO_PHY_REG_GAINL_STATUS 0x114 +#define AUDIO_PHY_REG_GAINL_STATUS_OFFSET 0 +#define AUDIO_PHY_REG_GAINL_STATUS_MASK 0xffff +#define AUDIO_PHY_REG_GAINL_STATUS_BITS 0x10 +#define AUDIO_PHY_REG_GAINR_STATUS 0x114 +#define AUDIO_PHY_REG_GAINR_STATUS_OFFSET 16 +#define AUDIO_PHY_REG_GAINR_STATUS_MASK 0xffff0000 +#define AUDIO_PHY_REG_GAINR_STATUS_BITS 0x10 + +#define AUDIO_PHY_REG_MUTEL_RXPGA 0x118 +#define AUDIO_PHY_REG_MUTEL_RXPGA_OFFSET 0 +#define AUDIO_PHY_REG_MUTEL_RXPGA_MASK 0x1 +#define AUDIO_PHY_REG_MUTEL_RXPGA_BITS 0x1 +#define AUDIO_PHY_REG_MUTER_RXPGA 0x118 +#define AUDIO_PHY_REG_MUTER_RXPGA_OFFSET 1 +#define AUDIO_PHY_REG_MUTER_RXPGA_MASK 0x2 +#define AUDIO_PHY_REG_MUTER_RXPGA_BITS 0x1 +#define AUDIO_PHY_REG_DIFF_EN_RXPGA 0x118 +#define AUDIO_PHY_REG_DIFF_EN_RXPGA_OFFSET 16 +#define AUDIO_PHY_REG_DIFF_EN_RXPGA_MASK 0x10000 +#define AUDIO_PHY_REG_DIFF_EN_RXPGA_BITS 0x1 +#define AUDIO_PHY_REG_TRISTATE_RXPGA 0x118 +#define AUDIO_PHY_REG_TRISTATE_RXPGA_OFFSET 17 +#define AUDIO_PHY_REG_TRISTATE_RXPGA_MASK 0x20000 +#define AUDIO_PHY_REG_TRISTATE_RXPGA_BITS 0x1 +#define AUDIO_PHY_REG_MUTEL_ON 0x1 +#define AUDIO_PHY_REG_MUTEL_OFF 0xFFFFFFFE +#define AUDIO_PHY_REG_MUTER_ON 0x2 +#define AUDIO_PHY_REG_MUTER_OFF 0xFFFFFFFD + +#define AUDIO_PHY_REG_ADDI_RXADC 0x11c +#define AUDIO_PHY_REG_ADDI_RXADC_OFFSET 0 +#define AUDIO_PHY_REG_ADDI_RXADC_MASK 0x1 +#define AUDIO_PHY_REG_ADDI_RXADC_BITS 0x1 +#define AUDIO_PHY_REG_CKSEL_RXADC 0x11c +#define AUDIO_PHY_REG_CKSEL_RXADC_OFFSET 1 +#define AUDIO_PHY_REG_CKSEL_RXADC_MASK 0x2 +#define AUDIO_PHY_REG_CKSEL_RXADC_BITS 0x1 +#define AUDIO_PHY_REG_EN_ASAR_I_RXADC 0x11c +#define AUDIO_PHY_REG_EN_ASAR_I_RXADC_OFFSET 2 +#define AUDIO_PHY_REG_EN_ASAR_I_RXADC_MASK 0x4 +#define AUDIO_PHY_REG_EN_ASAR_I_RXADC_BITS 0x1 +#define AUDIO_PHY_REG_EN_ASAR_Q_RXADC 0x11c +#define AUDIO_PHY_REG_EN_ASAR_Q_RXADC_OFFSET 3 +#define AUDIO_PHY_REG_EN_ASAR_Q_RXADC_MASK 0x8 +#define AUDIO_PHY_REG_EN_ASAR_Q_RXADC_BITS 0x1 +#define AUDIO_PHY_REG_DEM_TYPE_RXADC 0x11c +#define AUDIO_PHY_REG_DEM_TYPE_RXADC_OFFSET 4 +#define AUDIO_PHY_REG_DEM_TYPE_RXADC_MASK 0x30 +#define AUDIO_PHY_REG_DEM_TYPE_RXADC_BITS 0x2 +#define AUDIO_PHY_REG_CTUNE_RXADC 0x11c +#define AUDIO_PHY_REG_CTUNE_RXADC_OFFSET 8 +#define AUDIO_PHY_REG_CTUNE_RXADC_MASK 0xf00 +#define AUDIO_PHY_REG_CTUNE_RXADC_BITS 0x4 +#define RXADC_CTUNE_MCLK_4096 (0xF << AUDIO_PHY_REG_CTUNE_RXADC_OFFSET) +#define RXADC_CTUNE_MCLK_5644 (0xA << AUDIO_PHY_REG_CTUNE_RXADC_OFFSET) +#define RXADC_CTUNE_MCLK_8192 (0x4 << AUDIO_PHY_REG_CTUNE_RXADC_OFFSET) +#define RXADC_CTUNE_MCLK_11298 (0xD << AUDIO_PHY_REG_CTUNE_RXADC_OFFSET) +#define RXADC_CTUNE_MCLK_12288 (0xC << AUDIO_PHY_REG_CTUNE_RXADC_OFFSET) +#define RXADC_CTUNE_MCLK_16384 (0x8 << AUDIO_PHY_REG_CTUNE_RXADC_OFFSET) +#define AUDIO_PHY_REG_EN_DITHER_RXADC 0x11c +#define AUDIO_PHY_REG_EN_DITHER_RXADC_OFFSET 12 +#define AUDIO_PHY_REG_EN_DITHER_RXADC_MASK 0x1000 +#define AUDIO_PHY_REG_EN_DITHER_RXADC_BITS 0x1 +#define AUDIO_PHY_REG_RSTSDM_RXADC 0x11c +#define AUDIO_PHY_REG_RSTSDM_RXADC_OFFSET 13 +#define AUDIO_PHY_REG_RSTSDM_RXADC_MASK 0x2000 +#define AUDIO_PHY_REG_RSTSDM_RXADC_BITS 0x1 +#define AUDIO_PHY_REG_EN_VCMT_RXADC 0x11c +#define AUDIO_PHY_REG_EN_VCMT_RXADC_OFFSET 14 +#define AUDIO_PHY_REG_EN_VCMT_RXADC_MASK 0x4000 +#define AUDIO_PHY_REG_EN_VCMT_RXADC_BITS 0x1 +#define AUDIO_PHY_REG_VLDO0P9_RXADC 0x11c +#define AUDIO_PHY_REG_VLDO0P9_RXADC_OFFSET 16 +#define AUDIO_PHY_REG_VLDO0P9_RXADC_MASK 0x30000 +#define AUDIO_PHY_REG_VLDO0P9_RXADC_BITS 0x2 +#define AUDIO_PHY_REG_VLDO12_RXADC 0x11c +#define AUDIO_PHY_REG_VLDO12_RXADC_OFFSET 18 +#define AUDIO_PHY_REG_VLDO12_RXADC_MASK 0xc0000 +#define AUDIO_PHY_REG_VLDO12_RXADC_BITS 0x2 +#define AUDIO_PHY_REG_RNLVL_RXADC 0x11c +#define AUDIO_PHY_REG_RNLVL_RXADC_OFFSET 20 +#define AUDIO_PHY_REG_RNLVL_RXADC_MASK 0x300000 +#define AUDIO_PHY_REG_RNLVL_RXADC_BITS 0x2 +#define AUDIO_PHY_REG_DA_EN_RXPGA_STATUS 0x120 +#define AUDIO_PHY_REG_DA_EN_RXPGA_STATUS_OFFSET 0 +#define AUDIO_PHY_REG_DA_EN_RXPGA_STATUS_MASK 0x1 +#define AUDIO_PHY_REG_DA_EN_RXPGA_STATUS_BITS 0x1 +#define AUDIO_PHY_REG_DA_END2US_RXPGA_STATUS 0x120 +#define AUDIO_PHY_REG_DA_END2US_RXPGA_STATUS_OFFSET 1 +#define AUDIO_PHY_REG_DA_END2US_RXPGA_STATUS_MASK 0x2 +#define AUDIO_PHY_REG_DA_END2US_RXPGA_STATUS_BITS 0x1 +#define AUDIO_PHY_REG_DA_EN_RXADC_STATUS 0x120 +#define AUDIO_PHY_REG_DA_EN_RXADC_STATUS_OFFSET 2 +#define AUDIO_PHY_REG_DA_EN_RXADC_STATUS_MASK 0x4 +#define AUDIO_PHY_REG_DA_EN_RXADC_STATUS_BITS 0x1 +#define AUDIO_PHY_REG_DA_EN_AUDBIAS_STATUS 0x120 +#define AUDIO_PHY_REG_DA_EN_AUDBIAS_STATUS_OFFSET 3 +#define AUDIO_PHY_REG_DA_EN_AUDBIAS_STATUS_MASK 0x8 +#define AUDIO_PHY_REG_DA_EN_AUDBIAS_STATUS_BITS 0x1 +#define AUDIO_PHY_REG_AD_DOL_RXADC 0x120 +#define AUDIO_PHY_REG_AD_DOL_RXADC_OFFSET 16 +#define AUDIO_PHY_REG_AD_DOL_RXADC_MASK 0x70000 +#define AUDIO_PHY_REG_AD_DOL_RXADC_BITS 0x3 +#define AUDIO_PHY_REG_AD_DOR_RXADC 0x120 +#define AUDIO_PHY_REG_AD_DOR_RXADC_OFFSET 20 +#define AUDIO_PHY_REG_AD_DOR_RXADC_MASK 0x700000 +#define AUDIO_PHY_REG_AD_DOR_RXADC_BITS 0x3 +#define AUDIO_PHY_REG_TESTEN_AUDBIAS 0x124 +#define AUDIO_PHY_REG_TESTEN_AUDBIAS_OFFSET 0 +#define AUDIO_PHY_REG_TESTEN_AUDBIAS_MASK 0x1 +#define AUDIO_PHY_REG_TESTEN_AUDBIAS_BITS 0x1 +#define AUDIO_PHY_REG_TESTEN_RXPGA 0x124 +#define AUDIO_PHY_REG_TESTEN_RXPGA_OFFSET 1 +#define AUDIO_PHY_REG_TESTEN_RXPGA_MASK 0x2 +#define AUDIO_PHY_REG_TESTEN_RXPGA_BITS 0x1 +#define AUDIO_PHY_REG_TSEL_RXADC 0x124 +#define AUDIO_PHY_REG_TSEL_RXADC_OFFSET 2 +#define AUDIO_PHY_REG_TSEL_RXADC_MASK 0xc +#define AUDIO_PHY_REG_TSEL_RXADC_BITS 0x2 +#define AUDIO_PHY_REG_AUD_VREF_FC 0x124 +#define AUDIO_PHY_REG_AUD_VREF_FC_OFFSET 8 +#define AUDIO_PHY_REG_AUD_VREF_FC_MASK 0x100 +#define AUDIO_PHY_REG_AUD_VREF_FC_BITS 0x1 +#define AUDIO_PHY_REG_DA_EN_RXPGA_OW_VAL 0x128 +#define AUDIO_PHY_REG_DA_EN_RXPGA_OW_VAL_OFFSET 0 +#define AUDIO_PHY_REG_DA_EN_RXPGA_OW_VAL_MASK 0x1 +#define AUDIO_PHY_REG_DA_EN_RXPGA_OW_VAL_BITS 0x1 +#define AUDIO_PHY_REG_DA_END2US_RXPGA_OW_VAL 0x128 +#define AUDIO_PHY_REG_DA_END2US_RXPGA_OW_VAL_OFFSET 1 +#define AUDIO_PHY_REG_DA_END2US_RXPGA_OW_VAL_MASK 0x2 +#define AUDIO_PHY_REG_DA_END2US_RXPGA_OW_VAL_BITS 0x1 +#define AUDIO_PHY_REG_DA_EN_RXADC_OW_VAL 0x128 +#define AUDIO_PHY_REG_DA_EN_RXADC_OW_VAL_OFFSET 2 +#define AUDIO_PHY_REG_DA_EN_RXADC_OW_VAL_MASK 0x4 +#define AUDIO_PHY_REG_DA_EN_RXADC_OW_VAL_BITS 0x1 +#define AUDIO_PHY_REG_DA_EN_AUDBIAS_OW_VAL 0x128 +#define AUDIO_PHY_REG_DA_EN_AUDBIAS_OW_VAL_OFFSET 3 +#define AUDIO_PHY_REG_DA_EN_AUDBIAS_OW_VAL_MASK 0x8 +#define AUDIO_PHY_REG_DA_EN_AUDBIAS_OW_VAL_BITS 0x1 +#define AUDIO_PHY_REG_DA_EN_RXPGA_OW_EN 0x128 +#define AUDIO_PHY_REG_DA_EN_RXPGA_OW_EN_OFFSET 16 +#define AUDIO_PHY_REG_DA_EN_RXPGA_OW_EN_MASK 0x10000 +#define AUDIO_PHY_REG_DA_EN_RXPGA_OW_EN_BITS 0x1 +#define AUDIO_PHY_REG_DA_END2US_RXPGA_OW_EN 0x128 +#define AUDIO_PHY_REG_DA_END2US_RXPGA_OW_EN_OFFSET 17 +#define AUDIO_PHY_REG_DA_END2US_RXPGA_OW_EN_MASK 0x20000 +#define AUDIO_PHY_REG_DA_END2US_RXPGA_OW_EN_BITS 0x1 +#define AUDIO_PHY_REG_DA_EN_RXADC_OW_EN 0x128 +#define AUDIO_PHY_REG_DA_EN_RXADC_OW_EN_OFFSET 18 +#define AUDIO_PHY_REG_DA_EN_RXADC_OW_EN_MASK 0x40000 +#define AUDIO_PHY_REG_DA_EN_RXADC_OW_EN_BITS 0x1 +#define AUDIO_PHY_REG_DA_EN_AUDBIAS_OW_EN 0x128 +#define AUDIO_PHY_REG_DA_EN_AUDBIAS_OW_EN_OFFSET 19 +#define AUDIO_PHY_REG_DA_EN_AUDBIAS_OW_EN_MASK 0x80000 +#define AUDIO_PHY_REG_DA_EN_AUDBIAS_OW_EN_BITS 0x1 +#define AUDIO_PHY_REG_GPIO_IEN 0x12c +#define AUDIO_PHY_REG_GPIO_IEN_OFFSET 0 +#define AUDIO_PHY_REG_GPIO_IEN_MASK 0xf +#define AUDIO_PHY_REG_GPIO_IEN_BITS 0x4 +#define AUDIO_PHY_REG_GPIO_DRV 0x12c +#define AUDIO_PHY_REG_GPIO_DRV_OFFSET 4 +#define AUDIO_PHY_REG_GPIO_DRV_MASK 0xf0 +#define AUDIO_PHY_REG_GPIO_DRV_BITS 0x4 +#define AUDIO_PHY_REG_GPIO_C 0x12c +#define AUDIO_PHY_REG_GPIO_C_OFFSET 16 +#define AUDIO_PHY_REG_GPIO_C_MASK 0xf0000 +#define AUDIO_PHY_REG_GPIO_C_BITS 0x4 + +#define AUDIO_PHY_REG_SPARE0 0xff0 +#define AUDIO_PHY_REG_SPARE0_OFFSET 0 +#define AUDIO_PHY_REG_SPARE0_MASK 0xffffffff +#define AUDIO_PHY_REG_SPARE0_BITS 0x20 +#define AUDIO_ADC_SCK_DIV_MASK 0x00ff0000 +#define SPARE_SCK_DIV(l) ((l-1) << 16) + +#define AUDIO_PHY_REG_SPARE1 0xff4 +#define AUDIO_PHY_REG_SPARE1_OFFSET 0 +#define AUDIO_PHY_REG_SPARE1_MASK 0xffff +#define AUDIO_PHY_REG_SPARE1_BITS 0x10 +#define AUDIO_PHY_REG_SPARE_RO 0xff8 +#define AUDIO_PHY_REG_SPARE_RO_OFFSET 0 +#define AUDIO_PHY_REG_SPARE_RO_MASK 0xffffffff +#define AUDIO_PHY_REG_SPARE_RO_BITS 0x20 +#define AUDIO_PHY_REG_DATE_CODE 0xffc +#define AUDIO_PHY_REG_DATE_CODE_OFFSET 0 +#define AUDIO_PHY_REG_DATE_CODE_MASK 0xffffffff +#define AUDIO_PHY_REG_DATE_CODE_BITS 0x20 + +#define CVI_I2S_EN 0x18 +#define CVI_I2S_CLK_CTRL0 0x60 +#define CVI_I2S_CLK_CTRL1 0x64 +#define CVI_I2S_MCLK_OUT_EN_MASK 0x00000080 +#define CVI_I2S_MCLK_OUT_EN BIT(7) +#define CVI_I2S_MCLK_OUT_OFF 0xFFFFFF7F +#define CVI_I2S_AU_EN_MASK 0x00000100 +#define CVI_I2S_AU_EN BIT(8) +#define CVI_I2S_AU_OFF 0xFFFFFEFF + +#define CVI_I2S_MCLK_MASK 0x0000FFFF +#define CVI_I2S_MCLK_DIV(l) ((l << 0) & 0x0000FFFF) + +#define ACODEC_SOFT_RESET_CTRL 1 + +#define ACODEC_SET_INPUT_VOL 2 +#define ACODEC_SET_OUTPUT_VOL 3 +#define ACODEC_GET_INPUT_VOL 4 +#define ACODEC_GET_OUTPUT_VOL 5 + +#define ACODEC_SET_I2S1_FS 6 +#define ACODEC_SET_MIXER_MIC 7 +#define ACODEC_SET_GAIN_MICL 8 +#define ACODEC_SET_GAIN_MICR 9 +#define ACODEC_SET_DACL_VOL 10 +#define ACODEC_SET_DACR_VOL 11 +#define ACODEC_SET_ADCL_VOL 12 +#define ACODEC_SET_ADCR_VOL 13 + +#define ACODEC_SET_MICL_MUTE 14 +#define ACODEC_SET_MICR_MUTE 15 +#define ACODEC_SET_DACL_MUTE 16 +#define ACODEC_SET_DACR_MUTE 17 + +#define ACODEC_GET_GAIN_MICL 18 +#define ACODEC_GET_GAIN_MICR 19 +#define ACODEC_GET_DACL_VOL 20 +#define ACODEC_GET_DACR_VOL 21 +#define ACODEC_GET_ADCL_VOL 22 +#define ACODEC_GET_ADCR_VOL 23 + +#define ACODEC_SET_PD_DACL 24 +#define ACODEC_SET_PD_DACR 25 +#define ACODEC_SET_PD_ADCL 26 +#define ACODEC_SET_PD_ADCR 27 +#define ACODEC_SET_PD_LINEINL 28 +#define ACODEC_SET_PD_LINEINR 29 + +#define ACODEC_SET_DAC_DE_EMPHASIS 30 +#define ACODEC_SET_ADC_HP_FILTER 31 + +#define CV182X_DAC_RESET 0xF7FFFFFF +#define CV182X_DAC_APB_RESET 0xEFFFFFFF + +#define CV182X_ADC_RESET 0xDFFFFFFF +#define CV182X_ADC_APB_RESET 0xBFFFFFFF + +#define CVI_DAC_FS_REG 0x00 +#define CVI_DAC_FS_16_32 0x0 +#define CVI_DAC_FS_32_64 0x1 +#define CVI_DAC_FS_64_128 0x2 +#define CVI_DAC_FS_128_192 0x3 + +#define CVI_DAC_CTRL_REG 0x04 +#define CVI_DAC_PWDAR_MASK 0x00000001 +#define CVI_DAC_PWDAR_NORMAL 0xFFFFFFFE +#define CVI_DAC_PWDAR_DOWN (1 << 0) +#define CVI_DAC_PWDAL_MASK 0x00000002 +#define CVI_DAC_PWDAL_NORMAL 0xFFFFFFFD +#define CVI_DAC_PWDAL_DOWN (1 << 1) +#define CVI_DAC_EN_REF_DISABLE 0xFFFFFFFB +#define CVI_DAC_EN_REF_ENABLE (1 << 2) +#define CVI_DAC_DEN_ENABLE 0xFFFFFFF7 +#define CVI_DAC_DEN_DISABLE (1 << 3) +#define CVI_DAC_AEN_ENABLE 0xFFFFFFEF +#define CVI_DAC_AEN_DISABLE (1 << 4) +#define CVI_DAC_STR_DISABLE 0xFFFFFFDF +#define CVI_DAC_STR_ENABLE (1 << 5) +#define CVI_DAC_DISTHER_DISABLE 0xFFFFFFBF +#define CVI_DAC_DISTHER_ENABLE (1 << 6) +#define CVI_DAC_MUTE_MODE 0xFFFFFCFF +#define CVI_DAC_DEMUTE_MODE (0x3 << 8) +#define CVI_DAC_CKINV_NODELAY 0xFFFFFBFF +#define CVI_DAC_CKINV_DELAY (1 << 10) +#define CVI_DAC_S_MASK 0xFFFF0FFF +#define CVI_DAC_S(v) (v << 12) +#define CVI_DAC_ZCD_DISABLE 0xFFFEFFFF +#define CVI_DAC_ZCD_ENABLE (1 << 16) + +#define CVI_DAC_TEST_MODE_REG 0x08 +#define CVI_DAC_TM_NORMAL 0x0 +#define CVI_DAC_TM_DF 0x1 /* DAC digital filter test mode */ +#define CVI_DAC_TM_SDM 0x2 /* DAC delta sigma modulator */ + +#define CVI_DAC_AIO_DA_REG 0x0C +#define CVI_DAV_AIO_ALL_GPIO 0x0 +#define CVI_DAV_AIO_2CH 0x1 + +#define CVI_DAC_AS_LEVEL_REG 0x10 +enum cv1835_codec_fs { + ACODEC_FS_8000 = 0x1, + ACODEC_FS_11025 = 0x2, + ACODEC_FS_12000 = 0x3, + ACODEC_FS_16000 = 0x4, + ACODEC_FS_22050 = 0x5, + ACODEC_FS_24000 = 0x6, + ACODEC_FS_32000 = 0x7, + ACODEC_FS_44100 = 0x8, + ACODEC_FS_48000 = 0x9, + ACODEC_FS_64000 = 0xa, + ACODEC_FS_96000 = 0xb, + ACODEC_FS_192000 = 0xc, +}; + +#define CVI_ADC_GSEL_REG 0x00 +#define CVI_ADC_GSELR_MASK 0xFFFFFFE0 +#define CVI_ADC_GSELR(v) (v << 0) +#define CVI_ADC_GSELL_MASK 0xFFFFE0FF +#define CVI_ADC_GSELL(v) (v << 8) +#define CVI_ADC_GSELR_MIC_MASK 0xFFF8FFFF +#define CVI_ADC_GSELR_MIC(v) (v << 16) +#define CVI_ADC_GSELL_MIC_MASK 0xF8FFFFFF +#define CVI_ADC_GSELL_MIC(v) (v << 24) + +#define CVI_ADC_CTRL_REG 0x04 +#define CVI_ADC_INSELR_LINE 0xFFFFFFFE /* bit[0] == 0*/ +#define CVI_ADC_INSELR_MIC (1 << 0) +#define CVI_ADC_INSELL_LINE 0xFFFFFFFD /* bit[1] == 0*/ +#define CVI_ADC_INSELL_MIC (1 << 1) +#define CVI_ADC_POWER_MASK 0xFFFCFF0C /* use to reset power on/off related bits */ +#define CVI_ADC_ENADR_POWER_DOWN 0xFFFFFFFB /* bit[2] == 0*/ +#define CVI_ADC_ENADR_NORMAL (1 << 2) +#define CVI_ADC_ENADL_POWER_DOWN 0xFFFFFFF7 /* bit[3] == 0*/ +#define CVI_ADC_ENADL_NORMAL (1 << 3) +#define CVI_ADC_VREF_POWER_DOWN 0xFFFFFFEF /* bit[4] == 0*/ +#define CVI_ADC_VERF_NORMAL (1 << 4) +#define CVI_ADC_ZCD_DISABLE 0xFFFFFFDF /* bit[5] == 0*/ +#define CVI_ADC_ZCD_ENABLE (1 << 5) +#define CVI_ADC_HPR_BYPASS 0xFFFFFFBF /* bit[6] == 0*/ +#define CVI_ADC_HPR_ENABLE (1 << 6) +#define CVI_ADC_HPL_BYPASS 0xFFFFFF7F /* bit[7] == 0*/ +#define CVI_ADC_HPL_ENABLE (1 << 7) +#define CVI_ADC_OVRS_MASK 0xFFFCFFFF +#define CVI_ADC_OVRS(v) (v << 16) + +#define CVI_ADC_OVTOP_REG 0x08 + +#define CVI_ADC_TEST_MODE_REG 0x0C +#define CVI_ADC_TM_NORMAL 0x0 +#define CVI_ADC_TM_READ_ROM 0x2 +#define CVI_ADC_TM_R_PCM 0x6 +#define CVI_ADC_TM_L_PCM 0x7 + +#define CVI_ADC_RSEL_REG 0x10 + +#define CVI_ADC_FS_SEL_REG 0x14 /* ADMCLK/LRCK ratio */ +#define CVI_ADC_RATIO_256 0x0 +#define CVI_ADC_RATIO_512 0x1 +#define CVI_ADC_RATIO_1024 0x2 + +#define CVI_ADC_DAGC_CTRL_REG 0x20 /* digital AGC control */ +#define CVI_ADC_DAGC_DISABLE 0xFFFFFFFE /* bit[0] == 0 */ +#define CVI_ADC_DAGC_ENABLE (1 << 0) +#define CVI_ADC_DAGC_RMS_MODE 0xFFFFFFFD /* bit[1] == 1 */ +#define CVI_ADC_DAGC_PEAK_MODE (1 << 1) +#define CVI_ADC_DAGC_ZCD_DISABLE 0xFFFFFFFB /* bit[2] == 0 */ +#define CVI_ADC_DAGC_ZCD_ENABLE (1 << 2) + +#define CVI_ADC_DAGC_THOLD_REG 0x24 +#define CVI_ADC_DAGC_THOLD_MASK 0xFFFFFF81 +#define CVI_ADC_DAGC_THOLD(v) (v << 0) /* maximum is 0x7f, minimum is 0x01 */ +#define CVI_ADC_DAGC_UPDATE_THOLD_MASK 0x8000FFFF +#define CVI_ADC_DAGC_UPDATE_THOLD(v) (v << 16) /* maximum is 0x7fff */ + +#define CVI_ADC_DAGC_ATTACKTIME_REG 0x28 + +#define CVI_ADC_DAGC_SRC_DM_REG 0x2C +#define CVI_SDC_DAGC_UPDATE_FREQ_MASK 0xFFFFF000 +#define CVI_SDC_DAGC_UPDATE_FREQ(v) (v << 0) +#define CVI_ADC_DAGC_SRC_DM_MASK 0xFFFFCFFF +#define CVI_ADC_DAGC_SRC_DM_MONO_L (0 << 12) + +#define CVI_ADC_DAGC_PGAG_REG 0x30 +#define CVI_ADC_DAGC_PGAG_R 0x0000001F +#define CVI_ADC_DAGC_PGAG_L 0x00001F00 + +#define CVI_ADC_ADCO_REG 0x34 + +enum cv1835_mixer { + CVI_MIXER_LINEIN = 0x0, + CVI_MIXER_MIC_IN = 0x1, +}; + +struct cvi1835dac { + volatile u32 *dac_base; +}; +struct cvi1835adc { + volatile u32 *adc_base; +}; + +struct cv182xdac { + volatile u32 *dac_base; +}; + +struct cv182xadc { + volatile u32 *adc_base; + volatile u32 *mclk_source; +}; + +struct cvi_vol_ctrl { + /* volume control, adc range: 0x00~0x1f, 0x17F:mute. dac range: 0x00~0x0f, 0x0f:mute */ + unsigned int vol_ctrl; + /* adc/dac mute control, 1:mute, 0:unmute */ + unsigned int vol_ctrl_mute; +}; + +static inline void dac_write_reg(volatile u32 *io_base, u32 reg, u32 val) +{ + *(io_base + (reg / sizeof(u32))) = val; +} + +static inline u32 dac_read_reg(volatile u32 *io_base, u32 reg) +{ + return *(io_base + (reg / sizeof(u32))); +} + +static inline void adc_write_reg(volatile u32 *io_base, u32 reg, u32 val) +{ + *(io_base + (reg / sizeof(u32))) = val; +} + +static inline u32 adc_read_reg(volatile u32 *io_base, u32 reg) +{ + u32 val; + + val = *(io_base + (reg / sizeof(u32))); + return val; +} + +static inline void reset_write_reg(u32 val, volatile u32 *io_base) +{ + *(io_base) = val; +} + +static inline u32 reset_read_reg(volatile u32 *io_base) +{ + return *(io_base); +} + +static inline void arch_usleep(unsigned long useconds) +{ + //usleep(useconds); + udelay(useconds); +} + +/* while cv182x codecs transfer CIC between 64 and 128, need to reset codec first */ +static inline void cv182x_reset_dac(void) +{ + volatile u32 *reset_reg = (volatile u32 *)(0x03003008); + + reset_write_reg((reset_read_reg(reset_reg) & CV182X_DAC_RESET), reset_reg); + arch_usleep(1000 * 10); + reset_write_reg((reset_read_reg(reset_reg) | ~CV182X_DAC_RESET), reset_reg); +} + +static inline void cv182x_reset_adc(void) +{ + u32 *reset_reg = (u32 *)(0x03003008); + + reset_write_reg((reset_read_reg(reset_reg) & CV182X_ADC_RESET), reset_reg); + arch_usleep(1000 * 10); + reset_write_reg((reset_read_reg(reset_reg) | ~CV182X_ADC_RESET), reset_reg); +} + +int cv182xdac_init(u32 rate, u32 chan_nr); +int cv182xdac_ioctl(u32 cmd, struct cvi_vol_ctrl vol, u32 val); + +int cv182xadc_init(u32 rate); +int cv182xadc_ioctl(u32 cmd, struct cvi_vol_ctrl vol, u32 val); + +int cv183xdac_init(u32 rate); +int cv183xdac_ioctl(u32 cmd, struct cvi_vol_ctrl vol, u32 val); + +u32 cv1835adc_ioctl(u32 cmd, struct cvi_vol_ctrl vol, u32 val); +int cv1835adc_init(u32 rate); + +#endif /*__CVI_DAC_H__*/ diff --git a/u-boot-2021.10/drivers/cvi_sound/cvi-i2s-uclass.c b/u-boot-2021.10/drivers/cvi_sound/cvi-i2s-uclass.c new file mode 100644 index 000000000..29fbb1abe --- /dev/null +++ b/u-boot-2021.10/drivers/cvi_sound/cvi-i2s-uclass.c @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright 2018 Google LLC + * Written by Simon Glass + */ + +#define LOG_CATEGORY UCLASS_I2S +#include +#include +#include +#include + +int i2s_tx_data(struct udevice *dev, void *data, uint data_size) +{ + struct i2s_ops *ops = i2s_get_ops(dev); + + if (!ops->tx_data) + return -ENOSYS; + + return ops->tx_data(dev, data, data_size); +} + +UCLASS_DRIVER(i2s) = { + .id = UCLASS_I2S, + .name = "i2s", + .per_device_auto = sizeof(struct i2s_uc_priv), +}; diff --git a/u-boot-2021.10/drivers/cvi_sound/cvi-i2s.c b/u-boot-2021.10/drivers/cvi_sound/cvi-i2s.c new file mode 100644 index 000000000..17699e40e --- /dev/null +++ b/u-boot-2021.10/drivers/cvi_sound/cvi-i2s.c @@ -0,0 +1,591 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "cvi-i2s.h" + +#define AMP_PWR_GPIO_BASE 0x05021000 +#define AMP_PWR_GPIO_INOUT 0x004 +#define AMP_PWR_GPIO_PN 0x000 + +void i2s_reg_debug(struct i2s_tdm_regs *i2s_reg, struct i2s_sys_regs *i2s_sys_reg) +{ +#ifdef __DEBUG__ + printf("[i2s_tdm_reg]:\n"); + printf("blk_mode_setting:0x%x\n", readl(&i2s_reg->blk_mode_setting)); + printf("frame_setting:0x%x\n", readl(&i2s_reg->frame_setting)); + printf("slot_setting1:0x%x\n", readl(&i2s_reg->slot_setting1)); + printf("slot_setting2:0x%x\n", readl(&i2s_reg->slot_setting2)); + printf("data_format:0x%x\n", readl(&i2s_reg->data_format)); + printf("blk_cfg:0x%x\n", readl(&i2s_reg->blk_cfg)); + + printf("i2s_enable:0x%x\n", readl(&i2s_reg->i2s_enable)); + printf("i2s_reset:0x%x\n", readl(&i2s_reg->i2s_reset)); + printf("i2s_int_en:0x%x\n", readl(&i2s_reg->i2s_int_en)); + printf("i2s_int:0x%x\n", readl(&i2s_reg->i2s_int)); + printf("fifo_threshold:0x%x\n", readl(&i2s_reg->fifo_threshold)); + printf("fifo_reset:0x%x\n", readl(&i2s_reg->fifo_reset)); + + printf("i2s_clk_ctrl0:0x%x\n", readl(&i2s_reg->i2s_clk_ctrl0)); + printf("i2s_clk_ctrl1:0x%x\n", readl(&i2s_reg->i2s_clk_ctrl1)); + + printf("[i2s_sys_regs][0x%p]:\n", i2s_sys_reg); + + printf("i2s_tdm_sclk_in_sel:0x%x\n", i2s_sys_reg->i2s_tdm_sclk_in_sel); + printf("i2s_tdm_fs_in_sel:0x%x\n", i2s_sys_reg->i2s_tdm_fs_in_sel); + printf("i2s_tdm_sdi_in_sel:0x%x\n", i2s_sys_reg->i2s_tdm_sdi_in_sel); + printf("i2s_tdm_sdo_out_sel:0x%x\n", i2s_sys_reg->i2s_tdm_sdo_out_sel); +#endif +} + +static void i2s_write_reg(volatile u32 *addr, u32 val) +{ + writel(val, addr); +} + +static void muteamp(bool enable) +{ + debug("[%s]IN/OUT:0x%x, P/N:0x%x\n", __func__, + readl((volatile u32 *)(AMP_PWR_GPIO_BASE + AMP_PWR_GPIO_INOUT)), + readl((volatile u32 *)(AMP_PWR_GPIO_BASE + AMP_PWR_GPIO_PN))); + if (enable) {//0 + + i2s_write_reg((volatile u32 *)(AMP_PWR_GPIO_BASE + AMP_PWR_GPIO_INOUT), 0);//OUT + i2s_write_reg((volatile u32 *)(AMP_PWR_GPIO_BASE + AMP_PWR_GPIO_PN), 0);//DOWN + } else {//1 + + i2s_write_reg((volatile u32 *)(AMP_PWR_GPIO_BASE + AMP_PWR_GPIO_INOUT), 4);//OUT + i2s_write_reg((volatile u32 *)(AMP_PWR_GPIO_BASE + AMP_PWR_GPIO_PN), 4);//DOWN + } + debug("[%s]IN/OUT:0x%x, P/N:0x%x\n", __func__, + readl((volatile u32 *)(AMP_PWR_GPIO_BASE + AMP_PWR_GPIO_INOUT)), + readl((volatile u32 *)(AMP_PWR_GPIO_BASE + AMP_PWR_GPIO_PN))); +} + +void i2s_set_clk_source(struct i2s_tdm_regs *i2s_reg, unsigned int src) +{ + u32 tmp = readl(&i2s_reg->i2s_clk_ctrl0) & ~(AUD_CLK_SOURCE_MASK); + + switch (src) { + case AUD_CLK_FROM_MCLK_IN: + tmp |= AUD_CLK_FROM_MCLK_IN | AUD_ENABLE; + break; + case AUD_CLK_FROM_PLL: + tmp |= AUD_CLK_FROM_PLL | AUD_ENABLE; + break; + } + + i2s_write_reg(&i2s_reg->i2s_clk_ctrl0, tmp); + debug("[%s]Set clk source from %d\n", __func__, src); +} + +void i2s_set_interrupt(struct i2s_tdm_regs *i2s_reg) +{ + i2s_write_reg(&i2s_reg->i2s_int_en, I2S_INT_EN_ALL); /* enable all interrupt mask for TX and RX */ +} + +void i2s_set_sample_rate(struct i2s_tdm_regs *i2s_reg, unsigned int sample_rate) +{ + u32 frame_setting = 0; + u32 slot_setting = 0; + u32 data_format = 0; + u32 clk_ctrl = 0; + u32 div_multiplier = 1; /* if use audio PLL (25 or 24.576Mhz), div_multiplier should be 2 */ + + debug("[%s]Set sample rate to %d\n", __func__, sample_rate); + + frame_setting = readl(&i2s_reg->frame_setting); + slot_setting = readl(&i2s_reg->slot_setting1); + data_format = readl(&i2s_reg->data_format); + clk_ctrl = readl(&i2s_reg->i2s_clk_ctrl1); + + frame_setting &= ~(FRAME_LENGTH_MASK | FS_ACT_LENGTH_MASK); + slot_setting &= ~(SLOT_SIZE_MASK | DATA_SIZE_MASK); + data_format &= ~(WORD_LENGTH_MASK); +#if defined(CONFIG_USE_AUDIO_PLL) + clk_ctrl = MCLK_DIV(2); /* audio PLL is 25 or 24.576 Mhz, need to div with 2*/ + div_multiplier = 1; +#else + clk_ctrl = MCLK_DIV(1); /* mclk_in is 12.288 Mhz, no need to div*/ +#endif + + switch (sample_rate) { + case 8000: + frame_setting |= FRAME_LENGTH(32) | FS_ACT_LENGTH(16); + slot_setting |= SLOT_SIZE(16) | DATA_SIZE(16); + data_format = WORD_LEN_16; + clk_ctrl |= BCLK_DIV(48 * div_multiplier); + break; + case 12000: + frame_setting |= FRAME_LENGTH(64) | FS_ACT_LENGTH(32); + slot_setting |= SLOT_SIZE(32) | DATA_SIZE(32); + data_format = WORD_LEN_32; + clk_ctrl |= BCLK_DIV(16 * div_multiplier); + break; + case 16000: + frame_setting |= FRAME_LENGTH(32) | FS_ACT_LENGTH(16); + slot_setting |= SLOT_SIZE(16) | DATA_SIZE(16); + data_format = WORD_LEN_16; + //clk_ctrl |= BCLK_DIV(12 * div_multiplier); + clk_ctrl |= BCLK_DIV(24 * div_multiplier); + break; + case 24000: + frame_setting |= FRAME_LENGTH(64) | FS_ACT_LENGTH(32); + slot_setting |= SLOT_SIZE(32) | DATA_SIZE(32); + data_format = WORD_LEN_32; + clk_ctrl |= BCLK_DIV(8 * div_multiplier); + break; + case 32000: + frame_setting |= FRAME_LENGTH(64) | FS_ACT_LENGTH(32); + slot_setting |= SLOT_SIZE(32) | DATA_SIZE(32); + data_format = WORD_LEN_32; + clk_ctrl |= BCLK_DIV(6 * div_multiplier); + break; + case 48000: + frame_setting |= FRAME_LENGTH(64) | FS_ACT_LENGTH(32); + slot_setting |= SLOT_SIZE(32) | DATA_SIZE(32); + data_format = WORD_LEN_32; + clk_ctrl |= BCLK_DIV(4 * div_multiplier); + break; + case 96000: + frame_setting |= FRAME_LENGTH(64) | FS_ACT_LENGTH(32); + slot_setting |= SLOT_SIZE(32) | DATA_SIZE(32); + data_format = WORD_LEN_32; + clk_ctrl |= BCLK_DIV(2 * div_multiplier); + break; + case 192000: + frame_setting |= FRAME_LENGTH(64) | FS_ACT_LENGTH(32); + slot_setting |= SLOT_SIZE(32) | DATA_SIZE(32); + data_format = WORD_LEN_32; + clk_ctrl |= BCLK_DIV(1 * div_multiplier); + break; + } + + i2s_write_reg(&i2s_reg->frame_setting, frame_setting); + i2s_write_reg(&i2s_reg->slot_setting1, slot_setting); + i2s_write_reg(&i2s_reg->data_format, data_format); + i2s_write_reg(&i2s_reg->i2s_clk_ctrl1, clk_ctrl); +} + +int i2s_set_fmt(struct i2s_tdm_regs *i2s_reg, + unsigned char role, + unsigned char aud_mode, + unsigned int fmt, + unsigned char slot_no) +{ + unsigned int tmp = 0; + unsigned int tmp2 = 0; + //unsigned int codec_fmt = 0; + + tmp = readl(&i2s_reg->frame_setting) & ~(FS_OFFSET_MASK | FS_IDEF_MASK | FS_ACT_LENGTH_MASK); + tmp2 = readl(&i2s_reg->slot_setting1) & ~(SLOT_NUM_MASK); + + switch (aud_mode) { + case I2S_MODE: + tmp |= FS_OFFSET_1_BIT | FS_IDEF_I2S_LR | FS_ACT_LENGTH(((tmp & FRAME_LENGTH_MASK) + 1) / 2); + i2s_write_reg(&i2s_reg->frame_setting, tmp); + tmp2 |= SLOT_NUM(slot_no); + i2s_write_reg(&i2s_reg->slot_setting1, tmp2); + //codec_fmt |= SND_SOC_DAIFMT_I2S; + break; + case LJ_MODE: + tmp |= NO_FS_OFFSET | FS_IDEF_FRAME_SYNC | FS_ACT_LENGTH(((tmp & FRAME_LENGTH_MASK) + 1) / 2); + i2s_write_reg(&i2s_reg->frame_setting, tmp); + tmp2 |= SLOT_NUM(slot_no); + i2s_write_reg(&i2s_reg->slot_setting1, tmp2); + //codec_fmt |= SND_SOC_DAIFMT_LEFT_J; + break; + case RJ_MODE: + tmp |= (NO_FS_OFFSET | FS_IDEF_FRAME_SYNC | + FS_ACT_LENGTH(((tmp & FRAME_LENGTH_MASK) + 1) / 2)); + i2s_write_reg(&i2s_reg->frame_setting, tmp); + tmp2 &= ~(FB_OFFSET_MASK); + tmp2 |= (SLOT_NUM(slot_no) | + FB_OFFSET((((tmp & FS_ACT_LENGTH_MASK) >> 16) - ((tmp2 & DATA_SIZE_MASK) >> 16)))); + i2s_write_reg(&i2s_reg->slot_setting1, tmp2); + //codec_fmt |= SND_SOC_DAIFMT_RIGHT_J; + break; + case PCM_A_MODE: + tmp |= FS_OFFSET_1_BIT | FS_IDEF_FRAME_SYNC | FS_ACT_LENGTH(1); + i2s_write_reg(&i2s_reg->frame_setting, tmp); + tmp2 |= SLOT_NUM(slot_no); + i2s_write_reg(&i2s_reg->slot_setting1, tmp2); + //codec_fmt |= SND_SOC_DAIFMT_DSP_A; + break; + case PCM_B_MODE: + tmp |= NO_FS_OFFSET | FS_IDEF_FRAME_SYNC | FS_ACT_LENGTH(1); + i2s_write_reg(&i2s_reg->frame_setting, tmp); + tmp2 |= SLOT_NUM(slot_no); + i2s_write_reg(&i2s_reg->slot_setting1, tmp2); + //codec_fmt |= SND_SOC_DAIFMT_DSP_B; + break; + case TDM_MODE: + tmp |= NO_FS_OFFSET | FS_IDEF_FRAME_SYNC | FS_ACT_LENGTH(1); + i2s_write_reg(&i2s_reg->frame_setting, tmp); + tmp2 |= SLOT_NUM(slot_no); + i2s_write_reg(&i2s_reg->slot_setting1, tmp2); + i2s_write_reg(&i2s_reg->slot_setting2, 0x0f); /* enable slot 0-3 for TDM */ + //codec_fmt |= SND_SOC_DAIFMT_PDM; + break; + default: + log_err("%s: Invalid format\n", __func__); + return -1; + } + + tmp = readl(&i2s_reg->blk_mode_setting) & + ~(SAMPLE_EDGE_MASK | FS_SAMPLE_RX_DELAY_MASK); /* clear bit 2~4 to set frame format */ + tmp2 = readl(&i2s_reg->frame_setting) & ~(FS_POLARITY_MASK); /* clear bit 12 to set fs polarity */ + if ((aud_mode == I2S_MODE) || (aud_mode == LJ_MODE) || (aud_mode == RJ_MODE)) { + switch (fmt) { + case FMT_IB_NF: + debug("Set format to IBNF\n"); +#ifdef CONFIG_SHIFT_HALF_T + // if (concurrent_rx_enable == true) + // tmp |= RX_SAMPLE_EDGE_N | TX_SAMPLE_EDGE_P; /* for crx */ + // else + tmp |= RX_SAMPLE_EDGE_P | TX_SAMPLE_EDGE_N; +#else + tmp |= RX_SAMPLE_EDGE_N | TX_SAMPLE_EDGE_N; +#endif + i2s_write_reg(&i2s_reg->blk_mode_setting, tmp); + tmp2 |= FS_ACT_LOW; + i2s_write_reg(&i2s_reg->frame_setting, tmp2); + //codec_fmt |= SND_SOC_DAIFMT_IB_NF; + break; + case FMT_IB_IF: + debug("Set format to IBIF\n"); +#ifdef CONFIG_SHIFT_HALF_T + //if (concurrent_rx_enable == true) + // tmp |= RX_SAMPLE_EDGE_N | TX_SAMPLE_EDGE_P; /* for crx */ + //else + tmp |= RX_SAMPLE_EDGE_P | TX_SAMPLE_EDGE_N; +#else + tmp |= RX_SAMPLE_EDGE_N | TX_SAMPLE_EDGE_N; +#endif + i2s_write_reg(&i2s_reg->blk_mode_setting, tmp); + tmp2 |= FS_ACT_HIGH; + i2s_write_reg(&i2s_reg->frame_setting, tmp2); + //codec_fmt |= SND_SOC_DAIFMT_IB_IF; + break; + case FMT_NB_NF: + debug("Set format to NBNF\n"); +#ifdef CONFIG_SHIFT_HALF_T + //if (concurrent_rx_enable == true) + // tmp |= RX_SAMPLE_EDGE_P | TX_SAMPLE_EDGE_N; /* for crx */ + //else + tmp |= RX_SAMPLE_EDGE_N | TX_SAMPLE_EDGE_P; +#else + tmp |= RX_SAMPLE_EDGE_P | TX_SAMPLE_EDGE_P; +#endif + i2s_write_reg(&i2s_reg->blk_mode_setting, tmp); + tmp2 |= FS_ACT_LOW; + i2s_write_reg(&i2s_reg->frame_setting, tmp2); + //codec_fmt |= SND_SOC_DAIFMT_NB_NF; + break; + case FMT_NB_IF: + debug("Set format to NBIF\n"); +#ifdef CONFIG_SHIFT_HALF_T + //if (concurrent_rx_enable == true) + // tmp |= RX_SAMPLE_EDGE_P | TX_SAMPLE_EDGE_N; /* for crx */ + //else + tmp |= RX_SAMPLE_EDGE_N | TX_SAMPLE_EDGE_P; +#else + tmp |= RX_SAMPLE_EDGE_P | TX_SAMPLE_EDGE_P; +#endif + i2s_write_reg(&i2s_reg->blk_mode_setting, tmp); + tmp2 |= FS_ACT_HIGH; + i2s_write_reg(&i2s_reg->frame_setting, tmp2); + //codec_fmt |= SND_SOC_DAIFMT_NB_IF; + break; + default: + log_err("%s: Invalid clock ploarity input\n", __func__); + return -1; + } + } else { +#ifdef CONFIG_SHIFT_HALF_T + if (role == MASTER_MODE) + tmp |= RX_SAMPLE_EDGE_P | TX_SAMPLE_EDGE_N; + else + tmp |= RX_SAMPLE_EDGE_N | TX_SAMPLE_EDGE_N; +#else + tmp |= RX_SAMPLE_EDGE_P | TX_SAMPLE_EDGE_P; +#endif + i2s_write_reg(&i2s_reg->blk_mode_setting, tmp); + tmp2 |= FS_ACT_HIGH; + i2s_write_reg(&i2s_reg->frame_setting, tmp2); + //codec_fmt |= SND_SOC_DAIFMT_IB_IF; + } + + tmp=readl(&i2s_reg->blk_mode_setting) & ~(ROLE_MASK); /* clear bit 2~4 to set frame format */ + switch (role) { + case MASTER_MODE: + tmp |= MASTER_MODE; + i2s_write_reg(&i2s_reg->blk_mode_setting, tmp); + //i2s_set_audio_gpio(MASTER_MODE); + //codec_fmt |= SND_SOC_DAIFMT_CBS_CFS; /* Set codec to slave */ + debug("master:%s\n", __func__); + break; + case SLAVE_MODE: + tmp |= SLAVE_MODE; + i2s_write_reg(&i2s_reg->blk_mode_setting, tmp); + //i2s_set_audio_gpio(SLAVE_MODE); + //codec_fmt |= SND_SOC_DAIFMT_CBM_CFM; /* Set codec to master*/ + debug("slave:%s\n", __func__); + break; + default: + log_err("%s: Invalid master selection\n", __func__); + return -1; + } + + // printf("Set codes fmt\n"); + // if (skip_codec_setting == false) + // adau1372_set_dai_fmt(codec_fmt); + printf("[%s]end\n", __func__); + return 0; +} + +void i2s_config_dma(struct i2s_tdm_regs *i2s_reg, bool on) +{ + u32 blk_mode_setting = 0; + //u32 blk_cfg = 0; + + blk_mode_setting = readl(&i2s_reg->blk_mode_setting) & ~(DMA_MODE_MASK); + if (on == true) { + i2s_write_reg(&i2s_reg->blk_mode_setting, blk_mode_setting | HW_DMA_MODE); /*not to use FIFO */ + i2s_write_reg(&i2s_reg->fifo_threshold, + (RX_FIFO_THRESHOLD(15) | TX_FIFO_THRESHOLD(15) | TX_FIFO_HIGH_THRESHOLD(31))); + } else { + i2s_write_reg(&i2s_reg->blk_mode_setting, blk_mode_setting | SW_MODE); /*not to use FIFO */ + i2s_write_reg(&i2s_reg->fifo_threshold, + (RX_FIFO_THRESHOLD(1) | TX_FIFO_THRESHOLD(15) | TX_FIFO_HIGH_THRESHOLD(31))); + } + + //blk_cfg = readl(&i2s_reg->blk_cfg); + //printf("[%s]blk_cfg:0x%x\n", __func__, readl(&i2s_reg->blk_cfg)); + +} + +static int cvitekub_i2s_init(struct i2s_uc_priv *priv) +{ + int ret = 0; + struct i2s_tdm_regs *i2s_reg = (struct i2s_tdm_regs *)(uintptr_t)priv->base_address; + + i2s_set_clk_source(i2s_reg, AUD_CLK_FROM_PLL); + i2s_set_interrupt(i2s_reg); + /* disable i2s transfer flag and flush the fifo */ + i2s_set_sample_rate(i2s_reg, priv->samplingrate); /* sample rate must first prior to fmt */ + ret = i2s_set_fmt(i2s_reg, MASTER_MODE, I2S_MODE, FMT_IB_IF, priv->channels); + if (ret != 0) { + log_err("%s:set format failed\n", __func__); + return -1; + } + + i2s_config_dma(i2s_reg, false); + return 0; +} + +void i2s_switch(int on, struct i2s_tdm_regs *i2s_reg) +{ + u32 i2s_enable = readl(&i2s_reg->i2s_enable); + u32 aud_enable = readl(&i2s_reg->i2s_clk_ctrl0); + u32 role = (readl(&i2s_reg->blk_mode_setting) & ROLE_MASK); + + if (on) { + if (i2s_enable == I2S_OFF) + i2s_write_reg(&i2s_reg->i2s_enable, I2S_ON); + } else { + + if (i2s_enable == I2S_ON) + i2s_write_reg(&i2s_reg->i2s_enable, I2S_OFF); + + if (((aud_enable & AUD_ENABLE) == AUD_ENABLE) && role == MASTER_MODE) + i2s_write_reg(&i2s_reg->i2s_clk_ctrl0, aud_enable & ~(AUD_ENABLE)); + } +} + + +void i2s_txctrl(struct i2s_tdm_regs *i2s_reg, int on) +{ + u32 blk_mode_setting = 0; + u32 clk_ctrl = 0; + + blk_mode_setting = (readl(&i2s_reg->blk_mode_setting) & ~(TXRX_MODE_MASK)); + clk_ctrl = (readl(&i2s_reg->i2s_clk_ctrl0) & ~(AUD_SWITCH)); + + blk_mode_setting |= TX_MODE; + i2s_write_reg(&i2s_reg->blk_mode_setting, blk_mode_setting); + debug("txctrl:%p, 0x%x\n", i2s_reg, readl(&i2s_reg->blk_mode_setting)); + if ((blk_mode_setting & ROLE_MASK) == MASTER_MODE) { + if (on) { + i2s_write_reg(&i2s_reg->i2s_clk_ctrl0, clk_ctrl | AUD_ENABLE); + debug("Enable aud_en 0x%x\n", i2s_reg->i2s_clk_ctrl0); + } else { + debug("Disalbe aud_en\n"); + i2s_write_reg(&i2s_reg->i2s_clk_ctrl0, clk_ctrl & ~(AUD_ENABLE)); + } + } else { + i2s_write_reg(&i2s_reg->i2s_clk_ctrl0, clk_ctrl & ~(AUD_ENABLE)); + } + +} + +void i2s_sw_reset(struct i2s_tdm_regs *i2s_reg) +{ + + if ((readl(&i2s_reg->blk_mode_setting) & TXRX_MODE_MASK) == TX_MODE) { + //debug("Reset i2s TX\n"); + i2s_write_reg(&i2s_reg->fifo_reset, TX_FIFO_RESET_PULL_UP); + udelay(10); + i2s_write_reg(&i2s_reg->fifo_reset, TX_FIFO_RESET_PULL_DOWN); + i2s_write_reg(&i2s_reg->i2s_reset, I2S_RESET_TX_PULL_UP); + ulong start = timer_get_us() + I2S_TIMEOUT; + + udelay(10); + while (1) { + printf("[debug]tx_status:%04X\n", readl(&i2s_reg->tx_status)); + if ((readl(&i2s_reg->tx_status) & RESET_TX_SCLK) >> 23) { + printf("TX Reset complete\n"); + break; + } else if ((long)(timer_get_us() - start) > 0) { + printf("TX Reset Timeout\n"); + break; + } + } + i2s_write_reg(&i2s_reg->i2s_reset, I2S_RESET_TX_PULL_DOWN); + + } else { /* reset RX*/ + //debug("Reset i2s RX\n"); + i2s_write_reg(&i2s_reg->fifo_reset, RX_FIFO_RESET_PULL_UP); + udelay(10); + i2s_write_reg(&i2s_reg->fifo_reset, RX_FIFO_RESET_PULL_DOWN); + i2s_write_reg(&i2s_reg->i2s_reset, I2S_RESET_RX_PULL_UP); + ulong start = timer_get_us() + I2S_TIMEOUT; + + udelay(10); + while (1) { + u32 tmp = readl(&i2s_reg->rx_status); + u32 tmp2 = readl(&i2s_reg->i2s_clk_ctrl0); + printf("rx_status=0x%x, clk_ctrl0=0x%x\n", tmp, tmp2); + if ((tmp & RESET_RX_SCLK) >> 23) { + //debug("RX Reset complete\n"); + break; + } else if ((long)(timer_get_us() - start) > 0) { + printf("RX Reset Timeout\n"); + break; + } + } + i2s_write_reg(&i2s_reg->i2s_reset, I2S_RESET_RX_PULL_DOWN); + } +} + +static int i2s_send_data(struct i2s_tdm_regs *i2s_reg, const void *byte_data, int nbytes) +{ + struct i2s_sys_regs *i2s_sys_reg = (struct i2s_sys_regs *)CONFIG_SYS_I2S_SYS_BASE; + u32 *send_data = (u32 *)byte_data; + int frame_num = nbytes / 4;//2chn 16bit + int i = 0; + + //u32 overrun = 0; + u32 fifo_wb = 0; + u32 fifo_depth = 16; + u32 cycle_cnt = fifo_depth; + u32 remainder = frame_num % cycle_cnt; + u32 integer = frame_num / cycle_cnt + 1; + + //printf("%s fifo_depth = %d , frame_num = %d(%d)(%d), send_data = %p, i2s_reg = %p\n", + // __func__, fifo_depth, frame_num, integer, remainder, send_data, i2s_reg); + + i2s_txctrl(i2s_reg, I2S_TX_ON); + i2s_sw_reset(i2s_reg); + i2s_switch(I2S_ON, i2s_reg); + muteamp(false); + + while (integer) { + //overrun = readl(&i2s_reg->i2s_int); + //if (((overrun & I2S_INT_TXDA) == I2S_INT_TXDA) + //|| ((overrun & I2S_INT_TXDA_RAW) == I2S_INT_TXDA_RAW)) { + // Write 1 to clear. + // i2s_write_reg(&i2s_reg->i2s_int, overrun | I2S_INT_TXDA | I2S_INT_TXDA_RAW); + fifo_wb = readl((void *)0x0413004c) & 0x3f; + + if (fifo_wb > 0xf) { + if (fifo_wb == 0x20) + printf("u\n"); + + if (integer > 1) { + for (i = 0; i < cycle_cnt / 2; i++) { + i2s_write_reg(&i2s_reg->tx_wr_port_ch0, *send_data); + send_data++; + i2s_write_reg(&i2s_reg->tx_wr_port_ch0, *send_data); + send_data++; + } + + } else if (integer == 1) { + for (i = 0; i < remainder; i++) { + i2s_write_reg(&i2s_reg->tx_wr_port_ch0, *send_data); + send_data++; + } + + } + integer--; + //udelay(10);//100(u)- 70(0) + } else if (fifo_wb == 0) { + //printf("o:%x\n", readl(&i2s_reg->i2s_int)); + } + + } + + muteamp(true); + i2s_reg_debug(i2s_reg, i2s_sys_reg); + i2s_txctrl(i2s_reg, I2S_TX_OFF); + i2s_switch(I2S_OFF, i2s_reg); + + printf("%s end\n", __func__); + return 0; +} + +static int cvitekub_i2s_tx_data(struct udevice *dev, void *data, uint data_size) +{ + struct i2s_uc_priv *priv = dev_get_uclass_priv(dev); + struct i2s_tdm_regs *i2s_reg = (struct i2s_tdm_regs *)(uintptr_t)priv->base_address; + + return i2s_send_data(i2s_reg, data, data_size); +} + +static int cvitekub_i2s_probe(struct udevice *dev) +{ + struct i2s_uc_priv *priv = dev_get_uclass_priv(dev); + + priv->base_address = CONFIG_SYS_I2S3_BASE; + priv->id = 1; + priv->audio_pll_clk = 24.576 * 1000 * 1000; + priv->samplingrate = 16000; + priv->bitspersample = 16; + priv->channels = 2; + priv->rfs = 64; + priv->bfs = 32; + debug("cvitekub_i2s_probe\n"); + return cvitekub_i2s_init(priv); +} + +static const struct i2s_ops cvitekub_i2s_ops = { + .tx_data = cvitekub_i2s_tx_data, +}; + +static const struct udevice_id cvitekub_i2s_ids[] = { + { .compatible = "cvitek,cv1835-i2s" }, + { } +}; + +U_BOOT_DRIVER(cvitekub_i2s) = { + .name = "cvitekub_i2s", + .id = UCLASS_I2S, + .of_match = cvitekub_i2s_ids, + .probe = cvitekub_i2s_probe, + .ops = &cvitekub_i2s_ops, + //.priv_auto = sizeof(struct broadwell_i2s_priv), +}; diff --git a/u-boot-2021.10/drivers/cvi_sound/cvi-i2s.h b/u-boot-2021.10/drivers/cvi_sound/cvi-i2s.h new file mode 100644 index 000000000..d95298547 --- /dev/null +++ b/u-boot-2021.10/drivers/cvi_sound/cvi-i2s.h @@ -0,0 +1,316 @@ +/* + * Copyright (C) 2023 bitmain + */ + +#ifndef __CVI_I2S_H_ +#define __CVI_I2S_H_ + +#define I2S0 0 +#define I2S1 1 +#define I2S2 2 +#define I2S3 3 + +#define CONFIG_SYS_I2S0_BASE 0x04100000 +#define CONFIG_SYS_I2S1_BASE 0x04110000 +#define CONFIG_SYS_I2S2_BASE 0x04120000 +#define CONFIG_SYS_I2S3_BASE 0x04130000 + +#define CONFIG_SYS_I2S_SYS_BASE 0x04108000 + +#define REG_AUDIO_SRC_BASE 0x041D0000 +#define REG_AUDIO_MISC_BASE 0x041D0C00 + +#define REG_AUDIO_GPIO_BASE 0x0300A12C +#define CONFIG_USE_AUDIO_PLL +#define CONFIG_SHIFT_HALF_T +//shit 1/2 T for inv, ex master generate data at falling edge and let codec sample at rising edge// + +#define I2S_BITS_PER_LONG 32 +#define BIT(nr) (1UL << (nr)) +#define I2S_GENMASK(h, l) \ + (((~0UL) << (l)) & (~0UL >> (I2S_BITS_PER_LONG - 1 - (h)))) + +struct i2s_tdm_regs { + u32 blk_mode_setting; /* 0x00 */ + u32 frame_setting; /* 0x04 */ + u32 slot_setting1; /* 0x08 */ + u32 slot_setting2; /* 0x0c */ + u32 data_format; /* 0x10 */ + u32 blk_cfg; /* 0x14 */ + u32 i2s_enable; /* 0x18 */ + u32 i2s_reset; /* 0x1C */ + u32 i2s_int_en; /* 0x20 */ + u32 i2s_int; /* 0x24 */ + u32 fifo_threshold; /* 0x28 */ + u32 dummy1[1]; /* 0x2c */ + u32 fifo_reset; /* 0x30 */ + u32 dummy2[3]; /* 0x34 ~ 0x3C */ + u32 rx_status; /* 0x40 */ + u32 dummy3[1]; /* 0x44 */ + u32 tx_status; /* 0x48 */ + u32 dummy4[5]; /* 0x4c ~ 0x5c */ + u32 i2s_clk_ctrl0; /* 0x60 */ + u32 i2s_clk_ctrl1; /* 0x64 */ + u32 dummy5[6]; /* 0x68 ~ 0x7c */ + u32 rx_rd_port_ch0; /* 0x80 */ + u32 rx_rd_port_ch1; /* 0x84 */ + u32 dummy6[14]; /* 0x88 ~ 0xbc */ + u32 tx_wr_port_ch0; /* 0xc0 */ + u32 tx_wr_port_ch1; /* 0xc4 */ +}; + +struct i2s_sys_regs { + u32 i2s_tdm_sclk_in_sel; /* 0x000 */ + u32 i2s_tdm_fs_in_sel; /* 0x004 */ + u32 i2s_tdm_sdi_in_sel; /* 0x008 */ + u32 i2s_tdm_sdo_out_sel; /* 0x00C */ + u32 dummy1[4]; + u32 i2s_tdm_multi_sync; /* 0x020 */ + u32 dummy2[3]; + u32 i2s_bclk_oen_sel; /* 0x030 */ + u32 i2s_bclk_out_ctrl; /* 0x034 */ + u32 dummy3[2]; + u32 audio_pdm_ctrl; /* 0x040 */ + u32 dummy4[3]; + u32 audio_phy_bypass1; /* 0x050 */ + u32 audio_phy_bypass2; /* 0x054 */ + u32 dummy5[6]; + u32 i2s_sys_clk_ctrl; /* 0x070 */ + u32 dummy6[3]; + u32 i2s0_master_clk_ctrl0; /* 0x080 */ + u32 i2s0_master_clk_ctrl1; /* 0x084 */ + u32 dummy7[2]; + u32 i2s1_master_clk_ctrl0; /* 0x090 */ + u32 i2s1_master_clk_ctrl1; /* 0x094 */ + u32 dummy8[2]; + u32 i2s2_master_clk_ctrl0; /* 0x0A0 */ + u32 i2s2_master_clk_ctrl1; /* 0x0A4 */ + u32 dummy9[2]; + u32 i2s3_master_clk_ctrl0; /* 0x0B0 */ + u32 i2s3_master_clk_ctrl1; /* 0x0B4 */ + u32 dummy10[2]; + u32 i2s_sys_lrck_ctrl; /* 0x0C0 */ +}; + +struct reg_audio_misc_regs { + u32 dummy[12]; + u32 reg_pdm_en; /* 0x30 */ + u32 reg_pdm_clk; /* 0x34 */ + u32 reg_pdm_i2s; /* 0x38 */ +}; + +struct reg_audio_src_regs { + u32 reg_src_en; /* 0x00 */ + u32 reg_src_sel; /* 0x04 */ + u32 reg_src_setting; /* 0x08 */ + u32 reg_src_format; /* 0x0c */ + u32 dummy1[5]; + u32 reg_src_ratio; /* 0x24 */ + u32 reg_src_fsi_init; /* 0x28 */ + u32 dummy2[1]; + u32 reg_src_i2s_status; /* 0x30 */ + u32 dummy3[11]; + u32 reg_src_data_out; /* 0x60 */ + u32 reg_dma_th; /* 0x64 */ +}; + +#define I2S_TIMEOUT 2000000 + +#define I2S_MODE 0x0 +#define LJ_MODE 0x1 +#define RJ_MODE 0x2 +#define PCM_A_MODE 0x3 +#define PCM_B_MODE 0x4 +#define TDM_MODE 0x5 + +/* define value of each configuration of register BLK_MODE_SETTING */ +#define RX_MODE 0x0 << 0 +#define TX_MODE 0x1 << 0 +#define SLAVE_MODE 0x0 << 1 +#define MASTER_MODE 0x1 << 1 +#define RX_SAMPLE_EDGE_N 0x0 << 2 /* Negative edge */ +#define RX_SAMPLE_EDGE_P 0x1 << 2 /* Positive edge */ +#define TX_SAMPLE_EDGE_N 0x0 << 3 +#define TX_SAMPLE_EDGE_P 0x1 << 3 +#define FS_SAMPLE_EDGE_N 0x0 << 4 +#define FS_SAMPLE_EDGE_P 0x1 << 4 +#define FS_SAMPLE_RX_DELAY 0x1 << 5 +#define FS_SAMPLE_RX_NO_DELAY 0x0 << 5 +#define SW_MODE 0x0 << 7 +#define HW_DMA_MODE 0x1 << 7 +#define MULTI_I2S_SYNC 0x1 << 8 +#define TXRX_MODE_MASK 0x00000001 +#define ROLE_MASK 0x00000002 +#define SAMPLE_EDGE_MASK 0x0000001C +#define FS_SAMPLE_RX_DELAY_MASK 0x00000020 +#define DMA_MODE_MASK 0x00000080 +#define MULTI_I2S_MODE_MASK 0x00000100 + +/* define value of each configuration of register FRAME_SETTING */ +#define FS_POLARITY_MASK 0x00001000 +#define FS_OFFSET_MASK 0x00002000 +#define FS_IDEF_MASK 0x00004000 +#define FS_ACT_LENGTH_MASK 0x00FF0000 +#define FRAME_LENGTH_MASK 0x000001FF +#define FRAME_LENGTH(l) (((l-1) << 0) & FRAME_LENGTH_MASK) /* frame length between 0~511 = 1~512 bits */ +#define FS_ACT_LOW 0x0 << 12 +#define FS_ACT_HIGH 0x1 << 12 +#define NO_FS_OFFSET 0x0 << 13 +#define FS_OFFSET_1_BIT 0x1 << 13 +#define FS_IDEF_FRAME_SYNC 0x0 << 14 /* frame sync*/ +#define FS_IDEF_I2S_LR 0x1 << 14 /* frame sync*/ +#define FS_IDEF_CH_SYNC 0x1 << 14 /* channel sync */ +#define FS_ACT_LENGTH(l) (((l-1) << 16) & FS_ACT_LENGTH_MASK) /* frame active length between 0~255 = 1~256 bits*/ + +/* define value of each configuration of register SLOT_SETTING1 */ + +#define SLOT_NUM_MASK 0x0000000F +#define SLOT_SIZE_MASK 0x00003F00 +#define DATA_SIZE_MASK 0x001F0000 +#define FB_OFFSET_MASK 0x1F000000 +#define SLOT_NUM(l) (((l-1) << 0) & SLOT_NUM_MASK) +#define SLOT_SIZE(l) (((l-1) << 8) & SLOT_SIZE_MASK) +#define DATA_SIZE(l) (((l-1) << 16) & DATA_SIZE_MASK) +#define FB_OFFSET(l) ((l << 24) & FB_OFFSET_MASK) + +/* define value of each configuration of register DATA_FORMAT */ +#define WORD_LENGTH_MASK 0x00000006 +#define WORD_LEN_8 0x0 << 1 +#define WORD_LEN_16 0x1 << 1 +#define WORD_LEN_32 0x2 << 1 + +/* define value of each configuration of register BLK_CFG */ +#define AUTO_DISABLE_W_CH_EN 0x1 << 4 +#define RX_START_WAIT_DMA_EN 0x1 << 6 + +/* define value of each configuration of register I2S_RESET */ +#define I2S_RESET_RX_PULL_UP 0x00000001 +#define I2S_RESET_RX_PULL_DOWN 0x00000000 +#define I2S_RESET_TX_PULL_UP 0x00000002 +#define I2S_RESET_TX_PULL_DOWN 0x00000000 + +/* define value of each configuration of register I2S_INT_EN */ +#define I2S_INT_EN_ALL 0x00000177 + +/* define value of each configuration of register I2S_INT */ +#define I2S_INT_RXDA 0x1 << 0 /* RX FIFO data available interrupt status */ +#define I2S_INT_RXFO 0x1 << 1 /* RX FIFO overflow interrupt status */ +#define I2S_INT_RXFU 0x1 << 2 /* RX FIFO underflow interrupt status */ +#define I2S_INT_TXDA 0x1 << 4 /* RX FIFO data available interrupt status */ +#define I2S_INT_TXFO 0x1 << 5 /* RX FIFO overflow interrupt status */ +#define I2S_INT_TXFU 0x1 << 6 /* RX FIFO underflow interrupt status */ +#define I2S_INT_RXDA_RAW 0x1 << 8 /* RX FIFO data available interrupt raw status */ +#define I2S_INT_RXFO_RAW 0x1 << 9 /* RX FIFO overflow interrupt raw status */ +#define I2S_INT_RXFU_RAW 0x1 << 10 /* RX FIFO underflow interrupt raw status */ +#define I2S_INT_TXDA_RAW 0x1 << 12 /* RX FIFO data available interrupt raw status */ +#define I2S_INT_TXFO_RAW 0x1 << 13 /* RX FIFO overflow interrupt raw status */ +#define I2S_INT_TXFU_RAW 0x1 << 14 /* RX FIFO underflow interrupt raw status */ + +/* define value of each configuration of register FIFO_THRESHOLD */ +#define RX_FIFO_THRESHOLD_MASK 0x0000001F +#define TX_FIFO_THRESHOLD_MASK 0x001F0000 +#define TX_FIFO_HIGH_THRESHOLD_MASK 0x1F000000 +#define RX_FIFO_THRESHOLD(v) ((v << 0) & RX_FIFO_THRESHOLD_MASK) +#define TX_FIFO_THRESHOLD(v) ((v << 16) & TX_FIFO_THRESHOLD_MASK) +#define TX_FIFO_HIGH_THRESHOLD(v) ((v << 24) & TX_FIFO_HIGH_THRESHOLD_MASK) + +/* define value of each configuration of register FIFO_RESET */ +#define RX_FIFO_RESET_PULL_UP 0x00000001 +#define RX_FIFO_RESET_PULL_DOWN 0x00000000 +#define TX_FIFO_RESET_PULL_UP 0x00010000 +#define TX_FIFO_RESET_PULL_DOWN 0x00000000 + +/* define value of each configuration of register RX_STATUS */ +#define RESET_RX_SCLK 0x00800000 + +/* define value of each configuration of register TX_STATUS */ +#define RESET_TX_SCLK 0x00800000 + +/* define value of each configuration of register CLK_CTRL0 */ +#define AUD_CLK_SOURCE_MASK 0x00000001 +#define AUD_SWITCH 0x00000100 +#define AUD_CLK_FROM_PLL 0x0 << 0 +#define AUD_CLK_FROM_MCLK_IN 0x1 << 0 +#define ADU_BCLK_OUT_EN 0x1 << 6 +#define AUD_MCLK_OUT_EN 0x1 << 7 +#define AUD_DISABLE 0x0 << 8 +#define AUD_ENABLE 0x1 << 8 + +/* define value of each configuration of register CLK_CTRL1 */ +#define MCLK_DIV(l) ((l << 0) & 0x0000FFFF) +#define BCLK_DIV(l) ((l << 16) & 0xFFFF0000) + +#define FMT_IB_NF 0 /* sample at falling edge and sync polarity is active low*/ +#define FMT_IB_IF 1 +#define FMT_NB_NF 2 +#define FMT_NB_IF 3 + +#define I2S_ON 1 +#define I2S_OFF 0 + +/* I2S Tx Control */ +#define I2S_TX_ON 1 +#define I2S_TX_OFF 0 + +/* I2S Rx Control */ +#define I2S_RX_ON 1 +#define I2S_RX_OFF 0 + +#define WSS_16_CLKCYCLE 0x20 +#define WSS_24_CLKCYCLE 0x30 +#define WSS_32_CLKCYCLE 0x40 +#define WSS_256_CLKCYCLE 0x200 + +#define AUD_SRC_EN 0x1 << 0 +#define AUD_SRC_OFF 0x0 << 0 + +#define AUD_SRC_FSI(v) ((v << 0) & 0x000003FF) +#define AUD_SRC_FSO(v) ((v << 16) & 0x03FF0000) + +/* This structure stores the i2s related information */ +struct i2stx_info { + unsigned int rfs; /* LR clock frame size */ + unsigned int sclkg; /* sclk gate */ + /* unsigned int audio_pll_clk;*/ /* Audio pll frequency in Hz */ + unsigned int samplingrate; /* sampling rate */ + unsigned int mclk_out_en; + unsigned int clk_src; + unsigned int bitspersample; /* bits per sample */ + unsigned int channels; /* audio channels */ + struct i2s_tdm_regs *base_address; /* I2S Register Base */ + struct i2s_sys_regs *sys_base_address; + unsigned int id; /* I2S controller id */ + unsigned char role; /* Master mode or slave mode*/ + unsigned char slot_no; + unsigned int inv; /* Normal or invert BCLK, normal or invert WS CLK (FSYNC)*/ + unsigned char aud_mode; /*I2S mode, Left justified mode or Right justified mode*/ + u16 mclk_div; + u16 bclk_div; + u16 sync_div; +}; + +struct i2s_tdm_regs *i2s_get_base(unsigned int i2s_no); +struct i2s_sys_regs *i2s_get_sys_base(void); + +// void i2s_set_clk_source(struct i2s_tdm_regs *i2s_reg, unsigned int src); +// void i2s_set_mclk_out_enable(struct i2s_tdm_regs *i2s_reg, unsigned int enable); +// void i2s_set_sample_rate(struct i2s_tdm_regs *i2s_reg, unsigned int sample_rate); +// void i2s_set_ws_clock_cycle(struct i2s_tdm_regs *i2s_reg, unsigned int ws_clk, u8 aud_mode); +// void i2s_set_resolution(struct i2s_tdm_regs *i2s_reg, unsigned int data_size, unsigned int slot_size); +// int i2s_set_fmt(struct i2s_tdm_regs *i2s_reg, +// unsigned char role, +// unsigned char aud_mode, +// unsigned int fmt, +// unsigned char slot_no); +// int i2s_init(struct i2stx_info *pi2s_tx, unsigned int *data); +// void i2s_loop_test(struct i2stx_info *pi2s_tx, unsigned int sec, unsigned int *data); +// void i2s_pdm_loop_test(struct i2stx_info *pi2s_tx, unsigned int sec, unsigned int *data); +// void i2s_src_test(struct i2stx_info *pi2s_tx); +// int i2s_test_rx(struct i2stx_info *pi2s_tx, unsigned int resolution); + +// int i2s_receive_rx_data(struct i2stx_info *pi2s_tx, unsigned int *data); +// int i2s_transfer_tx_data(struct i2stx_info *pi2s_tx, unsigned int *data, unsigned long data_size); + +// void concurrent_rx(void); + +#endif /* __CVI_I2S_H_ */ diff --git a/u-boot-2021.10/drivers/cvi_sound/cvi-sound-uclass.c b/u-boot-2021.10/drivers/cvi_sound/cvi-sound-uclass.c new file mode 100644 index 000000000..09b511917 --- /dev/null +++ b/u-boot-2021.10/drivers/cvi_sound/cvi-sound-uclass.c @@ -0,0 +1,8 @@ +#include +#include + +UCLASS_DRIVER(sound) = { + .id = UCLASS_SOUND, + .name = "sound", + .per_device_auto = sizeof(struct sound_uc_priv), +}; diff --git a/u-boot-2021.10/drivers/cvi_sound/cvi-sound.c b/u-boot-2021.10/drivers/cvi_sound/cvi-sound.c new file mode 100644 index 000000000..bd1d6e14f --- /dev/null +++ b/u-boot-2021.10/drivers/cvi_sound/cvi-sound.c @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright 2023 bitmain + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int cvitekub_sound_setup(struct udevice *dev) +{ + struct sound_uc_priv *uc_priv = dev_get_uclass_priv(dev); + struct i2s_uc_priv *i2c_priv = dev_get_uclass_priv(uc_priv->i2s); + int ret = 0; + + if (uc_priv->setup_done) { + printf("areadly init\n"); + return ret; + } + + ret = audio_codec_set_params(uc_priv->codec, i2c_priv->id, + i2c_priv->samplingrate, + i2c_priv->samplingrate * i2c_priv->rfs, + i2c_priv->bitspersample, + i2c_priv->channels); + if (ret) + return ret; + uc_priv->setup_done = true; + + return 0; +} + +static int cvitekub_sound_play(struct udevice *dev, void *data, uint data_size) +{ + struct sound_uc_priv *uc_priv = dev_get_uclass_priv(dev); + + return i2s_tx_data(uc_priv->i2s, data, data_size); +} + +static int cvitekub_sound_stop_play(struct udevice *dev) +{ + struct sound_uc_priv *uc_priv = dev_get_uclass_priv(dev); + + audio_codec_close(uc_priv->codec); //because of pop + uc_priv->setup_done = false; + return 0; +} + +static int cvitekub_sound_probe(struct udevice *dev) +{ + printf("cvitekub_sound_probe\n"); + int ret = 0; + struct sound_uc_priv *uc_priv = dev_get_uclass_priv(dev); + + ret = uclass_get_device_by_driver(UCLASS_AUDIO_CODEC, DM_DRIVER_GET(cvitekub_dac), + &uc_priv->codec); + if (ret) { + printf("[error][%s]no cvitekub_dac device ret:%d\n", __func__, ret); + return -1; + } + + ret = uclass_get_device_by_name(UCLASS_I2S, "i2s@04130000", + &uc_priv->i2s); + if (ret) { + printf("[error][%s]no cvitekub_i2s device ret:%d\n", __func__, ret); + return -1; + } + + printf("Probed sound '%s' with codec '%s' and i2s '%s'\n", dev->name, + uc_priv->codec->name, uc_priv->i2s->name); + return 0; +} + +static const struct sound_ops cvitekub_sound_ops = { + .setup = cvitekub_sound_setup, + .play = cvitekub_sound_play, + .stop_play = cvitekub_sound_stop_play, +}; + +static const struct udevice_id cvitekub_sound_ids[] = { + { .compatible = "cvitek,cv182xa-dac" }, + { } +}; + +U_BOOT_DRIVER(cvitekub_sound) = { + .name = "cvitekub_sound", + .id = UCLASS_SOUND, + .of_match = cvitekub_sound_ids, + .probe = cvitekub_sound_probe, + .ops = &cvitekub_sound_ops, +}; diff --git a/u-boot-2021.10/drivers/cvi_sound/cvi-src.h b/u-boot-2021.10/drivers/cvi_sound/cvi-src.h new file mode 100644 index 000000000..8e7a68f3b --- /dev/null +++ b/u-boot-2021.10/drivers/cvi_sound/cvi-src.h @@ -0,0 +1,9 @@ +#ifndef __CVI_SRC_H__ +#define __CVI_SRC_H__ + +#define SRC_BUFF_SIZE 17340 +u8 src_tx_data[SRC_BUFF_SIZE] = { +0x08, 0x00, 0x20, 0x40, 0x0E, 0x0B, 0x29, 0x3F, 0xC2, 0x15, 0x51, 0x3C, 0xCF, 0x1F, 0xAC, 0x37, 0xE9, 0x28, 0x60, 0x31, 0xCC, 0x30, 0x9A, 0x29, 0x3A, 0x37, 0x99, 0x20, 0x04, 0x3C, 0x9C, 0x16, 0x04, 0x3F, 0xF4, 0x0B, 0x22, 0x40, 0xF1, 0x00, 0x58, 0x3F, 0xE5, 0xF5, 0xAD, 0x3C, 0x29, 0xEB, 0x2F, 0x38, 0x09, 0xE1, 0x08, 0x32, 0xD5, 0xD7, 0x62, 0x2A, 0xD4, 0xCF, 0x7A, 0x21, 0x42, 0xC9, 0x92, 0x17, 0x50, 0xC4, 0xF7, 0x0C, 0x26, 0xC1, 0xF7, 0x01, 0xDA, 0xBF, 0xEA, 0xF6, 0x79, 0xC0, 0x23, 0xEC, 0xFA, 0xC2, 0xF1, 0xE1, 0x4C, 0xC7, 0xA4, 0xD8, 0x4E, 0xCD, 0x84, 0xD0, 0xD3, 0xD4, 0xCE, 0xC9, 0xA2, 0xDD, 0xB6, 0xC4, 0x75, 0xE7, 0x5F, 0xC1, 0x04, 0xF2, 0xEA, 0xBF, 0xFE, 0xFC, 0x5A, 0xC0, 0x0C, 0x08, 0xAF, 0xC2, 0xDF, 0x12, 0xDA, 0xC6, 0x22, 0x1D, 0xB6, 0xCC, 0x86, 0x26, 0x1A, 0xD4, 0xC4, 0x2E, 0xCE, 0xDC, 0x9C, 0x35, 0x8C, 0xE6, 0xDC, 0x3A, 0x0E, 0xF1, 0x5A, 0x3E, 0x00, 0xFC, 0x01, 0x40, 0x10, 0x07, 0xBB, 0x3F, 0xED, 0x11, 0x91, 0x3D, 0x3E, 0x1C, 0x90, 0x39, 0xBB, 0x25, 0xDA, 0x33, 0x16, 0x2E, 0x95, 0x2C, 0x12, 0x35, 0xFF, 0x23, 0x79, 0x3A, 0x56, 0x1A, 0x21, 0x3E, 0xE4, 0x0F, 0xF2, 0x3F, 0xF7, 0x04, 0xDB, 0x3F, 0xE7, 0xF9, 0xDB, 0x3D, 0x02, 0xEF, 0x05, 0x3A, 0xA0, 0xE4, 0x74, 0x34, 0x0D, 0xDB, 0x53, 0x2D, 0x95, 0xD2, 0xD9, 0x24, 0x78, 0xCB, 0x44, 0x1B, 0xE9, 0xC5, 0xE1, 0x10, 0x17, 0xC2, 0xFD, 0x05, 0x1A, 0xC0, 0xED, 0xFA, 0x08, 0xC0, 0x00, 0xF0, 0xD9, 0xC1, 0x8F, 0xE5, 0x85, 0xC5, 0xE7, 0xDB, 0xF0, 0xCA, 0x51, 0xD3, 0xEE, 0xD1, 0x13, 0xCC, 0x4C, 0xDA, 0x5E, 0xC6, 0xCA, 0xE3, 0x62, 0xC2, 0x1D, 0xEE, 0x3A, 0xC0, 0xF9, 0xF8, 0xF9, 0xBF, 0x0A, 0x04, 0xA0, 0xC1, 0xFC, 0x0E, 0x22, 0xC5, 0x7B, 0x19, 0x65, 0xCA, 0x38, 0x23, 0x41, 0xD1, 0xE9, 0x2B, 0x81, 0xD9, 0x4B, 0x33, 0xE6, 0xE2, 0x25, 0x39, 0x2B, 0xED, 0x4C, 0x3D, 0xFE, 0xF7, 0x9E, 0x3F, 0x0C, 0x03, 0x0C, 0x40, 0x06, 0x0E, 0x91, 0x3E, 0x91, 0x18, 0x39, 0x3B, 0x65, 0x22, 0x1C, 0x36, 0x30, 0x2B, 0x64, 0x2F, 0xB4, 0x32, 0x41, 0x27, 0xB2, 0x38, 0xF4, 0x1D, 0x02, 0x3D, 0xC2, 0x13, 0x81, 0x3F, 0xF9, 0x08, 0x1B, 0x40, 0xEB, 0xFD, 0xCB, 0x3E, 0xED, 0xF2, 0x9F, 0x3B, 0x53, 0xE8, 0xAA, 0x36, 0x6D, 0xDE, 0x16, 0x30, 0x85, 0xD5, 0x12, 0x28, 0xE3, 0xCD, 0xDB, 0x1E, 0xBE, 0xC7, 0xBB, 0x14, 0x46, 0xC3, 0xFD, 0x09, 0x9C, 0xC0, 0xF2, 0xFE, 0xD5, 0xBF, 0xF1, 0xF3, 0xF9, 0xC0, 0x48, 0xE9, 0xFB, 0xC3, 0x4F, 0xDF, 0xC7, 0xC8, 0x4E, 0xD6, 0x3A, 0xCF, 0x8B, 0xCE, 0x1D, 0xD7, 0x42, 0xC8, 0x3A, 0xE0, 0xA2, 0xC3, 0x49, 0xEA, 0xCB, 0xC0, 0xFB, 0xF4, 0xD9, 0xBF, 0x03, 0x00, 0xD1, 0xC0, 0x08, 0x0B, 0xA6, 0xC3, 0xBB, 0x15, 0x49, 0xC8, 0xC8, 0x1F, 0x99, 0xCE, 0xE3, 0x28, 0x5D, 0xD6, 0xC4, 0x30, 0x5E, 0xDF, 0x34, 0x37, 0x5A, 0xE9, 0xFC, 0x3B, 0x03, 0xF4, 0xFB, 0x3E, 0x05, 0xFF, 0x1B, 0x40, 0x10, 0x0A, 0x51, 0x3F, 0xCD, 0x14, 0xA3, 0x3C, 0xED, 0x1E, 0x2A, 0x38, 0x20, 0x28, 0x02, 0x32, 0x21, 0x30, 0x5C, 0x2A, 0xB2, 0x36, 0x74, 0x21, 0xA2, 0x3B, 0x8C, 0x17, 0xCE, 0x3E, 0xF0, 0x0C, 0x18, 0x40, 0xF2, 0x01, 0x7C, 0x3F, 0xE7, 0xF6, 0xF9, 0x3C, 0x1D, 0xEC, 0xA8, 0x38, 0xEC, 0xE1, 0xA5, 0x32, 0xA2, 0xD8, 0x20, 0x2B, 0x83, 0xD0, 0x52, 0x22, 0xCC, 0xC9, 0x7F, 0x18, 0xB5, 0xC4, 0xF1, 0x0D, 0x61, 0xC1, 0xFA, 0x02, 0xE8, 0xBF, 0xEB, 0xF7, 0x59, 0xC0, 0x1A, 0xED, 0xB1, 0xC2, 0xD7, 0xE2, 0xD9, 0xC6, 0x75, 0xD9, 0xB6, 0xCC, 0x37, 0xD1, 0x19, 0xD4, 0x5F, 0xCA, 0xCB, 0xDC, 0x1E, 0xC5, 0x8A, 0xE6, 0x9F, 0xC1, 0x0A, 0xF1, 0xFC, 0xBF, 0xFB, 0xFB, 0x40, 0xC0, 0x0C, 0x07, 0x6B, 0xC2, 0xE6, 0x11, 0x6B, 0xC6, 0x39, 0x1C, 0x22, 0xCC, 0xB2, 0x25, 0x64, 0xD3, 0x0D, 0x2E, 0xFA, 0xDB, 0x08, 0x35, 0xA3, 0xE5, 0x6E, 0x3A, 0x15, 0xF0, 0x18, 0x3E, 0x01, 0xFB, 0xE7, 0x3F, 0x11, 0x06, 0xCF, 0x3F, 0xF4, 0x10, 0xD1, 0x3D, 0x54, 0x1B, 0xFA, 0x39, 0xE4, 0x24, 0x69, 0x34, 0x5B, 0x2D, 0x49, 0x2D, 0x7A, 0x34, 0xCE, 0x24, 0x06, 0x3A, 0x3C, 0x1B, 0xD9, 0x3D, 0xDC, 0x10, 0xD5, 0x3F, 0xF8, 0x05, 0xE8, 0x3F, 0xE7, 0xFA, 0x15, 0x3E, 0xFE, 0xEF, 0x6B, 0x3A, 0x8E, 0xE5, 0xFF, 0x34, 0xE7, 0xDB, 0x02, 0x2E, 0x53, 0xD3, 0xA5, 0x25, 0x14, 0xCC, 0x2A, 0x1C, 0x62, 0xC6, 0xD7, 0x11, 0x64, 0xC2, 0xFD, 0x06, 0x3C, 0xC0, 0xEE, 0xFB, 0xFD, 0xBF, 0xFC, 0xF0, 0xA4, 0xC1, 0x7E, 0xE6, 0x26, 0xC5, 0xC3, 0xDC, 0x69, 0xCA, 0x13, 0xD4, 0x44, 0xD1, 0xB4, 0xCC, 0x83, 0xD9, 0xDB, 0xC6, 0xE7, 0xE2, 0xB4, 0xC2, 0x28, 0xED, 0x62, 0xC0, 0xF9, 0xF7, 0xF4, 0xBF, 0x07, 0x03, 0x6F, 0xC1, 0xFF, 0x0D, 0xC7, 0xC4, 0x8A, 0x18, 0xE2, 0xC9, 0x5A, 0x22, 0x9A, 0xD0, 0x25, 0x2B, 0xBA, 0xD8, 0xA6, 0x32, 0x08, 0xE2, 0xA3, 0x38, 0x38, 0xEC, 0xF3, 0x3C, 0xFF, 0xF6, 0x71, 0x3F, 0x0A, 0x02, 0x0B, 0x40, 0x09, 0x0D, 0xBB, 0x3E, 0x9E, 0x17, 0x8F, 0x3B, 0x84, 0x21, 0x9C, 0x36, 0x67, 0x2A, 0x08, 0x30, 0x09, 0x32, 0x04, 0x28, 0x2D, 0x38, 0xD1, 0x1E, 0xA4, 0x3C, 0xB2, 0x14, 0x4E, 0x3F, 0xF6, 0x09, 0x14, 0x40, 0xEF, 0xFE, 0xF1, 0x3E, 0xED, 0xF3, 0xEE, 0x3B, 0x47, 0xE9, 0x23, 0x37, 0x50, 0xDF, 0xB3, 0x30, 0x53, 0xD6, 0xCF, 0x28, 0x90, 0xCE, 0xB7, 0x1F, 0x48, 0xC8, 0xAB, 0x15, 0xA8, 0xC3, 0xF7, 0x0A, 0xD7, 0xC0, 0xF3, 0xFF, 0xE2, 0xBF, 0xEF, 0xF4, 0xDA, 0xC0, 0x40, 0xEA, 0xB0, 0xC3, 0x35, 0xE0, 0x53, 0xC8, 0x1D, 0xD7, 0x9F, 0xCE, 0x3D, 0xCF, 0x62, 0xD6, 0xD2, 0xC8, 0x62, 0xDF, 0x09, 0xC4, 0x5C, 0xE9, 0x0B, 0xC1, 0x01, 0xF4, 0xEC, 0xBF, 0x01, 0xFF, 0xB5, 0xC0, 0x0A, 0x0A, 0x62, 0xC3, 0xC3, 0x14, 0xDE, 0xC7, 0xDF, 0x1E, 0x04, 0xCE, 0x11, 0x28, 0xA7, 0xD5, 0x0E, 0x30, 0x8B, 0xDE, 0x9E, 0x36, 0x72, 0xE8, 0x8E, 0x3B, 0x0A, 0xF3, 0xB7, 0x3E, 0x04, 0xFE, 0x01, 0x40, 0x0C, 0x09, 0x64, 0x3F, 0xD3, 0x13, 0xE4, 0x3C, 0x01, 0x1E, 0x93, 0x38, 0x48, 0x27, 0x91, 0x32, 0x66, 0x2F, 0x10, 0x2B, 0x19, 0x36, 0x44, 0x22, 0x30, 0x3B, 0x73, 0x18, 0x82, 0x3E, 0xE8, 0x0D, 0xF9, 0x3F, 0xF3, 0x02, 0x89, 0x3F, 0xE8, 0xF7, 0x33, 0x3D, 0x1A, 0xED, 0x0A, 0x39, 0xDC, 0xE2, 0x30, 0x33, 0x7D, 0xD9, 0xCE, 0x2B, 0x43, 0xD1, 0x1F, 0x23, 0x6C, 0xCA, 0x64, 0x19, 0x2E, 0xC5, 0xE7, 0x0E, 0xAF, 0xC1, 0xFA, 0x03, 0x0E, 0xC0, 0xEE, 0xF8, 0x52, 0xC0, 0x16, 0xEE, 0x7D, 0xC2, 0xC9, 0xE3, 0x7C, 0xC6, 0x53, 0xDA, 0x31, 0xCC, 0xFB, 0xD1, 0x6F, 0xD3, 0x03, 0xCB, 0x02, 0xDC, 0x9D, 0xC5, 0xA8, 0xE5, 0xF7, 0xC1, 0x16, 0xF0, 0x27, 0xC0, 0xFC, 0xFA, 0x40, 0xC0, 0x09, 0x06, 0x3F, 0xC2, 0xE7, 0x10, 0x13, 0xC6, 0x44, 0x1B, 0xA2, 0xCB, 0xD2, 0x24, 0xC0, 0xD2, 0x44, 0x2D, 0x36, 0xDB, 0x60, 0x34, 0xC5, 0xE4, 0xEC, 0x39, 0x23, 0xEF, 0xBB, 0x3D, 0x01, 0xFA, 0xB5, 0x3F, 0x0D, 0x05, 0xCA, 0x3F, 0xF4, 0x0F, 0xF7, 0x3D, 0x5D, 0x1A, 0x4B, 0x3A, 0x00, 0x24, 0xE5, 0x34, 0x90, 0x2C, 0xEA, 0x2D, 0xCC, 0x33, 0x92, 0x25, 0x7D, 0x39, 0x18, 0x1C, 0x77, 0x3D, 0xCB, 0x11, 0x9C, 0x3F, 0xF6, 0x06, 0xDD, 0x3F, 0xEA, 0xFB, 0x37, 0x3E, 0xFF, 0xF0, 0xB7, 0x3A, 0x85, 0xE6, 0x76, 0x35, 0xCE, 0xDC, 0x9F, 0x2E, 0x23, 0xD4, 0x62, 0x26, 0xC7, 0xCC, 0x03, 0x1D, 0xF0, 0xC6, 0xC6, 0x12, 0xCC, 0xC2, 0xFA, 0x07, 0x7C, 0xC0, 0xF0, 0xFC, 0x0E, 0xC0, 0x00, 0xF2, 0x8A, 0xC1, 0x7A, 0xE7, 0xE0, 0xC4, 0xAD, 0xDD, 0xF9, 0xC9, 0xE8, 0xD4, 0xAE, 0xD0, 0x6C, 0xCD, 0xCB, 0xD8, 0x70, 0xC7, 0x13, 0xE2, 0x23, 0xC3, 0x3D, 0xEC, 0xA7, 0xC0, 0x00, 0xF7, 0x0E, 0xC0, 0x05, 0x02, 0x5C, 0xC1, 0xFC, 0x0C, 0x89, 0xC4, 0x8C, 0x17, 0x79, 0xC9, 0x6E, 0x21, 0x0B, 0xD0, 0x4C, 0x2A, 0x09, 0xD8, 0xE9, 0x31, 0x36, 0xE1, 0x0A, 0x38, 0x4F, 0xEB, 0x7D, 0x3C, 0x07, 0xF6, 0x24, 0x3F, 0x09, 0x01, 0xEA, 0x3F, 0x02, 0x0C, 0xC9, 0x3E, 0xA1, 0x16, 0xC7, 0x3B, 0x92, 0x20, 0xFF, 0x36, 0x8C, 0x29, 0x92, 0x30, 0x49, 0x31, 0xB3, 0x28, 0x8D, 0x37, 0x9E, 0x1F, 0x29, 0x3C, 0x99, 0x15, 0xFB, 0x3E, 0xED, 0x0A, 0xEC, 0x3F, 0xEE, 0xFF, 0xF6, 0x3E, 0xF1, 0xF4, 0x21, 0x3C, 0x49, 0xEA, 0x80, 0x37, 0x45, 0xE0, 0x39, 0x31, 0x34, 0xD7, 0x79, 0x29, 0x58, 0xCF, 0x7F, 0x20, 0xF0, 0xC8, 0x8D, 0x16, 0x2B, 0xC4, 0xEE, 0x0B, 0x2E, 0xC1, 0xF6, 0x00, 0x12, 0xC0, 0xF5, 0xF5, 0xDB, 0xC0, 0x41, 0xEB, 0x86, 0xC3, 0x2C, 0xE1, 0xFD, 0xC7, 0x03, 0xD8, 0x20, 0xCE, 0x07, 0xD0, 0xBE, 0xD5, 0x7C, 0xC9, 0x9D, 0xDE, 0x91, 0xC4, 0x7C, 0xE8, 0x6A, 0xC1, 0x0D, 0xF3, 0x22, 0xC0, 0x02, 0xFE, 0xBD, 0xC0, 0x04, 0x09, 0x3E, 0xC3, 0xC1, 0x13, 0x8C, 0xC7, 0xE7, 0x1D, 0x8A, 0xCD, 0x28, 0x27, 0x08, 0xD5, 0x3E, 0x2F, 0xCD, 0xDD, 0xEE, 0x35, 0x95, 0xE7, 0x00, 0x3B, 0x18, 0xF2, 0x51, 0x3E, 0x05, 0xFD, 0xC6, 0x3F, 0x09, 0x08, 0x54, 0x3F, 0xCF, 0x12, 0x01, 0x3D, 0x04, 0x1D, 0xDC, 0x38, 0x5E, 0x26, 0x04, 0x33, 0x92, 0x2E, 0xA8, 0x2B, 0x62, 0x35, 0xFF, 0x22, 0x9C, 0x3A, 0x4B, 0x19, 0x17, 0x3E, 0xD7, 0x0E, 0xB5, 0x3F, 0xF1, 0x03, 0x72, 0x3F, 0xEE, 0xF8, 0x49, 0x3D, 0x20, 0xEE, 0x4E, 0x39, 0xDA, 0xE3, 0x9D, 0x33, 0x6C, 0xDA, 0x64, 0x2C, 0x1B, 0xD2, 0xD7, 0x23, 0x29, 0xCB, 0x38, 0x1A, 0xCA, 0xC5, 0xD3, 0x0F, 0x26, 0xC2, 0xF5, 0x04, 0x58, 0xC0, 0xF3, 0xF9, 0x72, 0xC0, 0x1D, 0xEF, 0x6E, 0xC2, 0xC9, 0xE4, 0x40, 0xC6, 0x46, 0xDB, 0xC9, 0xCB, 0xD9, 0xD2, 0xE2, 0xD2, 0xC4, 0xCB, 0x51, 0xDB, 0x3D, 0xC6, 0xD8, 0xE4, 0x71, 0xC2, 0x2D, 0xEF, 0x7A, 0xC0, 0x02, 0xFA, 0x66, 0xC0, 0x05, 0x05, 0x35, 0xC2, 0xE0, 0x0F, 0xDF, 0xC5, 0x42, 0x1A, 0x41, 0xCB, 0xDB, 0x23, 0x36, 0xD2, 0x64, 0x2C, 0x89, 0xDA, 0x99, 0x33, 0xF6, 0xE3, 0x43, 0x39, 0x3C, 0xEE, 0x3A, 0x3D, 0x08, 0xF9, 0x5E, 0x3F, 0x09, 0x04, 0x9C, 0x3F, 0xEB, 0x0E, 0xF9, 0x3D, 0x59, 0x19, 0x7A, 0x3A, 0x07, 0x23, 0x3D, 0x35, 0xA9, 0x2B, 0x6D, 0x2E, 0xFE, 0x32, 0x38, 0x26, 0xCF, 0x38, 0xE2, 0x1C, 0xEE, 0x3C, 0xAE, 0x12, 0x3D, 0x3F, 0xEC, 0x07, 0xA7, 0x3F, 0xEF, 0xFC, 0x2F, 0x3E, 0x09, 0xF2, 0xDD, 0x3A, 0x8B, 0xE7, 0xC7, 0x35, 0xCB, 0xDD, 0x1A, 0x2F, 0x0E, 0xD5, 0x04, 0x27, 0x9A, 0xCD, 0xC6, 0x1D, 0xA4, 0xC7, 0xA4, 0x13, 0x5E, 0xC3, 0xEE, 0x08, 0xE3, 0xC0, 0xF4, 0xFD, 0x4B, 0xC0, 0x0A, 0xF3, 0x99, 0xC1, 0x82, 0xE8, 0xC2, 0xC4, 0xAE, 0xDE, 0xAE, 0xC9, 0xD7, 0xD5, 0x38, 0xD0, 0x42, 0xCE, 0x2D, 0xD8, 0x2A, 0xC8, 0x53, 0xE1, 0xBA, 0xC3, 0x61, 0xEB, 0x17, 0xC1, 0x0C, 0xF6, 0x52, 0xC0, 0x03, 0x01, 0x74, 0xC1, 0xF1, 0x0B, 0x71, 0xC4, 0x83, 0x16, 0x35, 0xC9, 0x6B, 0x20, 0x9B, 0xCF, 0x59, 0x29, 0x70, 0xD7, 0x0C, 0x31, 0x7C, 0xE0, 0x49, 0x37, 0x77, 0xEA, 0xE1, 0x3B, 0x15, 0xF5, 0xAF, 0x3E, 0x07, 0x00, 0x9E, 0x3F, 0xF7, 0x0A, 0xAA, 0x3E, 0x95, 0x15, 0xD6, 0x3B, 0x8F, 0x1F, 0x3B, 0x37, 0x96, 0x28, 0xFB, 0x30, 0x66, 0x30, 0x44, 0x29, 0xC7, 0x36, 0x54, 0x20, 0x85, 0x3B, 0x6D, 0x16, 0x7D, 0x3E, 0xDC, 0x0B, 0x99, 0x3F, 0xEF, 0x00, 0xCF, 0x3E, 0xFC, 0xF5, 0x28, 0x3C, 0x56, 0xEB, 0xB5, 0x37, 0x4D, 0xE1, 0x9A, 0x31, 0x2E, 0xD8, 0x03, 0x2A, 0x3F, 0xD0, 0x2F, 0x21, 0xBC, 0xC9, 0x5F, 0x17, 0xD6, 0xC4, 0xD9, 0x0C, 0xB3, 0xC1, 0xF2, 0x01, 0x6D, 0xC0, 0xFF, 0xF6, 0x09, 0xC1, 0x4F, 0xEC, 0x88, 0xC3, 0x37, 0xE2, 0xD1, 0xC7, 0x00, 0xD9, 0xC6, 0xCD, 0xF4, 0xD0, 0x39, 0xD5, 0x51, 0xCA, 0xF3, 0xDD, 0x44, 0xC5, 0xB0, 0xE7, 0xF8, 0xC1, 0x26, 0xF2, 0x84, 0xC0, 0x04, 0xFD, 0xF4, 0xC0, 0xFA, 0x07, 0x46, 0xC3, 0xB0, 0x12, 0x66, 0xC7, 0xDA, 0x1C, 0x38, 0xCD, 0x25, 0x26, 0x8A, 0xD4, 0x4E, 0x2E, 0x26, 0xDD, 0x16, 0x35, 0xCD, 0xE6, 0x46, 0x3A, 0x33, 0xF1, 0xBC, 0x3D, 0x0B, 0xFC, 0x5C, 0x3F, 0xFE, 0x06, 0x16, 0x3F, 0xBF, 0x11, 0xF1, 0x3C, 0xF5, 0x1B, 0xFA, 0x38, 0x57, 0x25, 0x50, 0x33, 0x9C, 0x2D, 0x21, 0x2C, 0x85, 0x34, 0xA0, 0x23, 0xDC, 0x39, 0x10, 0x1A, 0x7B, 0x3D, 0xB9, 0x0F, 0x43, 0x3F, 0xEA, 0x04, 0x2C, 0x3F, 0xF6, 0xF9, 0x31, 0x3D, 0x30, 0xEF, 0x65, 0x39, 0xED, 0xE4, 0xE2, 0x33, 0x76, 0xDB, 0xD5, 0x2C, 0x16, 0xD3, 0x71, 0x24, 0x0C, 0xCC, 0xF7, 0x1A, 0x8E, 0xC6, 0xB1, 0x10, 0xC7, 0xC2, 0xEC, 0x05, 0xD4, 0xC0, 0xFA, 0xFA, 0xC0, 0xC0, 0x2E, 0xF0, 0x8E, 0xC2, 0xDD, 0xE5, 0x31, 0xC6, 0x51, 0xDC, 0x8D, 0xCB, 0xD7, 0xD3, 0x77, 0xD2, 0xAE, 0xCC, 0xBC, 0xDA, 0x0C, 0xC7, 0x1E, 0xE4, 0x1C, 0xC3, 0x52, 0xEE, 0xFD, 0xC0, 0x0D, 0xF9, 0xBD, 0xC0, 0xFD, 0x03, 0x61, 0xC2, 0xCF, 0x0E, 0xDA, 0xC5, 0x2C, 0x19, 0x0C, 0xCB, 0xCB, 0x22, 0xD4, 0xD1, 0x61, 0x2B, 0xFB, 0xD9, 0xAA, 0x32, 0x43, 0xE3, 0x6F, 0x38, 0x66, 0xED, 0x88, 0x3C, 0x18, 0xF8, 0xD3, 0x3E, 0x03, 0x03, 0x3E, 0x3F, 0xD8, 0x0D, 0xC6, 0x3D, 0x43, 0x18, 0x78, 0x3A, 0xF5, 0x21, 0x6C, 0x35, 0xA2, 0x2A, 0xC7, 0x2E, 0x0C, 0x32, 0xBF, 0x26, 0xF5, 0x37, 0x90, 0x1D, 0x36, 0x3C, 0x80, 0x13, 0xAA, 0x3E, 0xDA, 0x08, 0x41, 0x3F, 0xF2, 0xFD, 0xF6, 0x3D, 0x1A, 0xF3, 0xD1, 0x3A, 0xA5, 0xE8, 0xED, 0x35, 0xDF, 0xDE, 0x6E, 0x2F, 0x1B, 0xD6, 0x85, 0x27, 0x94, 0xCE, 0x70, 0x1E, 0x84, 0xC8, 0x72, 0x14, 0x1C, 0xC4, 0xD9, 0x09, 0x7F, 0xC1, 0xF6, 0xFE, 0xBA, 0xC0, 0x1A, 0xF4, 0xDC, 0xC1, 0x99, 0xE9, 0xD4, 0xC4, 0xC6, 0xDF, 0x92, 0xC9, 0xE7, 0xD6, 0xEB, 0xCF, 0x3F, 0xCF, 0xB5, 0xD7, 0x10, 0xC9, 0xAF, 0xE0, 0x80, 0xC4, 0x9A, 0xEA, 0xB7, 0xC1, 0x26, 0xF5, 0xCA, 0xC0, 0x04, 0x00, 0xBE, 0xC1, 0xE0, 0x0A, 0x8C, 0xC4, 0x6B, 0x15, 0x20, 0xC9, 0x50, 0x1F, 0x55, 0xCF, 0x46, 0x28, 0xFE, 0xD6, 0x08, 0x30, 0xDF, 0xDF, 0x5D, 0x36, 0xB4, 0xE9, 0x13, 0x3B, 0x32, 0xF4, 0x04, 0x3E, 0x0A, 0xFF, 0x1D, 0x3F, 0xE7, 0x09, 0x56, 0x3E, 0x7B, 0x14, 0xB3, 0x3B, 0x71, 0x1E, 0x49, 0x37, 0x7F, 0x27, 0x38, 0x31, 0x5F, 0x2F, 0xB0, 0x29, 0xD3, 0x35, 0xEB, 0x20, 0xB0, 0x3A, 0x2B, 0x17, 0xCC, 0x3D, 0xBD, 0x0C, 0x11, 0x3F, 0xEB, 0x01, 0x74, 0x3E, 0x0B, 0xF7, 0xFB, 0x3B, 0x72, 0xEC, 0xBA, 0x37, 0x6A, 0xE2, 0xD0, 0x31, 0x48, 0xD9, 0x6A, 0x2A, 0x4C, 0xD1, 0xC1, 0x21, 0xB4, 0xCA, 0x17, 0x18, 0xB2, 0xC5, 0xB7, 0x0D, 0x6D, 0xC2, 0xEC, 0x02, 0xFF, 0xC0, 0x0D, 0xF8, 0x6F, 0xC1, 0x6C, 0xED, 0xBB, 0xC3, 0x58, 0xE3, 0xD4, 0xC7, 0x1F, 0xDA, 0x98, 0xCD, 0x06, 0xD2, 0xDC, 0xD4, 0x50, 0xCB, 0x69, 0xDD, 0x26, 0xC6, 0xFC, 0xE6, 0xB9, 0xC2, 0x4D, 0xF1, 0x1D, 0xC1, 0x0D, 0xFC, 0x62, 0xC1, 0xEC, 0x06, 0x84, 0xC3, 0x96, 0x11, 0x73, 0xC7, 0xB7, 0x1B, 0x12, 0xCD, 0x05, 0x25, 0x34, 0xD4, 0x39, 0x2D, 0xA1, 0xDC, 0x11, 0x34, 0x1F, 0xE6, 0x5E, 0x39, 0x5F, 0xF0, 0xF4, 0x3C, 0x18, 0xFB, 0xBB, 0x3E, 0xF5, 0x05, 0xA0, 0x3E, 0xA1, 0x10, 0xA9, 0x3C, 0xD1, 0x1A, 0xE3, 0x38, 0x34, 0x24, 0x6E, 0x33, 0x81, 0x2C, 0x6E, 0x2C, 0x7A, 0x33, 0x1C, 0x24, 0xEB, 0x38, 0xB9, 0x1A, 0xA9, 0x3C, 0x89, 0x10, 0x9B, 0x3E, 0xDB, 0x05, 0xAC, 0x3E, 0x00, 0xFB, 0xE1, 0x3C, 0x4E, 0xF0, 0x46, 0x39, 0x12, 0xE6, 0xF7, 0x33, 0x9C, 0xDC, 0x1B, 0x2D, 0x34, 0xD4, 0xE5, 0x24, 0x1D, 0xCD, 0x9B, 0x1B, 0x86, 0xC7, 0x7D, 0x11, 0xA0, 0xC3, 0xD9, 0x06, 0x84, 0xC1, 0x03, 0xFC, 0x47, 0xC1, 0x4B, 0xF1, 0xE8, 0xC2, 0x04, 0xE7, 0x5A, 0xC6, 0x7C, 0xDD, 0x82, 0xCB, 0xFB, 0xD4, 0x3A, 0xD2, 0xC3, 0xCD, 0x4E, 0xDA, 0x0A, 0xC8, 0x80, 0xE3, 0xFA, 0xC3, 0x8D, 0xED, 0xB7, 0xC1, 0x24, 0xF8, 0x4D, 0xC1, 0xF8, 0x02, 0xC1, 0xC2, 0xB4, 0x0D, 0x0A, 0xC6, 0x06, 0x18, 0x0A, 0xCB, 0xA1, 0x21, 0x9F, 0xD1, 0x39, 0x2A, 0x94, 0xD9, 0x90, 0x31, 0xAD, 0xE2, 0x6C, 0x37, 0xA6, 0xEC, 0xA2, 0x3B, 0x32, 0xF7, 0x10, 0x3E, 0xFF, 0x01, 0xA4, 0x3E, 0xBE, 0x0C, 0x5B, 0x3D, 0x1C, 0x17, 0x3F, 0x3A, 0xC5, 0x20, 0x65, 0x35, 0x78, 0x29, 0xF7, 0x2E, 0xEB, 0x30, 0x21, 0x27, 0xEA, 0x36, 0x21, 0x1E, 0x47, 0x3B, 0x3C, 0x14, 0xDF, 0x3D, 0xBD, 0x09, 0x9E, 0x3E, 0xF4, 0xFE, 0x82, 0x3D, 0x34, 0xF4, 0x90, 0x3A, 0xCD, 0xE9, 0xDD, 0x35, 0x11, 0xE0, 0x93, 0x2F, 0x49, 0xD7, 0xDD, 0x27, 0xB6, 0xCF, 0xF8, 0x1E, 0x96, 0xC9, 0x28, 0x15, 0x14, 0xC5, 0xB8, 0x0A, 0x51, 0xC2, 0xF3, 0xFF, 0x65, 0xC1, 0x33, 0xF5, 0x59, 0xC2, 0xC4, 0xEA, 0x21, 0xC5, 0xF8, 0xE0, 0xA7, 0xC9, 0x18, 0xD8, 0xCF, 0xCF, 0x6A, 0xD0, 0x64, 0xD7, 0x27, 0xCA, 0x2D, 0xE0, 0x7E, 0xC5, 0xE9, 0xE9, 0x94, 0xC2, 0x4D, 0xF4, 0x7D, 0xC1, 0x08, 0xFF, 0x44, 0xC2, 0xC9, 0x09, 0xE1, 0xC4, 0x40, 0x14, 0x41, 0xC9, 0x1B, 0x1E, 0x43, 0xCF, 0x10, 0x27, 0xB5, 0xD6, 0xDB, 0x2E, 0x63, 0xDF, 0x40, 0x35, 0x0A, 0xE9, 0x0F, 0x3A, 0x5E, 0xF3, 0x20, 0x3D, 0x12, 0xFE, 0x62, 0x3E, 0xD4, 0x08, 0xC6, 0x3D, 0x51, 0x13, 0x54, 0x3B, 0x3B, 0x1D, 0x1F, 0x37, 0x45, 0x26, 0x42, 0x31, 0x2B, 0x2E, 0xF1, 0x29, 0xB1, 0x34, 0x60, 0x21, 0xA5, 0x39, 0xD0, 0x17, 0xE1, 0x3C, 0x8C, 0x0D, 0x4C, 0x3E, 0xE1, 0x02, 0xDC, 0x3D, 0x20, 0xF8, 0x94, 0x3B, 0x99, 0xED, 0x87, 0x37, 0xA4, 0xE3, 0xD2, 0x31, 0x84, 0xDA, 0xA1, 0x2A, 0x84, 0xD2, 0x2D, 0x22, 0xDC, 0xCB, 0xB4, 0x18, 0xC5, 0xC6, 0x80, 0x0E, 0x61, 0xC3, 0xDF, 0x03, 0xCB, 0xC1, 0x1E, 0xF9, 0x12, 0xC2, 0x95, 0xEE, 0x2C, 0xC4, 0x90, 0xE4, 0x11, 0xC8, 0x5C, 0xDB, 0x9F, 0xCD, 0x42, 0xD3, 0xAD, 0xD4, 0x7C, 0xCC, 0x03, 0xDD, 0x3F, 0xC7, 0x65, 0xE6, 0xB4, 0xC3, 0x87, 0xF0, 0xF4, 0xC1, 0x21, 0xFB, 0x0E, 0xC2, 0xDE, 0x05, 0xFF, 0xC3, 0x6D, 0x10, 0xBA, 0xC7, 0x7D, 0x1A, 0x20, 0xCD, 0xC5, 0x23, 0x0C, 0xD4, 0xF8, 0x2B, 0x45, 0xDC, 0xDD, 0x32, 0x8C, 0xE5, 0x3E, 0x38, 0xA1, 0xEF, 0xF1, 0x3B, 0x2E, 0xFA, 0xDB, 0x3D, 0xE7, 0x04, 0xEC, 0x3D, 0x7B, 0x0F, 0x26, 0x3C, 0x98, 0x19, 0x94, 0x38, 0xF0, 0x22, 0x54, 0x33, 0x3E, 0x2B, 0x8D, 0x2C, 0x42, 0x32, 0x74, 0x24, 0xC5, 0x37, 0x42, 0x1B, 0x9F, 0x3B, 0x44, 0x11, 0xB3, 0x3D, 0xBF, 0x06, 0xEF, 0x3D, 0x0A, 0xFC, 0x54, 0x3C, 0x74, 0xF1, 0xED, 0x38, 0x4D, 0xE7, 0xD4, 0x33, 0xE1, 0xDD, 0x2F, 0x2D, 0x7B, 0xD5, 0x34, 0x25, 0x5A, 0xCE, 0x1E, 0x1C, 0xB3, 0xC8, 0x30, 0x12, 0xB2, 0xC4, 0xB9, 0x07, 0x75, 0xC2, 0x09, 0xFD, 0x0E, 0xC2, 0x70, 0xF2, 0x7D, 0xC3, 0x3E, 0xE8, 0xBC, 0xC6, 0xC2, 0xDE, 0xAE, 0xCB, 0x43, 0xD6, 0x2D, 0xD2, 0x05, 0xCF, 0x09, 0xDA, 0x3D, 0xC9, 0x05, 0xE3, 0x15, 0xC5, 0xDF, 0xEC, 0xAE, 0xC2, 0x48, 0xF7, 0x1C, 0xC2, 0xF4, 0x01, 0x63, 0xC3, 0x91, 0x0C, 0x76, 0xC6, 0xCA, 0x16, 0x3F, 0xCB, 0x58, 0x20, 0x9B, 0xD1, 0xEB, 0x28, 0x57, 0xD9, 0x48, 0x30, 0x3A, 0xE2, 0x33, 0x36, 0xFF, 0xEB, 0x82, 0x3A, 0x5A, 0xF6, 0x0E, 0x3D, 0x01, 0x01, 0xCC, 0x3D, 0x9D, 0x0B, 0xB2, 0x3C, 0xE0, 0x15, 0xCA, 0x39, 0x7C, 0x1F, 0x27, 0x35, 0x26, 0x28, 0xF1, 0x2E, 0x9F, 0x2F, 0x54, 0x27, 0xAC, 0x35, 0x8D, 0x1E, 0x1F, 0x3A, 0xDD, 0x14, 0xD6, 0x3C, 0x8E, 0x0A, 0xBD, 0x3D, 0xF1, 0xFF, 0xCE, 0x3C, 0x52, 0xF5, 0x0F, 0x3A, 0x07, 0xEB, 0x96, 0x35, 0x5D, 0xE1, 0x83, 0x2F, 0x9D, 0xD8, 0x09, 0x28, 0x08, 0xD1, 0x5D, 0x1F, 0xDA, 0xCA, 0xC3, 0x15, 0x43, 0xC6, 0x83, 0x0B, 0x63, 0xC3, 0xED, 0x00, 0x51, 0xC2, 0x4F, 0xF6, 0x15, 0xC3, 0xFD, 0xEB, 0xAB, 0xC5, 0x43, 0xE2, 0xFC, 0xC9, 0x6E, 0xD9, 0xE7, 0xCF, 0xBF, 0xD1, 0x40, 0xD7, 0x72, 0xCB, 0xD2, 0xDF, 0xB5, 0xC6, 0x54, 0xE9, 0xAD, 0xC3, 0x85, 0xF3, 0x72, 0xC2, 0x14, 0xFE, 0x0B, 0xC3, 0xAF, 0x08, 0x74, 0xC5, 0x08, 0x13, 0x9D, 0xC9, 0xD0, 0x1C, 0x63, 0xCF, 0xB9, 0x25, 0x9C, 0xD6, 0x82, 0x2D, 0x0F, 0xDF, 0xF0, 0x33, 0x7E, 0xE8, 0xD2, 0x38, 0x9C, 0xF2, 0x01, 0x3C, 0x21, 0xFD, 0x66, 0x3D, 0xBB, 0x07, 0xF7, 0x3C, 0x1A, 0x12, 0xB9, 0x3A, 0xEE, 0x1B, 0xB9, 0x36, 0xEC, 0x24, 0x17, 0x31, 0xCF, 0x2C, 0x02, 0x2A, 0x5C, 0x33, 0xAD, 0x21, 0x61, 0x38, 0x56, 0x18, 0xB8, 0x3B, 0x47, 0x0E, 0x47, 0x3D, 0xCC, 0x03, 0x02, 0x3D, 0x34, 0xF9, 0xED, 0x3A, 0xD0, 0xEE, 0x17, 0x37, 0xF0, 0xE4, 0x9F, 0x31, 0xE0, 0xDB, 0xAA, 0x2A, 0xE4, 0xD3, 0x71, 0x22, 0x37, 0xCD, 0x32, 0x19, 0x10, 0xC8, 0x34, 0x0F, 0x91, 0xC4, 0xC4, 0x04, 0xD9, 0xC2, 0x31, 0xFA, 0xF2, 0xC2, 0xC8, 0xEF, 0xDE, 0xC4, 0xDD, 0xE5, 0x8B, 0xC8, 0xBB, 0xDC, 0xDC, 0xCD, 0xA4, 0xD4, 0xAE, 0xD4, 0xDB, 0xCD, 0xC8, 0xDC, 0x90, 0xC8, 0xF0, 0xE5, 0xEB, 0xC4, 0xDA, 0xEF, 0x0B, 0xC3, 0x40, 0xFA, 0xF8, 0xC2, 0xD0, 0x04, 0xB9, 0xC4, 0x3A, 0x0F, 0x3C, 0xC8, 0x30, 0x19, 0x69, 0xCD, 0x65, 0x22, 0x17, 0xD4, 0x92, 0x2A, 0x12, 0xDC, 0x79, 0x31, 0x20, 0xE5, 0xE7, 0x36, 0xF8, 0xEE, 0xB2, 0x3A, 0x52, 0xF9, 0xBC, 0x3C, 0xDD, 0x03, 0xF8, 0x3C, 0x4C, 0x0E, 0x62, 0x3B, 0x4A, 0x18, 0x08, 0x38, 0x90, 0x21, 0x03, 0x33, 0xD5, 0x29, 0x78, 0x2C, 0xDA, 0x30, 0x9C, 0x24, 0x69, 0x36, 0xAA, 0x1B, 0x58, 0x3A, 0xE3, 0x11, 0x8B, 0x3C, 0x96, 0x07, 0xF3, 0x3C, 0x10, 0xFD, 0x87, 0x3B, 0xA1, 0xF2, 0x55, 0x38, 0x99, 0xE8, 0x79, 0x33, 0x45, 0xDF, 0x13, 0x2D, 0xE7, 0xD6, 0x54, 0x25, 0xC6, 0xCF, 0x7C, 0x1C, 0x16, 0xCA, 0xCC, 0x12, 0x00, 0xC6, 0x8C, 0x08, 0xA4, 0xC3, 0x0A, 0xFE, 0x14, 0xC3, 0x9B, 0xF3, 0x55, 0xC4, 0x8A, 0xE9, 0x5E, 0xC7, 0x25, 0xE0, 0x12, 0xCC, 0xB5, 0xD7, 0x55, 0xD2, 0x77, 0xD0, 0xF2, 0xD9, 0xA3, 0xCA, 0xAF, 0xE2, 0x6B, 0xC6, 0x4D, 0xEC, 0xE7, 0xC3, 0x7F, 0xF6, 0x2D, 0xC3, 0xF8, 0x00, 0x42, 0xC4, 0x67, 0x0B, 0x20, 0xC7, 0x80, 0x15, 0xAD, 0xCB, 0xF4, 0x1E, 0xCC, 0xD1, 0x7B, 0x27, 0x49, 0xD9, 0xD3, 0x2E, 0xEB, 0xE1, 0xC6, 0x34, 0x73, 0xEB, 0x25, 0x39, 0x96, 0xF5, 0xD1, 0x3B, 0x07, 0x00, 0xB5, 0x3C, 0x78, 0x0A, 0xC8, 0x3B, 0x97, 0x14, 0x14, 0x39, 0x17, 0x1E, 0xAE, 0x34, 0xB3, 0x26, 0xB6, 0x2E, 0x26, 0x2E, 0x5A, 0x27, 0x37, 0x34, 0xD3, 0x1E, 0xBD, 0x38, 0x62, 0x15, 0x8F, 0x3B, 0x4D, 0x0B, 0x9D, 0x3C, 0xE5, 0x00, 0xDB, 0x3B, 0x74, 0xF6, 0x52, 0x39, 0x4F, 0xEC, 0x11, 0x35, 0xC1, 0xE2, 0x3F, 0x2F, 0x12, 0xDA, 0x06, 0x28, 0x85, 0xD2, 0x9B, 0x1F, 0x52, 0xCC, 0x40, 0x16, 0xA9, 0xC7, 0x3C, 0x0C, 0xB1, 0xC4, 0xDB, 0x01, 0x7C, 0xC3, 0x6D, 0xF7, 0x12, 0xC4, 0x44, 0xED, 0x73, 0xC6, 0xA7, 0xE3, 0x89, 0xCA, 0xE6, 0xDA, 0x36, 0xD0, 0x3F, 0xD3, 0x50, 0xD7, 0xEF, 0xCC, 0x9E, 0xDF, 0x24, 0xC8, 0xE1, 0xE8, 0x02, 0xC5, 0xD4, 0xF2, 0xA4, 0xC3, 0x2A, 0xFD, 0x11, 0xC4, 0x95, 0x07, 0x48, 0xC6, 0xC4, 0x11, 0x35, 0xCA, 0x6B, 0x1B, 0xBC, 0xCF, 0x40, 0x24, 0xB4, 0xD6, 0x00, 0x2C, 0xE4, 0xDE, 0x6F, 0x32, 0x10, 0xE8, 0x5D, 0x37, 0xF2, 0xF1, 0xA4, 0x3A, 0x3D, 0xFC, 0x2D, 0x3C, 0xA4, 0x06, 0xE8, 0x3B, 0xD9, 0x10, 0xDC, 0x39, 0x8B, 0x1A, 0x16, 0x36, 0x73, 0x23, 0xB5, 0x30, 0x48, 0x2B, 0xE1, 0x29, 0xD6, 0x31, 0xCF, 0x21, 0xE5, 0x36, 0xBA, 0x18, 0x53, 0x3A, 0xEB, 0x0E, 0x04, 0x3C, 0xA8, 0x04, 0xE9, 0x3B, 0x47, 0xFA, 0x07, 0x3A, 0x11, 0xF0, 0x6A, 0x36, 0x53, 0xE6, 0x30, 0x31, 0x5B, 0xDD, 0x80, 0x2A, 0x6C, 0xD5, 0x89, 0x22, 0xC4, 0xCE, 0x8E, 0x19, 0x91, 0xC9, 0xD2, 0x0F, 0xFE, 0xC5, 0x9D, 0x05, 0x25, 0xC4, 0x3E, 0xFB, 0x16, 0xC4, 0x04, 0xF1, 0xCE, 0xC5, 0x3F, 0xE7, 0x42, 0xC9, 0x37, 0xDE, 0x55, 0xCE, 0x2F, 0xD6, 0xE4, 0xD4, 0x6A, 0xCF, 0xBB, 0xDC, 0x17, 0xCA, 0x9C, 0xE5, 0x5E, 0xC6, 0x46, 0xEF, 0x5E, 0xC4, 0x6D, 0xF9, 0x25, 0xC4, 0xC8, 0x03, 0xB3, 0xC5, 0x02, 0x0E, 0xFE, 0xC8, 0xD0, 0x17, 0xEC, 0xCD, 0xE8, 0x20, 0x57, 0xD4, 0x04, 0x29, 0x0E, 0xDC, 0xE6, 0x2F, 0xD5, 0xE4, 0x5C, 0x35, 0x6C, 0xEE, 0x3A, 0x39, 0x86, 0xF8, 0x61, 0x3B, 0xDA, 0x02, 0xC4, 0x3B, 0x15, 0x0D, 0x5E, 0x3A, 0xED, 0x16, 0x3C, 0x37, 0x14, 0x20, 0x77, 0x32, 0x45, 0x28, 0x31, 0x2C, 0x43, 0x2F, 0x99, 0x24, 0xD7, 0x34, 0xEB, 0x1B, 0xDA, 0x38, 0x68, 0x12, 0x29, 0x3B, 0x5B, 0x08, 0xB3, 0x3B, 0x11, 0xFE, 0x78, 0x3A, 0xD4, 0xF3, 0x81, 0x37, 0xF6, 0xE9, 0xE2, 0x32, 0xC0, 0xE0, 0xBF, 0x2C, 0x7B, 0xD8, 0x46, 0x25, 0x62, 0xD1, 0xB4, 0x1C, 0xAD, 0xCB, 0x48, 0x13, 0x87, 0xC7, 0x49, 0x09, 0x10, 0xC5, 0x06, 0xFF, 0x5C, 0xC4, 0xCA, 0xF4, 0x6D, 0xC5, 0xE4, 0xEA, 0x3C, 0xC8, 0xA0, 0xE1, 0xB5, 0xCC, 0x46, 0xD9, 0xB3, 0xD2, 0x15, 0xD2, 0x0A, 0xDA, 0x40, 0xCC, 0x83, 0xE2, 0xF7, 0xC7, 0xD7, 0xEB, 0x5A, 0xC5, 0xC6, 0xF5, 0x7D, 0xC4, 0x02, 0x00, 0x64, 0xC5, 0x3D, 0x0A, 0x0B, 0xC8, 0x28, 0x14, 0x5B, 0xCC, 0x78, 0x1D, 0x35, 0xD2, 0xE8, 0x25, 0x6A, 0xD9, 0x33, 0x2D, 0xC5, 0xE1, 0x26, 0x33, 0x04, 0xEB, 0x91, 0x37, 0xE5, 0xF4, 0x56, 0x3A, 0x18, 0xFF, 0x5C, 0x3B, 0x50, 0x09, 0x9D, 0x3A, 0x41, 0x13, 0x21, 0x38, 0x9E, 0x1C, 0xF6, 0x33, 0x1E, 0x25, 0x43, 0x2E, 0x82, 0x2C, 0x2E, 0x27, 0x94, 0x32, 0xF0, 0x1E, 0x22, 0x37, 0xC7, 0x15, 0x0B, 0x3A, 0xF6, 0x0B, 0x3B, 0x3B, 0xCD, 0x01, 0xA7, 0x3A, 0x98, 0xF7, 0x54, 0x38, 0xA2, 0xED, 0x52, 0x34, 0x3B, 0xE4, 0xC3, 0x2E, 0xA8, 0xDB, 0xD0, 0x27, 0x2A, 0xD4, 0xAD, 0x1F, 0xFC, 0xCD, 0x9C, 0x16, 0x4B, 0xC9, 0xDB, 0x0C, 0x3D, 0xC6, 0xBE, 0x02, 0xE5, 0xC4, 0x8C, 0xF8, 0x50, 0xC5, 0x94, 0xEE, 0x7C, 0xC7, 0x21, 0xE5, 0x54, 0xCB, 0x7C, 0xDC, 0xC0, 0xD0, 0xE9, 0xD4, 0x90, 0xD7, 0x9C, 0xCE, 0x93, 0xDF, 0xC9, 0xC9, 0x8F, 0xE8, 0x96, 0xC6, 0x3B, 0xF2, 0x15, 0xC5, 0x4F, 0xFC, 0x59, 0xC5, 0x7D, 0x06, 0x5A, 0xC7, 0x78, 0x10, 0x0A, 0xCB, 0xF4, 0x19, 0x4F, 0xD0, 0xAA, 0x22, 0xFD, 0xD6, 0x56, 0x2A, 0xE4, 0xDE, 0xBE, 0x30, 0xC5, 0xE7, 0xB2, 0x35, 0x60, 0xF1, 0x0B, 0x39, 0x68, 0xFB, 0xB1, 0x3A, 0x91, 0x05, 0x97, 0x3A, 0x90, 0x0F, 0xBF, 0x38, 0x16, 0x19, 0x37, 0x35, 0xDB, 0x21, 0x19, 0x30, 0x9E, 0x29, 0x8C, 0x29, 0x21, 0x30, 0xC4, 0x21, 0x35, 0x35, 0xFB, 0x18, 0xB3, 0x38, 0x74, 0x0F, 0x82, 0x3A, 0x79, 0x05, 0x90, 0x3A, 0x54, 0xFB, 0xE1, 0x38, 0x56, 0xF1, 0x80, 0x35, 0xC7, 0xE7, 0x87, 0x30, 0xF1, 0xDE, 0x20, 0x2A, 0x1A, 0xD7, 0x75, 0x22, 0x7C, 0xD0, 0xC5, 0x19, 0x46, 0xCB, 0x53, 0x10, 0xA6, 0xC7, 0x65, 0x06, 0xAF, 0xC5, 0x47, 0xFC, 0x78, 0xC5, 0x46, 0xF2, 0xFE, 0xC6, 0xB1, 0xE8, 0x37, 0xCA, 0xCD, 0xDF, 0x09, 0xCF, 0xE1, 0xD7, 0x4F, 0xD5, 0x27, 0xD1, 0xD9, 0xDC, 0xD2, 0xCB, 0x6F, 0xE5, 0x0C, 0xC8, 0xCD, 0xEE, 0xF1, 0xC5, 0xAE, 0xF8, 0x92, 0xC5, 0xC5, 0x02, 0xEF, 0xC6, 0xC5, 0x0C, 0xFD, 0xC9, 0x62, 0x16, 0xA8, 0xCE, 0x53, 0x1F, 0xCB, 0xD4, 0x55, 0x27, 0x36, 0xDC, 0x28, 0x2E, 0xB1, 0xE4, 0x9B, 0x33, 0xFC, 0xED, 0x85, 0x37, 0xCD, 0xF7, 0xC7, 0x39, 0xDB, 0x01, 0x4E, 0x3A, 0xDC, 0x0B, 0x1A, 0x39, 0x81, 0x15, 0x32, 0x36, 0x7F, 0x1E, 0xAE, 0x31, 0x93, 0x26, 0xB1, 0x2B, 0x83, 0x2D, 0x65, 0x24, 0x12, 0x33, 0x05, 0x1C, 0x1F, 0x37, 0xD0, 0x12, 0x87, 0x39, 0x0E, 0x09, 0x37, 0x3A, 0x07, 0xFF, 0x2B, 0x39, 0x0A, 0xF5, 0x6D, 0x36, 0x5F, 0xEB, 0x0F, 0x32, 0x53, 0xE2, 0x34, 0x2C, 0x2D, 0xDA, 0x0A, 0x25, 0x25, 0xD3, 0xC6, 0x1C, 0x75, 0xCD, 0xA5, 0x13, 0x46, 0xC9, 0xF4, 0x09, 0xBA, 0xC6, 0xF6, 0xFF, 0xE3, 0xC5, 0xF9, 0xF5, 0xC5, 0xC6, 0x4A, 0xEC, 0x5B, 0xC9, 0x34, 0xE3, 0x91, 0xCD, 0xFA, 0xDA, 0x48, 0xD3, 0xD9, 0xD3, 0x53, 0xDA, 0x0D, 0xCE, 0x7C, 0xE2, 0xBC, 0xC9, 0x82, 0xEB, 0x0B, 0xC7, 0x26, 0xF5, 0x09, 0xC6, 0x19, 0xFF, 0xC5, 0xC6, 0x14, 0x09, 0x34, 0xC9, 0xC5, 0x12, 0x43, 0xCD, 0xE9, 0x1B, 0xD4, 0xD2, 0x34, 0x24, 0xBC, 0xD9, 0x6B, 0x2B, 0xC9, 0xE1, 0x56, 0x31, 0xBA, 0xEA, 0xC8, 0x35, 0x4C, 0xF4, 0x9E, 0x38, 0x37, 0xFE, 0xC5, 0x39, 0x2C, 0x08, 0x32, 0x39, 0xE2, 0x11, 0xED, 0x36, 0x0F, 0x1B, 0x05, 0x33, 0x6B, 0x23, 0x98, 0x2D, 0xB8, 0x2A, 0xD0, 0x26, 0xC1, 0x30, 0xE1, 0x1E, 0x53, 0x35, 0x09, 0x16, 0x4D, 0x38, 0x88, 0x0C, 0x9B, 0x39, 0xA9, 0x02, 0x33, 0x39, 0xB8, 0xF8, 0x15, 0x37, 0xFE, 0xEE, 0x55, 0x33, 0xC9, 0xE5, 0x0C, 0x2E, 0x5B, 0xDD, 0x67, 0x27, 0xF6, 0xD5, 0x95, 0x1F, 0xD4, 0xCF, 0xD4, 0x16, 0x21, 0xCB, 0x65, 0x0D, 0x01, 0xC8, 0x92, 0x03, 0x8D, 0xC6, 0xA6, 0xF9, 0xCE, 0xC6, 0xEA, 0xEF, 0xC2, 0xC8, 0xAC, 0xE6, 0x5D, 0xCC, 0x2E, 0xDE, 0x7F, 0xD1, 0xB5, 0xD6, 0x03, 0xD8, 0x77, 0xD0, 0xB7, 0xDF, 0xA5, 0xCB, 0x60, 0xE8, 0x60, 0xC8, 0xBC, 0xF1, 0xC5, 0xC6, 0x82, 0xFB, 0xDF, 0xC6, 0x69, 0x05, 0xAC, 0xC8, 0x25, 0x0F, 0x1E, 0xCC, 0x6D, 0x18, 0x1A, 0xD1, 0xF9, 0x20, 0x7D, 0xD7, 0x88, 0x28, 0x13, 0xDF, 0xE1, 0x2E, 0xA2, 0xE7, 0xD4, 0x33, 0xEA, 0xF0, 0x3A, 0x37, 0xA3, 0xFA, 0xFA, 0x38, 0x85, 0x04, 0x09, 0x39, 0x41, 0x0E, 0x64, 0x37, 0x90, 0x17, 0x19, 0x34, 0x2A, 0x20, 0x41, 0x2F, 0xCD, 0x27, 0x02, 0x29, 0x41, 0x2E, 0x8B, 0x21, 0x52, 0x33, 0x15, 0x19, 0xDC, 0x36, 0xE2, 0x0F, 0xC2, 0x38, 0x36, 0x06, 0xF8, 0x38, 0x5D, 0xFC, 0x7C, 0x37, 0x9E, 0xF2, 0x58, 0x34, 0x4A, 0xE9, 0xA7, 0x2F, 0xA2, 0xE0, 0x8A, 0x29, 0xEA, 0xD8, 0x32, 0x22, 0x5E, 0xD2, 0xD7, 0x19, 0x2E, 0xCD, 0xB7, 0x10, 0x82, 0xC9, 0x1A, 0x07, 0x76, 0xC7, 0x47, 0xFD, 0x19, 0xC7, 0x8B, 0xF3, 0x6E, 0xC8, 0x30, 0xEA, 0x6A, 0xCB, 0x79, 0xE1, 0xF6, 0xCF, 0xAF, 0xD9, 0xEF, 0xD5, 0x0B, 0xD3, 0x27, 0xDD, 0xBC, 0xCD, 0x68, 0xE5, 0xF0, 0xC9, 0x73, 0xEE, 0xBE, 0xC7, 0x01, 0xF8, 0x3A, 0xC7, 0xCC, 0x01, 0x66, 0xC8, 0x88, 0x0B, 0x3C, 0xCB, 0xE7, 0x14, 0xA0, 0xCF, 0xA8, 0x1D, 0x77, 0xD5, 0x84, 0x25, 0x8F, 0xDC, 0x42, 0x2C, 0xB4, 0xE4, 0xAD, 0x31, 0xAB, 0xED, 0x9D, 0x35, 0x29, 0xF7, 0xF3, 0x37, 0xEB, 0x00, 0x9E, 0x38, 0xA3, 0x0A, 0x99, 0x37, 0x09, 0x14, 0xEC, 0x34, 0xD4, 0x1C, 0xAC, 0x30, 0xC3, 0x24, 0xFA, 0x2A, 0x99, 0x2B, 0x00, 0x24, 0x21, 0x31, 0xF7, 0x1B, 0x31, 0x35, 0x18, 0x13, 0xAA, 0x37, 0xA9, 0x09, 0x7D, 0x38, 0xF2, 0xFF, 0xA0, 0x37, 0x3D, 0xF6, 0x1B, 0x35, 0xD3, 0xEC, 0x01, 0x31, 0xFB, 0xE3, 0x73, 0x2B, 0xFD, 0xDB, 0x9A, 0x24, 0x0F, 0xD5, 0xAC, 0x1C, 0x6C, 0xCF, 0xE3, 0x13, 0x3A, 0xCB, 0x86, 0x0A, 0x9C, 0xC8, 0xD8, 0x00, 0xA5, 0xC7, 0x26, 0xF7, 0x5A, 0xC8, 0xB9, 0xED, 0xB8, 0xCA, 0xD9, 0xE4, 0xAA, 0xCE, 0xC8, 0xDC, 0x15, 0xD4, 0xC5, 0xD5, 0xCC, 0xDA, 0x06, 0xD0, 0x9F, 0xE2, 0xB3, 0xCB, 0x50, 0xEB, 0xF3, 0xC8, 0x9E, 0xF4, 0xD5, 0xC7, 0x40, 0xFE, 0x63, 0xC8, 0xED, 0x07, 0x99, 0xCA, 0x5D, 0x11, 0x66, 0xCE, 0x45, 0x1A, 0xAB, 0xD3, 0x67, 0x22, 0x43, 0xDA, 0x7D, 0x29, 0xF8, 0xE1, 0x59, 0x2F, 0x90, 0xEA, 0xCB, 0x33, 0xCB, 0xF3, 0xAE, 0x36, 0x62, 0xFD, 0xF3, 0x37, 0x0B, 0x07, 0x8D, 0x37, 0x7E, 0x10, 0x7D, 0x35, 0x6E, 0x19, 0xD7, 0x31, 0x9F, 0x21, 0xB5, 0x2C, 0xCC, 0x28, 0x40, 0x26, 0xC1, 0x2E, 0xA8, 0x1E, 0x51, 0x33, 0x27, 0x16, 0x58, 0x36, 0xFF, 0x0C, 0xC2, 0x37, 0x74, 0x03, 0x82, 0x37, 0xD2, 0xF9, 0x9B, 0x35, 0x5E, 0xF0, 0x1B, 0x32, 0x64, 0xE7, 0x20, 0x2D, 0x27, 0xDF, 0xCB, 0x26, 0xE5, 0xD7, 0x50, 0x1F, 0xD6, 0xD1, 0xE8, 0x16, 0x27, 0xCD, 0xD2, 0x0D, 0xFD, 0xC9, 0x54, 0x04, 0x6E, 0xC8, 0xB7, 0xFA, 0x87, 0xC8, 0x45, 0xF1, 0x47, 0xCA, 0x44, 0xE8, 0xA1, 0xCD, 0xF8, 0xDF, 0x78, 0xD2, 0xA3, 0xD8, 0xAB, 0xD8, 0x7A, 0xD2, 0x08, 0xE0, 0xAE, 0xCD, 0x56, 0xE8, 0x62, 0xCA, 0x59, 0xF1, 0xAF, 0xC8, 0xC9, 0xFA, 0xA1, 0xC8, 0x5D, 0x04, 0x3A, 0xCA, 0xD2, 0x0D, 0x6D, 0xCD, 0xD9, 0x16, 0x20, 0xD2, 0x31, 0x1F, 0x2F, 0xD8, 0x9A, 0x26, 0x6E, 0xDF, 0xDC, 0x2C, 0xA3, 0xE7, 0xC6, 0x31, 0x90, 0xF0, 0x33, 0x35, 0xF3, 0xF9, 0x0B, 0x37, 0x81, 0x03, 0x3E, 0x37, 0xF2, 0x0C, 0xCD, 0x35, 0x01, 0x16, 0xC1, 0x32, 0x64, 0x1E, 0x32, 0x2E, 0xE1, 0x25, 0x45, 0x28, 0x39, 0x2C, 0x26, 0x21, 0x41, 0x31, 0x0B, 0x19, 0xCF, 0x34, 0x31, 0x10, 0xCB, 0x36, 0xDF, 0x06, 0x24, 0x37, 0x59, 0xFD, 0xDB, 0x35, 0xE8, 0xF3, 0xF5, 0x32, 0xD5, 0xEA, 0x8C, 0x2E, 0x65, 0xE2, 0xC1, 0x28, 0xD7, 0xDA, 0xC1, 0x21, 0x67, 0xD4, 0xC0, 0x19, 0x44, 0xCF, 0xFC, 0x10, 0x93, 0xCB, 0xB8, 0x07, 0x75, 0xC9, 0x3C, 0xFE, 0xF6, 0xC8, 0xCE, 0xF4, 0x18, 0xCA, 0xB6, 0xEB, 0xD6, 0xCC, 0x3B, 0xE3, 0x1B, 0xD1, 0x9E, 0xDB, 0xC4, 0xD6, 0x15, 0xD5, 0xA5, 0xDD, 0xD5, 0xCF, 0x8B, 0xE5, 0x06, 0xCC, 0x37, 0xEE, 0xC2, 0xC9, 0x6B, 0xF7, 0x1E, 0xC9, 0xE0, 0x00, 0x1A, 0xCA, 0x4A, 0x0A, 0xB1, 0xCC, 0x65, 0x13, 0xD2, 0xD0, 0xEB, 0x1B, 0x55, 0xD6, 0x9A, 0x23, 0x19, 0xDD, 0x37, 0x2A, 0xE3, 0xE4, 0x93, 0x2F, 0x7A, 0xED, 0x82, 0x33, 0x9D, 0xF6, 0xE8, 0x35, 0x06, 0x00, 0xB2, 0x36, 0x6E, 0x09, 0xDC, 0x35, 0x8B, 0x12, 0x6B, 0x33, 0x1B, 0x1B, 0x72, 0x2F, 0xD8, 0x22, 0x11, 0x2A, 0x8D, 0x29, 0x6D, 0x23, 0x04, 0x2F, 0xC0, 0x1B, 0x10, 0x33, 0x3F, 0x13, 0x9A, 0x35, 0x2C, 0x0A, 0x88, 0x36, 0xCE, 0x00, 0xD9, 0x35, 0x6A, 0xF7, 0x8E, 0x33, 0x4B, 0xEE, 0xBC, 0x2F, 0xB3, 0xE5, 0x7D, 0x2A, 0xE4, 0xDD, 0xFB, 0x23, 0x1D, 0xD7, 0x68, 0x1C, 0x8B, 0xD1, 0xFE, 0x13, 0x5E, 0xCD, 0xFD, 0x0A, 0xB5, 0xCA, 0xAA, 0x01, 0xA0, 0xC9, 0x4D, 0xF8, 0x2A, 0xCA, 0x2D, 0xEF, 0x50, 0xCC, 0x8C, 0xE6, 0xFB, 0xCF, 0xB0, 0xDE, 0x18, 0xD5, 0xD2, 0xD7, 0x79, 0xDB, 0x28, 0xD2, 0xEE, 0xE2, 0xDD, 0xCD, 0x40, 0xEB, 0x11, 0xCB, 0x2E, 0xF4, 0xD8, 0xC9, 0x75, 0xFD, 0x3D, 0xCA, 0xCD, 0x06, 0x3A, 0xCC, 0xF1, 0x0F, 0xC3, 0xCF, 0x98, 0x18, 0xBA, 0xD4, 0x82, 0x20, 0xFA, 0xDA, 0x72, 0x27, 0x52, 0xE2, 0x36, 0x2D, 0x8C, 0xEA, 0x9E, 0x31, 0x67, 0xF3, 0x8C, 0x34, 0xA1, 0xFC, 0xE8, 0x35, 0xF3, 0x05, 0xAB, 0x35, 0x18, 0x0F, 0xD2, 0x33, 0xC6, 0x17, 0x70, 0x30, 0xBD, 0x1F, 0x9D, 0x2B, 0xC0, 0x26, 0x7E, 0x25, 0x9C, 0x2C, 0x43, 0x1E, 0x22, 0x31, 0x22, 0x16, 0x31, 0x34, 0x58, 0x0D, 0xB0, 0x35, 0x2D, 0x04, 0x96, 0x35, 0xE1, 0xFA, 0xE7, 0x33, 0xBE, 0xF1, 0xA9, 0x30, 0x0B, 0xE9, 0xFA, 0x2B, 0x07, 0xE1, 0xFC, 0x25, 0xEF, 0xD9, 0xDF, 0x1E, 0xFE, 0xD3, 0xD8, 0x16, 0x5A, 0xCF, 0x23, 0x0E, 0x2A, 0xCC, 0x03, 0x05, 0x87, 0xCA, 0xC0, 0xFB, 0x7C, 0xCA, 0xA0, 0xF2, 0x06, 0xCC, 0xE4, 0xE9, 0x1D, 0xCF, 0xD6, 0xE1, 0xA8, 0xD3, 0xAE, 0xDA, 0x85, 0xD9, 0xA2, 0xD4, 0x85, 0xE0, 0xE3, 0xCF, 0x74, 0xE8, 0x95, 0xCC, 0x14, 0xF1, 0xCC, 0xCA, 0x24, 0xFA, 0x9C, 0xCA, 0x5F, 0x03, 0x02, 0xCC, 0x7F, 0x0C, 0xF3, 0xCE, 0x3C, 0x15, 0x5A, 0xD3, 0x56, 0x1D, 0x15, 0xD9, 0x90, 0x24, 0xF4, 0xDF, 0xB2, 0x2A, 0xCA, 0xE7, 0x8D, 0x2F, 0x55, 0xF0, 0xFB, 0x32, 0x56, 0xF9, 0xE5, 0x34, 0x88, 0x02, 0x3C, 0x35, 0xA6, 0x0B, 0xFC, 0x33, 0x69, 0x14, 0x2F, 0x31, 0x8E, 0x1C, 0xED, 0x2C, 0xD9, 0x23, 0x55, 0x27, 0x10, 0x2A, 0x92, 0x20, 0x04, 0x2F, 0xD8, 0x18, 0x93, 0x32, 0x61, 0x10, 0x9F, 0x34, 0x70, 0x07, 0x19, 0x35, 0x48, 0xFE, 0xFF, 0x33, 0x2D, 0xF5, 0x59, 0x31, 0x67, 0xEC, 0x3C, 0x2D, 0x39, 0xE4, 0xC5, 0x27, 0xDF, 0xDC, 0x20, 0x21, 0x91, 0xD6, 0x82, 0x19, 0x82, 0xD1, 0x22, 0x11, 0xD5, 0xCD, 0x3F, 0x08, 0xA7, 0xCB, 0x21, 0xFF, 0x08, 0xCB, 0x0B, 0xF6, 0xFD, 0xCB, 0x44, 0xED, 0x7E, 0xCE, 0x0A, 0xE5, 0x79, 0xD2, 0xA1, 0xDD, 0xCB, 0xD7, 0x40, 0xD7, 0x51, 0xDE, 0x16, 0xD2, 0xD4, 0xE5, 0x4A, 0xCE, 0x1F, 0xEE, 0xFA, 0xCB, 0xEF, 0xF6, 0x39, 0xCB, 0x03, 0x00, 0x08, 0xCC, 0x16, 0x09, 0x63, 0xCE, 0xE1, 0x11, 0x39, 0xD2, 0x20, 0x1A, 0x6B, 0xD7, 0x97, 0x21, 0xCF, 0xDD, 0x0D, 0x28, 0x38, 0xE5, 0x50, 0x2D, 0x6B, 0xED, 0x38, 0x31, 0x29, 0xF6, 0xAA, 0x33, 0x33, 0xFF, 0x91, 0x34, 0x3F, 0x08, 0xE5, 0x33, 0x0A, 0x11, 0xAE, 0x31, 0x53, 0x19, 0xFE, 0x2D, 0xD9, 0x20, 0xF1, 0x28, 0x63, 0x27, 0xAB, 0x22, 0xBF, 0x2C, 0x5E, 0x1B, 0xC4, 0x30, 0x42, 0x13, 0x56, 0x33, 0x94, 0x0A, 0x5F, 0x34, 0x98, 0x01, 0xDA, 0x33, 0x91, 0xF8, 0xC9, 0x31, 0xC5, 0xEF, 0x3D, 0x2E, 0x75, 0xE7, 0x51, 0x29, 0xE3, 0xDF, 0x2B, 0x23, 0x47, 0xD9, 0xFB, 0x1B, 0xD1, 0xD3, 0xF7, 0x13, 0xAE, 0xCF, 0x5C, 0x0B, 0xFE, 0xCC, 0x6C, 0x02, 0xD2, 0xCB, 0x6C, 0xF9, 0x32, 0xCC, 0xA0, 0xF0, 0x1E, 0xCE, 0x49, 0xE8, 0x85, 0xD1, 0xA9, 0xE0, 0x4D, 0xD6, 0xFB, 0xD9, 0x54, 0xDC, 0x6F, 0xD4, 0x68, 0xE3, 0x30, 0xD0, 0x54, 0xEB, 0x5F, 0xCD, 0xDC, 0xF3, 0x10, 0xCC, 0xBE, 0xFC, 0x4C, 0xCC, 0xB7, 0x05, 0x14, 0xCE, 0x84, 0x0E, 0x55, 0xD1, 0xDF, 0x16, 0xFC, 0xD5, 0x8B, 0x1E, 0xE1, 0xDB, 0x4C, 0x25, 0xD8, 0xE2, 0xED, 0x2A, 0xAB, 0xEA, 0x48, 0x2F, 0x21, 0xF3, 0x39, 0x32, 0xF4, 0xFB, 0xAC, 0x33, 0xE7, 0x04, 0x94, 0x33, 0xB1, 0x0D, 0xF0, 0x31, 0x12, 0x16, 0xD2, 0x2E, 0xC8, 0x1D, 0x51, 0x2A, 0x9A, 0x24, 0x8C, 0x24, 0x54, 0x2A, 0xB2, 0x1D, 0xCA, 0x2E, 0xF7, 0x15, 0xD9, 0x31, 0x96, 0x0D, 0x6C, 0x33, 0xCF, 0x04, 0x78, 0x33, 0xE6, 0xFB, 0xFB, 0x31, 0x1D, 0xF3, 0x01, 0x2F, 0xB9, 0xEA, 0xA1, 0x2A, 0xF8, 0xE2, 0xFE, 0x24, 0x14, 0xDC, 0x42, 0x1E, 0x46, 0xD6, 0xA1, 0x16, 0xB5, 0xD1, 0x54, 0x0E, 0x86, 0xCE, 0x9B, 0x05, 0xD2, 0xCC, 0xBC, 0xFC, 0xA3, 0xCC, 0xF6, 0xF3, 0xFA, 0xCD, 0x8D, 0xEB, 0xD1, 0xD0, 0xC3, 0xE3, 0x0C, 0xD5, 0xCF, 0xDC, 0x8F, 0xDA, 0xEC, 0xD6, 0x2D, 0xE1, 0x41, 0xD2, 0xB5, 0xE8, 0xF4, 0xCE, 0xEC, 0xF0, 0x1F, 0xCD, 0x96, 0xF9, 0xCC, 0xCC, 0x6D, 0x02, 0x00, 0xCE, 0x30, 0x0B, 0xB0, 0xD0, 0x9B, 0x13, 0xC9, 0xD4, 0x70, 0x1B, 0x2A, 0xDA, 0x71, 0x22, 0xAA, 0xE0, 0x6A, 0x28, 0x19, 0xE8, 0x2E, 0x2D, 0x3B, 0xF0, 0x99, 0x30, 0xD4, 0xF8, 0x90, 0x32, 0xA0, 0x01, 0x05, 0x33, 0x60, 0x0A, 0xF5, 0x31, 0xCE, 0x12, 0x69, 0x2F, 0xAB, 0x1A, 0x74, 0x2B, 0xBA, 0x21, 0x33, 0x26, 0xC9, 0x27, 0xD2, 0x1F, 0xA5, 0x2C, 0x7E, 0x18, 0x2D, 0x30, 0x71, 0x10, 0x44, 0x32, 0xE9, 0x07, 0xDB, 0x32, 0x27, 0xFF, 0xF1, 0x31, 0x6C, 0xF6, 0x88, 0x2F, 0xFC, 0xED, 0xB5, 0x2B, 0x19, 0xE6, 0x97, 0x26, 0xFA, 0xDE, 0x55, 0x20, 0xD8, 0xD8, 0x1C, 0x19, 0xE3, 0xD3, 0x26, 0x11, 0x40, 0xD0, 0xAE, 0x08, 0x07, 0xCE, 0xF6, 0xFF, 0x4D, 0xCD, 0x41, 0xF7, 0x16, 0xCE, 0xD0, 0xEE, 0x59, 0xD0, 0xE5, 0xE6, 0x07, 0xD4, 0xB9, 0xDF, 0x04, 0xD9, 0x85, 0xD9, 0x2A, 0xDF, 0x78, 0xD4, 0x47, 0xE6, 0xB7, 0xD0, 0x25, 0xEE, 0x61, 0xCE, 0x8D, 0xF6, 0x83, 0xCD, 0x38, 0xFF, 0x27, 0xCE, 0xE8, 0x07, 0x48, 0xD0, 0x59, 0x10, 0xD3, 0xD3, 0x4B, 0x18, 0xAE, 0xD8, 0x83, 0x1F, 0xB4, 0xDE, 0xC9, 0x25, 0xB5, 0xE5, 0xED, 0x2A, 0x7E, 0xED, 0xCB, 0x2E, 0xD2, 0xF5, 0x40, 0x31, 0x71, 0xFE, 0x40, 0x32, 0x1B, 0x07, 0xBE, 0x31, 0x8C, 0x0F, 0xC2, 0x2F, 0x85, 0x17, 0x5A, 0x2C, 0xC9, 0x1E, 0xA0, 0x27, 0x21, 0x25, 0xBB, 0x21, 0x5B, 0x2A, 0xD4, 0x1A, 0x53, 0x2E, 0x24, 0x13, 0xE8, 0x30, 0xE2, 0x0A, 0x09, 0x32, 0x50, 0x02, 0xA9, 0x31, 0xAD, 0xF9, 0xD3, 0x2F, 0x3C, 0xF1, 0x8E, 0x2C, 0x3D, 0xE9, 0xF7, 0x27, 0xEF, 0xE1, 0x2F, 0x22, 0x85, 0xDB, 0x66, 0x1B, 0x35, 0xD6, 0xCD, 0x13, 0x23, 0xD2, 0x9E, 0x0B, 0x70, 0xCF, 0x19, 0x03, 0x2F, 0xCE, 0x7E, 0xFA, 0x6A, 0xCE, 0x10, 0xF2, 0x1E, 0xD0, 0x0B, 0xEA, 0x3F, 0xD3, 0xB2, 0xE2, 0xB5, 0xD7, 0x38, 0xDC, 0x5B, 0xDD, 0xD3, 0xD6, 0x09, 0xE4, 0xA6, 0xD2, 0x89, 0xEB, 0xD5, 0xCF, 0xA5, 0xF3, 0x72, 0xCE, 0x1D, 0xFC, 0x8B, 0xCE, 0xB0, 0x04, 0x1B, 0xD0, 0x1C, 0x0D, 0x1A, 0xD3, 0x24, 0x15, 0x6D, 0xD7, 0x87, 0x1C, 0xF3, 0xDC, 0x10, 0x23, 0x85, 0xE3, 0x8C, 0x28, 0xEC, 0xEA, 0xD2, 0x2C, 0xF4, 0xF2, 0xC0, 0x2F, 0x5D, 0xFB, 0x44, 0x31, 0xE7, 0x03, 0x4C, 0x31, 0x51, 0x0C, 0xDF, 0x2F, 0x5C, 0x14, 0x06, 0x2D, 0xCA, 0x1B, 0xD4, 0x28, 0x63, 0x22, 0x6D, 0x23, 0xF3, 0x27, 0xF9, 0x1C, 0x51, 0x2C, 0xA9, 0x15, 0x5E, 0x2F, 0xB7, 0x0D, 0x00, 0x31, 0x5D, 0x05, 0x2B, 0x31, 0xDB, 0xFC, 0xE1, 0x2F, 0x75, 0xF4, 0x2B, 0x2D, 0x67, 0xEC, 0x1D, 0x29, 0xF1, 0xE4, 0xD4, 0x23, 0x4B, 0xDE, 0x7F, 0x1D, 0xA6, 0xD8, 0x47, 0x16, 0x2F, 0xD4, 0x68, 0x0E, 0x07, 0xD1, 0x1F, 0x06, 0x44, 0xCF, 0xA8, 0xFD, 0xF6, 0xCE, 0x45, 0xF5, 0x1C, 0xD0, 0x34, 0xED, 0xB2, 0xD2, 0xB6, 0xE5, 0x9E, 0xD6, 0x01, 0xDF, 0xC5, 0xDB, 0x49, 0xD9, 0xFE, 0xE1, 0xBA, 0xD4, 0x1B, 0xE9, 0x76, 0xD1, 0xE4, 0xF0, 0x96, 0xCF, 0x1F, 0xF9, 0x25, 0xCF, 0x8D, 0x01, 0x2A, 0xD0, 0xEA, 0x09, 0x9B, 0xD2, 0xFB, 0x11, 0x66, 0xD6, 0x81, 0x19, 0x6B, 0xDB, 0x44, 0x20, 0x87, 0xE1, 0x0E, 0x26, 0x8A, 0xE8, 0xB4, 0x2A, 0x3E, 0xF0, 0x15, 0x2E, 0x68, 0xF8, 0x15, 0x30, 0xCB, 0x00, 0xA6, 0x30, 0x24, 0x09, 0xC3, 0x2F, 0x35, 0x11, 0x74, 0x2D, 0xC2, 0x18, 0xCD, 0x29, 0x91, 0x1F, 0xE7, 0x24, 0x6F, 0x25, 0xEA, 0x1E, 0x2B, 0x2A, 0x00, 0x18, 0xA5, 0x2D, 0x63, 0x10, 0xC4, 0x2F, 0x4A, 0x08, 0x76, 0x30, 0xF4, 0xFF, 0xB7, 0x2F, 0x9F, 0xF7, 0x8B, 0x2D, 0x8E, 0xEF, 0x06, 0x2A, 0xFB, 0xE7, 0x40, 0x25, 0x20, 0xE1, 0x61, 0x1F, 0x31, 0xDB, 0x92, 0x18, 0x5E, 0xD6, 0x0A, 0x11, 0xC9, 0xD2, 0x03, 0x09, 0x8C, 0xD0, 0xBA, 0x00, 0xBA, 0xCF, 0x6B, 0xF8, 0x57, 0xD0, 0x59, 0xF0, 0x5F, 0xD2, 0xC0, 0xE8, 0xC2, 0xD5, 0xDB, 0xE1, 0x69, 0xDA, 0xDB, 0xDB, 0x29, 0xE0, 0xF2, 0xD6, 0xDC, 0xE6, 0x42, 0xD3, 0x4D, 0xEE, 0xE9, 0xD0, 0x42, 0xF6, 0xF4, 0xCF, 0x81, 0xFE, 0x70, 0xD0, 0xC7, 0x06, 0x57, 0xD2, 0xD8, 0x0E, 0x98, 0xD5, 0x76, 0x16, 0x1C, 0xDA, 0x67, 0x1D, 0xBF, 0xDF, 0x76, 0x23, 0x56, 0xE6, 0x76, 0x28, 0xB1, 0xED, 0x40, 0x2C, 0x94, 0xF5, 0xB6, 0x2E, 0xC5, 0xFD, 0xC8, 0x2F, 0x04, 0x06, 0x6F, 0x2F, 0x15, 0x0E, 0xAA, 0x2D, 0xB6, 0x15, 0x8C, 0x2A, 0xB2, 0x1C, 0x29, 0x26, 0xD1, 0x22, 0xA5, 0x20, 0xE4, 0x27, 0x27, 0x1A, 0xC7, 0x2B, 0xE6, 0x12, 0x5B, 0x2E, 0x15, 0x0B, 0x8D, 0x2F, 0xF3, 0x02, 0x55, 0x2F, 0xBA, 0xFA, 0xB2, 0x2D, 0xAC, 0xF2, 0xB5, 0x2A, 0x07, 0xEB, 0x73, 0x26, 0x02, 0xE4, 0x0D, 0x21, 0xD4, 0xDD, 0xAD, 0x1A, 0xAC, 0xD8, 0x83, 0x13, 0xB1, 0xD4, 0xC5, 0x0B, 0x01, 0xD2, 0xB0, 0x03, 0xB0, 0xD0, 0x81, 0xFB, 0xC7, 0xD0, 0x76, 0xF3, 0x47, 0xD2, 0xCD, 0xEB, 0x21, 0xD5, 0xBF, 0xE4, 0x43, 0xD9, 0x83, 0xDE, 0x89, 0xDE, 0x46, 0xD9, 0xCF, 0xE4, 0x34, 0xD5, 0xE1, 0xEB, 0x68, 0xD2, 0x8B, 0xF3, 0xF7, 0xD0, 0x92, 0xFB, 0xEF, 0xD0, 0xB7, 0x03, 0x4C, 0xD2, 0xBE, 0x0B, 0x06, 0xD5, 0x6B, 0x13, 0x05, 0xD9, 0x80, 0x1A, 0x2D, 0xDE, 0xCB, 0x20, 0x56, 0xE4, 0x19, 0x26, 0x50, 0xEB, 0x45, 0x2A, 0xE5, 0xF2, 0x2B, 0x2D, 0xDE, 0xFA, 0xBC, 0x2E, 0xF9, 0x02, 0xE5, 0x2E, 0xFC, 0x0A, 0xA8, 0x2D, 0xAC, 0x12, 0x11, 0x2B, 0xC9, 0x19, 0x31, 0x27, 0x21, 0x20, 0x29, 0x22, 0x81, 0x25, 0x1D, 0x1C, 0xC3, 0x29, 0x3B, 0x15, 0xC5, 0x2C, 0xBC, 0x0D, 0x73, 0x2E, 0xD2, 0x05, 0xBC, 0x2E, 0xC0, 0xFD, 0xA2, 0x2D, 0xC1, 0xF5, 0x2B, 0x2B, 0x12, 0xEE, 0x6E, 0x27, 0xED, 0xE6, 0x84, 0x22, 0x88, 0xE0, 0x94, 0x1C, 0x16, 0xDB, 0xCD, 0x15, 0xBC, 0xD6, 0x61, 0x0E, 0xA0, 0xD3, 0x8A, 0x06, 0xD7, 0xD1, 0x82, 0xFE, 0x6C, 0xD1, 0x87, 0xF6, 0x65, 0xD2, 0xD6, 0xEE, 0xB8, 0xD4, 0xAB, 0xE7, 0x57, 0xD8, 0x3A, 0xE1, 0x21, 0xDD, 0xB5, 0xDB, 0xF4, 0xE2, 0x49, 0xD7, 0xA3, 0xE9, 0x12, 0xD4, 0xF9, 0xF0, 0x2A, 0xD2, 0xC0, 0xF8, 0xA0, 0xD1, 0xBD, 0x00, 0x78, 0xD2, 0xB2, 0x08, 0xAB, 0xD4, 0x63, 0x10, 0x27, 0xD8, 0x94, 0x17, 0xD2, 0xDC, 0x10, 0x1E, 0x88, 0xE2, 0xA5, 0x23, 0x1D, 0xE9, 0x28, 0x28, 0x5E, 0xF0, 0x79, 0x2B, 0x15, 0xF8, 0x7C, 0x2D, 0x05, 0x00, 0x26, 0x2E, 0xF4, 0x07, 0x6F, 0x2D, 0xA4, 0x0F, 0x5D, 0x2B, 0xDB, 0x16, 0x02, 0x28, 0x62, 0x1D, 0x76, 0x23, 0x07, 0x23, 0xDE, 0x1D, 0x9E, 0x27, 0x64, 0x17, 0x09, 0x2B, 0x36, 0x10, 0x29, 0x2D, 0x93, 0x08, 0xF2, 0x2D, 0xAE, 0x00, 0x5A, 0x2D, 0xC6, 0xF8, 0x6A, 0x2B, 0x17, 0xF1, 0x31, 0x28, 0xDB, 0xE9, 0xC3, 0x23, 0x4A, 0xE3, 0x48, 0x1E, 0x96, 0xDD, 0xE8, 0x17, 0xE8, 0xD8, 0xD4, 0x10, 0x66, 0xD5, 0x40, 0x09, 0x2A, 0xD3, 0x68, 0x01, 0x44, 0xD2, 0x86, 0xF9, 0xB9, 0xD2, 0xDA, 0xF1, 0x89, 0xD4, 0x9A, 0xEA, 0xA3, 0xD7, 0xFF, 0xE3, 0xEF, 0xDB, 0x3B, 0xDE, 0x4D, 0xE1, 0x7B, 0xD9, 0x93, 0xE7, 0xE1, 0xD5, 0x91, 0xEE, 0x8A, 0xD3, 0x12, 0xF6, 0x84, 0xD2, 0xDE, 0xFD, 0xDA, 0xD2, 0xB8, 0x05, 0x89, 0xD4, 0x62, 0x0D, 0x81, 0xD7, 0xA5, 0x14, 0xAD, 0xDB, 0x47, 0x1B, 0xED, 0xE0, 0x1B, 0x21, 0x1B, 0xE7, 0xED, 0x25, 0x01, 0xEE, 0xA1, 0x29, 0x6F, 0xF5, 0x13, 0x2C, 0x2D, 0xFD, 0x36, 0x2D, 0xFE, 0x04, 0x00, 0x2D, 0xA7, 0x0C, 0x72, 0x2B, 0xEC, 0x13, 0x9A, 0x28, 0x9A, 0x1A, 0x8C, 0x24, 0x78, 0x20, 0x6A, 0x1F, 0x5F, 0x25, 0x5A, 0x19, 0x28, 0x29, 0x8A, 0x12, 0xB6, 0x2B, 0x2E, 0x0B, 0xF5, 0x2C, 0x7F, 0x03, 0xDE, 0x2C, 0xB7, 0xFB, 0x72, 0x2B, 0x12, 0xF4, 0xBA, 0x28, 0xCA, 0xEC, 0xCC, 0x24, 0x14, 0xE6, 0xC9, 0x1F, 0x28, 0xE0, 0xD3, 0x19, 0x2F, 0xDB, 0x1A, 0x13, 0x50, 0xD7, 0xD2, 0x0B, 0xA7, 0xD4, 0x31, 0x04, 0x4A, 0xD3, 0x73, 0xFC, 0x42, 0xD3, 0xD2, 0xF4, 0x8F, 0xD4, 0x87, 0xED, 0x26, 0xD7, 0xCA, 0xE6, 0xF3, 0xDA, 0xD1, 0xE0, 0xDA, 0xDF, 0xC8, 0xDB, 0xB4, 0xE5, 0xD2, 0xD7, 0x56, 0xEC, 0x10, 0xD5, 0x8A, 0xF3, 0x97, 0xD3, 0x1B, 0xFB, 0x6F, 0xD3, 0xD0, 0x02, 0x9A, 0xD4, 0x6D, 0x0A, 0x12, 0xD7, 0xB9, 0x11, 0xC1, 0xDA, 0x7C, 0x18, 0x89, 0xDF, 0x81, 0x1E, 0x48, 0xE5, 0x9B, 0x23, 0xD0, 0xEB, 0xA7, 0x27, 0xF1, 0xF2, 0x82, 0x2A, 0x73, 0xFA, 0x18, 0x2C, 0x1E, 0x02, 0x5E, 0x2C, 0xB5, 0x09, 0x51, 0x2B, 0x01, 0x11, 0xFA, 0x28, 0xC9, 0x17, 0x6D, 0x25, 0xDA, 0x1D, 0xC3, 0x20, 0x06, 0x23, 0x1F, 0x1B, 0x26, 0x27, 0xAF, 0x14, 0x19, 0x2A, 0xA4, 0x0D, 0xCD, 0x2B, 0x31, 0x06, 0x31, 0x2C, 0x91, 0xFE, 0x44, 0x2B, 0xFF, 0xF6, 0x0E, 0x29, 0xB3, 0xEF, 0x9E, 0x25, 0xE5, 0xE8, 0x13, 0x21, 0xC9, 0xE2, 0x8C, 0x1B, 0x8E, 0xDD, 0x34, 0x15, 0x58, 0xD9, 0x3D, 0x0E, 0x4C, 0xD6, 0xDC, 0x06, 0x7F, 0xD4, 0x48, 0xFF, 0xFD, 0xD3, 0xBB, 0xF7, 0xCB, 0xD4, 0x70, 0xF0, 0xE1, 0xD6, 0x9C, 0xE9, 0x2F, 0xDA, 0x76, 0xE3, 0x9E, 0xDE, 0x2A, 0xDE, 0x08, 0xE4, 0xE2, 0xD9, 0x47, 0xEA, 0xBE, 0xD6, 0x28, 0xF1, 0xD6, 0xD4, 0x7A, 0xF8, 0x36, 0xD4, 0x03, 0x00, 0xE4, 0xD4, 0x89, 0x07, 0xDA, 0xD6, 0xD3, 0x0E, 0x09, 0xDA, 0xAA, 0x15, 0x59, 0xDE, 0xDA, 0x1B, 0xA9, 0xE3, 0x35, 0x21, 0xCD, 0xE9, 0x90, 0x25, 0x9A, 0xF0, 0xCC, 0x28, 0xDA, 0xF7, 0xCF, 0x2A, 0x57, 0xFF, 0x8C, 0x2B, 0xD5, 0x06, 0xFD, 0x2A, 0x1E, 0x0E, 0x27, 0x29, 0xF8, 0x14, 0x17, 0x26, 0x31, 0x1B, 0xE6, 0x21, 0x99, 0x20, 0xB4, 0x1C, 0x09, 0x25, 0xA6, 0x16, 0x5B, 0x28, 0xEF, 0x0F, 0x79, 0x2A, 0xC1, 0x08, 0x53, 0x2B, 0x53, 0x01, 0xE3, 0x2A, 0xDA, 0xF9, 0x2B, 0x29, 0x94, 0xF2, 0x3A, 0x26, 0xB6, 0xEB, 0x28, 0x22, 0x74, 0xE5, 0x11, 0x1D, 0xFE, 0xDF, 0x21, 0x17, 0x7E, 0xDB, 0x7F, 0x10, 0x14, 0xD8, 0x62, 0x09, 0xDC, 0xD5, 0x00, 0x02, 0xE6, 0xD4, 0x91, 0xFA, 0x37, 0xD5, 0x4D, 0xF3, 0xD0, 0xD6, 0x6B, 0xEC, 0xA0, 0xD9, 0x22, 0xE6, 0x95, 0xDD, 0x9F, 0xE0, 0x8F, 0xE2, 0x0E, 0xDC, 0x67, 0xE8, 0x8E, 0xD8, 0xF2, 0xEE, 0x3D, 0xD6, 0xFD, 0xF5, 0x29, 0xD5, 0x51, 0xFD, 0x5C, 0xD5, 0xB6, 0x04, 0xD7, 0xD6, 0xF8, 0x0B, 0x87, 0xD9, 0xDB, 0x12, 0x5E, 0xDD, 0x2C, 0x19, 0x3B, 0xE2, 0xBB, 0x1E, 0xFA, 0xE7, 0x5F, 0x23, 0x6D, 0xEE, 0xF3, 0x26, 0x65, 0xF5, 0x5E, 0x29, 0xAC, 0xFC, 0x8E, 0x2A, 0x0A, 0x04, 0x77, 0x2A, 0x46, 0x0B, 0x1D, 0x29, 0x2B, 0x12, 0x8B, 0x26, 0x83, 0x18, 0xD3, 0x22, 0x1E, 0x1E, 0x11, 0x1E, 0xD3, 0x22, 0x6E, 0x18, 0x7B, 0x26, 0x11, 0x12, 0xFF, 0x28, 0x2C, 0x0B, 0x49, 0x2A, 0xF6, 0x03, 0x51, 0x2A, 0xA0, 0xFC, 0x15, 0x29, 0x69, 0xF5, 0xA2, 0x26, 0x83, 0xEE, 0x09, 0x23, 0x25, 0xE8, 0x65, 0x1E, 0x7E, 0xE2, 0xDB, 0x18, 0xB9, 0xDD, 0x97, 0x12, 0xFB, 0xD9, 0xC5, 0x0B, 0x60, 0xD7, 0x9C, 0x04, 0xFB, 0xD5, 0x51, 0xFD, 0xD6, 0xD5, 0x1D, 0xF6, 0xF3, 0xD6, 0x38, 0xEF, 0x48, 0xD9, 0xD4, 0xE8, 0xC4, 0xDC, 0x22, 0xE3, 0x49, 0xE1, 0x4F, 0xDE, 0xB8, 0xE6, 0x7C, 0xDA, 0xE6, 0xEC, 0xC9, 0xD7, 0xA4, 0xF3, 0x49, 0xD6, 0xBD, 0xFA, 0x07, 0xD6, 0xFE, 0x01, 0x06, 0xD7, 0x2A, 0x09, 0x3C, 0xD9, 0x11, 0x10, 0x98, 0xDC, 0x7B, 0x16, 0x02, 0xE1, 0x37, 0x1C, 0x58, 0xE6, 0x1A, 0x21, 0x6C, 0xEC, 0xFF, 0x24, 0x17, 0xF3, 0xCA, 0x27, 0x21, 0xFA, 0x65, 0x29, 0x55, 0x01, 0xC1, 0x29, 0x7E, 0x08, 0xE1, 0x28, 0x63, 0x0F, 0xCA, 0x26, 0xD1, 0x15, 0x8B, 0x23, 0x96, 0x1B, 0x3F, 0x1F, 0x88, 0x20, 0x05, 0x1A, 0x80, 0x24, 0x07, 0x14, 0x61, 0x27, 0x72, 0x0D, 0x15, 0x29, 0x77, 0x06, 0x90, 0x29, 0x4E, 0xFF, 0xCD, 0x28, 0x2D, 0xF8, 0xD5, 0x26, 0x49, 0xF1, 0xB3, 0x23, 0xD7, 0xEA, 0x84, 0x1F, 0x08, 0xE5, 0x66, 0x1A, 0x08, 0xE0, 0x80, 0x14, 0xFE, 0xDB, 0x00, 0x0E, 0x06, 0xD9, 0x16, 0x07, 0x39, 0xD7, 0xF8, 0xFF, 0xA3, 0xD6, 0xDE, 0xF8, 0x47, 0xD7, 0xFB, 0xF1, 0x21, 0xD9, 0x86, 0xEB, 0x24, 0xDC, 0xAF, 0xE5, 0x37, 0xE0, 0xA0, 0xE0, 0x3B, 0xE5, 0x84, 0xDC, 0x09, 0xEB, 0x77, 0xD9, 0x74, 0xF1, 0x8F, 0xD7, 0x4C, 0xF8, 0xDF, 0xD6, 0x5D, 0xFF, 0x66, 0xD7, 0x71, 0x06, 0x23, 0xD9, 0x51, 0x0D, 0x07, 0xDC, 0xC9, 0x13, 0xFE, 0xDF, 0xA8, 0x19, 0xE4, 0xE4, 0xC2, 0x1E, 0x9B, 0xEA, 0xF1, 0x22, 0xF1, 0xF0, 0x13, 0x26, 0xB8, 0xF7, 0x12, 0x28, 0xBC, 0xFE, 0xE1, 0x28, 0xC8, 0x05, 0x75, 0x28, 0xA5, 0x0C, 0xD6, 0x26, 0x20, 0x13, 0x0F, 0x24, 0x06, 0x19, 0x37, 0x20, 0x2D, 0x1E, 0x6B, 0x1B, 0x6D, 0x22, 0xCE, 0x15, 0xA3, 0x25, 0x8E, 0x0F, 0xBB, 0x27, 0xD8, 0x08, 0xA3, 0x28, 0xE1, 0x01, 0x56, 0x28, 0xDE, 0xFA, 0xD5, 0x26, 0x04, 0xF4, 0x2B, 0x24, 0x86, 0xED, 0x70, 0x20, 0x99, 0xE7, 0xBE, 0x1B, 0x66, 0xE2, 0x3C, 0x16, 0x17, 0xDE, 0x10, 0x10, 0xCB, 0xDA, 0x6C, 0x09, 0x9E, 0xD8, 0x83, 0x02, 0x99, 0xD7, 0x89, 0xFB, 0xCC, 0xD7, 0xB3, 0xF4, 0x2E, 0xD9, 0x34, 0xEE, 0xBA, 0xDB, 0x40, 0xE8, 0x59, 0xDF, 0x02, 0xE3, 0xED, 0xE3, 0xA4, 0xDE, 0x59, 0xE9, 0x44, 0xDB, 0x6E, 0xEF, 0xFC, 0xD8, 0xFF, 0xF5, 0xE0, 0xD7, 0xDA, 0xFC, 0xF6, 0xD7, 0xCC, 0x03, 0x3C, 0xD9, 0x9C, 0x0A, 0xAA, 0xDB, 0x1D, 0x11, 0x2A, 0xDF, 0x16, 0x17, 0xA5, 0xE3, 0x5E, 0x1C, 0xF6, 0xE8, 0xCD, 0x20, 0xF5, 0xEE, 0x41, 0x24, 0x74, 0xF5, 0x9D, 0x26, 0x41, 0xFC, 0xD4, 0x27, 0x29, 0x03, 0xDB, 0x27, 0xF5, 0x09, 0xB1, 0x26, 0x74, 0x10, 0x62, 0x24, 0x73, 0x16, 0xFC, 0x20, 0xC6, 0x1B, 0x9D, 0x1C, 0x43, 0x20, 0x67, 0x17, 0xC9, 0x23, 0x7E, 0x11, 0x3E, 0x26, 0x13, 0x0B, 0x8D, 0x27, 0x54, 0x04, 0xB0, 0x27, 0x77, 0xFD, 0xA4, 0x26, 0xB0, 0xF6, 0x70, 0x24, 0x30, 0xF0, 0x29, 0x21, 0x2C, 0xEA, 0xE4, 0x1C, 0xD0, 0xE4, 0xC8, 0x17, 0x45, 0xE0, 0xF6, 0x11, 0xAC, 0xDC, 0x9E, 0x0B, 0x22, 0xDA, 0xEF, 0x04, 0xB9, 0xD8, 0x1B, 0xFE, 0x7B, 0xD8, 0x5A, 0xF7, 0x6C, 0xD9, 0xDB, 0xF0, 0x81, 0xDB, 0xD3, 0xEA, 0xAB, 0xDE, 0x6F, 0xE5, 0xD3, 0xE2, 0xD4, 0xE0, 0xD7, 0xE7, 0x2B, 0xDD, 0x92, 0xED, 0x8B, 0xDA, 0xD7, 0xF3, 0x09, 0xD9, 0x77, 0xFA, 0xB2, 0xD8, 0x3E, 0x01, 0x84, 0xD9, 0xFA, 0x07, 0x7D, 0xDB, 0x76, 0x0E, 0x8B, 0xDE, 0x83, 0x14, 0x97, 0xE2, 0xF1, 0x19, 0x80, 0xE7, 0x97, 0x1E, 0x25, 0xED, 0x53, 0x22, 0x57, 0xF3, 0x09, 0x25, 0xE6, 0xF9, 0xA3, 0x26, 0xA2, 0x00, 0x15, 0x27, 0x57, 0x07, 0x5E, 0x26, 0xD1, 0x0D, 0x81, 0x24, 0xE2, 0x13, 0x90, 0x21, 0x58, 0x19, 0xA1, 0x1D, 0x0A, 0x1E, 0xD0, 0x18, 0xD8, 0x21, 0x44, 0x13, 0xA1, 0x24, 0x27, 0x0D, 0x52, 0x26, 0xA6, 0x06, 0xDE, 0x26, 0xF6, 0xFF, 0x44, 0x26, 0x48, 0xF9, 0x84, 0x24, 0xD1, 0xF2, 0xAF, 0x21, 0xBD, 0xEC, 0xDB, 0x1D, 0x41, 0xE7, 0x25, 0x19, 0x82, 0xE2, 0xB0, 0x13, 0xA4, 0xDE, 0xA7, 0x0D, 0xC7, 0xDB, 0x38, 0x07, 0xFF, 0xD9, 0x94, 0x00, 0x57, 0xD9, 0xED, 0xF9, 0xD7, 0xD9, 0x78, 0xF3, 0x7A, 0xDB, 0x65, 0xED, 0x32, 0xDE, 0xDF, 0xE7, 0xEB, 0xE1, 0x16, 0xE3, 0x88, 0xE6, 0x29, 0xDF, 0xE4, 0xEB, 0x37, 0xDC, 0xD8, 0xF1, 0x56, 0xDA, 0x37, 0xF8, 0x97, 0xD9, 0xCE, 0xFE, 0xFD, 0xD9, 0x6C, 0x05, 0x82, 0xDB, 0xDE, 0x0B, 0x1D, 0xDE, 0xF3, 0x11, 0xBB, 0xE1, 0x7E, 0x17, 0x3D, 0xE6, 0x55, 0x1C, 0x82, 0xEB, 0x50, 0x20, 0x5F, 0xF1, 0x56, 0x23, 0xAE, 0xF7, 0x4B, 0x25, 0x38, 0xFE, 0x24, 0x26, 0xCD, 0x04, 0xDB, 0x25, 0x3C, 0x0B, 0x71, 0x24, 0x52, 0x11, 0xF2, 0x21, 0xE4, 0x16, 0x71, 0x1E, 0xC3, 0x1B, 0x08, 0x1A, 0xD0, 0x1F, 0xDB, 0x14, 0xE7, 0x22, 0x11, 0x0F, 0xF4, 0x24, 0xD6, 0x08, 0xE6, 0x25, 0x59, 0x02, 0xB6, 0x25, 0xCD, 0xFB, 0x68, 0x24, 0x63, 0xF5, 0x06, 0x22, 0x4C, 0xEF, 0x9F, 0x1E, 0xB4, 0xE9, 0x52, 0x1A, 0xCA, 0xE4, 0x3D, 0x15, 0xB1, 0xE0, 0x88, 0x0F, 0x87, 0xDD, 0x5E, 0x09, 0x64, 0xDB, 0xEF, 0x02, 0x5A, 0xDA, 0x6C, 0xFC, 0x70, 0xDA, 0x07, 0xF6, 0xA2, 0xDB, 0xEE, 0xEF, 0xE8, 0xDD, 0x54, 0xEA, 0x33, 0xE1, 0x60, 0xE5, 0x67, 0xE5, 0x39, 0xE1, 0x63, 0xEA, 0xFD, 0xDD, 0x02, 0xF0, 0xC5, 0xDB, 0x1A, 0xF6, 0xA3, 0xDA, 0x7A, 0xFC, 0x9D, 0xDA, 0xF4, 0x02, 0xB5, 0xDB, 0x54, 0x09, 0xE1, 0xDD, 0x6B, 0x0F, 0x0F, 0xE1, 0x0A, 0x15, 0x28, 0xE5, 0x06, 0x1A, 0x0C, 0xEA, 0x3C, 0x1E, 0x96, 0xEF, 0x89, 0x21, 0x9B, 0xF5, 0xD6, 0x23, 0xEC, 0xFB, 0x0F, 0x25, 0x5C, 0x02, 0x2F, 0x25, 0xB7, 0x08, 0x33, 0x24, 0xCD, 0x0E, 0x23, 0x22, 0x6F, 0x14, 0x10, 0x1F, 0x75, 0x19, 0x12, 0x1B, 0xB7, 0x1D, 0x46, 0x16, 0x14, 0x21, 0xD2, 0x10, 0x75, 0x23, 0xE0, 0x0A, 0xC6, 0x24, 0x9C, 0x04, 0x00, 0x25, 0x39, 0xFE, 0x1E, 0x24, 0xE3, 0xF7, 0x2B, 0x22, 0xCE, 0xF1, 0x33, 0x1F, 0x29, 0xEC, 0x4E, 0x1B, 0x1B, 0xE7, 0x9B, 0x16, 0xCC, 0xE2, 0x3D, 0x11, 0x5F, 0xDF, 0x5E, 0x0B, 0xEB, 0xDC, 0x2B, 0x05, 0x80, 0xDB, 0xD2, 0xFE, 0x30, 0xDB, 0x83, 0xF8, 0xF6, 0xDB, 0x71, 0xF2, 0xCF, 0xDD, 0xC8, 0xEC, 0xAC, 0xE0, 0xB2, 0xE7, 0x75, 0xE4, 0x58, 0xE3, 0x10, 0xE9, 0xDA, 0xDF, 0x58, 0xEE, 0x53, 0xDD, 0x23, 0xF4, 0xD3, 0xDB, 0x48, 0xFA, 0x69, 0xDB, 0x96, 0x00, 0x14, 0xDC, 0xDD, 0x06, 0xD2, 0xDD, 0xED, 0x0C, 0x93, 0xE0, 0x99, 0x12, 0x42, 0xE4, 0xB4, 0x17, 0xC5, 0xE8, 0x19, 0x1C, 0xF5, 0xED, 0xA7, 0x1F, 0xAE, 0xF3, 0x42, 0x22, 0xC2, 0xF9, 0xD7, 0x23, 0x05, 0x00, 0x5A, 0x24, 0x44, 0x06, 0xC8, 0x23, 0x51, 0x0C, 0x25, 0x22, 0xFF, 0x11, 0x80, 0x1F, 0x21, 0x17, 0xEB, 0x1B, 0x90, 0x1B, 0x81, 0x17, 0x2E, 0x1F, 0x68, 0x12, 0xDB, 0x21, 0xC3, 0x0C, 0x87, 0x23, 0xBF, 0x06, 0x22, 0x24, 0x88, 0x00, 0xAA, 0x23, 0x51, 0xFA, 0x22, 0x22, 0x47, 0xF4, 0x96, 0x1F, 0x97, 0xEE, 0x1C, 0x1C, 0x6F, 0xE9, 0xCC, 0x17, 0xF5, 0xE4, 0xC8, 0x12, 0x4B, 0xE1, 0x37, 0x0D, 0x8A, 0xDE, 0x43, 0x07, 0xCA, 0xDC, 0x1A, 0x01, 0x18, 0xDC, 0xEA, 0xFA, 0x76, 0xDC, 0xE4, 0xF4, 0xE3, 0xDD, 0x35, 0xEF, 0x52, 0xE0, 0x07, 0xEA, 0xB4, 0xE3, 0x84, 0xE5, 0xEB, 0xE7, 0xC9, 0xE1, 0xD8, 0xEC, 0xF9, 0xDE, 0x54, 0xF2, 0x24, 0xDD, 0x37, 0xF8, 0x59, 0xDC, 0x54, 0xFE, 0x9E, 0xDC, 0x7A, 0x04, 0xF1, 0xDD, 0x7C, 0x0A, 0x47, 0xE0, 0x2C, 0x10, 0x8E, 0xE3, 0x5F, 0x15, 0xAB, 0xE7, 0xEC, 0x19, 0x82, 0xEC, 0xB2, 0x1D, 0xE9, 0xF1, 0x95, 0x20, 0xBB, 0xF7, 0x7F, 0x22, 0xCB, 0xFD, 0x61, 0x23, 0xE8, 0x03, 0x34, 0x23, 0xE5, 0x09, 0xFC, 0x21, 0x95, 0x0F, 0xC0, 0x1F, 0xCB, 0x14, 0x95, 0x1C, 0x62, 0x19, 0x90, 0x18, 0x35, 0x1D, 0xD1, 0x13, 0x29, 0x20, 0x7D, 0x0E, 0x26, 0x22, 0xBC, 0x08, 0x1F, 0x23, 0xBB, 0x02, 0x0B, 0x23, 0xA8, 0xFC, 0xEC, 0x21, 0xAF, 0xF6, 0xCB, 0x1F, 0x00, 0xF1, 0xBA, 0x1C, 0xC6, 0xEB, 0xCE, 0x18, 0x26, 0xE7, 0x26, 0x14, 0x46, 0xE3, 0xE7, 0x0E, 0x43, 0xE0, 0x38, 0x09, 0x32, 0xDE, 0x45, 0x03, 0x23, 0xDD, 0x3C, 0xFD, 0x1E, 0xDD, 0x48, 0xF7, 0x22, 0xDE, 0x9B, 0xF1, 0x2A, 0xE0, 0x5C, 0xEC, 0x22, 0xE3, 0xB5, 0xE7, 0xF4, 0xE6, 0xC9, 0xE3, 0x85, 0xEB, 0xB6, 0xE0, 0xAE, 0xF0, 0x91, 0xDE, 0x4D, 0xF6, 0x6E, 0xDD, 0x31, 0xFC, 0x50, 0xDD, 0x30, 0x02, 0x3C, 0xDE, 0x1E, 0x08, 0x28, 0xE0, 0xC9, 0x0D, 0x07, 0xE3, 0x0B, 0x13, 0xC0, 0xE6, 0xB9, 0x17, 0x39, 0xEB, 0xB0, 0x1B, 0x4F, 0xF0, 0xD3, 0x1E, 0xD9, 0xF5, 0x0A, 0x21, 0xAF, 0xFB, 0x43, 0x22, 0xA5, 0x01, 0x79, 0x22, 0x8B, 0x07, 0xA6, 0x21, 0x35, 0x0D, 0xD4, 0x1F, 0x79, 0x12, 0x10, 0x1D, 0x2D, 0x17, 0x6F, 0x19, 0x2F, 0x1B, 0x0E, 0x15, 0x62, 0x1E, 0x0E, 0x10, 0xAA, 0x20, 0x95, 0x0A, 0xFA, 0x21, 0xCF, 0x04, 0x46, 0x22, 0xE5, 0xFE, 0x8D, 0x21, 0x04, 0xF9, 0xD4, 0x1F, 0x5D, 0xF3, 0x2A, 0x1D, 0x17, 0xEE, 0xA2, 0x19, 0x5B, 0xE9, 0x58, 0x15, 0x4F, 0xE5, 0x6E, 0x10, 0x0F, 0xE2, 0x07, 0x0B, 0xB4, 0xDF, 0x4F, 0x05, 0x50, 0xDE, 0x72, 0xFF, 0xED, 0xDD, 0x99, 0xF9, 0x8D, 0xDE, 0xF5, 0xF3, 0x2C, 0xE0, 0xAD, 0xEE, 0xBD, 0xE2, 0xEB, 0xE9, 0x2C, 0xE6, 0xD4, 0xE5, 0x5E, 0xEA, 0x86, 0xE2, 0x34, 0xEF, 0x1A, 0xE0, 0x87, 0xF4, 0xA1, 0xDE, 0x30, 0xFA, 0x28, 0xDE, 0x02, 0x00, 0xB0, 0xDE, 0xD3, 0x05, 0x36, 0xE0, 0x74, 0x0B, 0xAE, 0xE2, 0xBC, 0x10, 0x02, 0xE6, 0x82, 0x15, 0x1D, 0xEA, 0xA3, 0x19, 0xDE, 0xEE, 0xFE, 0x1C, 0x1D, 0xF4, 0x7C, 0x1F, 0xB6, 0xF9, 0x09, 0x21, 0x7E, 0xFF, 0x98, 0x21, 0x44, 0x05, 0x29, 0x21, 0xE3, 0x0A, 0xBC, 0x1F, 0x2B, 0x10, 0x5E, 0x1D, 0xF7, 0x14, 0x21, 0x1A, 0x20, 0x19, 0x1E, 0x16, 0x8A, 0x1C, 0x74, 0x11, 0x17, 0x1F, 0x47, 0x0C, 0xB7, 0x20, 0xBF, 0x06, 0x5D, 0x21, 0x05, 0x01, 0x04, 0x21, 0x46, 0xFB, 0xB2, 0x1F, 0xAB, 0xF5, 0x6D, 0x1D, 0x62, 0xF0, 0x48, 0x1A, 0x93, 0xEB, 0x5D, 0x16, 0x61, 0xE7, 0xC9, 0x11, 0xEB, 0xE3, 0xB0, 0x0C, 0x4D, 0xE1, 0x37, 0x07, 0x9A, 0xDF, 0x8A, 0x01, 0xDE, 0xDE, 0xD4, 0xFB, 0x1E, 0xDF, 0x3E, 0xF6, 0x59, 0xE0, 0xF7, 0xF0, 0x86, 0xE2, 0x23, 0xEC, 0x91, 0xE5, 0xE7, 0xE7, 0x64, 0xE9, 0x67, 0xE4, 0xE3, 0xED, 0xB9, 0xE1, 0xE9, 0xF2, 0xF2, 0xDF, 0x51, 0xF8, 0x21, 0xDF, 0xF1, 0xFD, 0x4B, 0xDF, 0x9E, 0x03, 0x6D, 0xE0, 0x2E, 0x09, 0x7F, 0xE2, 0x75, 0x0E, 0x74, 0xE5, 0x4D, 0x13, 0x2F, 0xE9, 0x8E, 0x17, 0x97, 0xED, 0x1C, 0x1B, 0x89, 0xF2, 0xD9, 0x1D, 0xE1, 0xF7, 0xB1, 0x1F, 0x74, 0xFD, 0x97, 0x20, 0x16, 0x03, 0x84, 0x20, 0xA2, 0x08, 0x7A, 0x1F, 0xE7, 0x0D, 0x80, 0x1D, 0xC2, 0x12, 0xA5, 0x1A, 0x0B, 0x17, 0x02, 0x17, 0xA3, 0x1A, 0xB0, 0x12, 0x6F, 0x1D, 0xD1, 0x0D, 0x59, 0x1F, 0x8B, 0x08, 0x53, 0x20, 0x06, 0x03, 0x57, 0x20, 0x6D, 0xFD, 0x65, 0x1F, 0xE7, 0xF7, 0x85, 0x1D, 0xA3, 0xF2, 0xC2, 0x1A, 0xC7, 0xED, 0x37, 0x17, 0x77, 0xE9, 0xFB, 0x12, 0xD5, 0xE5, 0x31, 0x0E, 0xFB, 0xE2, 0xFC, 0x08, 0x00, 0xE1, 0x84, 0x03, 0xF0, 0xDF, 0xF4, 0xFD, 0xD6, 0xDF, 0x76, 0xF8, 0xB1, 0xE0, 0x34, 0xF3, 0x79, 0xE2, 0x56, 0xEE, 0x23, 0xE5, 0xFF, 0xE9, 0x97, 0xE8, 0x52, 0xE6, 0xBC, 0xEC, 0x6C, 0xE3, 0x73, 0xF1, 0x5E, 0xE1, 0x96, 0xF6, 0x3A, 0xE0, 0xFE, 0xFB, 0x0A, 0xE0, 0x83, 0x01, 0xCD, 0xE0, 0xFA, 0x06, 0x7E, 0xE2, 0x3A, 0x0C, 0x10, 0xE5, 0x1B, 0x11, 0x6C, 0xE8, 0x77, 0x15, 0x7C, 0xEC, 0x2D, 0x19, 0x1D, 0xF1, 0x24, 0x1C, 0x30, 0xF6, 0x40, 0x1E, 0x88, 0xFB, 0x77, 0x1F, 0x04, 0x01, 0xBC, 0x1F, 0x74, 0x06, 0x10, 0x1F, 0xB0, 0x0B, 0x77, 0x1D, 0x92, 0x10, 0xFF, 0x1A, 0xF3, 0x14, 0xBA, 0x17, 0xB3, 0x18, 0xC1, 0x13, 0xB5, 0x1B, 0x33, 0x0F, 0xE2, 0x1D, 0x34, 0x0A, 0x2C, 0x1F, 0xE8, 0x04, 0x87, 0x1F, 0x7A, 0xFF, 0xF2, 0x1E, 0x11, 0xFA, 0x71, 0x1D, 0xD8, 0xF4, 0x11, 0x1B, 0xF6, 0xEF, 0xE3, 0x17, 0x8F, 0xEB, 0x00, 0x14, 0xC6, 0xE7, 0x87, 0x0F, 0xB8, 0xE4, 0x9A, 0x0A, 0x7B, 0xE2, 0x5C, 0x05, 0x1F, 0xE1, 0xFA, 0xFF, 0xAE, 0xE0, 0x9A, 0xFA, 0x2D, 0xE1, 0x63, 0xF5, 0x97, 0xE2, 0x82, 0xF0, 0xDE, 0xE4, 0x17, 0xEC, 0xF5, 0xE7, 0x47, 0xE8, 0xC2, 0xEB, 0x2C, 0xE5, 0x25, 0xF0, 0xE0, 0xE2, 0x02, 0xF5, 0x71, 0xE1, 0x2E, 0xFA, 0xEC, 0xE0, 0x85, 0xFF, 0x54, 0xE1, 0xDD, 0x04, 0xA6, 0xE2, 0x0E, 0x0A, 0xD6, 0xE4, 0xF0, 0x0E, 0xD6, 0xE7, 0x60, 0x13, 0x8A, 0xEB, 0x38, 0x17, 0xDA, 0xEF, 0x5D, 0x1A, 0xA3, 0xF4, 0xB9, 0x1C, 0xC1, 0xF9, 0x39, 0x1E, 0x0C, 0xFF, 0xD3, 0x1E, 0x5B, 0x04, 0x81, 0x1E, 0x88, 0x09, 0x46, 0x1D, 0x6A, 0x0E, 0x2D, 0x1B, 0xDB, 0x12, 0x47, 0x18, 0xBC, 0x16, 0xA8, 0x14, 0xEE, 0x19, 0x6C, 0x10, 0x57, 0x1C, 0xB5, 0x0B, 0xE9, 0x1D, 0xA9, 0x06, 0x96, 0x1E, 0x6A, 0x01, 0x5A, 0x1E, 0x23, 0xFC, 0x36, 0x1D, 0xFC, 0xF6, 0x34, 0x1B, 0x1B, 0xF2, 0x65, 0x18, 0xA6, 0xED, 0xDC, 0x14, 0xC0, 0xE9, 0xB6, 0x10, 0x83, 0xE6, 0x12, 0x0C, 0x0B, 0xE4, 0x14, 0x07, 0x69, 0xE2, 0xE3, 0x01, 0xA7, 0xE1, 0xA5, 0xFC, 0xCE, 0xE1, 0x82, 0xF7, 0xDB, 0xE2, 0xA4, 0xF2, 0xC5, 0xE4, 0x2C, 0xEE, 0x7E, 0xE7, 0x3F, 0xEA, 0xF0, 0xEA, 0xF9, 0xE6, 0x01, 0xEF, 0x74, 0xE4, 0x92, 0xF3, 0xC0, 0xE2, 0x80, 0xF8, 0xEC, 0xE1, 0xA4, 0xFD, 0xFE, 0xE1, 0xD8, 0x02, 0xF4, 0xE2, 0xF3, 0x07, 0xC7, 0xE4, 0xD1, 0x0C, 0x69, 0xE7, 0x4B, 0x11, 0xC5, 0xEA, 0x3E, 0x15, 0xC0, 0xEE, 0x8F, 0x18, 0x3E, 0xF3, 0x22, 0x1B, 0x1B, 0xF8, 0xE5, 0x1C, 0x32, 0xFD, 0xCC, 0x1D, 0x5C, 0x02, 0xD0, 0x1D, 0x73, 0x07, 0xF0, 0x1C, 0x4D, 0x0C, 0x33, 0x1B, 0xC8, 0x10, 0xA9, 0x18, 0xC2, 0x14, 0x62, 0x15, 0x1B, 0x18, 0x7B, 0x11, 0xBC, 0x1A, 0x12, 0x0D, 0x8F, 0x1C, 0x45, 0x08, 0x88, 0x1D, 0x3B, 0x03, 0x9F, 0x1D, 0x1B, 0xFE, 0xD5, 0x1C, 0x0C, 0xF9, 0x30, 0x1B, 0x34, 0xF4, 0xBC, 0x18, 0xB7, 0xEF, 0x8E, 0x15, 0xBA, 0xEB, 0xBB, 0x11, 0x57, 0xE8, 0x64, 0x0D, 0xAA, 0xE5, 0xA8, 0x08, 0xC8, 0xE3, 0xAC, 0x03, 0xBD, 0xE2, 0x97, 0xFE, 0x90, 0xE2, 0x90, 0xF9, 0x45, 0xE3, 0xBA, 0xF4, 0xD4, 0xE4, 0x3D, 0xF0, 0x32, 0xE7, 0x3B, 0xEC, 0x4A, 0xEA, 0xCF, 0xE8, 0x07, 0xEE, 0x17, 0xE6, 0x4B, 0xF2, 0x25, 0xE4, 0xF5, 0xF6, 0x08, 0xE3, 0xE3, 0xFB, 0xC8, 0xE2, 0xED, 0x00, 0x66, 0xE3, 0xEE, 0x05, 0xDE, 0xE4, 0xC0, 0x0A, 0x25, 0xE7, 0x3C, 0x0F, 0x28, 0xEA, 0x44, 0x13, 0xD1, 0xED, 0xB6, 0x16, 0x01, 0xF2, 0x7A, 0x19, 0x9A, 0xF6, 0x7C, 0x1B, 0x79, 0xFB, 0xAB, 0x1C, 0x78, 0x00, 0xFD, 0x1C, 0x71, 0x05, 0x73, 0x1C, 0x3F, 0x0A, 0x12, 0x1B, 0xBD, 0x0E, 0xE2, 0x18, 0xC7, 0x12, 0xF5, 0x15, 0x42, 0x16, 0x63, 0x12, 0x11, 0x19, 0x45, 0x0E, 0x20, 0x1B, 0xBC, 0x09, 0x5F, 0x1C, 0xEC, 0x04, 0xC5, 0x1C, 0xFA, 0xFF, 0x51, 0x1C, 0x07, 0xFB, 0x04, 0x1B, 0x3E, 0xF6, 0xEB, 0x18, 0xC1, 0xF1, 0x14, 0x16, 0xB4, 0xED, 0x98, 0x12, 0x31, 0xEA, 0x8E, 0x0E, 0x57, 0xE7, 0x16, 0x0A, 0x3B, 0xE5, 0x55, 0x05, 0xEB, 0xE3, 0x6E, 0x00, 0x71, 0xE3, 0x85, 0xFB, 0xD2, 0xE3, 0xC0, 0xF6, 0x09, 0xE5, 0x43, 0xF2, 0x0C, 0xE7, 0x32, 0xEE, 0xCC, 0xE9, 0xAA, 0xEA, 0x35, 0xED, 0xC7, 0xE7, 0x2A, 0xF1, 0x9C, 0xE5, 0x90, 0xF5, 0x3C, 0xE4, 0x42, 0xFA, 0xB1, 0xE3, 0x1E, 0xFF, 0xFD, 0xE3, 0xFF, 0x03, 0x1E, 0xE5, 0xBE, 0x08, 0x0B, 0xE7, 0x38, 0x0D, 0xB5, 0xE9, 0x4D, 0x11, 0x08, 0xED, 0xDB, 0x14, 0xEB, 0xF0, 0xC8, 0x17, 0x3E, 0xF5, 0x00, 0x1A, 0xE1, 0xF9, 0x70, 0x1B, 0xB1, 0xFE, 0x0E, 0x1C, 0x89, 0x03, 0xD6, 0x1B, 0x42, 0x08, 0xCA, 0x1A, 0xBC, 0x0C, 0xF2, 0x18, 0xD1, 0x10, 0x5E, 0x16, 0x65, 0x14, 0x20, 0x13, 0x5D, 0x17, 0x51, 0x0F, 0xA1, 0x19, 0x10, 0x0B, 0x1F, 0x1B, 0x7D, 0x06, 0xD0, 0x1B, 0xBA, 0x01, 0xAB, 0x1B, 0xEC, 0xFC, 0xB5, 0x1A, 0x37, 0xF8, 0xF4, 0x18, 0xBF, 0xF3, 0x74, 0x16, 0xA7, 0xEF, 0x4B, 0x13, 0x0E, 0xEC, 0x90, 0x0F, 0x0F, 0xE9, 0x61, 0x0B, 0xC0, 0xE6, 0xDE, 0x06, 0x30, 0xE5, 0x27, 0x02, 0x6F, 0xE4, 0x62, 0xFD, 0x7F, 0xE4, 0xB4, 0xF8, 0x61, 0xE5, 0x3F, 0xF4, 0x0D, 0xE7, 0x25, 0xF0, 0x78, 0xE9, 0x87, 0xEC, 0x8C, 0xEC, 0x80, 0xE9, 0x32, 0xF0, 0x23, 0xE7, 0x4F, 0xF4, 0x86, 0xE5, 0xC5, 0xF8, 0xB3, 0xE4, 0x6E, 0xFD, 0xB1, 0xE4, 0x28, 0x02, 0x80, 0xE5, 0xD0, 0x06, 0x15, 0xE7, 0x42, 0x0B, 0x6B, 0xE9, 0x5B, 0x0F, 0x6A, 0xEC, 0xFF, 0x12, 0xFC, 0xEF, 0x0E, 0x16, 0x07, 0xF4, 0x75, 0x18, 0x6B, 0xF8, 0x20, 0x1A, 0x07, 0xFD, 0x04, 0x1B, 0xB8, 0x01, 0x1A, 0x1B, 0x58, 0x06, 0x60, 0x1A, 0xC8, 0x0A, 0xDE, 0x18, 0xE1, 0x0E, 0xA0, 0x16, 0x88, 0x12, 0xB5, 0x13, 0xA0, 0x15, 0x35, 0x10, 0x13, 0x18, 0x3D, 0x0C, 0xCC, 0x19, 0xEA, 0x07, 0xBF, 0x1A, 0x5B, 0x03, 0xE8, 0x1A, 0xB5, 0xFE, 0x42, 0x1A, 0x1B, 0xFA, 0xD4, 0x18, 0xB1, 0xF5, 0xAC, 0x16, 0x95, 0xF1, 0xD6, 0x13, 0xEB, 0xED, 0x6B, 0x10, 0xCB, 0xEA, 0x84, 0x0C, 0x50, 0xE8, 0x40, 0x08, 0x88, 0xE6, 0xC0, 0x03, 0x84, 0xE5, 0x24, 0xFF, 0x4B, 0xE5, 0x92, 0xFA, 0xDC, 0xE5, 0x2B, 0xF6, 0x35, 0xE7, 0x10, 0xF2, 0x49, 0xE9, 0x63, 0xEE, 0x0B, 0xEC, 0x3D, 0xEB, 0x61, 0xEF, 0xB6, 0xE8, 0x35, 0xF3, 0xE3, 0xE6, 0x69, 0xF7, 0xD0, 0xE5, 0xDC, 0xFB, 0x84, 0xE5, 0x6C, 0x00, 0x01, 0xE6, 0xF7, 0x04, 0x46, 0xE7, 0x5A, 0x09, 0x46, 0xE9, 0x73, 0x0D, 0xF2, 0xEB, 0x23, 0x11, 0x35, 0xEF, 0x50, 0x14, 0xF7, 0xF2, 0xDF, 0x16, 0x18, 0xF7, 0xC0, 0x18, 0x7E, 0xFB, 0xE3, 0x19, 0x03, 0x00, 0x41, 0x1A, 0x86, 0x04, 0xD5, 0x19, 0xE4, 0x08, 0xA6, 0x18, 0xFC, 0x0C, 0xBB, 0x16, 0xB0, 0x10, 0x23, 0x14, 0xE2, 0x13, 0xF4, 0x10, 0x7A, 0x16, 0x45, 0x0D, 0x67, 0x18, 0x33, 0x09, 0x99, 0x19, 0xDD, 0x04, 0x08, 0x1A, 0x63, 0x00, 0xAE, 0x19, 0xE8, 0xFB, 0x93, 0x18, 0x8F, 0xF7, 0xBD, 0x16, 0x78, 0xF3, 0x3B, 0x14, 0xC4, 0xEF, 0x1F, 0x11, 0x8B, 0xEC, 0x83, 0x0D, 0xE9, 0xE9, 0x80, 0x09, 0xF1, 0xE7, 0x39, 0x05, 0xB0, 0xE6, 0xCB, 0x00, 0x32, 0xE6, 0x59, 0xFC, 0x78, 0xE6, 0x07, 0xF8, 0x7F, 0xE7, 0xF1, 0xF3, 0x41, 0xE9, 0x3A, 0xF0, 0xB0, 0xEB, 0xFE, 0xEC, 0xB7, 0xEE, 0x54, 0xEA, 0x41, 0xF2, 0x4E, 0xE8, 0x31, 0xF6, 0x01, 0xE7, 0x6C, 0xFA, 0x71, 0xE6, 0xCD, 0xFE, 0xA4, 0xE6, 0x36, 0x03, 0x99, 0xE7, 0x84, 0x07, 0x46, 0xE9, 0x95, 0x0B, 0x9F, 0xEB, 0x4E, 0x0F, 0x95, 0xEE, 0x90, 0x12, 0x0C, 0xF2, 0x42, 0x15, 0xEC, 0xF5, 0x51, 0x17, 0x16, 0xFA, 0xAE, 0x18, 0x6C, 0xFE, 0x4D, 0x19, 0xCA, 0x02, 0x2B, 0x19, 0x13, 0x07, 0x4A, 0x18, 0x22, 0x0B, 0xB1, 0x16, 0xDA, 0x0E, 0x6B, 0x14, 0x21, 0x12, 0x8B, 0x11, 0xDB, 0x14, 0x26, 0x0E, 0xF4, 0x16, 0x57, 0x0A, 0x5F, 0x18, 0x3C, 0x06, 0x0E, 0x19, 0xF3, 0x01, 0xFF, 0x18, 0x9D, 0xFD, 0x30, 0x18, 0x5B, 0xF9, 0xAB, 0x16, 0x4F, 0xF5, 0x78, 0x14, 0x95, 0xF1, 0xAC, 0x11, 0x4C, 0xEE, 0x5A, 0x0E, 0x8B, 0xEB, 0x9C, 0x0A, 0x67, 0xE9, 0x90, 0x06, 0xEF, 0xE7, 0x54, 0x02, 0x31, 0xE7, 0x07, 0xFE, 0x2F, 0xE7, 0xCD, 0xF9, 0xEB, 0xE7, 0xC4, 0xF5, 0x5D, 0xE9, 0x09, 0xF2, 0x7A, 0xEB, 0xBD, 0xEE, 0x34, 0xEE, 0xF5, 0xEB, 0x73, 0xF1, 0xC7, 0xE9, 0x1E, 0xF5, 0x44, 0xE8, 0x1D, 0xF9, 0x75, 0xE7, 0x4C, 0xFD, 0x62, 0xE7, 0x8E, 0x01, 0x0C, 0xE8, 0xC2, 0x05, 0x6A, 0xE9, 0xC7, 0x09, 0x74, 0xEB, 0x81, 0x0D, 0x19, 0xEE, 0xD1, 0x10, 0x46, 0xF1, 0xA0, 0x13, 0xE2, 0xF4, 0xD6, 0x15, 0xD0, 0xF8, 0x66, 0x17, 0xF2, 0xFC, 0x44, 0x18, 0x2A, 0x01, 0x67, 0x18, 0x56, 0x05, 0xD1, 0x17, 0x58, 0x09, 0x84, 0x16, 0x10, 0x0D, 0x8E, 0x14, 0x63, 0x10, 0xFC, 0x11, 0x38, 0x13, 0xE1, 0x0E, 0x78, 0x15, 0x58, 0x0B, 0x14, 0x17, 0x7B, 0x07, 0x00, 0x18, 0x65, 0x03, 0x33, 0x18, 0x38, 0xFF, 0xAF, 0x17, 0x12, 0xFB, 0x76, 0x16, 0x16, 0xF7, 0x93, 0x14, 0x5D, 0xF3, 0x15, 0x12, 0x09, 0xF0, 0x0B, 0x0F, 0x2E, 0xED, 0x94, 0x0B, 0xE5, 0xEA, 0xC6, 0x07, 0x3E, 0xE9, 0xBD, 0x03, 0x46, 0xE8, 0x9B, 0xFF, 0x01, 0xE8, 0x7E, 0xFB, 0x75, 0xE8, 0x86, 0xF7, 0x99, 0xE9, 0xCF, 0xF3, 0x69, 0xEB, 0x79, 0xF0, 0xD5, 0xED, 0x99, 0xED, 0xCA, 0xF0, 0x47, 0xEB, 0x31, 0xF4, 0x95, 0xE9, 0xEF, 0xF7, 0x8E, 0xE8, 0xEB, 0xFB, 0x3B, 0xE8, 0x02, 0x00, 0x9C, 0xE8, 0x17, 0x04, 0xAF, 0xE9, 0x0A, 0x08, 0x6C, 0xEB, 0xBE, 0x0B, 0xC4, 0xED, 0x17, 0x0F, 0xA6, 0xF0, 0xFB, 0x11, 0xFC, 0xF3, 0x55, 0x14, 0xAB, 0xF7, 0x12, 0x16, 0x98, 0xFB, 0x26, 0x17, 0xA5, 0xFF, 0x89, 0x17, 0xB1, 0x03, 0x3A, 0x17, 0x9F, 0x07, 0x38, 0x16, 0x51, 0x0B, 0x8F, 0x14, 0xAB, 0x0E, 0x49, 0x12, 0x94, 0x11, 0x79, 0x0F, 0xF5, 0x13, 0x35, 0x0C, 0xBC, 0x15, 0x95, 0x08, 0xDD, 0x16, 0xB7, 0x04, 0x50, 0x17, 0xB5, 0x00, 0x11, 0x17, 0xB3, 0xFC, 0x21, 0x16, 0xCA, 0xF8, 0x8A, 0x14, 0x19, 0xF5, 0x58, 0x12, 0xBF, 0xF1, 0x9B, 0x0F, 0xD3, 0xEE, 0x67, 0x0C, 0x6B, 0xEC, 0xD8, 0x08, 0x9A, 0xEA, 0x07, 0x05, 0x6B, 0xE9, 0x12, 0x01, 0xEA, 0xE8, 0x18, 0xFD, 0x19, 0xE9, 0x35, 0xF9, 0xF7, 0xE9, 0x88, 0xF5, 0x7B, 0xEB, 0x2C, 0xF2, 0x9B, 0xED, 0x3C, 0xEF, 0x46, 0xF0, 0xCE, 0xEC, 0x67, 0xF3, 0xF3, 0xEA, 0xE6, 0xF6, 0xB9, 0xE9, 0xA9, 0xFA, 0x29, 0xE9, 0x92, 0xFE, 0x48, 0xE9, 0x83, 0x02, 0x14, 0xEA, 0x60, 0x06, 0x86, 0xEB, 0x0A, 0x0A, 0x93, 0xED, 0x65, 0x0D, 0x2B, 0xF0, 0x59, 0x10, 0x3B, 0xF3, 0xCE, 0x12, 0xAA, 0xF6, 0xB2, 0x14, 0x5E, 0xFA, 0xF8, 0x15, 0x3C, 0xFE, 0x96, 0x16, 0x24, 0x02, 0x87, 0x16, 0xFB, 0x05, 0xCD, 0x15, 0x9F, 0x09, 0x6D, 0x14, 0xFB, 0x0C, 0x71, 0x12, 0xF1, 0x0F, 0xEB, 0x0F, 0x6C, 0x12, 0xED, 0x0C, 0x59, 0x14, 0x8E, 0x09, 0xAA, 0x15, 0xE8, 0x05, 0x57, 0x16, 0x17, 0x02, 0x58, 0x16, 0x39, 0xFE, 0xAF, 0x15, 0x69, 0xFA, 0x61, 0x14, 0xC7, 0xF6, 0x77, 0x12, 0x6C, 0xF3, 0x03, 0x10, 0x74, 0xF0, 0x17, 0x0D, 0xF3, 0xED, 0xC8, 0x09, 0xFD, 0xEB, 0x31, 0x06, 0xA1, 0xEA, 0x6D, 0x02, 0xE8, 0xE9, 0x96, 0xFE, 0xD8, 0xE9, 0xCF, 0xFA, 0x71, 0xEA, 0x31, 0xF7, 0xAD, 0xEB, 0xD8, 0xF3, 0x83, 0xED, 0xDD, 0xF0, 0xE6, 0xEF, 0x57, 0xEE, 0xC0, 0xF2, 0x59, 0xEC, 0xFF, 0xF5, 0xF2, 0xEA, 0x87, 0xF9, 0x2C, 0xEA, 0x40, 0xFD, 0x0C, 0xEA, 0x0B, 0x01, 0x94, 0xEA, 0xCB, 0x04, 0xBF, 0xEB, 0x64, 0x08, 0x84, 0xED, 0xBE, 0x0B, 0xD4, 0xEF, 0xBA, 0x0E, 0x9D, 0xF2, 0x44, 0x11, 0xCC, 0xF5, 0x4A, 0x13, 0x46, 0xF9, 0xBB, 0x14, 0xF1, 0xFC, 0x8F, 0x15, 0xB1, 0x00, 0xBD, 0x15, 0x6B, 0x04, 0x45, 0x15, 0x00, 0x08, 0x2B, 0x14, 0x56, 0x0B, 0x79, 0x12, 0x55, 0x0E, 0x3A, 0x10, 0xE4, 0x10, 0x82, 0x0D, 0xF0, 0x12, 0x64, 0x0A, 0x6C, 0x14, 0xF9, 0x06, 0x4C, 0x15, 0x5A, 0x03, 0x88, 0x15, 0xA4, 0xFF, 0x20, 0x15, 0xF3, 0xFB, 0x18, 0x14, 0x62, 0xF8, 0x77, 0x12, 0x0F, 0xF5, 0x4A, 0x10, 0x0F, 0xF2, 0xA3, 0x0D, 0x7C, 0xEF, 0x95, 0x0A, 0x68, 0xED, 0x39, 0x07, 0xE3, 0xEB, 0xA7, 0x03, 0xF8, 0xEA, 0xFD, 0xFF, 0xAE, 0xEA, 0x54, 0xFC, 0x05, 0xEB, 0xC8, 0xF8, 0xFC, 0xEB, 0x76, 0xF5, 0x8B, 0xED, 0x76, 0xF2, 0xA7, 0xEF, 0xE0, 0xEF, 0x3C, 0xF2, 0xC5, 0xED, 0x3B, 0xF5, 0x36, 0xEC, 0x87, 0xF8, 0x3F, 0xEB, 0x0D, 0xFC, 0xE7, 0xEA, 0xAD, 0xFF, 0x30, 0xEB, 0x4C, 0x03, 0x16, 0xEC, 0xD3, 0x06, 0x94, 0xED, 0x23, 0x0A, 0x9F, 0xEF, 0x22, 0x0D, 0x23, 0xF2, 0xBC, 0x0F, 0x10, 0xF5, 0xDD, 0x11, 0x4D, 0xF8, 0x75, 0x13, 0xC6, 0xFB, 0x77, 0x14, 0x5B, 0xFF, 0xDC, 0x14, 0xF3, 0x02, 0xA3, 0x14, 0x73, 0x06, 0xCD, 0x13, 0xBF, 0x09, 0x60, 0x12, 0xBF, 0x0C, 0x69, 0x10, 0x5D, 0x0F, 0xF4, 0x0D, 0x83, 0x11, 0x18, 0x0B, 0x23, 0x13, 0xE8, 0x07, 0x31, 0x14, 0x7E, 0x04, 0xA3, 0x14, 0xF5, 0x00, 0x79, 0x14, 0x65, 0xFD, 0xB2, 0x13, 0xEC, 0xF9, 0x56, 0x12, 0xA3, 0xF6, 0x70, 0x10, 0xA3, 0xF3, 0x0E, 0x0E, 0x03, 0xF1, 0x40, 0x0B, 0xD6, 0xEE, 0x20, 0x08, 0x2E, 0xED, 0xC3, 0x04, 0x17, 0xEC, 0x45, 0x01, 0x97, 0xEB, 0xBE, 0xFD, 0xB2, 0xEB, 0x4C, 0xFA, 0x69, 0xEC, 0x06, 0xF7, 0xB3, 0xED, 0x06, 0xF4, 0x89, 0xEF, 0x64, 0xF1, 0xDB, 0xF1, 0x33, 0xEF, 0x97, 0xF4, 0x83, 0xED, 0xA9, 0xF7, 0x61, 0xEC, 0xF9, 0xFA, 0xD4, 0xEB, 0x6B, 0xFE, 0xE3, 0xEB, 0xE8, 0x01, 0x8A, 0xEC, 0x54, 0x05, 0xC4, 0xED, 0x95, 0x08, 0x88, 0xEF, 0x94, 0x0B, 0xCA, 0xF1, 0x38, 0x0E, 0x76, 0xF4, 0x6E, 0x10, 0x78, 0xF7, 0x25, 0x12, 0xB9, 0xFA, 0x52, 0x13, 0x20, 0xFE, 0xEB, 0x13, 0x94, 0x01, 0xEC, 0x13, 0xF9, 0x04, 0x54, 0x13, 0x38, 0x08, 0x29, 0x12, 0x34, 0x0B, 0x75, 0x10, 0xD9, 0x0D, 0x45, 0x0E, 0x14, 0x10, 0xA9, 0x0B, 0xD3, 0x11, 0xB6, 0x08, 0x09, 0x13, 0x83, 0x05, 0xAD, 0x13, 0x27, 0x02, 0xBB, 0x13, 0xBE, 0xFE, 0x32, 0x13, 0x5F, 0xFB, 0x19, 0x12, 0x26, 0xF8, 0x75, 0x10, 0x2B, 0xF5, 0x56, 0x0E, 0x84, 0xF2, 0xCA, 0x0B, 0x45, 0xF0, 0xE7, 0x08, 0x80, 0xEE, 0xC0, 0x05, 0x40, 0xED, 0x71, 0x02, 0x91, 0xEC, 0x10, 0xFF, 0x75, 0xEC, 0xBA, 0xFB, 0xF0, 0xEC, 0x86, 0xF8, 0xF9, 0xED, 0x8D, 0xF5, 0x8B, 0xEF, 0xE4, 0xF2, 0x9C, 0xF1, 0xA1, 0xF0, 0x17, 0xF4, 0xD6, 0xEE, 0xEB, 0xF6, 0x8E, 0xED, 0x04, 0xFA, 0xD2, 0xEC, 0x46, 0xFD, 0xAA, 0xEC, 0x9C, 0x00, 0x15, 0xED, 0xEC, 0x03, 0x10, 0xEE, 0x1B, 0x07, 0x93, 0xEF, 0x13, 0x0A, 0x91, 0xF1, 0xBB, 0x0C, 0xFD, 0xF3, 0x01, 0x0F, 0xC2, 0xF6, 0xD2, 0x10, 0xCB, 0xF9, 0x24, 0x12, 0x04, 0xFD, 0xEA, 0x12, 0x4F, 0x00, 0x1F, 0x13, 0x97, 0x03, 0xC2, 0x12, 0xC1, 0x06, 0xD7, 0x11, 0xB5, 0x09, 0x64, 0x10, 0x5E, 0x0C, 0x75, 0x0E, 0xA7, 0x0E, 0x1A, 0x0C, 0x7F, 0x10, 0x64, 0x09, 0xD7, 0x11, 0x68, 0x06, 0xA8, 0x12, 0x3D, 0x03, 0xE9, 0x12, 0xFC, 0xFF, 0x9B, 0x12, 0xBC, 0xFC, 0xBF, 0x11, 0x97, 0xF9, 0x5B, 0x10, 0xA6, 0xF6, 0x7D, 0x0E, 0xFD, 0xF3, 0x32, 0x0C, 0xB2, 0xF1, 0x8C, 0x09, 0xD5, 0xEF, 0x9C, 0x06, 0x73, 0xEE, 0x7F, 0x03, 0x99, 0xED, 0x47, 0x00, 0x4B, 0xED, 0x11, 0xFD, 0x8C, 0xED, 0xF2, 0xF9, 0x5A, 0xEE, 0x03, 0xF7, 0xAD, 0xEF, 0x5B, 0xF4, 0x7B, 0xF1, 0x0D, 0xF2, 0xB7, 0xF3, 0x2A, 0xF0, 0x4E, 0xF6, 0xC3, 0xEE, 0x2F, 0xF9, 0xDE, 0xED, 0x40, 0xFC, 0x84, 0xED, 0x6D, 0xFF, 0xB9, 0xED, 0x9B, 0x02, 0x76, 0xEE, 0xB3, 0x05, 0xB9, 0xEF, 0x9F, 0x08, 0x78, 0xF1, 0x47, 0x0B, 0xA5, 0xF3, 0x96, 0x0D, 0x2D, 0xF6, 0x7D, 0x0F, 0xFF, 0xF8, 0xED, 0x10, 0x04, 0xFC, 0xDB, 0x11, 0x26, 0xFF, 0x40, 0x12, 0x4C, 0x02, 0x1A, 0x12, 0x5E, 0x05, 0x6A, 0x11, 0x46, 0x08, 0x36, 0x10, 0xEC, 0x0A, 0x87, 0x0E, 0x3E, 0x0D, 0x6A, 0x0C, 0x2A, 0x0F, 0xF0, 0x09, 0x9F, 0x10, 0x2E, 0x07, 0x97, 0x11, 0x35, 0x04, 0x07, 0x12, 0x1F, 0x01, 0xEE, 0x11, 0x01, 0xFE, 0x4C, 0x11, 0xF6, 0xFA, 0x27, 0x10, 0x11, 0xF8, 0x87, 0x0E, 0x6B, 0xF5, 0x7B, 0x0C, 0x19, 0xF3, 0x11, 0x0A, 0x2A, 0xF1, 0x5B, 0x07, 0xAD, 0xEF, 0x6F, 0x04, 0xAD, 0xEE, 0x63, 0x01, 0x32, 0xEE, 0x4F, 0xFE, 0x3E, 0xEE, 0x4A, 0xFB, 0xD2, 0xEE, 0x6A, 0xF8, 0xE9, 0xEF, 0xC7, 0xF5, 0x78, 0xF1, 0x73, 0xF3, 0x76, 0xF3, 0x80, 0xF1, 0xD1, 0xF5, 0xFD, 0xEF, 0x78, 0xF8, 0xF4, 0xEE, 0x58, 0xFB, 0x6F, 0xEE, 0x58, 0xFE, 0x6E, 0xEE, 0x63, 0x01, 0xF6, 0xEE, 0x62, 0x04, 0xFC, 0xEF, 0x3C, 0x07, 0x7D, 0xF1, 0xDE, 0x09, 0x6B, 0xF3, 0x33, 0x0C, 0xB7, 0xF5, 0x2A, 0x0E, 0x51, 0xF8, 0xB2, 0x0F, 0x24, 0xFB, 0xC3, 0x10, 0x19, 0xFE, 0x53, 0x11, 0x1A, 0x01, 0x5E, 0x11, 0x12, 0x04, 0xE6, 0x10, 0xE7, 0x06, 0xEE, 0x0F, 0x88, 0x09, 0x7B, 0x0E, 0xDD, 0x0B, 0x9D, 0x0C, 0xD6, 0x0D, 0x5F, 0x0A, 0x65, 0x0F, 0xD3, 0x07, 0x7D, 0x10, 0x0E, 0x05, 0x17, 0x11, 0x25, 0x02, 0x2E, 0x11, 0x2C, 0xFF, 0xC3, 0x10, 0x3D, 0xFC, 0xD8, 0x0F, 0x6C, 0xF9, 0x75, 0x0E, 0xCD, 0xF6, 0xA5, 0x0C, 0x78, 0xF4, 0x76, 0x0A, 0x7D, 0xF2, 0xF9, 0x07, 0xEA, 0xF0, 0x42, 0x05, 0xCA, 0xEF, 0x63, 0x02, 0x26, 0xEF, 0x74, 0xFF, 0x02, 0xEF, 0x8B, 0xFC, 0x61, 0xEF, 0xC0, 0xF9, 0x3E, 0xF0, 0x25, 0xF7, 0x92, 0xF1, 0xD0, 0xF4, 0x53, 0xF3, 0xD1, 0xF2, 0x73, 0xF5, 0x39, 0xF1, 0xE3, 0xF7, 0x13, 0xF0, 0x8D, 0xFA, 0x66, 0xEF, 0x60, 0xFD, 0x37, 0xEF, 0x45, 0x00, 0x88, 0xEF, 0x25, 0x03, 0x57, 0xF0, 0xEB, 0x05, 0x9C, 0xF1, 0x83, 0x08, 0x4F, 0xF3, 0xD9, 0x0A, 0x61, 0xF5, 0xD9, 0x0C, 0xC2, 0xF7, 0x76, 0x0E, 0x61, 0xFA, 0xA3, 0x0F, 0x27, 0xFD, 0x5A, 0x10, 0x02, 0x00, 0x93, 0x10, 0xDB, 0x02, 0x4D, 0x10, 0x9C, 0x05, 0x8C, 0x0F, 0x30, 0x08, 0x54, 0x0E, 0x84, 0x0A, 0xB1, 0x0C, 0x86, 0x0C, 0xAE, 0x0A, 0x27, 0x0E, 0x5B, 0x08, 0x5C, 0x0F, 0xCA, 0x05, 0x1A, 0x10, 0x0E, 0x03, 0x5F, 0x10, 0x3E, 0x00, 0x26, 0x10, 0x6E, 0xFD, 0x71, 0x0F, 0xB2, 0xFA, 0x48, 0x0E, 0x23, 0xF8, 0xB3, 0x0C, 0xCF, 0xF5, 0xBD, 0x0A, 0xCC, 0xF3, 0x79, 0x08, 0x26, 0xF2, 0xF6, 0x05, 0xEB, 0xF0, 0x45, 0x03, 0x24, 0xF0, 0x7E, 0x00, 0xD6, 0xEF, 0xB7, 0xFD, 0x03, 0xF0, 0x03, 0xFB, 0xAB, 0xF0, 0x75, 0xF8, 0xC5, 0xF1, 0x24, 0xF6, 0x4D, 0xF3, 0x1F, 0xF4, 0x33, 0xF5, 0x75, 0xF2, 0x6B, 0xF7, 0x34, 0xF1, 0xE1, 0xF9, 0x66, 0xF0, 0x84, 0xFC, 0x0E, 0xF0, 0x40, 0xFF, 0x30, 0xF0, 0x00, 0x02, 0xCA, 0xF0, 0xB0, 0x04, 0xD8, 0xF1, 0x39, 0x07, 0x4F, 0xF3, 0x88, 0x09, 0x28, 0xF5, 0x8E, 0x0B, 0x51, 0xF7, 0x3A, 0x0D, 0xBC, 0xF9, 0x81, 0x0E, 0x53, 0xFC, 0x57, 0x0F, 0x05, 0xFF, 0xB9, 0x0F, 0xBC, 0x01, 0xA2, 0x0F, 0x64, 0x04, 0x15, 0x0F, 0xE8, 0x06, 0x14, 0x0E, 0x37, 0x09, 0xAA, 0x0C, 0x3E, 0x0B, 0xE0, 0x0A, 0xEC, 0x0C, 0xC4, 0x08, 0x38, 0x0E, 0x68, 0x06, 0x17, 0x0F, 0xDC, 0x03, 0x81, 0x0F, 0x34, 0x01, 0x76, 0x0F, 0x86, 0xFE, 0xF4, 0x0E, 0xE5, 0xFB, 0x02, 0x0E, 0x64, 0xF9, 0xA5, 0x0C, 0x18, 0xF7, 0xEA, 0x0A, 0x12, 0xF5, 0xDB, 0x08, 0x60, 0xF3, 0x8C, 0x06, 0x0F, 0xF2, 0x0B, 0x04, 0x2A, 0xF1, 0x6F, 0x01, 0xB6, 0xF0, 0xCA, 0xFE, 0xB7, 0xF0, 0x2E, 0xFC, 0x2C, 0xF1, 0xB3, 0xF9, 0x12, 0xF2, 0x6A, 0xF7, 0x60, 0xF3, 0x63, 0xF5, 0x0E, 0xF5, 0xAE, 0xF3, 0x0F, 0xF7, 0x59, 0xF2, 0x52, 0xF9, 0x6C, 0xF1, 0xC5, 0xFB, 0xF1, 0xF0, 0x57, 0xFE, 0xE7, 0xF0, 0xF4, 0x00, 0x51, 0xF1, 0x88, 0x03, 0x29, 0xF2, 0xFE, 0x05, 0x6A, 0xF3, 0x45, 0x08, 0x0B, 0xF5, 0x4C, 0x0A, 0xFD, 0xF6, 0x02, 0x0C, 0x33, 0xF9, 0x5B, 0x0D, 0x9B, 0xFB, 0x4F, 0x0E, 0x23, 0xFE, 0xD4, 0x0E, 0xB5, 0x00, 0xE8, 0x0E, 0x42, 0x03, 0x8A, 0x0E, 0xB3, 0x05, 0xBE, 0x0D, 0xF8, 0x07, 0x89, 0x0C, 0xFD, 0x09, 0xF7, 0x0A, 0xB6, 0x0B, 0x12, 0x09, 0x14, 0x0D, 0xE8, 0x06, 0x0C, 0x0E, 0x8E, 0x04, 0x9A, 0x0E, 0x11, 0x02, 0xB8, 0x0E, 0x86, 0xFF, 0x64, 0x0E, 0x02, 0xFD, 0xA5, 0x0D, 0x95, 0xFA, 0x7F, 0x0C, 0x55, 0xF8, 0xF8, 0x0A, 0x4F, 0xF6, 0x21, 0x09, 0x96, 0xF4, 0x06, 0x07, 0x34, 0xF3, 0xB6, 0x04, 0x35, 0xF2, 0x44, 0x02, 0xA0, 0xF1, 0xC3, 0xFF, 0x79, 0xF1, 0x45, 0xFD, 0xC0, 0xF1, 0xDF, 0xFA, 0x74, 0xF2, 0xA1, 0xF8, 0x8E, 0xF3, 0x9D, 0xF6, 0x06, 0xF5, 0xE2, 0xF4, 0xD0, 0xF6, 0x7E, 0xF3, 0xDF, 0xF8, 0x79, 0xF2, 0x22, 0xFB, 0xDC, 0xF1, 0x89, 0xFD, 0xAC, 0xF1, 0x01, 0x00, 0xE8, 0xF1, 0x77, 0x02, 0x90, 0xF2, 0xD8, 0x04, 0x9D, 0xF3, 0x12, 0x07, 0x08, 0xF5, 0x14, 0x09, 0xC6, 0xF6, 0xD0, 0x0A, 0xC7, 0xF8, 0x38, 0x0C, 0x00, 0xFB, 0x42, 0x0D, 0x5B, 0xFD, 0xE6, 0x0D, 0xC9, 0xFF, 0x20, 0x0E, 0x37, 0x02, 0xEE, 0x0D, 0x92, 0x04, 0x52, 0x0D, 0xC8, 0x06, 0x51, 0x0C, 0xC9, 0x08, 0xF3, 0x0A, 0x86, 0x0A, 0x43, 0x09, 0xF1, 0x0B, 0x4D, 0x07, 0xFF, 0x0C, 0x22, 0x05, 0xAA, 0x0D, 0xD0, 0x02, 0xEE, 0x0D, 0x6C, 0x00, 0xC6, 0x0D, 0x08, 0xFE, 0x35, 0x0D, 0xB2, 0xFB, 0x40, 0x0C, 0x7F, 0xF9, 0xEF, 0x0A, 0x81, 0xF7, 0x4C, 0x09, 0xC4, 0xF5, 0x63, 0x07, 0x56, 0xF4, 0x44, 0x05, 0x42, 0xF3, 0xFD, 0x02, 0x90, 0xF2, 0xA4, 0x00, 0x46, 0xF2, 0x45, 0xFE, 0x64, 0xF2, 0xF7, 0xFB, 0xE9, 0xF2, 0xC8, 0xF9, 0xD1, 0xF3, 0xCB, 0xF7, 0x15, 0xF5, 0x0E, 0xF6, 0xAC, 0xF6, 0x9E, 0xF4, 0x88, 0xF8, 0x87, 0xF3, 0x9B, 0xFA, 0xCE, 0xF2, 0xD6, 0xFC, 0x7C, 0xF2, 0x27, 0xFF, 0x8E, 0xF2, 0x7D, 0x01, 0x09, 0xF3, 0xC5, 0x03, 0xE5, 0xF3, 0xEF, 0x05, 0x1D, 0xF5, 0xEA, 0x07, 0xA8, 0xF6, 0xA6, 0x09, 0x78, 0xF8, 0x18, 0x0B, 0x7F, 0xFA, 0x34, 0x0C, 0xAF, 0xFC, 0xF3, 0x0C, 0xF5, 0xFE, 0x4E, 0x0D, 0x43, 0x01, 0x44, 0x0D, 0x86, 0x03, 0xD5, 0x0C, 0xA9, 0x05, 0x03, 0x0C, 0xA2, 0x07, 0xD7, 0x0A, 0x5F, 0x09, 0x5A, 0x09, 0xD2, 0x0A, 0x97, 0x07, 0xF1, 0x0B, 0x9D, 0x05, 0xB7, 0x0C, 0x76, 0x03, 0x19, 0x0D, 0x3A, 0x01, 0x18, 0x0D, 0xF6, 0xFE, 0xB2, 0x0C, 0xBA, 0xFC, 0xEE, 0x0B, 0x9A, 0xFA, 0xCF, 0x0A, 0xA5, 0xF8, 0x5E, 0x09, 0xE9, 0xF6, 0xA6, 0x07, 0x74, 0xF5, 0xB6, 0x05, 0x50, 0xF4, 0x9D, 0x03, 0x86, 0xF3, 0x6A, 0x01, 0x1B, 0xF3, 0x2E, 0xFF, 0x14, 0xF3, 0xFA, 0xFC, 0x6F, 0xF3, 0xDE, 0xFA, 0x29, 0xF4, 0xEC, 0xF8, 0x3D, 0xF5, 0x31, 0xF7, 0xA1, 0xF6, 0xBB, 0xF5, 0x4B, 0xF8, 0x93, 0xF4, 0x2F, 0xFA, 0xC5, 0xF3, 0x3E, 0xFC, 0x54, 0xF3, 0x67, 0xFE, 0x43, 0xF3, 0x9B, 0x00, 0x94, 0xF3, 0xC8, 0x02, 0x42, 0xF4, 0xDD, 0x04, 0x4A, 0xF5, 0xCD, 0x06, 0xA2, 0xF6, 0x87, 0x08, 0x40, 0xF8, 0xFE, 0x09, 0x19, 0xFA, 0x28, 0x0B, 0x1C, 0xFC, 0xFC, 0x0B, 0x3C, 0xFE, 0x74, 0x0C, 0x67, 0x00, 0x8E, 0x0C, 0x8D, 0x02, 0x46, 0x0C, 0x9D, 0x04, 0xA3, 0x0B, 0x89, 0x06, 0xA6, 0x0A, 0x42, 0x08, 0x5A, 0x09, 0xBA, 0x09, 0xC8, 0x07, 0xE7, 0x0A, 0xFB, 0x05, 0xBF, 0x0B, 0x03, 0x04, 0x3E, 0x0C, 0xEE, 0x01, 0x60, 0x0C, 0xCB, 0xFF, 0x21, 0x0C, 0xAC, 0xFD, 0x88, 0x0B, 0xA2, 0xFB, 0x97, 0x0A, 0xB9, 0xF9, 0x57, 0x09, 0x02, 0xF8, 0xD1, 0x07, 0x89, 0xF6, 0x10, 0x06, 0x5B, 0xF5, 0x23, 0x04, 0x7D, 0xF4, 0x17, 0x02, 0xF8, 0xF3, 0xFE, 0xFF, 0xCF, 0xF3, 0xE6, 0xFD, 0x03, 0xF4, 0xE1, 0xFB, 0x93, 0xF4, 0xFC, 0xF9, 0x77, 0xF5, 0x47, 0xF8, 0xAD, 0xF6, 0xCF, 0xF6, 0x28, 0xF8, 0x9E, 0xF5, 0xDD, 0xF9, 0xBC, 0xF4, 0xC0, 0xFB, 0x31, 0xF4, 0xC0, 0xFD, 0x01, 0xF4, 0xD1, 0xFF, 0x2B, 0xF4, 0xE1, 0x01, 0xB1, 0xF4, 0xE0, 0x03, 0x8B, 0xF5, 0xC1, 0x05, 0xB4, 0xF6, 0x74, 0x07, 0x23, 0xF8, 0xED, 0x08, 0xCD, 0xF9, 0x20, 0x0A, 0xA4, 0xFB, 0x05, 0x0B, 0x9B, 0xFD, 0x96, 0x0B, 0xA2, 0xFF, 0xCE, 0x0B, 0xAB, 0x01, 0xAC, 0x0B, 0xA4, 0x03, 0x31, 0x0B, 0x81, 0x05, 0x61, 0x0A, 0x32, 0x07, 0x43, 0x09, 0xAA, 0x08, 0xE0, 0x07, 0xE0, 0x09, 0x42, 0x06, 0xC9, 0x0A, 0x75, 0x04, 0x5E, 0x0B, 0x88, 0x02, 0x9E, 0x0B, 0x8A, 0x00, 0x84, 0x0B, 0x89, 0xFE, 0x13, 0x0B, 0x95, 0xFC, 0x4D, 0x0A, 0xBD, 0xFA, 0x3A, 0x09, 0x0E, 0xF9, 0xE3, 0x07, 0x97, 0xF7, 0x50, 0x06, 0x60, 0xF6, 0x8E, 0x04, 0x74, 0xF5, 0xAB, 0x02, 0xD9, 0xF4, 0xB6, 0x00, 0x92, 0xF4, 0xBD, 0xFE, 0xA4, 0xF4, 0xCF, 0xFC, 0x0C, 0xF5, 0xFB, 0xFA, 0xC6, 0xF5, 0x50, 0xF9, 0xCE, 0xF6, 0xD8, 0xF7, 0x1B, 0xF8, 0xA0, 0xF6, 0xA3, 0xF9, 0xB2, 0xF5, 0x59, 0xFB, 0x11, 0xF5, 0x32, 0xFD, 0xC5, 0xF4, 0x1E, 0xFF, 0xCE, 0xF4, 0x10, 0x01, 0x2D, 0xF5, 0xF7, 0x02, 0xDD, 0xF5, 0xC6, 0x04, 0xDB, 0xF6, 0x6F, 0x06, 0x1C, 0xF8, 0xE5, 0x07, 0x99, 0xF9, 0x1D, 0x09, 0x45, 0xFB, 0x11, 0x0A, 0x13, 0xFD, 0xB5, 0x0A, 0xF6, 0xFE, 0x08, 0x0B, 0xDF, 0x00, 0x06, 0x0B, 0xC0, 0x02, 0xB1, 0x0A, 0x8A, 0x04, 0x0B, 0x0A, 0x30, 0x06, 0x18, 0x09, 0xA6, 0x07, 0xE1, 0x07, 0xDF, 0x08, 0x6F, 0x06, 0xD4, 0x09, 0xCE, 0x04, 0x7E, 0x0A, 0x09, 0x03, 0xD7, 0x0A, 0x30, 0x01, 0xDC, 0x0A, 0x4F, 0xFF, 0x90, 0x0A, 0x75, 0xFD, 0xF3, 0x09, 0xAF, 0xFB, 0x0A, 0x09, 0x0C, 0xFA, 0xDF, 0x07, 0x99, 0xF8, 0x78, 0x06, 0x5E, 0xF7, 0xE1, 0x04, 0x67, 0xF6, 0x27, 0x03, 0xBA, 0xF5, 0x56, 0x01, 0x5B, 0xF5, 0x7D, 0xFF, 0x4D, 0xF5, 0xA9, 0xFD, 0x92, 0xF5, 0xEA, 0xFB, 0x25, 0xF6, 0x4A, 0xFA, 0x02, 0xF7, 0xD8, 0xF8, 0x24, 0xF8, 0x9D, 0xF7, 0x80, 0xF9, 0xA4, 0xF6, 0x0D, 0xFB, 0xF3, 0xF5, 0xBC, 0xFC, 0x8E, 0xF5, 0x84, 0xFE, 0x7A, 0xF5, 0x55, 0x00, 0xB6, 0xF5, 0x22, 0x02, 0x3F, 0xF6, 0xDD, 0x03, 0x13, 0xF7, 0x79, 0x05, 0x2A, 0xF8, 0xE9, 0x06, 0x7C, 0xF9, 0x24, 0x08, 0xFD, 0xFA, 0x20, 0x09, 0xA3, 0xFC, 0xD4, 0x09, 0x62, 0xFE, 0x3E, 0x0A, 0x2B, 0x00, 0x5A, 0x0A, 0xF1, 0x01, 0x25, 0x0A, 0xA6, 0x03, 0xA4, 0x09, 0x3F, 0x05, 0xDB, 0x08, 0xAD, 0x06, 0xCF, 0x07, 0xE8, 0x07, 0x88, 0x06, 0xE5, 0x08, 0x10, 0x05, 0x9D, 0x09, 0x74, 0x03, 0x0C, 0x0A, 0xBF, 0x01, 0x2D, 0x0A, 0xFE, 0xFF, 0x02, 0x0A, 0x3F, 0xFE, 0x89, 0x09, 0x8E, 0xFC, 0xCA, 0x08, 0xFA, 0xFA, 0xC7, 0x07, 0x8E, 0xF9, 0x8A, 0x06, 0x54, 0xF8, 0x1D, 0x05, 0x55, 0xF7, 0x8B, 0x03, 0x9A, 0xF6, 0xDE, 0x01, 0x27, 0xF6, 0x27, 0x00, 0xFE, 0xF5, 0x6E, 0xFE, 0x22, 0xF6, 0xC4, 0xFC, 0x91, 0xF6, 0x34, 0xFB, 0x48, 0xF7, 0xC9, 0xF9, 0x40, 0xF8, 0x8F, 0xF8, 0x73, 0xF9, 0x90, 0xF7, 0xD6, 0xFA, 0xD1, 0xF6, 0x5E, 0xFC, 0x59, 0xF6, 0x00, 0xFE, 0x2B, 0xF6, 0xB1, 0xFF, 0x48, 0xF6, 0x63, 0x01, 0xAF, 0xF6, 0x07, 0x03, 0x5C, 0xF7, 0x94, 0x04, 0x4A, 0xF8, 0xFB, 0x05, 0x73, 0xF9, 0x34, 0x07, 0xCC, 0xFA, 0x35, 0x08, 0x4B, 0xFC, 0xF7, 0x08, 0xE4, 0xFD, 0x73, 0x09, 0x8D, 0xFF, 0xA7, 0x09, 0x37, 0x01, 0x92, 0x09, 0xD6, 0x02, 0x32, 0x09, 0x5E, 0x04, 0x8E, 0x08, 0xC3, 0x05, 0xAA, 0x07, 0xFB, 0x06, 0x8C, 0x06, 0xFC, 0x07, 0x3C, 0x05, 0xC0, 0x08, 0xC7, 0x03, 0x40, 0x09, 0x36, 0x02, 0x79, 0x09, 0x97, 0x00, 0x6C, 0x09, 0xF4, 0xFE, 0x14, 0x09, 0x5A, 0xFD, 0x7A, 0x08, 0xD6, 0xFB, 0x9E, 0x07, 0x74, 0xFA, 0x8A, 0x06, 0x3E, 0xF9, 0x45, 0x05, 0x3C, 0xF8, 0xD9, 0x03, 0x76, 0xF7, 0x51, 0x02, 0xF1, 0xF6, 0xB9, 0x00, 0xB3, 0xF6, 0x1D, 0xFF, 0xBA, 0xF6, 0x8B, 0xFD, 0x09, 0xF7, 0x0C, 0xFC, 0x9B, 0xF7, 0xAD, 0xFA, 0x6E, 0xF8, 0x77, 0xF9, 0x79, 0xF9, 0x74, 0xF8, 0xB4, 0xFA, 0xAC, 0xF7, 0x16, 0xFC, 0x24, 0xF7, 0x95, 0xFD, 0xE1, 0xF6, 0x25, 0xFF, 0xE2, 0xF6, 0xB8, 0x00, 0x2A, 0xF7, 0x46, 0x02, 0xB4, 0xF7, 0xC0, 0x03, 0x7D, 0xF8, 0x1C, 0x05, 0x7D, 0xF9, 0x50, 0x06, 0xAE, 0xFA, 0x53, 0x07, 0x08, 0xFC, 0x1D, 0x08, 0x7E, 0xFD, 0xA7, 0x08, 0x04, 0xFF, 0xF1, 0x08, 0x91, 0x00, 0xF6, 0x08, 0x19, 0x02, 0xB6, 0x08, 0x8E, 0x03, 0x33, 0x08, 0xE7, 0x04, 0x74, 0x07, 0x1A, 0x06, 0x7C, 0x06, 0x1C, 0x07, 0x54, 0x05, 0xE7, 0x07, 0x05, 0x04, 0x76, 0x08, 0x99, 0x02, 0xC4, 0x08, 0x1A, 0x01, 0xCE, 0x08, 0x94, 0xFF, 0x95, 0x08, 0x13, 0xFE, 0x1C, 0x08, 0xA2, 0xFC, 0x65, 0x07, 0x4D, 0xFB, 0x76, 0x06, 0x1C, 0xFA, 0x58, 0x05, 0x1A, 0xF9, 0x11, 0x04, 0x4C, 0xF8, 0xAE, 0x02, 0xBB, 0xF7, 0x38, 0x01, 0x6A, 0xF7, 0xB9, 0xFF, 0x59, 0xF7, 0x3E, 0xFE, 0x8A, 0xF7, 0xD2, 0xFC, 0xFD, 0xF7, 0x80, 0xFB, 0xAB, 0xF8, 0x52, 0xFA, 0x91, 0xF9, 0x4F, 0xF9, 0xA6, 0xFA, 0x81, 0xF8, 0xE3, 0xFB, 0xED, 0xF7, 0x3D, 0xFD, 0x98, 0xF7, 0xAC, 0xFE, 0x82, 0xF7, 0x23, 0x00, 0xAD, 0xF7, 0x97, 0x01, 0x16, 0xF8, 0xFE, 0x02, 0xBC, 0xF8, 0x4C, 0x04, 0x99, 0xF9, 0x78, 0x05, 0xA6, 0xFA, 0x7A, 0x06, 0xD9, 0xFB, 0x4A, 0x07, 0x2C, 0xFD, 0xE0, 0x07, 0x92, 0xFE, 0x39, 0x08, 0x01, 0x00, 0x55, 0x08, 0x6F, 0x01, 0x30, 0x08, 0xD1, 0x02, 0xCE, 0x07, 0x1B, 0x04, 0x30, 0x07, 0x46, 0x05, 0x5C, 0x06, 0x46, 0x06, 0x5A, 0x05, 0x15, 0x07, 0x2F, 0x04, 0xAF, 0x07, 0xE5, 0x02, 0x0D, 0x08, 0x87, 0x01, 0x2D, 0x08, 0x1F, 0x00, 0x0F, 0x08, 0xB8, 0xFE, 0xB3, 0x07, 0x5B, 0xFD, 0x1D, 0x07, 0x14, 0xFC, 0x53, 0x06, 0xED, 0xFA, 0x59, 0x05, 0xED, 0xF9, 0x37, 0x04, 0x1C, 0xF9, 0xF6, 0x02, 0x81, 0xF8, 0x9F, 0x01, 0x20, 0xF8, 0x40, 0x00, 0xFA, 0xF7, 0xDE, 0xFE, 0x13, 0xF8, 0x87, 0xFD, 0x66, 0xF8, 0x44, 0xFC, 0xF5, 0xF8, 0x1F, 0xFB, 0xB7, 0xF9, 0x21, 0xFA, 0xA9, 0xFA, 0x51, 0xF9, 0xC3, 0xFB, 0xB3, 0xF8, 0xFA, 0xFC, 0x4E, 0xF8, 0x48, 0xFE, 0x24, 0xF8, 0xA2, 0xFF, 0x37, 0xF8, 0xFC, 0x00, 0x83, 0xF8, 0x4E, 0x02, 0x0A, 0xF9, 0x8D, 0x03, 0xC5, 0xF9, 0xAF, 0x04, 0xAE, 0xFA, 0xAC, 0x05, 0xBD, 0xFB, 0x7E, 0x06, 0xED, 0xFC, 0x1C, 0x07, 0x33, 0xFE, 0x84, 0x07, 0x85, 0xFF, 0xB1, 0x07, 0xD9, 0x00, 0xA5, 0x07, 0x25, 0x02, 0x5F, 0x07, 0x60, 0x03, 0xE0, 0x06, 0x7E, 0x04, 0x2D, 0x06, 0x7B, 0x05, 0x4E, 0x05, 0x4C, 0x06, 0x45, 0x04, 0xEC, 0x06, 0x1E, 0x03, 0x56, 0x07, 0xE1, 0x01, 0x8A, 0x07, 0x96, 0x00, 0x83, 0x07, 0x48, 0xFF, 0x42, 0x07, 0x02, 0xFE, 0xCC, 0x06, 0xCC, 0xFC, 0x21, 0x06, 0xB0, 0xFB, 0x48, 0x05, 0xB5, 0xFA, 0x49, 0x04, 0xE5, 0xF9, 0x2A, 0x03, 0x43, 0xF9, 0xF5, 0x01, 0xD5, 0xF8, 0xB1, 0x00, 0x9F, 0xF8, 0x6A, 0xFF, 0xA1, 0xF8, 0x29, 0xFE, 0xDB, 0xF8, 0xF8, 0xFC, 0x4B, 0xF9, 0xDF, 0xFB, 0xED, 0xF9, 0xE6, 0xFA, 0xBD, 0xFA, 0x15, 0xFA, 0xB5, 0xFB, 0x72, 0xF9, 0xCB, 0xFC, 0x03, 0xF9, 0xF8, 0xFD, 0xC9, 0xF8, 0x35, 0xFF, 0xC5, 0xF8, 0x76, 0x00, 0xF9, 0xF8, 0xB0, 0x01, 0x62, 0xF9, 0xDE, 0x02, 0xFD, 0xF9, 0xF3, 0x03, 0xC6, 0xFA, 0xEA, 0x04, 0xB3, 0xFB, 0xB9, 0x05, 0xC3, 0xFC, 0x5E, 0x06, 0xE8, 0xFD, 0xD0, 0x06, 0x1C, 0xFF, 0x0E, 0x07, 0x57, 0x00, 0x16, 0x07, 0x8C, 0x01, 0xE8, 0x06, 0xB4, 0x02, 0x86, 0x06, 0xC7, 0x03, 0xF2, 0x05, 0xBB, 0x04, 0x32, 0x05, 0x8B, 0x05, 0x4B, 0x04, 0x30, 0x06, 0x46, 0x03, 0xA5, 0x06, 0x27, 0x02, 0xE6, 0x06, 0xF9, 0x00, 0xF2, 0x06, 0xC7, 0xFF, 0xCA, 0x06, 0x97, 0xFE, 0x6F, 0x06, 0x72, 0xFD, 0xE2, 0x05, 0x63, 0xFC, 0x29, 0x05, 0x71, 0xFB, 0x4B, 0x04, 0xA2, 0xFA, 0x4D, 0x03, 0xFD, 0xF9, 0x35, 0x02, 0x86, 0xF9, 0x10, 0x01, 0x42, 0xF9, 0xE4, 0xFF, 0x31, 0xF9, 0xB9, 0xFE, 0x54, 0xF9, 0x9A, 0xFD, 0xA9, 0xF9, 0x8E, 0xFC, 0x2F, 0xFA, 0x9D, 0xFB, 0xDF, 0xFA, 0xD0, 0xFA, 0xB6, 0xFB, 0x2A, 0xFA, 0xAD, 0xFC, 0xB3, 0xF9, 0xBC, 0xFD, 0x6B, 0xF9, 0xDB, 0xFE, 0x56, 0xF9, 0x00, 0x00, 0x73, 0xF9, 0x25, 0x01, 0xC3, 0xF9, 0x40, 0x02, 0x40, 0xFA, 0x47, 0x03, 0xEB, 0xFA, 0x35, 0x04, 0xBA, 0xFB, 0x02, 0x05, 0xA9, 0xFC, 0xA8, 0x05, 0xB0, 0xFD, 0x21, 0x06, 0xC7, 0xFE, 0x6C, 0x06, 0xE7, 0xFF, 0x85, 0x06, 0x05, 0x01, 0x6D, 0x06, 0x1B, 0x02, 0x23, 0x06, 0x1F, 0x03, 0xAC, 0x05, 0x0B, 0x04, 0x09, 0x05, 0xD7, 0x04, 0x41, 0x04, 0x7C, 0x05, 0x5B, 0x03, 0xF7, 0x05, 0x5B, 0x02, 0x44, 0x06, 0x4B, 0x01, 0x61, 0x06, 0x31, 0x00, 0x4E, 0x06, 0x18, 0xFF, 0x09, 0x06, 0x08, 0xFE, 0x99, 0x05, 0x08, 0xFD, 0xFD, 0x04, 0x1F, 0xFC, 0x3D, 0x04, 0x55, 0xFB, 0x5E, 0x03, 0xAF, 0xFA, 0x66, 0x02, 0x34, 0xFA, 0x5C, 0x01, 0xE4, 0xF9, 0x4A, 0x00, 0xC3, 0xF9, 0x37, 0xFF, 0xD1, 0xF9, 0x2C, 0xFE, 0x10, 0xFA, 0x2E, 0xFD, 0x7B, 0xFA, 0x48, 0xFC, 0x0F, 0xFB, 0x81, 0xFB, 0xC8, 0xFB, 0xDA, 0xFA, 0x9F, 0xFC, 0x5E, 0xFA, 0x90, 0xFD, 0x0C, 0xFA, 0x92, 0xFE, 0xE7, 0xF9, 0x9E, 0xFF, 0xF2, 0xF9, 0xAB, 0x00, 0x2B, 0xFA, 0xB3, 0x01, 0x8E, 0xFA, 0xAB, 0x02, 0x1C, 0xFB, 0x8E, 0x03, 0xCF, 0xFB, 0x55, 0x04, 0x9F, 0xFC, 0xFA, 0x04, 0x89, 0xFD, 0x78, 0x05, 0x84, 0xFE, 0xCC, 0x05, 0x88, 0xFF, 0xF4, 0x05, 0x90, 0x00, 0xED, 0x05, 0x92, 0x01, 0xBA, 0x05, 0x87, 0x02, 0x5B, 0x05, 0x66, 0x03, 0xD6, 0x04, 0x2C, 0x04, 0x2A, 0x04, 0xD0, 0x04, 0x61, 0x03, 0x4F, 0x05, 0x7E, 0x02, 0xA5, 0x05, 0x8A, 0x01, 0xD0, 0x05, 0x8B, 0x00, 0xCD, 0x05, 0x89, 0xFF, 0xA0, 0x05, 0x8D, 0xFE, 0x47, 0x05, 0x9D, 0xFD, 0xC7, 0x04, 0xBF, 0xFC, 0x22, 0x04, 0xFC, 0xFB, 0x61, 0x03, 0x58, 0xFB, 0x85, 0x02, 0xD9, 0xFA, 0x97, 0x01, 0x81, 0xFA, 0xA0, 0x00, 0x55, 0xFA, 0xA4, 0xFF, 0x52, 0xFA, 0xAB, 0xFE, 0x7B, 0xFA, 0xC0, 0xFD, 0xCD, 0xFA, 0xE6, 0xFC, 0x48, 0xFB, 0x24, 0xFC, 0xE5, 0xFB, 0x81, 0xFB, 0xA1, 0xFC, 0x01, 0xFB, 0x75, 0xFD, 0xA8, 0xFA, 0x5C, 0xFE, 0x79, 0xFA, 0x4D, 0xFF, 0x72, 0xFA, 0x44, 0x00, 0x97, 0xFA, 0x36, 0x01, 0xE4, 0xFA, 0x1E, 0x02, 0x58, 0xFB, 0xF5, 0x02, 0xEF, 0xFB, 0xB4, 0x03, 0xA4, 0xFC, 0x55, 0x04, 0x71, 0xFD, 0xD6, 0x04, 0x50, 0xFE, 0x31, 0x05, 0x3D, 0xFF, 0x63, 0x05, 0x2C, 0x00, 0x6D, 0x05, 0x1A, 0x01, 0x4C, 0x05, 0xFE, 0x01, 0x04, 0x05, 0xD1, 0x02, 0x97, 0x04, 0x8E, 0x03, 0x07, 0x04, 0x30, 0x04, 0x59, 0x03, 0xAF, 0x04, 0x92, 0x02, 0x0B, 0x05, 0xB9, 0x01, 0x40, 0x05, 0xD4, 0x00, 0x4C, 0x05, 0xEA, 0xFF, 0x31, 0x05, 0x01, 0xFF, 0xEF, 0x04, 0x21, 0xFE, 0x87, 0x04, 0x52, 0xFD, 0xFD, 0x03, 0x97, 0xFC, 0x54, 0x03, 0xF8, 0xFB, 0x95, 0x02, 0x78, 0xFB, 0xC2, 0x01, 0x1A, 0xFB, 0xE3, 0x00, 0xE3, 0xFA, 0xFF, 0xFF, 0xD2, 0xFA, 0x1C, 0xFF, 0xE9, 0xFA, 0x41, 0xFE, 0x27, 0xFB, 0x74, 0xFD, 0x8B, 0xFB, 0xBC, 0xFC, 0x0F, 0xFC, 0x1D, 0xFC, 0xAF, 0xFC, 0x9E, 0xFB, 0x69, 0xFD, 0x3F, 0xFB, 0x35, 0xFE, 0x06, 0xFB, 0x0E, 0xFF, 0xF4, 0xFA, 0xEC, 0xFF, 0x06, 0xFB, 0xCA, 0x00, 0x3F, 0xFB, 0xA1, 0x01, 0x9C, 0xFB, 0x6A, 0x02, 0x1A, 0xFC, 0x20, 0x03, 0xB5, 0xFC, 0xBD, 0x03, 0x68, 0xFD, 0x3C, 0x04, 0x2E, 0xFE, 0x9B, 0x04, 0x00, 0xFF, 0xD7, 0x04, 0xD9, 0xFF, 0xEC, 0x04, 0xB2, 0x00, 0xDD, 0x04, 0x84, 0x01, 0xA9, 0x04, 0x4A, 0x02, 0x51, 0x04, 0xFD, 0x02, 0xD8, 0x03, 0x99, 0x03, 0x45, 0x03, 0x19, 0x04, 0x98, 0x02, 0x77, 0x04, 0xD9, 0x01, 0xB5, 0x04, 0x0C, 0x01, 0xCE, 0x04, 0x39, 0x00, 0xC1, 0x04, 0x65, 0xFF, 0x91, 0x04, 0x98, 0xFE, 0x3F, 0x04, 0xD5, 0xFD, 0xCD, 0x03, 0x24, 0xFD, 0x3E, 0x03, 0x8B, 0xFC, 0x98, 0x02, 0x0C, 0xFC, 0xDE, 0x01, 0xAC, 0xFB, 0x19, 0x01, 0x6E, 0xFB, 0x4A, 0x00, 0x53, 0xFB, 0x7C, 0xFF, 0x5B, 0xFB, 0xB3, 0xFE, 0x86, 0xFB, 0xF4, 0xFD, 0xD4, 0xFB, 0x46, 0xFD, 0x40, 0xFC, 0xAD, 0xFC, 0xC9, 0xFC, 0x2F, 0xFC, 0x6A, 0xFD, 0xCF, 0xFB, 0x1C, 0xFE, 0x8F, 0xFB, 0xDC, 0xFE, 0x72, 0xFB, 0xA4, 0xFF, 0x76, 0xFB, 0x6E, 0x00, 0x9F, 0xFB, 0x34, 0x01, 0xE7, 0xFB, 0xED, 0x01, 0x4E, 0xFC, 0x98, 0x02, 0xD1, 0xFC, 0x2F, 0x03, 0x6B, 0xFD, 0xAD, 0x03, 0x19, 0xFE, 0x0D, 0x04, 0xD4, 0xFE, 0x4F, 0x04, 0x96, 0xFF, 0x6E, 0x04, 0x59, 0x00, 0x6D, 0x04, 0x1A, 0x01, 0x48, 0x04, 0xD1, 0x01, 0x05, 0x04, 0x79, 0x02, 0xA3, 0x03, 0x0E, 0x03, 0x26, 0x03, 0x8A, 0x03, 0x92, 0x02, 0xEB, 0x03, 0xEA, 0x01, 0x2D, 0x04, 0x35, 0x01, 0x4F, 0x04, 0x79, 0x00, 0x50, 0x04, 0xB9, 0xFF, 0x31, 0x04, 0xFD, 0xFE, 0xF2, 0x03, 0x4A, 0xFE, 0x95, 0x03, 0xA5, 0xFD, 0x1D, 0x03, 0x12, 0xFD, 0x8F, 0x02, 0x98, 0xFC, 0xED, 0x01, 0x36, 0xFC, 0x3E, 0x01, 0xF3, 0xFB, 0x87, 0x00, 0xCF, 0xFB, 0xCD, 0xFF, 0xCA, 0xFB, 0x15, 0xFF, 0xE7, 0xFB, 0x65, 0xFE, 0x22, 0xFC, 0xC4, 0xFD, 0x7A, 0xFC, 0x33, 0xFD, 0xEC, 0xFC, 0xB8, 0xFC, 0x75, 0xFD, 0x58, 0xFC, 0x11, 0xFE, 0x13, 0xFC, 0xBB, 0xFE, 0xEE, 0xFB, 0x6C, 0xFF, 0xE8, 0xFB, 0x21, 0x00, 0x00, 0xFC, 0xD5, 0x00, 0x37, 0xFC, 0x80, 0x01, 0x89, 0xFC, 0x1F, 0x02, 0xF7, 0xFC, 0xAE, 0x02, 0x7A, 0xFD, 0x27, 0x03, 0x10, 0xFE, 0x86, 0x03, 0xB5, 0xFE, 0xCB, 0x03, 0x61, 0xFF, 0xF4, 0x03, 0x10, 0x00, 0xFD, 0x03, 0xBF, 0x00, 0xE8, 0x03, 0x67, 0x01, 0xB6, 0x03, 0x03, 0x02, 0x65, 0x03, 0x8F, 0x02, 0xFF, 0x02, 0x08, 0x03, 0x80, 0x02, 0x67, 0x03, 0xF0, 0x01, 0xAC, 0x03, 0x52, 0x01, 0xD5, 0x03, 0xAA, 0x00, 0xE1, 0x03, 0xFF, 0xFF, 0xCF, 0x03, 0x55, 0xFF, 0xA1, 0x03, 0xB1, 0xFE, 0x56, 0x03, 0x17, 0xFE, 0xF4, 0x02, 0x8E, 0xFD, 0x7A, 0x02, 0x17, 0xFD, 0xEF, 0x01, 0xB8, 0xFC, 0x56, 0x01, 0x72, 0xFC, 0xB5, 0x00, 0x48, 0xFC, 0x0E, 0x00, 0x3A, 0xFC, 0x68, 0xFF, 0x48, 0xFC, 0xC9, 0xFE, 0x75, 0xFC, 0x33, 0xFE, 0xB9, 0xFC, 0xAB, 0xFD, 0x17, 0xFD, 0x37, 0xFD, 0x8B, 0xFD, 0xD8, 0xFC, 0x12, 0xFE, 0x91, 0xFC, 0xA5, 0xFE, 0x66, 0xFC, 0x41, 0xFF, 0x56, 0xFC, 0xE2, 0xFF, 0x62, 0xFC, 0x84, 0x00, 0x89, 0xFC, 0x21, 0x01, 0xCB, 0xFC, 0xB4, 0x01, 0x24, 0xFD, 0x38, 0x02, 0x92, 0xFD, 0xAB, 0x02, 0x13, 0xFE, 0x09, 0x03, 0xA1, 0xFE, 0x4F, 0x03, 0x39, 0xFF, 0x7D, 0x03, 0xD5, 0xFF, 0x8E, 0x03, 0x72, 0x00, 0x86, 0x03, 0x0B, 0x01, 0x61, 0x03, 0x9A, 0x01, 0x25, 0x03, 0x1D, 0x02, 0xCF, 0x02, 0x8F, 0x02, 0x65, 0x02, 0xED, 0x02, 0xEA, 0x01, 0x32, 0x03, 0x61, 0x01, 0x60, 0x03, 0xCF, 0x00, 0x74, 0x03, 0x36, 0x00, 0x6E, 0x03, 0x9F, 0xFF, 0x4D, 0x03, 0x09, 0xFF, 0x13, 0x03, 0x7D, 0xFE, 0xC3, 0x02, 0xFD, 0xFD, 0x5E, 0x02, 0x8D, 0xFD, 0xE8, 0x01, 0x31, 0xFD, 0x63, 0x01, 0xEA, 0xFC, 0xD6, 0x00, 0xBC, 0xFC, 0x43, 0x00, 0xA6, 0xFC, 0xAE, 0xFF, 0xAA, 0xFC, 0x1E, 0xFF, 0xC8, 0xFC, 0x95, 0xFE, 0xFE, 0xFC, 0x17, 0xFE, 0x49, 0xFD, 0xAA, 0xFD, 0xAA, 0xFD, 0x4E, 0xFD, 0x1C, 0xFE, 0x08, 0xFD, 0x9A, 0xFE, 0xD8, 0xFC, 0x23, 0xFF, 0xC0, 0xFC, 0xB1, 0xFF, 0xC3, 0xFC, 0x42, 0x00, 0xDE, 0xFC, 0xCE, 0x00, 0x10, 0xFD, 0x54, 0x01, 0x57, 0xFD, 0xCF, 0x01, 0xB2, 0xFD, 0x3B, 0x02, 0x1F, 0xFE, 0x96, 0x02, 0x99, 0xFE, 0xDD, 0x02, 0x1E, 0xFF, 0x0C, 0x03, 0xA8, 0xFF, 0x25, 0x03, 0x34, 0x00, 0x25, 0x03, 0xBC, 0x00, 0x0E, 0x03, 0x3F, 0x01, 0xDF, 0x02, 0xB7, 0x01, 0x9B, 0x02, 0x21, 0x02, 0x44, 0x02, 0x7B, 0x02, 0xDC, 0x01, 0xC1, 0x02, 0x67, 0x01, 0xF1, 0x02, 0xE7, 0x00, 0x0B, 0x03, 0x62, 0x00, 0x0E, 0x03, 0xDB, 0xFF, 0xF9, 0x02, 0x54, 0xFF, 0xCE, 0x02, 0xD7, 0xFE, 0x8D, 0x02, 0x61, 0xFE, 0x3B, 0x02, 0xF8, 0xFD, 0xD6, 0x01, 0xA0, 0xFD, 0x66, 0x01, 0x5A, 0xFD, 0xEC, 0x00, 0x2A, 0xFD, 0x6B, 0x00, 0x0F, 0xFD, 0xE7, 0xFF, 0x09, 0xFD, 0x67, 0xFF, 0x1B, 0xFD, 0xEA, 0xFE, 0x44, 0xFD, 0x78, 0xFE, 0x80, 0xFD, 0x11, 0xFE, 0xCF, 0xFD, 0xBA, 0xFD, 0x2F, 0xFE, 0x75, 0xFD, 0x9A, 0xFE, 0x43, 0xFD, 0x10, 0xFF, 0x28, 0xFD, 0x8D, 0xFF, 0x21, 0xFD, 0x0C, 0x00, 0x30, 0xFD, 0x89, 0x00, 0x56, 0xFD, 0x02, 0x01, 0x8E, 0xFD, 0x73, 0x01, 0xD9, 0xFD, 0xD7, 0x01, 0x34, 0xFE, 0x2C, 0x02, 0x9C, 0xFE, 0x71, 0x02, 0x0E, 0xFF, 0xA2, 0x02, 0x86, 0xFF, 0xBF, 0x02, 0x00, 0x00, 0xC8, 0x02, 0x7A, 0x00, 0xBA, 0x02, 0xF0, 0x00, 0x98, 0x02, 0x5D, 0x01, 0x62, 0x02, 0xC0, 0x01, 0x1C, 0x02, 0x14, 0x02, 0xC5, 0x01, 0x58, 0x02, 0x62, 0x01, 0x89, 0x02, 0xF5, 0x00, 0xA7, 0x02, 0x81, 0x00, 0xB0, 0x02, 0x0A, 0x00, 0xA5, 0x02, 0x94, 0xFF, 0x86, 0x02, 0x22, 0xFF, 0x55, 0x02, 0xB6, 0xFE, 0x11, 0x02, 0x57, 0xFE, 0xBF, 0x01, 0x04, 0xFE, 0x60, 0x01, 0xC1, 0xFD, 0xF6, 0x00, 0x90, 0xFD, 0x87, 0x00, 0x71, 0xFD, 0x15, 0x00, 0x66, 0xFD, 0xA2, 0xFF, 0x6E, 0xFD, 0x33, 0xFF, 0x8B, 0xFD, 0xCB, 0xFE, 0xB9, 0xFD, 0x6D, 0xFE, 0xFA, 0xFD, 0x1C, 0xFE, 0x48, 0xFE, 0xD9, 0xFD, 0xA4, 0xFE, 0xA7, 0xFD, 0x08, 0xFF, 0x89, 0xFD, 0x74, 0xFF, 0x7C, 0xFD, 0xE2, 0xFF, 0x83, 0xFD, 0x50, 0x00, 0x9E, 0xFD, 0xBC, 0x00, 0xC9, 0xFD, 0x21, 0x01, 0x05, 0xFE, 0x7D, 0x01, 0x50, 0xFE, 0xCD, 0x01, 0xA6, 0xFE, 0x0F, 0x02, 0x07, 0xFF, 0x3F, 0x02, 0x6F, 0xFF, 0x5F, 0x02, 0xD9, 0xFF, 0x6D, 0x02, 0x44, 0x00, 0x68, 0x02, 0xAC, 0x00, 0x51, 0x02, 0x0F, 0x01, 0x28, 0x02, 0x68, 0x01, 0xEF, 0x01, 0xB7, 0x01, 0xA9, 0x01, 0xF7, 0x01, 0x56, 0x01, 0x29, 0x02, 0xF9, 0x00, 0x49, 0x02, 0x96, 0x00, 0x58, 0x02, 0x2E, 0x00, 0x54, 0x02, 0xC7, 0xFF, 0x40, 0x02, 0x62, 0xFF, 0x1A, 0x02, 0x02, 0xFF, 0xE4, 0x01, 0xAB, 0xFE, 0xA1, 0x01, 0x5F, 0xFE, 0x51, 0x01, 0x1E, 0xFE, 0xFA, 0x00, 0xEF, 0xFD, 0x99, 0x00, 0xCE, 0xFD, 0x36, 0x00, 0xBE, 0xFD, 0xD2, 0xFF, 0xBF, 0xFD, 0x71, 0xFF, 0xD3, 0xFD, 0x13, 0xFF, 0xF6, 0xFD, 0xBE, 0xFE, 0x26, 0xFE, 0x73, 0xFE, 0x68, 0xFE, 0x36, 0xFE, 0xB3, 0xFE, 0x05, 0xFE, 0x07, 0xFF, 0xE4, 0xFD, 0x64, 0xFF, 0xD2, 0xFD, 0xC2, 0xFF, 0xD3, 0xFD, 0x24, 0x00, 0xE3, 0xFD, 0x81, 0x00, 0x04, 0xFE, 0xDC, 0x00, 0x33, 0xFE, 0x2F, 0x01, 0x70, 0xFE, 0x78, 0x01, 0xB7, 0xFE, 0xB5, 0x01, 0x09, 0xFF, 0xE6, 0x01, 0x60, 0xFF, 0x06, 0x02, 0xBD, 0xFF, 0x17, 0x02, 0x19, 0x00, 0x19, 0x02, 0x75, 0x00, 0x0B, 0x02, 0xCD, 0x00, 0xED, 0x01, 0x1D, 0x01, 0xC0, 0x01, 0x65, 0x01, 0x87, 0x01, 0xA1, 0x01, 0x43, 0x01, 0xD0, 0x01, 0xF5, 0x00, 0xF1, 0x01, 0xA1, 0x00, 0x04, 0x02, 0x4A, 0x00, 0x06, 0x02, 0xEF, 0xFF, 0xFA, 0x01, 0x96, 0xFF, 0xDE, 0x01, 0x42, 0xFF, 0xB5, 0x01, 0xF3, 0xFE, 0x7F, 0x01, 0xAE, 0xFE, 0x3E, 0x01, 0x73, 0xFE, 0xF4, 0x00, 0x44, 0xFE, 0xA3, 0x00, 0x23, 0xFE, 0x4E, 0x00, 0x10, 0xFE, 0xF8, 0xFF, 0x0C, 0xFE, 0xA3, 0xFF, 0x18, 0xFE, 0x52, 0xFF, 0x31, 0xFE, 0x04, 0xFF, 0x57, 0xFE, 0xC0, 0xFE, 0x8B, 0xFE, 0x87, 0xFE, 0xC8, 0xFE, 0x59, 0xFE, 0x0F, 0xFF, 0x38, 0xFE, 0x5C, 0xFF, 0x24, 0xFE, 0xAE, 0xFF, 0x1F, 0xFE, 0x01, 0x00, 0x28, 0xFE, 0x52, 0x00, 0x40, 0xFE, 0xA2, 0x00, 0x64, 0xFE, 0xEB, 0x00, 0x94, 0xFE, 0x2E, 0x01, 0xCF, 0xFE, 0x66, 0x01, 0x12, 0xFF, 0x93, 0x01, 0x5C, 0xFF, 0xB4, 0x01, 0xAA, 0xFF, 0xC8, 0x01, 0xF9, 0xFF, 0xCE, 0x01, 0x49, 0x00, 0xC7, 0x01, 0x94, 0x00, 0xB2, 0x01, 0xDD, 0x00, 0x90, 0x01, 0x1C, 0x01, 0x63, 0x01, 0x53, 0x01, 0x2B, 0x01, 0x81, 0x01, 0xEB, 0x00, 0xA1, 0x01, 0xA4, 0x00, 0xB5, 0x01, 0x5A, 0x00, 0xBC, 0x01, 0x0D, 0x00, 0xB6, 0x01, 0xC1, 0xFF, 0xA3, 0x01, 0x77, 0xFF, 0x83, 0x01, 0x33, 0xFF, 0x59, 0x01, 0xF4, 0xFE, 0x24, 0x01, 0xBE, 0xFE, 0xE8, 0x00, 0x92, 0xFE, 0xA4, 0x00, 0x72, 0xFE, 0x5D, 0x00, 0x5D, 0xFE, 0x14, 0x00, 0x55, 0xFE, 0xCB, 0xFF, 0x5A, 0xFE, 0x84, 0xFF, 0x6B, 0xFE, 0x40, 0xFF, 0x89, 0xFE, 0x03, 0xFF, 0xB0, 0xFE, 0xCF, 0xFE, 0xE3, 0xFE, 0xA5, 0xFE, 0x1C, 0xFF, 0x85, 0xFE, 0x5C, 0xFF, 0x70, 0xFE, 0x9F, 0xFF, 0x67, 0xFE, 0xE7, 0xFF, 0x6B, 0xFE, 0x2D, 0x00, 0x7A, 0xFE, 0x71, 0x00, 0x94, 0xFE, 0xB1, 0x00, 0xBA, 0xFE, 0xEE, 0x00, 0xEA, 0xFE, 0x20, 0x01, 0x21, 0xFF, 0x4A, 0x01, 0x5D, 0xFF, 0x6A, 0x01, 0x9F, 0xFF, 0x7F, 0x01, 0xE1, 0xFF, 0x88, 0x01, 0x25, 0x00, 0x86, 0x01, 0x67, 0x00, 0x77, 0x01, 0xA5, 0x00, 0x5F, 0x01, 0xDE, 0x00, 0x3C, 0x01, 0x10, 0x01, 0x10, 0x01, 0x3A, 0x01, 0xDC, 0x00, 0x59, 0x01, 0xA1, 0x00, 0x6E, 0x01, 0x64, 0x00, 0x78, 0x01, 0x23, 0x00, 0x77, 0x01, 0xE3, 0xFF, 0x6A, 0x01, 0xA2, 0xFF, 0x53, 0x01, 0x67, 0xFF, 0x32, 0x01, 0x2F, 0xFF, 0x09, 0x01, 0x00, 0xFF, 0xD7, 0x00, 0xD6, 0xFE, 0xA0, 0x00, 0xB8, 0xFE, 0x65, 0x00, 0xA2, 0xFE, 0x27, 0x00, 0x98, 0xFE, 0xEA, 0xFF, 0x99, 0xFE, 0xAD, 0xFF, 0xA3, 0xFE, 0x72, 0xFF, 0xB9, 0xFE, 0x3D, 0xFF, 0xD7, 0xFE, 0x0E, 0xFF, 0xFF, 0xFE, 0xE8, 0xFE, 0x2D, 0xFF, 0xC8, 0xFE, 0x62, 0xFF, 0xB3, 0xFE, 0x9A, 0xFF, 0xA9, 0xFE, 0xD5, 0xFF, 0xA8, 0xFE, 0x10, 0x00, 0xB1, 0xFE, 0x4A, 0x00, 0xC4, 0xFE, 0x83, 0x00, 0xE1, 0xFE, 0xB6, 0x00, 0x07, 0xFF, 0xE3, 0x00, 0x33, 0xFF, 0x0A, 0x01, 0x63, 0xFF, 0x27, 0x01, 0x9A, 0xFF, 0x3D, 0x01, 0xD1, 0xFF, 0x47, 0x01, 0x0B, 0x00, 0x4A, 0x01, 0x42, 0x00, 0x41, 0x01, 0x78, 0x00, 0x2F, 0x01, 0xAA, 0x00, 0x14, 0x01, 0xD5, 0x00, 0xF2, 0x00, 0xFA, 0x00, 0xC9, 0x00, 0x18, 0x01, 0x9A, 0x00, 0x2D, 0x01, 0x67, 0x00, 0x38, 0x01, 0x30, 0x00, 0x3A, 0x01, 0xFB, 0xFF, 0x33, 0x01, 0xC5, 0xFF, 0x23, 0x01, 0x92, 0xFF, 0x0B, 0x01, 0x62, 0xFF, 0xEA, 0x00, 0x37, 0xFF, 0xC3, 0x00, 0x14, 0xFF, 0x97, 0x00, 0xF6, 0xFE, 0x66, 0x00, 0xE2, 0xFE, 0x34, 0x00, 0xD6, 0xFE, 0xFF, 0xFF, 0xD3, 0xFE, 0xCD, 0xFF, 0xD9, 0xFE, 0x9B, 0xFF, 0xE8, 0xFE, 0x6D, 0xFF, 0xFF, 0xFE, 0x44, 0xFF, 0x1D, 0xFF, 0x22, 0xFF, 0x42, 0xFF, 0x06, 0xFF, 0x6B, 0xFF, 0xF1, 0xFE, 0x99, 0xFF, 0xE5, 0xFE, 0xCA, 0xFF, 0xE1, 0xFE, 0xFC, 0xFF, 0xE6, 0xFE, 0x2D, 0x00, 0xF4, 0xFE, 0x5C, 0x00, 0x08, 0xFF, 0x87, 0x00, 0x25, 0xFF, 0xB0, 0x00, 0x48, 0xFF, 0xD1, 0x00, 0x6F, 0xFF, 0xED, 0x00, 0x9A, 0xFF, 0x01, 0x01, 0xC8, 0xFF, 0x0D, 0x01, 0xF8, 0xFF, 0x11, 0x01, 0x26, 0x00, 0x0E, 0x01, 0x53, 0x00, 0x01, 0x01, 0x7E, 0x00, 0xEE, 0x00, 0xA3, 0x00, 0xD3, 0x00, 0xC5, 0x00, 0xB3, 0x00, 0xDF, 0x00, 0x8E, 0x00, 0xF3, 0x00, 0x65, 0x00, 0x00, 0x01, 0x39, 0x00, 0x03, 0x01, 0x0C, 0x00, 0x01, 0x01, 0xE0, 0xFF, 0xF6, 0x00, 0xB5, 0xFF, 0xE4, 0x00, 0x8C, 0xFF, 0xCB, 0x00, 0x67, 0xFF, 0xAC, 0x00, 0x48, 0xFF, 0x8A, 0x00, 0x2E, 0xFF, 0x64, 0x00, 0x1A, 0xFF, 0x3A, 0x00, 0x0E, 0xFF, 0x10, 0x00, 0x09, 0xFF, 0xE5, 0xFF, 0x0B, 0xFF, 0xBB, 0xFF, 0x15, 0xFF, 0x95, 0xFF, 0x25, 0xFF, 0x71, 0xFF, 0x3C, 0xFF, 0x53, 0xFF, 0x59, 0xFF, 0x3A, 0xFF, 0x7A, 0xFF, 0x27, 0xFF, 0x9F, 0xFF, 0x1B, 0xFF, 0xC5, 0xFF, 0x15, 0xFF, 0xED, 0xFF, 0x17, 0xFF, 0x16, 0x00, 0x1F, 0xFF, 0x3D, 0x00, 0x2F, 0xFF, 0x63, 0x00, 0x45, 0xFF, 0x84, 0x00, 0x5F, 0xFF, 0xA2, 0x00, 0x7E, 0xFF, 0xBA, 0x00, 0xA0, 0xFF, 0xCD, 0x00, 0xC5, 0xFF, 0xD8, 0x00, 0xEA, 0xFF, 0xDF, 0x00, 0x12, 0x00, 0xDE, 0x00, 0x37, 0x00, 0xD5, 0x00, 0x5A, 0x00, 0xC8, 0x00, 0x7B, 0x00, 0xB4, 0x00, 0x97, 0x00, 0x9C, 0x00, 0xAE, 0x00, 0x7E, 0x00, 0xC1, 0x00, 0x5E, 0x00, 0xCD, 0x00, 0x3B, 0x00, 0xD2, 0x00, 0x18, 0x00, 0xD2, 0x00, 0xF2, 0xFF, 0xCC, 0x00, 0xCF, 0xFF, 0xBE, 0x00, 0xAE, 0xFF, 0xAD, 0x00, 0x8E, 0xFF, 0x96, 0x00, 0x73, 0xFF, 0x7A, 0x00, 0x5D, 0xFF, 0x5C, 0x00, 0x4B, 0xFF, 0x3B, 0x00, 0x3E, 0xFF, 0x19, 0x00, 0x39, 0xFF, 0xF6, 0xFF, 0x38, 0xFF, 0xD5, 0xFF, 0x3F, 0xFF, 0xB5, 0xFF, 0x4A, 0xFF, 0x97, 0xFF, 0x5B, 0xFF, 0x7D, 0xFF, 0x70, 0xFF, 0x67, 0xFF, 0x8A, 0xFF, 0x55, 0xFF, 0xA6, 0xFF, 0x49, 0xFF, 0xC4, 0xFF, 0x44, 0xFF, 0xE6, 0xFF, 0x44, 0xFF, 0x06, 0x00, 0x48, 0xFF, 0x26, 0x00, 0x53, 0xFF, 0x45, 0x00, 0x61, 0xFF, 0x61, 0x00, 0x76, 0xFF, 0x7A, 0x00, 0x8E, 0xFF, 0x8F, 0x00, 0xA9, 0xFF, 0x9F, 0x00, 0xC5, 0xFF, 0xAB, 0x00, 0xE4, 0xFF, 0xB1, 0x00, 0x03, 0x00, 0xB2, 0x00, 0x21, 0x00, 0xAE, 0x00, 0x3F, 0x00, 0xA4, 0x00, 0x5A, 0x00, 0x96, 0x00, 0x71, 0x00, 0x84, 0x00, 0x85, 0x00, 0x6E, 0x00, 0x95, 0x00, 0x55, 0x00, 0xA1, 0x00, 0x39, 0x00, 0xA7, 0x00, 0x1D, 0x00, 0xA7, 0x00, 0x00, 0x00, 0xA5, 0x00, 0xE4, 0xFF, 0x9D, 0x00, 0xC8, 0xFF, 0x8F, 0x00, 0xAE, 0xFF, 0x7F, 0x00, 0x97, 0xFF, 0x69, 0x00, 0x84, 0xFF, 0x52, 0x00, 0x74, 0xFF, 0x39, 0x00, 0x6A, 0xFF, 0x1E, 0x00, 0x63, 0xFF, 0x02, 0x00, 0x61, 0xFF, 0xE7, 0xFF, 0x64, 0xFF, 0xCC, 0xFF, 0x6C, 0xFF, 0xB5, 0xFF, 0x77, 0xFF, 0xA0, 0xFF, 0x87, 0xFF, 0x8D, 0xFF, 0x9A, 0xFF, 0x7D, 0xFF, 0xB0, 0xFF, 0x73, 0xFF, 0xC9, 0xFF, 0x6D, 0xFF, 0xE1, 0xFF, 0x6B, 0xFF, 0xFC, 0xFF, 0x6E, 0xFF, 0x14, 0x00, 0x74, 0xFF, 0x2D, 0x00, 0x7E, 0xFF, 0x45, 0x00, 0x8E, 0xFF, 0x59, 0x00, 0x9F, 0xFF, 0x6B, 0x00, 0xB3, 0xFF, 0x79, 0x00, 0xCA, 0xFF, 0x83, 0x00, 0xE1, 0xFF, 0x89, 0x00, 0xF9, 0xFF, 0x8D, 0x00, 0x12, 0x00, 0x8B, 0x00, 0x29, 0x00, 0x84, 0x00, 0x3F, 0x00, 0x7B, 0x00, 0x52, 0x00, 0x6C, 0x00, 0x63, 0x00, 0x5C, 0x00, 0x70, 0x00, 0x4A, 0x00, 0x7B, 0x00, 0x35, 0x00, 0x81, 0x00, 0x1F, 0x00, 0x84, 0x00, 0x08, 0x00, 0x83, 0x00, 0xF2, 0xFF, 0x7C, 0x00, 0xDB, 0xFF, 0x74, 0x00, 0xC7, 0xFF, 0x68, 0x00, 0xB5, 0xFF, 0x59, 0x00, 0xA4, 0xFF, 0x47, 0x00, 0x97, 0xFF, 0x33, 0x00, 0x8E, 0xFF, 0x1E, 0x00, 0x88, 0xFF, 0x0A, 0x00, 0x86, 0xFF, 0xF4, 0xFF, 0x86, 0xFF, 0xE0, 0xFF, 0x8A, 0xFF, 0xCC, 0xFF, 0x93, 0xFF, 0xBC, 0xFF, 0x9E, 0xFF, 0xAC, 0xFF, 0xAC, 0xFF, 0xA0, 0xFF, 0xBC, 0xFF, 0x96, 0xFF, 0xCF, 0xFF, 0x8F, 0xFF, 0xE2, 0xFF, 0x8D, 0xFF, 0xF6, 0xFF, 0x8E, 0xFF, 0x09, 0x00, 0x92, 0xFF, 0x1C, 0x00, 0x9A, 0xFF, 0x2F, 0x00, 0xA4, 0xFF, 0x3F, 0x00, 0xAF, 0xFF, 0x4D, 0x00, 0xC0, 0xFF, 0x5A, 0x00, 0xD0, 0xFF, 0x63, 0x00, 0xE1, 0xFF, 0x68, 0x00, 0xF4, 0xFF, 0x6B, 0x00, 0x06, 0x00, 0x6A, 0x00, 0x19, 0x00, 0x68, 0x00, 0x2A, 0x00, 0x60, 0x00, 0x3A, 0x00, 0x57, 0x00, 0x46, 0x00, 0x4B, 0x00, 0x52, 0x00, 0x3E, 0x00, 0x5B, 0x00, 0x2F, 0x00, 0x60, 0x00, 0x1D, 0x00, 0x63, 0x00, 0x0C, 0x00, 0x64, 0x00, 0xFB, 0xFF, 0x61, 0x00, 0xEA, 0xFF, 0x5A, 0x00, 0xDB, 0xFF, 0x52, 0x00, 0xCC, 0xFF, 0x48, 0x00, 0xBF, 0xFF, 0x3B, 0x00, 0xB5, 0xFF, 0x2C, 0x00, 0xAC, 0xFF, 0x1D, 0x00, 0xA6, 0xFF, 0x0D, 0x00, 0xA3, 0xFF, 0xFD, 0xFF, 0xA4, 0xFF, 0xED, 0xFF, 0xA6, 0xFF, 0xDE, 0xFF, 0xAB, 0xFF, 0xD1, 0xFF, 0xB2, 0xFF, 0xC4, 0xFF, 0xBD, 0xFF, 0xBA, 0xFF, 0xC9, 0xFF, 0xB3, 0xFF, 0xD6, 0xFF, 0xAC, 0xFF, 0xE4, 0xFF, 0xAA, 0xFF, 0xF3, 0xFF, 0xA9, 0xFF, 0x01, 0x00, 0xAC, 0xFF, 0x10, 0x00, 0xB1, 0xFF, 0x1E, 0x00, 0xB7, 0xFF, 0x2B, 0x00, 0xC1, 0xFF, 0x37, 0x00, 0xCB, 0xFF, 0x40, 0x00, 0xD8, 0xFF, 0x47, 0x00, 0xE4, 0xFF, 0x4D, 0x00, 0xF2, 0xFF, 0x50, 0x00, 0x00, 0x00, 0x50, 0x00, 0x0E, 0x00, 0x4F, 0x00, 0x1A, 0x00, 0x4A, 0x00, 0x26, 0x00, 0x43, 0x00, 0x31, 0x00, 0x3B, 0x00, 0x39, 0x00, 0x32, 0x00, 0x41, 0x00, 0x27, 0x00, 0x46, 0x00, 0x1B, 0x00, 0x49, 0x00, 0x0E, 0x00, 0x4A, 0x00, 0x01, 0x00, 0x48, 0x00, 0xF4, 0xFF, 0x45, 0x00, 0xE9, 0xFF, 0x40, 0x00, 0xDD, 0xFF, 0x37, 0x00, 0xD4, 0xFF, 0x2E, 0x00, 0xCC, 0xFF, 0x25, 0x00, 0xC4, 0xFF, 0x19, 0x00, 0xC0, 0xFF, 0x0F, 0x00, 0xBD, 0xFF, 0x01, 0x00, 0xBC, 0xFF, 0xF7, 0xFF, 0xBE, 0xFF, 0xEB, 0xFF, 0xC0, 0xFF, 0xE1, 0xFF, 0xC5, 0xFF, 0xD7, 0xFF, 0xCC, 0xFF, 0xCF, 0xFF, 0xD4, 0xFF, 0xCA, 0xFF, 0xDE, 0xFF, 0xC4, 0xFF, 0xE7, 0xFF, 0xC3, 0xFF, 0xF2, 0xFF, 0xC1, 0xFF, 0xFD, 0xFF, 0xC2, 0xFF, 0x07, 0x00, 0xC5, 0xFF, 0x12, 0x00, 0xCA, 0xFF, 0x1B, 0x00, 0xD0, 0xFF, 0x24, 0x00, 0xD8, 0xFF, 0x2C, 0x00, 0xE0, 0xFF, 0x31, 0x00, 0xE8, 0xFF, 0x35, 0x00, 0xF3, 0xFF, 0x38, 0x00, 0xFC, 0xFF, 0x3A, 0x00, 0x06, 0x00, 0x38, 0x00, 0x10, 0x00, 0x36, 0x00, 0x18, 0x00, 0x32, 0x00, 0x21, 0x00, 0x2D, 0x00, 0x28, 0x00, 0x26, 0x00, 0x2D, 0x00, 0x1E, 0x00, 0x30, 0x00, 0x16, 0x00, 0x34, 0x00, 0x0D, 0x00, 0x34, 0x00, 0x04, 0x00, 0x34, 0x00, 0xFB, 0xFF, 0x31, 0x00, 0xF2, 0xFF, 0x2E, 0x00, 0xEA, 0xFF, 0x2A, 0x00, 0xE3, 0xFF, 0x23, 0x00, 0xDC, 0xFF, 0x1D, 0x00, 0xD7, 0xFF, 0x15, 0x00, 0xD3, 0xFF, 0x0D, 0x00, 0xD1, 0xFF, 0x04, 0x00, 0xD0, 0xFF, 0xFC, 0xFF, 0xD1, 0xFF, 0xF4, 0xFF, 0xD3, 0xFF, 0xED, 0xFF, 0xD5, 0xFF, 0xE6, 0xFF, 0xDA, 0xFF, 0xE0, 0xFF, 0xE0, 0xFF, 0xDB, 0xFF, 0xE5, 0xFF, 0xD7, 0xFF, 0xED, 0xFF, 0xD5, 0xFF, 0xF4, 0xFF, 0xD5, 0xFF, 0xFB, 0xFF, 0xD4, 0xFF, 0x03, 0x00, 0xD6, 0xFF, 0x0B, 0x00, 0xDA, 0xFF, 0x12, 0x00, 0xDD, 0xFF, 0x17, 0x00, 0xE1, 0xFF, 0x1C, 0x00, 0xE7, 0xFF, 0x21, 0x00, 0xED, 0xFF, 0x24, 0x00, 0xF4, 0xFF, 0x26, 0x00, 0xFC, 0xFF, 0x27, 0x00, 0x02, 0x00, 0x27, 0x00, 0x08, 0x00, 0x26, 0x00, 0x0F, 0x00, 0x23, 0x00, 0x14, 0x00, 0x20, 0x00, 0x19, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x17, 0x00, 0x21, 0x00, 0x11, 0x00, 0x23, 0x00, 0x0B, 0x00, 0x24, 0x00, 0x05, 0x00, 0x23, 0x00, 0xFF, 0xFF, 0x22, 0x00, 0xF8, 0xFF, 0x20, 0x00, 0xF3, 0xFF, 0x1D, 0x00, 0xEE, 0xFF, 0x19, 0x00, 0xEA, 0xFF, 0x15, 0x00, 0xE6, 0xFF, 0x0F, 0x00, 0xE3, 0xFF, 0x0B, 0x00, 0xE1, 0xFF, 0x05, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xFA, 0xFF, 0xE1, 0xFF, 0xF5, 0xFF, 0xE3, 0xFF, 0xF0, 0xFF, 0xE5, 0xFF, 0xEC, 0xFF, 0xE9, 0xFF, 0xE8, 0xFF, 0xED, 0xFF, 0xE6, 0xFF, 0xF1, 0xFF, 0xE4, 0xFF, 0xF6, 0xFF, 0xE3, 0xFF, 0xFC, 0xFF, 0xE4, 0xFF, 0x00, 0x00, 0xE4, 0xFF, 0x05, 0x00, 0xE5, 0xFF, 0x0A, 0x00, 0xE7, 0xFF, 0x0E, 0x00, 0xEB, 0xFF, 0x11, 0x00, 0xEF, 0xFF, 0x15, 0x00, 0xF2, 0xFF, 0x17, 0x00, 0xF6, 0xFF, 0x19, 0x00, 0xFB, 0xFF, 0x1A, 0x00, 0x00, 0x00, 0x19, 0x00, 0x05, 0x00, 0x19, 0x00, 0x08, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x15, 0x00, 0x10, 0x00, 0x12, 0x00, 0x13, 0x00, 0x10, 0x00, 0x15, 0x00, 0x0C, 0x00, 0x15, 0x00, 0x08, 0x00, 0x17, 0x00, 0x05, 0x00, 0x17, 0x00, 0x01, 0x00, 0x17, 0x00, 0xFC, 0xFF, 0x15, 0x00, 0xF9, 0xFF, 0x14, 0x00, 0xF6, 0xFF, 0x11, 0x00, 0xF3, 0xFF, 0x0F, 0x00, 0xF0, 0xFF, 0x0B, 0x00, 0xEF, 0xFF, 0x09, 0x00, 0xED, 0xFF, 0x04, 0x00, 0xEB, 0xFF, 0x01, 0x00, 0xEC, 0xFF, 0xFE, 0xFF, 0xED, 0xFF, 0xFA, 0xFF, 0xED, 0xFF, 0xF8, 0xFF, 0xEF, 0xFF, 0xF5, 0xFF, 0xF1, 0xFF, 0xF2, 0xFF, 0xF3, 0xFF, 0xF1, 0xFF, 0xF6, 0xFF, 0xEE, 0xFF, 0xF9, 0xFF, 0xEF, 0xFF, 0xFC, 0xFF, 0xEE, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0x01, 0x00, 0xEF, 0xFF, 0x05, 0x00, 0xF1, 0xFF, 0x08, 0x00, 0xF3, 0xFF, 0x0A, 0x00, 0xF5, 0xFF, 0x0C, 0x00, 0xF7, 0xFF, 0x0D, 0x00, 0xF9, 0xFF, 0x0E, 0x00, 0xFC, 0xFF, 0x10, 0x00, 0xFF, 0xFF, 0x10, 0x00, 0x02, 0x00, 0x0F, 0x00, 0x04, 0x00, 0x0F, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0B, 0x00, 0x0A, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x0D, 0x00, 0x03, 0x00, 0x0D, 0x00, 0x02, 0x00, 0x0D, 0x00, 0xFF, 0xFF, 0x0D, 0x00, 0xFD, 0xFF, 0x0C, 0x00, 0xFB, 0xFF, 0x0A, 0x00, 0xF8, 0xFF, 0x08, 0x00, 0xF8, 0xFF, 0x08, 0x00, 0xF6, 0xFF, 0x06, 0x00, 0xF5, 0xFF, 0x03, 0x00, 0xF4, 0xFF, 0x01, 0x00, 0xF4, 0xFF, 0x00, 0x00, 0xF4, 0xFF, 0xFE, 0xFF, 0xF5, 0xFF, 0xFC, 0xFF, 0xF6, 0xFF, 0xFA, 0xFF, 0xF7, 0xFF, 0xF9, 0xFF, 0xF8, 0xFF, 0xF8, 0xFF, 0xFA, 0xFF, 0xF7, 0xFF, 0xFC, 0xFF, 0xF6, 0xFF, 0xFD, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xF6, 0xFF, 0x01, 0x00, 0xF7, 0xFF, 0x02, 0x00, 0xF8, 0xFF, 0x04, 0x00, 0xF8, 0xFF, 0x05, 0x00, 0xFA, 0xFF, 0x06, 0x00, 0xFA, 0xFF, 0x07, 0x00, 0xFC, 0xFF, 0x07, 0x00, 0xFD, 0xFF, 0x08, 0x00, 0xFF, 0xFF, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x03, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0xFF, 0xFF, 0x07, 0x00, 0xFE, 0xFF, 0x06, 0x00, 0xFD, 0xFF, 0x05, 0x00, 0xFD, 0xFF, 0x05, 0x00, 0xFB, 0xFF, 0x04, 0x00, 0xFB, 0xFF, 0x03, 0x00, 0xFB, 0xFF, 0x01, 0x00, 0xFB, 0xFF, 0x00, 0x00, 0xFA, 0xFF, 0x00, 0x00, 0xFA, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFE, 0xFF, 0xFB, 0xFF, 0xFE, 0xFF, 0xFC, 0xFF, 0xFD, 0xFF, 0xFC, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xFC, 0xFF, 0xFE, 0xFF, 0xFB, 0xFF, 0xFE, 0xFF, 0xFB, 0xFF, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0x01, 0x00, 0xFC, 0xFF, 0x02, 0x00, 0xFC, 0xFF, 0x02, 0x00, 0xFD, 0xFF, 0x03, 0x00, 0xFE, 0xFF, 0x04, 0x00, 0xFD, 0xFF, 0x03, 0x00, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0xFF, 0xFF, 0x02, 0x00, 0xFE, 0xFF, 0x02, 0x00, 0xFE, 0xFF, 0x02, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x02, 0x00, 0xFF, 0xFF, 0x01, 0x00, 0xFF, 0xFF, 0x01, 0x00, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x01, 0x00, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 +}; + +#endif /*__CVI_SRC_H__*/ diff --git a/u-boot-2021.10/drivers/mmc/Makefile b/u-boot-2021.10/drivers/mmc/Makefile index d5b9adee9..2cbd46cf3 100644 --- a/u-boot-2021.10/drivers/mmc/Makefile +++ b/u-boot-2021.10/drivers/mmc/Makefile @@ -83,4 +83,5 @@ obj-$(CONFIG_TARGET_CVITEK_CV1835) += cvitek/sdhci-cv183x.o obj-$(CONFIG_TARGET_CVITEK_CV1822) += cvitek/sdhci-cv182x.o obj-$(CONFIG_TARGET_CVITEK_CV181X) += cvitek/sdhci-cv181x.o obj-$(CONFIG_TARGET_CVITEK_CV180X) += cvitek/sdhci-cv180x.o +obj-$(CONFIG_TARGET_CVITEK_ATHENA2) += cvitek/sdhci-athena2.o endif diff --git a/u-boot-2021.10/drivers/net/phy/cvitek.c b/u-boot-2021.10/drivers/net/phy/cvitek.c index c9367960e..ad5b80c90 100644 --- a/u-boot-2021.10/drivers/net/phy/cvitek.c +++ b/u-boot-2021.10/drivers/net/phy/cvitek.c @@ -134,26 +134,27 @@ static void cv182xa_ephy_init(void) // En TX_Rterm mmio_write_32(0x03009040, (0x0001 | mmio_read_32(0x03009040))); - + // change rx vcm + mmio_write_32(0x0300904c, (0x820 | mmio_read_32(0x0300904c))); // Link Pulse // Switch to MII-page10 mmio_write_32(0x0300907c, 0x0a00); - +#if 1 // Set Link Pulse - // mmio_write_32(0x03009040, 0x3e00); - // mmio_write_32(0x03009044, 0x7864); - // mmio_write_32(0x03009048, 0x6470); - // mmio_write_32(0x0300904c, 0x5f62); - // mmio_write_32(0x03009050, 0x5a5a); - // mmio_write_32(0x03009054, 0x5458); - // mmio_write_32(0x03009058, 0xb23a); - // mmio_write_32(0x0300905c, 0x94a0); - // mmio_write_32(0x03009060, 0x9092); - // mmio_write_32(0x03009064, 0x8a8e); - // mmio_write_32(0x03009068, 0x8688); - // mmio_write_32(0x0300906c, 0x8484); - // mmio_write_32(0x03009070, 0x0082); - + mmio_write_32(0x03009040, 0x3e00); + mmio_write_32(0x03009044, 0x7864); + mmio_write_32(0x03009048, 0x6470); + mmio_write_32(0x0300904c, 0x5f62); + mmio_write_32(0x03009050, 0x5a5a); + mmio_write_32(0x03009054, 0x5458); + mmio_write_32(0x03009058, 0xb23a); + mmio_write_32(0x0300905c, 0x94a0); + mmio_write_32(0x03009060, 0x9092); + mmio_write_32(0x03009064, 0x8a8e); + mmio_write_32(0x03009068, 0x8688); + mmio_write_32(0x0300906c, 0x8484); + mmio_write_32(0x03009070, 0x0082); +#else // from sean // Fix err: the status is still linkup when removed the network cable. mmio_write_32(0x03009040, 0x2000); @@ -169,7 +170,7 @@ static void cv182xa_ephy_init(void) mmio_write_32(0x03009068, 0x8283); mmio_write_32(0x0300906c, 0x8182); mmio_write_32(0x03009070, 0x0081); - +#endif // TP_IDLE // Switch to MII-page11 mmio_write_32(0x0300907c, 0x0b00); diff --git a/u-boot-2021.10/include/audio_codec.h b/u-boot-2021.10/include/audio_codec.h index 2ea4ff096..a8b9da2b7 100644 --- a/u-boot-2021.10/include/audio_codec.h +++ b/u-boot-2021.10/include/audio_codec.h @@ -29,6 +29,8 @@ struct audio_codec_ops { */ int (*set_params)(struct udevice *dev, int interface, int rate, int mclk_freq, int bits_per_sample, uint channels); + int (*codec_close)(struct udevice *dev); + }; #define audio_codec_get_ops(dev) ((struct audio_codec_ops *)(dev)->driver->ops) @@ -47,4 +49,6 @@ struct audio_codec_ops { int audio_codec_set_params(struct udevice *dev, int interface, int rate, int mclk_freq, int bits_per_sample, uint channels); +int audio_codec_close(struct udevice *dev); + #endif /* __AUDIO_CODEC_H__ */